summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BSD-License.txt (renamed from docs/BSD-License.txt)17
-rwxr-xr-xXMP-Toolkit-SDK-Overview.pdfbin0 -> 103744 bytes
-rw-r--r--build/XMP_BuildInfo.h22
-rw-r--r--build/gcc3.2/XMPCore.mak (renamed from build/gcc/XMPCore.mak)5
-rw-r--r--build/gcc3.2/i80386linux/expat_config.h (renamed from build/gcc/i80386linux/expat_config.h)0
-rw-r--r--build/gcc3.2/sparcsolaris/expat_config.h (renamed from build/gcc/sparcsolaris/expat_config.h)0
-rw-r--r--build/vsnet/XMPCore.vcproj278
-rw-r--r--build/vsnet/XMPFiles.vcproj322
-rw-r--r--build/vsnet/XMPToolkit.sln25
-rw-r--r--build/vsnet8/XMPCore.vcproj442
-rw-r--r--build/vsnet8/XMPFiles.vcproj598
-rw-r--r--build/vsnet8/XMPToolkitSDK.sln35
-rw-r--r--build/vsnet8/expat_config.h (renamed from build/vsnet/expat_config.h)0
-rw-r--r--build/xcode/XMPToolkit.xcodeproj/project.pbxproj790
-rw-r--r--build/xcode2/XMPToolkitSDK-Common.xcconfig (renamed from build/xcode/XMPToolkit-Common.xcconfig)11
-rw-r--r--build/xcode2/XMPToolkitSDK-Debug.xcconfig (renamed from build/xcode/XMPToolkit-Debug.xcconfig)2
-rw-r--r--build/xcode2/XMPToolkitSDK-Release.xcconfig (renamed from build/xcode/XMPToolkit-Release.xcconfig)2
-rw-r--r--build/xcode2/XMPToolkitSDK.xcodeproj/project.pbxproj988
-rw-r--r--build/xcode2/expat_config.h (renamed from build/xcode/expat_config.h)0
-rw-r--r--docs/API/TXMPFiles_8hpp-source.html247
-rw-r--r--docs/API/TXMPFiles_8hpp.html83
-rw-r--r--docs/API/TXMPFiles_8incl__cpp.html81
-rw-r--r--docs/API/TXMPFiles_8incl__cpp__incl.pngbin0 -> 4591 bytes
-rw-r--r--docs/API/TXMPIterator_8hpp-source.html148
-rw-r--r--docs/API/TXMPIterator_8hpp.html86
-rw-r--r--docs/API/TXMPIterator_8hpp__incl.pngbin0 -> 3612 bytes
-rw-r--r--docs/API/TXMPIterator_8incl__cpp.html82
-rw-r--r--docs/API/TXMPIterator_8incl__cpp__incl.pngbin0 -> 5164 bytes
-rw-r--r--docs/API/TXMPMeta_8hpp-source.html600
-rw-r--r--docs/API/TXMPMeta_8hpp.html79
-rw-r--r--docs/API/TXMPMeta_8incl__cpp.html82
-rw-r--r--docs/API/TXMPMeta_8incl__cpp__incl.pngbin0 -> 4976 bytes
-rw-r--r--docs/API/TXMPUtils_8hpp-source.html348
-rw-r--r--docs/API/TXMPUtils_8hpp.html78
-rw-r--r--docs/API/TXMPUtils_8incl__cpp.html82
-rw-r--r--docs/API/TXMPUtils_8incl__cpp__incl.pngbin0 -> 4915 bytes
-rw-r--r--docs/API/XMP_8incl__cpp.html84
-rw-r--r--docs/API/XMP_8incl__cpp__incl.pngbin0 -> 2138 bytes
-rw-r--r--docs/API/XMP__Const_8h-source.html814
-rw-r--r--docs/API/XMP__Const_8h.html2384
-rw-r--r--docs/API/XMP__Const_8h__incl.pngbin0 -> 3544 bytes
-rw-r--r--docs/API/annotated.html81
-rw-r--r--docs/API/classTXMPFiles-members.html99
-rw-r--r--docs/API/classTXMPFiles.html1191
-rw-r--r--docs/API/classTXMPIterator-members.html80
-rw-r--r--docs/API/classTXMPIterator.html452
-rw-r--r--docs/API/classTXMPMeta-members.html (renamed from docs/XMPToolkit/classTXMPMeta-members.html)112
-rw-r--r--docs/API/classTXMPMeta.html3610
-rw-r--r--docs/API/classTXMPUtils-members.html (renamed from docs/XMPToolkit/classTXMPUtils-members.html)85
-rw-r--r--docs/API/classTXMPUtils.html2116
-rw-r--r--docs/API/classXMP__Error-members.html76
-rw-r--r--docs/API/classXMP__Error.html156
-rw-r--r--docs/API/closed.gifbin0 -> 57 bytes
-rw-r--r--docs/API/doxygen.png (renamed from docs/XMPToolkit/doxygen.png)bin1281 -> 1281 bytes
-rw-r--r--docs/API/files.html82
-rw-r--r--docs/API/functions.html441
-rw-r--r--docs/API/functions_func.html (renamed from docs/XMPToolkit/functions.html)212
-rw-r--r--docs/API/functions_vars.html199
-rw-r--r--docs/API/globals.html504
-rw-r--r--docs/API/globals_0x78.html160
-rw-r--r--docs/API/globals_defs.html194
-rw-r--r--docs/API/globals_eval.html447
-rw-r--r--docs/API/globals_type.html106
-rw-r--r--docs/API/graph_legend.dot23
-rw-r--r--docs/API/graph_legend.html (renamed from docs/XMPToolkit/graph_legend.html)77
-rw-r--r--docs/API/graph_legend.pngbin0 -> 8506 bytes
-rw-r--r--docs/API/index.html178
-rw-r--r--docs/API/open.gifbin0 -> 54 bytes
-rw-r--r--docs/API/structXMP__DateTime-members.html81
-rw-r--r--docs/API/structXMP__DateTime.html145
-rw-r--r--docs/API/structXMP__PacketInfo-members.html79
-rw-r--r--docs/API/structXMP__PacketInfo.html117
-rw-r--r--docs/API/structXMP__ThumbnailInfo-members.html80
-rw-r--r--docs/API/structXMP__ThumbnailInfo.html121
-rw-r--r--docs/API/structXMP__VersionInfo-members.html78
-rw-r--r--docs/API/structXMP__VersionInfo.html112
-rw-r--r--docs/API/tab_b.gif (renamed from docs/XMPToolkit/tab_b.gif)bin35 -> 35 bytes
-rw-r--r--docs/API/tab_l.gif (renamed from docs/XMPToolkit/tab_l.gif)bin706 -> 706 bytes
-rw-r--r--docs/API/tab_r.gif (renamed from docs/XMPToolkit/tab_r.gif)bin2585 -> 2585 bytes
-rw-r--r--docs/API/tabs.css (renamed from docs/XMPToolkit/tabs.css)6
-rw-r--r--docs/API/xmp.css (renamed from docs/XMPToolkit/doxygen.css)269
-rwxr-xr-xdocs/API/xmp_tagline_small.jpgbin0 -> 27209 bytes
-rw-r--r--docs/XMP-SDK-Overview.pdfbin56191 -> 0 bytes
-rw-r--r--docs/XMP-Specification.pdfbin931213 -> 0 bytes
-rw-r--r--docs/XMPProgrammersGuide.pdfbin0 -> 1017908 bytes
-rw-r--r--docs/XMPSpecificationPart1.pdfbin0 -> 383892 bytes
-rw-r--r--docs/XMPSpecificationPart2.pdfbin0 -> 481028 bytes
-rw-r--r--docs/XMPSpecificationPart3.pdfbin0 -> 644542 bytes
-rw-r--r--docs/XMPToolkit/TXMPFiles_8hpp-source.html162
-rw-r--r--docs/XMPToolkit/TXMPFiles_8hpp.html34
-rw-r--r--docs/XMPToolkit/TXMPFiles_8incl__cpp.html32
-rw-r--r--docs/XMPToolkit/TXMPFiles_8incl__cpp__incl.pngbin1604 -> 0 bytes
-rw-r--r--docs/XMPToolkit/TXMPIterator_8hpp-source.html104
-rw-r--r--docs/XMPToolkit/TXMPIterator_8hpp.html37
-rw-r--r--docs/XMPToolkit/TXMPIterator_8hpp__incl.pngbin1125 -> 0 bytes
-rw-r--r--docs/XMPToolkit/TXMPIterator_8incl__cpp.html33
-rw-r--r--docs/XMPToolkit/TXMPIterator_8incl__cpp__incl.pngbin2105 -> 0 bytes
-rw-r--r--docs/XMPToolkit/TXMPMeta_8hpp-source.html617
-rw-r--r--docs/XMPToolkit/TXMPMeta_8hpp.html33
-rw-r--r--docs/XMPToolkit/TXMPMeta_8incl__cpp.html33
-rw-r--r--docs/XMPToolkit/TXMPMeta_8incl__cpp__incl.pngbin2068 -> 0 bytes
-rw-r--r--docs/XMPToolkit/TXMPUtils_8hpp-source.html360
-rw-r--r--docs/XMPToolkit/TXMPUtils_8hpp.html33
-rw-r--r--docs/XMPToolkit/TXMPUtils_8incl__cpp.html33
-rw-r--r--docs/XMPToolkit/TXMPUtils_8incl__cpp__incl.pngbin2101 -> 0 bytes
-rw-r--r--docs/XMPToolkit/XMP_8incl__cpp.html35
-rw-r--r--docs/XMPToolkit/XMP_8incl__cpp__incl.pngbin691 -> 0 bytes
-rw-r--r--docs/XMPToolkit/XMP__Const_8h-source.html661
-rw-r--r--docs/XMPToolkit/XMP__Const_8h.html190
-rw-r--r--docs/XMPToolkit/XMP__Const_8h__incl.pngbin1243 -> 0 bytes
-rw-r--r--docs/XMPToolkit/annotated.html31
-rw-r--r--docs/XMPToolkit/classTXMPFiles-members.html40
-rw-r--r--docs/XMPToolkit/classTXMPFiles.html527
-rw-r--r--docs/XMPToolkit/classTXMPIterator-members.html32
-rw-r--r--docs/XMPToolkit/classTXMPIterator.html328
-rw-r--r--docs/XMPToolkit/classTXMPMeta.html2781
-rw-r--r--docs/XMPToolkit/classTXMPUtils.html1540
-rw-r--r--docs/XMPToolkit/files.html31
-rw-r--r--docs/XMPToolkit/functions_func.html281
-rw-r--r--docs/XMPToolkit/graph_legend.dot22
-rw-r--r--docs/XMPToolkit/graph_legend.pngbin4256 -> 0 bytes
-rw-r--r--docs/XMPToolkit/group__Transition.html259
-rw-r--r--docs/XMPToolkit/index.html112
-rw-r--r--docs/XMPToolkit/modules.html22
-rw-r--r--docs/XMPToolkit/structXMP__DateTime-members.html25
-rw-r--r--docs/XMPToolkit/structXMP__DateTime.html59
-rw-r--r--java/XMPCore/docs/allclasses-frame.html2
-rw-r--r--java/XMPCore/docs/allclasses-noframe.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/XMPConst.html90
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/XMPDateTime.html6
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/XMPDateTimeFactory.html5
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/XMPError.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/XMPException.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/XMPIterator.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/XMPMeta.html29
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/XMPMetaFactory.html5
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/XMPPathFactory.html9
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/XMPSchemaRegistry.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/XMPUtils.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/XMPVersionInfo.html20
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/class-use/XMPConst.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/class-use/XMPDateTime.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/class-use/XMPDateTimeFactory.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/class-use/XMPError.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/class-use/XMPException.html11
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/class-use/XMPIterator.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/class-use/XMPMeta.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/class-use/XMPMetaFactory.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/class-use/XMPPathFactory.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/class-use/XMPSchemaRegistry.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/class-use/XMPUtils.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/class-use/XMPVersionInfo.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/options/AliasOptions.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/options/IteratorOptions.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/options/Options.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/options/ParseOptions.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/options/PropertyOptions.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/options/SerializeOptions.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/options/class-use/AliasOptions.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/options/class-use/IteratorOptions.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/options/class-use/Options.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/options/class-use/ParseOptions.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/options/class-use/PropertyOptions.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/options/class-use/SerializeOptions.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/options/package-frame.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/options/package-summary.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/options/package-tree.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/options/package-use.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/package-frame.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/package-summary.html8
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/package-tree.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/package-use.html8
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/properties/XMPAliasInfo.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/properties/XMPProperty.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/properties/XMPPropertyInfo.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/properties/class-use/XMPAliasInfo.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/properties/class-use/XMPProperty.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/properties/class-use/XMPPropertyInfo.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/properties/package-frame.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/properties/package-summary.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/properties/package-tree.html2
-rw-r--r--java/XMPCore/docs/com/adobe/xmp/properties/package-use.html2
-rw-r--r--java/XMPCore/docs/constant-values.html26
-rw-r--r--java/XMPCore/docs/deprecated-list.html2
-rw-r--r--java/XMPCore/docs/help-doc.html2
-rw-r--r--java/XMPCore/docs/index-files/index-1.html2
-rw-r--r--java/XMPCore/docs/index-files/index-10.html2
-rw-r--r--java/XMPCore/docs/index-files/index-11.html2
-rw-r--r--java/XMPCore/docs/index-files/index-12.html5
-rw-r--r--java/XMPCore/docs/index-files/index-13.html2
-rw-r--r--java/XMPCore/docs/index-files/index-14.html2
-rw-r--r--java/XMPCore/docs/index-files/index-15.html2
-rw-r--r--java/XMPCore/docs/index-files/index-16.html2
-rw-r--r--java/XMPCore/docs/index-files/index-17.html2
-rw-r--r--java/XMPCore/docs/index-files/index-18.html8
-rw-r--r--java/XMPCore/docs/index-files/index-19.html2
-rw-r--r--java/XMPCore/docs/index-files/index-2.html2
-rw-r--r--java/XMPCore/docs/index-files/index-20.html2
-rw-r--r--java/XMPCore/docs/index-files/index-21.html11
-rw-r--r--java/XMPCore/docs/index-files/index-3.html2
-rw-r--r--java/XMPCore/docs/index-files/index-4.html2
-rw-r--r--java/XMPCore/docs/index-files/index-5.html2
-rw-r--r--java/XMPCore/docs/index-files/index-6.html2
-rw-r--r--java/XMPCore/docs/index-files/index-7.html5
-rw-r--r--java/XMPCore/docs/index-files/index-8.html2
-rw-r--r--java/XMPCore/docs/index-files/index-9.html2
-rw-r--r--java/XMPCore/docs/index.html6
-rw-r--r--java/XMPCore/docs/overview-frame.html2
-rw-r--r--java/XMPCore/docs/overview-summary.html2
-rw-r--r--java/XMPCore/docs/overview-tree.html2
-rw-r--r--java/XMPCore/docs/package-list3
-rw-r--r--java/XMPCore/docs/serialized-form.html2
-rw-r--r--java/XMPCore/src/com/adobe/xmp/XMPConst.java12
-rw-r--r--java/XMPCore/src/com/adobe/xmp/XMPDateTime.java6
-rw-r--r--java/XMPCore/src/com/adobe/xmp/XMPDateTimeFactory.java21
-rw-r--r--java/XMPCore/src/com/adobe/xmp/XMPMeta.java10
-rw-r--r--java/XMPCore/src/com/adobe/xmp/XMPMetaFactory.java5
-rw-r--r--java/XMPCore/src/com/adobe/xmp/XMPPathFactory.java9
-rw-r--r--java/XMPCore/src/com/adobe/xmp/XMPVersionInfo.java10
-rw-r--r--java/XMPCore/src/com/adobe/xmp/impl/ISO8601Converter.java6
-rw-r--r--java/XMPCore/src/com/adobe/xmp/impl/ParseRDF.java1
-rw-r--r--java/XMPCore/src/com/adobe/xmp/impl/Utils.java6
-rw-r--r--java/XMPCore/src/com/adobe/xmp/impl/XMPDateTimeImpl.java63
-rw-r--r--java/XMPCore/src/com/adobe/xmp/impl/XMPMetaImpl.java25
-rw-r--r--java/XMPCore/src/com/adobe/xmp/impl/XMPMetaParser.java49
-rw-r--r--java/XMPCore/src/com/adobe/xmp/impl/XMPNodeUtils.java16
-rw-r--r--java/XMPCore/src/com/adobe/xmp/impl/XMPNormalizer.java3
-rw-r--r--java/XMPCore/src/com/adobe/xmp/impl/XMPSchemaRegistryImpl.java17
-rw-r--r--java/XMPCore/src/com/adobe/xmp/impl/XMPUtilsImpl.java5
-rw-r--r--java/XMPCore/src/com/adobe/xmp/version.properties6
-rw-r--r--java/XMPCoreCoverage/src/samples/XMPCoreCoverage.java6
-rw-r--r--java/XMPCoreCoverage/src/samples/XMPCoreCoverageConst.java1
-rw-r--r--java/readme.txt81
-rw-r--r--public/include/TXMPFiles.hpp767
-rw-r--r--public/include/TXMPIterator.hpp254
-rw-r--r--public/include/TXMPMeta.hpp2492
-rw-r--r--public/include/TXMPUtils.hpp1278
-rw-r--r--public/include/XMP.hpp36
-rw-r--r--public/include/XMP.incl_cpp2
-rw-r--r--public/include/XMP_Const.h1603
-rw-r--r--public/include/XMP_Environment.h68
-rw-r--r--public/include/XMP_Version.h10
-rw-r--r--public/include/client-glue/TXMPFiles.incl_cpp24
-rw-r--r--public/include/client-glue/TXMPMeta.incl_cpp20
-rw-r--r--public/include/client-glue/TXMPUtils.incl_cpp4
-rw-r--r--public/include/client-glue/WXMPFiles.hpp12
-rw-r--r--public/include/client-glue/WXMPMeta.hpp16
-rw-r--r--public/include/client-glue/WXMPUtils.hpp2
-rw-r--r--public/include/client-glue/WXMP_Common.hpp17
-rw-r--r--samples/build/gcc3.2/XMPSamples.mak (renamed from samples/build/gcc/XMPSamples.mak)84
-rw-r--r--samples/build/vsnet/DumpMainXMP.vcproj309
-rw-r--r--samples/build/vsnet/DumpScannedXMP.vcproj230
-rw-r--r--samples/build/vsnet/XMPCoreCoverage.vcproj226
-rw-r--r--samples/build/vsnet/XMPFilesCoverage.vcproj319
-rw-r--r--samples/build/vsnet/XMPSamples.sln37
-rwxr-xr-xsamples/build/vsnet8/CustomSchema.vcproj474
-rwxr-xr-xsamples/build/vsnet8/DumpFile.vcproj518
-rwxr-xr-xsamples/build/vsnet8/DumpMainXMP.vcproj478
-rwxr-xr-xsamples/build/vsnet8/DumpScannedXMP.vcproj478
-rwxr-xr-xsamples/build/vsnet8/ModifyingXMP.vcproj478
-rwxr-xr-xsamples/build/vsnet8/ReadingXMP.vcproj478
-rw-r--r--samples/build/vsnet8/XMP-Toolkit-SDK-Samples.sln115
-rwxr-xr-xsamples/build/vsnet8/XMPCommand.vcproj546
-rwxr-xr-xsamples/build/vsnet8/XMPCoreCoverage.vcproj478
-rwxr-xr-xsamples/build/vsnet8/XMPFilesCoverage.vcproj478
-rwxr-xr-xsamples/build/vsnet8/XMPIterations.vcproj478
-rw-r--r--samples/build/xcode/XMPSamples.xcodeproj/project.pbxproj705
-rw-r--r--samples/build/xcode2/XMPSamples-Common.xcconfig (renamed from samples/build/xcode/XMPSamples-Common.xcconfig)0
-rw-r--r--samples/build/xcode2/XMPSamples-Debug.xcconfig (renamed from samples/build/xcode/XMPSamples-Debug.xcconfig)0
-rw-r--r--samples/build/xcode2/XMPSamples-Release.xcconfig (renamed from samples/build/xcode/XMPSamples-Release.xcconfig)0
-rw-r--r--samples/build/xcode2/XMPSamples.xcodeproj/project.pbxproj1761
-rw-r--r--samples/source/CustomSchema.cpp237
-rw-r--r--samples/source/DumpMainXMP.cpp59
-rw-r--r--samples/source/DumpScannedXMP.cpp50
-rw-r--r--samples/source/ModifyingXMP.cpp297
-rw-r--r--samples/source/ReadingXMP.cpp204
-rw-r--r--samples/source/XMPCoreCoverage.cpp19
-rw-r--r--samples/source/XMPFilesCoverage.cpp52
-rw-r--r--samples/source/XMPScanner.cpp54
-rw-r--r--samples/source/XMPScanner.hpp54
-rw-r--r--samples/source/XmpIterations.cpp318
-rw-r--r--samples/source/common/DumpFile.cpp4458
-rw-r--r--samples/source/common/DumpFile.h21
-rw-r--r--samples/source/common/Log.cpp209
-rw-r--r--samples/source/common/Log.h85
-rw-r--r--samples/source/common/OutputUtils.cpp227
-rw-r--r--samples/source/common/OutputUtils.h50
-rw-r--r--samples/source/common/QEScanner.cpp1469
-rw-r--r--samples/source/common/QEScanner.hpp331
-rw-r--r--samples/source/common/TagTree.cpp615
-rw-r--r--samples/source/common/TagTree.h186
-rw-r--r--samples/source/common/globals.h43
-rw-r--r--samples/source/dumpfile/main.cpp259
-rw-r--r--samples/source/xmpcommand/Actions.cpp334
-rw-r--r--samples/source/xmpcommand/Actions.h49
-rw-r--r--samples/source/xmpcommand/PrintUsage.cpp84
-rw-r--r--samples/source/xmpcommand/PrintUsage.h17
-rw-r--r--samples/source/xmpcommand/main.cpp208
-rwxr-xr-x[-rw-r--r--]samples/testfiles/BlueSquare.ai (renamed from samples/BlueSquares/BlueSquare.ai)bin1186535 -> 1186535 bytes
-rwxr-xr-x[-rw-r--r--]samples/testfiles/BlueSquare.avi (renamed from samples/BlueSquares/BlueSquare.avi)bin132262 -> 132262 bytes
-rwxr-xr-x[-rw-r--r--]samples/testfiles/BlueSquare.eps (renamed from samples/BlueSquares/BlueSquare.eps)0
-rwxr-xr-x[-rw-r--r--]samples/testfiles/BlueSquare.indd (renamed from samples/BlueSquares/BlueSquare.indd)bin757760 -> 757760 bytes
-rwxr-xr-x[-rw-r--r--]samples/testfiles/BlueSquare.jpg (renamed from samples/BlueSquares/BlueSquare.jpg)bin24205 -> 24205 bytes
-rwxr-xr-x[-rw-r--r--]samples/testfiles/BlueSquare.mov (renamed from samples/BlueSquares/BlueSquare.mov)bin47641 -> 47641 bytes
-rwxr-xr-x[-rw-r--r--]samples/testfiles/BlueSquare.mp3 (renamed from samples/BlueSquares/BlueSquare.mp3)bin130244 -> 130244 bytes
-rwxr-xr-x[-rw-r--r--]samples/testfiles/BlueSquare.pdf (renamed from samples/BlueSquares/BlueSquare.pdf)bin10806 -> 10806 bytes
-rwxr-xr-xsamples/testfiles/BlueSquare.png (renamed from samples/BlueSquares/BlueSquare.png)bin5998 -> 5998 bytes
-rwxr-xr-x[-rw-r--r--]samples/testfiles/BlueSquare.psd (renamed from samples/BlueSquares/BlueSquare.psd)bin36014 -> 36014 bytes
-rwxr-xr-x[-rw-r--r--]samples/testfiles/BlueSquare.tif (renamed from samples/BlueSquares/BlueSquare.tif)bin259384 -> 259384 bytes
-rwxr-xr-x[-rw-r--r--]samples/testfiles/BlueSquare.wav (renamed from samples/BlueSquares/BlueSquare.wav)bin683118 -> 683118 bytes
-rwxr-xr-xsamples/testfiles/Image1.jpgbin0 -> 2114908 bytes
-rwxr-xr-xsamples/testfiles/Image2.jpgbin0 -> 2954252 bytes
-rw-r--r--source/XMPCore/ExpatAdapter.cpp117
-rw-r--r--source/XMPCore/ParseRDF.cpp24
-rw-r--r--source/XMPCore/WXMPMeta.cpp37
-rw-r--r--source/XMPCore/WXMPUtils.cpp2
-rw-r--r--source/XMPCore/XMLParserAdapter.hpp53
-rw-r--r--source/XMPCore/XMPCore_Impl.cpp50
-rw-r--r--source/XMPCore/XMPCore_Impl.hpp134
-rw-r--r--source/XMPCore/XMPMeta-GetSet.cpp7
-rw-r--r--source/XMPCore/XMPMeta-Parse.cpp57
-rw-r--r--source/XMPCore/XMPMeta-Serialize.cpp23
-rw-r--r--source/XMPCore/XMPMeta.cpp303
-rw-r--r--source/XMPCore/XMPMeta.hpp12
-rw-r--r--source/XMPCore/XMPUtils-FileInfo.cpp171
-rw-r--r--source/XMPCore/XMPUtils.cpp45
-rw-r--r--source/XMPCore/XMPUtils.hpp1
-rw-r--r--source/XMPFiles/FileHandlers/ASF_Handler.cpp362
-rw-r--r--source/XMPFiles/FileHandlers/ASF_Handler.hpp66
-rw-r--r--source/XMPFiles/FileHandlers/AVCHD_Handler.cpp648
-rw-r--r--source/XMPFiles/FileHandlers/AVCHD_Handler.hpp77
-rw-r--r--source/XMPFiles/FileHandlers/AVI_Handler.cpp148
-rw-r--r--source/XMPFiles/FileHandlers/Basic_Handler.cpp4
-rw-r--r--source/XMPFiles/FileHandlers/Basic_Handler.hpp1
-rw-r--r--source/XMPFiles/FileHandlers/FLV_Handler.cpp750
-rw-r--r--source/XMPFiles/FileHandlers/FLV_Handler.hpp73
-rw-r--r--source/XMPFiles/FileHandlers/InDesign_Handler.cpp22
-rw-r--r--source/XMPFiles/FileHandlers/JPEG_Handler.cpp59
-rw-r--r--source/XMPFiles/FileHandlers/MOV_Handler.cpp696
-rw-r--r--source/XMPFiles/FileHandlers/MOV_Handler.hpp20
-rw-r--r--source/XMPFiles/FileHandlers/MP3_Handler.cpp27
-rw-r--r--source/XMPFiles/FileHandlers/MP3_Handler.hpp4
-rw-r--r--source/XMPFiles/FileHandlers/MPEG2_Handler.cpp (renamed from source/XMPFiles/FileHandlers/MPEG_Handler.cpp)88
-rw-r--r--source/XMPFiles/FileHandlers/MPEG2_Handler.hpp (renamed from source/XMPFiles/FileHandlers/MPEG_Handler.hpp)38
-rw-r--r--source/XMPFiles/FileHandlers/MPEG4_Handler.cpp909
-rw-r--r--source/XMPFiles/FileHandlers/MPEG4_Handler.hpp69
-rw-r--r--source/XMPFiles/FileHandlers/P2_Handler.cpp1203
-rw-r--r--source/XMPFiles/FileHandlers/P2_Handler.hpp106
-rw-r--r--source/XMPFiles/FileHandlers/PNG_Handler.cpp6
-rw-r--r--source/XMPFiles/FileHandlers/PSD_Handler.cpp29
-rw-r--r--source/XMPFiles/FileHandlers/PostScript_Handler.cpp8
-rw-r--r--source/XMPFiles/FileHandlers/SWF_Handler.cpp397
-rw-r--r--source/XMPFiles/FileHandlers/SWF_Handler.hpp65
-rw-r--r--source/XMPFiles/FileHandlers/Scanner_Handler.cpp8
-rw-r--r--source/XMPFiles/FileHandlers/SonyHDV_Handler.cpp782
-rw-r--r--source/XMPFiles/FileHandlers/SonyHDV_Handler.hpp77
-rw-r--r--source/XMPFiles/FileHandlers/TIFF_Handler.cpp45
-rw-r--r--source/XMPFiles/FileHandlers/UCF_Handler.cpp846
-rw-r--r--source/XMPFiles/FileHandlers/UCF_Handler.hpp716
-rw-r--r--source/XMPFiles/FileHandlers/WAV_Handler.cpp109
-rw-r--r--source/XMPFiles/FileHandlers/WAV_Handler.hpp8
-rw-r--r--source/XMPFiles/FileHandlers/XDCAMEX_Handler.cpp824
-rw-r--r--source/XMPFiles/FileHandlers/XDCAMEX_Handler.hpp81
-rw-r--r--source/XMPFiles/FileHandlers/XDCAM_Handler.cpp726
-rw-r--r--source/XMPFiles/FileHandlers/XDCAM_Handler.hpp82
-rw-r--r--source/XMPFiles/FormatSupport/ASF_Support.cpp1434
-rw-r--r--source/XMPFiles/FormatSupport/ASF_Support.hpp224
-rw-r--r--source/XMPFiles/FormatSupport/ID3_Support.cpp37
-rw-r--r--source/XMPFiles/FormatSupport/ID3_Support.hpp2
-rw-r--r--source/XMPFiles/FormatSupport/IPTC_Support.cpp28
-rw-r--r--source/XMPFiles/FormatSupport/IPTC_Support.hpp4
-rw-r--r--source/XMPFiles/FormatSupport/PNG_Support.cpp4
-rw-r--r--source/XMPFiles/FormatSupport/PSIR_FileWriter.cpp183
-rw-r--r--source/XMPFiles/FormatSupport/PSIR_MemoryReader.cpp4
-rw-r--r--source/XMPFiles/FormatSupport/PSIR_Support.hpp70
-rw-r--r--source/XMPFiles/FormatSupport/QuickTime_Support.cpp20
-rw-r--r--source/XMPFiles/FormatSupport/QuickTime_Support.hpp8
-rw-r--r--source/XMPFiles/FormatSupport/RIFF_Support.cpp474
-rw-r--r--source/XMPFiles/FormatSupport/RIFF_Support.hpp23
-rw-r--r--source/XMPFiles/FormatSupport/ReconcileIPTC.cpp53
-rw-r--r--source/XMPFiles/FormatSupport/ReconcileLegacy.cpp23
-rw-r--r--source/XMPFiles/FormatSupport/ReconcileTIFF.cpp177
-rw-r--r--source/XMPFiles/FormatSupport/Reconcile_Impl.cpp50
-rw-r--r--source/XMPFiles/FormatSupport/Reconcile_Impl.hpp13
-rw-r--r--source/XMPFiles/FormatSupport/SWF_Support.cpp844
-rw-r--r--source/XMPFiles/FormatSupport/SWF_Support.hpp254
-rw-r--r--source/XMPFiles/FormatSupport/TIFF_FileWriter.cpp356
-rw-r--r--source/XMPFiles/FormatSupport/TIFF_MemoryReader.cpp65
-rw-r--r--source/XMPFiles/FormatSupport/TIFF_Support.cpp2
-rw-r--r--source/XMPFiles/FormatSupport/TIFF_Support.hpp98
-rw-r--r--source/XMPFiles/FormatSupport/XDCAM_Support.cpp290
-rw-r--r--source/XMPFiles/FormatSupport/XDCAM_Support.hpp43
-rw-r--r--source/XMPFiles/FormatSupport/XMPScanner.cpp26
-rw-r--r--source/XMPFiles/WXMPFiles.cpp24
-rw-r--r--source/XMPFiles/XMPFiles.cpp962
-rw-r--r--source/XMPFiles/XMPFiles.hpp3
-rw-r--r--source/XMPFiles/XMPFiles_Impl.cpp1133
-rw-r--r--source/XMPFiles/XMPFiles_Impl.hpp194
-rw-r--r--source/common/EndianUtils.hpp (renamed from source/XMPFiles/FormatSupport/EndianUtils.hpp)25
-rw-r--r--source/common/ExpatAdapter.hpp (renamed from source/XMPCore/ExpatAdapter.hpp)26
-rw-r--r--source/common/LargeFileAccess.cpp814
-rw-r--r--source/common/LargeFileAccess.hpp139
-rw-r--r--source/common/XMLParserAdapter.hpp140
-rw-r--r--source/common/XML_Node.cpp459
-rw-r--r--third-party/MD5/MD5.cpp8
-rw-r--r--third-party/QTDevWin/ReadMe.txt24
-rw-r--r--third-party/expat/ReadMe.txt76
-rwxr-xr-xthird-party/zlib/ReadMe.txt13
408 files changed, 57738 insertions, 17412 deletions
diff --git a/docs/BSD-License.txt b/BSD-License.txt
index e413f87..d4d460f 100644
--- a/docs/BSD-License.txt
+++ b/BSD-License.txt
@@ -1,15 +1,22 @@
The BSD License
-Copyright (c) 1999 - 2007, Adobe Systems Incorporated
+Copyright (c) 1999 - 2008, Adobe Systems Incorporated
All rights reserved.
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+Redistribution and use in source and binary forms, with or
+without modification, are permitted provided that the following
+conditions are met:
-* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+* Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+* Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
-* Neither the name of Adobe Systems Incorporated, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+* Neither the name of Adobe Systems Incorporated, nor the names of its
+contributors may be used to endorse or promote products derived from this
+software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
diff --git a/XMP-Toolkit-SDK-Overview.pdf b/XMP-Toolkit-SDK-Overview.pdf
new file mode 100755
index 0000000..08ce956
--- /dev/null
+++ b/XMP-Toolkit-SDK-Overview.pdf
Binary files differ
diff --git a/build/XMP_BuildInfo.h b/build/XMP_BuildInfo.h
index 6261f3c..2b387c8 100644
--- a/build/XMP_BuildInfo.h
+++ b/build/XMP_BuildInfo.h
@@ -7,7 +7,7 @@
/*
// =================================================================================================
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -15,22 +15,8 @@
// =================================================================================================
*/
-
-/*
-// =================================================================================================
-// This file provides build numbers that are set automatically by the external build system. This is
-// in contrast to the manual version numbers of XMP_ChangeLog.h.
-//
-// The value of kXMP_BuildDate is set to the date of the build, in some reasonable format. It would
-// be nice if the month used a name instead of a number and if the year has 4 digits. But it isn't
-// worth going to great lengths for this, a numeric date is OK.
-
-// The value of kXMP_BuildNumber is set to some number that is meaningful to the build system, such
-// as a Perforce changelist number.
-// =================================================================================================
-*/
-
-#define kXMP_Copyright Copyright (c) 2002-2007, Adobe Systems Incorporated
-#define kXMP_CopyrightStr "Copyright (c) 2002-2007, Adobe Systems Incorporated"
+#define kXMP_Copyright Copyright (c) 2002-2008, Adobe Systems Incorporated
+#define kXMP_CopyrightStr "Copyright (c) 2002-2008, Adobe Systems Incorporated"
+#define kXMP_AdobeIPStr "<AdobeIP#0000425>"
#endif /* __XMP_BuildInfo_h__ */
diff --git a/build/gcc/XMPCore.mak b/build/gcc3.2/XMPCore.mak
index cd37bae..d9ca7e2 100644
--- a/build/gcc/XMPCore.mak
+++ b/build/gcc3.2/XMPCore.mak
@@ -137,7 +137,8 @@ CPPSources = \
MD5.cpp \
WXMPMeta.cpp \
WXMPIterator.cpp \
- WXMPUtils.cpp
+ WXMPUtils.cpp \
+ XML_Node.cpp
CCSources = \
xmlparse.c \
@@ -149,7 +150,7 @@ Includes = \
-I${SourceRoot}/XMPCore \
-I${SourceRoot}/common \
-I${BuildRoot}/build \
- -I${BuildRoot}/build/gcc/${TargetOS} \
+ -I${BuildRoot}/build/gcc3.2/${TargetOS} \
-I${ExpatRoot}/lib \
-I${MD5Root}
diff --git a/build/gcc/i80386linux/expat_config.h b/build/gcc3.2/i80386linux/expat_config.h
index 18fe7bc..18fe7bc 100644
--- a/build/gcc/i80386linux/expat_config.h
+++ b/build/gcc3.2/i80386linux/expat_config.h
diff --git a/build/gcc/sparcsolaris/expat_config.h b/build/gcc3.2/sparcsolaris/expat_config.h
index 48bdd2e..48bdd2e 100644
--- a/build/gcc/sparcsolaris/expat_config.h
+++ b/build/gcc3.2/sparcsolaris/expat_config.h
diff --git a/build/vsnet/XMPCore.vcproj b/build/vsnet/XMPCore.vcproj
deleted file mode 100644
index 6b76f57..0000000
--- a/build/vsnet/XMPCore.vcproj
+++ /dev/null
@@ -1,278 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="XMPCore"
- ProjectGUID="{C5BB1536-3776-4474-861D-B5923C610FE4}"
- RootNamespace="XMPCore"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../public/libraries/windows/debug/"
- IntermediateDirectory="../../intermediate/windows/debug/"
- ConfigurationType="4"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- InlineFunctionExpansion="0"
- FavorSizeOrSpeed="0"
- WholeProgramOptimization="false"
- AdditionalIncludeDirectories="./;../;../../public/include/;../../source/common/;../../source/XMPCore/;&quot;../../third-party/expat/lib/&quot;;&quot;../../third-party/MD5/&quot;"
- PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;XMP_ClientBuild=0;HAVE_EXPAT_CONFIG_H=1;XML_STATIC=1;DEBUG=1;_DEBUG=1"
- StringPooling="true"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- SmallerTypeCheck="false"
- RuntimeLibrary="1"
- DefaultCharIsUnsigned="true"
- ForceConformanceInForLoopScope="true"
- UsePrecompiledHeader="0"
- ObjectFile="..\..\intermediate\windows\debug\"
- ProgramDataBaseFileName="..\..\intermediate\windows\debug\vc80.pdb"
- BrowseInformation="0"
- WarningLevel="3"
- WarnAsError="false"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- CompileAs="2"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="$(OutDir)/XMPCoreStaticDebug.lib"
- IgnoreAllDefaultLibraries="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../public/libraries/windows/release/"
- IntermediateDirectory="../../intermediate/windows/release/"
- ConfigurationType="4"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="1"
- InlineFunctionExpansion="2"
- FavorSizeOrSpeed="2"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="./;../;../../public/include/;../../source/common/;../../source/XMPCore/;&quot;../../third-party/expat/lib/&quot;;&quot;../../third-party/MD5/&quot;"
- PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;XMP_ClientBuild=0;HAVE_EXPAT_CONFIG_H=1;XML_STATIC=1;NDEBUG=1;"
- StringPooling="true"
- MinimalRebuild="false"
- BasicRuntimeChecks="0"
- SmallerTypeCheck="false"
- RuntimeLibrary="0"
- BufferSecurityCheck="false"
- DefaultCharIsUnsigned="true"
- ForceConformanceInForLoopScope="true"
- UsePrecompiledHeader="0"
- ObjectFile="..\..\intermediate\windows\release\"
- ProgramDataBaseFileName="..\..\intermediate\windows\release\vc80pdb"
- BrowseInformation="0"
- WarningLevel="3"
- WarnAsError="false"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="0"
- CompileAs="2"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="$(OutDir)/XMPCoreStaticRelease.lib"
- IgnoreAllDefaultLibraries="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath=".\XMPCore.def"
- >
- </File>
- <Filter
- Name="Toolkit Core"
- >
- <File
- RelativePath="..\..\source\XMPCore\XMPCore_Impl.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPCore\XMPIterator.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPCore\XMPMeta-GetSet.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPCore\XMPMeta-Parse.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPCore\XMPMeta-Serialize.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPCore\XMPMeta.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPCore\XMPUtils-FileInfo.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPCore\XMPUtils.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Utilities"
- >
- <File
- RelativePath="..\..\source\XMPCore\ExpatAdapter.cpp"
- >
- </File>
- <File
- RelativePath="..\..\third-party\MD5\MD5.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPCore\ParseRDF.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\common\UnicodeConversions.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="XML Parser"
- >
- <File
- RelativePath="..\..\third-party\expat\lib\xmlparse.c"
- >
- </File>
- <File
- RelativePath="..\..\third-party\expat\lib\xmlrole.c"
- >
- </File>
- <File
- RelativePath="..\..\third-party\expat\lib\xmltok.c"
- >
- </File>
- </Filter>
- <Filter
- Name="ABI Wrappers"
- >
- <File
- RelativePath="..\..\source\XMPCore\WXMPIterator.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPCore\WXMPMeta.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPCore\WXMPUtils.cpp"
- >
- </File>
- </Filter>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/build/vsnet/XMPFiles.vcproj b/build/vsnet/XMPFiles.vcproj
deleted file mode 100644
index 4c72e2a..0000000
--- a/build/vsnet/XMPFiles.vcproj
+++ /dev/null
@@ -1,322 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="XMPFiles"
- ProjectGUID="{B9A2E1F1-4E5C-49AC-B052-604CAE21F56E}"
- RootNamespace="XMPFilesStatic"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="..\..\public\libraries\windows\debug"
- IntermediateDirectory="..\..\intermediate\windows\debug"
- ConfigurationType="4"
- CharacterSet="1"
- WholeProgramOptimization="0"
- BuildLogFile="$(IntDir)\BuildLog.htm"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- UseUnicodeResponseFiles="true"
- Optimization="0"
- AdditionalIncludeDirectories=".\;..\;..\..\public\include\;..\..\source\XMPFiles\;..\..\source\XMPFiles\FormatSupport\;..\..\source\common\;&quot;..\..\third-party\MD5\&quot;;&quot;..\..\third-party\QTDevWin\CIncludes&quot;"
- PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;XMP_StaticBuild=1;XMP_PRESERVE_BIB_CLIENT=0;DEBUG=1;_DEBUG=1"
- StringPooling="true"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- DefaultCharIsUnsigned="true"
- UsePrecompiledHeader="0"
- ObjectFile="../../intermediate/windows/debug/"
- ProgramDataBaseFileName="../../intermediate/windows/debug/vc80.pdb"
- XMLDocumentationFileName="$(IntDir)\"
- WarningLevel="3"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- AdditionalDependencies="..\..\third-party\QTDevWin\Libraries\qtmlClient.lib Advapi32.lib User32.lib $(NOINHERIT)"
- OutputFile="$(OutDir)/XMPFilesStaticDebug.lib"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine=""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="..\..\public\libraries\windows\release"
- IntermediateDirectory="..\..\intermediate\windows\release"
- ConfigurationType="4"
- CharacterSet="1"
- WholeProgramOptimization="1"
- BuildLogFile="$(IntDir)\BuildLog.htm"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="1"
- InlineFunctionExpansion="2"
- FavorSizeOrSpeed="2"
- WholeProgramOptimization="true"
- AdditionalIncludeDirectories="./;../;../../public/include/;../../source/XMPFiles/;../../source/XMPFiles/FormatSupport/;../../source/common/;&quot;../../third-party/MD5/&quot;;&quot;../../third-party/QTDevWin/CIncludes&quot;"
- PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;XMP_StaticBuild=1;XMP_PRESERVE_BIB_CLIENT=0;NDEBUG=1"
- StringPooling="true"
- MinimalRebuild="false"
- BasicRuntimeChecks="0"
- RuntimeLibrary="0"
- BufferSecurityCheck="false"
- DefaultCharIsUnsigned="true"
- UsePrecompiledHeader="0"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="$(IntDir)\vc80.pdb"
- XMLDocumentationFileName="$(IntDir)\"
- WarningLevel="3"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- AdditionalDependencies="..\..\third-party\QTDevWin\Libraries\qtmlClient.lib Advapi32.lib User32.lib $(NOINHERIT)"
- OutputFile="$(OutDir)/XMPFilesStaticRelease.lib"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine=""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <Filter
- Name="Common Code"
- >
- <File
- RelativePath="..\..\source\XMPFiles\WXMPFiles.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\XMPFiles.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\XMPFiles_Impl.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="File Handlers"
- >
- <File
- RelativePath="..\..\source\XMPFiles\FileHandlers\AVI_Handler.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FileHandlers\Basic_Handler.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FileHandlers\InDesign_Handler.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FileHandlers\JPEG_Handler.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FileHandlers\MOV_Handler.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FileHandlers\MP3_Handler.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FileHandlers\MPEG_Handler.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FileHandlers\PNG_Handler.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FileHandlers\PostScript_Handler.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FileHandlers\PSD_Handler.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FileHandlers\Scanner_Handler.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FileHandlers\TIFF_Handler.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FileHandlers\Trivial_Handler.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FileHandlers\WAV_Handler.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Format Support"
- >
- <File
- RelativePath="..\..\source\XMPFiles\FormatSupport\ID3_Support.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FormatSupport\IPTC_Support.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FormatSupport\PNG_Support.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FormatSupport\PSIR_FileWriter.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FormatSupport\PSIR_MemoryReader.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FormatSupport\QuickTime_Support.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FormatSupport\Reconcile_Impl.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FormatSupport\ReconcileIPTC.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FormatSupport\ReconcileLegacy.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FormatSupport\ReconcileTIFF.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FormatSupport\RIFF_Support.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FormatSupport\TIFF_FileWriter.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FormatSupport\TIFF_MemoryReader.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FormatSupport\TIFF_Support.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPFiles\FormatSupport\XMPScanner.cpp"
- >
- </File>
- </Filter>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/build/vsnet/XMPToolkit.sln b/build/vsnet/XMPToolkit.sln
deleted file mode 100644
index 44aac01..0000000
--- a/build/vsnet/XMPToolkit.sln
+++ /dev/null
@@ -1,25 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XMPCore", "XMPCore.vcproj", "{C5BB1536-3776-4474-861D-B5923C610FE4}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XMPFiles Static", "XMPFiles.vcproj", "{B9A2E1F1-4E5C-49AC-B052-604CAE21F56E}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Release|Win32 = Release|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {C5BB1536-3776-4474-861D-B5923C610FE4}.Debug|Win32.ActiveCfg = Debug|Win32
- {C5BB1536-3776-4474-861D-B5923C610FE4}.Debug|Win32.Build.0 = Debug|Win32
- {C5BB1536-3776-4474-861D-B5923C610FE4}.Release|Win32.ActiveCfg = Release|Win32
- {C5BB1536-3776-4474-861D-B5923C610FE4}.Release|Win32.Build.0 = Release|Win32
- {B9A2E1F1-4E5C-49AC-B052-604CAE21F56E}.Debug|Win32.ActiveCfg = Debug|Win32
- {B9A2E1F1-4E5C-49AC-B052-604CAE21F56E}.Debug|Win32.Build.0 = Debug|Win32
- {B9A2E1F1-4E5C-49AC-B052-604CAE21F56E}.Release|Win32.ActiveCfg = Release|Win32
- {B9A2E1F1-4E5C-49AC-B052-604CAE21F56E}.Release|Win32.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/build/vsnet8/XMPCore.vcproj b/build/vsnet8/XMPCore.vcproj
new file mode 100644
index 0000000..c53b05f
--- /dev/null
+++ b/build/vsnet8/XMPCore.vcproj
@@ -0,0 +1,442 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="XMPCore"
+ ProjectGUID="{C5BB1536-3776-4474-861D-B5923C610FE4}"
+ RootNamespace="XMPCore"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="..\..\public\libraries\windows\debug\"
+ IntermediateDirectory="..\..\intermediate\windows\debug\"
+ ConfigurationType="4"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ InlineFunctionExpansion="0"
+ FavorSizeOrSpeed="0"
+ WholeProgramOptimization="false"
+ AdditionalIncludeDirectories=".\;..\;..\..\public\include\;..\..\source\common\;..\..\source\XMPCore\;&quot;..\..\third-party\expat\lib\&quot;;&quot;..\..\third-party\MD5\&quot;"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;HAVE_EXPAT_CONFIG_H=1;XML_STATIC=1;DEBUG=1;_DEBUG=1"
+ StringPooling="true"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ SmallerTypeCheck="false"
+ RuntimeLibrary="1"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ ObjectFile="..\..\intermediate\windows\debug\"
+ BrowseInformation="0"
+ WarningLevel="3"
+ WarnAsError="false"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ CompileAs="2"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="$(OutDir)\XMPCoreStaticDebug.lib"
+ IgnoreAllDefaultLibraries="false"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="..\..\public\libraries\windows_x64\debug\"
+ IntermediateDirectory="..\..\intermediate\windows_x64\debug\"
+ ConfigurationType="4"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ InlineFunctionExpansion="0"
+ FavorSizeOrSpeed="0"
+ WholeProgramOptimization="false"
+ AdditionalIncludeDirectories=".\;..\;..\..\public\include\;..\..\source\common\;..\..\source\XMPCore\;&quot;..\..\third-party\expat\lib\&quot;;&quot;..\..\third-party\MD5\&quot;"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;HAVE_EXPAT_CONFIG_H=1;XML_STATIC=1;DEBUG=1;_DEBUG=1"
+ StringPooling="true"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ SmallerTypeCheck="false"
+ RuntimeLibrary="1"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ ObjectFile="..\..\intermediate\windows_x64\debug\"
+ BrowseInformation="0"
+ WarningLevel="3"
+ WarnAsError="false"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ CompileAs="2"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="$(OutDir)\XMPCoreStaticDebug.lib"
+ IgnoreAllDefaultLibraries="false"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="..\..\public\libraries\windows\release\"
+ IntermediateDirectory="..\..\intermediate\windows\release\"
+ ConfigurationType="4"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ FavorSizeOrSpeed="2"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=".\;..\;..\..\public\include\;..\..\source\common\;..\..\source\XMPCore\;&quot;..\..\third-party\expat\lib\&quot;;&quot;..\..\third-party\MD5\&quot;"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;HAVE_EXPAT_CONFIG_H=1;XML_STATIC=1;NDEBUG=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ BasicRuntimeChecks="0"
+ SmallerTypeCheck="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ ObjectFile="..\..\intermediate\windows\release\"
+ BrowseInformation="0"
+ WarningLevel="3"
+ WarnAsError="false"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="0"
+ CompileAs="2"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="$(OutDir)\XMPCoreStaticRelease.lib"
+ IgnoreAllDefaultLibraries="false"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="..\..\public\libraries\windows_x64\release\"
+ IntermediateDirectory="..\..\intermediate\windows_x64\release\"
+ ConfigurationType="4"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ FavorSizeOrSpeed="2"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=".\;..\;..\..\public\include\;..\..\source\common\;..\..\source\XMPCore\;&quot;..\..\third-party\expat\lib\&quot;;&quot;..\..\third-party\MD5\&quot;"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;HAVE_EXPAT_CONFIG_H=1;XML_STATIC=1;NDEBUG=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ BasicRuntimeChecks="0"
+ SmallerTypeCheck="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ ObjectFile="..\..\intermediate\windows_x64\release\"
+ BrowseInformation="0"
+ WarningLevel="3"
+ WarnAsError="false"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="0"
+ CompileAs="2"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="$(OutDir)\XMPCoreStaticRelease.lib"
+ IgnoreAllDefaultLibraries="false"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <Filter
+ Name="Toolkit Core"
+ >
+ <File
+ RelativePath="..\..\source\XMPCore\XMPCore_Impl.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPCore\XMPIterator.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPCore\XMPMeta-GetSet.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPCore\XMPMeta-Parse.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPCore\XMPMeta-Serialize.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPCore\XMPMeta.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPCore\XMPUtils-FileInfo.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPCore\XMPUtils.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Utilities"
+ >
+ <File
+ RelativePath="..\..\source\XMPCore\ExpatAdapter.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\third-party\MD5\MD5.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPCore\ParseRDF.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\UnicodeConversions.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\XML_Node.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="XML Parser"
+ >
+ <File
+ RelativePath=".\expat_config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\third-party\expat\lib\xmlparse.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\third-party\expat\lib\xmlrole.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\third-party\expat\lib\xmltok.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="ABI Wrappers"
+ >
+ <File
+ RelativePath="..\..\source\XMPCore\WXMPIterator.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPCore\WXMPMeta.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPCore\WXMPUtils.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Third Party"
+ >
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/build/vsnet8/XMPFiles.vcproj b/build/vsnet8/XMPFiles.vcproj
new file mode 100644
index 0000000..3694d9c
--- /dev/null
+++ b/build/vsnet8/XMPFiles.vcproj
@@ -0,0 +1,598 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="XMPFiles"
+ ProjectGUID="{B9A2E1F1-4E5C-49AC-B052-604CAE21F56E}"
+ RootNamespace="XMPFilesStatic"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="..\..\public\libraries\windows\debug\"
+ IntermediateDirectory="..\..\intermediate\windows\debug\"
+ ConfigurationType="4"
+ CharacterSet="1"
+ WholeProgramOptimization="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ UseUnicodeResponseFiles="true"
+ Optimization="0"
+ AdditionalIncludeDirectories=".\;..\;..\..\public\include\;..\..\source\XMPFiles\;..\..\source\XMPFiles\FormatSupport\;..\..\source\common\;&quot;..\..\third-party\MD5\&quot;;&quot;..\..\third-party\QTDevWin\CIncludes\&quot;;&quot;..\..\third-party\zlib\&quot;"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;XMP_StaticBuild=1;DEBUG=1;_CRT_SECURE_NO_WARNINGS=1;_DEBUG=1"
+ StringPooling="true"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ DefaultCharIsUnsigned="true"
+ UsePrecompiledHeader="0"
+ ObjectFile="..\..\intermediate\windows\debug\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalDependencies="..\..\third-party\QTDevWin\Libraries\qtmlClient.lib Advapi32.lib User32.lib $(NOINHERIT)"
+ OutputFile="$(OutDir)/XMPFilesStaticDebug.lib"
+ IgnoreAllDefaultLibraries="false"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine=""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="..\..\public\libraries\windows_x64\debug\"
+ IntermediateDirectory="..\..\intermediate\windows_x64\debug\"
+ ConfigurationType="4"
+ CharacterSet="1"
+ WholeProgramOptimization="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ UseUnicodeResponseFiles="true"
+ Optimization="0"
+ AdditionalIncludeDirectories=".\;..\;..\..\public\include\;..\..\source\XMPFiles\;..\..\source\XMPFiles\FormatSupport\;..\..\source\common\;&quot;..\..\third-party\MD5\&quot;;&quot;..\..\third-party\QTDevWin\CIncludes\&quot;;&quot;..\..\third-party\zlib\&quot;"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;XMP_StaticBuild=1;DEBUG=1;_DEBUG=1;_CRT_SECURE_NO_WARNINGS=1"
+ StringPooling="true"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ DefaultCharIsUnsigned="true"
+ UsePrecompiledHeader="0"
+ ObjectFile="..\..\intermediate\windows_x64\debug\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalDependencies="..\..\third-party\QTDevWin\Libraries\qtmlClient.lib Advapi32.lib User32.lib $(NOINHERIT)"
+ OutputFile="$(OutDir)/XMPFilesStaticDebug.lib"
+ IgnoreAllDefaultLibraries="false"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine=""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="..\..\public\libraries\windows\release\"
+ IntermediateDirectory="..\..\intermediate\windows\release\"
+ ConfigurationType="4"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ FavorSizeOrSpeed="2"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=".\;..\;..\..\public\include\;..\..\source\XMPFiles\;..\..\source\XMPFiles\FormatSupport\;..\..\source\common\;&quot;..\..\third-party\MD5\&quot;;&quot;..\..\third-party\QTDevWin\CIncludes\&quot;;&quot;..\..\third-party\zlib\&quot;"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;XMP_StaticBuild=1;NDEBUG=1;_CRT_SECURE_NO_WARNINGS=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
+ DefaultCharIsUnsigned="true"
+ UsePrecompiledHeader="0"
+ ObjectFile="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalDependencies="..\..\third-party\QTDevWin\Libraries\qtmlClient.lib Advapi32.lib User32.lib $(NOINHERIT)"
+ OutputFile="$(OutDir)/XMPFilesStaticRelease.lib"
+ IgnoreAllDefaultLibraries="false"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine=""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="..\..\public\libraries\windows_x64\release\"
+ IntermediateDirectory="..\..\intermediate\windows_x64\release\"
+ ConfigurationType="4"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ FavorSizeOrSpeed="2"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=".\;..\;..\..\public\include\;..\..\source\XMPFiles\;..\..\source\XMPFiles\FormatSupport\;..\..\source\common\;&quot;..\..\third-party\MD5\&quot;;&quot;..\..\third-party\QTDevWin\CIncludes\&quot;;&quot;..\..\third-party\zlib\&quot;"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;XMP_StaticBuild=1;NDEBUG=1;_CRT_SECURE_NO_WARNINGS=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
+ DefaultCharIsUnsigned="true"
+ UsePrecompiledHeader="0"
+ ObjectFile="..\..\intermediate\windows_x64\release\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalDependencies="..\..\third-party\QTDevWin\Libraries\qtmlClient.lib Advapi32.lib User32.lib $(NOINHERIT)"
+ OutputFile="$(OutDir)/XMPFilesStaticRelease.lib"
+ IgnoreAllDefaultLibraries="false"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine=""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <Filter
+ Name="Common Code"
+ >
+ <File
+ RelativePath="..\..\source\common\LargeFileAccess.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\UnicodeConversions.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\WXMPFiles.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\XML_Node.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\XMPFiles.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\XMPFiles_Impl.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="File Handlers"
+ >
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\ASF_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\AVCHD_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\AVI_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\Basic_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\FLV_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\InDesign_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\JPEG_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\MOV_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\MP3_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\MPEG2_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\MPEG4_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\P2_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\PNG_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\PostScript_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\PSD_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\Scanner_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\SonyHDV_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\SWF_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\TIFF_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\Trivial_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\UCF_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\WAV_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\XDCAM_Handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FileHandlers\XDCAMEX_Handler.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Format Support"
+ >
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\ASF_Support.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\ID3_Support.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\IPTC_Support.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\PNG_Support.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\PSIR_FileWriter.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\PSIR_MemoryReader.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\QuickTime_Support.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\Reconcile_Impl.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\ReconcileIPTC.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\ReconcileLegacy.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\ReconcileTIFF.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\RIFF_Support.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\SWF_Support.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\TIFF_FileWriter.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\TIFF_MemoryReader.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\TIFF_Support.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\XDCAM_Support.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\XMPFiles\FormatSupport\XMPScanner.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Third Party"
+ >
+ <Filter
+ Name="zlib"
+ >
+ <File
+ RelativePath="..\..\third-party\zlib\adler32.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\third-party\zlib\compress.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\third-party\zlib\crc32.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\third-party\zlib\deflate.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\third-party\zlib\gzio.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\third-party\zlib\infback.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\third-party\zlib\inffast.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\third-party\zlib\inflate.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\third-party\zlib\inftrees.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\third-party\zlib\trees.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\third-party\zlib\uncompr.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\third-party\zlib\zutil.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="MD5"
+ >
+ <File
+ RelativePath="..\..\third-party\MD5\MD5.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/build/vsnet8/XMPToolkitSDK.sln b/build/vsnet8/XMPToolkitSDK.sln
new file mode 100644
index 0000000..a9a79f6
--- /dev/null
+++ b/build/vsnet8/XMPToolkitSDK.sln
@@ -0,0 +1,35 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XMPCore", "XMPCore.vcproj", "{C5BB1536-3776-4474-861D-B5923C610FE4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XMPFiles", "XMPFiles.vcproj", "{B9A2E1F1-4E5C-49AC-B052-604CAE21F56E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {C5BB1536-3776-4474-861D-B5923C610FE4}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C5BB1536-3776-4474-861D-B5923C610FE4}.Debug|Win32.Build.0 = Debug|Win32
+ {C5BB1536-3776-4474-861D-B5923C610FE4}.Debug|x64.ActiveCfg = Debug|x64
+ {C5BB1536-3776-4474-861D-B5923C610FE4}.Debug|x64.Build.0 = Debug|x64
+ {C5BB1536-3776-4474-861D-B5923C610FE4}.Release|Win32.ActiveCfg = Release|Win32
+ {C5BB1536-3776-4474-861D-B5923C610FE4}.Release|Win32.Build.0 = Release|Win32
+ {C5BB1536-3776-4474-861D-B5923C610FE4}.Release|x64.ActiveCfg = Release|x64
+ {C5BB1536-3776-4474-861D-B5923C610FE4}.Release|x64.Build.0 = Release|x64
+ {B9A2E1F1-4E5C-49AC-B052-604CAE21F56E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B9A2E1F1-4E5C-49AC-B052-604CAE21F56E}.Debug|Win32.Build.0 = Debug|Win32
+ {B9A2E1F1-4E5C-49AC-B052-604CAE21F56E}.Debug|x64.ActiveCfg = Debug|x64
+ {B9A2E1F1-4E5C-49AC-B052-604CAE21F56E}.Debug|x64.Build.0 = Debug|x64
+ {B9A2E1F1-4E5C-49AC-B052-604CAE21F56E}.Release|Win32.ActiveCfg = Release|Win32
+ {B9A2E1F1-4E5C-49AC-B052-604CAE21F56E}.Release|Win32.Build.0 = Release|Win32
+ {B9A2E1F1-4E5C-49AC-B052-604CAE21F56E}.Release|x64.ActiveCfg = Release|x64
+ {B9A2E1F1-4E5C-49AC-B052-604CAE21F56E}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/build/vsnet/expat_config.h b/build/vsnet8/expat_config.h
index 945d0bd..945d0bd 100644
--- a/build/vsnet/expat_config.h
+++ b/build/vsnet8/expat_config.h
diff --git a/build/xcode/XMPToolkit.xcodeproj/project.pbxproj b/build/xcode/XMPToolkit.xcodeproj/project.pbxproj
deleted file mode 100644
index a07e410..0000000
--- a/build/xcode/XMPToolkit.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,790 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 42;
- objects = {
-
-/* Begin PBXAggregateTarget section */
- DCF912BC09A3E6970055523F /* Build All */ = {
- isa = PBXAggregateTarget;
- buildConfigurationList = DCF912C109A3E6C60055523F /* Build configuration list for PBXAggregateTarget "Build All" */;
- buildPhases = (
- );
- dependencies = (
- DCF912BE09A3E6A40055523F /* PBXTargetDependency */,
- DCF912C009A3E6A70055523F /* PBXTargetDependency */,
- 01FC6D920B7B7858008559A1 /* PBXTargetDependency */,
- 01FC6D900B7B7858008559A1 /* PBXTargetDependency */,
- );
- name = "Build All";
- productName = "Build All";
- };
-/* End PBXAggregateTarget section */
-
-/* Begin PBXBuildFile section */
- 0102D1C70B7B8471001AF6F7 /* MD5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 014A2AA10B78FF1400A80B2A /* MD5.cpp */; };
- 0102D1C80B7B8472001AF6F7 /* MD5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 014A2AA10B78FF1400A80B2A /* MD5.cpp */; };
- 014796520B776899007CF8F4 /* XMPCore_Impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 014796510B776899007CF8F4 /* XMPCore_Impl.cpp */; };
- 014796530B776899007CF8F4 /* XMPCore_Impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 014796510B776899007CF8F4 /* XMPCore_Impl.cpp */; };
- 014A2AA20B78FF2C00A80B2A /* MD5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 014A2AA10B78FF1400A80B2A /* MD5.cpp */; };
- 014A2AA30B78FF2C00A80B2A /* MD5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 014A2AA10B78FF1400A80B2A /* MD5.cpp */; };
- 01FC6CE80B7B6D65008559A1 /* WXMPFiles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 014A2AAD0B78FFD200A80B2A /* WXMPFiles.cpp */; };
- 01FC6D060B7B7514008559A1 /* WXMPFiles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 014A2AAD0B78FFD200A80B2A /* WXMPFiles.cpp */; };
- 01FC6D3D0B7B7789008559A1 /* ID3_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D2C0B7B7773008559A1 /* ID3_Support.cpp */; };
- 01FC6D3E0B7B7789008559A1 /* IPTC_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D2D0B7B7773008559A1 /* IPTC_Support.cpp */; };
- 01FC6D3F0B7B7789008559A1 /* PNG_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D2E0B7B7773008559A1 /* PNG_Support.cpp */; };
- 01FC6D400B7B7789008559A1 /* PSIR_FileWriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D2F0B7B7773008559A1 /* PSIR_FileWriter.cpp */; };
- 01FC6D410B7B7789008559A1 /* PSIR_MemoryReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D300B7B7773008559A1 /* PSIR_MemoryReader.cpp */; };
- 01FC6D420B7B7789008559A1 /* QuickTime_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D310B7B7773008559A1 /* QuickTime_Support.cpp */; };
- 01FC6D430B7B7789008559A1 /* Reconcile_Impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D320B7B7773008559A1 /* Reconcile_Impl.cpp */; };
- 01FC6D440B7B7789008559A1 /* ReconcileIPTC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D330B7B7773008559A1 /* ReconcileIPTC.cpp */; };
- 01FC6D450B7B7789008559A1 /* ReconcileLegacy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D340B7B7773008559A1 /* ReconcileLegacy.cpp */; };
- 01FC6D460B7B7789008559A1 /* ReconcileTIFF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D350B7B7773008559A1 /* ReconcileTIFF.cpp */; };
- 01FC6D470B7B7789008559A1 /* RIFF_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D360B7B7773008559A1 /* RIFF_Support.cpp */; };
- 01FC6D490B7B7789008559A1 /* TIFF_FileWriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D380B7B7773008559A1 /* TIFF_FileWriter.cpp */; };
- 01FC6D4A0B7B7789008559A1 /* TIFF_MemoryReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D390B7B7773008559A1 /* TIFF_MemoryReader.cpp */; };
- 01FC6D4B0B7B7789008559A1 /* TIFF_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D3A0B7B7773008559A1 /* TIFF_Support.cpp */; };
- 01FC6D4C0B7B7789008559A1 /* XMPScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D3B0B7B7773008559A1 /* XMPScanner.cpp */; };
- 01FC6D4E0B7B778A008559A1 /* ID3_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D2C0B7B7773008559A1 /* ID3_Support.cpp */; };
- 01FC6D4F0B7B778A008559A1 /* IPTC_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D2D0B7B7773008559A1 /* IPTC_Support.cpp */; };
- 01FC6D500B7B778A008559A1 /* PNG_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D2E0B7B7773008559A1 /* PNG_Support.cpp */; };
- 01FC6D510B7B778A008559A1 /* PSIR_FileWriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D2F0B7B7773008559A1 /* PSIR_FileWriter.cpp */; };
- 01FC6D520B7B778A008559A1 /* PSIR_MemoryReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D300B7B7773008559A1 /* PSIR_MemoryReader.cpp */; };
- 01FC6D530B7B778A008559A1 /* QuickTime_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D310B7B7773008559A1 /* QuickTime_Support.cpp */; };
- 01FC6D540B7B778A008559A1 /* Reconcile_Impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D320B7B7773008559A1 /* Reconcile_Impl.cpp */; };
- 01FC6D550B7B778A008559A1 /* ReconcileIPTC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D330B7B7773008559A1 /* ReconcileIPTC.cpp */; };
- 01FC6D560B7B778A008559A1 /* ReconcileLegacy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D340B7B7773008559A1 /* ReconcileLegacy.cpp */; };
- 01FC6D570B7B778A008559A1 /* ReconcileTIFF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D350B7B7773008559A1 /* ReconcileTIFF.cpp */; };
- 01FC6D580B7B778A008559A1 /* RIFF_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D360B7B7773008559A1 /* RIFF_Support.cpp */; };
- 01FC6D5A0B7B778A008559A1 /* TIFF_FileWriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D380B7B7773008559A1 /* TIFF_FileWriter.cpp */; };
- 01FC6D5B0B7B778A008559A1 /* TIFF_MemoryReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D390B7B7773008559A1 /* TIFF_MemoryReader.cpp */; };
- 01FC6D5C0B7B778A008559A1 /* TIFF_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D3A0B7B7773008559A1 /* TIFF_Support.cpp */; };
- 01FC6D5D0B7B778A008559A1 /* XMPScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D3B0B7B7773008559A1 /* XMPScanner.cpp */; };
- 01FC6D5F0B7B7799008559A1 /* AVI_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D160B7B75F9008559A1 /* AVI_Handler.cpp */; };
- 01FC6D600B7B7799008559A1 /* Basic_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D170B7B75F9008559A1 /* Basic_Handler.cpp */; };
- 01FC6D610B7B7799008559A1 /* InDesign_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D180B7B75F9008559A1 /* InDesign_Handler.cpp */; };
- 01FC6D620B7B7799008559A1 /* JPEG_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D190B7B75F9008559A1 /* JPEG_Handler.cpp */; };
- 01FC6D640B7B7799008559A1 /* MOV_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D1B0B7B75F9008559A1 /* MOV_Handler.cpp */; };
- 01FC6D650B7B7799008559A1 /* MP3_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D1C0B7B75F9008559A1 /* MP3_Handler.cpp */; };
- 01FC6D670B7B7799008559A1 /* MPEG_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D1E0B7B75F9008559A1 /* MPEG_Handler.cpp */; };
- 01FC6D680B7B7799008559A1 /* PNG_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D1F0B7B75F9008559A1 /* PNG_Handler.cpp */; };
- 01FC6D690B7B7799008559A1 /* PostScript_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D200B7B75F9008559A1 /* PostScript_Handler.cpp */; };
- 01FC6D6A0B7B7799008559A1 /* PSD_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D210B7B75F9008559A1 /* PSD_Handler.cpp */; };
- 01FC6D6B0B7B7799008559A1 /* Scanner_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D220B7B75F9008559A1 /* Scanner_Handler.cpp */; };
- 01FC6D6D0B7B7799008559A1 /* TIFF_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D240B7B75F9008559A1 /* TIFF_Handler.cpp */; };
- 01FC6D6E0B7B7799008559A1 /* Trivial_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D250B7B75F9008559A1 /* Trivial_Handler.cpp */; };
- 01FC6D6F0B7B7799008559A1 /* WAV_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D260B7B75F9008559A1 /* WAV_Handler.cpp */; };
- 01FC6D710B7B779A008559A1 /* AVI_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D160B7B75F9008559A1 /* AVI_Handler.cpp */; };
- 01FC6D720B7B779A008559A1 /* Basic_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D170B7B75F9008559A1 /* Basic_Handler.cpp */; };
- 01FC6D730B7B779A008559A1 /* InDesign_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D180B7B75F9008559A1 /* InDesign_Handler.cpp */; };
- 01FC6D740B7B779A008559A1 /* JPEG_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D190B7B75F9008559A1 /* JPEG_Handler.cpp */; };
- 01FC6D760B7B779A008559A1 /* MOV_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D1B0B7B75F9008559A1 /* MOV_Handler.cpp */; };
- 01FC6D770B7B779A008559A1 /* MP3_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D1C0B7B75F9008559A1 /* MP3_Handler.cpp */; };
- 01FC6D790B7B779A008559A1 /* MPEG_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D1E0B7B75F9008559A1 /* MPEG_Handler.cpp */; };
- 01FC6D7A0B7B779A008559A1 /* PNG_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D1F0B7B75F9008559A1 /* PNG_Handler.cpp */; };
- 01FC6D7B0B7B779A008559A1 /* PostScript_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D200B7B75F9008559A1 /* PostScript_Handler.cpp */; };
- 01FC6D7C0B7B779A008559A1 /* PSD_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D210B7B75F9008559A1 /* PSD_Handler.cpp */; };
- 01FC6D7D0B7B779A008559A1 /* Scanner_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D220B7B75F9008559A1 /* Scanner_Handler.cpp */; };
- 01FC6D7F0B7B779A008559A1 /* TIFF_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D240B7B75F9008559A1 /* TIFF_Handler.cpp */; };
- 01FC6D800B7B779A008559A1 /* Trivial_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D250B7B75F9008559A1 /* Trivial_Handler.cpp */; };
- 01FC6D810B7B779A008559A1 /* WAV_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D260B7B75F9008559A1 /* WAV_Handler.cpp */; };
- 01FC6D870B7B77D9008559A1 /* WXMPFiles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D840B7B77C1008559A1 /* WXMPFiles.cpp */; };
- 01FC6D880B7B77D9008559A1 /* XMPFiles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D850B7B77C1008559A1 /* XMPFiles.cpp */; };
- 01FC6D890B7B77D9008559A1 /* XMPFiles_Impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D860B7B77C1008559A1 /* XMPFiles_Impl.cpp */; };
- 01FC6D8A0B7B77DA008559A1 /* WXMPFiles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D840B7B77C1008559A1 /* WXMPFiles.cpp */; };
- 01FC6D8B0B7B77DA008559A1 /* XMPFiles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D850B7B77C1008559A1 /* XMPFiles.cpp */; };
- 01FC6D8C0B7B77DA008559A1 /* XMPFiles_Impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D860B7B77C1008559A1 /* XMPFiles_Impl.cpp */; };
- DC493270089A94CE003ADAAF /* XMPIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E46085F950A003FEB33 /* XMPIterator.cpp */; };
- DC493271089A94CE003ADAAF /* XMPMeta.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E47085F950A003FEB33 /* XMPMeta.cpp */; };
- DC493272089A94CE003ADAAF /* XMPMeta-GetSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC87E517089960DB000A7ADF /* XMPMeta-GetSet.cpp */; };
- DC493273089A94CE003ADAAF /* XMPMeta-Parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC87E518089960DB000A7ADF /* XMPMeta-Parse.cpp */; };
- DC493274089A94CE003ADAAF /* XMPMeta-Serialize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC87E519089960DB000A7ADF /* XMPMeta-Serialize.cpp */; };
- DC493275089A94CE003ADAAF /* XMPUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E48085F950A003FEB33 /* XMPUtils.cpp */; };
- DC49327B089A94E6003ADAAF /* ExpatAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E73085F9791003FEB33 /* ExpatAdapter.cpp */; };
- DC49327D089A94E6003ADAAF /* ParseRDF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E75085F9791003FEB33 /* ParseRDF.cpp */; };
- DC49327E089A94E6003ADAAF /* UnicodeConversions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E76085F9791003FEB33 /* UnicodeConversions.cpp */; };
- DC49327F089A94FF003ADAAF /* xmlparse.c in Sources */ = {isa = PBXBuildFile; fileRef = DC14FDD2089A8591004D5310 /* xmlparse.c */; };
- DC493280089A94FF003ADAAF /* xmlrole.c in Sources */ = {isa = PBXBuildFile; fileRef = DC14FDD3089A8591004D5310 /* xmlrole.c */; };
- DC493281089A94FF003ADAAF /* xmltok.c in Sources */ = {isa = PBXBuildFile; fileRef = DC14FDD4089A8591004D5310 /* xmltok.c */; };
- DC493282089A950C003ADAAF /* WXMPIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E89085F9A39003FEB33 /* WXMPIterator.cpp */; };
- DC493283089A950C003ADAAF /* WXMPMeta.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E8A085F9A39003FEB33 /* WXMPMeta.cpp */; };
- DC493284089A950C003ADAAF /* WXMPUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E8B085F9A39003FEB33 /* WXMPUtils.cpp */; };
- DC493297089A9726003ADAAF /* XMPIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E46085F950A003FEB33 /* XMPIterator.cpp */; };
- DC493298089A9726003ADAAF /* XMPMeta.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E47085F950A003FEB33 /* XMPMeta.cpp */; };
- DC493299089A9726003ADAAF /* XMPMeta-GetSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC87E517089960DB000A7ADF /* XMPMeta-GetSet.cpp */; };
- DC49329A089A9726003ADAAF /* XMPMeta-Parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC87E518089960DB000A7ADF /* XMPMeta-Parse.cpp */; };
- DC49329B089A9726003ADAAF /* XMPMeta-Serialize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC87E519089960DB000A7ADF /* XMPMeta-Serialize.cpp */; };
- DC49329C089A9726003ADAAF /* XMPUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E48085F950A003FEB33 /* XMPUtils.cpp */; };
- DC4932A2089A9726003ADAAF /* ExpatAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E73085F9791003FEB33 /* ExpatAdapter.cpp */; };
- DC4932A4089A9726003ADAAF /* ParseRDF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E75085F9791003FEB33 /* ParseRDF.cpp */; };
- DC4932A5089A9726003ADAAF /* UnicodeConversions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E76085F9791003FEB33 /* UnicodeConversions.cpp */; };
- DC4932A6089A9726003ADAAF /* xmlparse.c in Sources */ = {isa = PBXBuildFile; fileRef = DC14FDD2089A8591004D5310 /* xmlparse.c */; };
- DC4932A7089A9726003ADAAF /* xmlrole.c in Sources */ = {isa = PBXBuildFile; fileRef = DC14FDD3089A8591004D5310 /* xmlrole.c */; };
- DC4932A8089A9726003ADAAF /* xmltok.c in Sources */ = {isa = PBXBuildFile; fileRef = DC14FDD4089A8591004D5310 /* xmltok.c */; };
- DC4932A9089A9726003ADAAF /* WXMPIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E89085F9A39003FEB33 /* WXMPIterator.cpp */; };
- DC4932AA089A9726003ADAAF /* WXMPMeta.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E8A085F9A39003FEB33 /* WXMPMeta.cpp */; };
- DC4932AB089A9726003ADAAF /* WXMPUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E8B085F9A39003FEB33 /* WXMPUtils.cpp */; };
- DCEDFE2509ACBECF00D86460 /* XMPUtils-FileInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DCEDFE2409ACBECF00D86460 /* XMPUtils-FileInfo.cpp */; };
- DCEDFE2609ACBECF00D86460 /* XMPUtils-FileInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DCEDFE2409ACBECF00D86460 /* XMPUtils-FileInfo.cpp */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXContainerItemProxy section */
- 01FC6D8F0B7B7858008559A1 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 01FC6CF20B7B7514008559A1;
- remoteInfo = "XMPFiles Release";
- };
- 01FC6D910B7B7858008559A1 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 01FC6CD40B7B6D65008559A1;
- remoteInfo = "XMPFiles Debug";
- };
- DCF912BD09A3E6A40055523F /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = DC49326B089A9441003ADAAF;
- remoteInfo = "XMPCore Debug";
- };
- DCF912BF09A3E6A70055523F /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = DC493293089A9726003ADAAF;
- remoteInfo = "XMPCore Release";
- };
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXFileReference section */
- 0147964D0B776823007CF8F4 /* XMPCore_Impl.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; path = XMPCore_Impl.hpp; sourceTree = "<group>"; };
- 014796510B776899007CF8F4 /* XMPCore_Impl.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XMPCore_Impl.cpp; sourceTree = "<group>"; };
- 014A29EF0B78E2C300A80B2A /* UnicodeConversions.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = UnicodeConversions.hpp; path = ../common/UnicodeConversions.hpp; sourceTree = "<group>"; };
- 014A29F40B78E2F300A80B2A /* UnicodeInlines.incl_cpp */ = {isa = PBXFileReference; lastKnownFileType = text; name = UnicodeInlines.incl_cpp; path = ../common/UnicodeInlines.incl_cpp; sourceTree = "<group>"; };
- 014A2A040B78E5C500A80B2A /* XMP_BuildInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = XMP_BuildInfo.h; path = ../../build/XMP_BuildInfo.h; sourceTree = "<group>"; };
- 014A2AA10B78FF1400A80B2A /* MD5.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MD5.cpp; path = "../../third-party/MD5/MD5.cpp"; sourceTree = "<group>"; };
- 014A2AAD0B78FFD200A80B2A /* WXMPFiles.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = WXMPFiles.cpp; path = ../XMPFiles/WXMPFiles.cpp; sourceTree = "<group>"; };
- 01FC6CEC0B7B6D65008559A1 /* libXMPFilesStaticDebug.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libXMPFilesStaticDebug.a; sourceTree = BUILT_PRODUCTS_DIR; };
- 01FC6D0A0B7B7514008559A1 /* libXMPFilesStaticRelease.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libXMPFilesStaticRelease.a; sourceTree = BUILT_PRODUCTS_DIR; };
- 01FC6D160B7B75F9008559A1 /* AVI_Handler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AVI_Handler.cpp; path = ../../source/XMPFiles/FileHandlers/AVI_Handler.cpp; sourceTree = "<group>"; };
- 01FC6D170B7B75F9008559A1 /* Basic_Handler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Basic_Handler.cpp; path = ../../source/XMPFiles/FileHandlers/Basic_Handler.cpp; sourceTree = "<group>"; };
- 01FC6D180B7B75F9008559A1 /* InDesign_Handler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = InDesign_Handler.cpp; path = ../../source/XMPFiles/FileHandlers/InDesign_Handler.cpp; sourceTree = "<group>"; };
- 01FC6D190B7B75F9008559A1 /* JPEG_Handler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = JPEG_Handler.cpp; path = ../../source/XMPFiles/FileHandlers/JPEG_Handler.cpp; sourceTree = "<group>"; };
- 01FC6D1B0B7B75F9008559A1 /* MOV_Handler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MOV_Handler.cpp; path = ../../source/XMPFiles/FileHandlers/MOV_Handler.cpp; sourceTree = "<group>"; };
- 01FC6D1C0B7B75F9008559A1 /* MP3_Handler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MP3_Handler.cpp; path = ../../source/XMPFiles/FileHandlers/MP3_Handler.cpp; sourceTree = "<group>"; };
- 01FC6D1E0B7B75F9008559A1 /* MPEG_Handler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MPEG_Handler.cpp; path = ../../source/XMPFiles/FileHandlers/MPEG_Handler.cpp; sourceTree = "<group>"; };
- 01FC6D1F0B7B75F9008559A1 /* PNG_Handler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PNG_Handler.cpp; path = ../../source/XMPFiles/FileHandlers/PNG_Handler.cpp; sourceTree = "<group>"; };
- 01FC6D200B7B75F9008559A1 /* PostScript_Handler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PostScript_Handler.cpp; path = ../../source/XMPFiles/FileHandlers/PostScript_Handler.cpp; sourceTree = "<group>"; };
- 01FC6D210B7B75F9008559A1 /* PSD_Handler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PSD_Handler.cpp; path = ../../source/XMPFiles/FileHandlers/PSD_Handler.cpp; sourceTree = "<group>"; };
- 01FC6D220B7B75F9008559A1 /* Scanner_Handler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Scanner_Handler.cpp; path = ../../source/XMPFiles/FileHandlers/Scanner_Handler.cpp; sourceTree = "<group>"; };
- 01FC6D240B7B75F9008559A1 /* TIFF_Handler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = TIFF_Handler.cpp; path = ../../source/XMPFiles/FileHandlers/TIFF_Handler.cpp; sourceTree = "<group>"; };
- 01FC6D250B7B75F9008559A1 /* Trivial_Handler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Trivial_Handler.cpp; path = ../../source/XMPFiles/FileHandlers/Trivial_Handler.cpp; sourceTree = "<group>"; };
- 01FC6D260B7B75F9008559A1 /* WAV_Handler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = WAV_Handler.cpp; path = ../../source/XMPFiles/FileHandlers/WAV_Handler.cpp; sourceTree = "<group>"; };
- 01FC6D2C0B7B7773008559A1 /* ID3_Support.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ID3_Support.cpp; path = ../../source/XMPFiles/FormatSupport/ID3_Support.cpp; sourceTree = "<group>"; };
- 01FC6D2D0B7B7773008559A1 /* IPTC_Support.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = IPTC_Support.cpp; path = ../../source/XMPFiles/FormatSupport/IPTC_Support.cpp; sourceTree = "<group>"; };
- 01FC6D2E0B7B7773008559A1 /* PNG_Support.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PNG_Support.cpp; path = ../../source/XMPFiles/FormatSupport/PNG_Support.cpp; sourceTree = "<group>"; };
- 01FC6D2F0B7B7773008559A1 /* PSIR_FileWriter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PSIR_FileWriter.cpp; path = ../../source/XMPFiles/FormatSupport/PSIR_FileWriter.cpp; sourceTree = "<group>"; };
- 01FC6D300B7B7773008559A1 /* PSIR_MemoryReader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PSIR_MemoryReader.cpp; path = ../../source/XMPFiles/FormatSupport/PSIR_MemoryReader.cpp; sourceTree = "<group>"; };
- 01FC6D310B7B7773008559A1 /* QuickTime_Support.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = QuickTime_Support.cpp; path = ../../source/XMPFiles/FormatSupport/QuickTime_Support.cpp; sourceTree = "<group>"; };
- 01FC6D320B7B7773008559A1 /* Reconcile_Impl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Reconcile_Impl.cpp; path = ../../source/XMPFiles/FormatSupport/Reconcile_Impl.cpp; sourceTree = "<group>"; };
- 01FC6D330B7B7773008559A1 /* ReconcileIPTC.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ReconcileIPTC.cpp; path = ../../source/XMPFiles/FormatSupport/ReconcileIPTC.cpp; sourceTree = "<group>"; };
- 01FC6D340B7B7773008559A1 /* ReconcileLegacy.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ReconcileLegacy.cpp; path = ../../source/XMPFiles/FormatSupport/ReconcileLegacy.cpp; sourceTree = "<group>"; };
- 01FC6D350B7B7773008559A1 /* ReconcileTIFF.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ReconcileTIFF.cpp; path = ../../source/XMPFiles/FormatSupport/ReconcileTIFF.cpp; sourceTree = "<group>"; };
- 01FC6D360B7B7773008559A1 /* RIFF_Support.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = RIFF_Support.cpp; path = ../../source/XMPFiles/FormatSupport/RIFF_Support.cpp; sourceTree = "<group>"; };
- 01FC6D380B7B7773008559A1 /* TIFF_FileWriter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = TIFF_FileWriter.cpp; path = ../../source/XMPFiles/FormatSupport/TIFF_FileWriter.cpp; sourceTree = "<group>"; };
- 01FC6D390B7B7773008559A1 /* TIFF_MemoryReader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = TIFF_MemoryReader.cpp; path = ../../source/XMPFiles/FormatSupport/TIFF_MemoryReader.cpp; sourceTree = "<group>"; };
- 01FC6D3A0B7B7773008559A1 /* TIFF_Support.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = TIFF_Support.cpp; path = ../../source/XMPFiles/FormatSupport/TIFF_Support.cpp; sourceTree = "<group>"; };
- 01FC6D3B0B7B7773008559A1 /* XMPScanner.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = XMPScanner.cpp; path = ../../source/XMPFiles/FormatSupport/XMPScanner.cpp; sourceTree = "<group>"; };
- 01FC6D840B7B77C1008559A1 /* WXMPFiles.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = WXMPFiles.cpp; path = ../../source/XMPFiles/WXMPFiles.cpp; sourceTree = "<group>"; };
- 01FC6D850B7B77C1008559A1 /* XMPFiles.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = XMPFiles.cpp; path = ../../source/XMPFiles/XMPFiles.cpp; sourceTree = "<group>"; };
- 01FC6D860B7B77C1008559A1 /* XMPFiles_Impl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = XMPFiles_Impl.cpp; path = ../../source/XMPFiles/XMPFiles_Impl.cpp; sourceTree = "<group>"; };
- 07601E46085F950A003FEB33 /* XMPIterator.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XMPIterator.cpp; sourceTree = "<group>"; };
- 07601E47085F950A003FEB33 /* XMPMeta.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XMPMeta.cpp; sourceTree = "<group>"; };
- 07601E48085F950A003FEB33 /* XMPUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XMPUtils.cpp; sourceTree = "<group>"; };
- 07601E73085F9791003FEB33 /* ExpatAdapter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ExpatAdapter.cpp; sourceTree = "<group>"; };
- 07601E75085F9791003FEB33 /* ParseRDF.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ParseRDF.cpp; sourceTree = "<group>"; };
- 07601E76085F9791003FEB33 /* UnicodeConversions.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = UnicodeConversions.cpp; path = ../common/UnicodeConversions.cpp; sourceTree = "<group>"; };
- 07601E89085F9A39003FEB33 /* WXMPIterator.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = WXMPIterator.cpp; sourceTree = "<group>"; };
- 07601E8A085F9A39003FEB33 /* WXMPMeta.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = WXMPMeta.cpp; sourceTree = "<group>"; };
- 07601E8B085F9A39003FEB33 /* WXMPUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = WXMPUtils.cpp; sourceTree = "<group>"; };
- 07601E92085F9A72003FEB33 /* XMPIterator.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; path = XMPIterator.hpp; sourceTree = "<group>"; };
- 07601E93085F9A72003FEB33 /* XMPMeta.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; path = XMPMeta.hpp; sourceTree = "<group>"; };
- 07601E94085F9A72003FEB33 /* XMPUtils.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; path = XMPUtils.hpp; sourceTree = "<group>"; };
- 07601E95085F9A88003FEB33 /* XMP_Const.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = XMP_Const.h; sourceTree = "<group>"; };
- 07601E97085F9AB8003FEB33 /* TXMPMeta.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; path = TXMPMeta.hpp; sourceTree = "<group>"; };
- 07601E98085F9AB8003FEB33 /* TXMPUtils.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; path = TXMPUtils.hpp; sourceTree = "<group>"; };
- 07601E99085F9AB8003FEB33 /* XMP_Environment.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = XMP_Environment.h; sourceTree = "<group>"; };
- 07601E9A085F9AB8003FEB33 /* XMP_Version.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = XMP_Version.h; sourceTree = "<group>"; };
- 07601E9B085F9AB8003FEB33 /* XMP.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; path = XMP.hpp; sourceTree = "<group>"; };
- DC14FDD2089A8591004D5310 /* xmlparse.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = xmlparse.c; sourceTree = "<group>"; };
- DC14FDD3089A8591004D5310 /* xmlrole.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = xmlrole.c; sourceTree = "<group>"; };
- DC14FDD4089A8591004D5310 /* xmltok.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = xmltok.c; sourceTree = "<group>"; };
- DC49326C089A9441003ADAAF /* libXMPCoreStaticDebug.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libXMPCoreStaticDebug.a; sourceTree = BUILT_PRODUCTS_DIR; };
- DC4932B0089A9726003ADAAF /* libXMPCoreStaticRelease.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libXMPCoreStaticRelease.a; sourceTree = BUILT_PRODUCTS_DIR; };
- DC87E517089960DB000A7ADF /* XMPMeta-GetSet.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = "XMPMeta-GetSet.cpp"; sourceTree = "<group>"; };
- DC87E518089960DB000A7ADF /* XMPMeta-Parse.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = "XMPMeta-Parse.cpp"; sourceTree = "<group>"; };
- DC87E519089960DB000A7ADF /* XMPMeta-Serialize.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = "XMPMeta-Serialize.cpp"; sourceTree = "<group>"; };
- DCE400F60951DA740040D71F /* TXMPIterator.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; path = TXMPIterator.hpp; sourceTree = "<group>"; };
- DCE400F70951DAA90040D71F /* XMPToolkit-Common.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; path = "XMPToolkit-Common.xcconfig"; sourceTree = "<group>"; };
- DCE400F80951DAA90040D71F /* XMPToolkit-Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; path = "XMPToolkit-Debug.xcconfig"; sourceTree = "<group>"; };
- DCE400F90951DAA90040D71F /* XMPToolkit-Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; path = "XMPToolkit-Release.xcconfig"; sourceTree = "<group>"; };
- DCEDFE2409ACBECF00D86460 /* XMPUtils-FileInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = "XMPUtils-FileInfo.cpp"; sourceTree = "<group>"; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 01FC6CE90B7B6D65008559A1 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 01FC6D070B7B7514008559A1 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DC49326A089A9441003ADAAF /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DC4932AC089A9726003ADAAF /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 014A2AB10B79001E00A80B2A /* Toolkit Files */ = {
- isa = PBXGroup;
- children = (
- 01FC6D840B7B77C1008559A1 /* WXMPFiles.cpp */,
- 01FC6D850B7B77C1008559A1 /* XMPFiles.cpp */,
- 01FC6D860B7B77C1008559A1 /* XMPFiles_Impl.cpp */,
- 01FC6CEE0B7B7462008559A1 /* Format Support */,
- 01FC6CED0B7B7458008559A1 /* File Handlers */,
- );
- name = "Toolkit Files";
- sourceTree = "<group>";
- };
- 01FC6CED0B7B7458008559A1 /* File Handlers */ = {
- isa = PBXGroup;
- children = (
- 01FC6D160B7B75F9008559A1 /* AVI_Handler.cpp */,
- 01FC6D170B7B75F9008559A1 /* Basic_Handler.cpp */,
- 01FC6D180B7B75F9008559A1 /* InDesign_Handler.cpp */,
- 01FC6D190B7B75F9008559A1 /* JPEG_Handler.cpp */,
- 01FC6D1B0B7B75F9008559A1 /* MOV_Handler.cpp */,
- 01FC6D1C0B7B75F9008559A1 /* MP3_Handler.cpp */,
- 01FC6D1E0B7B75F9008559A1 /* MPEG_Handler.cpp */,
- 01FC6D1F0B7B75F9008559A1 /* PNG_Handler.cpp */,
- 01FC6D200B7B75F9008559A1 /* PostScript_Handler.cpp */,
- 01FC6D210B7B75F9008559A1 /* PSD_Handler.cpp */,
- 01FC6D220B7B75F9008559A1 /* Scanner_Handler.cpp */,
- 01FC6D240B7B75F9008559A1 /* TIFF_Handler.cpp */,
- 01FC6D250B7B75F9008559A1 /* Trivial_Handler.cpp */,
- 01FC6D260B7B75F9008559A1 /* WAV_Handler.cpp */,
- );
- name = "File Handlers";
- sourceTree = "<group>";
- };
- 01FC6CEE0B7B7462008559A1 /* Format Support */ = {
- isa = PBXGroup;
- children = (
- 01FC6D2C0B7B7773008559A1 /* ID3_Support.cpp */,
- 01FC6D2D0B7B7773008559A1 /* IPTC_Support.cpp */,
- 01FC6D2E0B7B7773008559A1 /* PNG_Support.cpp */,
- 01FC6D2F0B7B7773008559A1 /* PSIR_FileWriter.cpp */,
- 01FC6D300B7B7773008559A1 /* PSIR_MemoryReader.cpp */,
- 01FC6D310B7B7773008559A1 /* QuickTime_Support.cpp */,
- 01FC6D320B7B7773008559A1 /* Reconcile_Impl.cpp */,
- 01FC6D330B7B7773008559A1 /* ReconcileIPTC.cpp */,
- 01FC6D340B7B7773008559A1 /* ReconcileLegacy.cpp */,
- 01FC6D350B7B7773008559A1 /* ReconcileTIFF.cpp */,
- 01FC6D360B7B7773008559A1 /* RIFF_Support.cpp */,
- 01FC6D380B7B7773008559A1 /* TIFF_FileWriter.cpp */,
- 01FC6D390B7B7773008559A1 /* TIFF_MemoryReader.cpp */,
- 01FC6D3A0B7B7773008559A1 /* TIFF_Support.cpp */,
- 01FC6D3B0B7B7773008559A1 /* XMPScanner.cpp */,
- );
- name = "Format Support";
- sourceTree = "<group>";
- };
- 07601E35085F945B003FEB33 /* Build Extras */ = {
- isa = PBXGroup;
- children = (
- DCE400F70951DAA90040D71F /* XMPToolkit-Common.xcconfig */,
- DCE400F80951DAA90040D71F /* XMPToolkit-Debug.xcconfig */,
- DCE400F90951DAA90040D71F /* XMPToolkit-Release.xcconfig */,
- );
- name = "Build Extras";
- sourceTree = "<group>";
- };
- 07601E38085F9469003FEB33 /* Public Headers and Glue */ = {
- isa = PBXGroup;
- children = (
- 07601E95085F9A88003FEB33 /* XMP_Const.h */,
- DCE400F60951DA740040D71F /* TXMPIterator.hpp */,
- 07601E97085F9AB8003FEB33 /* TXMPMeta.hpp */,
- 07601E98085F9AB8003FEB33 /* TXMPUtils.hpp */,
- 07601E99085F9AB8003FEB33 /* XMP_Environment.h */,
- 07601E9A085F9AB8003FEB33 /* XMP_Version.h */,
- 07601E9B085F9AB8003FEB33 /* XMP.hpp */,
- );
- name = "Public Headers and Glue";
- path = ../../public/include;
- sourceTree = "<group>";
- };
- 07601E3A085F947B003FEB33 /* Internal Headers */ = {
- isa = PBXGroup;
- children = (
- 014A2A040B78E5C500A80B2A /* XMP_BuildInfo.h */,
- 0147964D0B776823007CF8F4 /* XMPCore_Impl.hpp */,
- 07601E92085F9A72003FEB33 /* XMPIterator.hpp */,
- 07601E93085F9A72003FEB33 /* XMPMeta.hpp */,
- 07601E94085F9A72003FEB33 /* XMPUtils.hpp */,
- 014A29EF0B78E2C300A80B2A /* UnicodeConversions.hpp */,
- 014A29F40B78E2F300A80B2A /* UnicodeInlines.incl_cpp */,
- );
- name = "Internal Headers";
- path = ../../source/XMPCore;
- sourceTree = "<group>";
- };
- 07601E3C085F9484003FEB33 /* ABI Wrappers */ = {
- isa = PBXGroup;
- children = (
- 07601E89085F9A39003FEB33 /* WXMPIterator.cpp */,
- 07601E8A085F9A39003FEB33 /* WXMPMeta.cpp */,
- 07601E8B085F9A39003FEB33 /* WXMPUtils.cpp */,
- 014A2AAD0B78FFD200A80B2A /* WXMPFiles.cpp */,
- );
- name = "ABI Wrappers";
- path = ../../source/XMPCore;
- sourceTree = "<group>";
- };
- 07601E40085F949B003FEB33 /* Utilities */ = {
- isa = PBXGroup;
- children = (
- 07601E73085F9791003FEB33 /* ExpatAdapter.cpp */,
- 07601E75085F9791003FEB33 /* ParseRDF.cpp */,
- 07601E76085F9791003FEB33 /* UnicodeConversions.cpp */,
- 014A2AA10B78FF1400A80B2A /* MD5.cpp */,
- );
- name = Utilities;
- path = ../../source/XMPCore;
- sourceTree = "<group>";
- };
- 07601E42085F94A2003FEB33 /* Toolkit Core */ = {
- isa = PBXGroup;
- children = (
- 014796510B776899007CF8F4 /* XMPCore_Impl.cpp */,
- 07601E46085F950A003FEB33 /* XMPIterator.cpp */,
- 07601E47085F950A003FEB33 /* XMPMeta.cpp */,
- DC87E517089960DB000A7ADF /* XMPMeta-GetSet.cpp */,
- DC87E518089960DB000A7ADF /* XMPMeta-Parse.cpp */,
- DC87E519089960DB000A7ADF /* XMPMeta-Serialize.cpp */,
- 07601E48085F950A003FEB33 /* XMPUtils.cpp */,
- DCEDFE2409ACBECF00D86460 /* XMPUtils-FileInfo.cpp */,
- );
- name = "Toolkit Core";
- path = ../../source/XMPCore;
- sourceTree = "<group>";
- };
- 0867D691FE84028FC02AAC07 /* AdobeXMP */ = {
- isa = PBXGroup;
- children = (
- 07601E42085F94A2003FEB33 /* Toolkit Core */,
- 014A2AB10B79001E00A80B2A /* Toolkit Files */,
- 07601E40085F949B003FEB33 /* Utilities */,
- DC14FDC2089A84F0004D5310 /* XML Parser */,
- 07601E3C085F9484003FEB33 /* ABI Wrappers */,
- 07601E3A085F947B003FEB33 /* Internal Headers */,
- 07601E38085F9469003FEB33 /* Public Headers and Glue */,
- 07601E35085F945B003FEB33 /* Build Extras */,
- DC3CC41908A4342900F44C7B /* Products */,
- );
- name = AdobeXMP;
- sourceTree = "<group>";
- };
- DC14FDC2089A84F0004D5310 /* XML Parser */ = {
- isa = PBXGroup;
- children = (
- DC14FDD2089A8591004D5310 /* xmlparse.c */,
- DC14FDD3089A8591004D5310 /* xmlrole.c */,
- DC14FDD4089A8591004D5310 /* xmltok.c */,
- );
- name = "XML Parser";
- path = "../../third-party/expat/lib";
- sourceTree = "<group>";
- };
- DC3CC41908A4342900F44C7B /* Products */ = {
- isa = PBXGroup;
- children = (
- DC49326C089A9441003ADAAF /* libXMPCoreStaticDebug.a */,
- DC4932B0089A9726003ADAAF /* libXMPCoreStaticRelease.a */,
- 01FC6CEC0B7B6D65008559A1 /* libXMPFilesStaticDebug.a */,
- 01FC6D0A0B7B7514008559A1 /* libXMPFilesStaticRelease.a */,
- );
- name = Products;
- sourceTree = "<group>";
- };
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
- 01FC6CD40B7B6D65008559A1 /* XMPFiles Debug */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 01FC6CEA0B7B6D65008559A1 /* Build configuration list for PBXNativeTarget "XMPFiles Debug" */;
- buildPhases = (
- 01FC6CD50B7B6D65008559A1 /* Sources */,
- 01FC6CE90B7B6D65008559A1 /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "XMPFiles Debug";
- productName = "Debug-static";
- productReference = 01FC6CEC0B7B6D65008559A1 /* libXMPFilesStaticDebug.a */;
- productType = "com.apple.product-type.library.static";
- };
- 01FC6CF20B7B7514008559A1 /* XMPFiles Release */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 01FC6D080B7B7514008559A1 /* Build configuration list for PBXNativeTarget "XMPFiles Release" */;
- buildPhases = (
- 01FC6CF30B7B7514008559A1 /* Sources */,
- 01FC6D070B7B7514008559A1 /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "XMPFiles Release";
- productName = "Debug-static";
- productReference = 01FC6D0A0B7B7514008559A1 /* libXMPFilesStaticRelease.a */;
- productType = "com.apple.product-type.library.static";
- };
- DC49326B089A9441003ADAAF /* XMPCore Debug */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = DC49326D089A9460003ADAAF /* Build configuration list for PBXNativeTarget "XMPCore Debug" */;
- buildPhases = (
- DC493269089A9441003ADAAF /* Sources */,
- DC49326A089A9441003ADAAF /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "XMPCore Debug";
- productName = "Debug-static";
- productReference = DC49326C089A9441003ADAAF /* libXMPCoreStaticDebug.a */;
- productType = "com.apple.product-type.library.static";
- };
- DC493293089A9726003ADAAF /* XMPCore Release */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = DC4932AD089A9726003ADAAF /* Build configuration list for PBXNativeTarget "XMPCore Release" */;
- buildPhases = (
- DC493295089A9726003ADAAF /* Sources */,
- DC4932AC089A9726003ADAAF /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "XMPCore Release";
- productName = "Debug-static";
- productReference = DC4932B0089A9726003ADAAF /* libXMPCoreStaticRelease.a */;
- productType = "com.apple.product-type.library.static";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 0867D690FE84028FC02AAC07 /* Project object */ = {
- isa = PBXProject;
- buildConfigurationList = 07601E2C085F9443003FEB33 /* Build configuration list for PBXProject "XMPToolkit" */;
- hasScannedForEncodings = 1;
- mainGroup = 0867D691FE84028FC02AAC07 /* AdobeXMP */;
- productRefGroup = 0867D691FE84028FC02AAC07 /* AdobeXMP */;
- projectDirPath = "";
- targets = (
- DCF912BC09A3E6970055523F /* Build All */,
- DC49326B089A9441003ADAAF /* XMPCore Debug */,
- DC493293089A9726003ADAAF /* XMPCore Release */,
- 01FC6CD40B7B6D65008559A1 /* XMPFiles Debug */,
- 01FC6CF20B7B7514008559A1 /* XMPFiles Release */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXSourcesBuildPhase section */
- 01FC6CD50B7B6D65008559A1 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 01FC6CE80B7B6D65008559A1 /* WXMPFiles.cpp in Sources */,
- 01FC6D3D0B7B7789008559A1 /* ID3_Support.cpp in Sources */,
- 01FC6D3E0B7B7789008559A1 /* IPTC_Support.cpp in Sources */,
- 01FC6D3F0B7B7789008559A1 /* PNG_Support.cpp in Sources */,
- 01FC6D400B7B7789008559A1 /* PSIR_FileWriter.cpp in Sources */,
- 01FC6D410B7B7789008559A1 /* PSIR_MemoryReader.cpp in Sources */,
- 01FC6D420B7B7789008559A1 /* QuickTime_Support.cpp in Sources */,
- 01FC6D430B7B7789008559A1 /* Reconcile_Impl.cpp in Sources */,
- 01FC6D440B7B7789008559A1 /* ReconcileIPTC.cpp in Sources */,
- 01FC6D450B7B7789008559A1 /* ReconcileLegacy.cpp in Sources */,
- 01FC6D460B7B7789008559A1 /* ReconcileTIFF.cpp in Sources */,
- 01FC6D470B7B7789008559A1 /* RIFF_Support.cpp in Sources */,
- 01FC6D490B7B7789008559A1 /* TIFF_FileWriter.cpp in Sources */,
- 01FC6D4A0B7B7789008559A1 /* TIFF_MemoryReader.cpp in Sources */,
- 01FC6D4B0B7B7789008559A1 /* TIFF_Support.cpp in Sources */,
- 01FC6D4C0B7B7789008559A1 /* XMPScanner.cpp in Sources */,
- 01FC6D5F0B7B7799008559A1 /* AVI_Handler.cpp in Sources */,
- 01FC6D600B7B7799008559A1 /* Basic_Handler.cpp in Sources */,
- 01FC6D610B7B7799008559A1 /* InDesign_Handler.cpp in Sources */,
- 01FC6D620B7B7799008559A1 /* JPEG_Handler.cpp in Sources */,
- 01FC6D640B7B7799008559A1 /* MOV_Handler.cpp in Sources */,
- 01FC6D650B7B7799008559A1 /* MP3_Handler.cpp in Sources */,
- 01FC6D670B7B7799008559A1 /* MPEG_Handler.cpp in Sources */,
- 01FC6D680B7B7799008559A1 /* PNG_Handler.cpp in Sources */,
- 01FC6D690B7B7799008559A1 /* PostScript_Handler.cpp in Sources */,
- 01FC6D6A0B7B7799008559A1 /* PSD_Handler.cpp in Sources */,
- 01FC6D6B0B7B7799008559A1 /* Scanner_Handler.cpp in Sources */,
- 01FC6D6D0B7B7799008559A1 /* TIFF_Handler.cpp in Sources */,
- 01FC6D6E0B7B7799008559A1 /* Trivial_Handler.cpp in Sources */,
- 01FC6D6F0B7B7799008559A1 /* WAV_Handler.cpp in Sources */,
- 01FC6D870B7B77D9008559A1 /* WXMPFiles.cpp in Sources */,
- 01FC6D880B7B77D9008559A1 /* XMPFiles.cpp in Sources */,
- 01FC6D890B7B77D9008559A1 /* XMPFiles_Impl.cpp in Sources */,
- 0102D1C70B7B8471001AF6F7 /* MD5.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 01FC6CF30B7B7514008559A1 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 01FC6D060B7B7514008559A1 /* WXMPFiles.cpp in Sources */,
- 01FC6D4E0B7B778A008559A1 /* ID3_Support.cpp in Sources */,
- 01FC6D4F0B7B778A008559A1 /* IPTC_Support.cpp in Sources */,
- 01FC6D500B7B778A008559A1 /* PNG_Support.cpp in Sources */,
- 01FC6D510B7B778A008559A1 /* PSIR_FileWriter.cpp in Sources */,
- 01FC6D520B7B778A008559A1 /* PSIR_MemoryReader.cpp in Sources */,
- 01FC6D530B7B778A008559A1 /* QuickTime_Support.cpp in Sources */,
- 01FC6D540B7B778A008559A1 /* Reconcile_Impl.cpp in Sources */,
- 01FC6D550B7B778A008559A1 /* ReconcileIPTC.cpp in Sources */,
- 01FC6D560B7B778A008559A1 /* ReconcileLegacy.cpp in Sources */,
- 01FC6D570B7B778A008559A1 /* ReconcileTIFF.cpp in Sources */,
- 01FC6D580B7B778A008559A1 /* RIFF_Support.cpp in Sources */,
- 01FC6D5A0B7B778A008559A1 /* TIFF_FileWriter.cpp in Sources */,
- 01FC6D5B0B7B778A008559A1 /* TIFF_MemoryReader.cpp in Sources */,
- 01FC6D5C0B7B778A008559A1 /* TIFF_Support.cpp in Sources */,
- 01FC6D5D0B7B778A008559A1 /* XMPScanner.cpp in Sources */,
- 01FC6D710B7B779A008559A1 /* AVI_Handler.cpp in Sources */,
- 01FC6D720B7B779A008559A1 /* Basic_Handler.cpp in Sources */,
- 01FC6D730B7B779A008559A1 /* InDesign_Handler.cpp in Sources */,
- 01FC6D740B7B779A008559A1 /* JPEG_Handler.cpp in Sources */,
- 01FC6D760B7B779A008559A1 /* MOV_Handler.cpp in Sources */,
- 01FC6D770B7B779A008559A1 /* MP3_Handler.cpp in Sources */,
- 01FC6D790B7B779A008559A1 /* MPEG_Handler.cpp in Sources */,
- 01FC6D7A0B7B779A008559A1 /* PNG_Handler.cpp in Sources */,
- 01FC6D7B0B7B779A008559A1 /* PostScript_Handler.cpp in Sources */,
- 01FC6D7C0B7B779A008559A1 /* PSD_Handler.cpp in Sources */,
- 01FC6D7D0B7B779A008559A1 /* Scanner_Handler.cpp in Sources */,
- 01FC6D7F0B7B779A008559A1 /* TIFF_Handler.cpp in Sources */,
- 01FC6D800B7B779A008559A1 /* Trivial_Handler.cpp in Sources */,
- 01FC6D810B7B779A008559A1 /* WAV_Handler.cpp in Sources */,
- 01FC6D8A0B7B77DA008559A1 /* WXMPFiles.cpp in Sources */,
- 01FC6D8B0B7B77DA008559A1 /* XMPFiles.cpp in Sources */,
- 01FC6D8C0B7B77DA008559A1 /* XMPFiles_Impl.cpp in Sources */,
- 0102D1C80B7B8472001AF6F7 /* MD5.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DC493269089A9441003ADAAF /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- DC493270089A94CE003ADAAF /* XMPIterator.cpp in Sources */,
- DC493271089A94CE003ADAAF /* XMPMeta.cpp in Sources */,
- DC493272089A94CE003ADAAF /* XMPMeta-GetSet.cpp in Sources */,
- DC493273089A94CE003ADAAF /* XMPMeta-Parse.cpp in Sources */,
- DC493274089A94CE003ADAAF /* XMPMeta-Serialize.cpp in Sources */,
- DC493275089A94CE003ADAAF /* XMPUtils.cpp in Sources */,
- DC49327B089A94E6003ADAAF /* ExpatAdapter.cpp in Sources */,
- DC49327D089A94E6003ADAAF /* ParseRDF.cpp in Sources */,
- DC49327E089A94E6003ADAAF /* UnicodeConversions.cpp in Sources */,
- DC49327F089A94FF003ADAAF /* xmlparse.c in Sources */,
- DC493280089A94FF003ADAAF /* xmlrole.c in Sources */,
- DC493281089A94FF003ADAAF /* xmltok.c in Sources */,
- DC493282089A950C003ADAAF /* WXMPIterator.cpp in Sources */,
- DC493283089A950C003ADAAF /* WXMPMeta.cpp in Sources */,
- DC493284089A950C003ADAAF /* WXMPUtils.cpp in Sources */,
- DCEDFE2509ACBECF00D86460 /* XMPUtils-FileInfo.cpp in Sources */,
- 014796520B776899007CF8F4 /* XMPCore_Impl.cpp in Sources */,
- 014A2AA20B78FF2C00A80B2A /* MD5.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DC493295089A9726003ADAAF /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- DC493297089A9726003ADAAF /* XMPIterator.cpp in Sources */,
- DC493298089A9726003ADAAF /* XMPMeta.cpp in Sources */,
- DC493299089A9726003ADAAF /* XMPMeta-GetSet.cpp in Sources */,
- DC49329A089A9726003ADAAF /* XMPMeta-Parse.cpp in Sources */,
- DC49329B089A9726003ADAAF /* XMPMeta-Serialize.cpp in Sources */,
- DC49329C089A9726003ADAAF /* XMPUtils.cpp in Sources */,
- DC4932A2089A9726003ADAAF /* ExpatAdapter.cpp in Sources */,
- DC4932A4089A9726003ADAAF /* ParseRDF.cpp in Sources */,
- DC4932A5089A9726003ADAAF /* UnicodeConversions.cpp in Sources */,
- DC4932A6089A9726003ADAAF /* xmlparse.c in Sources */,
- DC4932A7089A9726003ADAAF /* xmlrole.c in Sources */,
- DC4932A8089A9726003ADAAF /* xmltok.c in Sources */,
- DC4932A9089A9726003ADAAF /* WXMPIterator.cpp in Sources */,
- DC4932AA089A9726003ADAAF /* WXMPMeta.cpp in Sources */,
- DC4932AB089A9726003ADAAF /* WXMPUtils.cpp in Sources */,
- DCEDFE2609ACBECF00D86460 /* XMPUtils-FileInfo.cpp in Sources */,
- 014796530B776899007CF8F4 /* XMPCore_Impl.cpp in Sources */,
- 014A2AA30B78FF2C00A80B2A /* MD5.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXTargetDependency section */
- 01FC6D900B7B7858008559A1 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 01FC6CF20B7B7514008559A1 /* XMPFiles Release */;
- targetProxy = 01FC6D8F0B7B7858008559A1 /* PBXContainerItemProxy */;
- };
- 01FC6D920B7B7858008559A1 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 01FC6CD40B7B6D65008559A1 /* XMPFiles Debug */;
- targetProxy = 01FC6D910B7B7858008559A1 /* PBXContainerItemProxy */;
- };
- DCF912BE09A3E6A40055523F /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = DC49326B089A9441003ADAAF /* XMPCore Debug */;
- targetProxy = DCF912BD09A3E6A40055523F /* PBXContainerItemProxy */;
- };
- DCF912C009A3E6A70055523F /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = DC493293089A9726003ADAAF /* XMPCore Release */;
- targetProxy = DCF912BF09A3E6A70055523F /* PBXContainerItemProxy */;
- };
-/* End PBXTargetDependency section */
-
-/* Begin XCBuildConfiguration section */
- 01FC6CEB0B7B6D65008559A1 /* Default */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = DCE400F80951DAA90040D71F /* XMPToolkit-Debug.xcconfig */;
- buildSettings = {
- PRODUCT_NAME = XMPFilesStaticDebug;
- };
- name = Default;
- };
- 01FC6D090B7B7514008559A1 /* Default */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = DCE400F90951DAA90040D71F /* XMPToolkit-Release.xcconfig */;
- buildSettings = {
- PRODUCT_NAME = XMPFilesStaticRelease;
- };
- name = Default;
- };
- 07A256240868DD5F00CA045D /* Default */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = DCE400F70951DAA90040D71F /* XMPToolkit-Common.xcconfig */;
- buildSettings = {
- };
- name = Default;
- };
- DC49326E089A9460003ADAAF /* Default */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = DCE400F80951DAA90040D71F /* XMPToolkit-Debug.xcconfig */;
- buildSettings = {
- PRODUCT_NAME = XMPCoreStaticDebug;
- };
- name = Default;
- };
- DC4932AE089A9726003ADAAF /* Default */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = DCE400F90951DAA90040D71F /* XMPToolkit-Release.xcconfig */;
- buildSettings = {
- PRODUCT_NAME = XMPCoreStaticRelease;
- };
- name = Default;
- };
- DCF912C209A3E6C60055523F /* Default */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- PRODUCT_NAME = "Build All";
- };
- name = Default;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 01FC6CEA0B7B6D65008559A1 /* Build configuration list for PBXNativeTarget "XMPFiles Debug" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 01FC6CEB0B7B6D65008559A1 /* Default */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Default;
- };
- 01FC6D080B7B7514008559A1 /* Build configuration list for PBXNativeTarget "XMPFiles Release" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 01FC6D090B7B7514008559A1 /* Default */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Default;
- };
- 07601E2C085F9443003FEB33 /* Build configuration list for PBXProject "XMPToolkit" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 07A256240868DD5F00CA045D /* Default */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Default;
- };
- DC49326D089A9460003ADAAF /* Build configuration list for PBXNativeTarget "XMPCore Debug" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- DC49326E089A9460003ADAAF /* Default */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Default;
- };
- DC4932AD089A9726003ADAAF /* Build configuration list for PBXNativeTarget "XMPCore Release" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- DC4932AE089A9726003ADAAF /* Default */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Default;
- };
- DCF912C109A3E6C60055523F /* Build configuration list for PBXAggregateTarget "Build All" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- DCF912C209A3E6C60055523F /* Default */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Default;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
-}
diff --git a/build/xcode/XMPToolkit-Common.xcconfig b/build/xcode2/XMPToolkitSDK-Common.xcconfig
index 4637c75..1f70b4f 100644
--- a/build/xcode/XMPToolkit-Common.xcconfig
+++ b/build/xcode2/XMPToolkitSDK-Common.xcconfig
@@ -1,9 +1,9 @@
-PRODUCT_ROOT = ${PROJECT_DIR}/../..
+ROOT = ./../..
-SOURCE_ROOT = ${PRODUCT_ROOT}/source
-PUBLIC_ROOT = ${PRODUCT_ROOT}/public
+SOURCE_ROOT = ${ROOT}/source
+PUBLIC_ROOT = ${ROOT}/public
-EXPAT_ROOT = ${PRODUCT_ROOT}/third-party/expat
+EXPAT_ROOT = ${ROOT}/third-party/expat
SRCROOT = ${SOURCE_ROOT}
@@ -32,7 +32,7 @@ SHARED_PRECOMPS_DIR =
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO
GCC_PRECOMPILE_PREFIX_HEADER = NO
-HEADER_SEARCH_PATHS = ${PROJECT_DIR} ${PUBLIC_ROOT}/include ${SOURCE_ROOT}/XMPCore ${SOURCE_ROOT}/XMPFiles ${SOURCE_ROOT}/common ${EXPAT_ROOT}/lib /Developer/Headers/FlatCarbon
+HEADER_SEARCH_PATHS = . ../ ${PUBLIC_ROOT}/include ${SOURCE_ROOT}/XMPCore ${SOURCE_ROOT}/XMPFiles ${SOURCE_ROOT}/XMPFiles/FormatSupport ${SOURCE_ROOT}/common ${EXPAT_ROOT}/lib /Developer/Headers/FlatCarbon
COMMON_DEFINES = MAC_ENV=1 HAVE_EXPAT_CONFIG_H=1 XML_STATIC=1
@@ -42,6 +42,7 @@ GCC_SHORT_ENUMS = YES
GCC_ONE_BYTE_BOOL = YES
GCC_NO_COMMON_BLOCKS = YES
GCC_FAST_MATH = YES
+GCC_SYMBOLS_PRIVATE_EXTERN = YES
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES
GCC_WARN_ABOUT_RETURN_TYPE = YES
diff --git a/build/xcode/XMPToolkit-Debug.xcconfig b/build/xcode2/XMPToolkitSDK-Debug.xcconfig
index 7297bf4..f1ecb32 100644
--- a/build/xcode/XMPToolkit-Debug.xcconfig
+++ b/build/xcode2/XMPToolkitSDK-Debug.xcconfig
@@ -1,6 +1,6 @@
BUILD_MODE = debug
-OBJROOT = ${PRODUCT_ROOT}/intermediate/macintosh/${BUILD_MODE}
+OBJROOT = ${ROOT}/intermediate/macintosh/${BUILD_MODE}
SYMROOT = ${PUBLIC_ROOT}/libraries/macintosh/${BUILD_MODE}
CONFIGURATION_BUILD_DIR = ${SYMROOT}
diff --git a/build/xcode/XMPToolkit-Release.xcconfig b/build/xcode2/XMPToolkitSDK-Release.xcconfig
index f60710a..f74a4ca 100644
--- a/build/xcode/XMPToolkit-Release.xcconfig
+++ b/build/xcode2/XMPToolkitSDK-Release.xcconfig
@@ -1,6 +1,6 @@
BUILD_MODE = release
-OBJROOT = ${PRODUCT_ROOT}/intermediate/macintosh/${BUILD_MODE}
+OBJROOT = ${ROOT}/intermediate/macintosh/${BUILD_MODE}
SYMROOT = ${PUBLIC_ROOT}/libraries/macintosh/${BUILD_MODE}
CONFIGURATION_BUILD_DIR = ${SYMROOT}
diff --git a/build/xcode2/XMPToolkitSDK.xcodeproj/project.pbxproj b/build/xcode2/XMPToolkitSDK.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..e3f322f
--- /dev/null
+++ b/build/xcode2/XMPToolkitSDK.xcodeproj/project.pbxproj
@@ -0,0 +1,988 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 42;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ DCF912BC09A3E6970055523F /* Build All */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = DCF912C109A3E6C60055523F /* Build configuration list for PBXAggregateTarget "Build All" */;
+ buildPhases = (
+ );
+ dependencies = (
+ DCF912BE09A3E6A40055523F /* PBXTargetDependency */,
+ DCF912C009A3E6A70055523F /* PBXTargetDependency */,
+ 01FC6D920B7B7858008559A1 /* PBXTargetDependency */,
+ 01FC6D900B7B7858008559A1 /* PBXTargetDependency */,
+ );
+ name = "Build All";
+ productName = "Build All";
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ 0102D1C70B7B8471001AF6F7 /* MD5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 014A2AA10B78FF1400A80B2A /* MD5.cpp */; };
+ 0102D1C80B7B8472001AF6F7 /* MD5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 014A2AA10B78FF1400A80B2A /* MD5.cpp */; };
+ 011127FF0E5C549500114B41 /* ASF_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 011127FE0E5C549400114B41 /* ASF_Handler.cpp */; };
+ 011128000E5C549500114B41 /* ASF_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 011127FE0E5C549400114B41 /* ASF_Handler.cpp */; };
+ 011128010E5C549500114B41 /* ASF_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 011127FE0E5C549400114B41 /* ASF_Handler.cpp */; };
+ 011128020E5C549500114B41 /* ASF_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 011127FE0E5C549400114B41 /* ASF_Handler.cpp */; };
+ 011128040E5C54A000114B41 /* ASF_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 011128030E5C54A000114B41 /* ASF_Support.cpp */; };
+ 011128050E5C54A000114B41 /* ASF_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 011128030E5C54A000114B41 /* ASF_Support.cpp */; };
+ 011128060E5C54A000114B41 /* ASF_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 011128030E5C54A000114B41 /* ASF_Support.cpp */; };
+ 011128070E5C54A000114B41 /* ASF_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 011128030E5C54A000114B41 /* ASF_Support.cpp */; };
+ 014796520B776899007CF8F4 /* XMPCore_Impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 014796510B776899007CF8F4 /* XMPCore_Impl.cpp */; };
+ 014796530B776899007CF8F4 /* XMPCore_Impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 014796510B776899007CF8F4 /* XMPCore_Impl.cpp */; };
+ 014A2AA20B78FF2C00A80B2A /* MD5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 014A2AA10B78FF1400A80B2A /* MD5.cpp */; };
+ 014A2AA30B78FF2C00A80B2A /* MD5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 014A2AA10B78FF1400A80B2A /* MD5.cpp */; };
+ 019024C30E34DB86000FC1F0 /* AVCHD_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024AC0E34DB86000FC1F0 /* AVCHD_Handler.cpp */; };
+ 019024C40E34DB86000FC1F0 /* AVI_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024AD0E34DB86000FC1F0 /* AVI_Handler.cpp */; };
+ 019024C50E34DB86000FC1F0 /* Basic_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024AE0E34DB86000FC1F0 /* Basic_Handler.cpp */; };
+ 019024C60E34DB86000FC1F0 /* FLV_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024AF0E34DB86000FC1F0 /* FLV_Handler.cpp */; };
+ 019024C80E34DB86000FC1F0 /* InDesign_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B10E34DB86000FC1F0 /* InDesign_Handler.cpp */; };
+ 019024C90E34DB86000FC1F0 /* JPEG_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B20E34DB86000FC1F0 /* JPEG_Handler.cpp */; };
+ 019024CA0E34DB86000FC1F0 /* MOV_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B30E34DB86000FC1F0 /* MOV_Handler.cpp */; };
+ 019024CB0E34DB86000FC1F0 /* MP3_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B40E34DB86000FC1F0 /* MP3_Handler.cpp */; };
+ 019024CC0E34DB86000FC1F0 /* MPEG2_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B50E34DB86000FC1F0 /* MPEG2_Handler.cpp */; };
+ 019024CD0E34DB86000FC1F0 /* MPEG4_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B60E34DB86000FC1F0 /* MPEG4_Handler.cpp */; };
+ 019024CE0E34DB86000FC1F0 /* P2_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B70E34DB86000FC1F0 /* P2_Handler.cpp */; };
+ 019024CF0E34DB86000FC1F0 /* PNG_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B80E34DB86000FC1F0 /* PNG_Handler.cpp */; };
+ 019024D00E34DB86000FC1F0 /* PostScript_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B90E34DB86000FC1F0 /* PostScript_Handler.cpp */; };
+ 019024D10E34DB86000FC1F0 /* PSD_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024BA0E34DB86000FC1F0 /* PSD_Handler.cpp */; };
+ 019024D20E34DB86000FC1F0 /* Scanner_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024BB0E34DB86000FC1F0 /* Scanner_Handler.cpp */; };
+ 019024D30E34DB86000FC1F0 /* SonyHDV_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024BC0E34DB86000FC1F0 /* SonyHDV_Handler.cpp */; };
+ 019024D40E34DB86000FC1F0 /* TIFF_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024BD0E34DB86000FC1F0 /* TIFF_Handler.cpp */; };
+ 019024D50E34DB86000FC1F0 /* Trivial_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024BE0E34DB86000FC1F0 /* Trivial_Handler.cpp */; };
+ 019024D60E34DB86000FC1F0 /* UCF_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024BF0E34DB86000FC1F0 /* UCF_Handler.cpp */; };
+ 019024D70E34DB86000FC1F0 /* WAV_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024C00E34DB86000FC1F0 /* WAV_Handler.cpp */; };
+ 019024D80E34DB86000FC1F0 /* XDCAM_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024C10E34DB86000FC1F0 /* XDCAM_Handler.cpp */; };
+ 019024D90E34DB86000FC1F0 /* XDCAMEX_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024C20E34DB86000FC1F0 /* XDCAMEX_Handler.cpp */; };
+ 019024DA0E34DB86000FC1F0 /* AVCHD_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024AC0E34DB86000FC1F0 /* AVCHD_Handler.cpp */; };
+ 019024DB0E34DB86000FC1F0 /* AVI_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024AD0E34DB86000FC1F0 /* AVI_Handler.cpp */; };
+ 019024DC0E34DB86000FC1F0 /* Basic_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024AE0E34DB86000FC1F0 /* Basic_Handler.cpp */; };
+ 019024DD0E34DB86000FC1F0 /* FLV_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024AF0E34DB86000FC1F0 /* FLV_Handler.cpp */; };
+ 019024DF0E34DB86000FC1F0 /* InDesign_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B10E34DB86000FC1F0 /* InDesign_Handler.cpp */; };
+ 019024E00E34DB86000FC1F0 /* JPEG_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B20E34DB86000FC1F0 /* JPEG_Handler.cpp */; };
+ 019024E10E34DB86000FC1F0 /* MOV_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B30E34DB86000FC1F0 /* MOV_Handler.cpp */; };
+ 019024E20E34DB86000FC1F0 /* MP3_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B40E34DB86000FC1F0 /* MP3_Handler.cpp */; };
+ 019024E30E34DB86000FC1F0 /* MPEG2_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B50E34DB86000FC1F0 /* MPEG2_Handler.cpp */; };
+ 019024E40E34DB86000FC1F0 /* MPEG4_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B60E34DB86000FC1F0 /* MPEG4_Handler.cpp */; };
+ 019024E50E34DB86000FC1F0 /* P2_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B70E34DB86000FC1F0 /* P2_Handler.cpp */; };
+ 019024E60E34DB86000FC1F0 /* PNG_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B80E34DB86000FC1F0 /* PNG_Handler.cpp */; };
+ 019024E70E34DB86000FC1F0 /* PostScript_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024B90E34DB86000FC1F0 /* PostScript_Handler.cpp */; };
+ 019024E80E34DB86000FC1F0 /* PSD_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024BA0E34DB86000FC1F0 /* PSD_Handler.cpp */; };
+ 019024E90E34DB86000FC1F0 /* Scanner_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024BB0E34DB86000FC1F0 /* Scanner_Handler.cpp */; };
+ 019024EA0E34DB86000FC1F0 /* SonyHDV_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024BC0E34DB86000FC1F0 /* SonyHDV_Handler.cpp */; };
+ 019024EB0E34DB86000FC1F0 /* TIFF_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024BD0E34DB86000FC1F0 /* TIFF_Handler.cpp */; };
+ 019024EC0E34DB86000FC1F0 /* Trivial_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024BE0E34DB86000FC1F0 /* Trivial_Handler.cpp */; };
+ 019024ED0E34DB86000FC1F0 /* UCF_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024BF0E34DB86000FC1F0 /* UCF_Handler.cpp */; };
+ 019024EE0E34DB86000FC1F0 /* WAV_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024C00E34DB86000FC1F0 /* WAV_Handler.cpp */; };
+ 019024EF0E34DB86000FC1F0 /* XDCAM_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024C10E34DB86000FC1F0 /* XDCAM_Handler.cpp */; };
+ 019024F00E34DB86000FC1F0 /* XDCAMEX_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019024C20E34DB86000FC1F0 /* XDCAMEX_Handler.cpp */; };
+ 0190251D0E34DC7E000FC1F0 /* ID3_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025080E34DC7E000FC1F0 /* ID3_Support.cpp */; };
+ 0190251E0E34DC7E000FC1F0 /* IPTC_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025090E34DC7E000FC1F0 /* IPTC_Support.cpp */; };
+ 019025200E34DC7E000FC1F0 /* PNG_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0190250B0E34DC7E000FC1F0 /* PNG_Support.cpp */; };
+ 019025210E34DC7E000FC1F0 /* PSIR_FileWriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0190250C0E34DC7E000FC1F0 /* PSIR_FileWriter.cpp */; };
+ 019025220E34DC7E000FC1F0 /* PSIR_MemoryReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0190250D0E34DC7E000FC1F0 /* PSIR_MemoryReader.cpp */; };
+ 019025230E34DC7E000FC1F0 /* QuickTime_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0190250E0E34DC7E000FC1F0 /* QuickTime_Support.cpp */; };
+ 019025240E34DC7E000FC1F0 /* Reconcile_Impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0190250F0E34DC7E000FC1F0 /* Reconcile_Impl.cpp */; };
+ 019025250E34DC7E000FC1F0 /* ReconcileIPTC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025100E34DC7E000FC1F0 /* ReconcileIPTC.cpp */; };
+ 019025260E34DC7E000FC1F0 /* ReconcileLegacy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025110E34DC7E000FC1F0 /* ReconcileLegacy.cpp */; };
+ 019025270E34DC7E000FC1F0 /* ReconcileTIFF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025120E34DC7E000FC1F0 /* ReconcileTIFF.cpp */; };
+ 019025280E34DC7E000FC1F0 /* RIFF_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025130E34DC7E000FC1F0 /* RIFF_Support.cpp */; };
+ 019025290E34DC7E000FC1F0 /* TIFF_FileWriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025150E34DC7E000FC1F0 /* TIFF_FileWriter.cpp */; };
+ 0190252A0E34DC7E000FC1F0 /* TIFF_MemoryReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025160E34DC7E000FC1F0 /* TIFF_MemoryReader.cpp */; };
+ 0190252B0E34DC7E000FC1F0 /* XDCAM_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025170E34DC7E000FC1F0 /* XDCAM_Support.cpp */; };
+ 0190252C0E34DC7E000FC1F0 /* TIFF_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025190E34DC7E000FC1F0 /* TIFF_Support.cpp */; };
+ 0190252D0E34DC7E000FC1F0 /* XMPScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0190251A0E34DC7E000FC1F0 /* XMPScanner.cpp */; };
+ 019025300E34DC7E000FC1F0 /* ID3_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025080E34DC7E000FC1F0 /* ID3_Support.cpp */; };
+ 019025310E34DC7E000FC1F0 /* IPTC_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025090E34DC7E000FC1F0 /* IPTC_Support.cpp */; };
+ 019025330E34DC7E000FC1F0 /* PNG_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0190250B0E34DC7E000FC1F0 /* PNG_Support.cpp */; };
+ 019025340E34DC7E000FC1F0 /* PSIR_FileWriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0190250C0E34DC7E000FC1F0 /* PSIR_FileWriter.cpp */; };
+ 019025350E34DC7E000FC1F0 /* PSIR_MemoryReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0190250D0E34DC7E000FC1F0 /* PSIR_MemoryReader.cpp */; };
+ 019025360E34DC7E000FC1F0 /* QuickTime_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0190250E0E34DC7E000FC1F0 /* QuickTime_Support.cpp */; };
+ 019025370E34DC7E000FC1F0 /* Reconcile_Impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0190250F0E34DC7E000FC1F0 /* Reconcile_Impl.cpp */; };
+ 019025380E34DC7E000FC1F0 /* ReconcileIPTC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025100E34DC7E000FC1F0 /* ReconcileIPTC.cpp */; };
+ 019025390E34DC7E000FC1F0 /* ReconcileLegacy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025110E34DC7E000FC1F0 /* ReconcileLegacy.cpp */; };
+ 0190253A0E34DC7E000FC1F0 /* ReconcileTIFF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025120E34DC7E000FC1F0 /* ReconcileTIFF.cpp */; };
+ 0190253B0E34DC7E000FC1F0 /* RIFF_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025130E34DC7E000FC1F0 /* RIFF_Support.cpp */; };
+ 0190253C0E34DC7E000FC1F0 /* TIFF_FileWriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025150E34DC7E000FC1F0 /* TIFF_FileWriter.cpp */; };
+ 0190253D0E34DC7E000FC1F0 /* TIFF_MemoryReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025160E34DC7E000FC1F0 /* TIFF_MemoryReader.cpp */; };
+ 0190253E0E34DC7E000FC1F0 /* XDCAM_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025170E34DC7E000FC1F0 /* XDCAM_Support.cpp */; };
+ 0190253F0E34DC7E000FC1F0 /* TIFF_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 019025190E34DC7E000FC1F0 /* TIFF_Support.cpp */; };
+ 019025400E34DC7E000FC1F0 /* XMPScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0190251A0E34DC7E000FC1F0 /* XMPScanner.cpp */; };
+ 01C07CA40E39E43E00029382 /* adler32.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977B20E38CC2500E7002F /* adler32.c */; };
+ 01C07CA50E39E43E00029382 /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977B50E38CC9100E7002F /* compress.c */; };
+ 01C07CA60E39E43E00029382 /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977B80E38CCC700E7002F /* crc32.c */; };
+ 01C07CA70E39E43E00029382 /* deflate.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977B90E38CCC700E7002F /* deflate.c */; };
+ 01C07CA80E39E43E00029382 /* gzio.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977BA0E38CCC700E7002F /* gzio.c */; };
+ 01C07CA90E39E43E00029382 /* infback.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977BB0E38CCC700E7002F /* infback.c */; };
+ 01C07CAA0E39E43E00029382 /* inffast.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977BC0E38CCC700E7002F /* inffast.c */; };
+ 01C07CAB0E39E43E00029382 /* inflate.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977BD0E38CCC700E7002F /* inflate.c */; };
+ 01C07CAC0E39E43E00029382 /* inftrees.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977BE0E38CCC700E7002F /* inftrees.c */; };
+ 01C07CAD0E39E43E00029382 /* trees.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977BF0E38CCC700E7002F /* trees.c */; };
+ 01C07CAE0E39E43E00029382 /* uncompr.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977C00E38CCC700E7002F /* uncompr.c */; };
+ 01C07CAF0E39E43E00029382 /* zutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977C10E38CCC700E7002F /* zutil.c */; };
+ 01C07CB10E39E44000029382 /* adler32.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977B20E38CC2500E7002F /* adler32.c */; };
+ 01C07CB20E39E44000029382 /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977B50E38CC9100E7002F /* compress.c */; };
+ 01C07CB30E39E44000029382 /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977B80E38CCC700E7002F /* crc32.c */; };
+ 01C07CB40E39E44000029382 /* deflate.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977B90E38CCC700E7002F /* deflate.c */; };
+ 01C07CB50E39E44000029382 /* gzio.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977BA0E38CCC700E7002F /* gzio.c */; };
+ 01C07CB60E39E44000029382 /* infback.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977BB0E38CCC700E7002F /* infback.c */; };
+ 01C07CB70E39E44000029382 /* inffast.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977BC0E38CCC700E7002F /* inffast.c */; };
+ 01C07CB80E39E44000029382 /* inflate.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977BD0E38CCC700E7002F /* inflate.c */; };
+ 01C07CB90E39E44000029382 /* inftrees.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977BE0E38CCC700E7002F /* inftrees.c */; };
+ 01C07CBA0E39E44000029382 /* trees.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977BF0E38CCC700E7002F /* trees.c */; };
+ 01C07CBB0E39E44000029382 /* uncompr.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977C00E38CCC700E7002F /* uncompr.c */; };
+ 01C07CBC0E39E44000029382 /* zutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977C10E38CCC700E7002F /* zutil.c */; };
+ 01C07CD40E39E70200029382 /* SWF_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C07CD30E39E70200029382 /* SWF_Handler.cpp */; };
+ 01C07CD50E39E70200029382 /* SWF_Handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C07CD30E39E70200029382 /* SWF_Handler.cpp */; };
+ 01FC6D870B7B77D9008559A1 /* WXMPFiles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D840B7B77C1008559A1 /* WXMPFiles.cpp */; };
+ 01FC6D880B7B77D9008559A1 /* XMPFiles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D850B7B77C1008559A1 /* XMPFiles.cpp */; };
+ 01FC6D890B7B77D9008559A1 /* XMPFiles_Impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D860B7B77C1008559A1 /* XMPFiles_Impl.cpp */; };
+ 01FC6D8A0B7B77DA008559A1 /* WXMPFiles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D840B7B77C1008559A1 /* WXMPFiles.cpp */; };
+ 01FC6D8B0B7B77DA008559A1 /* XMPFiles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D850B7B77C1008559A1 /* XMPFiles.cpp */; };
+ 01FC6D8C0B7B77DA008559A1 /* XMPFiles_Impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01FC6D860B7B77C1008559A1 /* XMPFiles_Impl.cpp */; };
+ 2E1977270E38B99800E7002F /* XML_Node.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977260E38B99800E7002F /* XML_Node.cpp */; };
+ 2E1977280E38B99800E7002F /* XML_Node.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977260E38B99800E7002F /* XML_Node.cpp */; };
+ 2E1977290E38B99800E7002F /* XML_Node.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977260E38B99800E7002F /* XML_Node.cpp */; };
+ 2E19772A0E38B99800E7002F /* XML_Node.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977260E38B99800E7002F /* XML_Node.cpp */; };
+ 2E19772D0E38B9DB00E7002F /* LargeFileAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E19772C0E38B9DB00E7002F /* LargeFileAccess.cpp */; };
+ 2E19772E0E38B9DB00E7002F /* LargeFileAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E19772C0E38B9DB00E7002F /* LargeFileAccess.cpp */; };
+ 2E1977300E38B9ED00E7002F /* UnicodeConversions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E19772F0E38B9ED00E7002F /* UnicodeConversions.cpp */; };
+ 2E1977310E38B9ED00E7002F /* UnicodeConversions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E19772F0E38B9ED00E7002F /* UnicodeConversions.cpp */; };
+ 2E1977390E38BB5B00E7002F /* SWF_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977380E38BB5B00E7002F /* SWF_Support.cpp */; };
+ 2E19773A0E38BB5B00E7002F /* SWF_Support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977380E38BB5B00E7002F /* SWF_Support.cpp */; };
+ 2E1977D80E38CD5E00E7002F /* MD5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977D70E38CD5E00E7002F /* MD5.cpp */; };
+ 2E1977D90E38CD5E00E7002F /* MD5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E1977D70E38CD5E00E7002F /* MD5.cpp */; };
+ DC493270089A94CE003ADAAF /* XMPIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E46085F950A003FEB33 /* XMPIterator.cpp */; };
+ DC493271089A94CE003ADAAF /* XMPMeta.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E47085F950A003FEB33 /* XMPMeta.cpp */; };
+ DC493272089A94CE003ADAAF /* XMPMeta-GetSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC87E517089960DB000A7ADF /* XMPMeta-GetSet.cpp */; };
+ DC493273089A94CE003ADAAF /* XMPMeta-Parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC87E518089960DB000A7ADF /* XMPMeta-Parse.cpp */; };
+ DC493274089A94CE003ADAAF /* XMPMeta-Serialize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC87E519089960DB000A7ADF /* XMPMeta-Serialize.cpp */; };
+ DC493275089A94CE003ADAAF /* XMPUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E48085F950A003FEB33 /* XMPUtils.cpp */; };
+ DC49327B089A94E6003ADAAF /* ExpatAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E73085F9791003FEB33 /* ExpatAdapter.cpp */; };
+ DC49327D089A94E6003ADAAF /* ParseRDF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E75085F9791003FEB33 /* ParseRDF.cpp */; };
+ DC49327E089A94E6003ADAAF /* UnicodeConversions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E76085F9791003FEB33 /* UnicodeConversions.cpp */; };
+ DC49327F089A94FF003ADAAF /* xmlparse.c in Sources */ = {isa = PBXBuildFile; fileRef = DC14FDD2089A8591004D5310 /* xmlparse.c */; };
+ DC493280089A94FF003ADAAF /* xmlrole.c in Sources */ = {isa = PBXBuildFile; fileRef = DC14FDD3089A8591004D5310 /* xmlrole.c */; };
+ DC493281089A94FF003ADAAF /* xmltok.c in Sources */ = {isa = PBXBuildFile; fileRef = DC14FDD4089A8591004D5310 /* xmltok.c */; };
+ DC493282089A950C003ADAAF /* WXMPIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E89085F9A39003FEB33 /* WXMPIterator.cpp */; };
+ DC493283089A950C003ADAAF /* WXMPMeta.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E8A085F9A39003FEB33 /* WXMPMeta.cpp */; };
+ DC493284089A950C003ADAAF /* WXMPUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E8B085F9A39003FEB33 /* WXMPUtils.cpp */; };
+ DC493297089A9726003ADAAF /* XMPIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E46085F950A003FEB33 /* XMPIterator.cpp */; };
+ DC493298089A9726003ADAAF /* XMPMeta.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E47085F950A003FEB33 /* XMPMeta.cpp */; };
+ DC493299089A9726003ADAAF /* XMPMeta-GetSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC87E517089960DB000A7ADF /* XMPMeta-GetSet.cpp */; };
+ DC49329A089A9726003ADAAF /* XMPMeta-Parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC87E518089960DB000A7ADF /* XMPMeta-Parse.cpp */; };
+ DC49329B089A9726003ADAAF /* XMPMeta-Serialize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC87E519089960DB000A7ADF /* XMPMeta-Serialize.cpp */; };
+ DC49329C089A9726003ADAAF /* XMPUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E48085F950A003FEB33 /* XMPUtils.cpp */; };
+ DC4932A2089A9726003ADAAF /* ExpatAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E73085F9791003FEB33 /* ExpatAdapter.cpp */; };
+ DC4932A4089A9726003ADAAF /* ParseRDF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E75085F9791003FEB33 /* ParseRDF.cpp */; };
+ DC4932A5089A9726003ADAAF /* UnicodeConversions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E76085F9791003FEB33 /* UnicodeConversions.cpp */; };
+ DC4932A6089A9726003ADAAF /* xmlparse.c in Sources */ = {isa = PBXBuildFile; fileRef = DC14FDD2089A8591004D5310 /* xmlparse.c */; };
+ DC4932A7089A9726003ADAAF /* xmlrole.c in Sources */ = {isa = PBXBuildFile; fileRef = DC14FDD3089A8591004D5310 /* xmlrole.c */; };
+ DC4932A8089A9726003ADAAF /* xmltok.c in Sources */ = {isa = PBXBuildFile; fileRef = DC14FDD4089A8591004D5310 /* xmltok.c */; };
+ DC4932A9089A9726003ADAAF /* WXMPIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E89085F9A39003FEB33 /* WXMPIterator.cpp */; };
+ DC4932AA089A9726003ADAAF /* WXMPMeta.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E8A085F9A39003FEB33 /* WXMPMeta.cpp */; };
+ DC4932AB089A9726003ADAAF /* WXMPUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07601E8B085F9A39003FEB33 /* WXMPUtils.cpp */; };
+ DCEDFE2509ACBECF00D86460 /* XMPUtils-FileInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DCEDFE2409ACBECF00D86460 /* XMPUtils-FileInfo.cpp */; };
+ DCEDFE2609ACBECF00D86460 /* XMPUtils-FileInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DCEDFE2409ACBECF00D86460 /* XMPUtils-FileInfo.cpp */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 01FC6D8F0B7B7858008559A1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 01FC6CF20B7B7514008559A1;
+ remoteInfo = "XMPFiles Release";
+ };
+ 01FC6D910B7B7858008559A1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 01FC6CD40B7B6D65008559A1;
+ remoteInfo = "XMPFiles Debug";
+ };
+ DCF912BD09A3E6A40055523F /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = DC49326B089A9441003ADAAF;
+ remoteInfo = "XMPCore Debug";
+ };
+ DCF912BF09A3E6A70055523F /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = DC493293089A9726003ADAAF;
+ remoteInfo = "XMPCore Release";
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 011127FE0E5C549400114B41 /* ASF_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ASF_Handler.cpp; sourceTree = "<group>"; };
+ 011128030E5C54A000114B41 /* ASF_Support.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ASF_Support.cpp; sourceTree = "<group>"; };
+ 014796510B776899007CF8F4 /* XMPCore_Impl.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XMPCore_Impl.cpp; sourceTree = "<group>"; };
+ 014A2AA10B78FF1400A80B2A /* MD5.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MD5.cpp; path = "../../third-party/MD5/MD5.cpp"; sourceTree = "<group>"; };
+ 019024AC0E34DB86000FC1F0 /* AVCHD_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AVCHD_Handler.cpp; sourceTree = "<group>"; };
+ 019024AD0E34DB86000FC1F0 /* AVI_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AVI_Handler.cpp; sourceTree = "<group>"; };
+ 019024AE0E34DB86000FC1F0 /* Basic_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Basic_Handler.cpp; sourceTree = "<group>"; };
+ 019024AF0E34DB86000FC1F0 /* FLV_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FLV_Handler.cpp; sourceTree = "<group>"; };
+ 019024B10E34DB86000FC1F0 /* InDesign_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InDesign_Handler.cpp; sourceTree = "<group>"; };
+ 019024B20E34DB86000FC1F0 /* JPEG_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JPEG_Handler.cpp; sourceTree = "<group>"; };
+ 019024B30E34DB86000FC1F0 /* MOV_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MOV_Handler.cpp; sourceTree = "<group>"; };
+ 019024B40E34DB86000FC1F0 /* MP3_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MP3_Handler.cpp; sourceTree = "<group>"; };
+ 019024B50E34DB86000FC1F0 /* MPEG2_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MPEG2_Handler.cpp; sourceTree = "<group>"; };
+ 019024B60E34DB86000FC1F0 /* MPEG4_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MPEG4_Handler.cpp; sourceTree = "<group>"; };
+ 019024B70E34DB86000FC1F0 /* P2_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = P2_Handler.cpp; sourceTree = "<group>"; };
+ 019024B80E34DB86000FC1F0 /* PNG_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PNG_Handler.cpp; sourceTree = "<group>"; };
+ 019024B90E34DB86000FC1F0 /* PostScript_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PostScript_Handler.cpp; sourceTree = "<group>"; };
+ 019024BA0E34DB86000FC1F0 /* PSD_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PSD_Handler.cpp; sourceTree = "<group>"; };
+ 019024BB0E34DB86000FC1F0 /* Scanner_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Scanner_Handler.cpp; sourceTree = "<group>"; };
+ 019024BC0E34DB86000FC1F0 /* SonyHDV_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SonyHDV_Handler.cpp; sourceTree = "<group>"; };
+ 019024BD0E34DB86000FC1F0 /* TIFF_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TIFF_Handler.cpp; sourceTree = "<group>"; };
+ 019024BE0E34DB86000FC1F0 /* Trivial_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Trivial_Handler.cpp; sourceTree = "<group>"; };
+ 019024BF0E34DB86000FC1F0 /* UCF_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UCF_Handler.cpp; sourceTree = "<group>"; };
+ 019024C00E34DB86000FC1F0 /* WAV_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WAV_Handler.cpp; sourceTree = "<group>"; };
+ 019024C10E34DB86000FC1F0 /* XDCAM_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XDCAM_Handler.cpp; sourceTree = "<group>"; };
+ 019024C20E34DB86000FC1F0 /* XDCAMEX_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XDCAMEX_Handler.cpp; sourceTree = "<group>"; };
+ 019025080E34DC7E000FC1F0 /* ID3_Support.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ID3_Support.cpp; sourceTree = "<group>"; };
+ 019025090E34DC7E000FC1F0 /* IPTC_Support.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IPTC_Support.cpp; sourceTree = "<group>"; };
+ 0190250B0E34DC7E000FC1F0 /* PNG_Support.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PNG_Support.cpp; sourceTree = "<group>"; };
+ 0190250C0E34DC7E000FC1F0 /* PSIR_FileWriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PSIR_FileWriter.cpp; sourceTree = "<group>"; };
+ 0190250D0E34DC7E000FC1F0 /* PSIR_MemoryReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PSIR_MemoryReader.cpp; sourceTree = "<group>"; };
+ 0190250E0E34DC7E000FC1F0 /* QuickTime_Support.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QuickTime_Support.cpp; sourceTree = "<group>"; };
+ 0190250F0E34DC7E000FC1F0 /* Reconcile_Impl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Reconcile_Impl.cpp; sourceTree = "<group>"; };
+ 019025100E34DC7E000FC1F0 /* ReconcileIPTC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReconcileIPTC.cpp; sourceTree = "<group>"; };
+ 019025110E34DC7E000FC1F0 /* ReconcileLegacy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReconcileLegacy.cpp; sourceTree = "<group>"; };
+ 019025120E34DC7E000FC1F0 /* ReconcileTIFF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReconcileTIFF.cpp; sourceTree = "<group>"; };
+ 019025130E34DC7E000FC1F0 /* RIFF_Support.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RIFF_Support.cpp; sourceTree = "<group>"; };
+ 019025150E34DC7E000FC1F0 /* TIFF_FileWriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TIFF_FileWriter.cpp; sourceTree = "<group>"; };
+ 019025160E34DC7E000FC1F0 /* TIFF_MemoryReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TIFF_MemoryReader.cpp; sourceTree = "<group>"; };
+ 019025170E34DC7E000FC1F0 /* XDCAM_Support.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XDCAM_Support.cpp; sourceTree = "<group>"; };
+ 019025190E34DC7E000FC1F0 /* TIFF_Support.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TIFF_Support.cpp; sourceTree = "<group>"; };
+ 0190251A0E34DC7E000FC1F0 /* XMPScanner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XMPScanner.cpp; sourceTree = "<group>"; };
+ 01C07CD30E39E70200029382 /* SWF_Handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SWF_Handler.cpp; sourceTree = "<group>"; };
+ 01FC6CEC0B7B6D65008559A1 /* libXMPFilesStaticDebug.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libXMPFilesStaticDebug.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ 01FC6D0A0B7B7514008559A1 /* libXMPFilesStaticRelease.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libXMPFilesStaticRelease.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ 01FC6D840B7B77C1008559A1 /* WXMPFiles.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = WXMPFiles.cpp; path = ../../source/XMPFiles/WXMPFiles.cpp; sourceTree = "<group>"; };
+ 01FC6D850B7B77C1008559A1 /* XMPFiles.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = XMPFiles.cpp; path = ../../source/XMPFiles/XMPFiles.cpp; sourceTree = "<group>"; };
+ 01FC6D860B7B77C1008559A1 /* XMPFiles_Impl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = XMPFiles_Impl.cpp; path = ../../source/XMPFiles/XMPFiles_Impl.cpp; sourceTree = "<group>"; };
+ 07601E46085F950A003FEB33 /* XMPIterator.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XMPIterator.cpp; sourceTree = "<group>"; };
+ 07601E47085F950A003FEB33 /* XMPMeta.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XMPMeta.cpp; sourceTree = "<group>"; };
+ 07601E48085F950A003FEB33 /* XMPUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XMPUtils.cpp; sourceTree = "<group>"; };
+ 07601E73085F9791003FEB33 /* ExpatAdapter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ExpatAdapter.cpp; sourceTree = "<group>"; };
+ 07601E75085F9791003FEB33 /* ParseRDF.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ParseRDF.cpp; sourceTree = "<group>"; };
+ 07601E76085F9791003FEB33 /* UnicodeConversions.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = UnicodeConversions.cpp; path = ../common/UnicodeConversions.cpp; sourceTree = "<group>"; };
+ 07601E89085F9A39003FEB33 /* WXMPIterator.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = WXMPIterator.cpp; sourceTree = "<group>"; };
+ 07601E8A085F9A39003FEB33 /* WXMPMeta.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = WXMPMeta.cpp; sourceTree = "<group>"; };
+ 07601E8B085F9A39003FEB33 /* WXMPUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = WXMPUtils.cpp; sourceTree = "<group>"; };
+ 2E19771D0E38B74F00E7002F /* XML_Node.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; name = XML_Node.cpp; path = ../common/XML_Node.cpp; sourceTree = "<group>"; };
+ 2E19771E0E38B8A400E7002F /* expat_config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = expat_config.h; path = ../../../build/xcode2/expat_config.h; sourceTree = "<group>"; };
+ 2E1977260E38B99800E7002F /* XML_Node.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XML_Node.cpp; sourceTree = "<group>"; };
+ 2E19772C0E38B9DB00E7002F /* LargeFileAccess.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LargeFileAccess.cpp; sourceTree = "<group>"; };
+ 2E19772F0E38B9ED00E7002F /* UnicodeConversions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UnicodeConversions.cpp; sourceTree = "<group>"; };
+ 2E1977380E38BB5B00E7002F /* SWF_Support.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SWF_Support.cpp; sourceTree = "<group>"; };
+ 2E1977B20E38CC2500E7002F /* adler32.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = adler32.c; path = "../../third-party/zlib/adler32.c"; sourceTree = "<group>"; };
+ 2E1977B50E38CC9100E7002F /* compress.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = compress.c; sourceTree = "<group>"; };
+ 2E1977B80E38CCC700E7002F /* crc32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = crc32.c; sourceTree = "<group>"; };
+ 2E1977B90E38CCC700E7002F /* deflate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = deflate.c; sourceTree = "<group>"; };
+ 2E1977BA0E38CCC700E7002F /* gzio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = gzio.c; sourceTree = "<group>"; };
+ 2E1977BB0E38CCC700E7002F /* infback.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = infback.c; sourceTree = "<group>"; };
+ 2E1977BC0E38CCC700E7002F /* inffast.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = inffast.c; sourceTree = "<group>"; };
+ 2E1977BD0E38CCC700E7002F /* inflate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = inflate.c; sourceTree = "<group>"; };
+ 2E1977BE0E38CCC700E7002F /* inftrees.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = inftrees.c; sourceTree = "<group>"; };
+ 2E1977BF0E38CCC700E7002F /* trees.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = trees.c; sourceTree = "<group>"; };
+ 2E1977C00E38CCC700E7002F /* uncompr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = uncompr.c; sourceTree = "<group>"; };
+ 2E1977C10E38CCC700E7002F /* zutil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zutil.c; sourceTree = "<group>"; };
+ 2E1977D70E38CD5E00E7002F /* MD5.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MD5.cpp; path = MD5/MD5.cpp; sourceTree = "<group>"; };
+ DC14FDD2089A8591004D5310 /* xmlparse.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = xmlparse.c; sourceTree = "<group>"; };
+ DC14FDD3089A8591004D5310 /* xmlrole.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = xmlrole.c; sourceTree = "<group>"; };
+ DC14FDD4089A8591004D5310 /* xmltok.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = xmltok.c; sourceTree = "<group>"; };
+ DC49326C089A9441003ADAAF /* libXMPCoreStaticDebug.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libXMPCoreStaticDebug.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ DC4932B0089A9726003ADAAF /* libXMPCoreStaticRelease.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libXMPCoreStaticRelease.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ DC87E517089960DB000A7ADF /* XMPMeta-GetSet.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = "XMPMeta-GetSet.cpp"; sourceTree = "<group>"; };
+ DC87E518089960DB000A7ADF /* XMPMeta-Parse.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = "XMPMeta-Parse.cpp"; sourceTree = "<group>"; };
+ DC87E519089960DB000A7ADF /* XMPMeta-Serialize.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = "XMPMeta-Serialize.cpp"; sourceTree = "<group>"; };
+ DCE400F70951DAA90040D71F /* XMPToolkitSDK-Common.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; path = "XMPToolkitSDK-Common.xcconfig"; sourceTree = "<group>"; };
+ DCE400F80951DAA90040D71F /* XMPToolkitSDK-Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; path = "XMPToolkitSDK-Debug.xcconfig"; sourceTree = "<group>"; };
+ DCE400F90951DAA90040D71F /* XMPToolkitSDK-Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; path = "XMPToolkitSDK-Release.xcconfig"; sourceTree = "<group>"; };
+ DCEDFE2409ACBECF00D86460 /* XMPUtils-FileInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = "XMPUtils-FileInfo.cpp"; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 01FC6CE90B7B6D65008559A1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01FC6D070B7B7514008559A1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ DC49326A089A9441003ADAAF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ DC4932AC089A9726003ADAAF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 014A2AB10B79001E00A80B2A /* XMPFiles */ = {
+ isa = PBXGroup;
+ children = (
+ 2E1977190E38B61B00E7002F /* common */,
+ 01FC6CED0B7B7458008559A1 /* FileHandlers */,
+ 01FC6CEE0B7B7462008559A1 /* FormatSupport */,
+ 2E19773B0E38BB7E00E7002F /* third-party */,
+ );
+ name = XMPFiles;
+ sourceTree = "<group>";
+ };
+ 01C07CBE0E39E4B100029382 /* MD5 */ = {
+ isa = PBXGroup;
+ children = (
+ 014A2AA10B78FF1400A80B2A /* MD5.cpp */,
+ );
+ name = MD5;
+ sourceTree = "<group>";
+ };
+ 01FC6CED0B7B7458008559A1 /* FileHandlers */ = {
+ isa = PBXGroup;
+ children = (
+ 011127FE0E5C549400114B41 /* ASF_Handler.cpp */,
+ 01C07CD30E39E70200029382 /* SWF_Handler.cpp */,
+ 019024AC0E34DB86000FC1F0 /* AVCHD_Handler.cpp */,
+ 019024AD0E34DB86000FC1F0 /* AVI_Handler.cpp */,
+ 019024AE0E34DB86000FC1F0 /* Basic_Handler.cpp */,
+ 019024AF0E34DB86000FC1F0 /* FLV_Handler.cpp */,
+ 019024B10E34DB86000FC1F0 /* InDesign_Handler.cpp */,
+ 019024B20E34DB86000FC1F0 /* JPEG_Handler.cpp */,
+ 019024B30E34DB86000FC1F0 /* MOV_Handler.cpp */,
+ 019024B40E34DB86000FC1F0 /* MP3_Handler.cpp */,
+ 019024B50E34DB86000FC1F0 /* MPEG2_Handler.cpp */,
+ 019024B60E34DB86000FC1F0 /* MPEG4_Handler.cpp */,
+ 019024B70E34DB86000FC1F0 /* P2_Handler.cpp */,
+ 019024B80E34DB86000FC1F0 /* PNG_Handler.cpp */,
+ 019024B90E34DB86000FC1F0 /* PostScript_Handler.cpp */,
+ 019024BA0E34DB86000FC1F0 /* PSD_Handler.cpp */,
+ 019024BB0E34DB86000FC1F0 /* Scanner_Handler.cpp */,
+ 019024BC0E34DB86000FC1F0 /* SonyHDV_Handler.cpp */,
+ 019024BD0E34DB86000FC1F0 /* TIFF_Handler.cpp */,
+ 019024BE0E34DB86000FC1F0 /* Trivial_Handler.cpp */,
+ 019024BF0E34DB86000FC1F0 /* UCF_Handler.cpp */,
+ 019024C00E34DB86000FC1F0 /* WAV_Handler.cpp */,
+ 019024C10E34DB86000FC1F0 /* XDCAM_Handler.cpp */,
+ 019024C20E34DB86000FC1F0 /* XDCAMEX_Handler.cpp */,
+ );
+ name = FileHandlers;
+ path = ../../source/XMPFiles/FileHandlers;
+ sourceTree = "<group>";
+ };
+ 01FC6CEE0B7B7462008559A1 /* FormatSupport */ = {
+ isa = PBXGroup;
+ children = (
+ 011128030E5C54A000114B41 /* ASF_Support.cpp */,
+ 019025080E34DC7E000FC1F0 /* ID3_Support.cpp */,
+ 019025090E34DC7E000FC1F0 /* IPTC_Support.cpp */,
+ 0190250B0E34DC7E000FC1F0 /* PNG_Support.cpp */,
+ 0190250C0E34DC7E000FC1F0 /* PSIR_FileWriter.cpp */,
+ 0190250D0E34DC7E000FC1F0 /* PSIR_MemoryReader.cpp */,
+ 0190250E0E34DC7E000FC1F0 /* QuickTime_Support.cpp */,
+ 0190250F0E34DC7E000FC1F0 /* Reconcile_Impl.cpp */,
+ 019025100E34DC7E000FC1F0 /* ReconcileIPTC.cpp */,
+ 019025110E34DC7E000FC1F0 /* ReconcileLegacy.cpp */,
+ 019025120E34DC7E000FC1F0 /* ReconcileTIFF.cpp */,
+ 019025130E34DC7E000FC1F0 /* RIFF_Support.cpp */,
+ 2E1977380E38BB5B00E7002F /* SWF_Support.cpp */,
+ 019025150E34DC7E000FC1F0 /* TIFF_FileWriter.cpp */,
+ 019025160E34DC7E000FC1F0 /* TIFF_MemoryReader.cpp */,
+ 019025190E34DC7E000FC1F0 /* TIFF_Support.cpp */,
+ 019025170E34DC7E000FC1F0 /* XDCAM_Support.cpp */,
+ 0190251A0E34DC7E000FC1F0 /* XMPScanner.cpp */,
+ );
+ name = FormatSupport;
+ path = ../../source/XMPFiles/FormatSupport;
+ sourceTree = "<group>";
+ };
+ 07601E35085F945B003FEB33 /* Build Files */ = {
+ isa = PBXGroup;
+ children = (
+ DCE400F70951DAA90040D71F /* XMPToolkitSDK-Common.xcconfig */,
+ DCE400F80951DAA90040D71F /* XMPToolkitSDK-Debug.xcconfig */,
+ DCE400F90951DAA90040D71F /* XMPToolkitSDK-Release.xcconfig */,
+ );
+ name = "Build Files";
+ sourceTree = "<group>";
+ };
+ 07601E3C085F9484003FEB33 /* ABI Wrappers */ = {
+ isa = PBXGroup;
+ children = (
+ 07601E89085F9A39003FEB33 /* WXMPIterator.cpp */,
+ 07601E8A085F9A39003FEB33 /* WXMPMeta.cpp */,
+ 07601E8B085F9A39003FEB33 /* WXMPUtils.cpp */,
+ );
+ name = "ABI Wrappers";
+ sourceTree = "<group>";
+ };
+ 07601E40085F949B003FEB33 /* Utilities */ = {
+ isa = PBXGroup;
+ children = (
+ 07601E73085F9791003FEB33 /* ExpatAdapter.cpp */,
+ 07601E75085F9791003FEB33 /* ParseRDF.cpp */,
+ 07601E76085F9791003FEB33 /* UnicodeConversions.cpp */,
+ 2E19771D0E38B74F00E7002F /* XML_Node.cpp */,
+ );
+ name = Utilities;
+ sourceTree = "<group>";
+ };
+ 07601E42085F94A2003FEB33 /* XMPCore */ = {
+ isa = PBXGroup;
+ children = (
+ 07601E3C085F9484003FEB33 /* ABI Wrappers */,
+ 2E19771A0E38B64D00E7002F /* Third Party */,
+ 2E19771B0E38B66300E7002F /* Toolkit Core */,
+ 07601E40085F949B003FEB33 /* Utilities */,
+ );
+ name = XMPCore;
+ path = ../../source/XMPCore;
+ sourceTree = "<group>";
+ };
+ 0867D691FE84028FC02AAC07 /* AdobeXMP */ = {
+ isa = PBXGroup;
+ children = (
+ 07601E42085F94A2003FEB33 /* XMPCore */,
+ 014A2AB10B79001E00A80B2A /* XMPFiles */,
+ 07601E35085F945B003FEB33 /* Build Files */,
+ DC3CC41908A4342900F44C7B /* Products */,
+ );
+ name = AdobeXMP;
+ sourceTree = "<group>";
+ };
+ 2E1977190E38B61B00E7002F /* common */ = {
+ isa = PBXGroup;
+ children = (
+ 2E19772C0E38B9DB00E7002F /* LargeFileAccess.cpp */,
+ 2E19772F0E38B9ED00E7002F /* UnicodeConversions.cpp */,
+ 01FC6D840B7B77C1008559A1 /* WXMPFiles.cpp */,
+ 2E1977260E38B99800E7002F /* XML_Node.cpp */,
+ 01FC6D850B7B77C1008559A1 /* XMPFiles.cpp */,
+ 01FC6D860B7B77C1008559A1 /* XMPFiles_Impl.cpp */,
+ );
+ name = common;
+ path = ../../source/common;
+ sourceTree = "<group>";
+ };
+ 2E19771A0E38B64D00E7002F /* Third Party */ = {
+ isa = PBXGroup;
+ children = (
+ 01C07CBE0E39E4B100029382 /* MD5 */,
+ DC14FDC2089A84F0004D5310 /* Expat */,
+ );
+ name = "Third Party";
+ sourceTree = "<group>";
+ };
+ 2E19771B0E38B66300E7002F /* Toolkit Core */ = {
+ isa = PBXGroup;
+ children = (
+ 014796510B776899007CF8F4 /* XMPCore_Impl.cpp */,
+ 07601E46085F950A003FEB33 /* XMPIterator.cpp */,
+ DC87E517089960DB000A7ADF /* XMPMeta-GetSet.cpp */,
+ DC87E518089960DB000A7ADF /* XMPMeta-Parse.cpp */,
+ DC87E519089960DB000A7ADF /* XMPMeta-Serialize.cpp */,
+ 07601E47085F950A003FEB33 /* XMPMeta.cpp */,
+ DCEDFE2409ACBECF00D86460 /* XMPUtils-FileInfo.cpp */,
+ 07601E48085F950A003FEB33 /* XMPUtils.cpp */,
+ );
+ name = "Toolkit Core";
+ sourceTree = "<group>";
+ };
+ 2E19773B0E38BB7E00E7002F /* third-party */ = {
+ isa = PBXGroup;
+ children = (
+ 2E1977D60E38CD3F00E7002F /* MD5 */,
+ 2E1977B00E38CBB700E7002F /* zlib */,
+ );
+ name = "third-party";
+ path = "../../third-party";
+ sourceTree = "<group>";
+ };
+ 2E1977B00E38CBB700E7002F /* zlib */ = {
+ isa = PBXGroup;
+ children = (
+ 2E1977B20E38CC2500E7002F /* adler32.c */,
+ 2E1977B50E38CC9100E7002F /* compress.c */,
+ 2E1977B80E38CCC700E7002F /* crc32.c */,
+ 2E1977B90E38CCC700E7002F /* deflate.c */,
+ 2E1977BA0E38CCC700E7002F /* gzio.c */,
+ 2E1977BB0E38CCC700E7002F /* infback.c */,
+ 2E1977BC0E38CCC700E7002F /* inffast.c */,
+ 2E1977BD0E38CCC700E7002F /* inflate.c */,
+ 2E1977BE0E38CCC700E7002F /* inftrees.c */,
+ 2E1977BF0E38CCC700E7002F /* trees.c */,
+ 2E1977C00E38CCC700E7002F /* uncompr.c */,
+ 2E1977C10E38CCC700E7002F /* zutil.c */,
+ );
+ path = zlib;
+ sourceTree = "<group>";
+ };
+ 2E1977D60E38CD3F00E7002F /* MD5 */ = {
+ isa = PBXGroup;
+ children = (
+ 2E1977D70E38CD5E00E7002F /* MD5.cpp */,
+ );
+ name = MD5;
+ sourceTree = "<group>";
+ };
+ DC14FDC2089A84F0004D5310 /* Expat */ = {
+ isa = PBXGroup;
+ children = (
+ 2E19771E0E38B8A400E7002F /* expat_config.h */,
+ DC14FDD2089A8591004D5310 /* xmlparse.c */,
+ DC14FDD3089A8591004D5310 /* xmlrole.c */,
+ DC14FDD4089A8591004D5310 /* xmltok.c */,
+ );
+ name = Expat;
+ path = "../../third-party/expat/lib";
+ sourceTree = "<group>";
+ };
+ DC3CC41908A4342900F44C7B /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ DC49326C089A9441003ADAAF /* libXMPCoreStaticDebug.a */,
+ DC4932B0089A9726003ADAAF /* libXMPCoreStaticRelease.a */,
+ 01FC6CEC0B7B6D65008559A1 /* libXMPFilesStaticDebug.a */,
+ 01FC6D0A0B7B7514008559A1 /* libXMPFilesStaticRelease.a */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 01FC6CD40B7B6D65008559A1 /* XMPFiles Debug */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 01FC6CEA0B7B6D65008559A1 /* Build configuration list for PBXNativeTarget "XMPFiles Debug" */;
+ buildPhases = (
+ 01FC6CD50B7B6D65008559A1 /* Sources */,
+ 01FC6CE90B7B6D65008559A1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "XMPFiles Debug";
+ productName = "Debug-static";
+ productReference = 01FC6CEC0B7B6D65008559A1 /* libXMPFilesStaticDebug.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+ 01FC6CF20B7B7514008559A1 /* XMPFiles Release */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 01FC6D080B7B7514008559A1 /* Build configuration list for PBXNativeTarget "XMPFiles Release" */;
+ buildPhases = (
+ 01FC6CF30B7B7514008559A1 /* Sources */,
+ 01FC6D070B7B7514008559A1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "XMPFiles Release";
+ productName = "Debug-static";
+ productReference = 01FC6D0A0B7B7514008559A1 /* libXMPFilesStaticRelease.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+ DC49326B089A9441003ADAAF /* XMPCore Debug */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DC49326D089A9460003ADAAF /* Build configuration list for PBXNativeTarget "XMPCore Debug" */;
+ buildPhases = (
+ DC493269089A9441003ADAAF /* Sources */,
+ DC49326A089A9441003ADAAF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "XMPCore Debug";
+ productName = "Debug-static";
+ productReference = DC49326C089A9441003ADAAF /* libXMPCoreStaticDebug.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+ DC493293089A9726003ADAAF /* XMPCore Release */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DC4932AD089A9726003ADAAF /* Build configuration list for PBXNativeTarget "XMPCore Release" */;
+ buildPhases = (
+ DC493295089A9726003ADAAF /* Sources */,
+ DC4932AC089A9726003ADAAF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "XMPCore Release";
+ productName = "Debug-static";
+ productReference = DC4932B0089A9726003ADAAF /* libXMPCoreStaticRelease.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 0867D690FE84028FC02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = 07601E2C085F9443003FEB33 /* Build configuration list for PBXProject "XMPToolkitSDK" */;
+ compatibilityVersion = "Xcode 2.4";
+ hasScannedForEncodings = 1;
+ mainGroup = 0867D691FE84028FC02AAC07 /* AdobeXMP */;
+ productRefGroup = 0867D691FE84028FC02AAC07 /* AdobeXMP */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ DCF912BC09A3E6970055523F /* Build All */,
+ DC49326B089A9441003ADAAF /* XMPCore Debug */,
+ DC493293089A9726003ADAAF /* XMPCore Release */,
+ 01FC6CD40B7B6D65008559A1 /* XMPFiles Debug */,
+ 01FC6CF20B7B7514008559A1 /* XMPFiles Release */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 01FC6CD50B7B6D65008559A1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 01FC6D870B7B77D9008559A1 /* WXMPFiles.cpp in Sources */,
+ 01FC6D880B7B77D9008559A1 /* XMPFiles.cpp in Sources */,
+ 01FC6D890B7B77D9008559A1 /* XMPFiles_Impl.cpp in Sources */,
+ 0102D1C70B7B8471001AF6F7 /* MD5.cpp in Sources */,
+ 019024DA0E34DB86000FC1F0 /* AVCHD_Handler.cpp in Sources */,
+ 019024DB0E34DB86000FC1F0 /* AVI_Handler.cpp in Sources */,
+ 019024DC0E34DB86000FC1F0 /* Basic_Handler.cpp in Sources */,
+ 019024DD0E34DB86000FC1F0 /* FLV_Handler.cpp in Sources */,
+ 019024DF0E34DB86000FC1F0 /* InDesign_Handler.cpp in Sources */,
+ 019024E00E34DB86000FC1F0 /* JPEG_Handler.cpp in Sources */,
+ 019024E10E34DB86000FC1F0 /* MOV_Handler.cpp in Sources */,
+ 019024E20E34DB86000FC1F0 /* MP3_Handler.cpp in Sources */,
+ 019024E30E34DB86000FC1F0 /* MPEG2_Handler.cpp in Sources */,
+ 019024E40E34DB86000FC1F0 /* MPEG4_Handler.cpp in Sources */,
+ 019024E50E34DB86000FC1F0 /* P2_Handler.cpp in Sources */,
+ 019024E60E34DB86000FC1F0 /* PNG_Handler.cpp in Sources */,
+ 019024E70E34DB86000FC1F0 /* PostScript_Handler.cpp in Sources */,
+ 019024E80E34DB86000FC1F0 /* PSD_Handler.cpp in Sources */,
+ 019024E90E34DB86000FC1F0 /* Scanner_Handler.cpp in Sources */,
+ 019024EA0E34DB86000FC1F0 /* SonyHDV_Handler.cpp in Sources */,
+ 019024EB0E34DB86000FC1F0 /* TIFF_Handler.cpp in Sources */,
+ 019024EC0E34DB86000FC1F0 /* Trivial_Handler.cpp in Sources */,
+ 019024ED0E34DB86000FC1F0 /* UCF_Handler.cpp in Sources */,
+ 019024EE0E34DB86000FC1F0 /* WAV_Handler.cpp in Sources */,
+ 019024EF0E34DB86000FC1F0 /* XDCAM_Handler.cpp in Sources */,
+ 019024F00E34DB86000FC1F0 /* XDCAMEX_Handler.cpp in Sources */,
+ 019025300E34DC7E000FC1F0 /* ID3_Support.cpp in Sources */,
+ 019025310E34DC7E000FC1F0 /* IPTC_Support.cpp in Sources */,
+ 019025330E34DC7E000FC1F0 /* PNG_Support.cpp in Sources */,
+ 019025340E34DC7E000FC1F0 /* PSIR_FileWriter.cpp in Sources */,
+ 019025350E34DC7E000FC1F0 /* PSIR_MemoryReader.cpp in Sources */,
+ 019025360E34DC7E000FC1F0 /* QuickTime_Support.cpp in Sources */,
+ 019025370E34DC7E000FC1F0 /* Reconcile_Impl.cpp in Sources */,
+ 019025380E34DC7E000FC1F0 /* ReconcileIPTC.cpp in Sources */,
+ 019025390E34DC7E000FC1F0 /* ReconcileLegacy.cpp in Sources */,
+ 0190253A0E34DC7E000FC1F0 /* ReconcileTIFF.cpp in Sources */,
+ 0190253B0E34DC7E000FC1F0 /* RIFF_Support.cpp in Sources */,
+ 0190253C0E34DC7E000FC1F0 /* TIFF_FileWriter.cpp in Sources */,
+ 0190253D0E34DC7E000FC1F0 /* TIFF_MemoryReader.cpp in Sources */,
+ 0190253E0E34DC7E000FC1F0 /* XDCAM_Support.cpp in Sources */,
+ 0190253F0E34DC7E000FC1F0 /* TIFF_Support.cpp in Sources */,
+ 019025400E34DC7E000FC1F0 /* XMPScanner.cpp in Sources */,
+ 2E1977290E38B99800E7002F /* XML_Node.cpp in Sources */,
+ 2E19772D0E38B9DB00E7002F /* LargeFileAccess.cpp in Sources */,
+ 2E1977300E38B9ED00E7002F /* UnicodeConversions.cpp in Sources */,
+ 2E1977390E38BB5B00E7002F /* SWF_Support.cpp in Sources */,
+ 2E1977D80E38CD5E00E7002F /* MD5.cpp in Sources */,
+ 01C07CA40E39E43E00029382 /* adler32.c in Sources */,
+ 01C07CA50E39E43E00029382 /* compress.c in Sources */,
+ 01C07CA60E39E43E00029382 /* crc32.c in Sources */,
+ 01C07CA70E39E43E00029382 /* deflate.c in Sources */,
+ 01C07CA80E39E43E00029382 /* gzio.c in Sources */,
+ 01C07CA90E39E43E00029382 /* infback.c in Sources */,
+ 01C07CAA0E39E43E00029382 /* inffast.c in Sources */,
+ 01C07CAB0E39E43E00029382 /* inflate.c in Sources */,
+ 01C07CAC0E39E43E00029382 /* inftrees.c in Sources */,
+ 01C07CAD0E39E43E00029382 /* trees.c in Sources */,
+ 01C07CAE0E39E43E00029382 /* uncompr.c in Sources */,
+ 01C07CAF0E39E43E00029382 /* zutil.c in Sources */,
+ 01C07CD40E39E70200029382 /* SWF_Handler.cpp in Sources */,
+ 011128000E5C549500114B41 /* ASF_Handler.cpp in Sources */,
+ 011128050E5C54A000114B41 /* ASF_Support.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01FC6CF30B7B7514008559A1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 01FC6D8A0B7B77DA008559A1 /* WXMPFiles.cpp in Sources */,
+ 01FC6D8B0B7B77DA008559A1 /* XMPFiles.cpp in Sources */,
+ 01FC6D8C0B7B77DA008559A1 /* XMPFiles_Impl.cpp in Sources */,
+ 0102D1C80B7B8472001AF6F7 /* MD5.cpp in Sources */,
+ 019024C30E34DB86000FC1F0 /* AVCHD_Handler.cpp in Sources */,
+ 019024C40E34DB86000FC1F0 /* AVI_Handler.cpp in Sources */,
+ 019024C50E34DB86000FC1F0 /* Basic_Handler.cpp in Sources */,
+ 019024C60E34DB86000FC1F0 /* FLV_Handler.cpp in Sources */,
+ 019024C80E34DB86000FC1F0 /* InDesign_Handler.cpp in Sources */,
+ 019024C90E34DB86000FC1F0 /* JPEG_Handler.cpp in Sources */,
+ 019024CA0E34DB86000FC1F0 /* MOV_Handler.cpp in Sources */,
+ 019024CB0E34DB86000FC1F0 /* MP3_Handler.cpp in Sources */,
+ 019024CC0E34DB86000FC1F0 /* MPEG2_Handler.cpp in Sources */,
+ 019024CD0E34DB86000FC1F0 /* MPEG4_Handler.cpp in Sources */,
+ 019024CE0E34DB86000FC1F0 /* P2_Handler.cpp in Sources */,
+ 019024CF0E34DB86000FC1F0 /* PNG_Handler.cpp in Sources */,
+ 019024D00E34DB86000FC1F0 /* PostScript_Handler.cpp in Sources */,
+ 019024D10E34DB86000FC1F0 /* PSD_Handler.cpp in Sources */,
+ 019024D20E34DB86000FC1F0 /* Scanner_Handler.cpp in Sources */,
+ 019024D30E34DB86000FC1F0 /* SonyHDV_Handler.cpp in Sources */,
+ 019024D40E34DB86000FC1F0 /* TIFF_Handler.cpp in Sources */,
+ 019024D50E34DB86000FC1F0 /* Trivial_Handler.cpp in Sources */,
+ 019024D60E34DB86000FC1F0 /* UCF_Handler.cpp in Sources */,
+ 019024D70E34DB86000FC1F0 /* WAV_Handler.cpp in Sources */,
+ 019024D80E34DB86000FC1F0 /* XDCAM_Handler.cpp in Sources */,
+ 019024D90E34DB86000FC1F0 /* XDCAMEX_Handler.cpp in Sources */,
+ 0190251D0E34DC7E000FC1F0 /* ID3_Support.cpp in Sources */,
+ 0190251E0E34DC7E000FC1F0 /* IPTC_Support.cpp in Sources */,
+ 019025200E34DC7E000FC1F0 /* PNG_Support.cpp in Sources */,
+ 019025210E34DC7E000FC1F0 /* PSIR_FileWriter.cpp in Sources */,
+ 019025220E34DC7E000FC1F0 /* PSIR_MemoryReader.cpp in Sources */,
+ 019025230E34DC7E000FC1F0 /* QuickTime_Support.cpp in Sources */,
+ 019025240E34DC7E000FC1F0 /* Reconcile_Impl.cpp in Sources */,
+ 019025250E34DC7E000FC1F0 /* ReconcileIPTC.cpp in Sources */,
+ 019025260E34DC7E000FC1F0 /* ReconcileLegacy.cpp in Sources */,
+ 019025270E34DC7E000FC1F0 /* ReconcileTIFF.cpp in Sources */,
+ 019025280E34DC7E000FC1F0 /* RIFF_Support.cpp in Sources */,
+ 019025290E34DC7E000FC1F0 /* TIFF_FileWriter.cpp in Sources */,
+ 0190252A0E34DC7E000FC1F0 /* TIFF_MemoryReader.cpp in Sources */,
+ 0190252B0E34DC7E000FC1F0 /* XDCAM_Support.cpp in Sources */,
+ 0190252C0E34DC7E000FC1F0 /* TIFF_Support.cpp in Sources */,
+ 0190252D0E34DC7E000FC1F0 /* XMPScanner.cpp in Sources */,
+ 2E19772A0E38B99800E7002F /* XML_Node.cpp in Sources */,
+ 2E19772E0E38B9DB00E7002F /* LargeFileAccess.cpp in Sources */,
+ 2E1977310E38B9ED00E7002F /* UnicodeConversions.cpp in Sources */,
+ 2E19773A0E38BB5B00E7002F /* SWF_Support.cpp in Sources */,
+ 2E1977D90E38CD5E00E7002F /* MD5.cpp in Sources */,
+ 01C07CB10E39E44000029382 /* adler32.c in Sources */,
+ 01C07CB20E39E44000029382 /* compress.c in Sources */,
+ 01C07CB30E39E44000029382 /* crc32.c in Sources */,
+ 01C07CB40E39E44000029382 /* deflate.c in Sources */,
+ 01C07CB50E39E44000029382 /* gzio.c in Sources */,
+ 01C07CB60E39E44000029382 /* infback.c in Sources */,
+ 01C07CB70E39E44000029382 /* inffast.c in Sources */,
+ 01C07CB80E39E44000029382 /* inflate.c in Sources */,
+ 01C07CB90E39E44000029382 /* inftrees.c in Sources */,
+ 01C07CBA0E39E44000029382 /* trees.c in Sources */,
+ 01C07CBB0E39E44000029382 /* uncompr.c in Sources */,
+ 01C07CBC0E39E44000029382 /* zutil.c in Sources */,
+ 01C07CD50E39E70200029382 /* SWF_Handler.cpp in Sources */,
+ 011127FF0E5C549500114B41 /* ASF_Handler.cpp in Sources */,
+ 011128040E5C54A000114B41 /* ASF_Support.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ DC493269089A9441003ADAAF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DC493270089A94CE003ADAAF /* XMPIterator.cpp in Sources */,
+ DC493271089A94CE003ADAAF /* XMPMeta.cpp in Sources */,
+ DC493272089A94CE003ADAAF /* XMPMeta-GetSet.cpp in Sources */,
+ DC493273089A94CE003ADAAF /* XMPMeta-Parse.cpp in Sources */,
+ DC493274089A94CE003ADAAF /* XMPMeta-Serialize.cpp in Sources */,
+ DC493275089A94CE003ADAAF /* XMPUtils.cpp in Sources */,
+ DC49327B089A94E6003ADAAF /* ExpatAdapter.cpp in Sources */,
+ DC49327D089A94E6003ADAAF /* ParseRDF.cpp in Sources */,
+ DC49327E089A94E6003ADAAF /* UnicodeConversions.cpp in Sources */,
+ DC49327F089A94FF003ADAAF /* xmlparse.c in Sources */,
+ DC493280089A94FF003ADAAF /* xmlrole.c in Sources */,
+ DC493281089A94FF003ADAAF /* xmltok.c in Sources */,
+ DC493282089A950C003ADAAF /* WXMPIterator.cpp in Sources */,
+ DC493283089A950C003ADAAF /* WXMPMeta.cpp in Sources */,
+ DC493284089A950C003ADAAF /* WXMPUtils.cpp in Sources */,
+ DCEDFE2509ACBECF00D86460 /* XMPUtils-FileInfo.cpp in Sources */,
+ 014796520B776899007CF8F4 /* XMPCore_Impl.cpp in Sources */,
+ 014A2AA20B78FF2C00A80B2A /* MD5.cpp in Sources */,
+ 2E1977280E38B99800E7002F /* XML_Node.cpp in Sources */,
+ 011128020E5C549500114B41 /* ASF_Handler.cpp in Sources */,
+ 011128070E5C54A000114B41 /* ASF_Support.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ DC493295089A9726003ADAAF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DC493297089A9726003ADAAF /* XMPIterator.cpp in Sources */,
+ DC493298089A9726003ADAAF /* XMPMeta.cpp in Sources */,
+ DC493299089A9726003ADAAF /* XMPMeta-GetSet.cpp in Sources */,
+ DC49329A089A9726003ADAAF /* XMPMeta-Parse.cpp in Sources */,
+ DC49329B089A9726003ADAAF /* XMPMeta-Serialize.cpp in Sources */,
+ DC49329C089A9726003ADAAF /* XMPUtils.cpp in Sources */,
+ DC4932A2089A9726003ADAAF /* ExpatAdapter.cpp in Sources */,
+ DC4932A4089A9726003ADAAF /* ParseRDF.cpp in Sources */,
+ DC4932A5089A9726003ADAAF /* UnicodeConversions.cpp in Sources */,
+ DC4932A6089A9726003ADAAF /* xmlparse.c in Sources */,
+ DC4932A7089A9726003ADAAF /* xmlrole.c in Sources */,
+ DC4932A8089A9726003ADAAF /* xmltok.c in Sources */,
+ DC4932A9089A9726003ADAAF /* WXMPIterator.cpp in Sources */,
+ DC4932AA089A9726003ADAAF /* WXMPMeta.cpp in Sources */,
+ DC4932AB089A9726003ADAAF /* WXMPUtils.cpp in Sources */,
+ DCEDFE2609ACBECF00D86460 /* XMPUtils-FileInfo.cpp in Sources */,
+ 014796530B776899007CF8F4 /* XMPCore_Impl.cpp in Sources */,
+ 014A2AA30B78FF2C00A80B2A /* MD5.cpp in Sources */,
+ 2E1977270E38B99800E7002F /* XML_Node.cpp in Sources */,
+ 011128010E5C549500114B41 /* ASF_Handler.cpp in Sources */,
+ 011128060E5C54A000114B41 /* ASF_Support.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 01FC6D900B7B7858008559A1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 01FC6CF20B7B7514008559A1 /* XMPFiles Release */;
+ targetProxy = 01FC6D8F0B7B7858008559A1 /* PBXContainerItemProxy */;
+ };
+ 01FC6D920B7B7858008559A1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 01FC6CD40B7B6D65008559A1 /* XMPFiles Debug */;
+ targetProxy = 01FC6D910B7B7858008559A1 /* PBXContainerItemProxy */;
+ };
+ DCF912BE09A3E6A40055523F /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = DC49326B089A9441003ADAAF /* XMPCore Debug */;
+ targetProxy = DCF912BD09A3E6A40055523F /* PBXContainerItemProxy */;
+ };
+ DCF912C009A3E6A70055523F /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = DC493293089A9726003ADAAF /* XMPCore Release */;
+ targetProxy = DCF912BF09A3E6A70055523F /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 01FC6CEB0B7B6D65008559A1 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400F80951DAA90040D71F /* XMPToolkitSDK-Debug.xcconfig */;
+ buildSettings = {
+ PRODUCT_NAME = XMPFilesStaticDebug;
+ };
+ name = Default;
+ };
+ 01FC6D090B7B7514008559A1 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400F90951DAA90040D71F /* XMPToolkitSDK-Release.xcconfig */;
+ buildSettings = {
+ PRODUCT_NAME = XMPFilesStaticRelease;
+ };
+ name = Default;
+ };
+ 07A256240868DD5F00CA045D /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400F70951DAA90040D71F /* XMPToolkitSDK-Common.xcconfig */;
+ buildSettings = {
+ };
+ name = Default;
+ };
+ DC49326E089A9460003ADAAF /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400F80951DAA90040D71F /* XMPToolkitSDK-Debug.xcconfig */;
+ buildSettings = {
+ PRODUCT_NAME = XMPCoreStaticDebug;
+ };
+ name = Default;
+ };
+ DC4932AE089A9726003ADAAF /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400F90951DAA90040D71F /* XMPToolkitSDK-Release.xcconfig */;
+ buildSettings = {
+ PRODUCT_NAME = XMPCoreStaticRelease;
+ };
+ name = Default;
+ };
+ DCF912C209A3E6C60055523F /* Default */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "Build All";
+ };
+ name = Default;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 01FC6CEA0B7B6D65008559A1 /* Build configuration list for PBXNativeTarget "XMPFiles Debug" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 01FC6CEB0B7B6D65008559A1 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 01FC6D080B7B7514008559A1 /* Build configuration list for PBXNativeTarget "XMPFiles Release" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 01FC6D090B7B7514008559A1 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 07601E2C085F9443003FEB33 /* Build configuration list for PBXProject "XMPToolkitSDK" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 07A256240868DD5F00CA045D /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ DC49326D089A9460003ADAAF /* Build configuration list for PBXNativeTarget "XMPCore Debug" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DC49326E089A9460003ADAAF /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ DC4932AD089A9726003ADAAF /* Build configuration list for PBXNativeTarget "XMPCore Release" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DC4932AE089A9726003ADAAF /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ DCF912C109A3E6C60055523F /* Build configuration list for PBXAggregateTarget "Build All" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DCF912C209A3E6C60055523F /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
+}
diff --git a/build/xcode/expat_config.h b/build/xcode2/expat_config.h
index a21de6e..a21de6e 100644
--- a/build/xcode/expat_config.h
+++ b/build/xcode2/expat_config.h
diff --git a/docs/API/TXMPFiles_8hpp-source.html b/docs/API/TXMPFiles_8hpp-source.html
new file mode 100644
index 0000000..af12992
--- /dev/null
+++ b/docs/API/TXMPFiles_8hpp-source.html
@@ -0,0 +1,247 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: TXMPFiles.hpp Source File</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+<h1>TXMPFiles.hpp</h1><a href="TXMPFiles_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef __TXMPFiles_hpp__</span>
+<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define __TXMPFiles_hpp__ 1</span>
+<a name="l00003"></a>00003 <span class="preprocessor"></span>
+<a name="l00004"></a>00004 <span class="preprocessor">#if ( ! __XMP_hpp__ )</span>
+<a name="l00005"></a>00005 <span class="preprocessor"></span><span class="preprocessor"> #error "Do not directly include, use XMP.hpp"</span>
+<a name="l00006"></a>00006 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00007"></a>00007 <span class="preprocessor"></span>
+<a name="l00008"></a>00008 <span class="comment">// =================================================================================================</span>
+<a name="l00009"></a>00009 <span class="comment">// ADOBE SYSTEMS INCORPORATED</span>
+<a name="l00010"></a>00010 <span class="comment">// Copyright 2002-2007 Adobe Systems Incorporated</span>
+<a name="l00011"></a>00011 <span class="comment">// All Rights Reserved</span>
+<a name="l00012"></a>00012 <span class="comment">//</span>
+<a name="l00013"></a>00013 <span class="comment">// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms</span>
+<a name="l00014"></a>00014 <span class="comment">// of the Adobe license agreement accompanying it.</span>
+<a name="l00015"></a>00015 <span class="comment">// =================================================================================================</span>
+<a name="l00016"></a>00016
+<a name="l00017"></a>00017 <span class="comment">// =================================================================================================</span>
+<a name="l00033"></a>00033 <span class="comment"></span><span class="comment">// =================================================================================================</span>
+<a name="l00034"></a>00034
+<a name="l00035"></a>00035
+<a name="l00036"></a>00036 <span class="comment">// =================================================================================================</span>
+<a name="l00058"></a>00058 <span class="comment"></span><span class="comment">// =================================================================================================</span>
+<a name="l00059"></a>00059
+<a name="l00060"></a>00060
+<a name="l00061"></a>00061 <span class="keyword">template</span> &lt;<span class="keyword">class</span> tStringObj&gt;
+<a name="l00062"></a><a class="code" href="classTXMPFiles.html">00062</a> <span class="keyword">class </span><a class="code" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a> {
+<a name="l00063"></a>00063
+<a name="l00064"></a>00064 <span class="keyword">public</span>:
+<a name="l00065"></a>00065
+<a name="l00066"></a>00066 <span class="comment">// =============================================================================================</span>
+<a name="l00071"></a>00071 <span class="comment"></span>
+<a name="l00072"></a>00072 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00079"></a>00079 <span class="comment"></span>
+<a name="l00080"></a>00080 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPFiles.html#6e521c034728b59ab55213a9d8203d1e" title="GetVersionInfo() retrieves version information for the XMPFiles component.">GetVersionInfo</a> ( <a class="code" href="structXMP__VersionInfo.html" title="XMP Toolkit version information.">XMP_VersionInfo</a> * versionInfo );
+<a name="l00081"></a>00081
+<a name="l00082"></a>00082 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00091"></a>00091 <span class="comment"></span>
+<a name="l00092"></a>00092 <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#0874bbbf41c9490abfb613bfe297327d" title="Initializes the XMPFiles library; must be called before creating an SXMPFiles object...">Initialize</a>();
+<a name="l00093"></a>00093
+<a name="l00094"></a>00094 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00110"></a>00110 <span class="comment"></span>
+<a name="l00111"></a>00111 <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#0874bbbf41c9490abfb613bfe297327d" title="Initializes the XMPFiles library; must be called before creating an SXMPFiles object...">Initialize</a> ( <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options );
+<a name="l00112"></a>00112
+<a name="l00113"></a>00113 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00120"></a>00120 <span class="comment"></span>
+<a name="l00121"></a>00121 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPFiles.html#1e8de80c252b60b332dc4bc524139fd8" title="Terminates use of the XMPFiles library.">Terminate</a>();
+<a name="l00122"></a>00122
+<a name="l00124"></a>00124
+<a name="l00125"></a>00125 <span class="comment">// =============================================================================================</span>
+<a name="l00131"></a>00131 <span class="comment"></span>
+<a name="l00132"></a>00132 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00134"></a>00134 <span class="comment"></span>
+<a name="l00135"></a>00135 <a class="code" href="classTXMPFiles.html#14f01e38454178578fd25fff6024fd54" title="Default constructor initializes an object that is associated with no file.">TXMPFiles</a>();
+<a name="l00136"></a>00136
+<a name="l00137"></a>00137 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00143"></a>00143 <span class="comment"></span>
+<a name="l00144"></a>00144 <span class="keyword">virtual</span> <a class="code" href="classTXMPFiles.html#5eaa92724cc82d933a32eff9c4636739" title="Destructor; typical virtual destructor.">~TXMPFiles</a>() <span class="keywordflow">throw</span>();
+<a name="l00145"></a>00145
+<a name="l00146"></a>00146 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00169"></a>00169 <span class="comment"></span>
+<a name="l00170"></a>00170 <a class="code" href="classTXMPFiles.html#14f01e38454178578fd25fff6024fd54" title="Default constructor initializes an object that is associated with no file.">TXMPFiles</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> filePath,
+<a name="l00171"></a>00171 <a class="code" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e" title="Type for file format identification constants. See kXMP_PDFFile and following.">XMP_FileFormat</a> format = <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403882845f95eaaaf492f5011bff05a398719" title="Unknown file format constant: &amp;#39; &amp;#39;.">kXMP_UnknownFile</a>,
+<a name="l00172"></a>00172 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> openFlags = 0 );
+<a name="l00173"></a>00173
+<a name="l00174"></a>00174 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00180"></a>00180 <span class="comment"></span>
+<a name="l00181"></a>00181 <a class="code" href="classTXMPFiles.html#14f01e38454178578fd25fff6024fd54" title="Default constructor initializes an object that is associated with no file.">TXMPFiles</a> ( <span class="keyword">const</span> tStringObj &amp; filePath,
+<a name="l00182"></a>00182 <a class="code" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e" title="Type for file format identification constants. See kXMP_PDFFile and following.">XMP_FileFormat</a> format = <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403882845f95eaaaf492f5011bff05a398719" title="Unknown file format constant: &amp;#39; &amp;#39;.">kXMP_UnknownFile</a>,
+<a name="l00183"></a>00183 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> openFlags = 0 );
+<a name="l00184"></a>00184
+<a name="l00185"></a>00185 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00193"></a>00193 <span class="comment"></span>
+<a name="l00194"></a>00194 <a class="code" href="classTXMPFiles.html#14f01e38454178578fd25fff6024fd54" title="Default constructor initializes an object that is associated with no file.">TXMPFiles</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles&lt;tStringObj&gt;</a> &amp; original );
+<a name="l00195"></a>00195
+<a name="l00196"></a>00196 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00202"></a>00202 <span class="comment"></span>
+<a name="l00203"></a>00203 <span class="keywordtype">void</span> <a class="code" href="classTXMPFiles.html#3f1483fcc92860460d3772216dfaef81" title="Assignment operator.">operator= </a>( <span class="keyword">const</span> <a class="code" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles&lt;tStringObj&gt;</a> &amp; rhs );
+<a name="l00204"></a>00204
+<a name="l00205"></a>00205 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00216"></a>00216 <span class="comment"></span>
+<a name="l00217"></a>00217 <a class="code" href="classTXMPFiles.html#14f01e38454178578fd25fff6024fd54" title="Default constructor initializes an object that is associated with no file.">TXMPFiles</a> ( <a class="code" href="XMP__Const_8h.html#a4bca98ad67d7a62c60cb13dbbab0f25">XMPFilesRef</a> xmpFilesObj );
+<a name="l00218"></a>00218
+<a name="l00219"></a>00219 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00230"></a>00230 <span class="comment"></span>
+<a name="l00231"></a>00231 <a class="code" href="XMP__Const_8h.html#a4bca98ad67d7a62c60cb13dbbab0f25">XMPFilesRef</a> <a class="code" href="classTXMPFiles.html#311fc36fdf7270fe05b1c531cdbbd009" title="GetInternalRef() retrieves an internal reference that can be safely passed across...">GetInternalRef</a>();
+<a name="l00232"></a>00232
+<a name="l00234"></a>00234
+<a name="l00235"></a>00235 <span class="comment">// =============================================================================================</span>
+<a name="l00241"></a>00241 <span class="comment"></span>
+<a name="l00242"></a>00242 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00273"></a>00273 <span class="comment"></span>
+<a name="l00274"></a>00274
+<a name="l00275"></a>00275 <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#cb9e16a1477ec67fa6da6d736a9bc131" title="GetFormatInfo() reports what features are supported for a specific file format.">GetFormatInfo</a> ( <a class="code" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e" title="Type for file format identification constants. See kXMP_PDFFile and following.">XMP_FileFormat</a> format,
+<a name="l00276"></a>00276 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * handlerFlags = 0 );
+<a name="l00277"></a>00277
+<a name="l00279"></a>00279
+<a name="l00280"></a>00280 <span class="comment">// =============================================================================================</span>
+<a name="l00285"></a>00285 <span class="comment"></span>
+<a name="l00286"></a>00286 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00296"></a>00296 <span class="comment"></span>
+<a name="l00297"></a>00297 <span class="keyword">static</span> <a class="code" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e" title="Type for file format identification constants. See kXMP_PDFFile and following.">XMP_FileFormat</a> <a class="code" href="classTXMPFiles.html#07b7c4b44fb0e0a7d115ddd5ba22f926" title="CheckFileFormat() tries to determine the format of a file.">CheckFileFormat</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> filePath );
+<a name="l00298"></a>00298
+<a name="l00299"></a>00299 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00313"></a>00313 <span class="comment"></span>
+<a name="l00314"></a>00314 <span class="keyword">static</span> <a class="code" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e" title="Type for file format identification constants. See kXMP_PDFFile and following.">XMP_FileFormat</a> <a class="code" href="classTXMPFiles.html#7f505664c41d7304fb757d6009b0751c" title="CheckPackageFormat() tries to determine the format of a &amp;quot;package&amp;quot; folder...">CheckPackageFormat</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> folderPath );
+<a name="l00315"></a>00315
+<a name="l00316"></a>00316 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00371"></a>00371 <span class="comment"></span>
+<a name="l00372"></a>00372
+<a name="l00373"></a>00373 <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> filePath,
+<a name="l00374"></a>00374 <a class="code" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e" title="Type for file format identification constants. See kXMP_PDFFile and following.">XMP_FileFormat</a> format = <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403882845f95eaaaf492f5011bff05a398719" title="Unknown file format constant: &amp;#39; &amp;#39;.">kXMP_UnknownFile</a>,
+<a name="l00375"></a>00375 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> openFlags = 0 );
+<a name="l00376"></a>00376
+<a name="l00377"></a>00377 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00382"></a>00382 <span class="comment"></span>
+<a name="l00383"></a>00383 <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile</a> ( <span class="keyword">const</span> tStringObj &amp; filePath,
+<a name="l00384"></a>00384 <a class="code" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e" title="Type for file format identification constants. See kXMP_PDFFile and following.">XMP_FileFormat</a> format = <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403882845f95eaaaf492f5011bff05a398719" title="Unknown file format constant: &amp;#39; &amp;#39;.">kXMP_UnknownFile</a>,
+<a name="l00385"></a>00385 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> openFlags = 0 );
+<a name="l00386"></a>00386
+<a name="l00387"></a>00387 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00408"></a>00408 <span class="comment"></span>
+<a name="l00409"></a>00409 <span class="keywordtype">void</span> <a class="code" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile</a> ( <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> closeFlags = 0 );
+<a name="l00410"></a>00410
+<a name="l00411"></a>00411 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00428"></a>00428 <span class="comment"></span>
+<a name="l00429"></a>00429 <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#f9931d081cb19f98c81e41786030765b" title="GetFileInfo() retrieves basic information about an opened file.">GetFileInfo</a> ( tStringObj * filePath = 0,
+<a name="l00430"></a>00430 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * openFlags = 0,
+<a name="l00431"></a>00431 <a class="code" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e" title="Type for file format identification constants. See kXMP_PDFFile and following.">XMP_FileFormat</a> * format = 0,
+<a name="l00432"></a>00432 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * handlerFlags = 0 );
+<a name="l00433"></a>00433
+<a name="l00434"></a>00434 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00444"></a>00444 <span class="comment"></span>
+<a name="l00445"></a>00445 <span class="keywordtype">void</span> <a class="code" href="classTXMPFiles.html#7b86c130fdbd54b5ac158ec3fee93777" title="SetAbortProc() registers a callback function used to check for a user-signaled abort...">SetAbortProc</a> ( <a class="code" href="XMP__Const_8h.html#a2738ce2fca7f1809b12834b1b5e2d0e">XMP_AbortProc</a> abortProc,
+<a name="l00446"></a>00446 <span class="keywordtype">void</span> * abortArg );
+<a name="l00447"></a>00447
+<a name="l00449"></a>00449
+<a name="l00450"></a>00450 <span class="comment">// =============================================================================================</span>
+<a name="l00457"></a>00457 <span class="comment"></span>
+<a name="l00458"></a>00458 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00485"></a>00485 <span class="comment"></span>
+<a name="l00486"></a>00486 <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3" title="GetXMP() retrieves the XMP metadata from an open file.">GetXMP</a> ( SXMPMeta * xmpObj = 0,
+<a name="l00487"></a>00487 tStringObj * xmpPacket = 0,
+<a name="l00488"></a>00488 <a class="code" href="structXMP__PacketInfo.html" title="XMP packet description.">XMP_PacketInfo</a> * packetInfo = 0 );
+<a name="l00489"></a>00489
+<a name="l00490"></a>00490 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00521"></a>00521 <span class="comment"></span>
+<a name="l00522"></a>00522 <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#4ea1eda39f803322e10b2a554ef8ab06" title="GetThumbnail() retrieves the native thumbnail from an open file.">GetThumbnail</a> ( <a class="code" href="structXMP__ThumbnailInfo.html" title="Thumbnail descriptor.">XMP_ThumbnailInfo</a> * tnailInfo );
+<a name="l00523"></a>00523
+<a name="l00524"></a>00524 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00532"></a>00532 <span class="comment"></span>
+<a name="l00533"></a>00533 <span class="keywordtype">void</span> <a class="code" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a" title="PutXMP() updates the XMP metadata in this object without writing out the file.">PutXMP</a> ( <span class="keyword">const</span> SXMPMeta &amp; xmpObj );
+<a name="l00534"></a>00534
+<a name="l00535"></a>00535 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00543"></a>00543 <span class="comment"></span>
+<a name="l00544"></a>00544 <span class="keywordtype">void</span> <a class="code" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a" title="PutXMP() updates the XMP metadata in this object without writing out the file.">PutXMP</a> ( <span class="keyword">const</span> tStringObj &amp; xmpPacket );
+<a name="l00545"></a>00545
+<a name="l00546"></a>00546 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00557"></a>00557 <span class="comment"></span>
+<a name="l00558"></a>00558 <span class="keywordtype">void</span> <a class="code" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a" title="PutXMP() updates the XMP metadata in this object without writing out the file.">PutXMP</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> xmpPacket,
+<a name="l00559"></a>00559 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a" title="The type for string length parameters. A 32-bit unsigned integer, as big as will...">XMP_StringLen</a> xmpLength = <a class="code" href="XMP__Const_8h.html#8283c9596c03b6d626d5a2b7a90e23ab" title="Options macro sets string style.">kXMP_UseNullTermination</a> );
+<a name="l00560"></a>00560
+<a name="l00561"></a>00561 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00595"></a>00595 <span class="comment"></span>
+<a name="l00596"></a>00596 <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6" title="CanPutXMP() reports whether this file can be updated with a specific XMP packet.">CanPutXMP</a> ( <span class="keyword">const</span> SXMPMeta &amp; xmpObj );
+<a name="l00597"></a>00597
+<a name="l00598"></a>00598 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00606"></a>00606 <span class="comment"></span>
+<a name="l00607"></a>00607 <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6" title="CanPutXMP() reports whether this file can be updated with a specific XMP packet.">CanPutXMP</a> ( <span class="keyword">const</span> tStringObj &amp; xmpPacket );
+<a name="l00608"></a>00608
+<a name="l00609"></a>00609 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00620"></a>00620 <span class="comment"></span>
+<a name="l00621"></a>00621 <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6" title="CanPutXMP() reports whether this file can be updated with a specific XMP packet.">CanPutXMP</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> xmpPacket,
+<a name="l00622"></a>00622 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a" title="The type for string length parameters. A 32-bit unsigned integer, as big as will...">XMP_StringLen</a> xmpLength = <a class="code" href="XMP__Const_8h.html#8283c9596c03b6d626d5a2b7a90e23ab" title="Options macro sets string style.">kXMP_UseNullTermination</a> );
+<a name="l00623"></a>00623
+<a name="l00625"></a>00625
+<a name="l00626"></a>00626 <span class="comment">// =============================================================================================</span>
+<a name="l00627"></a>00627
+<a name="l00628"></a>00628 <span class="keyword">private</span>:
+<a name="l00629"></a>00629 <a class="code" href="XMP__Const_8h.html#a4bca98ad67d7a62c60cb13dbbab0f25">XMPFilesRef</a> xmpFilesRef;
+<a name="l00630"></a>00630
+<a name="l00631"></a>00631 }; <span class="comment">// class TXMPFiles</span>
+<a name="l00632"></a>00632
+<a name="l00633"></a>00633 <span class="comment">// =================================================================================================</span>
+<a name="l00634"></a>00634
+<a name="l00635"></a>00635 <span class="preprocessor">#endif // __TXMPFiles_hpp__</span>
+</pre></div></div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/TXMPFiles_8hpp.html b/docs/API/TXMPFiles_8hpp.html
new file mode 100644
index 0000000..5a4fdc5
--- /dev/null
+++ b/docs/API/TXMPFiles_8hpp.html
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: TXMPFiles.hpp File Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>TXMPFiles.hpp File Reference</h1>API for access to the main (document-level) metadata in a file_. <a href="#_details">More...</a>
+<p>
+
+<p>
+<a href="TXMPFiles_8hpp-source.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">API for access to the main (document-level) metadata in a file. <a href="classTXMPFiles.html#_details">More...</a><br></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+API for access to the main (document-level) metadata in a file_.
+<p>
+The Adobe XMP Toolkit's file handling component, XMPFiles, is a front end to a set of format-specific file handlers that support file I/O for XMP. The file handlers implement smart, efficient support for those file formats for which the means to embed XMP is defined in the XMP Specification. Where possible, this support allows: <ul>
+<li>Injection of XMP where none currently exists </li>
+<li>Expansion of XMP without regard to existing padding </li>
+<li>Reconciliation of the XMP and other legacy forms of metadata.</li>
+</ul>
+<code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code> is designed for use by clients interested in the metadata and not in the primary file content; the Adobe Bridge application is a typical example. <code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code> is not intended to be appropriate for files authored by an application; that is, those files for which the application has explicit knowledge of the file format. </div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/TXMPFiles_8incl__cpp.html b/docs/API/TXMPFiles_8incl__cpp.html
new file mode 100644
index 0000000..e55c332
--- /dev/null
+++ b/docs/API/TXMPFiles_8incl__cpp.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: TXMPFiles.incl_cpp File Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>TXMPFiles.incl_cpp File Reference</h1>The implementation of the <a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a> template class. <a href="#_details">More...</a>
+<p>
+<code>#include &quot;client-glue/WXMP_Common.hpp&quot;</code><br>
+<code>#include &quot;client-glue/WXMPFiles.hpp&quot;</code><br>
+
+<p>
+<div class="dynheader">
+Include dependency graph for TXMPFiles.incl_cpp:</div>
+<div class="dynsection">
+<p><center><img src="TXMPFiles_8incl__cpp__incl.png" border="0" usemap="#TXMPFiles.incl_cpp_map" alt=""></center>
+</div>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+The implementation of the <a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a> template class.
+<p>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/TXMPFiles_8incl__cpp__incl.png b/docs/API/TXMPFiles_8incl__cpp__incl.png
new file mode 100644
index 0000000..496eb80
--- /dev/null
+++ b/docs/API/TXMPFiles_8incl__cpp__incl.png
Binary files differ
diff --git a/docs/API/TXMPIterator_8hpp-source.html b/docs/API/TXMPIterator_8hpp-source.html
new file mode 100644
index 0000000..b9bda84
--- /dev/null
+++ b/docs/API/TXMPIterator_8hpp-source.html
@@ -0,0 +1,148 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: TXMPIterator.hpp Source File</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+<h1>TXMPIterator.hpp</h1><a href="TXMPIterator_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef __TXMPIterator_hpp__</span>
+<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define __TXMPIterator_hpp__ 1</span>
+<a name="l00003"></a>00003 <span class="preprocessor"></span>
+<a name="l00004"></a>00004 <span class="preprocessor">#if ( ! __XMP_hpp__ )</span>
+<a name="l00005"></a>00005 <span class="preprocessor"></span><span class="preprocessor"> #error "Do not directly include, use XMP.hpp"</span>
+<a name="l00006"></a>00006 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00007"></a>00007 <span class="preprocessor"></span>
+<a name="l00008"></a>00008 <span class="comment">// =================================================================================================</span>
+<a name="l00009"></a>00009 <span class="comment">// ADOBE SYSTEMS INCORPORATED</span>
+<a name="l00010"></a>00010 <span class="comment">// Copyright 2002-2007 Adobe Systems Incorporated</span>
+<a name="l00011"></a>00011 <span class="comment">// All Rights Reserved</span>
+<a name="l00012"></a>00012 <span class="comment">//</span>
+<a name="l00013"></a>00013 <span class="comment">// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms</span>
+<a name="l00014"></a>00014 <span class="comment">// of the Adobe license agreement accompanying it.</span>
+<a name="l00015"></a>00015 <span class="comment">// =================================================================================================</span>
+<a name="l00016"></a>00016
+<a name="l00017"></a>00017 <span class="comment">// =================================================================================================</span>
+<a name="l00024"></a>00024 <span class="comment"></span><span class="comment">// =================================================================================================</span>
+<a name="l00025"></a>00025
+<a name="l00026"></a>00026 <span class="comment">// =================================================================================================</span>
+<a name="l00077"></a>00077 <span class="comment"></span><span class="comment">// =================================================================================================</span>
+<a name="l00078"></a>00078
+<a name="l00079"></a>00079 <span class="preprocessor">#include "client-glue/WXMPIterator.hpp"</span>
+<a name="l00080"></a>00080
+<a name="l00081"></a><a class="code" href="classTXMPIterator.html">00081</a> <span class="keyword">template</span> &lt;<span class="keyword">class</span> tStringObj&gt; <span class="keyword">class </span><a class="code" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a> {
+<a name="l00082"></a>00082
+<a name="l00083"></a>00083 <span class="keyword">public</span>:
+<a name="l00084"></a>00084
+<a name="l00085"></a>00085 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00092"></a>00092 <span class="comment"></span>
+<a name="l00093"></a>00093 <span class="keywordtype">void</span> <a class="code" href="classTXMPIterator.html#d767d731320d3f4c997c6ce9f7f8fa63" title="Assignment operator, assigns the internal ref and increments the ref count.">operator= </a>( <span class="keyword">const</span> <a class="code" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator&lt;tStringObj&gt;</a> &amp; rhs );
+<a name="l00094"></a>00094
+<a name="l00095"></a>00095 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00101"></a>00101 <span class="comment"></span>
+<a name="l00102"></a>00102 <a class="code" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator&lt;tStringObj&gt;</a> &amp; original );
+<a name="l00103"></a>00103
+<a name="l00104"></a>00104 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00127"></a>00127 <span class="comment"></span>
+<a name="l00128"></a>00128 <a class="code" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta&lt;tStringObj&gt;</a> &amp; xmpObj,
+<a name="l00129"></a>00129 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00130"></a>00130 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l00131"></a>00131 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l00132"></a>00132
+<a name="l00133"></a>00133 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00152"></a>00152 <span class="comment"></span>
+<a name="l00153"></a>00153 <a class="code" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta&lt;tStringObj&gt;</a> &amp; xmpObj,
+<a name="l00154"></a>00154 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00155"></a>00155 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l00156"></a>00156
+<a name="l00157"></a>00157 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00173"></a>00173 <span class="comment"></span>
+<a name="l00174"></a>00174 <a class="code" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta&lt;tStringObj&gt;</a> &amp; xmpObj,
+<a name="l00175"></a>00175 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l00176"></a>00176
+<a name="l00177"></a>00177 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00179"></a>00179 <span class="comment"></span>
+<a name="l00180"></a>00180 <a class="code" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00181"></a>00181 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l00182"></a>00182 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options );
+<a name="l00183"></a>00183
+<a name="l00184"></a>00184 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00186"></a>00186 <span class="comment"></span>
+<a name="l00187"></a>00187 <span class="keyword">virtual</span> <a class="code" href="classTXMPIterator.html#911554533e8a3f09ab8870bd54462196" title="Destructor, typical virtual destructor.">~TXMPIterator</a>() <span class="keywordflow">throw</span>();
+<a name="l00188"></a>00188
+<a name="l00189"></a>00189 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00209"></a>00209 <span class="comment"></span>
+<a name="l00210"></a>00210 <span class="keywordtype">bool</span> <a class="code" href="classTXMPIterator.html#124a1dd1ab3ff0d236e4d4b967dafcd9" title="Next() visits the next node in the iteration.">Next</a> ( tStringObj * schemaNS = 0,
+<a name="l00211"></a>00211 tStringObj * propPath = 0,
+<a name="l00212"></a>00212 tStringObj * propValue = 0,
+<a name="l00213"></a>00213 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * options = 0 );
+<a name="l00214"></a>00214
+<a name="l00215"></a>00215 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00222"></a>00222 <span class="comment"></span>
+<a name="l00223"></a>00223 <span class="keywordtype">void</span> <a class="code" href="classTXMPIterator.html#30b4d78974b347e4fcd275f1f65a61b2" title="Skip() skips some portion of the remaining iterations.">Skip</a> ( <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options );
+<a name="l00224"></a>00224
+<a name="l00225"></a>00225 <span class="keyword">private</span>:
+<a name="l00226"></a>00226
+<a name="l00227"></a>00227 <a class="code" href="XMP__Const_8h.html#6ade57a30fb1e40d6aa9695c440fc3d2">XMPIteratorRef</a> iterRef;
+<a name="l00228"></a>00228
+<a name="l00229"></a>00229 <a class="code" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a>(); <span class="comment">// ! Hidden, must choose property or table iteration.</span>
+<a name="l00230"></a>00230
+<a name="l00231"></a>00231 }; <span class="comment">// class TXMPIterator</span>
+<a name="l00232"></a>00232
+<a name="l00233"></a>00233 <span class="comment">// =================================================================================================</span>
+<a name="l00234"></a>00234
+<a name="l00235"></a>00235 <span class="preprocessor">#endif // __TXMPIterator_hpp__</span>
+</pre></div></div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/TXMPIterator_8hpp.html b/docs/API/TXMPIterator_8hpp.html
new file mode 100644
index 0000000..e525f5e
--- /dev/null
+++ b/docs/API/TXMPIterator_8hpp.html
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: TXMPIterator.hpp File Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>TXMPIterator.hpp File Reference</h1>API for access to the XMP Toolkit iteration services. <a href="#_details">More...</a>
+<p>
+<code>#include &quot;client-glue/WXMPIterator.hpp&quot;</code><br>
+
+<p>
+<div class="dynheader">
+Include dependency graph for TXMPIterator.hpp:</div>
+<div class="dynsection">
+<p><center><img src="TXMPIterator_8hpp__incl.png" border="0" usemap="#TXMPIterator.hpp_map" alt=""></center>
+</div>
+
+<p>
+<a href="TXMPIterator_8hpp-source.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">API for access to the XMP Toolkit iteration services. <a href="classTXMPIterator.html#_details">More...</a><br></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+API for access to the XMP Toolkit iteration services.
+<p>
+<code><a class="el" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a></code> is the template class providing iteration services for the XMP Toolkit. It must be instantiated with a string class such as <code>std::string</code>. See the instructions in XMP.hpp, and the Overview for a discussion of the overall architecture of the XMP API. </div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/TXMPIterator_8hpp__incl.png b/docs/API/TXMPIterator_8hpp__incl.png
new file mode 100644
index 0000000..5ce4819
--- /dev/null
+++ b/docs/API/TXMPIterator_8hpp__incl.png
Binary files differ
diff --git a/docs/API/TXMPIterator_8incl__cpp.html b/docs/API/TXMPIterator_8incl__cpp.html
new file mode 100644
index 0000000..d113590
--- /dev/null
+++ b/docs/API/TXMPIterator_8incl__cpp.html
@@ -0,0 +1,82 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: TXMPIterator.incl_cpp File Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>TXMPIterator.incl_cpp File Reference</h1>The implementation of the <a class="el" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a> template class. <a href="#_details">More...</a>
+<p>
+<code>#include &quot;XMP.hpp&quot;</code><br>
+<code>#include &quot;client-glue/WXMP_Common.hpp&quot;</code><br>
+<code>#include &quot;client-glue/WXMPIterator.hpp&quot;</code><br>
+
+<p>
+<div class="dynheader">
+Include dependency graph for TXMPIterator.incl_cpp:</div>
+<div class="dynsection">
+<p><center><img src="TXMPIterator_8incl__cpp__incl.png" border="0" usemap="#TXMPIterator.incl_cpp_map" alt=""></center>
+</div>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+The implementation of the <a class="el" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a> template class.
+<p>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/TXMPIterator_8incl__cpp__incl.png b/docs/API/TXMPIterator_8incl__cpp__incl.png
new file mode 100644
index 0000000..fe10552
--- /dev/null
+++ b/docs/API/TXMPIterator_8incl__cpp__incl.png
Binary files differ
diff --git a/docs/API/TXMPMeta_8hpp-source.html b/docs/API/TXMPMeta_8hpp-source.html
new file mode 100644
index 0000000..8e9aa91
--- /dev/null
+++ b/docs/API/TXMPMeta_8hpp-source.html
@@ -0,0 +1,600 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: TXMPMeta.hpp Source File</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+<h1>TXMPMeta.hpp</h1><a href="TXMPMeta_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef __TXMPMeta_hpp__</span>
+<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define __TXMPMeta_hpp__ 1</span>
+<a name="l00003"></a>00003 <span class="preprocessor"></span>
+<a name="l00004"></a>00004 <span class="preprocessor">#if ( ! __XMP_hpp__ )</span>
+<a name="l00005"></a>00005 <span class="preprocessor"></span><span class="preprocessor"> #error "Do not directly include, use XMP.hpp"</span>
+<a name="l00006"></a>00006 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00007"></a>00007 <span class="preprocessor"></span>
+<a name="l00008"></a>00008 <span class="comment">// =================================================================================================</span>
+<a name="l00009"></a>00009 <span class="comment">// ADOBE SYSTEMS INCORPORATED</span>
+<a name="l00010"></a>00010 <span class="comment">// Copyright 2002-2008 Adobe Systems Incorporated</span>
+<a name="l00011"></a>00011 <span class="comment">// All Rights Reserved</span>
+<a name="l00012"></a>00012 <span class="comment">//</span>
+<a name="l00013"></a>00013 <span class="comment">// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms</span>
+<a name="l00014"></a>00014 <span class="comment">// of the Adobe license agreement accompanying it.</span>
+<a name="l00015"></a>00015 <span class="comment">// =================================================================================================</span>
+<a name="l00016"></a>00016
+<a name="l00017"></a>00017 <span class="comment">// =================================================================================================</span>
+<a name="l00027"></a>00027 <span class="comment"></span><span class="comment">// =================================================================================================</span>
+<a name="l00028"></a>00028
+<a name="l00029"></a>00029 <span class="comment">// =================================================================================================</span>
+<a name="l00042"></a>00042 <span class="comment"></span><span class="comment">// =================================================================================================</span>
+<a name="l00043"></a>00043
+<a name="l00044"></a>00044 <span class="keyword">template</span> &lt;<span class="keyword">class</span> tStringObj&gt; <span class="keyword">class </span><a class="code" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a>;
+<a name="l00045"></a>00045 <span class="keyword">template</span> &lt;<span class="keyword">class</span> tStringObj&gt; <span class="keyword">class </span><a class="code" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a>;
+<a name="l00046"></a>00046
+<a name="l00047"></a>00047 <span class="comment">// -------------------------------------------------------------------------------------------------</span>
+<a name="l00048"></a>00048
+<a name="l00049"></a><a class="code" href="classTXMPMeta.html">00049</a> <span class="keyword">template</span> &lt;<span class="keyword">class</span> tStringObj&gt; <span class="keyword">class </span><a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a> {
+<a name="l00050"></a>00050
+<a name="l00051"></a>00051 <span class="keyword">public</span>:
+<a name="l00052"></a>00052
+<a name="l00053"></a>00053 <span class="comment">// =============================================================================================</span>
+<a name="l00054"></a>00054 <span class="comment">// Initialization and termination</span>
+<a name="l00055"></a>00055 <span class="comment">// ==============================</span>
+<a name="l00056"></a>00056
+<a name="l00057"></a>00057 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00061"></a>00061 <span class="comment"></span>
+<a name="l00062"></a>00062 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00074"></a>00074 <span class="comment"></span>
+<a name="l00075"></a>00075 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#5415cfc01a9cb8786939246571a23a9d" title="GetVersionInfo() retrieves runtime version information.">GetVersionInfo</a> ( <a class="code" href="structXMP__VersionInfo.html" title="XMP Toolkit version information.">XMP_VersionInfo</a> * info );
+<a name="l00076"></a>00076
+<a name="l00077"></a>00077 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00079"></a>00079 <span class="comment"></span>
+<a name="l00088"></a>00088 <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#f1defbb73f919eae06456a655dea726c" title="Initialize() explicitly initializes the XMP Toolkit before use. */">Initialize</a>();
+<a name="l00089"></a>00089 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00095"></a>00095 <span class="comment"></span>
+<a name="l00096"></a>00096 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#6c30fae26173167958b6f0da95a53865" title="Terminate() explicitly terminates usage of the XMP Toolkit.">Terminate</a>();
+<a name="l00097"></a>00097
+<a name="l00099"></a>00099
+<a name="l00100"></a>00100 <span class="comment">// =============================================================================================</span>
+<a name="l00101"></a>00101 <span class="comment">// Constuctors and destructor</span>
+<a name="l00102"></a>00102 <span class="comment">// =========================</span>
+<a name="l00103"></a>00103
+<a name="l00104"></a>00104 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00107"></a>00107 <span class="comment"></span>
+<a name="l00108"></a>00108 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00114"></a>00114 <span class="comment"></span> <a class="code" href="classTXMPMeta.html#61ffb3aa3e387d8ff9c1f4ebd26606c7" title="Default constructor, creates an empty object.">TXMPMeta</a>();
+<a name="l00115"></a>00115
+<a name="l00116"></a>00116 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00125"></a>00125 <span class="comment"></span>
+<a name="l00126"></a>00126 <a class="code" href="classTXMPMeta.html#61ffb3aa3e387d8ff9c1f4ebd26606c7" title="Default constructor, creates an empty object.">TXMPMeta</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta&lt;tStringObj&gt;</a> &amp; original );
+<a name="l00127"></a>00127
+<a name="l00128"></a>00128 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00133"></a>00133 <span class="comment"></span>
+<a name="l00134"></a>00134 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#4d5a601c9b77f6f6ab5f14e658de58ef" title="Assignment operator, assigns the internal reference and increments the reference...">operator= </a>( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta&lt;tStringObj&gt;</a> &amp; rhs );
+<a name="l00135"></a>00135
+<a name="l00136"></a>00136 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00146"></a>00146 <span class="comment"></span>
+<a name="l00147"></a>00147 <a class="code" href="classTXMPMeta.html#61ffb3aa3e387d8ff9c1f4ebd26606c7" title="Default constructor, creates an empty object.">TXMPMeta</a> ( <a class="code" href="XMP__Const_8h.html#549d5e2cbcb58302d3df840a0205283e">XMPMetaRef</a> xmpRef );
+<a name="l00148"></a>00148
+<a name="l00149"></a>00149 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00166"></a>00166 <span class="comment"></span>
+<a name="l00167"></a>00167 <a class="code" href="classTXMPMeta.html#61ffb3aa3e387d8ff9c1f4ebd26606c7" title="Default constructor, creates an empty object.">TXMPMeta</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> buffer,
+<a name="l00168"></a>00168 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a" title="The type for string length parameters. A 32-bit unsigned integer, as big as will...">XMP_StringLen</a> xmpSize );
+<a name="l00169"></a>00169
+<a name="l00170"></a>00170 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00172"></a>00172 <span class="comment"></span> <span class="keyword">virtual</span> <a class="code" href="classTXMPMeta.html#bab5013870cd47eb0d9d701653735a02" title="Destructor, typical virtual destructor. */.">~TXMPMeta</a>() <span class="keywordflow">throw</span>();
+<a name="l00173"></a>00173
+<a name="l00175"></a>00175
+<a name="l00176"></a>00176 <span class="comment">// =============================================================================================</span>
+<a name="l00177"></a>00177 <span class="comment">// Global state functions</span>
+<a name="l00178"></a>00178 <span class="comment">// ======================</span>
+<a name="l00179"></a>00179
+<a name="l00180"></a>00180 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00185"></a>00185 <span class="comment"></span>
+<a name="l00186"></a>00186 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00193"></a>00193 <span class="comment"></span>
+<a name="l00194"></a>00194 <span class="keyword">static</span> <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> <a class="code" href="classTXMPMeta.html#12b2435ba039c62a164951948c016eb4" title="GetGlobalOptions() retrieves the set of global option flags. There are none in this...">GetGlobalOptions</a>();
+<a name="l00195"></a>00195
+<a name="l00196"></a>00196 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00207"></a>00207 <span class="comment"></span>
+<a name="l00208"></a>00208 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#e7bb38d9b3857b08106630a386b47332" title="SetGlobalOptions() updates the set of global option flags. There are none in this...">SetGlobalOptions</a> ( <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options );
+<a name="l00209"></a>00209
+<a name="l00211"></a>00211
+<a name="l00212"></a>00212 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00220"></a>00220 <span class="comment"></span>
+<a name="l00221"></a>00221 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00234"></a>00234 <span class="comment"></span>
+<a name="l00235"></a>00235 <span class="keyword">static</span> <a class="code" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Status</a> <a class="code" href="classTXMPMeta.html#addc5f555de57472939a41346e276817" title="DumpNamespaces() sends the list of registered namespace URIs and prefixes to a handler...">DumpNamespaces</a> ( <a class="code" href="XMP__Const_8h.html#8ce3570e6e5ac14cd603e96fa9d2936f">XMP_TextOutputProc</a> outProc,
+<a name="l00236"></a>00236 <span class="keywordtype">void</span> * clientData );
+<a name="l00237"></a>00237
+<a name="l00238"></a>00238 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00251"></a>00251 <span class="comment"></span>
+<a name="l00252"></a>00252 <span class="keyword">static</span> <a class="code" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Status</a> <a class="code" href="classTXMPMeta.html#c2e1bbfd6b9188afb730260808557512" title="DumpAliases() sends the list of registered aliases and corresponding actuals to a...">DumpAliases</a> ( <a class="code" href="XMP__Const_8h.html#8ce3570e6e5ac14cd603e96fa9d2936f">XMP_TextOutputProc</a> outProc,
+<a name="l00253"></a>00253 <span class="keywordtype">void</span> * clientData );
+<a name="l00254"></a>00254
+<a name="l00256"></a>00256
+<a name="l00257"></a>00257 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00268"></a>00268 <span class="comment"></span>
+<a name="l00269"></a>00269 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00290"></a>00290 <span class="comment"></span>
+<a name="l00291"></a>00291 <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#c0368ddbaa4d689cd5b1aff1c88bb0e1" title="RegisterNamespace() registers a namespace URI with a suggested prefix.">RegisterNamespace</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> namespaceURI,
+<a name="l00292"></a>00292 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> suggestedPrefix,
+<a name="l00293"></a>00293 tStringObj * registeredPrefix );
+<a name="l00294"></a>00294
+<a name="l00295"></a>00295 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00309"></a>00309 <span class="comment"></span>
+<a name="l00310"></a>00310 <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#f28589472d8c0397db6cef868f2b8c97" title="GetNamespacePrefix() obtains the prefix for a registered namespace URI, and reports...">GetNamespacePrefix</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> namespaceURI,
+<a name="l00311"></a>00311 tStringObj * namespacePrefix );
+<a name="l00312"></a>00312
+<a name="l00313"></a>00313 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00326"></a>00326 <span class="comment"></span>
+<a name="l00327"></a>00327 <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#a20c84e7549d0a3252fa29a1e83a757a" title="GetNamespaceURI() obtains the URI for a registered namespace prefix, and reports...">GetNamespaceURI</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> namespacePrefix,
+<a name="l00328"></a>00328 tStringObj * namespaceURI );
+<a name="l00329"></a>00329
+<a name="l00330"></a>00330 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00339"></a>00339 <span class="comment"></span>
+<a name="l00340"></a>00340 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#3f989597e95db929676273cacd4ea09a" title="Not implemented.">DeleteNamespace</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> namespaceURI );
+<a name="l00341"></a>00341
+<a name="l00343"></a>00343
+<a name="l00344"></a>00344 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00360"></a>00360 <span class="comment"></span>
+<a name="l00361"></a>00361 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00397"></a>00397 <span class="comment"></span>
+<a name="l00398"></a>00398 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#c47027a765b6365e268f4de3e61b006a" title="RegisterAlias() associates an alias name with an actual name.">RegisterAlias</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> aliasNS,
+<a name="l00399"></a>00399 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> aliasProp,
+<a name="l00400"></a>00400 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> actualNS,
+<a name="l00401"></a>00401 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> actualProp,
+<a name="l00402"></a>00402 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> arrayForm = <a class="code" href="XMP__Const_8h.html#ff1df9f3cf050f8b8d3a574db3c3326b" title="Options macro clears all property-type bits.">kXMP_NoOptions</a> );
+<a name="l00403"></a>00403
+<a name="l00404"></a>00404 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00431"></a>00431 <span class="comment"></span>
+<a name="l00432"></a>00432 <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#c4b9c75202f2b961ad92f10a9e504e9a" title="ResolveAlias() reports whether a name is an alias, and what it is aliased to.">ResolveAlias</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> aliasNS,
+<a name="l00433"></a>00433 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> aliasProp,
+<a name="l00434"></a>00434 tStringObj * actualNS,
+<a name="l00435"></a>00435 tStringObj * actualProp,
+<a name="l00436"></a>00436 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * arrayForm );
+<a name="l00437"></a>00437
+<a name="l00438"></a>00438 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00451"></a>00451 <span class="comment"></span>
+<a name="l00452"></a>00452 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#af64964e983235247ef65c86a42a4675" title="DeleteAlias() deletes an alias.">DeleteAlias</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> aliasNS,
+<a name="l00453"></a>00453 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> aliasProp );
+<a name="l00454"></a>00454
+<a name="l00455"></a>00455 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00465"></a>00465 <span class="comment"></span>
+<a name="l00466"></a>00466 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#b77cf73fa0cc63d845f113b3d1c83602" title="RegisterStandardAliases() registers all of the built-in aliases for a standard namespace...">RegisterStandardAliases</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS );
+<a name="l00467"></a>00467
+<a name="l00469"></a>00469
+<a name="l00470"></a>00470 <span class="comment">// =============================================================================================</span>
+<a name="l00471"></a>00471 <span class="comment">// Basic property manipulation functions</span>
+<a name="l00472"></a>00472 <span class="comment">// =====================================</span>
+<a name="l00473"></a>00473
+<a name="l00474"></a>00474 <span class="comment">// *** Should add discussion of schemaNS and propName prefix usage.</span>
+<a name="l00475"></a>00475
+<a name="l00476"></a>00476 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00491"></a>00491 <span class="comment"></span>
+<a name="l00492"></a>00492 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00523"></a>00523 <span class="comment"></span>
+<a name="l00524"></a>00524 <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00525"></a>00525 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l00526"></a>00526 tStringObj * propValue,
+<a name="l00527"></a>00527 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
+<a name="l00528"></a>00528
+<a name="l00529"></a>00529 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00551"></a>00551 <span class="comment"></span>
+<a name="l00552"></a>00552 <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#c64a4251d157937f69b73f2ffac4f7cc" title="GetArrayItem() provides access to items within an array.">GetArrayItem</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00553"></a>00553 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> arrayName,
+<a name="l00554"></a>00554 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315" title="The type for offsets and indices. A 32-bit signed integer. It is signed to allow...">XMP_Index</a> itemIndex,
+<a name="l00555"></a>00555 tStringObj * itemValue,
+<a name="l00556"></a>00556 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
+<a name="l00557"></a>00557
+<a name="l00558"></a>00558 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00583"></a>00583 <span class="comment"></span>
+<a name="l00584"></a>00584 <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#885ef7127b897e349f71fa493ace3c94" title="GetStructField() provides access to fields within a nested structure.">GetStructField</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00585"></a>00585 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> structName,
+<a name="l00586"></a>00586 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldNS,
+<a name="l00587"></a>00587 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldName,
+<a name="l00588"></a>00588 tStringObj * fieldValue,
+<a name="l00589"></a>00589 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
+<a name="l00590"></a>00590
+<a name="l00591"></a>00591 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00616"></a>00616 <span class="comment"></span>
+<a name="l00617"></a>00617 <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#2cc58d8316043b035643e7c21633bc13" title="GetQualifier() provides access to a qualifier attached to a property.">GetQualifier</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00618"></a>00618 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l00619"></a>00619 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> qualNS,
+<a name="l00620"></a>00620 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> qualName,
+<a name="l00621"></a>00621 tStringObj * qualValue,
+<a name="l00622"></a>00622 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
+<a name="l00623"></a>00623
+<a name="l00625"></a>00625
+<a name="l00626"></a>00626 <span class="comment">// =============================================================================================</span>
+<a name="l00627"></a>00627
+<a name="l00628"></a>00628 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00640"></a>00640 <span class="comment"></span>
+<a name="l00654"></a>00654
+<a name="l00655"></a>00655 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00672"></a>00672 <span class="comment"></span>
+<a name="l00673"></a>00673 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#1dfd6a08ebfd1a6364b3a7b6584bcc28" title="SetProperty() creates or sets a property value.">SetProperty</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00674"></a>00674 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l00675"></a>00675 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propValue,
+<a name="l00676"></a>00676 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l00677"></a>00677
+<a name="l00678"></a>00678 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00683"></a>00683 <span class="comment"></span>
+<a name="l00684"></a>00684 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#1dfd6a08ebfd1a6364b3a7b6584bcc28" title="SetProperty() creates or sets a property value.">SetProperty</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00685"></a>00685 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l00686"></a>00686 <span class="keyword">const</span> tStringObj &amp; propValue,
+<a name="l00687"></a>00687 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l00688"></a>00688
+<a name="l00689"></a>00689 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00717"></a>00717 <span class="comment"></span>
+<a name="l00718"></a>00718 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#1570eb89d613b4a94ca572e4644168cc" title="SetArrayItem() creates or sets the value of an item within an array.">SetArrayItem</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00719"></a>00719 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> arrayName,
+<a name="l00720"></a>00720 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315" title="The type for offsets and indices. A 32-bit signed integer. It is signed to allow...">XMP_Index</a> itemIndex,
+<a name="l00721"></a>00721 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> itemValue,
+<a name="l00722"></a>00722 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l00723"></a>00723
+<a name="l00724"></a>00724 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00729"></a>00729 <span class="comment"></span>
+<a name="l00730"></a>00730 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#1570eb89d613b4a94ca572e4644168cc" title="SetArrayItem() creates or sets the value of an item within an array.">SetArrayItem</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00731"></a>00731 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> arrayName,
+<a name="l00732"></a>00732 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315" title="The type for offsets and indices. A 32-bit signed integer. It is signed to allow...">XMP_Index</a> itemIndex,
+<a name="l00733"></a>00733 <span class="keyword">const</span> tStringObj &amp; itemValue,
+<a name="l00734"></a>00734 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l00735"></a>00735
+<a name="l00736"></a>00736 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00762"></a>00762 <span class="comment"></span>
+<a name="l00763"></a>00763 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#00d7314dc970ad390499ce9db27d314a" title="AppendArrayItem() adds an item to an array, creating the array if necessary.">AppendArrayItem</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00764"></a>00764 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> arrayName,
+<a name="l00765"></a>00765 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> arrayOptions,
+<a name="l00766"></a>00766 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> itemValue,
+<a name="l00767"></a>00767 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> itemOptions = 0 );
+<a name="l00768"></a>00768
+<a name="l00769"></a>00769 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00775"></a>00775 <span class="comment"></span>
+<a name="l00776"></a>00776 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#00d7314dc970ad390499ce9db27d314a" title="AppendArrayItem() adds an item to an array, creating the array if necessary.">AppendArrayItem</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00777"></a>00777 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> arrayName,
+<a name="l00778"></a>00778 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> arrayOptions,
+<a name="l00779"></a>00779 <span class="keyword">const</span> tStringObj &amp; itemValue,
+<a name="l00780"></a>00780 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> itemOptions = 0 );
+<a name="l00781"></a>00781
+<a name="l00782"></a>00782 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00807"></a>00807 <span class="comment"></span>
+<a name="l00808"></a>00808 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#0e44c30e7527064909e5f7035d53c4f5" title="SetStructField() creates or sets the value of a field within a nested structure.">SetStructField</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00809"></a>00809 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> structName,
+<a name="l00810"></a>00810 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldNS,
+<a name="l00811"></a>00811 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldName,
+<a name="l00812"></a>00812 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldValue,
+<a name="l00813"></a>00813 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l00814"></a>00814
+<a name="l00815"></a>00815 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00821"></a>00821 <span class="comment"></span>
+<a name="l00822"></a>00822 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#0e44c30e7527064909e5f7035d53c4f5" title="SetStructField() creates or sets the value of a field within a nested structure.">SetStructField</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00823"></a>00823 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> structName,
+<a name="l00824"></a>00824 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldNS,
+<a name="l00825"></a>00825 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldName,
+<a name="l00826"></a>00826 <span class="keyword">const</span> tStringObj &amp; fieldValue,
+<a name="l00827"></a>00827 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l00828"></a>00828
+<a name="l00829"></a>00829 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00854"></a>00854 <span class="comment"></span>
+<a name="l00855"></a>00855 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#c2e798da5f9d94e486382a41e73fcea3" title="SetQualifier() creates or sets a qualifier attached to a property.">SetQualifier</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00856"></a>00856 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l00857"></a>00857 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> qualNS,
+<a name="l00858"></a>00858 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> qualName,
+<a name="l00859"></a>00859 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> qualValue,
+<a name="l00860"></a>00860 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l00861"></a>00861
+<a name="l00862"></a>00862 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00867"></a>00867 <span class="comment"></span>
+<a name="l00868"></a>00868 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#c2e798da5f9d94e486382a41e73fcea3" title="SetQualifier() creates or sets a qualifier attached to a property.">SetQualifier</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00869"></a>00869 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l00870"></a>00870 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> qualNS,
+<a name="l00871"></a>00871 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> qualName,
+<a name="l00872"></a>00872 <span class="keyword">const</span> tStringObj &amp; qualValue,
+<a name="l00873"></a>00873 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l00874"></a>00874
+<a name="l00876"></a>00876
+<a name="l00877"></a>00877 <span class="comment">// =============================================================================================</span>
+<a name="l00878"></a>00878
+<a name="l00879"></a>00879 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00885"></a>00885 <span class="comment"></span>
+<a name="l00886"></a>00886 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00894"></a>00894 <span class="comment"></span>
+<a name="l00895"></a>00895 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#c8b555ba99904fa49bb4851a60cc3844" title="DeleteProperty() deletes an XMP subtree rooted at a given property.">DeleteProperty</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00896"></a>00896 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName );
+<a name="l00897"></a>00897
+<a name="l00898"></a>00898 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00911"></a>00911 <span class="comment"></span>
+<a name="l00912"></a>00912 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#bc1211f47225b5973a170ff952743264" title="DeleteArrayItem() deletes an XMP subtree rooted at a given array item.">DeleteArrayItem</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00913"></a>00913 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> arrayName,
+<a name="l00914"></a>00914 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315" title="The type for offsets and indices. A 32-bit signed integer. It is signed to allow...">XMP_Index</a> itemIndex );
+<a name="l00915"></a>00915
+<a name="l00916"></a>00916 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00931"></a>00931 <span class="comment"></span>
+<a name="l00932"></a>00932 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#bc258e027780a15be65a88fcfd4e1fd4" title="DeleteStructField() deletes an XMP subtree rooted at a given struct field.">DeleteStructField</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00933"></a>00933 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> structName,
+<a name="l00934"></a>00934 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldNS,
+<a name="l00935"></a>00935 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldName );
+<a name="l00936"></a>00936
+<a name="l00937"></a>00937 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00953"></a>00953 <span class="comment"></span>
+<a name="l00954"></a>00954 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#8ce15f7de7fd3b258f07158ab5fa88be" title="DeleteQualifier() deletes an XMP subtree rooted at a given qualifier.">DeleteQualifier</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00955"></a>00955 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l00956"></a>00956 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> qualNS,
+<a name="l00957"></a>00957 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> qualName );
+<a name="l00958"></a>00958
+<a name="l00959"></a>00959 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00967"></a>00967 <span class="comment"></span>
+<a name="l00968"></a>00968 <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#f22b116d71ecbbebea016ec5337e7066" title="DoesPropertyExist() reports whether a property currently exists.">DoesPropertyExist</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00969"></a>00969 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName ) <span class="keyword">const</span>;
+<a name="l00970"></a>00970
+<a name="l00971"></a>00971 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00985"></a>00985 <span class="comment"></span>
+<a name="l00986"></a>00986 <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#492465c588d6d4cb8e30f94790e66f58" title="DoesArrayItemExist() reports whether an array item currently exists.">DoesArrayItemExist</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00987"></a>00987 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> arrayName,
+<a name="l00988"></a>00988 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315" title="The type for offsets and indices. A 32-bit signed integer. It is signed to allow...">XMP_Index</a> itemIndex ) <span class="keyword">const</span>;
+<a name="l00989"></a>00989
+<a name="l00990"></a>00990 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01007"></a>01007 <span class="comment"></span>
+<a name="l01008"></a>01008 <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#9261b80d62e77a10ff1a89843bfa10a5" title="DoesStructFieldExist() reports whether a struct field currently exists.">DoesStructFieldExist</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l01009"></a>01009 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> structName,
+<a name="l01010"></a>01010 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldNS,
+<a name="l01011"></a>01011 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldName ) <span class="keyword">const</span>;
+<a name="l01012"></a>01012
+<a name="l01013"></a>01013 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01029"></a>01029 <span class="comment"></span>
+<a name="l01030"></a>01030 <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#81347a92becd387a14f4d47c582f129a" title="DoesQualifierExist() reports whether a qualifier currently exists.">DoesQualifierExist</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l01031"></a>01031 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l01032"></a>01032 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> qualNS,
+<a name="l01033"></a>01033 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> qualName ) <span class="keyword">const</span>;
+<a name="l01034"></a>01034
+<a name="l01036"></a>01036
+<a name="l01037"></a>01037 <span class="comment">// =============================================================================================</span>
+<a name="l01038"></a>01038 <span class="comment">// Specialized Get and Set functions</span>
+<a name="l01039"></a>01039 <span class="comment">// =============================================================================================</span>
+<a name="l01040"></a>01040
+<a name="l01041"></a>01041 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01050"></a>01050 <span class="comment"></span>
+<a name="l01051"></a>01051 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01070"></a>01070 <span class="comment"></span>
+<a name="l01071"></a>01071 <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#dcf8a1959a8bd42641a42cbd4d64a5b7" title="GetProperty_Bool() retrieves the value of a Boolean property as a C++ bool.">GetProperty_Bool</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l01072"></a>01072 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l01073"></a>01073 <span class="keywordtype">bool</span> * propValue,
+<a name="l01074"></a>01074 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
+<a name="l01075"></a>01075
+<a name="l01076"></a>01076 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01095"></a>01095 <span class="comment"></span>
+<a name="l01096"></a>01096 <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#3b6ba486c02607b544917091c43b05cc" title="GetProperty_Int() retrieves the value of an integer property as a C long integer...">GetProperty_Int</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l01097"></a>01097 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l01098"></a>01098 <span class="keywordtype">long</span> * propValue,
+<a name="l01099"></a>01099 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
+<a name="l01100"></a>01100
+<a name="l01101"></a>01101 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01120"></a>01120 <span class="comment"></span>
+<a name="l01121"></a>01121 <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#669e0625cd271b6e7902fe0b51020402" title="GetProperty_Int64() retrieves the value of an integer property as a C long long integer...">GetProperty_Int64</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l01122"></a>01122 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l01123"></a>01123 <span class="keywordtype">long</span> <span class="keywordtype">long</span> * propValue,
+<a name="l01124"></a>01124 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
+<a name="l01125"></a>01125
+<a name="l01126"></a>01126 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01145"></a>01145 <span class="comment"></span>
+<a name="l01146"></a>01146 <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#7708c31c9af3e740b27a4893dcd9aa47" title="GetProperty_Float() retrieves the value of a floating-point property as a C double...">GetProperty_Float</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l01147"></a>01147 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l01148"></a>01148 <span class="keywordtype">double</span> * propValue,
+<a name="l01149"></a>01149 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
+<a name="l01150"></a>01150
+<a name="l01151"></a>01151 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01170"></a>01170 <span class="comment"></span>
+<a name="l01171"></a>01171 <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#2f561295e73047ee90765558d29bd650" title="GetProperty_Date() retrieves the value of a date-time property as an XMP_DateTime...">GetProperty_Date</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l01172"></a>01172 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l01173"></a>01173 <a class="code" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a> * propValue,
+<a name="l01174"></a>01174 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
+<a name="l01175"></a>01175
+<a name="l01176"></a>01176 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01192"></a>01192 <span class="comment"></span>
+<a name="l01193"></a>01193 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#9521e3838272ec501ffdb60ff3eb482f" title="SetProperty_Bool() sets the value of a Boolean property using a C++ bool.">SetProperty_Bool</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l01194"></a>01194 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l01195"></a>01195 <span class="keywordtype">bool</span> propValue,
+<a name="l01196"></a>01196 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l01197"></a>01197
+<a name="l01198"></a>01198 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01214"></a>01214 <span class="comment"></span>
+<a name="l01215"></a>01215 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#b8ae94130d9a05c1b9a3ee25588b6421" title="SetProperty_Int() sets the value of an integer property using a C long integer.">SetProperty_Int</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l01216"></a>01216 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l01217"></a>01217 <span class="keywordtype">long</span> propValue,
+<a name="l01218"></a>01218 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l01219"></a>01219
+<a name="l01220"></a>01220 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01236"></a>01236 <span class="comment"></span>
+<a name="l01237"></a>01237 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#df919aff205e934e4c8250a067f7b377" title="SetProperty_Int64() sets the value of an integer property using a C long long integer...">SetProperty_Int64</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l01238"></a>01238 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l01239"></a>01239 <span class="keywordtype">long</span> <span class="keywordtype">long</span> propValue,
+<a name="l01240"></a>01240 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l01241"></a>01241
+<a name="l01242"></a>01242 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01258"></a>01258 <span class="comment"></span>
+<a name="l01259"></a>01259 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#3b0f2f6bae57931ea96775f03608c0ed" title="SetProperty_Float() sets the value of a floating-point property using a C double...">SetProperty_Float</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l01260"></a>01260 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l01261"></a>01261 <span class="keywordtype">double</span> propValue,
+<a name="l01262"></a>01262 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l01263"></a>01263
+<a name="l01264"></a>01264 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01280"></a>01280 <span class="comment"></span>
+<a name="l01281"></a>01281 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#eee10669445f77139d5634199ff01079" title="SetProperty_Date() sets the value of a date/time property using an XMP_DateTime structure...">SetProperty_Date</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l01282"></a>01282 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l01283"></a>01283 <span class="keyword">const</span> <a class="code" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a> &amp; propValue,
+<a name="l01284"></a>01284 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l01285"></a>01285
+<a name="l01287"></a>01287 <span class="comment">// =============================================================================================</span>
+<a name="l01326"></a>01326 <span class="comment"></span>
+<a name="l01327"></a>01327 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01368"></a>01368 <span class="comment"></span>
+<a name="l01369"></a>01369 <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#eefe49bbf669770d769f4fe0ea566bd0" title="GetLocalizedText() retrieves information about a selected item in an alt-text array...">GetLocalizedText</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l01370"></a>01370 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> altTextName,
+<a name="l01371"></a>01371 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> genericLang,
+<a name="l01372"></a>01372 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> specificLang,
+<a name="l01373"></a>01373 tStringObj * actualLang,
+<a name="l01374"></a>01374 tStringObj * itemValue,
+<a name="l01375"></a>01375 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
+<a name="l01376"></a>01376
+<a name="l01377"></a>01377 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01435"></a>01435 <span class="comment"></span>
+<a name="l01436"></a>01436 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19" title="SetLocalizedText() modifies the value of a selected item in an alt-text array.">SetLocalizedText</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l01437"></a>01437 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> altTextName,
+<a name="l01438"></a>01438 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> genericLang,
+<a name="l01439"></a>01439 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> specificLang,
+<a name="l01440"></a>01440 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> itemValue,
+<a name="l01441"></a>01441 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l01442"></a>01442
+<a name="l01443"></a>01443 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01500"></a>01500 <span class="comment"></span>
+<a name="l01501"></a>01501 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19" title="SetLocalizedText() modifies the value of a selected item in an alt-text array.">SetLocalizedText</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l01502"></a>01502 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> altTextName,
+<a name="l01503"></a>01503 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> genericLang,
+<a name="l01504"></a>01504 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> specificLang,
+<a name="l01505"></a>01505 <span class="keyword">const</span> tStringObj &amp; itemValue,
+<a name="l01506"></a>01506 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l01507"></a>01507
+<a name="l01509"></a>01509
+<a name="l01510"></a>01510 <span class="comment">// =============================================================================================</span>
+<a name="l01522"></a>01522 <span class="comment"></span>
+<a name="l01523"></a>01523 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01547"></a>01547 <span class="comment"></span>
+<a name="l01548"></a>01548 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26" title="ParseFromBuffer() parses RDF from a series of input buffers into this XMP object...">ParseFromBuffer</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> buffer,
+<a name="l01549"></a>01549 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a" title="The type for string length parameters. A 32-bit unsigned integer, as big as will...">XMP_StringLen</a> bufferSize,
+<a name="l01550"></a>01550 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l01551"></a>01551
+<a name="l01552"></a>01552 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01595"></a>01595 <span class="comment"></span>
+<a name="l01596"></a>01596 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49" title="SerializeToBuffer() serializes metadata in this XMP object into a string as RDF.">SerializeToBuffer</a> ( tStringObj * rdfString,
+<a name="l01597"></a>01597 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options,
+<a name="l01598"></a>01598 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a" title="The type for string length parameters. A 32-bit unsigned integer, as big as will...">XMP_StringLen</a> padding,
+<a name="l01599"></a>01599 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> newline,
+<a name="l01600"></a>01600 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> indent = <span class="stringliteral">""</span>,
+<a name="l01601"></a>01601 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315" title="The type for offsets and indices. A 32-bit signed integer. It is signed to allow...">XMP_Index</a> baseIndent = 0 ) <span class="keyword">const</span>;
+<a name="l01602"></a>01602
+<a name="l01603"></a>01603 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01638"></a>01638 <span class="comment"></span>
+<a name="l01639"></a>01639 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49" title="SerializeToBuffer() serializes metadata in this XMP object into a string as RDF.">SerializeToBuffer</a> ( tStringObj * rdfString,
+<a name="l01640"></a>01640 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0,
+<a name="l01641"></a>01641 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a" title="The type for string length parameters. A 32-bit unsigned integer, as big as will...">XMP_StringLen</a> padding = 0 ) <span class="keyword">const</span>;
+<a name="l01642"></a>01642
+<a name="l01644"></a>01644 <span class="comment">// =============================================================================================</span>
+<a name="l01645"></a>01645 <span class="comment">// Miscellaneous Member Functions</span>
+<a name="l01646"></a>01646 <span class="comment">// ==============================</span>
+<a name="l01647"></a>01647
+<a name="l01648"></a>01648 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01651"></a>01651 <span class="comment"></span>
+<a name="l01652"></a>01652 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01684"></a>01684 <span class="comment"></span>
+<a name="l01685"></a>01685 <a class="code" href="XMP__Const_8h.html#549d5e2cbcb58302d3df840a0205283e">XMPMetaRef</a> <a class="code" href="classTXMPMeta.html#fbfebded0b85b08bd9c5ba0d7dae07e0" title="Retrieves an internal reference that can be safely passed across DLL boundaries and...">GetInternalRef</a>() <span class="keyword">const</span>;
+<a name="l01686"></a>01686
+<a name="l01687"></a>01687 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01693"></a>01693 <span class="comment"></span>
+<a name="l01694"></a>01694 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#b0d179ed95487d4fd4f2680c1fbe0d40" title="GetObjectName() retrieves the client-assigned name of this XMP object.">GetObjectName</a> ( tStringObj * name ) <span class="keyword">const</span>;
+<a name="l01695"></a>01695
+<a name="l01696"></a>01696 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01702"></a>01702 <span class="comment"></span>
+<a name="l01703"></a>01703 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#cf1935be8e4849976dfc02325424960a" title="SetObjectName() assigns a name to this XMP object.">SetObjectName</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> name );
+<a name="l01704"></a>01704
+<a name="l01705"></a>01705 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01711"></a>01711 <span class="comment"></span>
+<a name="l01712"></a>01712 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#cf1935be8e4849976dfc02325424960a" title="SetObjectName() assigns a name to this XMP object.">SetObjectName</a> ( tStringObj name );
+<a name="l01713"></a>01713
+<a name="l01714"></a>01714 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01725"></a>01725 <span class="comment"></span>
+<a name="l01726"></a>01726 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#8ac5a02a13d439ff33ed4431986da681" title="Sort() sorts the data model tree of an XMP object.">Sort</a>();
+<a name="l01727"></a>01727
+<a name="l01728"></a>01728 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01730"></a>01730 <span class="comment"></span>
+<a name="l01731"></a>01731 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#df57895625ad118782ed48a3931848b7" title="Erase() restores the object to a &amp;quot;just constructed&amp;quot; state.">Erase</a>();
+<a name="l01732"></a>01732
+<a name="l01733"></a>01733 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01757"></a>01757 <span class="comment"></span>
+<a name="l01758"></a>01758 <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a> <a class="code" href="classTXMPMeta.html#6ca653436995bbb76315efe7934afd4c" title="Clone() creates a deep copy of an XMP object.">Clone</a> ( <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 ) <span class="keyword">const</span>;
+<a name="l01759"></a>01759
+<a name="l01760"></a>01760 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01769"></a>01769 <span class="comment"></span>
+<a name="l01770"></a>01770 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315" title="The type for offsets and indices. A 32-bit signed integer. It is signed to allow...">XMP_Index</a> <a class="code" href="classTXMPMeta.html#b79aae864b3ce190d0699252f48e0acc" title="CountArrayItems() reports the number of items currently defined in an array.">CountArrayItems</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l01771"></a>01771 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> arrayName ) <span class="keyword">const</span>;
+<a name="l01772"></a>01772
+<a name="l01773"></a>01773 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01786"></a>01786 <span class="comment"></span>
+<a name="l01787"></a>01787 <a class="code" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Status</a> <a class="code" href="classTXMPMeta.html#466fa349c9765f39ca6b1450908e769f" title="DumpObject() outputs the content of an XMP object to a callback handler for debugging...">DumpObject</a> ( <a class="code" href="XMP__Const_8h.html#8ce3570e6e5ac14cd603e96fa9d2936f">XMP_TextOutputProc</a> outProc,
+<a name="l01788"></a>01788 <span class="keywordtype">void</span> * clientData ) <span class="keyword">const</span>;
+<a name="l01789"></a>01789
+<a name="l01790"></a>01790 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01792"></a>01792 <span class="comment"></span> <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> <a class="code" href="classTXMPMeta.html#0bfc04142a35671a4c8989fcaca6d6c2" title="Not implemented.">GetObjectOptions</a>() <span class="keyword">const</span>;
+<a name="l01793"></a>01793
+<a name="l01794"></a>01794 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l01796"></a>01796 <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#92055b3ae18dfd5e5491108f59318f17" title="Not implemented.">SetObjectOptions</a> ( <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options );
+<a name="l01797"></a>01797
+<a name="l01799"></a>01799
+<a name="l01800"></a>01800 <span class="comment">// =============================================================================================</span>
+<a name="l01801"></a>01801
+<a name="l01802"></a>01802 <a class="code" href="XMP__Const_8h.html#549d5e2cbcb58302d3df840a0205283e">XMPMetaRef</a> xmpRef; <span class="comment">// *** Should be private, see below.</span>
+<a name="l01803"></a>01803
+<a name="l01804"></a>01804 <span class="keyword">private</span>:
+<a name="l01805"></a>01805
+<a name="l01806"></a>01806 <span class="preprocessor">#if 0 // *** VS.Net and gcc seem to not handle the friend declarations properly.</span>
+<a name="l01807"></a>01807 <span class="preprocessor"></span> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a> &lt;class tStringObj&gt;;
+<a name="l01808"></a>01808 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a> &lt;class tStringObj&gt;;
+<a name="l01809"></a>01809 <span class="preprocessor">#endif</span>
+<a name="l01810"></a>01810 <span class="preprocessor"></span>
+<a name="l01811"></a>01811 }; <span class="comment">// class TXMPMeta</span>
+<a name="l01812"></a>01812
+<a name="l01813"></a>01813 <span class="preprocessor">#endif // __TXMPMeta_hpp__</span>
+</pre></div></div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/TXMPMeta_8hpp.html b/docs/API/TXMPMeta_8hpp.html
new file mode 100644
index 0000000..40ddaf7
--- /dev/null
+++ b/docs/API/TXMPMeta_8hpp.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: TXMPMeta.hpp File Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>TXMPMeta.hpp File Reference</h1>API for access to the XMP Toolkit core services. <a href="#_details">More...</a>
+<p>
+
+<p>
+<a href="TXMPMeta_8hpp-source.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">API for access to the XMP Toolkit core services. <a href="classTXMPMeta.html#_details">More...</a><br></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+API for access to the XMP Toolkit core services.
+<p>
+<code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> is the template class providing the core services of the XMP Toolkit. It must be instantiated with a string class such as <code>std::string</code>. Read the Toolkit Overview for information about the overall architecture of the XMP API, and the documentation for <code>XMP.hpp</code> for specific instantiation instructions.<p>
+Access these functions through the concrete class, <code>SXMPMeta</code>. </div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/TXMPMeta_8incl__cpp.html b/docs/API/TXMPMeta_8incl__cpp.html
new file mode 100644
index 0000000..9f7b502
--- /dev/null
+++ b/docs/API/TXMPMeta_8incl__cpp.html
@@ -0,0 +1,82 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: TXMPMeta.incl_cpp File Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>TXMPMeta.incl_cpp File Reference</h1>The implementation of the <a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a> template class. <a href="#_details">More...</a>
+<p>
+<code>#include &quot;XMP.hpp&quot;</code><br>
+<code>#include &quot;client-glue/WXMP_Common.hpp&quot;</code><br>
+<code>#include &quot;client-glue/WXMPMeta.hpp&quot;</code><br>
+
+<p>
+<div class="dynheader">
+Include dependency graph for TXMPMeta.incl_cpp:</div>
+<div class="dynsection">
+<p><center><img src="TXMPMeta_8incl__cpp__incl.png" border="0" usemap="#TXMPMeta.incl_cpp_map" alt=""></center>
+</div>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+The implementation of the <a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a> template class.
+<p>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/TXMPMeta_8incl__cpp__incl.png b/docs/API/TXMPMeta_8incl__cpp__incl.png
new file mode 100644
index 0000000..4c9cc3e
--- /dev/null
+++ b/docs/API/TXMPMeta_8incl__cpp__incl.png
Binary files differ
diff --git a/docs/API/TXMPUtils_8hpp-source.html b/docs/API/TXMPUtils_8hpp-source.html
new file mode 100644
index 0000000..5a76a67
--- /dev/null
+++ b/docs/API/TXMPUtils_8hpp-source.html
@@ -0,0 +1,348 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: TXMPUtils.hpp Source File</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+<h1>TXMPUtils.hpp</h1><a href="TXMPUtils_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef __TXMPUtils_hpp__</span>
+<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define __TXMPUtils_hpp__ 1</span>
+<a name="l00003"></a>00003 <span class="preprocessor"></span>
+<a name="l00004"></a>00004 <span class="preprocessor">#if ( ! __XMP_hpp__ )</span>
+<a name="l00005"></a>00005 <span class="preprocessor"></span><span class="preprocessor"> #error "Do not directly include, use XMP.hpp"</span>
+<a name="l00006"></a>00006 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00007"></a>00007 <span class="preprocessor"></span>
+<a name="l00008"></a>00008 <span class="comment">// =================================================================================================</span>
+<a name="l00009"></a>00009 <span class="comment">// ADOBE SYSTEMS INCORPORATED</span>
+<a name="l00010"></a>00010 <span class="comment">// Copyright 2002-2008 Adobe Systems Incorporated</span>
+<a name="l00011"></a>00011 <span class="comment">// All Rights Reserved</span>
+<a name="l00012"></a>00012 <span class="comment">//</span>
+<a name="l00013"></a>00013 <span class="comment">// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms</span>
+<a name="l00014"></a>00014 <span class="comment">// of the Adobe license agreement accompanying it.</span>
+<a name="l00015"></a>00015 <span class="comment">// =================================================================================================</span>
+<a name="l00016"></a>00016
+<a name="l00017"></a>00017 <span class="comment">// =================================================================================================</span>
+<a name="l00024"></a>00024 <span class="comment"></span><span class="comment">// =================================================================================================</span>
+<a name="l00025"></a>00025
+<a name="l00026"></a>00026 <span class="comment">// =================================================================================================</span>
+<a name="l00047"></a>00047 <span class="comment"></span><span class="comment">// =================================================================================================</span>
+<a name="l00048"></a>00048
+<a name="l00049"></a><a class="code" href="classTXMPUtils.html">00049</a> <span class="keyword">template</span> &lt;<span class="keyword">class</span> tStringObj&gt; <span class="keyword">class </span><a class="code" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a> {
+<a name="l00050"></a>00050
+<a name="l00051"></a>00051 <span class="keyword">public</span>:
+<a name="l00052"></a>00052
+<a name="l00053"></a>00053 <span class="comment">// =============================================================================================</span>
+<a name="l00054"></a>00054 <span class="comment">// No constructors or destructor declared or needed</span>
+<a name="l00055"></a>00055 <span class="comment">// ================================================</span>
+<a name="l00056"></a>00056
+<a name="l00057"></a>00057 <span class="comment">// ============================================================================================</span>
+<a name="l00092"></a>00092 <span class="comment"></span>
+<a name="l00093"></a>00093 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00109"></a>00109 <span class="comment"></span>
+<a name="l00110"></a>00110 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#47fa195aa2e1457aa1f74f7e1ed06da6" title="ComposeArrayItemPath() composes the path expression for an item in an array.">ComposeArrayItemPath</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00111"></a>00111 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> arrayName,
+<a name="l00112"></a>00112 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315" title="The type for offsets and indices. A 32-bit signed integer. It is signed to allow...">XMP_Index</a> itemIndex,
+<a name="l00113"></a>00113 tStringObj * fullPath );
+<a name="l00114"></a>00114
+<a name="l00115"></a>00115 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00133"></a>00133 <span class="comment"></span>
+<a name="l00134"></a>00134 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#706eb85b8401b8682a01348f7e25ee3d" title="ComposeStructFieldPath() composes the path expression for a field in a struct.">ComposeStructFieldPath</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00135"></a>00135 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> structName,
+<a name="l00136"></a>00136 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldNS,
+<a name="l00137"></a>00137 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldName,
+<a name="l00138"></a>00138 tStringObj * fullPath );
+<a name="l00139"></a>00139
+<a name="l00140"></a>00140 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00159"></a>00159 <span class="comment"></span>
+<a name="l00160"></a>00160 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#40ae0ce2065fcb71725e37137884e172" title="ComposeQualifierPath() composes the path expression for a qualifier.">ComposeQualifierPath</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00161"></a>00161 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+<a name="l00162"></a>00162 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> qualNS,
+<a name="l00163"></a>00163 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> qualName,
+<a name="l00164"></a>00164 tStringObj * fullPath );
+<a name="l00165"></a>00165
+<a name="l00166"></a>00166 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00190"></a>00190 <span class="comment"></span>
+<a name="l00191"></a>00191 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#e4989e5c199a2a4287ee3ae89b872e69" title="ComposeLangSelector() composes the path expression to select an alternate item by...">ComposeLangSelector</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00192"></a>00192 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> arrayName,
+<a name="l00193"></a>00193 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> langName,
+<a name="l00194"></a>00194 tStringObj * fullPath );
+<a name="l00195"></a>00195
+<a name="l00196"></a>00196 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00220"></a>00220 <span class="comment"></span>
+<a name="l00221"></a>00221 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#e4989e5c199a2a4287ee3ae89b872e69" title="ComposeLangSelector() composes the path expression to select an alternate item by...">ComposeLangSelector</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00222"></a>00222 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> arrayName,
+<a name="l00223"></a>00223 <span class="keyword">const</span> tStringObj &amp; langName,
+<a name="l00224"></a>00224 tStringObj * fullPath );
+<a name="l00225"></a>00225
+<a name="l00226"></a>00226 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00260"></a>00260 <span class="comment"></span>
+<a name="l00261"></a>00261 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#458f8e8729e2334fe54ca8f691a9db23" title="ComposeFieldSelector() composes a path expression to select an alternate item by...">ComposeFieldSelector</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00262"></a>00262 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> arrayName,
+<a name="l00263"></a>00263 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldNS,
+<a name="l00264"></a>00264 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldName,
+<a name="l00265"></a>00265 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldValue,
+<a name="l00266"></a>00266 tStringObj * fullPath );
+<a name="l00267"></a>00267
+<a name="l00268"></a>00268 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00302"></a>00302 <span class="comment"></span>
+<a name="l00303"></a>00303 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#458f8e8729e2334fe54ca8f691a9db23" title="ComposeFieldSelector() composes a path expression to select an alternate item by...">ComposeFieldSelector</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00304"></a>00304 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> arrayName,
+<a name="l00305"></a>00305 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldNS,
+<a name="l00306"></a>00306 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> fieldName,
+<a name="l00307"></a>00307 <span class="keyword">const</span> tStringObj &amp; fieldValue,
+<a name="l00308"></a>00308 tStringObj * fullPath );
+<a name="l00309"></a>00309
+<a name="l00311"></a>00311
+<a name="l00312"></a>00312 <span class="comment">// =============================================================================================</span>
+<a name="l00324"></a>00324 <span class="comment"></span>
+<a name="l00325"></a>00325 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00334"></a>00334 <span class="comment"></span>
+<a name="l00335"></a>00335 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#509691eb270988de6a770c9c8304ab6b" title="ConvertFromBool() converts a Boolean value to a string.">ConvertFromBool</a> ( <span class="keywordtype">bool</span> binValue,
+<a name="l00336"></a>00336 tStringObj * strValue );
+<a name="l00337"></a>00337
+<a name="l00338"></a>00338 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00346"></a>00346 <span class="comment"></span>
+<a name="l00347"></a>00347 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#eec45b4d1a26717290105c9f4e8b4235" title="ConvertFromInt() converts a 32-bit integer value to a string.">ConvertFromInt</a> ( <span class="keywordtype">long</span> binValue,
+<a name="l00348"></a>00348 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> format,
+<a name="l00349"></a>00349 tStringObj * strValue );
+<a name="l00350"></a>00350 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00358"></a>00358 <span class="comment"></span>
+<a name="l00359"></a>00359 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#eae4617e05358433015eaa80953c5e60" title="ConvertFromInt64() converts a 64-bit integer value to a string.">ConvertFromInt64</a> ( <span class="keywordtype">long</span> <span class="keywordtype">long</span> binValue,
+<a name="l00360"></a>00360 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> format,
+<a name="l00361"></a>00361 tStringObj * strValue );
+<a name="l00362"></a>00362
+<a name="l00363"></a>00363 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00371"></a>00371 <span class="comment"></span>
+<a name="l00372"></a>00372 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#e67ef3931836432b7e574832f0610ed0" title="ConvertFromFloat() converts a floating-point value to a string.">ConvertFromFloat</a> ( <span class="keywordtype">double</span> binValue,
+<a name="l00373"></a>00373 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> format,
+<a name="l00374"></a>00374 tStringObj * strValue );
+<a name="l00375"></a>00375
+<a name="l00376"></a>00376 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00407"></a>00407 <span class="comment"></span>
+<a name="l00408"></a>00408 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#6146a522a3974b4088d6e8241e9cd223" title="ConvertFromDate() converts a date/time value to a string.">ConvertFromDate</a> ( <span class="keyword">const</span> <a class="code" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a> &amp; binValue,
+<a name="l00409"></a>00409 tStringObj * strValue );
+<a name="l00410"></a>00410
+<a name="l00411"></a>00411 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00421"></a>00421 <span class="comment"></span>
+<a name="l00422"></a>00422 <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classTXMPUtils.html#aaaaadb23f4089daa795f50cba4f405c" title="ConvertToBool() converts a string to a Boolean value.">ConvertToBool</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> strValue );
+<a name="l00423"></a>00423
+<a name="l00424"></a>00424 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00433"></a>00433 <span class="comment"></span>
+<a name="l00434"></a>00434 <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classTXMPUtils.html#aaaaadb23f4089daa795f50cba4f405c" title="ConvertToBool() converts a string to a Boolean value.">ConvertToBool</a> ( <span class="keyword">const</span> tStringObj &amp; strValue );
+<a name="l00435"></a>00435
+<a name="l00436"></a>00436 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00442"></a>00442 <span class="comment"></span>
+<a name="l00443"></a>00443 <span class="keyword">static</span> <span class="keywordtype">long</span> <a class="code" href="classTXMPUtils.html#dfd9d1c522377d5db4ad667a7973ba00" title="ConvertToInt() converts a string to a 32-bit integer value.">ConvertToInt</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> strValue );
+<a name="l00444"></a>00444
+<a name="l00445"></a>00445 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00454"></a>00454 <span class="comment"></span>
+<a name="l00455"></a>00455 <span class="keyword">static</span> <span class="keywordtype">long</span> <a class="code" href="classTXMPUtils.html#dfd9d1c522377d5db4ad667a7973ba00" title="ConvertToInt() converts a string to a 32-bit integer value.">ConvertToInt</a> ( <span class="keyword">const</span> tStringObj &amp; strValue );
+<a name="l00456"></a>00456
+<a name="l00457"></a>00457 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00463"></a>00463 <span class="comment"></span>
+<a name="l00464"></a>00464 <span class="keyword">static</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <a class="code" href="classTXMPUtils.html#be5d2dcc03c5442202203bba5ca7b172" title="ConvertToInt64() converts a string to a 64-bit integer value.">ConvertToInt64</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> strValue );
+<a name="l00465"></a>00465
+<a name="l00466"></a>00466 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00475"></a>00475 <span class="comment"></span>
+<a name="l00476"></a>00476 <span class="keyword">static</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <a class="code" href="classTXMPUtils.html#be5d2dcc03c5442202203bba5ca7b172" title="ConvertToInt64() converts a string to a 64-bit integer value.">ConvertToInt64</a> ( <span class="keyword">const</span> tStringObj &amp; strValue );
+<a name="l00477"></a>00477
+<a name="l00478"></a>00478 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00484"></a>00484 <span class="comment"></span>
+<a name="l00485"></a>00485 <span class="keyword">static</span> <span class="keywordtype">double</span> <a class="code" href="classTXMPUtils.html#8a507b006286460814e0486c622d828c" title="ConvertToFloat() converts a string to a floating-point value.">ConvertToFloat</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> strValue );
+<a name="l00486"></a>00486
+<a name="l00487"></a>00487 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00496"></a>00496 <span class="comment"></span>
+<a name="l00497"></a>00497 <span class="keyword">static</span> <span class="keywordtype">double</span> <a class="code" href="classTXMPUtils.html#8a507b006286460814e0486c622d828c" title="ConvertToFloat() converts a string to a floating-point value.">ConvertToFloat</a> ( <span class="keyword">const</span> tStringObj &amp; strValue );
+<a name="l00498"></a>00498
+<a name="l00499"></a>00499 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00532"></a>00532 <span class="comment"></span>
+<a name="l00533"></a>00533 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#60d33e6ce30286028acca47b2b6e7a0b" title="ConvertToDate() converts a string to a date/time value.">ConvertToDate</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> strValue,
+<a name="l00534"></a>00534 <a class="code" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a> * binValue );
+<a name="l00535"></a>00535
+<a name="l00536"></a>00536 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00548"></a>00548 <span class="comment"></span>
+<a name="l00549"></a>00549 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#60d33e6ce30286028acca47b2b6e7a0b" title="ConvertToDate() converts a string to a date/time value.">ConvertToDate</a> ( <span class="keyword">const</span> tStringObj &amp; strValue,
+<a name="l00550"></a>00550 <a class="code" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a> * binValue );
+<a name="l00551"></a>00551
+<a name="l00553"></a>00553
+<a name="l00554"></a>00554 <span class="comment">// =============================================================================================</span>
+<a name="l00560"></a>00560 <span class="comment"></span>
+<a name="l00561"></a>00561 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00569"></a>00569 <span class="comment"></span>
+<a name="l00570"></a>00570 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#c83f0b963ea64d7eee0b481e15a8439c" title="CurrentDateTime() obtains the current date and time.">CurrentDateTime</a> ( <a class="code" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a> * time );
+<a name="l00571"></a>00571
+<a name="l00572"></a>00572 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00578"></a>00578 <span class="comment"></span>
+<a name="l00579"></a>00579 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#96bcc45febac55f6c49951815b7de2ef" title="SetTimeZone() sets the time zone in a date/time value to the local time zone.">SetTimeZone</a> ( <a class="code" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a> * time );
+<a name="l00580"></a>00580
+<a name="l00581"></a>00581 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00588"></a>00588 <span class="comment"></span>
+<a name="l00589"></a>00589 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#bbd4d691c83287ea2fc6b1e33e5858b8" title="ConvertToUTCTime() ensures that a time is UTC.">ConvertToUTCTime</a> ( <a class="code" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a> * time );
+<a name="l00590"></a>00590
+<a name="l00591"></a>00591 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00598"></a>00598 <span class="comment"></span>
+<a name="l00599"></a>00599 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#61852aaba494c8fbad5a6c0c4caf21f5" title="ConvertToLocalTime() ensures that a time is local.">ConvertToLocalTime</a> ( <a class="code" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a> * time );
+<a name="l00600"></a>00600
+<a name="l00601"></a>00601 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00612"></a>00612 <span class="comment"></span>
+<a name="l00613"></a>00613 <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="classTXMPUtils.html#9fc7f1771032f59f9020aeda4f91991d" title="CompareDateTime() compares the order of two date/time values.">CompareDateTime</a> ( <span class="keyword">const</span> <a class="code" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a> &amp; left,
+<a name="l00614"></a>00614 <span class="keyword">const</span> <a class="code" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a> &amp; right );
+<a name="l00615"></a>00615
+<a name="l00617"></a>00617
+<a name="l00618"></a>00618 <span class="comment">// =============================================================================================</span>
+<a name="l00623"></a>00623 <span class="comment"></span>
+<a name="l00624"></a>00624 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00632"></a>00632 <span class="comment"></span>
+<a name="l00633"></a>00633 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#ef3b23bbc152480f699e269620ecad4a" title="EncodeToBase64() converts a raw data value to a Base64-encoded string.">EncodeToBase64</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> rawStr,
+<a name="l00634"></a>00634 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a" title="The type for string length parameters. A 32-bit unsigned integer, as big as will...">XMP_StringLen</a> rawLen,
+<a name="l00635"></a>00635 tStringObj * encodedStr );
+<a name="l00636"></a>00636
+<a name="l00637"></a>00637 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00646"></a>00646 <span class="comment"></span>
+<a name="l00647"></a>00647 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#ef3b23bbc152480f699e269620ecad4a" title="EncodeToBase64() converts a raw data value to a Base64-encoded string.">EncodeToBase64</a> ( <span class="keyword">const</span> tStringObj &amp; rawStr,
+<a name="l00648"></a>00648 tStringObj * encodedStr );
+<a name="l00649"></a>00649
+<a name="l00650"></a>00650 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00658"></a>00658 <span class="comment"></span>
+<a name="l00659"></a>00659 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#e5bdd91c0c3ee9262dc0a8b9f591b921" title="DecodeFromBase64() Decodes a Base64-encoded string to raw data.">DecodeFromBase64</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> encodedStr,
+<a name="l00660"></a>00660 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a" title="The type for string length parameters. A 32-bit unsigned integer, as big as will...">XMP_StringLen</a> encodedLen,
+<a name="l00661"></a>00661 tStringObj * rawStr );
+<a name="l00662"></a>00662
+<a name="l00663"></a>00663 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00672"></a>00672 <span class="comment"></span>
+<a name="l00673"></a>00673 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#e5bdd91c0c3ee9262dc0a8b9f591b921" title="DecodeFromBase64() Decodes a Base64-encoded string to raw data.">DecodeFromBase64</a> ( <span class="keyword">const</span> tStringObj &amp; encodedStr,
+<a name="l00674"></a>00674 tStringObj * rawStr );
+<a name="l00675"></a>00675
+<a name="l00677"></a>00677
+<a name="l00678"></a>00678 <span class="comment">// =============================================================================================</span>
+<a name="l00679"></a>00679 <span class="comment">// =============================================================================================</span>
+<a name="l00687"></a>00687 <span class="comment"></span>
+<a name="l00688"></a>00688 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00707"></a>00707 <span class="comment"></span>
+<a name="l00708"></a>00708 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#6001b4ff54c60fdf0c40e6b78a5c457a" title="PackageForJPEG() creates XMP serializations appropriate for a JPEG file.">PackageForJPEG</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta&lt;tStringObj&gt;</a> &amp; xmpObj,
+<a name="l00709"></a>00709 tStringObj * standardXMP,
+<a name="l00710"></a>00710 tStringObj * extendedXMP,
+<a name="l00711"></a>00711 tStringObj * extendedDigest );
+<a name="l00712"></a>00712
+<a name="l00713"></a>00713 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00727"></a>00727 <span class="comment"></span>
+<a name="l00728"></a>00728 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#6187cd5fef0eccecac6805d4114dcd2e" title="MergeFromJPEG() merges standard and extended XMP retrieved from a JPEG file.">MergeFromJPEG</a> ( <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta&lt;tStringObj&gt;</a> * fullXMP,
+<a name="l00729"></a>00729 <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta&lt;tStringObj&gt;</a> &amp; extendedXMP );
+<a name="l00730"></a>00730
+<a name="l00732"></a>00732
+<a name="l00733"></a>00733 <span class="comment">// =============================================================================================</span>
+<a name="l00740"></a>00740 <span class="comment"></span>
+<a name="l00741"></a>00741 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00765"></a>00765 <span class="comment"></span>
+<a name="l00766"></a>00766 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#d7e1aa7928252fb88a24fb5c3aef22ba" title="CatenateArrayItems() creates a single edit string from a set of array item values...">CatenateArrayItems</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta&lt;tStringObj&gt;</a> &amp; xmpObj,
+<a name="l00767"></a>00767 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00768"></a>00768 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> arrayName,
+<a name="l00769"></a>00769 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> separator,
+<a name="l00770"></a>00770 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> quotes,
+<a name="l00771"></a>00771 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options,
+<a name="l00772"></a>00772 tStringObj * catedStr );
+<a name="l00773"></a>00773
+<a name="l00774"></a>00774 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00792"></a>00792 <span class="comment"></span>
+<a name="l00793"></a>00793 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#66c5ddee47aa36ed906353f94ca18d2e" title="SeparateArrayItems() updates an array from a concatenated edit string of values.">SeparateArrayItems</a> ( <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta&lt;tStringObj&gt;</a> * xmpObj,
+<a name="l00794"></a>00794 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00795"></a>00795 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> arrayName,
+<a name="l00796"></a>00796 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options,
+<a name="l00797"></a>00797 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> catedStr );
+<a name="l00798"></a>00798
+<a name="l00799"></a>00799 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00805"></a>00805 <span class="comment"></span>
+<a name="l00806"></a>00806 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#66c5ddee47aa36ed906353f94ca18d2e" title="SeparateArrayItems() updates an array from a concatenated edit string of values.">SeparateArrayItems</a> ( <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta&lt;tStringObj&gt;</a> * xmpObj,
+<a name="l00807"></a>00807 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+<a name="l00808"></a>00808 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> arrayName,
+<a name="l00809"></a>00809 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options,
+<a name="l00810"></a>00810 <span class="keyword">const</span> tStringObj &amp; catedStr );
+<a name="l00811"></a>00811
+<a name="l00812"></a>00812 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00843"></a>00843 <span class="comment"></span>
+<a name="l00844"></a>00844 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#40c645803530662e08d042b4b7c6190d" title="RemoveProperties() removes multiple properties from an XMP object.">RemoveProperties</a> ( <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta&lt;tStringObj&gt;</a> * xmpObj,
+<a name="l00845"></a>00845 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS = 0,
+<a name="l00846"></a>00846 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName = 0,
+<a name="l00847"></a>00847 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l00848"></a>00848
+<a name="l00849"></a>00849 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00920"></a>00920 <span class="comment"></span>
+<a name="l00921"></a>00921 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#4795244ffcbda927800f789b0e40c262" title="AppendProperties() adds or moves properties from one XMP object to another.">AppendProperties</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta&lt;tStringObj&gt;</a> &amp; source,
+<a name="l00922"></a>00922 <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta&lt;tStringObj&gt;</a> * dest,
+<a name="l00923"></a>00923 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l00924"></a>00924
+<a name="l00925"></a>00925 <span class="comment">// ---------------------------------------------------------------------------------------------</span>
+<a name="l00946"></a>00946 <span class="comment"></span>
+<a name="l00947"></a>00947 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPUtils.html#a17838f062e5414bc0929f67ac94a3aa" title="DuplicateSubtree() replicates a subtree from one XMP object into another.">DuplicateSubtree</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta&lt;tStringObj&gt;</a> &amp; source,
+<a name="l00948"></a>00948 <a class="code" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta&lt;tStringObj&gt;</a> * dest,
+<a name="l00949"></a>00949 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> sourceNS,
+<a name="l00950"></a>00950 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> sourceRoot,
+<a name="l00951"></a>00951 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> destNS = 0,
+<a name="l00952"></a>00952 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> destRoot = 0,
+<a name="l00953"></a>00953 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> options = 0 );
+<a name="l00954"></a>00954
+<a name="l00956"></a>00956
+<a name="l00957"></a>00957 <span class="comment">// =============================================================================================</span>
+<a name="l00958"></a>00958
+<a name="l00959"></a>00959 <span class="comment">// =============================================================================================</span>
+<a name="l00960"></a>00960
+<a name="l00961"></a>00961 }; <span class="comment">// class TXMPUtils</span>
+<a name="l00962"></a>00962
+<a name="l00963"></a>00963 <span class="comment">// =================================================================================================</span>
+<a name="l00964"></a>00964
+<a name="l00965"></a>00965 <span class="preprocessor">#endif // __TXMPUtils_hpp__</span>
+</pre></div></div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/TXMPUtils_8hpp.html b/docs/API/TXMPUtils_8hpp.html
new file mode 100644
index 0000000..5d966c5
--- /dev/null
+++ b/docs/API/TXMPUtils_8hpp.html
@@ -0,0 +1,78 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: TXMPUtils.hpp File Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>TXMPUtils.hpp File Reference</h1>API for access to the XMP Toolkit utility services. <a href="#_details">More...</a>
+<p>
+
+<p>
+<a href="TXMPUtils_8hpp-source.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">API for access to the XMP Toolkit utility services. <a href="classTXMPUtils.html#_details">More...</a><br></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+API for access to the XMP Toolkit utility services.
+<p>
+<code><a class="el" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a></code> is the template class providing utility services for the XMP Toolkit. It must be instantiated with a string class such as <code>std::string</code>. See the instructions in XMP.hpp, and the Overview for a discussion of the overall architecture of the XMP API. </div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/TXMPUtils_8incl__cpp.html b/docs/API/TXMPUtils_8incl__cpp.html
new file mode 100644
index 0000000..cbca67f
--- /dev/null
+++ b/docs/API/TXMPUtils_8incl__cpp.html
@@ -0,0 +1,82 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: TXMPUtils.incl_cpp File Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>TXMPUtils.incl_cpp File Reference</h1>The implementation of the <a class="el" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a> template class. <a href="#_details">More...</a>
+<p>
+<code>#include &quot;XMP.hpp&quot;</code><br>
+<code>#include &quot;client-glue/WXMP_Common.hpp&quot;</code><br>
+<code>#include &quot;client-glue/WXMPUtils.hpp&quot;</code><br>
+
+<p>
+<div class="dynheader">
+Include dependency graph for TXMPUtils.incl_cpp:</div>
+<div class="dynsection">
+<p><center><img src="TXMPUtils_8incl__cpp__incl.png" border="0" usemap="#TXMPUtils.incl_cpp_map" alt=""></center>
+</div>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+The implementation of the <a class="el" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a> template class.
+<p>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/TXMPUtils_8incl__cpp__incl.png b/docs/API/TXMPUtils_8incl__cpp__incl.png
new file mode 100644
index 0000000..edcb7c4
--- /dev/null
+++ b/docs/API/TXMPUtils_8incl__cpp__incl.png
Binary files differ
diff --git a/docs/API/XMP_8incl__cpp.html b/docs/API/XMP_8incl__cpp.html
new file mode 100644
index 0000000..6f70f9e
--- /dev/null
+++ b/docs/API/XMP_8incl__cpp.html
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: XMP.incl_cpp File Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>XMP.incl_cpp File Reference</h1>Overall client glue file for the XMP toolkit. <a href="#_details">More...</a>
+<p>
+<code>#include &quot;XMP.hpp&quot;</code><br>
+
+<p>
+<div class="dynheader">
+Include dependency graph for XMP.incl_cpp:</div>
+<div class="dynsection">
+<p><center><img src="XMP_8incl__cpp__incl.png" border="0" usemap="#XMP.incl_cpp_map" alt=""></center>
+</div>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+Overall client glue file for the XMP toolkit.
+<p>
+This is an overall client source file of XMP toolkit glue, the only XMP-specific one that clients should build in projects. This ensures that all of the client-side glue code for the XMP toolkit gets compiled.<p>
+You cannot compile this file directly, because the template's string type must be declared and only the client can do that. Instead, include this in some other source file. For example, to use <code>std::string</code> you only need these two lines:<p>
+<div class="fragment"><pre class="fragment"><span class="preprocessor"> #include &lt;string&gt;</span>
+<span class="preprocessor"> #include "<a class="code" href="XMP_8incl__cpp.html" title="Overall client glue file for the XMP toolkit.">XMP.incl_cpp</a>"</span>
+</pre></div> </div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/XMP_8incl__cpp__incl.png b/docs/API/XMP_8incl__cpp__incl.png
new file mode 100644
index 0000000..6f8ed4d
--- /dev/null
+++ b/docs/API/XMP_8incl__cpp__incl.png
Binary files differ
diff --git a/docs/API/XMP__Const_8h-source.html b/docs/API/XMP__Const_8h-source.html
new file mode 100644
index 0000000..e4ccf6e
--- /dev/null
+++ b/docs/API/XMP__Const_8h-source.html
@@ -0,0 +1,814 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: XMP_Const.h Source File</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+<h1>XMP_Const.h</h1><a href="XMP__Const_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef __XMP_Const_h__</span>
+<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define __XMP_Const_h__ 1</span>
+<a name="l00003"></a>00003 <span class="preprocessor"></span>
+<a name="l00004"></a>00004 <span class="comment">// =================================================================================================</span>
+<a name="l00005"></a>00005 <span class="comment">// Copyright 2002-2008 Adobe Systems Incorporated</span>
+<a name="l00006"></a>00006 <span class="comment">// All Rights Reserved.</span>
+<a name="l00007"></a>00007 <span class="comment">//</span>
+<a name="l00008"></a>00008 <span class="comment">// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms</span>
+<a name="l00009"></a>00009 <span class="comment">// of the Adobe license agreement accompanying it.</span>
+<a name="l00010"></a>00010 <span class="comment">// =================================================================================================</span>
+<a name="l00011"></a>00011
+<a name="l00012"></a>00012 <span class="preprocessor">#include "XMP_Environment.h"</span>
+<a name="l00013"></a>00013
+<a name="l00014"></a>00014 <span class="preprocessor"> #include &lt;stddef.h&gt;</span>
+<a name="l00015"></a>00015
+<a name="l00016"></a>00016 <span class="preprocessor">#if XMP_MacBuild // ! No stdint.h on Windows and some UNIXes.</span>
+<a name="l00017"></a>00017 <span class="preprocessor"></span><span class="preprocessor"> #include &lt;stdint.h&gt;</span>
+<a name="l00018"></a>00018 <span class="preprocessor">#endif</span>
+<a name="l00019"></a>00019 <span class="preprocessor"></span>
+<a name="l00020"></a>00020 <span class="preprocessor">#if __cplusplus</span>
+<a name="l00021"></a>00021 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {
+<a name="l00022"></a>00022 <span class="preprocessor">#endif</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="comment">// =================================================================================================</span>
+<a name="l00027"></a>00027 <span class="comment"></span><span class="comment">// =================================================================================================</span>
+<a name="l00028"></a>00028
+<a name="l00029"></a>00029 <span class="comment">// =================================================================================================</span>
+<a name="l00030"></a>00030 <span class="comment">// Basic types and constants</span>
+<a name="l00031"></a>00031 <span class="comment">// =========================</span>
+<a name="l00032"></a>00032
+<a name="l00033"></a>00033 <span class="comment">// The XMP_... types are used on the off chance that the ..._t types present a problem. In that</span>
+<a name="l00034"></a>00034 <span class="comment">// case only the declarations of the XMP_... types needs to change, not all of the uses. These</span>
+<a name="l00035"></a>00035 <span class="comment">// types are used where fixed sizes are required in order to have a known ABI for a DLL build.</span>
+<a name="l00036"></a>00036
+<a name="l00037"></a>00037 <span class="preprocessor">#if XMP_MacBuild</span>
+<a name="l00038"></a>00038 <span class="preprocessor"></span>
+<a name="l00039"></a>00039 <span class="keyword">typedef</span> int8_t XMP_Int8;
+<a name="l00040"></a>00040 <span class="keyword">typedef</span> int16_t XMP_Int16;
+<a name="l00041"></a>00041 <span class="keyword">typedef</span> int32_t XMP_Int32;
+<a name="l00042"></a>00042 <span class="keyword">typedef</span> int64_t XMP_Int64;
+<a name="l00043"></a>00043
+<a name="l00044"></a>00044 <span class="keyword">typedef</span> uint8_t XMP_Uns8;
+<a name="l00045"></a>00045 <span class="keyword">typedef</span> uint16_t XMP_Uns16;
+<a name="l00046"></a>00046 <span class="keyword">typedef</span> uint32_t XMP_Uns32;
+<a name="l00047"></a>00047 <span class="keyword">typedef</span> uint64_t XMP_Uns64;
+<a name="l00048"></a>00048
+<a name="l00049"></a>00049 <span class="preprocessor">#else</span>
+<a name="l00050"></a>00050 <span class="preprocessor"></span>
+<a name="l00051"></a>00051 <span class="keyword">typedef</span> <span class="keywordtype">signed</span> <span class="keywordtype">char</span> XMP_Int8;
+<a name="l00052"></a>00052 <span class="keyword">typedef</span> <span class="keywordtype">signed</span> <span class="keywordtype">short</span> XMP_Int16;
+<a name="l00053"></a>00053 <span class="keyword">typedef</span> <span class="keywordtype">signed</span> <span class="keywordtype">long</span> XMP_Int32;
+<a name="l00054"></a>00054 <span class="keyword">typedef</span> <span class="keywordtype">signed</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> XMP_Int64;
+<a name="l00055"></a>00055
+<a name="l00056"></a>00056 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> XMP_Uns8;
+<a name="l00057"></a>00057 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> XMP_Uns16;
+<a name="l00058"></a>00058 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> XMP_Uns32;
+<a name="l00059"></a>00059 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> XMP_Uns64;
+<a name="l00060"></a>00060
+<a name="l00061"></a>00061 <span class="preprocessor">#endif</span>
+<a name="l00062"></a>00062 <span class="preprocessor"></span>
+<a name="l00063"></a>00063 <span class="keyword">typedef</span> XMP_Uns8 XMP_Bool;
+<a name="l00064"></a>00064
+<a name="l00067"></a><a class="code" href="XMP__Const_8h.html#549d5e2cbcb58302d3df840a0205283e">00067</a> <span class="keyword">typedef</span> <span class="keyword">struct </span>__XMPMeta__ * <a class="code" href="XMP__Const_8h.html#549d5e2cbcb58302d3df840a0205283e">XMPMetaRef</a>;
+<a name="l00068"></a>00068
+<a name="l00071"></a><a class="code" href="XMP__Const_8h.html#6ade57a30fb1e40d6aa9695c440fc3d2">00071</a> <span class="keyword">typedef</span> <span class="keyword">struct </span>__XMPIterator__ * <a class="code" href="XMP__Const_8h.html#6ade57a30fb1e40d6aa9695c440fc3d2">XMPIteratorRef</a>;
+<a name="l00072"></a>00072
+<a name="l00075"></a><a class="code" href="XMP__Const_8h.html#b516453dd7d906e911f8951983cde5f1">00075</a> <span class="keyword">typedef</span> <span class="keyword">struct </span>__XMPDocOps__ * <a class="code" href="XMP__Const_8h.html#b516453dd7d906e911f8951983cde5f1">XMPDocOpsRef</a>;
+<a name="l00076"></a>00076
+<a name="l00079"></a><a class="code" href="XMP__Const_8h.html#a4bca98ad67d7a62c60cb13dbbab0f25">00079</a> <span class="keyword">typedef</span> <span class="keyword">struct </span>__XMPFiles__ * <a class="code" href="XMP__Const_8h.html#a4bca98ad67d7a62c60cb13dbbab0f25">XMPFilesRef</a>;
+<a name="l00080"></a>00080
+<a name="l00081"></a>00081 <span class="comment">// =================================================================================================</span>
+<a name="l00082"></a>00082
+<a name="l00085"></a>00085
+<a name="l00089"></a>00089
+<a name="l00093"></a>00093
+<a name="l00097"></a>00097
+<a name="l00104"></a>00104
+<a name="l00105"></a><a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">00105</a> <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a>; <span class="comment">// Points to a null terminated UTF-8 string.</span>
+<a name="l00106"></a><a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">00106</a> <span class="keyword">typedef</span> XMP_Uns32 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a" title="The type for string length parameters. A 32-bit unsigned integer, as big as will...">XMP_StringLen</a>;
+<a name="l00107"></a><a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">00107</a> <span class="keyword">typedef</span> XMP_Int32 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315" title="The type for offsets and indices. A 32-bit signed integer. It is signed to allow...">XMP_Index</a>; <span class="comment">// Signed, sometimes -1 is handy.</span>
+<a name="l00108"></a><a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">00108</a> <span class="keyword">typedef</span> XMP_Uns32 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a>; <span class="comment">// Used as 32 individual bits.</span>
+<a name="l00109"></a>00109
+<a name="l00114"></a>00114
+<a name="l00119"></a>00119
+<a name="l00120"></a><a class="code" href="XMP__Const_8h.html#4c39e0131b0e3d7db66e1cfa82b67141">00120</a> <span class="preprocessor">#define kXMP_TrueStr "True" // Serialized XMP spellings, not for the type bool.</span>
+<a name="l00121"></a><a class="code" href="XMP__Const_8h.html#2dc55b533ed63ed7ff0c3be16a97e278">00121</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_FalseStr "False"</span>
+<a name="l00122"></a>00122 <span class="preprocessor"></span>
+<a name="l00125"></a>00125 <span class="keyword">enum</span> {
+<a name="l00127"></a><a class="code" href="XMP__Const_8h.html#06fc87d81c62e9abb8790b6e5713c55bcf4bfe01497bd0d88c2af337e4bac39e">00127</a> <a class="code" href="XMP__Const_8h.html#06fc87d81c62e9abb8790b6e5713c55bcf4bfe01497bd0d88c2af337e4bac39e" title="The part or parts have definitely changed.">kXMPTS_Yes</a> = 1,
+<a name="l00129"></a><a class="code" href="XMP__Const_8h.html#06fc87d81c62e9abb8790b6e5713c55b2a88f4d4589bf413377283843f70bc90">00129</a> <a class="code" href="XMP__Const_8h.html#06fc87d81c62e9abb8790b6e5713c55b2a88f4d4589bf413377283843f70bc90" title="The part or parts have definitely not changed.">kXMPTS_No</a> = 0,
+<a name="l00131"></a><a class="code" href="XMP__Const_8h.html#06fc87d81c62e9abb8790b6e5713c55b7a73219cd125bb21e294ba474112a584">00131</a> <a class="code" href="XMP__Const_8h.html#06fc87d81c62e9abb8790b6e5713c55b7a73219cd125bb21e294ba474112a584" title="The part or parts might, or might not, have changed.">kXMPTS_Maybe</a> = -1
+<a name="l00132"></a>00132 };
+<a name="l00133"></a>00133 <span class="keyword">typedef</span> XMP_Int8 XMP_TriState;
+<a name="l00134"></a>00134
+<a name="l00136"></a>00136
+<a name="l00137"></a>00137 <span class="comment">// =================================================================================================</span>
+<a name="l00138"></a>00138
+<a name="l00158"></a>00158
+<a name="l00159"></a><a class="code" href="structXMP__DateTime.html">00159</a> <span class="keyword">struct </span><a class="code" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a> {
+<a name="l00160"></a>00160
+<a name="l00162"></a><a class="code" href="structXMP__DateTime.html#2db713deacfd5a5cb2deea660ca2ccad">00162</a> XMP_Int32 <a class="code" href="structXMP__DateTime.html#2db713deacfd5a5cb2deea660ca2ccad" title="The year, can be negative.">year</a>;
+<a name="l00163"></a>00163
+<a name="l00165"></a><a class="code" href="structXMP__DateTime.html#b4b71c1a54879d7da1b4135e23d5446f">00165</a> XMP_Int32 <a class="code" href="structXMP__DateTime.html#b4b71c1a54879d7da1b4135e23d5446f" title="The month in the range 1..12.">month</a>;
+<a name="l00166"></a>00166
+<a name="l00168"></a><a class="code" href="structXMP__DateTime.html#58496718277eea9dc5e3e19d80a69094">00168</a> XMP_Int32 <a class="code" href="structXMP__DateTime.html#58496718277eea9dc5e3e19d80a69094" title="The day of the month in the range 1..31.">day</a>;
+<a name="l00169"></a>00169
+<a name="l00171"></a><a class="code" href="structXMP__DateTime.html#bc79cdca8cfa5df6583279e3f3e70e9f">00171</a> XMP_Int32 <a class="code" href="structXMP__DateTime.html#bc79cdca8cfa5df6583279e3f3e70e9f" title="The hour in the range 0..23.">hour</a>;
+<a name="l00172"></a>00172
+<a name="l00174"></a><a class="code" href="structXMP__DateTime.html#e84965f3296a9c106d1f6c88aa6a7bdf">00174</a> XMP_Int32 <a class="code" href="structXMP__DateTime.html#e84965f3296a9c106d1f6c88aa6a7bdf" title="The minute in the range 0..59.">minute</a>;
+<a name="l00175"></a>00175
+<a name="l00177"></a><a class="code" href="structXMP__DateTime.html#675313c70a7e05b7ca50d21300b7d81b">00177</a> XMP_Int32 <a class="code" href="structXMP__DateTime.html#675313c70a7e05b7ca50d21300b7d81b" title="The second in the range 0..59.">second</a>;
+<a name="l00178"></a>00178
+<a name="l00181"></a><a class="code" href="structXMP__DateTime.html#2786ad8875bd59f07b8dc2b1d09c6f96">00181</a> XMP_Int32 <a class="code" href="structXMP__DateTime.html#2786ad8875bd59f07b8dc2b1d09c6f96">tzSign</a>;
+<a name="l00182"></a>00182
+<a name="l00184"></a><a class="code" href="structXMP__DateTime.html#6045133feeef41ac1f78c4664ab13db4">00184</a> XMP_Int32 <a class="code" href="structXMP__DateTime.html#6045133feeef41ac1f78c4664ab13db4" title="The time zone hour in the range 0..23.">tzHour</a>;
+<a name="l00185"></a>00185
+<a name="l00187"></a><a class="code" href="structXMP__DateTime.html#45baa70f30a3dc9f88819886cfb91aa1">00187</a> XMP_Int32 <a class="code" href="structXMP__DateTime.html#45baa70f30a3dc9f88819886cfb91aa1" title="The time zone minute in the range 0..59.">tzMinute</a>;
+<a name="l00188"></a>00188
+<a name="l00190"></a><a class="code" href="structXMP__DateTime.html#190c2a19f01e90997ec2973aec37712c">00190</a> XMP_Int32 <a class="code" href="structXMP__DateTime.html#190c2a19f01e90997ec2973aec37712c" title="Nanoseconds within a second, often left as zero.">nanoSecond</a>;
+<a name="l00191"></a>00191
+<a name="l00192"></a>00192 };
+<a name="l00193"></a>00193
+<a name="l00195"></a>00195 <span class="keyword">enum</span> {
+<a name="l00197"></a><a class="code" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b7511551ce156d5fd96c26ad464b837801">00197</a> <a class="code" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b7511551ce156d5fd96c26ad464b837801" title="Time zone is west of UTC.">kXMP_TimeWestOfUTC</a> = -1,
+<a name="l00199"></a><a class="code" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b73f41be55491204982acb39c9f6c7ad13">00199</a> <a class="code" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b73f41be55491204982acb39c9f6c7ad13" title="UTC time.">kXMP_TimeIsUTC</a> = 0,
+<a name="l00201"></a><a class="code" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b768851b70cc1d2346fa21bc0b0ae6cfec">00201</a> <a class="code" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b768851b70cc1d2346fa21bc0b0ae6cfec" title="Time zone is east of UTC.">kXMP_TimeEastOfUTC</a> = +1
+<a name="l00202"></a>00202 };
+<a name="l00203"></a>00203
+<a name="l00204"></a>00204 <span class="comment">// =================================================================================================</span>
+<a name="l00205"></a>00205 <span class="comment">// Standard namespace URI constants</span>
+<a name="l00206"></a>00206 <span class="comment">// ================================</span>
+<a name="l00207"></a>00207
+<a name="l00242"></a>00242
+<a name="l00243"></a><a class="code" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">00243</a> <span class="preprocessor">#define kXMP_NS_XMP "http://ns.adobe.com/xap/1.0/"</span>
+<a name="l00244"></a>00244 <span class="preprocessor"></span>
+<a name="l00245"></a><a class="code" href="XMP__Const_8h.html#e52d761e5a4fc8c8499215d2f3d82b90">00245</a> <span class="preprocessor">#define kXMP_NS_XMP_Rights "http://ns.adobe.com/xap/1.0/rights/"</span>
+<a name="l00246"></a><a class="code" href="XMP__Const_8h.html#c67379a9ffa425d0d7976a51c4f2f754">00246</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_MM "http://ns.adobe.com/xap/1.0/mm/"</span>
+<a name="l00247"></a><a class="code" href="XMP__Const_8h.html#308e156c325618acb2172e550929ebee">00247</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_BJ "http://ns.adobe.com/xap/1.0/bj/"</span>
+<a name="l00248"></a>00248 <span class="preprocessor"></span>
+<a name="l00249"></a><a class="code" href="XMP__Const_8h.html#0bcb67d0dd0922504e3da7ca5c40c82a">00249</a> <span class="preprocessor">#define kXMP_NS_PDF "http://ns.adobe.com/pdf/1.3/"</span>
+<a name="l00250"></a><a class="code" href="XMP__Const_8h.html#a1a6f38ebfcdb281c5bf2809859167c7">00250</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_Photoshop "http://ns.adobe.com/photoshop/1.0/"</span>
+<a name="l00251"></a>00251 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_PSAlbum "http://ns.adobe.com/album/1.0/"</span>
+<a name="l00252"></a><a class="code" href="XMP__Const_8h.html#d12182e1df1652f56b5eec60c1fcdd8f">00252</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_EXIF "http://ns.adobe.com/exif/1.0/"</span>
+<a name="l00253"></a>00253 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_EXIF_Aux "http://ns.adobe.com/exif/1.0/aux/"</span>
+<a name="l00254"></a><a class="code" href="XMP__Const_8h.html#673355818b7b9224e8fec0fbc60ba00c">00254</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_TIFF "http://ns.adobe.com/tiff/1.0/"</span>
+<a name="l00255"></a>00255 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_PNG "http://ns.adobe.com/png/1.0/"</span>
+<a name="l00256"></a>00256 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_SWF "http://ns.adobe.com/swf/1.0/"</span>
+<a name="l00257"></a>00257 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_JPEG "http://ns.adobe.com/jpeg/1.0/"</span>
+<a name="l00258"></a>00258 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_JP2K "http://ns.adobe.com/jp2k/1.0/"</span>
+<a name="l00259"></a>00259 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_CameraRaw "http://ns.adobe.com/camera-raw-settings/1.0/"</span>
+<a name="l00260"></a>00260 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_DM "http://ns.adobe.com/xmp/1.0/DynamicMedia/"</span>
+<a name="l00261"></a>00261 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_ASF "http://ns.adobe.com/asf/1.0/"</span>
+<a name="l00262"></a>00262 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_WAV "http://ns.adobe.com/xmp/wav/1.0/"</span>
+<a name="l00263"></a>00263 <span class="preprocessor"></span>
+<a name="l00264"></a>00264 <span class="preprocessor">#define kXMP_NS_XMP_Note "http://ns.adobe.com/xmp/note/"</span>
+<a name="l00265"></a>00265 <span class="preprocessor"></span>
+<a name="l00266"></a>00266 <span class="preprocessor">#define kXMP_NS_AdobeStockPhoto "http://ns.adobe.com/StockPhoto/1.0/"</span>
+<a name="l00267"></a>00267 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_CreatorAtom "http://ns.adobe.com/creatorAtom/1.0/"</span>
+<a name="l00268"></a>00268 <span class="preprocessor"></span>
+<a name="l00294"></a>00294
+<a name="l00295"></a><a class="code" href="XMP__Const_8h.html#b466db52a4b85cecfa04710682c1e671">00295</a> <span class="preprocessor">#define kXMP_NS_XMP_IdentifierQual "http://ns.adobe.com/xmp/Identifier/qual/1.0/"</span>
+<a name="l00296"></a><a class="code" href="XMP__Const_8h.html#9618e013619aa92ebc808b62243d2ba8">00296</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_Dimensions "http://ns.adobe.com/xap/1.0/sType/Dimensions#"</span>
+<a name="l00297"></a>00297 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_Text "http://ns.adobe.com/xap/1.0/t/"</span>
+<a name="l00298"></a>00298 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_PagedFile "http://ns.adobe.com/xap/1.0/t/pg/"</span>
+<a name="l00299"></a>00299 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_Graphics "http://ns.adobe.com/xap/1.0/g/"</span>
+<a name="l00300"></a><a class="code" href="XMP__Const_8h.html#935641acc7d01e782ad7a457a7ff338b">00300</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_Image "http://ns.adobe.com/xap/1.0/g/img/"</span>
+<a name="l00301"></a>00301 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_Font "http://ns.adobe.com/xap/1.0/sType/Font#"</span>
+<a name="l00302"></a><a class="code" href="XMP__Const_8h.html#861613273127156050b456eee11f6b0a">00302</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_ResourceEvent "http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"</span>
+<a name="l00303"></a><a class="code" href="XMP__Const_8h.html#9bf51f2653400645f7b5087e8c4e1c77">00303</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_ResourceRef "http://ns.adobe.com/xap/1.0/sType/ResourceRef#"</span>
+<a name="l00304"></a><a class="code" href="XMP__Const_8h.html#b4923bed71ab29c6aa88debe8816c0a2">00304</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_ST_Version "http://ns.adobe.com/xap/1.0/sType/Version#"</span>
+<a name="l00305"></a><a class="code" href="XMP__Const_8h.html#c7dc4d65bcbba2862e410cc8cfdff6f6">00305</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_ST_Job "http://ns.adobe.com/xap/1.0/sType/Job#"</span>
+<a name="l00306"></a>00306 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_ManifestItem "http://ns.adobe.com/xap/1.0/sType/ManifestItem#"</span>
+<a name="l00307"></a>00307 <span class="preprocessor"></span>
+<a name="l00308"></a>00308 <span class="comment">// Deprecated XML namespace constants</span>
+<a name="l00309"></a><a class="code" href="XMP__Const_8h.html#0a2d9c5f7beb27553214a7ad1df4f27e">00309</a> <span class="preprocessor">#define kXMP_NS_XMP_T "http://ns.adobe.com/xap/1.0/t/"</span>
+<a name="l00310"></a><a class="code" href="XMP__Const_8h.html#39afb495ffb24bb3082493c6811e65d0">00310</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_T_PG "http://ns.adobe.com/xap/1.0/t/pg/"</span>
+<a name="l00311"></a>00311 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_G_IMG "http://ns.adobe.com/xap/1.0/g/img/"</span>
+<a name="l00312"></a>00312 <span class="preprocessor"></span>
+<a name="l00329"></a>00329
+<a name="l00330"></a><a class="code" href="XMP__Const_8h.html#44453f0d0a1dd295d41722c2387b36fa">00330</a> <span class="preprocessor">#define kXMP_NS_DC "http://purl.org/dc/elements/1.1/"</span>
+<a name="l00331"></a>00331 <span class="preprocessor"></span>
+<a name="l00332"></a><a class="code" href="XMP__Const_8h.html#b794d3d798daf75a963398347dcbb79b">00332</a> <span class="preprocessor">#define kXMP_NS_IPTCCore "http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"</span>
+<a name="l00333"></a>00333 <span class="preprocessor"></span>
+<a name="l00334"></a>00334 <span class="preprocessor">#define kXMP_NS_DICOM "http://ns.adobe.com/DICOM/"</span>
+<a name="l00335"></a>00335 <span class="preprocessor"></span>
+<a name="l00336"></a>00336 <span class="preprocessor">#define kXMP_NS_PDFA_Schema "http://www.aiim.org/pdfa/ns/schema#"</span>
+<a name="l00337"></a>00337 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_PDFA_Property "http://www.aiim.org/pdfa/ns/property#"</span>
+<a name="l00338"></a>00338 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_PDFA_Type "http://www.aiim.org/pdfa/ns/type#"</span>
+<a name="l00339"></a>00339 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_PDFA_Field "http://www.aiim.org/pdfa/ns/field#"</span>
+<a name="l00340"></a>00340 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_PDFA_ID "http://www.aiim.org/pdfa/ns/id/"</span>
+<a name="l00341"></a>00341 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_PDFA_Extension "http://www.aiim.org/pdfa/ns/extension/"</span>
+<a name="l00342"></a>00342 <span class="preprocessor"></span>
+<a name="l00343"></a>00343 <span class="preprocessor">#define kXMP_NS_PDFX "http://ns.adobe.com/pdfx/1.3/"</span>
+<a name="l00344"></a>00344 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_PDFX_ID "http://www.npes.org/pdfx/ns/id/"</span>
+<a name="l00345"></a>00345 <span class="preprocessor"></span>
+<a name="l00346"></a><a class="code" href="XMP__Const_8h.html#276fac0f70893607afa3f09030ad84c7">00346</a> <span class="preprocessor">#define kXMP_NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#"</span>
+<a name="l00347"></a><a class="code" href="XMP__Const_8h.html#97564c70460d1f235c8a41b8ac40cfe9">00347</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XML "http://www.w3.org/XML/1998/namespace"</span>
+<a name="l00348"></a>00348 <span class="preprocessor"></span>
+<a name="l00349"></a>00349 <span class="comment">// =================================================================================================</span>
+<a name="l00350"></a>00350 <span class="comment">// Enums and macros used for option bits</span>
+<a name="l00351"></a>00351 <span class="comment">// =====================================</span>
+<a name="l00352"></a>00352
+<a name="l00366"></a>00366
+<a name="l00367"></a><a class="code" href="XMP__Const_8h.html#9549b9a138a896257b5a70176d125317">00367</a> <span class="preprocessor">#define kXMP_ArrayLastItem ((XMP_Index)(-1L))</span>
+<a name="l00368"></a><a class="code" href="XMP__Const_8h.html#8283c9596c03b6d626d5a2b7a90e23ab">00368</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_UseNullTermination ((XMP_StringLen)(~0UL))</span>
+<a name="l00369"></a><a class="code" href="XMP__Const_8h.html#ff1df9f3cf050f8b8d3a574db3c3326b">00369</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NoOptions ((XMP_OptionBits)0UL)</span>
+<a name="l00370"></a>00370 <span class="preprocessor"></span>
+<a name="l00403"></a>00403
+<a name="l00404"></a><a class="code" href="XMP__Const_8h.html#69c4d1b80c4dd581366e0c60209ef612">00404</a> <span class="preprocessor">#define XMP_SetOption(var,opt) var |= (opt)</span>
+<a name="l00405"></a><a class="code" href="XMP__Const_8h.html#10c3c9b1b6e266b0b4eb6abe7b03b7d8">00405</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_ClearOption(var,opt) var &amp;= ~(opt)</span>
+<a name="l00406"></a><a class="code" href="XMP__Const_8h.html#a31596e850cb6b208f5920833d67b9f1">00406</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_TestOption(var,opt) (((var) &amp; (opt)) != 0)</span>
+<a name="l00407"></a><a class="code" href="XMP__Const_8h.html#ba3edaa921326c7916adb0b70b1bcfb4">00407</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_OptionIsSet(var,opt) (((var) &amp; (opt)) != 0)</span>
+<a name="l00408"></a><a class="code" href="XMP__Const_8h.html#1d41f53bd1d5c88fad8322ce15e39516">00408</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_OptionIsClear(var,opt) (((var) &amp; (opt)) == 0)</span>
+<a name="l00409"></a>00409 <span class="preprocessor"></span>
+<a name="l00462"></a>00462
+<a name="l00463"></a><a class="code" href="XMP__Const_8h.html#510b75338bd488ddd8d9bd4e326806f9">00463</a> <span class="preprocessor">#define XMP_PropIsSimple(opt) (((opt) &amp; kXMP_PropCompositeMask) == 0)</span>
+<a name="l00464"></a><a class="code" href="XMP__Const_8h.html#ebea8c35e09da7db613e27d0e3ce945f">00464</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_PropIsStruct(opt) (((opt) &amp; kXMP_PropValueIsStruct) != 0)</span>
+<a name="l00465"></a><a class="code" href="XMP__Const_8h.html#98ae521b621cfa3611211e3922a0fce8">00465</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_PropIsArray(opt) (((opt) &amp; kXMP_PropValueIsArray) != 0)</span>
+<a name="l00466"></a>00466 <span class="preprocessor"></span>
+<a name="l00467"></a><a class="code" href="XMP__Const_8h.html#8d763b3d36c7067cd7bccd32d4066b43">00467</a> <span class="preprocessor">#define XMP_ArrayIsUnordered(opt) (((opt) &amp; kXMP_PropArrayIsOrdered) == 0)</span>
+<a name="l00468"></a><a class="code" href="XMP__Const_8h.html#72c7077f3ff3e39804a899533867327d">00468</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_ArrayIsOrdered(opt) (((opt) &amp; kXMP_PropArrayIsOrdered) != 0)</span>
+<a name="l00469"></a><a class="code" href="XMP__Const_8h.html#86bc34c4e64dec75618c348163a88720">00469</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_ArrayIsAlternate(opt) (((opt) &amp; kXMP_PropArrayIsAlternate) != 0)</span>
+<a name="l00470"></a><a class="code" href="XMP__Const_8h.html#bbef21da7bce1491f780586c3e01cd9e">00470</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_ArrayIsAltText(opt) (((opt) &amp; kXMP_PropArrayIsAltText) != 0)</span>
+<a name="l00471"></a>00471 <span class="preprocessor"></span>
+<a name="l00472"></a><a class="code" href="XMP__Const_8h.html#10828aa191aa666aa1166c27beead2a6">00472</a> <span class="preprocessor">#define XMP_PropHasQualifiers(opt) (((opt) &amp; kXMP_PropHasQualifiers) != 0)</span>
+<a name="l00473"></a><a class="code" href="XMP__Const_8h.html#8d1b4da6b3cb3a67bf4f8e79352eeeaa">00473</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_PropIsQualifier(opt) (((opt) &amp; kXMP_PropIsQualifier) != 0)</span>
+<a name="l00474"></a><a class="code" href="XMP__Const_8h.html#7dc82df90f45b0d746b67d8fdc529c83">00474</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_PropHasLang(opt) (((opt) &amp; kXMP_PropHasLang) != 0)</span>
+<a name="l00475"></a>00475 <span class="preprocessor"></span>
+<a name="l00476"></a><a class="code" href="XMP__Const_8h.html#12870d8442720ce5230791abc26f9597">00476</a> <span class="preprocessor">#define XMP_NodeIsSchema(opt) (((opt) &amp; kXMP_SchemaNode) != 0)</span>
+<a name="l00477"></a><a class="code" href="XMP__Const_8h.html#193b1414fa5312da2aa1d833b85612d0">00477</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_PropIsAlias(opt) (((opt) &amp; kXMP_PropIsAlias) != 0)</span>
+<a name="l00478"></a>00478 <span class="preprocessor"></span>
+<a name="l00479"></a>00479 <span class="comment">// -------------------------------------------------------------------------------------------------</span>
+<a name="l00480"></a>00480
+<a name="l00482"></a>00482 <span class="keyword">enum</span> {
+<a name="l00483"></a>00483
+<a name="l00485"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ab51f87b5c48f47f5cefb9e03293dafb">00485</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ab51f87b5c48f47f5cefb9e03293dafb" title="The XML string form of the property value is a URI, use rdf:resource attribute. DISCOURAGED...">kXMP_PropValueIsURI</a> = 0x00000002UL,
+<a name="l00486"></a>00486
+<a name="l00487"></a>00487 <span class="comment">// ------------------------------------------------------</span>
+<a name="l00488"></a>00488 <span class="comment">// Options relating to qualifiers attached to a property.</span>
+<a name="l00489"></a>00489
+<a name="l00491"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b58e34a33a2eed56499d4f6f62da25d159">00491</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b58e34a33a2eed56499d4f6f62da25d159" title="The property has qualifiers, includes rdf:type and xml:lang.">kXMP_PropHasQualifiers</a> = 0x00000010UL,
+<a name="l00492"></a>00492
+<a name="l00497"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b530146ed5209f5c3eb4eeb1fd8e4fb9fe">00497</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b530146ed5209f5c3eb4eeb1fd8e4fb9fe">kXMP_PropIsQualifier</a> = 0x00000020UL,
+<a name="l00498"></a>00498
+<a name="l00500"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b53fa5ed87edc731bfb3817f58ba70a217">00500</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b53fa5ed87edc731bfb3817f58ba70a217" title="Implies kXMP_PropHasQualifiers, property has xml:lang.">kXMP_PropHasLang</a> = 0x00000040UL,
+<a name="l00501"></a>00501
+<a name="l00503"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5eff16fdf167afc73db25b30b529bd9d5">00503</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5eff16fdf167afc73db25b30b529bd9d5" title="Implies kXMP_PropHasQualifiers, property has rdf:type.">kXMP_PropHasType</a> = 0x00000080UL,
+<a name="l00504"></a>00504
+<a name="l00505"></a>00505 <span class="comment">// --------------------------------------------</span>
+<a name="l00506"></a>00506 <span class="comment">// Options relating to the data structure form.</span>
+<a name="l00507"></a>00507
+<a name="l00509"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e">00509</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a> = 0x00000100UL,
+<a name="l00510"></a>00510
+<a name="l00513"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b59b7706e0f0716ac7546bdc24ffedd0bc">00513</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b59b7706e0f0716ac7546bdc24ffedd0bc">kXMP_PropValueIsArray</a> = 0x00000200UL,
+<a name="l00514"></a>00514
+<a name="l00516"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b50d70c23394c0676657c89de5491192c0">00516</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b50d70c23394c0676657c89de5491192c0" title="The item order does not matter.">kXMP_PropArrayIsUnordered</a> = <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b59b7706e0f0716ac7546bdc24ffedd0bc">kXMP_PropValueIsArray</a>,
+<a name="l00517"></a>00517
+<a name="l00519"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5f1cdb3b0a3e852ec55e747a1686aba04">00519</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5f1cdb3b0a3e852ec55e747a1686aba04" title="Implies kXMP_PropValueIsArray, item order matters. It is serialized using an rdf:Seq...">kXMP_PropArrayIsOrdered</a> = 0x00000400UL,
+<a name="l00520"></a>00520
+<a name="l00522"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b52596b1f0ea4600270c99102c86b5f1f1">00522</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b52596b1f0ea4600270c99102c86b5f1f1" title="Implies kXMP_PropArrayIsOrdered, items are alternates. It is serialized using an...">kXMP_PropArrayIsAlternate</a> = 0x00000800UL,
+<a name="l00523"></a>00523
+<a name="l00524"></a>00524 <span class="comment">// ------------------------------------</span>
+<a name="l00525"></a>00525 <span class="comment">// Additional struct and array options.</span>
+<a name="l00526"></a>00526
+<a name="l00529"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ba253f67a6cf44b7438a3f96b516846d">00529</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ba253f67a6cf44b7438a3f96b516846d">kXMP_PropArrayIsAltText</a> = 0x00001000UL,
+<a name="l00530"></a>00530
+<a name="l00531"></a>00531 <span class="comment">// kXMP_InsertBeforeItem = 0x00004000UL, ! Used by SetXyz functions.</span>
+<a name="l00532"></a>00532 <span class="comment">// kXMP_InsertAfterItem = 0x00008000UL, ! Used by SetXyz functions.</span>
+<a name="l00533"></a>00533
+<a name="l00534"></a>00534 <span class="comment">// ----------------------------</span>
+<a name="l00535"></a>00535 <span class="comment">// Other miscellaneous options.</span>
+<a name="l00536"></a>00536
+<a name="l00539"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5b975c19fb5c50f732a1a0d84dadb7c37">00539</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5b975c19fb5c50f732a1a0d84dadb7c37">kXMP_PropIsAlias</a> = 0x00010000UL,
+<a name="l00540"></a>00540
+<a name="l00543"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b51f819ef281d1f52c4c12d5d02f49d3f0">00543</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b51f819ef281d1f52c4c12d5d02f49d3f0">kXMP_PropHasAliases</a> = 0x00020000UL,
+<a name="l00544"></a>00544
+<a name="l00546"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b548097c6ea309f240965d77ab564a5464">00546</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b548097c6ea309f240965d77ab564a5464" title="The value of this property is &amp;quot;owned&amp;quot; by the application, and should not...">kXMP_PropIsInternal</a> = 0x00040000UL,
+<a name="l00547"></a>00547
+<a name="l00549"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b581dcd06251771a0ddee6c1e36128c65c">00549</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b581dcd06251771a0ddee6c1e36128c65c" title="The value of this property is not derived from the document content.">kXMP_PropIsStable</a> = 0x00100000UL,
+<a name="l00550"></a>00550
+<a name="l00552"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b50d898ea7f6b3db513bb24f8a6a285877">00552</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b50d898ea7f6b3db513bb24f8a6a285877" title="The value of this property is derived from the document content.">kXMP_PropIsDerived</a> = 0x00200000UL,
+<a name="l00553"></a>00553
+<a name="l00554"></a>00554 <span class="comment">// kXMPUtil_AllowCommas = 0x10000000UL, ! Used by TXMPUtils::CatenateArrayItems and ::SeparateArrayItems.</span>
+<a name="l00555"></a>00555 <span class="comment">// kXMP_DeleteExisting = 0x20000000UL, ! Used by TXMPMeta::SetXyz functions to delete any pre-existing property.</span>
+<a name="l00556"></a>00556 <span class="comment">// kXMP_SchemaNode = 0x80000000UL, ! Returned by iterators - #define to avoid warnings</span>
+<a name="l00557"></a>00557
+<a name="l00558"></a>00558 <span class="comment">// ------------------------------</span>
+<a name="l00559"></a>00559 <span class="comment">// Masks that are multiple flags.</span>
+<a name="l00560"></a>00560
+<a name="l00562"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b56b5b5f4b869994b7390edc9589745e9f">00562</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b56b5b5f4b869994b7390edc9589745e9f" title="Property type bit-flag mask for all array types.">kXMP_PropArrayFormMask</a> = <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b59b7706e0f0716ac7546bdc24ffedd0bc">kXMP_PropValueIsArray</a> | <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5f1cdb3b0a3e852ec55e747a1686aba04" title="Implies kXMP_PropValueIsArray, item order matters. It is serialized using an rdf:Seq...">kXMP_PropArrayIsOrdered</a> | <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b52596b1f0ea4600270c99102c86b5f1f1" title="Implies kXMP_PropArrayIsOrdered, items are alternates. It is serialized using an...">kXMP_PropArrayIsAlternate</a> | <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ba253f67a6cf44b7438a3f96b516846d">kXMP_PropArrayIsAltText</a>,
+<a name="l00563"></a>00563
+<a name="l00565"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b560a9f26fb66c2e65cf40d9bc44968956">00565</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b560a9f26fb66c2e65cf40d9bc44968956" title="Property type bit-flag mask for composite types (array and struct).">kXMP_PropCompositeMask</a> = <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a> | <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b56b5b5f4b869994b7390edc9589745e9f" title="Property type bit-flag mask for all array types.">kXMP_PropArrayFormMask</a>,
+<a name="l00566"></a>00566
+<a name="l00568"></a><a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5e154b58429b257b18963ba3503e67974">00568</a> <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5e154b58429b257b18963ba3503e67974" title="Mask for bits that are reserved for transient use by the implementation.">kXMP_ImplReservedMask</a> = 0x70000000L
+<a name="l00569"></a>00569
+<a name="l00570"></a>00570 };
+<a name="l00571"></a>00571
+<a name="l00572"></a>00572 <span class="preprocessor">#define kXMP_SchemaNode ((XMP_OptionBits)0x80000000UL)</span>
+<a name="l00573"></a>00573 <span class="preprocessor"></span>
+<a name="l00582"></a>00582 <span class="keyword">enum</span> {
+<a name="l00583"></a>00583
+<a name="l00585"></a><a class="code" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04873411f673fc2a6337083fd024df727f">00585</a> <a class="code" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04873411f673fc2a6337083fd024df727f" title="Option for array item location: Insert a new item before the given index.">kXMP_InsertBeforeItem</a> = 0x00004000UL,
+<a name="l00586"></a>00586
+<a name="l00588"></a><a class="code" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b0498cedd5fa29d47abb2ac8903ac7f5a05">00588</a> <a class="code" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b0498cedd5fa29d47abb2ac8903ac7f5a05" title="Option for array item location: Insert a new item after the given index.">kXMP_InsertAfterItem</a> = 0x00008000UL,
+<a name="l00589"></a>00589
+<a name="l00591"></a><a class="code" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04ddd07b4a38b25ab3841e28a9cb169d1c">00591</a> <a class="code" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04ddd07b4a38b25ab3841e28a9cb169d1c" title="Delete any pre-existing property.">kXMP_DeleteExisting</a> = 0x20000000UL,
+<a name="l00592"></a>00592
+<a name="l00594"></a><a class="code" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04d1b42a8a4c479d9bfaf406b79f2e1465">00594</a> <a class="code" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04d1b42a8a4c479d9bfaf406b79f2e1465" title="Bit-flag mask for property-value option bits.">kXMP_PropValueOptionsMask</a> = <a class="code" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ab51f87b5c48f47f5cefb9e03293dafb" title="The XML string form of the property value is a URI, use rdf:resource attribute. DISCOURAGED...">kXMP_PropValueIsURI</a>,
+<a name="l00595"></a>00595
+<a name="l00597"></a><a class="code" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04ef8c1934a17b0e5d8f0b20a7e89df0df">00597</a> <a class="code" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04ef8c1934a17b0e5d8f0b20a7e89df0df" title="Bit-flag mask for array-item location bits.">kXMP_PropArrayLocationMask</a> = <a class="code" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04873411f673fc2a6337083fd024df727f" title="Option for array item location: Insert a new item before the given index.">kXMP_InsertBeforeItem</a> | <a class="code" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b0498cedd5fa29d47abb2ac8903ac7f5a05" title="Option for array item location: Insert a new item after the given index.">kXMP_InsertAfterItem</a>
+<a name="l00598"></a>00598
+<a name="l00599"></a>00599 };
+<a name="l00600"></a>00600
+<a name="l00601"></a>00601 <span class="comment">// -------------------------------------------------------------------------------------------------</span>
+<a name="l00602"></a>00602
+<a name="l00604"></a>00604 <span class="keyword">enum</span> {
+<a name="l00605"></a>00605
+<a name="l00607"></a><a class="code" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c1e533852436acf75f594a4fb50a64400">00607</a> <a class="code" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c1e533852436acf75f594a4fb50a64400" title="Require a surrounding x:xmpmeta element.">kXMP_RequireXMPMeta</a> = 0x0001UL,
+<a name="l00608"></a>00608
+<a name="l00610"></a><a class="code" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c79b36427b7bf0c0a1ed010a44dec2d3e">00610</a> <a class="code" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c79b36427b7bf0c0a1ed010a44dec2d3e" title="This is the not last input buffer for this parse stream.">kXMP_ParseMoreBuffers</a> = 0x0002UL,
+<a name="l00611"></a>00611
+<a name="l00613"></a><a class="code" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c7107906eab0e1fa6f9f2dc6254ad88b1">00613</a> <a class="code" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c7107906eab0e1fa6f9f2dc6254ad88b1" title="Do not reconcile alias differences, throw an exception.">kXMP_StrictAliasing</a> = 0x0004UL
+<a name="l00614"></a>00614
+<a name="l00615"></a>00615 };
+<a name="l00616"></a>00616
+<a name="l00618"></a>00618 <span class="keyword">enum</span> {
+<a name="l00619"></a>00619
+<a name="l00620"></a>00620 <span class="comment">// *** Option to remove empty struct/array, or leaf with empty value?</span>
+<a name="l00621"></a>00621
+<a name="l00623"></a><a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edbb9e4c7ee139da0dd4126ddea794c76">00623</a> <a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edbb9e4c7ee139da0dd4126ddea794c76" title="Omit the XML packet wrapper.">kXMP_OmitPacketWrapper</a> = 0x0010UL,
+<a name="l00624"></a>00624
+<a name="l00626"></a><a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e238c792322c5bd5f9e4db3165e01f9d6">00626</a> <a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e238c792322c5bd5f9e4db3165e01f9d6" title="Default is a writeable packet.">kXMP_ReadOnlyPacket</a> = 0x0020UL,
+<a name="l00627"></a>00627
+<a name="l00629"></a><a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e041dc6b7b8684be7112ae40f5f259ebb">00629</a> <a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e041dc6b7b8684be7112ae40f5f259ebb" title="Use a compact form of RDF.">kXMP_UseCompactFormat</a> = 0x0040UL,
+<a name="l00630"></a>00630
+<a name="l00632"></a><a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e0b659b3b544c7a5a076fbd3132cd7f7a">00632</a> <a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e0b659b3b544c7a5a076fbd3132cd7f7a" title="Include a padding allowance for a thumbnail image.">kXMP_IncludeThumbnailPad</a> = 0x0100UL,
+<a name="l00633"></a>00633
+<a name="l00635"></a><a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edb35599da481cc22ea6342b7b4de6bc6">00635</a> <a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edb35599da481cc22ea6342b7b4de6bc6" title="The padding parameter is the overall packet length.">kXMP_ExactPacketLength</a> = 0x0200UL,
+<a name="l00636"></a>00636
+<a name="l00638"></a><a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e9ee6f7e9597b93ed12b8ae654ade2654">00638</a> <a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e9ee6f7e9597b93ed12b8ae654ade2654" title="Show aliases as XML comments.">kXMP_WriteAliasComments</a> = 0x0400UL,
+<a name="l00639"></a>00639
+<a name="l00641"></a><a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e79230f1d70d2625f7650db6ff5b1ea29">00641</a> <a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e79230f1d70d2625f7650db6ff5b1ea29" title="Omit all formatting whitespace.">kXMP_OmitAllFormatting</a> = 0x0800UL,
+<a name="l00642"></a>00642
+<a name="l00644"></a><a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e9fb498d749d939e2ba9adf555a75b856">00644</a> <a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e9fb498d749d939e2ba9adf555a75b856" title="Omit the x:xmpmeta element surrounding the rdf:RDF element.">kXMP_OmitXMPMetaElement</a> = 0x1000UL,
+<a name="l00645"></a>00645
+<a name="l00646"></a>00646 _XMP_LittleEndian_Bit = 0x0001UL, <span class="comment">// ! Don't use directly, see the combined values below!</span>
+<a name="l00647"></a>00647 _XMP_UTF16_Bit = 0x0002UL,
+<a name="l00648"></a>00648 _XMP_UTF32_Bit = 0x0004UL,
+<a name="l00649"></a>00649
+<a name="l00651"></a><a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9eeb79571cac99ee97feefb0347b1c1845">00651</a> <a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9eeb79571cac99ee97feefb0347b1c1845" title="Bit-flag mask for encoding-type bits.">kXMP_EncodingMask</a> = 0x0007UL,
+<a name="l00652"></a>00652
+<a name="l00654"></a><a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edc8f241694f5a758e5ee3f6db69d02ab">00654</a> <a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edc8f241694f5a758e5ee3f6db69d02ab" title="Use UTF8 encoding.">kXMP_EncodeUTF8</a> = 0UL,
+<a name="l00655"></a>00655
+<a name="l00657"></a><a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e310e4cbf639e783163778566b439f01d">00657</a> <a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e310e4cbf639e783163778566b439f01d" title="Use UTF16 big-endian encoding.">kXMP_EncodeUTF16Big</a> = _XMP_UTF16_Bit,
+<a name="l00658"></a>00658
+<a name="l00660"></a><a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9efc6417e382c98a2d507830de62fd4830">00660</a> <a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9efc6417e382c98a2d507830de62fd4830" title="Use UTF16 little-endian encoding.">kXMP_EncodeUTF16Little</a> = _XMP_UTF16_Bit | _XMP_LittleEndian_Bit,
+<a name="l00661"></a>00661
+<a name="l00663"></a><a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e793e99d9ea83f0aadd5b4193a95ea713">00663</a> <a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e793e99d9ea83f0aadd5b4193a95ea713" title="Use UTF32 big-endian encoding.">kXMP_EncodeUTF32Big</a> = _XMP_UTF32_Bit,
+<a name="l00664"></a>00664
+<a name="l00666"></a><a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9ee0137d98ea990fa23d292489031ba09e">00666</a> <a class="code" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9ee0137d98ea990fa23d292489031ba09e" title="Use UTF13 little-endian encoding.">kXMP_EncodeUTF32Little</a> = _XMP_UTF32_Bit | _XMP_LittleEndian_Bit
+<a name="l00667"></a>00667
+<a name="l00668"></a>00668 };
+<a name="l00669"></a>00669
+<a name="l00670"></a>00670 <span class="comment">// -------------------------------------------------------------------------------------------------</span>
+<a name="l00671"></a>00671
+<a name="l00673"></a>00673 <span class="keyword">enum</span> {
+<a name="l00674"></a>00674
+<a name="l00676"></a><a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f2663593f77b837d89759af3a721712c13f044">00676</a> <a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f2663593f77b837d89759af3a721712c13f044" title="The low 8 bits are an enum of what data structure to iterate.">kXMP_IterClassMask</a> = 0x00FFUL,
+<a name="l00677"></a>00677
+<a name="l00679"></a><a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635a0643c076a3b3737ff88ed20f16afd2b">00679</a> <a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635a0643c076a3b3737ff88ed20f16afd2b" title="Iterate the property tree of a TXMPMeta object.">kXMP_IterProperties</a> = 0x0000UL,
+<a name="l00680"></a>00680
+<a name="l00682"></a><a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266353333450505cd3712320aeac895e541b9">00682</a> <a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266353333450505cd3712320aeac895e541b9" title="Iterate the global alias table.">kXMP_IterAliases</a> = 0x0001UL,
+<a name="l00683"></a>00683
+<a name="l00685"></a><a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635a325d9ffba68a934f0a0a0f6ecfc2f7b">00685</a> <a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635a325d9ffba68a934f0a0a0f6ecfc2f7b" title="Iterate the global namespace table.">kXMP_IterNamespaces</a> = 0x0002UL,
+<a name="l00686"></a>00686
+<a name="l00688"></a><a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635b26e1a38d1d0343fcc5bdaab1b60e3ed">00688</a> <a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635b26e1a38d1d0343fcc5bdaab1b60e3ed" title="Just do the immediate children of the root, default is subtree.">kXMP_IterJustChildren</a> = 0x0100UL,
+<a name="l00689"></a>00689
+<a name="l00691"></a><a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266354589f99b5b4a55e785e3baf4fe1d9b19">00691</a> <a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266354589f99b5b4a55e785e3baf4fe1d9b19" title="Just do the leaf nodes, default is all nodes in the subtree.">kXMP_IterJustLeafNodes</a> = 0x0200UL,
+<a name="l00692"></a>00692
+<a name="l00694"></a><a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635cf22e638f4144bcec8207b2ab69bb344">00694</a> <a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635cf22e638f4144bcec8207b2ab69bb344" title="Return just the leaf part of the path, default is the full path.">kXMP_IterJustLeafName</a> = 0x0400UL,
+<a name="l00695"></a>00695
+<a name="l00697"></a><a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635c06dbc804df2e5ac24d77ca50a21fa08">00697</a> <a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635c06dbc804df2e5ac24d77ca50a21fa08" title="Include aliases, default is just actual properties.">kXMP_IterIncludeAliases</a> = 0x0800UL,
+<a name="l00698"></a>00698
+<a name="l00700"></a><a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266351b91947105ae68c48c5d5e36aa70d101">00700</a> <a class="code" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266351b91947105ae68c48c5d5e36aa70d101" title="Omit all qualifiers.">kXMP_IterOmitQualifiers</a> = 0x1000UL
+<a name="l00701"></a>00701
+<a name="l00702"></a>00702 };
+<a name="l00703"></a>00703
+<a name="l00705"></a>00705 <span class="keyword">enum</span> {
+<a name="l00706"></a>00706
+<a name="l00708"></a><a class="code" href="XMP__Const_8h.html#0411cd49bb5b71852cecd93bcbf0ca2db0b540cd3841f411471a827f833c606e">00708</a> <a class="code" href="XMP__Const_8h.html#0411cd49bb5b71852cecd93bcbf0ca2db0b540cd3841f411471a827f833c606e" title="Skip the subtree below the current node.">kXMP_IterSkipSubtree</a> = 0x0001UL,
+<a name="l00709"></a>00709
+<a name="l00711"></a><a class="code" href="XMP__Const_8h.html#0411cd49bb5b71852cecd93bcbf0ca2d2537b4b8db838f85b47988b198cd2a12">00711</a> <a class="code" href="XMP__Const_8h.html#0411cd49bb5b71852cecd93bcbf0ca2d2537b4b8db838f85b47988b198cd2a12" title="Skip the subtree below and remaining siblings of the current node.">kXMP_IterSkipSiblings</a> = 0x0002UL
+<a name="l00712"></a>00712
+<a name="l00713"></a>00713 };
+<a name="l00714"></a>00714
+<a name="l00715"></a>00715 <span class="comment">// -------------------------------------------------------------------------------------------------</span>
+<a name="l00722"></a>00722 <span class="comment"></span><span class="keyword">enum</span> {
+<a name="l00723"></a>00723
+<a name="l00725"></a><a class="code" href="XMP__Const_8h.html#bed82baf7f470b522273a3e37c24c600d6d41710c689f16d19ac26dc9f5cc506">00725</a> <a class="code" href="XMP__Const_8h.html#bed82baf7f470b522273a3e37c24c600d6d41710c689f16d19ac26dc9f5cc506" title="Allow commas in item values, default is separator.">kXMPUtil_AllowCommas</a> = 0x10000000UL
+<a name="l00726"></a>00726
+<a name="l00727"></a>00727 };
+<a name="l00728"></a>00728
+<a name="l00730"></a>00730 <span class="keyword">enum</span> {
+<a name="l00731"></a>00731
+<a name="l00733"></a><a class="code" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a578ddfb0572b7602a52e533d92d8b1e9fb">00733</a> <a class="code" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a578ddfb0572b7602a52e533d92d8b1e9fb" title="Do all properties, default is just external properties.">kXMPUtil_DoAllProperties</a> = 0x0001UL,
+<a name="l00734"></a>00734
+<a name="l00736"></a><a class="code" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a57dab4dad658d2d218c5b1e7d829b12962">00736</a> <a class="code" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a57dab4dad658d2d218c5b1e7d829b12962" title="Replace existing values, default is to leave them.">kXMPUtil_ReplaceOldValues</a> = 0x0002UL,
+<a name="l00737"></a>00737
+<a name="l00739"></a><a class="code" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a5797753b4c5afda9c55e807e41377d86d9">00739</a> <a class="code" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a5797753b4c5afda9c55e807e41377d86d9" title="Delete properties if the new value is empty.">kXMPUtil_DeleteEmptyValues</a> = 0x0004UL,
+<a name="l00740"></a>00740
+<a name="l00742"></a><a class="code" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a57843589b878f53d42d59258f945ad770b">00742</a> <a class="code" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a57843589b878f53d42d59258f945ad770b" title="Include aliases, default is just actual properties.">kXMPUtil_IncludeAliases</a> = 0x0800UL
+<a name="l00743"></a>00743
+<a name="l00744"></a>00744 };
+<a name="l00745"></a>00745
+<a name="l00746"></a>00746 <span class="comment">// =================================================================================================</span>
+<a name="l00747"></a>00747 <span class="comment">// Types and Constants for XMPFiles</span>
+<a name="l00748"></a>00748 <span class="comment">// ================================</span>
+<a name="l00749"></a>00749
+<a name="l00751"></a>00751 <span class="keyword">enum</span> {
+<a name="l00752"></a>00752
+<a name="l00753"></a>00753 <span class="comment">// ! Hex used to avoid gcc warnings. Leave the constants so the text reads big endian. There</span>
+<a name="l00754"></a>00754 <span class="comment">// ! seems to be no decent way on UNIX to determine the target endianness at compile time.</span>
+<a name="l00755"></a>00755 <span class="comment">// ! Forcing it on the client isn't acceptable.</span>
+<a name="l00756"></a>00756
+<a name="l00757"></a>00757 <span class="comment">// --------------------</span>
+<a name="l00758"></a>00758 <span class="comment">// Public file formats.</span>
+<a name="l00759"></a>00759
+<a name="l00761"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038817ab6d429c1550eb3cc16d2e544b78eb">00761</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038817ab6d429c1550eb3cc16d2e544b78eb" title="Public file format constant: &amp;#39;PDF &amp;#39;.">kXMP_PDFFile</a> = 0x50444620UL,
+<a name="l00763"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038852c90935ee28a0875a49843d463cad70">00763</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038852c90935ee28a0875a49843d463cad70" title="Public file format constant: &amp;#39;PS &amp;#39;, general PostScript following DSC conventions...">kXMP_PostScriptFile</a> = 0x50532020UL,
+<a name="l00765"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d947e6da0c4d923195d93e0c53a79c4e">00765</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d947e6da0c4d923195d93e0c53a79c4e" title="Public file format constant: &amp;#39;EPS &amp;#39;, encapsulated PostScript.">kXMP_EPSFile</a> = 0x45505320UL,
+<a name="l00766"></a>00766
+<a name="l00768"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d752b2d3e1139e0745223a9385ef6487">00768</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d752b2d3e1139e0745223a9385ef6487" title="Public file format constant: &amp;#39;JPEG&amp;#39;.">kXMP_JPEGFile</a> = 0x4A504547UL,
+<a name="l00770"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038878b8fa38aaa2067e3e1baa0dcaa7571d">00770</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038878b8fa38aaa2067e3e1baa0dcaa7571d" title="Public file format constant: &amp;#39;JPX &amp;#39;, JPEG 2000, ISO 15444-1.">kXMP_JPEG2KFile</a> = 0x4A505820UL,
+<a name="l00772"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388dc0edf25d933c2a21b25449692c3ba08">00772</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388dc0edf25d933c2a21b25449692c3ba08" title="Public file format constant: &amp;#39;TIFF&amp;#39;.">kXMP_TIFFFile</a> = 0x54494646UL,
+<a name="l00774"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388851d2f4525d705cd2dcabb540d0ddc06">00774</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388851d2f4525d705cd2dcabb540d0ddc06" title="Public file format constant: &amp;#39;GIF &amp;#39;.">kXMP_GIFFile</a> = 0x47494620UL,
+<a name="l00776"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388c989381d37de320495e4d13f9ecc6371">00776</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388c989381d37de320495e4d13f9ecc6371" title="Public file format constant: &amp;#39;PNG &amp;#39;.">kXMP_PNGFile</a> = 0x504E4720UL,
+<a name="l00777"></a>00777
+<a name="l00779"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388564a8095f65d951f451e16eb56650597">00779</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388564a8095f65d951f451e16eb56650597" title="Public file format constant: &amp;#39;SWF &amp;#39;.">kXMP_SWFFile</a> = 0x53574620UL,
+<a name="l00781"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388b1eeba00d1d92e313acfe68cd054daf9">00781</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388b1eeba00d1d92e313acfe68cd054daf9" title="Public file format constant: &amp;#39;FLA &amp;#39;.">kXMP_FLAFile</a> = 0x464C4120UL,
+<a name="l00783"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388455bc501088bbd8061fe3ea386a5066f">00783</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388455bc501088bbd8061fe3ea386a5066f" title="Public file format constant: &amp;#39;FLV &amp;#39;.">kXMP_FLVFile</a> = 0x464C5620UL,
+<a name="l00784"></a>00784
+<a name="l00786"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388ebdb172c8a75b4ead2eff2d26ed3dc37">00786</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388ebdb172c8a75b4ead2eff2d26ed3dc37" title="Public file format constant: &amp;#39;MOV &amp;#39;, Quicktime.">kXMP_MOVFile</a> = 0x4D4F5620UL,
+<a name="l00788"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388e3a6333624e5c292caf14ad849a5e26e">00788</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388e3a6333624e5c292caf14ad849a5e26e" title="Public file format constant: &amp;#39;AVI &amp;#39;.">kXMP_AVIFile</a> = 0x41564920UL,
+<a name="l00790"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d2935ea79b4f9253891e3a68a002c5bb">00790</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d2935ea79b4f9253891e3a68a002c5bb" title="Public file format constant: &amp;#39;CIN &amp;#39;, Cineon.">kXMP_CINFile</a> = 0x43494E20UL,
+<a name="l00792"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388cc1fcd4e52423c0dd2966a2e92352fb8">00792</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388cc1fcd4e52423c0dd2966a2e92352fb8" title="Public file format constant: &amp;#39;WAV &amp;#39;.">kXMP_WAVFile</a> = 0x57415620UL,
+<a name="l00794"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388f3ee34ed2bc26dec0e2d572eeb0de89b">00794</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388f3ee34ed2bc26dec0e2d572eeb0de89b" title="Public file format constant: &amp;#39;MP3 &amp;#39;.">kXMP_MP3File</a> = 0x4D503320UL,
+<a name="l00796"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038842cb8767d9cf16eaeb7aec68a4f224e9">00796</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038842cb8767d9cf16eaeb7aec68a4f224e9" title="Public file format constant: &amp;#39;SES &amp;#39;, Audition session.">kXMP_SESFile</a> = 0x53455320UL,
+<a name="l00798"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403886c949ee85f42eaaed035591338be6789">00798</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403886c949ee85f42eaaed035591338be6789" title="Public file format constant: &amp;#39;CEL &amp;#39;, Audition loop.">kXMP_CELFile</a> = 0x43454C20UL,
+<a name="l00800"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388043afdc1db730db9ac03c505140c61c8">00800</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388043afdc1db730db9ac03c505140c61c8" title="Public file format constant: &amp;#39;MPEG&amp;#39;.">kXMP_MPEGFile</a> = 0x4D504547UL,
+<a name="l00802"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388b58eaebed494530072ad990ac7a9807a">00802</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388b58eaebed494530072ad990ac7a9807a" title="Public file format constant: &amp;#39;MP2 &amp;#39;.">kXMP_MPEG2File</a> = 0x4D503220UL,
+<a name="l00804"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038889e6282c3f0c8966d788500f5d8eaa91">00804</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038889e6282c3f0c8966d788500f5d8eaa91" title="Public file format constant: &amp;#39;MP4 &amp;#39;, ISO 14494-12 and -14.">kXMP_MPEG4File</a> = 0x4D503420UL,
+<a name="l00806"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038878c62f7c10b16b1a862d93f6226a4622">00806</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038878c62f7c10b16b1a862d93f6226a4622" title="Public file format constant: &amp;#39;WMAV&amp;#39;, Windows Media Audio and Video.">kXMP_WMAVFile</a> = 0x574D4156UL,
+<a name="l00808"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388f093d01e7e9cc55a7d1e204498521fc3">00808</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388f093d01e7e9cc55a7d1e204498521fc3" title="Public file format constant: &amp;#39;AIFF&amp;#39;.">kXMP_AIFFFile</a> = 0x41494646UL,
+<a name="l00810"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388bad9584845edf66f2f8fc3c336977e34">00810</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388bad9584845edf66f2f8fc3c336977e34" title="Public file format constant: &amp;#39;P2 &amp;#39;, a collection not really a single file...">kXMP_P2File</a> = 0x50322020UL,
+<a name="l00812"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403885f78caa0871695cc92e058e4f4b2dd57">00812</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403885f78caa0871695cc92e058e4f4b2dd57" title="Public file format constant: &amp;#39;XDCF&amp;#39;, a collection not really a single file...">kXMP_XDCAM_FAMFile</a> = 0x58444346UL,
+<a name="l00814"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038864fe7908df6341e13d9d8c8199cdf852">00814</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038864fe7908df6341e13d9d8c8199cdf852" title="Public file format constant: &amp;#39;XDCS&amp;#39;, a collection not really a single file...">kXMP_XDCAM_SAMFile</a> = 0x58444353UL,
+<a name="l00816"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038845bf9b21d5ffed3594fbd585c47cc4fc">00816</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038845bf9b21d5ffed3594fbd585c47cc4fc" title="Public file format constant: &amp;#39;XDCX&amp;#39;, a collection not really a single file...">kXMP_XDCAM_EXFile</a> = 0x58444358UL,
+<a name="l00818"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388fc5ff976e78df2d79d651de818b011f2">00818</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388fc5ff976e78df2d79d651de818b011f2" title="Public file format constant: &amp;#39;AVHD&amp;#39;, a collection not really a single file...">kXMP_AVCHDFile</a> = 0x41564844UL,
+<a name="l00820"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388a0edb070c11f87c3dad9f8f7a83b9b5e">00820</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388a0edb070c11f87c3dad9f8f7a83b9b5e" title="Public file format constant: &amp;#39;SHDV&amp;#39;, a collection not really a single file...">kXMP_SonyHDVFile</a> = 0x53484456UL,
+<a name="l00821"></a>00821
+<a name="l00823"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388542634e6051139c44fd7b92d08c64760">00823</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388542634e6051139c44fd7b92d08c64760" title="Public file format constant: &amp;#39;HTML&amp;#39;.">kXMP_HTMLFile</a> = 0x48544D4CUL,
+<a name="l00825"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d217b996403fa13caef3d6e978023124">00825</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d217b996403fa13caef3d6e978023124" title="Public file format constant: &amp;#39;XML &amp;#39;.">kXMP_XMLFile</a> = 0x584D4C20UL,
+<a name="l00827"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038827051cd824d3ae7bb59e3af7a7908ffd">00827</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038827051cd824d3ae7bb59e3af7a7908ffd" title="Public file format constant: &amp;#39;text&amp;#39;.">kXMP_TextFile</a> = 0x74657874UL,
+<a name="l00828"></a>00828
+<a name="l00829"></a>00829 <span class="comment">// -------------------------------</span>
+<a name="l00830"></a>00830 <span class="comment">// Adobe application file formats.</span>
+<a name="l00831"></a>00831
+<a name="l00833"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038822b478a9d0d52d12e8e4a1181024eb1c">00833</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038822b478a9d0d52d12e8e4a1181024eb1c" title="Adobe application file format constant: &amp;#39;PSD &amp;#39;.">kXMP_PhotoshopFile</a> = 0x50534420UL,
+<a name="l00835"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038882935c41c6222ff4cca954278f18e554">00835</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038882935c41c6222ff4cca954278f18e554" title="Adobe application file format constant: &amp;#39;AI &amp;#39;.">kXMP_IllustratorFile</a> = 0x41492020UL,
+<a name="l00837"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038879cbf96ecc4ac3e0ebfb2d182bc75e60">00837</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038879cbf96ecc4ac3e0ebfb2d182bc75e60" title="Adobe application file format constant: &amp;#39;INDD&amp;#39;.">kXMP_InDesignFile</a> = 0x494E4444UL,
+<a name="l00839"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403885fb9e99541bbb2d8e375d0cc9fd92a2e">00839</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403885fb9e99541bbb2d8e375d0cc9fd92a2e" title="Adobe application file format constant: &amp;#39;AEP &amp;#39;.">kXMP_AEProjectFile</a> = 0x41455020UL,
+<a name="l00841"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388da5b138722448c4d4595fe760668c3df">00841</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388da5b138722448c4d4595fe760668c3df" title="Adobe application file format constant: &amp;#39;AET &amp;#39;, After Effects Project Template...">kXMP_AEProjTemplateFile</a> = 0x41455420UL,
+<a name="l00843"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388fd8d3d1c8c84bc6ab773f1298b3938f0">00843</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388fd8d3d1c8c84bc6ab773f1298b3938f0" title="Adobe application file format constant: &amp;#39;FFX &amp;#39;.">kXMP_AEFilterPresetFile</a> = 0x46465820UL,
+<a name="l00845"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388e28efb65bde55f3f8ddfd1fd8a168e2a">00845</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388e28efb65bde55f3f8ddfd1fd8a168e2a" title="Adobe application file format constant: &amp;#39;NCOR&amp;#39;.">kXMP_EncoreProjectFile</a> = 0x4E434F52UL,
+<a name="l00847"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388eff4f68cd5162370f7bf938a868e280d">00847</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388eff4f68cd5162370f7bf938a868e280d" title="Adobe application file format constant: &amp;#39;PRPJ&amp;#39;.">kXMP_PremiereProjectFile</a> = 0x5052504AUL,
+<a name="l00849"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403881ad712bbd349dc899ca1e71971032b0a">00849</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403881ad712bbd349dc899ca1e71971032b0a" title="Adobe application file format constant: &amp;#39;PRTL&amp;#39;.">kXMP_PremiereTitleFile</a> = 0x5052544CUL,
+<a name="l00851"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038896804f7b8ce83786051c4dac4930aa96">00851</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038896804f7b8ce83786051c4dac4930aa96" title="Adobe application file format constant: &amp;#39;UCF &amp;#39;, Universal Container Format...">kXMP_UCFFile</a> = 0x55434620UL,
+<a name="l00852"></a>00852
+<a name="l00853"></a>00853 <span class="comment">// -------</span>
+<a name="l00854"></a>00854 <span class="comment">// Others.</span>
+<a name="l00855"></a>00855
+<a name="l00857"></a><a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403882845f95eaaaf492f5011bff05a398719">00857</a> <a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403882845f95eaaaf492f5011bff05a398719" title="Unknown file format constant: &amp;#39; &amp;#39;.">kXMP_UnknownFile</a> = 0x20202020UL
+<a name="l00858"></a>00858
+<a name="l00859"></a>00859 };
+<a name="l00860"></a>00860
+<a name="l00862"></a><a class="code" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">00862</a> <span class="keyword">typedef</span> XMP_Uns32 <a class="code" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e" title="Type for file format identification constants. See kXMP_PDFFile and following.">XMP_FileFormat</a>;
+<a name="l00863"></a>00863
+<a name="l00864"></a>00864 <span class="comment">// -------------------------------------------------------------------------------------------------</span>
+<a name="l00865"></a>00865
+<a name="l00867"></a>00867 <span class="keyword">enum</span> {
+<a name="l00868"></a>00868 kXMP_CharLittleEndianMask = 1,
+<a name="l00869"></a>00869 kXMP_Char16BitMask = 2,
+<a name="l00870"></a>00870 kXMP_Char32BitMask = 4
+<a name="l00871"></a>00871 };
+<a name="l00872"></a>00872
+<a name="l00874"></a>00874 <span class="keyword">enum</span> {
+<a name="l00876"></a><a class="code" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c8f5b20dd9abbef29169a362b265049637">00876</a> <a class="code" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c8f5b20dd9abbef29169a362b265049637" title="8-bit">kXMP_Char8Bit</a> = 0,
+<a name="l00878"></a><a class="code" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c80966bca9b241646f6a730f96c5c14a2d">00878</a> <a class="code" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c80966bca9b241646f6a730f96c5c14a2d" title="16-bit big-endian">kXMP_Char16BitBig</a> = kXMP_Char16BitMask,
+<a name="l00880"></a><a class="code" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c819b97b941d6586031190025225ee0eaa">00880</a> <a class="code" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c819b97b941d6586031190025225ee0eaa" title="16-bit little-endian">kXMP_Char16BitLittle</a> = kXMP_Char16BitMask | kXMP_CharLittleEndianMask,
+<a name="l00882"></a><a class="code" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c887f8231aec6dd125baf77c9f3f918fbc">00882</a> <a class="code" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c887f8231aec6dd125baf77c9f3f918fbc" title="32-bit big-endian">kXMP_Char32BitBig</a> = kXMP_Char32BitMask,
+<a name="l00884"></a><a class="code" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c8859e7aa88e7dfd3f55ad2b6445a4708e">00884</a> <a class="code" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c8859e7aa88e7dfd3f55ad2b6445a4708e" title="32-bit little-endian">kXMP_Char32BitLittle</a> = kXMP_Char32BitMask | kXMP_CharLittleEndianMask,
+<a name="l00886"></a><a class="code" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c86c37f0724299a9c88e2f622d3246d63b">00886</a> <a class="code" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c86c37f0724299a9c88e2f622d3246d63b" title="Variable or not-yet-known cases.">kXMP_CharUnknown</a> = 1
+<a name="l00887"></a>00887 };
+<a name="l00888"></a>00888
+<a name="l00921"></a>00921
+<a name="l00922"></a><a class="code" href="XMP__Const_8h.html#a7596216164335f926cb91d600cddf99">00922</a> <span class="preprocessor">#define XMP_CharFormIs16Bit(f) ( ((int)(f) &amp; kXMP_Char16BitMask) != 0 )</span>
+<a name="l00923"></a><a class="code" href="XMP__Const_8h.html#1e99ef08266943f52f5c649ab2836ddf">00923</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_CharFormIs32Bit(f) ( ((int)(f) &amp; kXMP_Char32BitMask) != 0 )</span>
+<a name="l00924"></a><a class="code" href="XMP__Const_8h.html#ba2539629b8d238fc56a1901dd07ebca">00924</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_CharFormIsBigEndian(f) ( ((int)(f) &amp; kXMP_CharLittleEndianMask) == 0 )</span>
+<a name="l00925"></a><a class="code" href="XMP__Const_8h.html#906ec1cd2fb1631c1b5ad9ccdf9c0a6b">00925</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_CharFormIsLittleEndian(f) ( ((int)(f) &amp; kXMP_CharLittleEndianMask) != 0 )</span>
+<a name="l00926"></a><a class="code" href="XMP__Const_8h.html#85bbf023b1b799c3c20176aa289d32b0">00926</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_GetCharSize(f) ( ((int)(f)&amp;6) == 0 ? 1 : (int)(f)&amp;6 )</span>
+<a name="l00927"></a><a class="code" href="XMP__Const_8h.html#8f522964919b742b4138c79611997bae">00927</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_CharToSerializeForm(cf) ( (XMP_OptionBits)(cf) )</span>
+<a name="l00928"></a><a class="code" href="XMP__Const_8h.html#93e7900e6c9fb4057dfd685b5201057d">00928</a> <span class="preprocessor"></span><span class="preprocessor">#define XMP_CharFromSerializeForm(sf) ( (XMP_Uns8)(sf) )</span>
+<a name="l00929"></a>00929 <span class="preprocessor"></span>
+<a name="l00932"></a><a class="code" href="XMP__Const_8h.html#6a9b77b60c63781a8776f10880856bf4">00932</a> <span class="preprocessor">#define kXMPFiles_UnknownOffset ((XMP_Int64)-1)</span>
+<a name="l00933"></a>00933 <span class="preprocessor"></span>
+<a name="l00936"></a><a class="code" href="XMP__Const_8h.html#e0901aabcf619f17cff03f08e5ed3658">00936</a> <span class="preprocessor">#define kXMPFiles_UnknownLength ((XMP_Int32)-1)</span>
+<a name="l00937"></a>00937 <span class="preprocessor"></span>
+<a name="l00939"></a><a class="code" href="structXMP__PacketInfo.html">00939</a> <span class="keyword">struct </span><a class="code" href="structXMP__PacketInfo.html" title="XMP packet description.">XMP_PacketInfo</a> {
+<a name="l00940"></a>00940
+<a name="l00942"></a><a class="code" href="structXMP__PacketInfo.html#20f65fcfd0f3658ab93ff441a9d61d2c">00942</a> XMP_Int64 <a class="code" href="structXMP__PacketInfo.html#20f65fcfd0f3658ab93ff441a9d61d2c" title="Packet offset in the file in bytes, -1 if unknown.">offset</a>;
+<a name="l00944"></a><a class="code" href="structXMP__PacketInfo.html#f526c582b66e24553f2d4b11eb714a44">00944</a> XMP_Int32 <a class="code" href="structXMP__PacketInfo.html#f526c582b66e24553f2d4b11eb714a44" title="Packet length in the file in bytes, -1 if unknown.">length</a>;
+<a name="l00946"></a><a class="code" href="structXMP__PacketInfo.html#f4f99e6a5b36b05fdf4a519421875256">00946</a> XMP_Int32 <a class="code" href="structXMP__PacketInfo.html#f4f99e6a5b36b05fdf4a519421875256" title="Packet padding size in bytes, zero if unknown.">padSize</a>; <span class="comment">// Zero if unknown.</span>
+<a name="l00947"></a>00947
+<a name="l00949"></a><a class="code" href="structXMP__PacketInfo.html#039ce6665fe8e08d922a46f266799f75">00949</a> XMP_Uns8 <a class="code" href="structXMP__PacketInfo.html#039ce6665fe8e08d922a46f266799f75" title="Character format using the values kXMP_Char8Bit, kXMP_Char16BitBig, etc.">charForm</a>;
+<a name="l00951"></a><a class="code" href="structXMP__PacketInfo.html#66845c1d5f3f9f36a1543a7322bd7bd1">00951</a> XMP_Bool <a class="code" href="structXMP__PacketInfo.html#66845c1d5f3f9f36a1543a7322bd7bd1" title="True if there is a packet wrapper and the trailer says writeable by dumb packet scanners...">writeable</a>;
+<a name="l00953"></a><a class="code" href="structXMP__PacketInfo.html#6725d8ab8b4eedddaac950d2b1b00a7f">00953</a> XMP_Bool <a class="code" href="structXMP__PacketInfo.html#6725d8ab8b4eedddaac950d2b1b00a7f" title="True if there is a packet wrapper, the &amp;quot;&amp;lt;?xpacket...&amp;gt;&amp;quot; XML processing...">hasWrapper</a>;
+<a name="l00954"></a>00954
+<a name="l00956"></a><a class="code" href="structXMP__PacketInfo.html#83ec12161a36451fef05d88cc754104e">00956</a> XMP_Uns8 <a class="code" href="structXMP__PacketInfo.html#83ec12161a36451fef05d88cc754104e" title="Padding to make the struct&amp;#39;s size be a multiple 4.">pad</a>;
+<a name="l00957"></a>00957
+<a name="l00959"></a><a class="code" href="structXMP__PacketInfo.html#2ae03a1b3d03fa9ebc829105037155a8">00959</a> <a class="code" href="structXMP__PacketInfo.html#2ae03a1b3d03fa9ebc829105037155a8" title="Default constructor.">XMP_PacketInfo</a>() : <a class="code" href="structXMP__PacketInfo.html#20f65fcfd0f3658ab93ff441a9d61d2c" title="Packet offset in the file in bytes, -1 if unknown.">offset</a>(<a class="code" href="XMP__Const_8h.html#6a9b77b60c63781a8776f10880856bf4" title="Constant for an unknown packet offset within a file.">kXMPFiles_UnknownOffset</a>), <a class="code" href="structXMP__PacketInfo.html#f526c582b66e24553f2d4b11eb714a44" title="Packet length in the file in bytes, -1 if unknown.">length</a>(<a class="code" href="XMP__Const_8h.html#e0901aabcf619f17cff03f08e5ed3658" title="Constant for an unknown packet length within a file.">kXMPFiles_UnknownLength</a>),
+<a name="l00960"></a>00960 <a class="code" href="structXMP__PacketInfo.html#f4f99e6a5b36b05fdf4a519421875256" title="Packet padding size in bytes, zero if unknown.">padSize</a>(0), <a class="code" href="structXMP__PacketInfo.html#039ce6665fe8e08d922a46f266799f75" title="Character format using the values kXMP_Char8Bit, kXMP_Char16BitBig, etc.">charForm</a>(0), <a class="code" href="structXMP__PacketInfo.html#66845c1d5f3f9f36a1543a7322bd7bd1" title="True if there is a packet wrapper and the trailer says writeable by dumb packet scanners...">writeable</a>(0), <a class="code" href="structXMP__PacketInfo.html#6725d8ab8b4eedddaac950d2b1b00a7f" title="True if there is a packet wrapper, the &amp;quot;&amp;lt;?xpacket...&amp;gt;&amp;quot; XML processing...">hasWrapper</a>(0), <a class="code" href="structXMP__PacketInfo.html#83ec12161a36451fef05d88cc754104e" title="Padding to make the struct&amp;#39;s size be a multiple 4.">pad</a>(0) {};
+<a name="l00961"></a>00961
+<a name="l00962"></a>00962 };
+<a name="l00963"></a>00963
+<a name="l00965"></a>00965 <span class="keyword">enum</span> {
+<a name="l00967"></a><a class="code" href="XMP__Const_8h.html#05589fbab0657f08285ebdfe93f5ec9e767b4847575a8de28e691be660d43817">00967</a> <a class="code" href="XMP__Const_8h.html#05589fbab0657f08285ebdfe93f5ec9e767b4847575a8de28e691be660d43817" title="Version of the XMP_PacketInfo type.">kXMP_PacketInfoVersion</a> = 3
+<a name="l00968"></a>00968 };
+<a name="l00969"></a>00969
+<a name="l00970"></a>00970 <span class="comment">// -------------------------------------------------------------------------------------------------</span>
+<a name="l00971"></a>00971
+<a name="l00973"></a>00973 <span class="keyword">enum</span> {
+<a name="l00975"></a><a class="code" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4d7a20b5cd0872055d043b3593e18f41d6">00975</a> <a class="code" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4d7a20b5cd0872055d043b3593e18f41d6" title="The thumbnail data has an unknown format.">kXMP_UnknownTNail</a> = 0,
+<a name="l00977"></a><a class="code" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4d5184f12e2695285b081ddafc5aeb4321">00977</a> <a class="code" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4d5184f12e2695285b081ddafc5aeb4321" title="The thumbnail data is a JPEG stream, presumably compressed.">kXMP_JPEGTNail</a> = 1,
+<a name="l00979"></a><a class="code" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4ddf767c0e478570baac04311b7b79f951">00979</a> <a class="code" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4ddf767c0e478570baac04311b7b79f951" title="The thumbnail data is a TIFF stream, presumably uncompressed.">kXMP_TIFFTNail</a> = 2,
+<a name="l00981"></a><a class="code" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4db3207f0166247f17fa913daec2b771ab">00981</a> <a class="code" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4db3207f0166247f17fa913daec2b771ab" title="The thumbnail data is in the format of Photoshop Image Resource 1036.">kXMP_PShopTNail</a> = 3
+<a name="l00982"></a>00982 };
+<a name="l00983"></a>00983
+<a name="l00985"></a><a class="code" href="structXMP__ThumbnailInfo.html">00985</a> <span class="keyword">struct </span><a class="code" href="structXMP__ThumbnailInfo.html" title="Thumbnail descriptor.">XMP_ThumbnailInfo</a> {
+<a name="l00986"></a>00986
+<a name="l00988"></a><a class="code" href="structXMP__ThumbnailInfo.html#9bd0982c79d43f96a253486e79c453df">00988</a> XMP_FileFormat <a class="code" href="structXMP__ThumbnailInfo.html#9bd0982c79d43f96a253486e79c453df" title="The format of the containing file.">fileFormat</a>;
+<a name="l00990"></a><a class="code" href="structXMP__ThumbnailInfo.html#89f158688c90cef1df24bbfb7770a881">00990</a> XMP_Uns32 <a class="code" href="structXMP__ThumbnailInfo.html#89f158688c90cef1df24bbfb7770a881" title="Full image size in pixels.">fullWidth</a>, fullHeight;
+<a name="l00992"></a><a class="code" href="structXMP__ThumbnailInfo.html#17ac245bb300328031f998ba13f0169b">00992</a> XMP_Uns32 <a class="code" href="structXMP__ThumbnailInfo.html#17ac245bb300328031f998ba13f0169b" title="Thumbnail image size in pixels.">tnailWidth</a>, tnailHeight;
+<a name="l00994"></a>00994
+<a name="l00995"></a><a class="code" href="structXMP__ThumbnailInfo.html#ffcd0f874cb6c5faaf8d595956cabf24">00995</a> XMP_Uns16 <a class="code" href="structXMP__ThumbnailInfo.html#ffcd0f874cb6c5faaf8d595956cabf24" title="Orientation of full image and thumbnail, as defined by Exif for tag 274.">fullOrientation</a>, tnailOrientation;
+<a name="l00997"></a><a class="code" href="structXMP__ThumbnailInfo.html#683c74dc7168f0046204ea153de3c179">00997</a> <span class="keyword">const</span> XMP_Uns8 * <a class="code" href="structXMP__ThumbnailInfo.html#683c74dc7168f0046204ea153de3c179" title="Raw image data from the host file, valid for life of the owning XMPFiles object....">tnailImage</a>;
+<a name="l00999"></a><a class="code" href="structXMP__ThumbnailInfo.html#77072568158233d0c44dd4c8636366ff">00999</a> XMP_Uns32 <a class="code" href="structXMP__ThumbnailInfo.html#77072568158233d0c44dd4c8636366ff" title="The size in bytes of the thumbnail image data.">tnailSize</a>;
+<a name="l01001"></a><a class="code" href="structXMP__ThumbnailInfo.html#f57b103c5a78c636afc3a391f28a5906">01001</a> XMP_Uns8 <a class="code" href="structXMP__ThumbnailInfo.html#f57b103c5a78c636afc3a391f28a5906" title="The format of the thumbnail image data.">tnailFormat</a>;
+<a name="l01002"></a>01002
+<a name="l01004"></a><a class="code" href="structXMP__ThumbnailInfo.html#6ccab4dea65d89c7ab141b59ac055955">01004</a> XMP_Uns8 <a class="code" href="structXMP__ThumbnailInfo.html#6ccab4dea65d89c7ab141b59ac055955" title="Padding to make the struct&amp;#39;s size be a multiple 4.">pad1</a>, pad2, pad3;
+<a name="l01005"></a>01005
+<a name="l01007"></a><a class="code" href="structXMP__ThumbnailInfo.html#20b6acef9b825defe492b3d120532828">01007</a> <a class="code" href="structXMP__ThumbnailInfo.html#20b6acef9b825defe492b3d120532828" title="Default constructor.">XMP_ThumbnailInfo</a>() : <a class="code" href="structXMP__ThumbnailInfo.html#9bd0982c79d43f96a253486e79c453df" title="The format of the containing file.">fileFormat</a>(<a class="code" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403882845f95eaaaf492f5011bff05a398719" title="Unknown file format constant: &amp;#39; &amp;#39;.">kXMP_UnknownFile</a>), <a class="code" href="structXMP__ThumbnailInfo.html#89f158688c90cef1df24bbfb7770a881" title="Full image size in pixels.">fullWidth</a>(0), fullHeight(0),
+<a name="l01008"></a>01008 <a class="code" href="structXMP__ThumbnailInfo.html#17ac245bb300328031f998ba13f0169b" title="Thumbnail image size in pixels.">tnailWidth</a>(0), tnailHeight(0), <a class="code" href="structXMP__ThumbnailInfo.html#ffcd0f874cb6c5faaf8d595956cabf24" title="Orientation of full image and thumbnail, as defined by Exif for tag 274.">fullOrientation</a>(0), tnailOrientation(0),
+<a name="l01009"></a>01009 <a class="code" href="structXMP__ThumbnailInfo.html#683c74dc7168f0046204ea153de3c179" title="Raw image data from the host file, valid for life of the owning XMPFiles object....">tnailImage</a>(0), <a class="code" href="structXMP__ThumbnailInfo.html#77072568158233d0c44dd4c8636366ff" title="The size in bytes of the thumbnail image data.">tnailSize</a>(0), <a class="code" href="structXMP__ThumbnailInfo.html#f57b103c5a78c636afc3a391f28a5906" title="The format of the thumbnail image data.">tnailFormat</a>(<a class="code" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4d7a20b5cd0872055d043b3593e18f41d6" title="The thumbnail data has an unknown format.">kXMP_UnknownTNail</a>) {};
+<a name="l01010"></a>01010
+<a name="l01011"></a>01011 };
+<a name="l01012"></a>01012
+<a name="l01014"></a>01014 <span class="keyword">enum</span> {
+<a name="l01016"></a><a class="code" href="XMP__Const_8h.html#ba01db17f4a2bfbc3db60dc172972a25b1e9c825d1f58e696f34c8940b0176be">01016</a> <a class="code" href="XMP__Const_8h.html#ba01db17f4a2bfbc3db60dc172972a25b1e9c825d1f58e696f34c8940b0176be" title="Version of the XMP_ThumbnailInfo type.">kXMP_ThumbnailInfoVersion</a> = 1
+<a name="l01017"></a>01017 };
+<a name="l01018"></a>01018
+<a name="l01019"></a>01019 <span class="comment">// -------------------------------------------------------------------------------------------------</span>
+<a name="l01020"></a>01020
+<a name="l01022"></a>01022 <span class="keyword">enum</span> {
+<a name="l01024"></a><a class="code" href="XMP__Const_8h.html#af105ae5beaca1dee30ae54530691fce4e1723c609cc341c88f254473e315ae9">01024</a> <a class="code" href="XMP__Const_8h.html#af105ae5beaca1dee30ae54530691fce4e1723c609cc341c88f254473e315ae9" title="Do not initialize QuickTime, the client will.">kXMPFiles_NoQuickTimeInit</a> = 0x0001
+<a name="l01025"></a>01025 };
+<a name="l01026"></a>01026
+<a name="l01028"></a>01028 <span class="keyword">enum</span> {
+<a name="l01029"></a>01029
+<a name="l01031"></a><a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba23a3eb2a5e95292036a93ad6666fa388">01031</a> <a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba23a3eb2a5e95292036a93ad6666fa388" title="Can inject first-time XMP into an existing file.">kXMPFiles_CanInjectXMP</a> = 0x00000001,
+<a name="l01032"></a>01032
+<a name="l01034"></a><a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba126c9cc056f6569c424431edbcb9521c">01034</a> <a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba126c9cc056f6569c424431edbcb9521c" title="Can expand XMP or other metadata in an existing file.">kXMPFiles_CanExpand</a> = 0x00000002,
+<a name="l01035"></a>01035
+<a name="l01037"></a><a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba8957f1ef358b4ab3a1df519903f2ae07">01037</a> <a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba8957f1ef358b4ab3a1df519903f2ae07" title="Can copy one file to another, writing new metadata.">kXMPFiles_CanRewrite</a> = 0x00000004,
+<a name="l01038"></a>01038
+<a name="l01040"></a><a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabab55e1873e67048928de3fc47550678c3">01040</a> <a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabab55e1873e67048928de3fc47550678c3" title="Can expand, but prefers in-place update.">kXMPFiles_PrefersInPlace</a> = 0x00000008,
+<a name="l01041"></a>01041
+<a name="l01043"></a><a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabafc2bc7cfdd28a326788d563ec0357694">01043</a> <a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabafc2bc7cfdd28a326788d563ec0357694" title="Supports reconciliation between XMP and other forms.">kXMPFiles_CanReconcile</a> = 0x00000010,
+<a name="l01044"></a>01044
+<a name="l01046"></a><a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba4a183c3ec4994cf09993e5b31dee9733">01046</a> <a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba4a183c3ec4994cf09993e5b31dee9733" title="Allows access to just the XMP, ignoring other forms.">kXMPFiles_AllowsOnlyXMP</a> = 0x00000020,
+<a name="l01047"></a>01047
+<a name="l01049"></a><a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabadb116eed738d1fcdfe4ab9c1635e08ea">01049</a> <a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabadb116eed738d1fcdfe4ab9c1635e08ea" title="File handler returns raw XMP packet information.">kXMPFiles_ReturnsRawPacket</a> = 0x00000040,
+<a name="l01050"></a>01050
+<a name="l01052"></a><a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabaf7fe49636dc1fcc0d6938d4b6fb83a09">01052</a> <a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabaf7fe49636dc1fcc0d6938d4b6fb83a09" title="File handler returns native thumbnail.">kXMPFiles_ReturnsTNail</a> = 0x00000080,
+<a name="l01053"></a>01053
+<a name="l01055"></a><a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabafc2c5b585e698ebf24a9379de35954b4">01055</a> <a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabafc2c5b585e698ebf24a9379de35954b4" title="The file handler does the file open and close.">kXMPFiles_HandlerOwnsFile</a> = 0x00000100,
+<a name="l01056"></a>01056
+<a name="l01058"></a><a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba9fe958d4ccde02516a3a267db63874cd">01058</a> <a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba9fe958d4ccde02516a3a267db63874cd" title="The file handler allows crash-safe file updates.">kXMPFiles_AllowsSafeUpdate</a> = 0x00000200,
+<a name="l01059"></a>01059
+<a name="l01061"></a><a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabaee13099f78018a5e1ce033266c27e999">01061</a> <a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabaee13099f78018a5e1ce033266c27e999" title="The file format needs the XMP packet to be read-only.">kXMPFiles_NeedsReadOnlyPacket</a> = 0x00000400,
+<a name="l01062"></a>01062
+<a name="l01064"></a><a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabad3027b786992e2a4762a4fa37c92943c">01064</a> <a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabad3027b786992e2a4762a4fa37c92943c" title="The file handler uses a &amp;quot;sidecar&amp;quot; file for the XMP.">kXMPFiles_UsesSidecarXMP</a> = 0x00000800,
+<a name="l01065"></a>01065
+<a name="l01067"></a><a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabaa2a6a4b744b40055387234632b688fcd">01067</a> <a class="code" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabaa2a6a4b744b40055387234632b688fcd" title="The format is folder oriented, for example the P2 video format.">kXMPFiles_FolderBasedFormat</a> = 0x00001000
+<a name="l01068"></a>01068
+<a name="l01069"></a>01069 };
+<a name="l01070"></a>01070
+<a name="l01072"></a>01072 <span class="keyword">enum</span> {
+<a name="l01073"></a>01073
+<a name="l01075"></a><a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea4c61ec4ed571dbc5f1832ff6772320d2">01075</a> <a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea4c61ec4ed571dbc5f1832ff6772320d2" title="Open for read-only access.">kXMPFiles_OpenForRead</a> = 0x00000001,
+<a name="l01076"></a>01076
+<a name="l01078"></a><a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea91fa388b3888bcb6a68615537b66a49b">01078</a> <a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea91fa388b3888bcb6a68615537b66a49b" title="Open for reading and writing.">kXMPFiles_OpenForUpdate</a> = 0x00000002,
+<a name="l01079"></a>01079
+<a name="l01081"></a><a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaa58279b2b1311242e7374117f455bb96">01081</a> <a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaa58279b2b1311242e7374117f455bb96" title="Only the XMP is wanted, allows space/time optimizations.">kXMPFiles_OpenOnlyXMP</a> = 0x00000004,
+<a name="l01082"></a>01082
+<a name="l01084"></a><a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaca2002b03d2a88da0203bf52a3122063">01084</a> <a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaca2002b03d2a88da0203bf52a3122063" title="Cache thumbnail if possible, TXMPFiles::GetThumbnail() will be called.">kXMPFiles_OpenCacheTNail</a> = 0x00000008,
+<a name="l01085"></a>01085
+<a name="l01087"></a><a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea0bef4db2ecdaf82a85df9e9d417aab18">01087</a> <a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea0bef4db2ecdaf82a85df9e9d417aab18" title="Be strict about locating XMP and reconciling with other forms.">kXMPFiles_OpenStrictly</a> = 0x00000010,
+<a name="l01088"></a>01088
+<a name="l01090"></a><a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaf6332435c7fc89cb0b7381e13fe43646">01090</a> <a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaf6332435c7fc89cb0b7381e13fe43646" title="Require the use of a smart handler.">kXMPFiles_OpenUseSmartHandler</a> = 0x00000020,
+<a name="l01091"></a>01091
+<a name="l01093"></a><a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea77b47c63e579b28cbd25083ceb58c285">01093</a> <a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea77b47c63e579b28cbd25083ceb58c285" title="Force packet scanning, do not use a smart handler.">kXMPFiles_OpenUsePacketScanning</a> = 0x00000040,
+<a name="l01094"></a>01094
+<a name="l01096"></a><a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea77f34b1873bb2584feabe26a2c8f1182">01096</a> <a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea77f34b1873bb2584feabe26a2c8f1182" title="Only packet scan files &amp;quot;known&amp;quot; to need scanning.">kXMPFiles_OpenLimitedScanning</a> = 0x00000080,
+<a name="l01097"></a>01097
+<a name="l01099"></a><a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea05acd568597f72b4812b432ea6cf606a">01099</a> <a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea05acd568597f72b4812b432ea6cf606a" title="Attempt to repair a file opened for update, default is to not open (throw an exception)...">kXMPFiles_OpenRepairFile</a> = 0x00000100,
+<a name="l01100"></a>01100
+<a name="l01102"></a><a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eafaccd8151900b2c7fc3e7de598a92d34">01102</a> <a class="code" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eafaccd8151900b2c7fc3e7de598a92d34" title="Set if calling from background thread.">kXMPFiles_OpenInBackground</a> = 0x10000000
+<a name="l01103"></a>01103
+<a name="l01104"></a>01104 };
+<a name="l01105"></a>01105
+<a name="l01106"></a>01106 <span class="comment">// A note about kXMPFiles_OpenInBackground. The XMPFiles handler for .mov files currently uses</span>
+<a name="l01107"></a>01107 <span class="comment">// QuickTime. On Macintosh, calls to Enter/ExitMovies versus Enter/ExitMoviesOnThread must be made.</span>
+<a name="l01108"></a>01108 <span class="comment">// This option is used to signal background use so that the .mov handler can behave appropriately.</span>
+<a name="l01109"></a>01109
+<a name="l01111"></a>01111 <span class="keyword">enum</span> {
+<a name="l01113"></a><a class="code" href="XMP__Const_8h.html#f9bdc3014f3d54c426b6d2df10de4960dbf8d744f355ef9800a4ec44325baf54">01113</a> <a class="code" href="XMP__Const_8h.html#f9bdc3014f3d54c426b6d2df10de4960dbf8d744f355ef9800a4ec44325baf54" title="Write into a temporary file and swap for crash safety.">kXMPFiles_UpdateSafely</a> = 0x0001
+<a name="l01114"></a>01114 };
+<a name="l01115"></a>01115
+<a name="l01116"></a>01116 <span class="comment">// =================================================================================================</span>
+<a name="l01117"></a>01117 <span class="comment">// Exception codes</span>
+<a name="l01118"></a>01118 <span class="comment">// ===============</span>
+<a name="l01119"></a>01119
+<a name="l01133"></a>01133
+<a name="l01135"></a><a class="code" href="classXMP__Error.html">01135</a> <span class="keyword">class </span><a class="code" href="classXMP__Error.html" title="XMP Toolkit error, associates an error code with a descriptive error string.">XMP_Error</a> {
+<a name="l01136"></a>01136 <span class="keyword">public</span>:
+<a name="l01137"></a>01137
+<a name="l01144"></a><a class="code" href="classXMP__Error.html#a8b3b859899759d679b00237254e30aa">01144</a> <a class="code" href="classXMP__Error.html#a8b3b859899759d679b00237254e30aa" title="Constructor for an XMP_Error.">XMP_Error</a> ( XMP_Int32 _id, XMP_StringPtr _errMsg ) : <a class="code" href="classXMP__Error.html#ad714bd7c428e10eff07a8ab6a4f3125" title="Exception code. See constants kXMPErr_Unknown and following.">id</a>(_id), <a class="code" href="classXMP__Error.html#31fd80098e50026985e05abd16f3e045">errMsg</a>(_errMsg) {};
+<a name="l01145"></a>01145
+<a name="l01147"></a><a class="code" href="classXMP__Error.html#56aaa6fc6644ccfc9470ae1af8f3a8cd">01147</a> <span class="keyword">inline</span> XMP_Int32 <a class="code" href="classXMP__Error.html#56aaa6fc6644ccfc9470ae1af8f3a8cd" title="Retrieves the numeric code from an XMP_Error.">GetID</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classXMP__Error.html#ad714bd7c428e10eff07a8ab6a4f3125" title="Exception code. See constants kXMPErr_Unknown and following.">id</a>; };
+<a name="l01148"></a>01148
+<a name="l01150"></a><a class="code" href="classXMP__Error.html#ad714bd7c428e10eff07a8ab6a4f3125">01150</a> <span class="keyword">inline</span> XMP_StringPtr <a class="code" href="classXMP__Error.html#9a3560c67612dec9a6ca37c34eb2c153" title="Retrieves the descriptive string from an XMP_Error.">GetErrMsg</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classXMP__Error.html#31fd80098e50026985e05abd16f3e045">errMsg</a>; };
+<a name="l01151"></a>01151
+<a name="l01152"></a>01152 <span class="keyword">private</span>:
+<a name="l01154"></a>01154 XMP_Int32 <a class="code" href="classXMP__Error.html#ad714bd7c428e10eff07a8ab6a4f3125" title="Exception code. See constants kXMPErr_Unknown and following.">id</a>;
+<a name="l01157"></a><a class="code" href="classXMP__Error.html#31fd80098e50026985e05abd16f3e045">01157</a> XMP_StringPtr <a class="code" href="classXMP__Error.html#31fd80098e50026985e05abd16f3e045">errMsg</a>;
+<a name="l01158"></a>01158 };
+<a name="l01159"></a>01159
+<a name="l01161"></a>01161 <span class="keyword">enum</span> {
+<a name="l01162"></a>01162
+<a name="l01163"></a>01163 <span class="comment">// --------------------</span>
+<a name="l01164"></a>01164 <span class="comment">// Generic error codes.</span>
+<a name="l01165"></a>01165
+<a name="l01167"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40914813595824de97382fffeae7b6fe581">01167</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40914813595824de97382fffeae7b6fe581" title="Generic unknown error.">kXMPErr_Unknown</a> = 0,
+<a name="l01169"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409cd9fa1b621efafd5b218e3a785cbeda1">01169</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409cd9fa1b621efafd5b218e3a785cbeda1" title="Generic undefined error.">kXMPErr_TBD</a> = 1,
+<a name="l01171"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c7ac408582c194cc723a24acb8b4e4c3">01171</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c7ac408582c194cc723a24acb8b4e4c3" title="Generic unavailable error.">kXMPErr_Unavailable</a> = 2,
+<a name="l01173"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409115f3d761d2cad952aab23f35cbdf3a1">01173</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409115f3d761d2cad952aab23f35cbdf3a1" title="Generic bad object error.">kXMPErr_BadObject</a> = 3,
+<a name="l01175"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40952d197a8b0af3c55f16958162a4132f1">01175</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40952d197a8b0af3c55f16958162a4132f1" title="Generic bad parameter error.">kXMPErr_BadParam</a> = 4,
+<a name="l01177"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409716956a038782e595ce61d3fbdd1a25a">01177</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409716956a038782e595ce61d3fbdd1a25a" title="Generic bad value error.">kXMPErr_BadValue</a> = 5,
+<a name="l01179"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40914bd6c24087d280c722c1a044eec27d6">01179</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40914bd6c24087d280c722c1a044eec27d6" title="Generic assertion failure.">kXMPErr_AssertFailure</a> = 6,
+<a name="l01181"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409a856bb36a9742d8542b483e00fc6511b">01181</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409a856bb36a9742d8542b483e00fc6511b" title="Generic enforcement failure.">kXMPErr_EnforceFailure</a> = 7,
+<a name="l01183"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4093de1ac8f4e4afb705d5a4654cb9579e2">01183</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4093de1ac8f4e4afb705d5a4654cb9579e2" title="Generic unimplemented error.">kXMPErr_Unimplemented</a> = 8,
+<a name="l01185"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4098babbd758d2c64fd04e85fa48e0675c0">01185</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4098babbd758d2c64fd04e85fa48e0675c0" title="Generic internal failure.">kXMPErr_InternalFailure</a> = 9,
+<a name="l01187"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40914342c486ddf394ebc110a446becbfa7">01187</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40914342c486ddf394ebc110a446becbfa7" title="Generic deprecated error.">kXMPErr_Deprecated</a> = 10,
+<a name="l01189"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40982941dc15c6ccde6b8fb2f9cc85c2eeb">01189</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40982941dc15c6ccde6b8fb2f9cc85c2eeb" title="Generic external failure.">kXMPErr_ExternalFailure</a> = 11,
+<a name="l01191"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c4ba7b1a57629e4994a0f7a515d51195">01191</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c4ba7b1a57629e4994a0f7a515d51195" title="Generic user abort error.">kXMPErr_UserAbort</a> = 12,
+<a name="l01193"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4095322df07e2a7792824d2468c4837f1cb">01193</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4095322df07e2a7792824d2468c4837f1cb" title="Generic standard exception.">kXMPErr_StdException</a> = 13,
+<a name="l01195"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409ac7558097a1f5a0f99097199f1bf8ff4">01195</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409ac7558097a1f5a0f99097199f1bf8ff4" title="Generic unknown exception.">kXMPErr_UnknownException</a> = 14,
+<a name="l01197"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40969eb7fef422fbca62cdbc554afffd813">01197</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40969eb7fef422fbca62cdbc554afffd813" title="Generic out-of-memory error.">kXMPErr_NoMemory</a> = 15,
+<a name="l01198"></a>01198
+<a name="l01199"></a>01199 <span class="comment">// ------------------------------------</span>
+<a name="l01200"></a>01200 <span class="comment">// More specific parameter error codes.</span>
+<a name="l01201"></a>01201
+<a name="l01203"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4092bc66eec6ce830979089d5c336f75539">01203</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4092bc66eec6ce830979089d5c336f75539" title="Bad schema parameter.">kXMPErr_BadSchema</a> = 101,
+<a name="l01205"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4093f1efec0aa5452f43c55c05aba616ef7">01205</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4093f1efec0aa5452f43c55c05aba616ef7" title="Bad XPath parameter.">kXMPErr_BadXPath</a> = 102,
+<a name="l01207"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40940ca77d98bd366442bb8d438c420a444">01207</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40940ca77d98bd366442bb8d438c420a444" title="Bad options parameter.">kXMPErr_BadOptions</a> = 103,
+<a name="l01209"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40931adb57da79b4fb1f1f5f999ec740010">01209</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40931adb57da79b4fb1f1f5f999ec740010" title="Bad index parameter.">kXMPErr_BadIndex</a> = 104,
+<a name="l01211"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4092584fc813bfcd9158b7adf28a3454bb9">01211</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4092584fc813bfcd9158b7adf28a3454bb9" title="Bad iteration position.">kXMPErr_BadIterPosition</a> = 105,
+<a name="l01213"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409052b1b525fba7da8c98be5c135f434b8">01213</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409052b1b525fba7da8c98be5c135f434b8" title="XML parsing error.">kXMPErr_BadParse</a> = 106,
+<a name="l01215"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c4f936ff6788ce17f6098b7cbda77ed9">01215</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c4f936ff6788ce17f6098b7cbda77ed9" title="Serialization error.">kXMPErr_BadSerialize</a> = 107,
+<a name="l01217"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409a0a05e07925d1f3daf5f36f6da0840f8">01217</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409a0a05e07925d1f3daf5f36f6da0840f8" title="File format error.">kXMPErr_BadFileFormat</a> = 108,
+<a name="l01219"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40910fa053f279fed01b075f34a70f11795">01219</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40910fa053f279fed01b075f34a70f11795" title="No file handler found for format.">kXMPErr_NoFileHandler</a> = 109,
+<a name="l01221"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409a9c1c20e53db12b20068d830a8990c0b">01221</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409a9c1c20e53db12b20068d830a8990c0b" title="Data too large for JPEG file format.">kXMPErr_TooLargeForJPEG</a> = 110,
+<a name="l01222"></a>01222
+<a name="l01223"></a>01223 <span class="comment">// -----------------------------------------------</span>
+<a name="l01224"></a>01224 <span class="comment">// File format and internal structure error codes.</span>
+<a name="l01225"></a>01225
+<a name="l01227"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c57f1cf1c24778536fd32972e87334c5">01227</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c57f1cf1c24778536fd32972e87334c5" title="XML format error.">kXMPErr_BadXML</a> = 201,
+<a name="l01229"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4095464b823e619618d9aa58433cdb45a8e">01229</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4095464b823e619618d9aa58433cdb45a8e" title="RDF format error.">kXMPErr_BadRDF</a> = 202,
+<a name="l01231"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409211bb632ed1264d9e2236f35c6414821">01231</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409211bb632ed1264d9e2236f35c6414821" title="XMP format error.">kXMPErr_BadXMP</a> = 203,
+<a name="l01233"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409078c69d0d76f25187a11981a2552b179">01233</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409078c69d0d76f25187a11981a2552b179" title="Empty iterator.">kXMPErr_EmptyIterator</a> = 204,
+<a name="l01235"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c4cf86fa29624c5e19111e09a97fe05f">01235</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c4cf86fa29624c5e19111e09a97fe05f" title="Unicode error.">kXMPErr_BadUnicode</a> = 205,
+<a name="l01237"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409ecd25299aa177de7bc7f3674fcf2e22d">01237</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409ecd25299aa177de7bc7f3674fcf2e22d" title="TIFF format error.">kXMPErr_BadTIFF</a> = 206,
+<a name="l01239"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409d685e1f839e3bc53dfc55611a0803cee">01239</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409d685e1f839e3bc53dfc55611a0803cee" title="JPEG format error.">kXMPErr_BadJPEG</a> = 207,
+<a name="l01241"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409d98fc9a9c050e9fc19c3af9c8abb2d6d">01241</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409d98fc9a9c050e9fc19c3af9c8abb2d6d" title="PSD format error.">kXMPErr_BadPSD</a> = 208,
+<a name="l01243"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4091606a687cb790af16dc561b2a8f2e6a3">01243</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4091606a687cb790af16dc561b2a8f2e6a3" title="PSIR format error.">kXMPErr_BadPSIR</a> = 209,
+<a name="l01245"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40923b2d7cab10b3d80549e6b60855bb15e">01245</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40923b2d7cab10b3d80549e6b60855bb15e" title="IPTC format error.">kXMPErr_BadIPTC</a> = 210,
+<a name="l01247"></a><a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409d596daed4ac92f8bf7871669d03effad">01247</a> <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409d596daed4ac92f8bf7871669d03effad" title="MPEG format error.">kXMPErr_BadMPEG</a> = 211
+<a name="l01248"></a>01248
+<a name="l01249"></a>01249 };
+<a name="l01250"></a>01250
+<a name="l01252"></a>01252
+<a name="l01253"></a>01253 <span class="comment">// =================================================================================================</span>
+<a name="l01254"></a>01254 <span class="comment">// Client callbacks</span>
+<a name="l01255"></a>01255 <span class="comment">// ================</span>
+<a name="l01256"></a>01256
+<a name="l01257"></a>01257 <span class="comment">// -------------------------------------------------------------------------------------------------</span>
+<a name="l01260"></a>01260 <span class="comment"></span>
+<a name="l01265"></a>01265
+<a name="l01266"></a><a class="code" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">01266</a> <span class="keyword">typedef</span> XMP_Int32 <a class="code" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Status</a>;
+<a name="l01267"></a>01267
+<a name="l01268"></a>01268 <span class="comment">// -------------------------------------------------------------------------------------------------</span>
+<a name="l01283"></a>01283 <span class="comment"></span>
+<a name="l01284"></a><a class="code" href="XMP__Const_8h.html#8ce3570e6e5ac14cd603e96fa9d2936f">01284</a> <span class="keyword">typedef</span> <a class="code" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Status</a> (* <a class="code" href="XMP__Const_8h.html#8ce3570e6e5ac14cd603e96fa9d2936f">XMP_TextOutputProc</a>) ( <span class="keywordtype">void</span> * refCon,
+<a name="l01285"></a>01285 XMP_StringPtr buffer,
+<a name="l01286"></a>01286 XMP_StringLen bufferSize );
+<a name="l01287"></a>01287
+<a name="l01288"></a>01288 <span class="comment">// -------------------------------------------------------------------------------------------------</span>
+<a name="l01297"></a>01297 <span class="comment"></span>
+<a name="l01298"></a><a class="code" href="XMP__Const_8h.html#a2738ce2fca7f1809b12834b1b5e2d0e">01298</a> <span class="keyword">typedef</span> bool (* <a class="code" href="XMP__Const_8h.html#a2738ce2fca7f1809b12834b1b5e2d0e">XMP_AbortProc</a>) ( <span class="keywordtype">void</span> * arg ); <span class="comment">// Used by .</span>
+<a name="l01299"></a>01299
+<a name="l01301"></a>01301
+<a name="l01302"></a>01302 <span class="comment">// =================================================================================================</span>
+<a name="l01303"></a>01303 <span class="comment">// Stuff with no better place to be</span>
+<a name="l01304"></a>01304 <span class="comment">// ================================</span>
+<a name="l01305"></a>01305
+<a name="l01307"></a><a class="code" href="structXMP__VersionInfo.html">01307</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structXMP__VersionInfo.html" title="XMP Toolkit version information.">XMP_VersionInfo</a> {
+<a name="l01309"></a><a class="code" href="structXMP__VersionInfo.html#7edfa1613a58a248fd15267008bd8afb">01309</a> XMP_Uns8 <a class="code" href="structXMP__VersionInfo.html#7edfa1613a58a248fd15267008bd8afb" title="The primary release number, the &amp;quot;1&amp;quot; in version &amp;quot;1.2.3&amp;quot;.">major</a>;
+<a name="l01311"></a><a class="code" href="structXMP__VersionInfo.html#f5b56598e15febd742b431dadae7c317">01311</a> XMP_Uns8 <a class="code" href="structXMP__VersionInfo.html#f5b56598e15febd742b431dadae7c317" title="The secondary release number, the &amp;quot;2&amp;quot; in version &amp;quot;1.2.3&amp;quot;.">minor</a>;
+<a name="l01313"></a><a class="code" href="structXMP__VersionInfo.html#4b448a8253e26a37d2df35e04ac25d28">01313</a> XMP_Uns8 <a class="code" href="structXMP__VersionInfo.html#4b448a8253e26a37d2df35e04ac25d28" title="The tertiary release number, the &amp;quot;3&amp;quot; in version &amp;quot;1.2.3&amp;quot;.">micro</a>;
+<a name="l01315"></a><a class="code" href="structXMP__VersionInfo.html#f1643d86f32f5a5a275dc9c5ba843018">01315</a> XMP_Bool <a class="code" href="structXMP__VersionInfo.html#f1643d86f32f5a5a275dc9c5ba843018" title="A 0/1 boolean value, true if this is a debug build.">isDebug</a>;
+<a name="l01317"></a><a class="code" href="structXMP__VersionInfo.html#0e20a6bf10da4c17bdfc8027f1586ffc">01317</a> XMP_Uns32 <a class="code" href="structXMP__VersionInfo.html#0e20a6bf10da4c17bdfc8027f1586ffc" title="A rolling build number, monotonically increasing in a release.">build</a>;
+<a name="l01319"></a><a class="code" href="structXMP__VersionInfo.html#d018f35b382046ca77b1252bafa93f74">01319</a> XMP_Uns32 <a class="code" href="structXMP__VersionInfo.html#d018f35b382046ca77b1252bafa93f74" title="Individual feature implementation flags.">flags</a>;
+<a name="l01321"></a><a class="code" href="structXMP__VersionInfo.html#19654242b92bffd7517e92882850e834">01321</a> XMP_StringPtr <a class="code" href="structXMP__VersionInfo.html#19654242b92bffd7517e92882850e834" title="A comprehensive version information string.">message</a>;
+<a name="l01322"></a>01322 } <a class="code" href="structXMP__VersionInfo.html" title="XMP Toolkit version information.">XMP_VersionInfo</a>;
+<a name="l01323"></a>01323
+<a name="l01324"></a>01324 <span class="comment">// =================================================================================================</span>
+<a name="l01325"></a>01325
+<a name="l01326"></a>01326 <span class="preprocessor">#if __cplusplus</span>
+<a name="l01327"></a>01327 <span class="preprocessor"></span>} <span class="comment">// extern "C"</span>
+<a name="l01328"></a>01328 <span class="preprocessor">#endif</span>
+<a name="l01329"></a>01329 <span class="preprocessor"></span>
+<a name="l01330"></a>01330 <span class="preprocessor">#endif // __XMP_Const_h__</span>
+</pre></div></div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/XMP__Const_8h.html b/docs/API/XMP__Const_8h.html
new file mode 100644
index 0000000..363e59e
--- /dev/null
+++ b/docs/API/XMP__Const_8h.html
@@ -0,0 +1,2384 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: XMP_Const.h File Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>XMP_Const.h File Reference</h1>Common C/C++ types and constants for the XMP toolkit. <a href="#_details">More...</a>
+<p>
+<code>#include &quot;XMP_Environment.h&quot;</code><br>
+<code>#include &lt;stddef.h&gt;</code><br>
+
+<p>
+<div class="dynheader">
+Include dependency graph for XMP_Const.h:</div>
+<div class="dynsection">
+<p><center><img src="XMP__Const_8h__incl.png" border="0" usemap="#XMP_Const.h_map" alt=""></center>
+</div>
+
+<p>
+<a href="XMP__Const_8h-source.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The expanded type for a date and time. <a href="structXMP__DateTime.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__PacketInfo.html">XMP_PacketInfo</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">XMP packet description. <a href="structXMP__PacketInfo.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__ThumbnailInfo.html">XMP_ThumbnailInfo</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Thumbnail descriptor. <a href="structXMP__ThumbnailInfo.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classXMP__Error.html">XMP_Error</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">XMP Toolkit error, associates an error code with a descriptive error string. <a href="classXMP__Error.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__VersionInfo.html">XMP_VersionInfo</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">XMP Toolkit version information. <a href="structXMP__VersionInfo.html#_details">More...</a><br></td></tr>
+<tr><td colspan="2"><br><h2>General scalar types and constants</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#4c39e0131b0e3d7db66e1cfa82b67141">kXMP_TrueStr</a>&nbsp;&nbsp;&nbsp;&quot;True&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The canonical true string value for Booleans in serialized XMP. <a href="#4c39e0131b0e3d7db66e1cfa82b67141"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#2dc55b533ed63ed7ff0c3be16a97e278">kXMP_FalseStr</a>&nbsp;&nbsp;&nbsp;&quot;False&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The canonical false string value for Booleans in serialized XMP. <a href="#2dc55b533ed63ed7ff0c3be16a97e278"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#06fc87d81c62e9abb8790b6e5713c55bcf4bfe01497bd0d88c2af337e4bac39e">kXMPTS_Yes</a> = 1,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#06fc87d81c62e9abb8790b6e5713c55b2a88f4d4589bf413377283843f70bc90">kXMPTS_No</a> = 0,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#06fc87d81c62e9abb8790b6e5713c55b7a73219cd125bb21e294ba474112a584">kXMPTS_Maybe</a> = -1
+<br>
+ }</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d439e3ceeb4590d310f6125aa12c6df6"></a><!-- doxytag: member="XMP_Const.h::XMP_StringPtr" ref="d439e3ceeb4590d310f6125aa12c6df6" args="" -->
+typedef const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The type for input string parameters. A <code>const char *</code>, a null-terminated UTF-8 string. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f7dcc184f901c713274edfdac5bcc9a"></a><!-- doxytag: member="XMP_Const.h::XMP_StringLen" ref="9f7dcc184f901c713274edfdac5bcc9a" args="" -->
+typedef XMP_Uns32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The type for string length parameters. A 32-bit unsigned integer, as big as will be practically needed. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="00e9d9a76c144421105a4c2742203315"></a><!-- doxytag: member="XMP_Const.h::XMP_Index" ref="00e9d9a76c144421105a4c2742203315" args="" -->
+typedef XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The type for offsets and indices. A 32-bit signed integer. It is signed to allow -1 for loop termination. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eb865118433be92d88e5f49ed11487c8"></a><!-- doxytag: member="XMP_Const.h::XMP_OptionBits" ref="eb865118433be92d88e5f49ed11487c8" args="" -->
+typedef XMP_Uns32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The type for a collection of 32 flag bits. Individual flags are defined as enum value bit masks; see <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ab51f87b5c48f47f5cefb9e03293dafb" title="The XML string form of the property value is a URI, use rdf:resource attribute. DISCOURAGED...">kXMP_PropValueIsURI</a></code> and following. A number of macros provide common set or set operations, such as <code>XMP_PropIsSimple</code>. For other tests use an expression like <code>options &amp; kXMP_&lt;theOption&gt;</code>. When passing multiple option flags use the bitwise-OR operator. '|', not the arithmatic plus, '+'. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="377e4a668de99ce6ed176cef5aaf3fcd"></a><!-- doxytag: member="XMP_Const.h::XMP_TriState" ref="377e4a668de99ce6ed176cef5aaf3fcd" args="" -->
+typedef XMP_Int8&nbsp;</td><td class="memItemRight" valign="bottom"><b>XMP_TriState</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Defines</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="673355818b7b9224e8fec0fbc60ba00c"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_TIFF" ref="673355818b7b9224e8fec0fbc60ba00c" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#673355818b7b9224e8fec0fbc60ba00c">kXMP_NS_TIFF</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/tiff/1.0/&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for Adobe's TIFF schema. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c7dc4d65bcbba2862e410cc8cfdff6f6"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_ST_Job" ref="c7dc4d65bcbba2862e410cc8cfdff6f6" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#c7dc4d65bcbba2862e410cc8cfdff6f6">kXMP_NS_XMP_ST_Job</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/sType/Job#&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for fields of the JobRef type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="97564c70460d1f235c8a41b8ac40cfe9"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XML" ref="97564c70460d1f235c8a41b8ac40cfe9" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#97564c70460d1f235c8a41b8ac40cfe9">kXMP_NS_XML</a>&nbsp;&nbsp;&nbsp;&quot;http://www.w3.org/XML/1998/namespace&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for XML. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ff1df9f3cf050f8b8d3a574db3c3326b"></a><!-- doxytag: member="XMP_Const.h::kXMP_NoOptions" ref="ff1df9f3cf050f8b8d3a574db3c3326b" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#ff1df9f3cf050f8b8d3a574db3c3326b">kXMP_NoOptions</a>&nbsp;&nbsp;&nbsp;((<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>)0UL)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Options macro clears all property-type bits. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#1d41f53bd1d5c88fad8322ce15e39516">XMP_OptionIsClear</a>(var, opt)&nbsp;&nbsp;&nbsp;(((var) &amp; (opt)) == 0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports whether an option flag bit is clear. <a href="#1d41f53bd1d5c88fad8322ce15e39516"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#193b1414fa5312da2aa1d833b85612d0">XMP_PropIsAlias</a>(opt)&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropIsAlias) != 0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the property type specified by an options flag. <a href="#193b1414fa5312da2aa1d833b85612d0"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#93e7900e6c9fb4057dfd685b5201057d">XMP_CharFromSerializeForm</a>(sf)&nbsp;&nbsp;&nbsp;( (XMP_Uns8)(sf) )</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro converts <code>XMP_OptionBits</code> to <code>XMP_Uns8</code>. <a href="#93e7900e6c9fb4057dfd685b5201057d"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6a9b77b60c63781a8776f10880856bf4"></a><!-- doxytag: member="XMP_Const.h::kXMPFiles_UnknownOffset" ref="6a9b77b60c63781a8776f10880856bf4" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#6a9b77b60c63781a8776f10880856bf4">kXMPFiles_UnknownOffset</a>&nbsp;&nbsp;&nbsp;((XMP_Int64)-1)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constant for an unknown packet offset within a file. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e0901aabcf619f17cff03f08e5ed3658"></a><!-- doxytag: member="XMP_Const.h::kXMPFiles_UnknownLength" ref="e0901aabcf619f17cff03f08e5ed3658" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#e0901aabcf619f17cff03f08e5ed3658">kXMPFiles_UnknownLength</a>&nbsp;&nbsp;&nbsp;((XMP_Int32)-1)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constant for an unknown packet length within a file. <br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">XML namespace constants for standard XMP schema.</div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="030875c9dc0861c9251a3374ca14a376"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP" ref="030875c9dc0861c9251a3374ca14a376" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">kXMP_NS_XMP</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the XMP "basic" schema. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e52d761e5a4fc8c8499215d2f3d82b90"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_Rights" ref="e52d761e5a4fc8c8499215d2f3d82b90" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#e52d761e5a4fc8c8499215d2f3d82b90">kXMP_NS_XMP_Rights</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/rights/&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the XMP copyright schema. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c67379a9ffa425d0d7976a51c4f2f754"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_MM" ref="c67379a9ffa425d0d7976a51c4f2f754" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#c67379a9ffa425d0d7976a51c4f2f754">kXMP_NS_XMP_MM</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/mm/&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the XMP digital asset management schema. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="308e156c325618acb2172e550929ebee"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_BJ" ref="308e156c325618acb2172e550929ebee" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#308e156c325618acb2172e550929ebee">kXMP_NS_XMP_BJ</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/bj/&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the job management schema. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0bcb67d0dd0922504e3da7ca5c40c82a"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_PDF" ref="0bcb67d0dd0922504e3da7ca5c40c82a" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#0bcb67d0dd0922504e3da7ca5c40c82a">kXMP_NS_PDF</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/pdf/1.3/&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the PDF schema. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a1a6f38ebfcdb281c5bf2809859167c7"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_Photoshop" ref="a1a6f38ebfcdb281c5bf2809859167c7" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#a1a6f38ebfcdb281c5bf2809859167c7">kXMP_NS_Photoshop</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/photoshop/1.0/&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the Photoshop custom schema. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d12182e1df1652f56b5eec60c1fcdd8f"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_EXIF" ref="d12182e1df1652f56b5eec60c1fcdd8f" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#d12182e1df1652f56b5eec60c1fcdd8f">kXMP_NS_EXIF</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/exif/1.0/&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for Adobe's EXIF schema. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0a2d9c5f7beb27553214a7ad1df4f27e"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_T" ref="0a2d9c5f7beb27553214a7ad1df4f27e" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#0a2d9c5f7beb27553214a7ad1df4f27e">kXMP_NS_XMP_T</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/t/&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the XMP text document schema. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="39afb495ffb24bb3082493c6811e65d0"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_T_PG" ref="39afb495ffb24bb3082493c6811e65d0" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#39afb495ffb24bb3082493c6811e65d0">kXMP_NS_XMP_T_PG</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/t/pg/&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the XMP paged document schema. <br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">XML namespace constants for qualifiers and structured property fields.</div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b466db52a4b85cecfa04710682c1e671"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_IdentifierQual" ref="b466db52a4b85cecfa04710682c1e671" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#b466db52a4b85cecfa04710682c1e671">kXMP_NS_XMP_IdentifierQual</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xmp/Identifier/qual/1.0/&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for qualifiers of the xmp:Identifier property. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9618e013619aa92ebc808b62243d2ba8"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_Dimensions" ref="9618e013619aa92ebc808b62243d2ba8" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#9618e013619aa92ebc808b62243d2ba8">kXMP_NS_XMP_Dimensions</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/sType/Dimensions#&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for fields of the Dimensions type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="935641acc7d01e782ad7a457a7ff338b"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_Image" ref="935641acc7d01e782ad7a457a7ff338b" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#935641acc7d01e782ad7a457a7ff338b">kXMP_NS_XMP_Image</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/g/img/&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for fields of a graphical image. Used for the Thumbnail type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="861613273127156050b456eee11f6b0a"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_ResourceEvent" ref="861613273127156050b456eee11f6b0a" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#861613273127156050b456eee11f6b0a">kXMP_NS_XMP_ResourceEvent</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/sType/ResourceEvent#&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for fields of the ResourceEvent type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9bf51f2653400645f7b5087e8c4e1c77"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_ResourceRef" ref="9bf51f2653400645f7b5087e8c4e1c77" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#9bf51f2653400645f7b5087e8c4e1c77">kXMP_NS_XMP_ResourceRef</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/sType/ResourceRef#&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for fields of the ResourceRef type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b4923bed71ab29c6aa88debe8816c0a2"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_ST_Version" ref="b4923bed71ab29c6aa88debe8816c0a2" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#b4923bed71ab29c6aa88debe8816c0a2">kXMP_NS_XMP_ST_Version</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/sType/Version#&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for fields of the Version type. <br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">XML namespace constants from outside Adobe.</div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="44453f0d0a1dd295d41722c2387b36fa"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_DC" ref="44453f0d0a1dd295d41722c2387b36fa" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#44453f0d0a1dd295d41722c2387b36fa">kXMP_NS_DC</a>&nbsp;&nbsp;&nbsp;&quot;http://purl.org/dc/elements/1.1/&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the Dublin Core schema. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b794d3d798daf75a963398347dcbb79b"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_IPTCCore" ref="b794d3d798daf75a963398347dcbb79b" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#b794d3d798daf75a963398347dcbb79b">kXMP_NS_IPTCCore</a>&nbsp;&nbsp;&nbsp;&quot;http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the IPTC Core schema. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="276fac0f70893607afa3f09030ad84c7"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_RDF" ref="276fac0f70893607afa3f09030ad84c7" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#276fac0f70893607afa3f09030ad84c7">kXMP_NS_RDF</a>&nbsp;&nbsp;&nbsp;&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for RDF. <br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Macros for standard option selections.</div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9549b9a138a896257b5a70176d125317"></a><!-- doxytag: member="XMP_Const.h::kXMP_ArrayLastItem" ref="9549b9a138a896257b5a70176d125317" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#9549b9a138a896257b5a70176d125317">kXMP_ArrayLastItem</a>&nbsp;&nbsp;&nbsp;((<a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>)(-1L))</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Options macro accesses last array item. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8283c9596c03b6d626d5a2b7a90e23ab"></a><!-- doxytag: member="XMP_Const.h::kXMP_UseNullTermination" ref="8283c9596c03b6d626d5a2b7a90e23ab" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#8283c9596c03b6d626d5a2b7a90e23ab">kXMP_UseNullTermination</a>&nbsp;&nbsp;&nbsp;((<a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a>)(~0UL))</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Options macro sets string style. <br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Macros for setting and testing general option bits.</div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#69c4d1b80c4dd581366e0c60209ef612">XMP_SetOption</a>(var, opt)&nbsp;&nbsp;&nbsp;var |= (opt)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro sets an option flag bit. <a href="#69c4d1b80c4dd581366e0c60209ef612"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#10c3c9b1b6e266b0b4eb6abe7b03b7d8">XMP_ClearOption</a>(var, opt)&nbsp;&nbsp;&nbsp;var &amp;= ~(opt)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro clears an option flag bit. <a href="#10c3c9b1b6e266b0b4eb6abe7b03b7d8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#a31596e850cb6b208f5920833d67b9f1">XMP_TestOption</a>(var, opt)&nbsp;&nbsp;&nbsp;(((var) &amp; (opt)) != 0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports whether an option flag bit is set. <a href="#a31596e850cb6b208f5920833d67b9f1"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#ba3edaa921326c7916adb0b70b1bcfb4">XMP_OptionIsSet</a>(var, opt)&nbsp;&nbsp;&nbsp;(((var) &amp; (opt)) != 0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports whether an option flag bit is set. <a href="#ba3edaa921326c7916adb0b70b1bcfb4"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Macros for setting and testing specific option bits.</div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#510b75338bd488ddd8d9bd4e326806f9">XMP_PropIsSimple</a>(opt)&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropCompositeMask) == 0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the property type specified by an options flag. <a href="#510b75338bd488ddd8d9bd4e326806f9"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#ebea8c35e09da7db613e27d0e3ce945f">XMP_PropIsStruct</a>(opt)&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropValueIsStruct) != 0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the property type specified by an options flag. <a href="#ebea8c35e09da7db613e27d0e3ce945f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#98ae521b621cfa3611211e3922a0fce8">XMP_PropIsArray</a>(opt)&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropValueIsArray) != 0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the property type specified by an options flag. <a href="#98ae521b621cfa3611211e3922a0fce8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#8d763b3d36c7067cd7bccd32d4066b43">XMP_ArrayIsUnordered</a>(opt)&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropArrayIsOrdered) == 0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the property type specified by an options flag. <a href="#8d763b3d36c7067cd7bccd32d4066b43"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#72c7077f3ff3e39804a899533867327d">XMP_ArrayIsOrdered</a>(opt)&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropArrayIsOrdered) != 0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the property type specified by an options flag. <a href="#72c7077f3ff3e39804a899533867327d"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#86bc34c4e64dec75618c348163a88720">XMP_ArrayIsAlternate</a>(opt)&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropArrayIsAlternate) != 0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the property type specified by an options flag. <a href="#86bc34c4e64dec75618c348163a88720"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#bbef21da7bce1491f780586c3e01cd9e">XMP_ArrayIsAltText</a>(opt)&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropArrayIsAltText) != 0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the property type specified by an options flag. <a href="#bbef21da7bce1491f780586c3e01cd9e"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#10828aa191aa666aa1166c27beead2a6">XMP_PropHasQualifiers</a>(opt)&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropHasQualifiers) != 0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the property type specified by an options flag. <a href="#10828aa191aa666aa1166c27beead2a6"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#8d1b4da6b3cb3a67bf4f8e79352eeeaa">XMP_PropIsQualifier</a>(opt)&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropIsQualifier) != 0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the property type specified by an options flag. <a href="#8d1b4da6b3cb3a67bf4f8e79352eeeaa"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#7dc82df90f45b0d746b67d8fdc529c83">XMP_PropHasLang</a>(opt)&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropHasLang) != 0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the property type specified by an options flag. <a href="#7dc82df90f45b0d746b67d8fdc529c83"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#12870d8442720ce5230791abc26f9597">XMP_NodeIsSchema</a>(opt)&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_SchemaNode) != 0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the property type specified by an options flag. <a href="#12870d8442720ce5230791abc26f9597"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Macros to test components of the character form mask</div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#a7596216164335f926cb91d600cddf99">XMP_CharFormIs16Bit</a>(f)&nbsp;&nbsp;&nbsp;( ((int)(f) &amp; kXMP_Char16BitMask) != 0 )</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the encoding of a character. <a href="#a7596216164335f926cb91d600cddf99"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#1e99ef08266943f52f5c649ab2836ddf">XMP_CharFormIs32Bit</a>(f)&nbsp;&nbsp;&nbsp;( ((int)(f) &amp; kXMP_Char32BitMask) != 0 )</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the encoding of a character. <a href="#1e99ef08266943f52f5c649ab2836ddf"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#ba2539629b8d238fc56a1901dd07ebca">XMP_CharFormIsBigEndian</a>(f)&nbsp;&nbsp;&nbsp;( ((int)(f) &amp; kXMP_CharLittleEndianMask) == 0 )</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the byte-order of a character. <a href="#ba2539629b8d238fc56a1901dd07ebca"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#906ec1cd2fb1631c1b5ad9ccdf9c0a6b">XMP_CharFormIsLittleEndian</a>(f)&nbsp;&nbsp;&nbsp;( ((int)(f) &amp; kXMP_CharLittleEndianMask) != 0 )</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the byte-order of a character. <a href="#906ec1cd2fb1631c1b5ad9ccdf9c0a6b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#85bbf023b1b799c3c20176aa289d32b0">XMP_GetCharSize</a>(f)&nbsp;&nbsp;&nbsp;( ((int)(f)&amp;6) == 0 ? 1 : (int)(f)&amp;6 )</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro reports the byte-size of a character. <a href="#85bbf023b1b799c3c20176aa289d32b0"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#8f522964919b742b4138c79611997bae">XMP_CharToSerializeForm</a>(cf)&nbsp;&nbsp;&nbsp;( (<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>)(cf) )</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Macro converts <code>XMP_Uns8</code> to <code>XMP_OptionBits</code>. <a href="#8f522964919b742b4138c79611997bae"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef struct __XMPMeta__ *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#549d5e2cbcb58302d3df840a0205283e">XMPMetaRef</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef struct __XMPIterator__ *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#6ade57a30fb1e40d6aa9695c440fc3d2">XMPIteratorRef</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef struct __XMPDocOps__ *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#b516453dd7d906e911f8951983cde5f1">XMPDocOpsRef</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef struct __XMPFiles__ *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#a4bca98ad67d7a62c60cb13dbbab0f25">XMPFilesRef</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="300d9a9189cb4ddb6970d05389f5c28e"></a><!-- doxytag: member="XMP_Const.h::XMP_FileFormat" ref="300d9a9189cb4ddb6970d05389f5c28e" args="" -->
+typedef XMP_Uns32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Type for file format identification constants. See <code><a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038817ab6d429c1550eb3cc16d2e544b78eb" title="Public file format constant: &#39;PDF &#39;.">kXMP_PDFFile</a></code> and following. <br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Special purpose callback functions</div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Status</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef <a class="el" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Status</a>(*&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#8ce3570e6e5ac14cd603e96fa9d2936f">XMP_TextOutputProc</a> )(void *refCon, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> buffer, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> bufferSize)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef bool(*&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#a2738ce2fca7f1809b12834b1b5e2d0e">XMP_AbortProc</a> )(void *arg)</td></tr>
+
+<tr><td colspan="2"><br><h2>Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b7511551ce156d5fd96c26ad464b837801">kXMP_TimeWestOfUTC</a> = -1,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b73f41be55491204982acb39c9f6c7ad13">kXMP_TimeIsUTC</a> = 0,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b768851b70cc1d2346fa21bc0b0ae6cfec">kXMP_TimeEastOfUTC</a> = +1
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constant values for <code><a class="el" href="structXMP__DateTime.html#2786ad8875bd59f07b8dc2b1d09c6f96">XMP_DateTime::tzSign</a></code> field. <a href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b7">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ab51f87b5c48f47f5cefb9e03293dafb">kXMP_PropValueIsURI</a> = 0x00000002UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b58e34a33a2eed56499d4f6f62da25d159">kXMP_PropHasQualifiers</a> = 0x00000010UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b530146ed5209f5c3eb4eeb1fd8e4fb9fe">kXMP_PropIsQualifier</a> = 0x00000020UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b53fa5ed87edc731bfb3817f58ba70a217">kXMP_PropHasLang</a> = 0x00000040UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5eff16fdf167afc73db25b30b529bd9d5">kXMP_PropHasType</a> = 0x00000080UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e">kXMP_PropValueIsStruct</a> = 0x00000100UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b59b7706e0f0716ac7546bdc24ffedd0bc">kXMP_PropValueIsArray</a> = 0x00000200UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b50d70c23394c0676657c89de5491192c0">kXMP_PropArrayIsUnordered</a> = kXMP_PropValueIsArray,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5f1cdb3b0a3e852ec55e747a1686aba04">kXMP_PropArrayIsOrdered</a> = 0x00000400UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b52596b1f0ea4600270c99102c86b5f1f1">kXMP_PropArrayIsAlternate</a> = 0x00000800UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ba253f67a6cf44b7438a3f96b516846d">kXMP_PropArrayIsAltText</a> = 0x00001000UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5b975c19fb5c50f732a1a0d84dadb7c37">kXMP_PropIsAlias</a> = 0x00010000UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b51f819ef281d1f52c4c12d5d02f49d3f0">kXMP_PropHasAliases</a> = 0x00020000UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b548097c6ea309f240965d77ab564a5464">kXMP_PropIsInternal</a> = 0x00040000UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b581dcd06251771a0ddee6c1e36128c65c">kXMP_PropIsStable</a> = 0x00100000UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b50d898ea7f6b3db513bb24f8a6a285877">kXMP_PropIsDerived</a> = 0x00200000UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b56b5b5f4b869994b7390edc9589745e9f">kXMP_PropArrayFormMask</a> = kXMP_PropValueIsArray | kXMP_PropArrayIsOrdered | kXMP_PropArrayIsAlternate | kXMP_PropArrayIsAltText,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b560a9f26fb66c2e65cf40d9bc44968956">kXMP_PropCompositeMask</a> = kXMP_PropValueIsStruct | kXMP_PropArrayFormMask,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5e154b58429b257b18963ba3503e67974">kXMP_ImplReservedMask</a> = 0x70000000L
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Option bit flags for the <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> property accessor functions. <a href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04873411f673fc2a6337083fd024df727f">kXMP_InsertBeforeItem</a> = 0x00004000UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b0498cedd5fa29d47abb2ac8903ac7f5a05">kXMP_InsertAfterItem</a> = 0x00008000UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04ddd07b4a38b25ab3841e28a9cb169d1c">kXMP_DeleteExisting</a> = 0x20000000UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04d1b42a8a4c479d9bfaf406b79f2e1465">kXMP_PropValueOptionsMask</a> = kXMP_PropValueIsURI,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04ef8c1934a17b0e5d8f0b20a7e89df0df">kXMP_PropArrayLocationMask</a> = kXMP_InsertBeforeItem | kXMP_InsertAfterItem
+<br>
+ }</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c1e533852436acf75f594a4fb50a64400">kXMP_RequireXMPMeta</a> = 0x0001UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c79b36427b7bf0c0a1ed010a44dec2d3e">kXMP_ParseMoreBuffers</a> = 0x0002UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c7107906eab0e1fa6f9f2dc6254ad88b1">kXMP_StrictAliasing</a> = 0x0004UL
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Option bit flags for <code><a class="el" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26" title="ParseFromBuffer() parses RDF from a series of input buffers into this XMP object...">TXMPMeta::ParseFromBuffer()</a></code>. <a href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edbb9e4c7ee139da0dd4126ddea794c76">kXMP_OmitPacketWrapper</a> = 0x0010UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e238c792322c5bd5f9e4db3165e01f9d6">kXMP_ReadOnlyPacket</a> = 0x0020UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e041dc6b7b8684be7112ae40f5f259ebb">kXMP_UseCompactFormat</a> = 0x0040UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e0b659b3b544c7a5a076fbd3132cd7f7a">kXMP_IncludeThumbnailPad</a> = 0x0100UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edb35599da481cc22ea6342b7b4de6bc6">kXMP_ExactPacketLength</a> = 0x0200UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e9ee6f7e9597b93ed12b8ae654ade2654">kXMP_WriteAliasComments</a> = 0x0400UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e79230f1d70d2625f7650db6ff5b1ea29">kXMP_OmitAllFormatting</a> = 0x0800UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e9fb498d749d939e2ba9adf555a75b856">kXMP_OmitXMPMetaElement</a> = 0x1000UL
+, <br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9eeb79571cac99ee97feefb0347b1c1845">kXMP_EncodingMask</a> = 0x0007UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edc8f241694f5a758e5ee3f6db69d02ab">kXMP_EncodeUTF8</a> = 0UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e310e4cbf639e783163778566b439f01d">kXMP_EncodeUTF16Big</a> = _XMP_UTF16_Bit,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9efc6417e382c98a2d507830de62fd4830">kXMP_EncodeUTF16Little</a> = _XMP_UTF16_Bit | _XMP_LittleEndian_Bit,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e793e99d9ea83f0aadd5b4193a95ea713">kXMP_EncodeUTF32Big</a> = _XMP_UTF32_Bit,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9ee0137d98ea990fa23d292489031ba09e">kXMP_EncodeUTF32Little</a> = _XMP_UTF32_Bit | _XMP_LittleEndian_Bit
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Option bit flags for <code><a class="el" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49" title="SerializeToBuffer() serializes metadata in this XMP object into a string as RDF.">TXMPMeta::SerializeToBuffer()</a></code>. <a href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f2663593f77b837d89759af3a721712c13f044">kXMP_IterClassMask</a> = 0x00FFUL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635a0643c076a3b3737ff88ed20f16afd2b">kXMP_IterProperties</a> = 0x0000UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266353333450505cd3712320aeac895e541b9">kXMP_IterAliases</a> = 0x0001UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635a325d9ffba68a934f0a0a0f6ecfc2f7b">kXMP_IterNamespaces</a> = 0x0002UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635b26e1a38d1d0343fcc5bdaab1b60e3ed">kXMP_IterJustChildren</a> = 0x0100UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266354589f99b5b4a55e785e3baf4fe1d9b19">kXMP_IterJustLeafNodes</a> = 0x0200UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635cf22e638f4144bcec8207b2ab69bb344">kXMP_IterJustLeafName</a> = 0x0400UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635c06dbc804df2e5ac24d77ca50a21fa08">kXMP_IterIncludeAliases</a> = 0x0800UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266351b91947105ae68c48c5d5e36aa70d101">kXMP_IterOmitQualifiers</a> = 0x1000UL
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Option bit flags for <code><a class="el" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a></code> construction. <a href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#0411cd49bb5b71852cecd93bcbf0ca2db0b540cd3841f411471a827f833c606e">kXMP_IterSkipSubtree</a> = 0x0001UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#0411cd49bb5b71852cecd93bcbf0ca2d2537b4b8db838f85b47988b198cd2a12">kXMP_IterSkipSiblings</a> = 0x0002UL
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Option bit flags for <code><a class="el" href="classTXMPIterator.html#30b4d78974b347e4fcd275f1f65a61b2" title="Skip() skips some portion of the remaining iterations.">TXMPIterator::Skip()</a></code>. <a href="XMP__Const_8h.html#0411cd49bb5b71852cecd93bcbf0ca2d">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <a class="el" href="XMP__Const_8h.html#bed82baf7f470b522273a3e37c24c600d6d41710c689f16d19ac26dc9f5cc506">kXMPUtil_AllowCommas</a> = 0x10000000UL
+ }</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a578ddfb0572b7602a52e533d92d8b1e9fb">kXMPUtil_DoAllProperties</a> = 0x0001UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a57dab4dad658d2d218c5b1e7d829b12962">kXMPUtil_ReplaceOldValues</a> = 0x0002UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a5797753b4c5afda9c55e807e41377d86d9">kXMPUtil_DeleteEmptyValues</a> = 0x0004UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a57843589b878f53d42d59258f945ad770b">kXMPUtil_IncludeAliases</a> = 0x0800UL
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Option bit flags for <code><a class="el" href="classTXMPUtils.html#40c645803530662e08d042b4b7c6190d" title="RemoveProperties() removes multiple properties from an XMP object.">TXMPUtils::RemoveProperties()</a></code> and <code><a class="el" href="classTXMPUtils.html#4795244ffcbda927800f789b0e40c262" title="AppendProperties() adds or moves properties from one XMP object to another.">TXMPUtils::AppendProperties()</a></code>. <a href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a57">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038817ab6d429c1550eb3cc16d2e544b78eb">kXMP_PDFFile</a> = 0x50444620UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038852c90935ee28a0875a49843d463cad70">kXMP_PostScriptFile</a> = 0x50532020UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d947e6da0c4d923195d93e0c53a79c4e">kXMP_EPSFile</a> = 0x45505320UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d752b2d3e1139e0745223a9385ef6487">kXMP_JPEGFile</a> = 0x4A504547UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038878b8fa38aaa2067e3e1baa0dcaa7571d">kXMP_JPEG2KFile</a> = 0x4A505820UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388dc0edf25d933c2a21b25449692c3ba08">kXMP_TIFFFile</a> = 0x54494646UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388851d2f4525d705cd2dcabb540d0ddc06">kXMP_GIFFile</a> = 0x47494620UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388c989381d37de320495e4d13f9ecc6371">kXMP_PNGFile</a> = 0x504E4720UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388564a8095f65d951f451e16eb56650597">kXMP_SWFFile</a> = 0x53574620UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388b1eeba00d1d92e313acfe68cd054daf9">kXMP_FLAFile</a> = 0x464C4120UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388455bc501088bbd8061fe3ea386a5066f">kXMP_FLVFile</a> = 0x464C5620UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388ebdb172c8a75b4ead2eff2d26ed3dc37">kXMP_MOVFile</a> = 0x4D4F5620UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388e3a6333624e5c292caf14ad849a5e26e">kXMP_AVIFile</a> = 0x41564920UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d2935ea79b4f9253891e3a68a002c5bb">kXMP_CINFile</a> = 0x43494E20UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388cc1fcd4e52423c0dd2966a2e92352fb8">kXMP_WAVFile</a> = 0x57415620UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388f3ee34ed2bc26dec0e2d572eeb0de89b">kXMP_MP3File</a> = 0x4D503320UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038842cb8767d9cf16eaeb7aec68a4f224e9">kXMP_SESFile</a> = 0x53455320UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403886c949ee85f42eaaed035591338be6789">kXMP_CELFile</a> = 0x43454C20UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388043afdc1db730db9ac03c505140c61c8">kXMP_MPEGFile</a> = 0x4D504547UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388b58eaebed494530072ad990ac7a9807a">kXMP_MPEG2File</a> = 0x4D503220UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038889e6282c3f0c8966d788500f5d8eaa91">kXMP_MPEG4File</a> = 0x4D503420UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038878c62f7c10b16b1a862d93f6226a4622">kXMP_WMAVFile</a> = 0x574D4156UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388f093d01e7e9cc55a7d1e204498521fc3">kXMP_AIFFFile</a> = 0x41494646UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388bad9584845edf66f2f8fc3c336977e34">kXMP_P2File</a> = 0x50322020UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403885f78caa0871695cc92e058e4f4b2dd57">kXMP_XDCAM_FAMFile</a> = 0x58444346UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038864fe7908df6341e13d9d8c8199cdf852">kXMP_XDCAM_SAMFile</a> = 0x58444353UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038845bf9b21d5ffed3594fbd585c47cc4fc">kXMP_XDCAM_EXFile</a> = 0x58444358UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388fc5ff976e78df2d79d651de818b011f2">kXMP_AVCHDFile</a> = 0x41564844UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388a0edb070c11f87c3dad9f8f7a83b9b5e">kXMP_SonyHDVFile</a> = 0x53484456UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388542634e6051139c44fd7b92d08c64760">kXMP_HTMLFile</a> = 0x48544D4CUL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d217b996403fa13caef3d6e978023124">kXMP_XMLFile</a> = 0x584D4C20UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038827051cd824d3ae7bb59e3af7a7908ffd">kXMP_TextFile</a> = 0x74657874UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038822b478a9d0d52d12e8e4a1181024eb1c">kXMP_PhotoshopFile</a> = 0x50534420UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038882935c41c6222ff4cca954278f18e554">kXMP_IllustratorFile</a> = 0x41492020UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038879cbf96ecc4ac3e0ebfb2d182bc75e60">kXMP_InDesignFile</a> = 0x494E4444UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403885fb9e99541bbb2d8e375d0cc9fd92a2e">kXMP_AEProjectFile</a> = 0x41455020UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388da5b138722448c4d4595fe760668c3df">kXMP_AEProjTemplateFile</a> = 0x41455420UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388fd8d3d1c8c84bc6ab773f1298b3938f0">kXMP_AEFilterPresetFile</a> = 0x46465820UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388e28efb65bde55f3f8ddfd1fd8a168e2a">kXMP_EncoreProjectFile</a> = 0x4E434F52UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388eff4f68cd5162370f7bf938a868e280d">kXMP_PremiereProjectFile</a> = 0x5052504AUL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403881ad712bbd349dc899ca1e71971032b0a">kXMP_PremiereTitleFile</a> = 0x5052544CUL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038896804f7b8ce83786051c4dac4930aa96">kXMP_UCFFile</a> = 0x55434620UL,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403882845f95eaaaf492f5011bff05a398719">kXMP_UnknownFile</a> = 0x20202020UL
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">File format constants for use with XMPFiles. <a href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Byte-order masks, do not use directly. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c8f5b20dd9abbef29169a362b265049637">kXMP_Char8Bit</a> = 0,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c80966bca9b241646f6a730f96c5c14a2d">kXMP_Char16BitBig</a> = kXMP_Char16BitMask,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c819b97b941d6586031190025225ee0eaa">kXMP_Char16BitLittle</a> = kXMP_Char16BitMask | kXMP_CharLittleEndianMask,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c887f8231aec6dd125baf77c9f3f918fbc">kXMP_Char32BitBig</a> = kXMP_Char32BitMask,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c8859e7aa88e7dfd3f55ad2b6445a4708e">kXMP_Char32BitLittle</a> = kXMP_Char32BitMask | kXMP_CharLittleEndianMask,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c86c37f0724299a9c88e2f622d3246d63b">kXMP_CharUnknown</a> = 1
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constants to allow easy testing for 16/32 bit and big/little endian. <a href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c8">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <a class="el" href="XMP__Const_8h.html#05589fbab0657f08285ebdfe93f5ec9e767b4847575a8de28e691be660d43817">kXMP_PacketInfoVersion</a> = 3
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Version of the <a class="el" href="structXMP__PacketInfo.html" title="XMP packet description.">XMP_PacketInfo</a> type. <a href="XMP__Const_8h.html#05589fbab0657f08285ebdfe93f5ec9e">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4d7a20b5cd0872055d043b3593e18f41d6">kXMP_UnknownTNail</a> = 0,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4d5184f12e2695285b081ddafc5aeb4321">kXMP_JPEGTNail</a> = 1,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4ddf767c0e478570baac04311b7b79f951">kXMP_TIFFTNail</a> = 2,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4db3207f0166247f17fa913daec2b771ab">kXMP_PShopTNail</a> = 3
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Values for <code><a class="el" href="structXMP__ThumbnailInfo.html#f57b103c5a78c636afc3a391f28a5906" title="The format of the thumbnail image data.">XMP_ThumbnailInfo::tnailFormat</a></code>. <a href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4d">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <a class="el" href="XMP__Const_8h.html#ba01db17f4a2bfbc3db60dc172972a25b1e9c825d1f58e696f34c8940b0176be">kXMP_ThumbnailInfoVersion</a> = 1
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Version of the <a class="el" href="structXMP__ThumbnailInfo.html" title="Thumbnail descriptor.">XMP_ThumbnailInfo</a> type. <a href="XMP__Const_8h.html#ba01db17f4a2bfbc3db60dc172972a25">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <a class="el" href="XMP__Const_8h.html#af105ae5beaca1dee30ae54530691fce4e1723c609cc341c88f254473e315ae9">kXMPFiles_NoQuickTimeInit</a> = 0x0001
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Option bit flags for <code><a class="el" href="classTXMPFiles.html#0874bbbf41c9490abfb613bfe297327d" title="Initializes the XMPFiles library; must be called before creating an SXMPFiles object...">TXMPFiles::Initialize()</a></code>. <a href="XMP__Const_8h.html#af105ae5beaca1dee30ae54530691fce">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba23a3eb2a5e95292036a93ad6666fa388">kXMPFiles_CanInjectXMP</a> = 0x00000001,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba126c9cc056f6569c424431edbcb9521c">kXMPFiles_CanExpand</a> = 0x00000002,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba8957f1ef358b4ab3a1df519903f2ae07">kXMPFiles_CanRewrite</a> = 0x00000004,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabab55e1873e67048928de3fc47550678c3">kXMPFiles_PrefersInPlace</a> = 0x00000008,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabafc2bc7cfdd28a326788d563ec0357694">kXMPFiles_CanReconcile</a> = 0x00000010,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba4a183c3ec4994cf09993e5b31dee9733">kXMPFiles_AllowsOnlyXMP</a> = 0x00000020,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabadb116eed738d1fcdfe4ab9c1635e08ea">kXMPFiles_ReturnsRawPacket</a> = 0x00000040,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabaf7fe49636dc1fcc0d6938d4b6fb83a09">kXMPFiles_ReturnsTNail</a> = 0x00000080,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabafc2c5b585e698ebf24a9379de35954b4">kXMPFiles_HandlerOwnsFile</a> = 0x00000100,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba9fe958d4ccde02516a3a267db63874cd">kXMPFiles_AllowsSafeUpdate</a> = 0x00000200,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabaee13099f78018a5e1ce033266c27e999">kXMPFiles_NeedsReadOnlyPacket</a> = 0x00000400,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabad3027b786992e2a4762a4fa37c92943c">kXMPFiles_UsesSidecarXMP</a> = 0x00000800,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabaa2a6a4b744b40055387234632b688fcd">kXMPFiles_FolderBasedFormat</a> = 0x00001000
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Option bit flags for <code><a class="el" href="classTXMPFiles.html#cb9e16a1477ec67fa6da6d736a9bc131" title="GetFormatInfo() reports what features are supported for a specific file format.">TXMPFiles::GetFormatInfo()</a></code>. <a href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea4c61ec4ed571dbc5f1832ff6772320d2">kXMPFiles_OpenForRead</a> = 0x00000001,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea91fa388b3888bcb6a68615537b66a49b">kXMPFiles_OpenForUpdate</a> = 0x00000002,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaa58279b2b1311242e7374117f455bb96">kXMPFiles_OpenOnlyXMP</a> = 0x00000004,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaca2002b03d2a88da0203bf52a3122063">kXMPFiles_OpenCacheTNail</a> = 0x00000008,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea0bef4db2ecdaf82a85df9e9d417aab18">kXMPFiles_OpenStrictly</a> = 0x00000010,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaf6332435c7fc89cb0b7381e13fe43646">kXMPFiles_OpenUseSmartHandler</a> = 0x00000020,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea77b47c63e579b28cbd25083ceb58c285">kXMPFiles_OpenUsePacketScanning</a> = 0x00000040,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea77f34b1873bb2584feabe26a2c8f1182">kXMPFiles_OpenLimitedScanning</a> = 0x00000080,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea05acd568597f72b4812b432ea6cf606a">kXMPFiles_OpenRepairFile</a> = 0x00000100,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eafaccd8151900b2c7fc3e7de598a92d34">kXMPFiles_OpenInBackground</a> = 0x10000000
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Option bit flags for <code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">TXMPFiles::OpenFile()</a></code>. <a href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <a class="el" href="XMP__Const_8h.html#f9bdc3014f3d54c426b6d2df10de4960dbf8d744f355ef9800a4ec44325baf54">kXMPFiles_UpdateSafely</a> = 0x0001
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Option bit flags for <code><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">TXMPFiles::CloseFile()</a></code>. <a href="XMP__Const_8h.html#f9bdc3014f3d54c426b6d2df10de4960">More...</a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Errors Exception handling</div></td></tr>
+<tr><td colspan="2"><div class="groupText">XMP Tookit errors result in throwing an <code><a class="el" href="classXMP__Error.html" title="XMP Toolkit error, associates an error code with a descriptive error string.">XMP_Error</a></code> exception. Any exception thrown within the XMP Toolkit is caught in the toolkit and rethrown as an <code><a class="el" href="classXMP__Error.html" title="XMP Toolkit error, associates an error code with a descriptive error string.">XMP_Error</a></code>.<p>
+The <code><a class="el" href="classXMP__Error.html" title="XMP Toolkit error, associates an error code with a descriptive error string.">XMP_Error</a></code> class contains a numeric code and an English explanation. New numeric codes may be added at any time. There are typically many possible explanations for each numeric code. The explanations try to be precise about the specific circumstances causing the error.<p>
+<dl class="note" compact><dt><b>Note:</b></dt><dd>The explanation string is for debugging use only. It must not be shown to users in a final product. It is written for developers not users, and never localized. </dd></dl>
+<br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom">{ <br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40914813595824de97382fffeae7b6fe581">kXMPErr_Unknown</a> = 0,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409cd9fa1b621efafd5b218e3a785cbeda1">kXMPErr_TBD</a> = 1,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c7ac408582c194cc723a24acb8b4e4c3">kXMPErr_Unavailable</a> = 2,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409115f3d761d2cad952aab23f35cbdf3a1">kXMPErr_BadObject</a> = 3,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40952d197a8b0af3c55f16958162a4132f1">kXMPErr_BadParam</a> = 4,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409716956a038782e595ce61d3fbdd1a25a">kXMPErr_BadValue</a> = 5,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40914bd6c24087d280c722c1a044eec27d6">kXMPErr_AssertFailure</a> = 6,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409a856bb36a9742d8542b483e00fc6511b">kXMPErr_EnforceFailure</a> = 7,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4093de1ac8f4e4afb705d5a4654cb9579e2">kXMPErr_Unimplemented</a> = 8,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4098babbd758d2c64fd04e85fa48e0675c0">kXMPErr_InternalFailure</a> = 9,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40914342c486ddf394ebc110a446becbfa7">kXMPErr_Deprecated</a> = 10,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40982941dc15c6ccde6b8fb2f9cc85c2eeb">kXMPErr_ExternalFailure</a> = 11,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c4ba7b1a57629e4994a0f7a515d51195">kXMPErr_UserAbort</a> = 12,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4095322df07e2a7792824d2468c4837f1cb">kXMPErr_StdException</a> = 13,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409ac7558097a1f5a0f99097199f1bf8ff4">kXMPErr_UnknownException</a> = 14,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40969eb7fef422fbca62cdbc554afffd813">kXMPErr_NoMemory</a> = 15,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4092bc66eec6ce830979089d5c336f75539">kXMPErr_BadSchema</a> = 101,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4093f1efec0aa5452f43c55c05aba616ef7">kXMPErr_BadXPath</a> = 102,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40940ca77d98bd366442bb8d438c420a444">kXMPErr_BadOptions</a> = 103,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40931adb57da79b4fb1f1f5f999ec740010">kXMPErr_BadIndex</a> = 104,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4092584fc813bfcd9158b7adf28a3454bb9">kXMPErr_BadIterPosition</a> = 105,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409052b1b525fba7da8c98be5c135f434b8">kXMPErr_BadParse</a> = 106,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c4f936ff6788ce17f6098b7cbda77ed9">kXMPErr_BadSerialize</a> = 107,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409a0a05e07925d1f3daf5f36f6da0840f8">kXMPErr_BadFileFormat</a> = 108,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40910fa053f279fed01b075f34a70f11795">kXMPErr_NoFileHandler</a> = 109,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409a9c1c20e53db12b20068d830a8990c0b">kXMPErr_TooLargeForJPEG</a> = 110,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c57f1cf1c24778536fd32972e87334c5">kXMPErr_BadXML</a> = 201,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4095464b823e619618d9aa58433cdb45a8e">kXMPErr_BadRDF</a> = 202,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409211bb632ed1264d9e2236f35c6414821">kXMPErr_BadXMP</a> = 203,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409078c69d0d76f25187a11981a2552b179">kXMPErr_EmptyIterator</a> = 204,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c4cf86fa29624c5e19111e09a97fe05f">kXMPErr_BadUnicode</a> = 205,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409ecd25299aa177de7bc7f3674fcf2e22d">kXMPErr_BadTIFF</a> = 206,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409d685e1f839e3bc53dfc55611a0803cee">kXMPErr_BadJPEG</a> = 207,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409d98fc9a9c050e9fc19c3af9c8abb2d6d">kXMPErr_BadPSD</a> = 208,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4091606a687cb790af16dc561b2a8f2e6a3">kXMPErr_BadPSIR</a> = 209,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40923b2d7cab10b3d80549e6b60855bb15e">kXMPErr_BadIPTC</a> = 210,
+<br>
+&nbsp;&nbsp;<a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409d596daed4ac92f8bf7871669d03effad">kXMPErr_BadMPEG</a> = 211
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Exception code constants. <a href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409">More...</a><br></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+Common C/C++ types and constants for the XMP toolkit.
+<p>
+<hr><h2>Define Documentation</h2>
+<a class="anchor" name="2dc55b533ed63ed7ff0c3be16a97e278"></a><!-- doxytag: member="XMP_Const.h::kXMP_FalseStr" ref="2dc55b533ed63ed7ff0c3be16a97e278" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define kXMP_FalseStr&nbsp;&nbsp;&nbsp;&quot;False&quot; </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+The canonical false string value for Booleans in serialized XMP.
+<p>
+Code that converts from string to bool should be case insensitive, and also allow "0".
+</div>
+</div><p>
+<a class="anchor" name="4c39e0131b0e3d7db66e1cfa82b67141"></a><!-- doxytag: member="XMP_Const.h::kXMP_TrueStr" ref="4c39e0131b0e3d7db66e1cfa82b67141" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define kXMP_TrueStr&nbsp;&nbsp;&nbsp;&quot;True&quot; </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+The canonical true string value for Booleans in serialized XMP.
+<p>
+Code that converts from string to bool should be case insensitive, and also allow "1".
+</div>
+</div><p>
+<a class="anchor" name="86bc34c4e64dec75618c348163a88720"></a><!-- doxytag: member="XMP_Const.h::XMP_ArrayIsAlternate" ref="86bc34c4e64dec75618c348163a88720" args="(opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_ArrayIsAlternate </td>
+ <td>(</td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropArrayIsAlternate) != 0)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the property type specified by an options flag.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The options flag to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="bbef21da7bce1491f780586c3e01cd9e"></a><!-- doxytag: member="XMP_Const.h::XMP_ArrayIsAltText" ref="bbef21da7bce1491f780586c3e01cd9e" args="(opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_ArrayIsAltText </td>
+ <td>(</td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropArrayIsAltText) != 0)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the property type specified by an options flag.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The options flag to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="72c7077f3ff3e39804a899533867327d"></a><!-- doxytag: member="XMP_Const.h::XMP_ArrayIsOrdered" ref="72c7077f3ff3e39804a899533867327d" args="(opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_ArrayIsOrdered </td>
+ <td>(</td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropArrayIsOrdered) != 0)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the property type specified by an options flag.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The options flag to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="8d763b3d36c7067cd7bccd32d4066b43"></a><!-- doxytag: member="XMP_Const.h::XMP_ArrayIsUnordered" ref="8d763b3d36c7067cd7bccd32d4066b43" args="(opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_ArrayIsUnordered </td>
+ <td>(</td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropArrayIsOrdered) == 0)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the property type specified by an options flag.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The options flag to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="a7596216164335f926cb91d600cddf99"></a><!-- doxytag: member="XMP_Const.h::XMP_CharFormIs16Bit" ref="a7596216164335f926cb91d600cddf99" args="(f)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_CharFormIs16Bit </td>
+ <td>(</td>
+ <td class="paramtype">f&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;( ((int)(f) &amp; kXMP_Char16BitMask) != 0 )</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the encoding of a character.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>f</em>&nbsp;</td><td>The character to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="1e99ef08266943f52f5c649ab2836ddf"></a><!-- doxytag: member="XMP_Const.h::XMP_CharFormIs32Bit" ref="1e99ef08266943f52f5c649ab2836ddf" args="(f)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_CharFormIs32Bit </td>
+ <td>(</td>
+ <td class="paramtype">f&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;( ((int)(f) &amp; kXMP_Char32BitMask) != 0 )</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the encoding of a character.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>f</em>&nbsp;</td><td>The character to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="ba2539629b8d238fc56a1901dd07ebca"></a><!-- doxytag: member="XMP_Const.h::XMP_CharFormIsBigEndian" ref="ba2539629b8d238fc56a1901dd07ebca" args="(f)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_CharFormIsBigEndian </td>
+ <td>(</td>
+ <td class="paramtype">f&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;( ((int)(f) &amp; kXMP_CharLittleEndianMask) == 0 )</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the byte-order of a character.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>f</em>&nbsp;</td><td>The character to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="906ec1cd2fb1631c1b5ad9ccdf9c0a6b"></a><!-- doxytag: member="XMP_Const.h::XMP_CharFormIsLittleEndian" ref="906ec1cd2fb1631c1b5ad9ccdf9c0a6b" args="(f)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_CharFormIsLittleEndian </td>
+ <td>(</td>
+ <td class="paramtype">f&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;( ((int)(f) &amp; kXMP_CharLittleEndianMask) != 0 )</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the byte-order of a character.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>f</em>&nbsp;</td><td>The character to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="93e7900e6c9fb4057dfd685b5201057d"></a><!-- doxytag: member="XMP_Const.h::XMP_CharFromSerializeForm" ref="93e7900e6c9fb4057dfd685b5201057d" args="(sf)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_CharFromSerializeForm </td>
+ <td>(</td>
+ <td class="paramtype">sf&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;( (XMP_Uns8)(sf) )</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro converts <code>XMP_OptionBits</code> to <code>XMP_Uns8</code>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>sf</em>&nbsp;</td><td>The character to convert. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="8f522964919b742b4138c79611997bae"></a><!-- doxytag: member="XMP_Const.h::XMP_CharToSerializeForm" ref="8f522964919b742b4138c79611997bae" args="(cf)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_CharToSerializeForm </td>
+ <td>(</td>
+ <td class="paramtype">cf&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;( (<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>)(cf) )</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro converts <code>XMP_Uns8</code> to <code>XMP_OptionBits</code>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>cf</em>&nbsp;</td><td>The character to convert. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="10c3c9b1b6e266b0b4eb6abe7b03b7d8"></a><!-- doxytag: member="XMP_Const.h::XMP_ClearOption" ref="10c3c9b1b6e266b0b4eb6abe7b03b7d8" args="(var, opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_ClearOption </td>
+ <td>(</td>
+ <td class="paramtype">var, <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;var &amp;= ~(opt)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro clears an option flag bit.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>var</em>&nbsp;</td><td>A variable storing an options flag. </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The bit-flag constant to clear. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="85bbf023b1b799c3c20176aa289d32b0"></a><!-- doxytag: member="XMP_Const.h::XMP_GetCharSize" ref="85bbf023b1b799c3c20176aa289d32b0" args="(f)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_GetCharSize </td>
+ <td>(</td>
+ <td class="paramtype">f&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;( ((int)(f)&amp;6) == 0 ? 1 : (int)(f)&amp;6 )</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the byte-size of a character.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>f</em>&nbsp;</td><td>The character to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="12870d8442720ce5230791abc26f9597"></a><!-- doxytag: member="XMP_Const.h::XMP_NodeIsSchema" ref="12870d8442720ce5230791abc26f9597" args="(opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_NodeIsSchema </td>
+ <td>(</td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_SchemaNode) != 0)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the property type specified by an options flag.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The options flag to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="1d41f53bd1d5c88fad8322ce15e39516"></a><!-- doxytag: member="XMP_Const.h::XMP_OptionIsClear" ref="1d41f53bd1d5c88fad8322ce15e39516" args="(var, opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_OptionIsClear </td>
+ <td>(</td>
+ <td class="paramtype">var, <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;(((var) &amp; (opt)) == 0)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports whether an option flag bit is clear.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>var</em>&nbsp;</td><td>A variable storing an options flag. </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The bit-flag constant to test. </td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the bit is clear. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="ba3edaa921326c7916adb0b70b1bcfb4"></a><!-- doxytag: member="XMP_Const.h::XMP_OptionIsSet" ref="ba3edaa921326c7916adb0b70b1bcfb4" args="(var, opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_OptionIsSet </td>
+ <td>(</td>
+ <td class="paramtype">var, <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;(((var) &amp; (opt)) != 0)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports whether an option flag bit is set.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>var</em>&nbsp;</td><td>A variable storing an options flag. </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The bit-flag constant to test. </td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the bit is set. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="7dc82df90f45b0d746b67d8fdc529c83"></a><!-- doxytag: member="XMP_Const.h::XMP_PropHasLang" ref="7dc82df90f45b0d746b67d8fdc529c83" args="(opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_PropHasLang </td>
+ <td>(</td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropHasLang) != 0)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the property type specified by an options flag.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The options flag to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="10828aa191aa666aa1166c27beead2a6"></a><!-- doxytag: member="XMP_Const.h::XMP_PropHasQualifiers" ref="10828aa191aa666aa1166c27beead2a6" args="(opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_PropHasQualifiers </td>
+ <td>(</td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropHasQualifiers) != 0)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the property type specified by an options flag.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The options flag to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="193b1414fa5312da2aa1d833b85612d0"></a><!-- doxytag: member="XMP_Const.h::XMP_PropIsAlias" ref="193b1414fa5312da2aa1d833b85612d0" args="(opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_PropIsAlias </td>
+ <td>(</td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropIsAlias) != 0)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the property type specified by an options flag.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The options flag to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="98ae521b621cfa3611211e3922a0fce8"></a><!-- doxytag: member="XMP_Const.h::XMP_PropIsArray" ref="98ae521b621cfa3611211e3922a0fce8" args="(opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_PropIsArray </td>
+ <td>(</td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropValueIsArray) != 0)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the property type specified by an options flag.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The options flag to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="8d1b4da6b3cb3a67bf4f8e79352eeeaa"></a><!-- doxytag: member="XMP_Const.h::XMP_PropIsQualifier" ref="8d1b4da6b3cb3a67bf4f8e79352eeeaa" args="(opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_PropIsQualifier </td>
+ <td>(</td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropIsQualifier) != 0)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the property type specified by an options flag.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The options flag to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="510b75338bd488ddd8d9bd4e326806f9"></a><!-- doxytag: member="XMP_Const.h::XMP_PropIsSimple" ref="510b75338bd488ddd8d9bd4e326806f9" args="(opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_PropIsSimple </td>
+ <td>(</td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropCompositeMask) == 0)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the property type specified by an options flag.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The options flag to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="ebea8c35e09da7db613e27d0e3ce945f"></a><!-- doxytag: member="XMP_Const.h::XMP_PropIsStruct" ref="ebea8c35e09da7db613e27d0e3ce945f" args="(opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_PropIsStruct </td>
+ <td>(</td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;(((opt) &amp; kXMP_PropValueIsStruct) != 0)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports the property type specified by an options flag.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The options flag to check. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="69c4d1b80c4dd581366e0c60209ef612"></a><!-- doxytag: member="XMP_Const.h::XMP_SetOption" ref="69c4d1b80c4dd581366e0c60209ef612" args="(var, opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_SetOption </td>
+ <td>(</td>
+ <td class="paramtype">var, <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;var |= (opt)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro sets an option flag bit.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>var</em>&nbsp;</td><td>A variable storing an options flag. </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The bit-flag constant to set. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="a31596e850cb6b208f5920833d67b9f1"></a><!-- doxytag: member="XMP_Const.h::XMP_TestOption" ref="a31596e850cb6b208f5920833d67b9f1" args="(var, opt)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XMP_TestOption </td>
+ <td>(</td>
+ <td class="paramtype">var, <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">opt&nbsp;</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td>&nbsp;&nbsp;&nbsp;(((var) &amp; (opt)) != 0)</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Macro reports whether an option flag bit is set.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>var</em>&nbsp;</td><td>A variable storing an options flag. </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>opt</em>&nbsp;</td><td>The bit-flag constant to test. </td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the bit is set. </dd></dl>
+
+</div>
+</div><p>
+<hr><h2>Typedef Documentation</h2>
+<a class="anchor" name="a2738ce2fca7f1809b12834b1b5e2d0e"></a><!-- doxytag: member="XMP_Const.h::XMP_AbortProc" ref="a2738ce2fca7f1809b12834b1b5e2d0e" args=")(void *arg)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef bool(* <a class="el" href="XMP__Const_8h.html#a2738ce2fca7f1809b12834b1b5e2d0e">XMP_AbortProc</a>)(void *arg) </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+The signature of a client-defined callback to check for a user request to abort a time-consuming operation within XMPFiles.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>arg</em>&nbsp;</td><td>A pointer to caller-defined data passed from the registration call.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True to abort the current operation, which results in an exception being thrown.</dd></dl>
+<dl class="see" compact><dt><b>See also:</b></dt><dd><code><a class="el" href="classTXMPFiles.html#7b86c130fdbd54b5ac158ec3fee93777" title="SetAbortProc() registers a callback function used to check for a user-signaled abort...">TXMPFiles::SetAbortProc()</a></code> </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="05b81829c04746826f4f85fbac76e3dd"></a><!-- doxytag: member="XMP_Const.h::XMP_Status" ref="05b81829c04746826f4f85fbac76e3dd" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef XMP_Int32 <a class="el" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Status</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+A signed 32-bit integer used as a status result for the output callback routine, <code>XMP_TextOutputProc</code>. Zero means no error, all other values except -1 are private to the callback. The callback is wrapped to prevent exceptions being thrown across DLL boundaries. Any exceptions thrown out of the callback cause a return status of -1.
+</div>
+</div><p>
+<a class="anchor" name="8ce3570e6e5ac14cd603e96fa9d2936f"></a><!-- doxytag: member="XMP_Const.h::XMP_TextOutputProc" ref="8ce3570e6e5ac14cd603e96fa9d2936f" args=")(void *refCon, XMP_StringPtr buffer, XMP_StringLen bufferSize)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef <a class="el" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Status</a>(* <a class="el" href="XMP__Const_8h.html#8ce3570e6e5ac14cd603e96fa9d2936f">XMP_TextOutputProc</a>)(void *refCon, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> buffer, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> bufferSize) </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+The signature of a client-defined callback for text output from XMP Toolkit debugging operations. The callback is invoked one or more times for each line of output. The end of a line is signaled by a '\n' character at the end of the buffer. Formatting newlines are never present in the middle of a buffer, but values of properties might contain any UTF-8 characters.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>refCon</em>&nbsp;</td><td>A pointer to client-defined data passed to the TextOutputProc.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>buffer</em>&nbsp;</td><td>A string containing one line of output.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>bufferSize</em>&nbsp;</td><td>The number of characters in the output buffer.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>A success/fail status value. Any failure result aborts the output.</dd></dl>
+<dl class="see" compact><dt><b>See also:</b></dt><dd><code><a class="el" href="classTXMPMeta.html#466fa349c9765f39ca6b1450908e769f" title="DumpObject() outputs the content of an XMP object to a callback handler for debugging...">TXMPMeta::DumpObject()</a></code> </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="b516453dd7d906e911f8951983cde5f1"></a><!-- doxytag: member="XMP_Const.h::XMPDocOpsRef" ref="b516453dd7d906e911f8951983cde5f1" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef struct __XMPDocOps__* <a class="el" href="XMP__Const_8h.html#b516453dd7d906e911f8951983cde5f1">XMPDocOpsRef</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+An "ABI safe" pointer to the internal part of an XMP document operations object. Use to pass an XMP document operations object across client DLL boundaries. See <code>TXMPDocOps</code>.
+</div>
+</div><p>
+<a class="anchor" name="a4bca98ad67d7a62c60cb13dbbab0f25"></a><!-- doxytag: member="XMP_Const.h::XMPFilesRef" ref="a4bca98ad67d7a62c60cb13dbbab0f25" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef struct __XMPFiles__* <a class="el" href="XMP__Const_8h.html#a4bca98ad67d7a62c60cb13dbbab0f25">XMPFilesRef</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+An "ABI safe" pointer to the internal part of an XMP file-handling object. Use to pass an XMP file-handling object across client DLL boundaries. See <code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code>.
+</div>
+</div><p>
+<a class="anchor" name="6ade57a30fb1e40d6aa9695c440fc3d2"></a><!-- doxytag: member="XMP_Const.h::XMPIteratorRef" ref="6ade57a30fb1e40d6aa9695c440fc3d2" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef struct __XMPIterator__* <a class="el" href="XMP__Const_8h.html#6ade57a30fb1e40d6aa9695c440fc3d2">XMPIteratorRef</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+An "ABI safe" pointer to the internal part of an XMP iteration object. Use to pass an XMP iteration object across client DLL boundaries. See <code><a class="el" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a></code>.
+</div>
+</div><p>
+<a class="anchor" name="549d5e2cbcb58302d3df840a0205283e"></a><!-- doxytag: member="XMP_Const.h::XMPMetaRef" ref="549d5e2cbcb58302d3df840a0205283e" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef struct __XMPMeta__* <a class="el" href="XMP__Const_8h.html#549d5e2cbcb58302d3df840a0205283e">XMPMetaRef</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+An "ABI safe" pointer to the internal part of an XMP object. Use to pass an XMP object across client DLL boundaries. See <code><a class="el" href="classTXMPMeta.html#fbfebded0b85b08bd9c5ba0d7dae07e0" title="Retrieves an internal reference that can be safely passed across DLL boundaries and...">TXMPMeta::GetInternalRef()</a></code>.
+</div>
+</div><p>
+<hr><h2>Enumeration Type Documentation</h2>
+<a class="anchor" name="06fc87d81c62e9abb8790b6e5713c55b"></a><!-- doxytag: member="XMP_Const.h::@0" ref="06fc87d81c62e9abb8790b6e5713c55b" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Type for yes/no/maybe answers. The values are picked to allow Boolean-like usage. The yes and values are true (non-zero), the no value is false (zero). <dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="06fc87d81c62e9abb8790b6e5713c55bcf4bfe01497bd0d88c2af337e4bac39e"></a><!-- doxytag: member="kXMPTS_Yes" ref="06fc87d81c62e9abb8790b6e5713c55bcf4bfe01497bd0d88c2af337e4bac39e" args="" -->kXMPTS_Yes</em>&nbsp;</td><td>
+The part or parts have definitely changed. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="06fc87d81c62e9abb8790b6e5713c55b2a88f4d4589bf413377283843f70bc90"></a><!-- doxytag: member="kXMPTS_No" ref="06fc87d81c62e9abb8790b6e5713c55b2a88f4d4589bf413377283843f70bc90" args="" -->kXMPTS_No</em>&nbsp;</td><td>
+The part or parts have definitely not changed. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="06fc87d81c62e9abb8790b6e5713c55b7a73219cd125bb21e294ba474112a584"></a><!-- doxytag: member="kXMPTS_Maybe" ref="06fc87d81c62e9abb8790b6e5713c55b7a73219cd125bb21e294ba474112a584" args="" -->kXMPTS_Maybe</em>&nbsp;</td><td>
+The part or parts might, or might not, have changed. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="df764cbdea00d65edcd07bb9953ad2b7"></a><!-- doxytag: member="XMP_Const.h::@1" ref="df764cbdea00d65edcd07bb9953ad2b7" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Constant values for <code><a class="el" href="structXMP__DateTime.html#2786ad8875bd59f07b8dc2b1d09c6f96">XMP_DateTime::tzSign</a></code> field.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="df764cbdea00d65edcd07bb9953ad2b7511551ce156d5fd96c26ad464b837801"></a><!-- doxytag: member="kXMP_TimeWestOfUTC" ref="df764cbdea00d65edcd07bb9953ad2b7511551ce156d5fd96c26ad464b837801" args="" -->kXMP_TimeWestOfUTC</em>&nbsp;</td><td>
+Time zone is west of UTC. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="df764cbdea00d65edcd07bb9953ad2b73f41be55491204982acb39c9f6c7ad13"></a><!-- doxytag: member="kXMP_TimeIsUTC" ref="df764cbdea00d65edcd07bb9953ad2b73f41be55491204982acb39c9f6c7ad13" args="" -->kXMP_TimeIsUTC</em>&nbsp;</td><td>
+UTC time. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="df764cbdea00d65edcd07bb9953ad2b768851b70cc1d2346fa21bc0b0ae6cfec"></a><!-- doxytag: member="kXMP_TimeEastOfUTC" ref="df764cbdea00d65edcd07bb9953ad2b768851b70cc1d2346fa21bc0b0ae6cfec" args="" -->kXMP_TimeEastOfUTC</em>&nbsp;</td><td>
+Time zone is east of UTC. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="385c44f6fb256e5716a2302a5b940388"></a><!-- doxytag: member="XMP_Const.h::@10" ref="385c44f6fb256e5716a2302a5b940388" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+File format constants for use with XMPFiles.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b94038817ab6d429c1550eb3cc16d2e544b78eb"></a><!-- doxytag: member="kXMP_PDFFile" ref="385c44f6fb256e5716a2302a5b94038817ab6d429c1550eb3cc16d2e544b78eb" args="" -->kXMP_PDFFile</em>&nbsp;</td><td>
+Public file format constant: 'PDF '. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b94038852c90935ee28a0875a49843d463cad70"></a><!-- doxytag: member="kXMP_PostScriptFile" ref="385c44f6fb256e5716a2302a5b94038852c90935ee28a0875a49843d463cad70" args="" -->kXMP_PostScriptFile</em>&nbsp;</td><td>
+Public file format constant: 'PS ', general PostScript following DSC conventions. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388d947e6da0c4d923195d93e0c53a79c4e"></a><!-- doxytag: member="kXMP_EPSFile" ref="385c44f6fb256e5716a2302a5b940388d947e6da0c4d923195d93e0c53a79c4e" args="" -->kXMP_EPSFile</em>&nbsp;</td><td>
+Public file format constant: 'EPS ', encapsulated PostScript. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388d752b2d3e1139e0745223a9385ef6487"></a><!-- doxytag: member="kXMP_JPEGFile" ref="385c44f6fb256e5716a2302a5b940388d752b2d3e1139e0745223a9385ef6487" args="" -->kXMP_JPEGFile</em>&nbsp;</td><td>
+Public file format constant: 'JPEG'. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b94038878b8fa38aaa2067e3e1baa0dcaa7571d"></a><!-- doxytag: member="kXMP_JPEG2KFile" ref="385c44f6fb256e5716a2302a5b94038878b8fa38aaa2067e3e1baa0dcaa7571d" args="" -->kXMP_JPEG2KFile</em>&nbsp;</td><td>
+Public file format constant: 'JPX ', JPEG 2000, ISO 15444-1. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388dc0edf25d933c2a21b25449692c3ba08"></a><!-- doxytag: member="kXMP_TIFFFile" ref="385c44f6fb256e5716a2302a5b940388dc0edf25d933c2a21b25449692c3ba08" args="" -->kXMP_TIFFFile</em>&nbsp;</td><td>
+Public file format constant: 'TIFF'. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388851d2f4525d705cd2dcabb540d0ddc06"></a><!-- doxytag: member="kXMP_GIFFile" ref="385c44f6fb256e5716a2302a5b940388851d2f4525d705cd2dcabb540d0ddc06" args="" -->kXMP_GIFFile</em>&nbsp;</td><td>
+Public file format constant: 'GIF '. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388c989381d37de320495e4d13f9ecc6371"></a><!-- doxytag: member="kXMP_PNGFile" ref="385c44f6fb256e5716a2302a5b940388c989381d37de320495e4d13f9ecc6371" args="" -->kXMP_PNGFile</em>&nbsp;</td><td>
+Public file format constant: 'PNG '. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388564a8095f65d951f451e16eb56650597"></a><!-- doxytag: member="kXMP_SWFFile" ref="385c44f6fb256e5716a2302a5b940388564a8095f65d951f451e16eb56650597" args="" -->kXMP_SWFFile</em>&nbsp;</td><td>
+Public file format constant: 'SWF '. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388b1eeba00d1d92e313acfe68cd054daf9"></a><!-- doxytag: member="kXMP_FLAFile" ref="385c44f6fb256e5716a2302a5b940388b1eeba00d1d92e313acfe68cd054daf9" args="" -->kXMP_FLAFile</em>&nbsp;</td><td>
+Public file format constant: 'FLA '. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388455bc501088bbd8061fe3ea386a5066f"></a><!-- doxytag: member="kXMP_FLVFile" ref="385c44f6fb256e5716a2302a5b940388455bc501088bbd8061fe3ea386a5066f" args="" -->kXMP_FLVFile</em>&nbsp;</td><td>
+Public file format constant: 'FLV '. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388ebdb172c8a75b4ead2eff2d26ed3dc37"></a><!-- doxytag: member="kXMP_MOVFile" ref="385c44f6fb256e5716a2302a5b940388ebdb172c8a75b4ead2eff2d26ed3dc37" args="" -->kXMP_MOVFile</em>&nbsp;</td><td>
+Public file format constant: 'MOV ', Quicktime. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388e3a6333624e5c292caf14ad849a5e26e"></a><!-- doxytag: member="kXMP_AVIFile" ref="385c44f6fb256e5716a2302a5b940388e3a6333624e5c292caf14ad849a5e26e" args="" -->kXMP_AVIFile</em>&nbsp;</td><td>
+Public file format constant: 'AVI '. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388d2935ea79b4f9253891e3a68a002c5bb"></a><!-- doxytag: member="kXMP_CINFile" ref="385c44f6fb256e5716a2302a5b940388d2935ea79b4f9253891e3a68a002c5bb" args="" -->kXMP_CINFile</em>&nbsp;</td><td>
+Public file format constant: 'CIN ', Cineon. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388cc1fcd4e52423c0dd2966a2e92352fb8"></a><!-- doxytag: member="kXMP_WAVFile" ref="385c44f6fb256e5716a2302a5b940388cc1fcd4e52423c0dd2966a2e92352fb8" args="" -->kXMP_WAVFile</em>&nbsp;</td><td>
+Public file format constant: 'WAV '. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388f3ee34ed2bc26dec0e2d572eeb0de89b"></a><!-- doxytag: member="kXMP_MP3File" ref="385c44f6fb256e5716a2302a5b940388f3ee34ed2bc26dec0e2d572eeb0de89b" args="" -->kXMP_MP3File</em>&nbsp;</td><td>
+Public file format constant: 'MP3 '. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b94038842cb8767d9cf16eaeb7aec68a4f224e9"></a><!-- doxytag: member="kXMP_SESFile" ref="385c44f6fb256e5716a2302a5b94038842cb8767d9cf16eaeb7aec68a4f224e9" args="" -->kXMP_SESFile</em>&nbsp;</td><td>
+Public file format constant: 'SES ', Audition session. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b9403886c949ee85f42eaaed035591338be6789"></a><!-- doxytag: member="kXMP_CELFile" ref="385c44f6fb256e5716a2302a5b9403886c949ee85f42eaaed035591338be6789" args="" -->kXMP_CELFile</em>&nbsp;</td><td>
+Public file format constant: 'CEL ', Audition loop. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388043afdc1db730db9ac03c505140c61c8"></a><!-- doxytag: member="kXMP_MPEGFile" ref="385c44f6fb256e5716a2302a5b940388043afdc1db730db9ac03c505140c61c8" args="" -->kXMP_MPEGFile</em>&nbsp;</td><td>
+Public file format constant: 'MPEG'. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388b58eaebed494530072ad990ac7a9807a"></a><!-- doxytag: member="kXMP_MPEG2File" ref="385c44f6fb256e5716a2302a5b940388b58eaebed494530072ad990ac7a9807a" args="" -->kXMP_MPEG2File</em>&nbsp;</td><td>
+Public file format constant: 'MP2 '. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b94038889e6282c3f0c8966d788500f5d8eaa91"></a><!-- doxytag: member="kXMP_MPEG4File" ref="385c44f6fb256e5716a2302a5b94038889e6282c3f0c8966d788500f5d8eaa91" args="" -->kXMP_MPEG4File</em>&nbsp;</td><td>
+Public file format constant: 'MP4 ', ISO 14494-12 and -14. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b94038878c62f7c10b16b1a862d93f6226a4622"></a><!-- doxytag: member="kXMP_WMAVFile" ref="385c44f6fb256e5716a2302a5b94038878c62f7c10b16b1a862d93f6226a4622" args="" -->kXMP_WMAVFile</em>&nbsp;</td><td>
+Public file format constant: 'WMAV', Windows Media Audio and Video. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388f093d01e7e9cc55a7d1e204498521fc3"></a><!-- doxytag: member="kXMP_AIFFFile" ref="385c44f6fb256e5716a2302a5b940388f093d01e7e9cc55a7d1e204498521fc3" args="" -->kXMP_AIFFFile</em>&nbsp;</td><td>
+Public file format constant: 'AIFF'. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388bad9584845edf66f2f8fc3c336977e34"></a><!-- doxytag: member="kXMP_P2File" ref="385c44f6fb256e5716a2302a5b940388bad9584845edf66f2f8fc3c336977e34" args="" -->kXMP_P2File</em>&nbsp;</td><td>
+Public file format constant: 'P2 ', a collection not really a single file. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b9403885f78caa0871695cc92e058e4f4b2dd57"></a><!-- doxytag: member="kXMP_XDCAM_FAMFile" ref="385c44f6fb256e5716a2302a5b9403885f78caa0871695cc92e058e4f4b2dd57" args="" -->kXMP_XDCAM_FAMFile</em>&nbsp;</td><td>
+Public file format constant: 'XDCF', a collection not really a single file. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b94038864fe7908df6341e13d9d8c8199cdf852"></a><!-- doxytag: member="kXMP_XDCAM_SAMFile" ref="385c44f6fb256e5716a2302a5b94038864fe7908df6341e13d9d8c8199cdf852" args="" -->kXMP_XDCAM_SAMFile</em>&nbsp;</td><td>
+Public file format constant: 'XDCS', a collection not really a single file. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b94038845bf9b21d5ffed3594fbd585c47cc4fc"></a><!-- doxytag: member="kXMP_XDCAM_EXFile" ref="385c44f6fb256e5716a2302a5b94038845bf9b21d5ffed3594fbd585c47cc4fc" args="" -->kXMP_XDCAM_EXFile</em>&nbsp;</td><td>
+Public file format constant: 'XDCX', a collection not really a single file. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388fc5ff976e78df2d79d651de818b011f2"></a><!-- doxytag: member="kXMP_AVCHDFile" ref="385c44f6fb256e5716a2302a5b940388fc5ff976e78df2d79d651de818b011f2" args="" -->kXMP_AVCHDFile</em>&nbsp;</td><td>
+Public file format constant: 'AVHD', a collection not really a single file. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388a0edb070c11f87c3dad9f8f7a83b9b5e"></a><!-- doxytag: member="kXMP_SonyHDVFile" ref="385c44f6fb256e5716a2302a5b940388a0edb070c11f87c3dad9f8f7a83b9b5e" args="" -->kXMP_SonyHDVFile</em>&nbsp;</td><td>
+Public file format constant: 'SHDV', a collection not really a single file. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388542634e6051139c44fd7b92d08c64760"></a><!-- doxytag: member="kXMP_HTMLFile" ref="385c44f6fb256e5716a2302a5b940388542634e6051139c44fd7b92d08c64760" args="" -->kXMP_HTMLFile</em>&nbsp;</td><td>
+Public file format constant: 'HTML'. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388d217b996403fa13caef3d6e978023124"></a><!-- doxytag: member="kXMP_XMLFile" ref="385c44f6fb256e5716a2302a5b940388d217b996403fa13caef3d6e978023124" args="" -->kXMP_XMLFile</em>&nbsp;</td><td>
+Public file format constant: 'XML '. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b94038827051cd824d3ae7bb59e3af7a7908ffd"></a><!-- doxytag: member="kXMP_TextFile" ref="385c44f6fb256e5716a2302a5b94038827051cd824d3ae7bb59e3af7a7908ffd" args="" -->kXMP_TextFile</em>&nbsp;</td><td>
+Public file format constant: 'text'. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b94038822b478a9d0d52d12e8e4a1181024eb1c"></a><!-- doxytag: member="kXMP_PhotoshopFile" ref="385c44f6fb256e5716a2302a5b94038822b478a9d0d52d12e8e4a1181024eb1c" args="" -->kXMP_PhotoshopFile</em>&nbsp;</td><td>
+Adobe application file format constant: 'PSD '. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b94038882935c41c6222ff4cca954278f18e554"></a><!-- doxytag: member="kXMP_IllustratorFile" ref="385c44f6fb256e5716a2302a5b94038882935c41c6222ff4cca954278f18e554" args="" -->kXMP_IllustratorFile</em>&nbsp;</td><td>
+Adobe application file format constant: 'AI '. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b94038879cbf96ecc4ac3e0ebfb2d182bc75e60"></a><!-- doxytag: member="kXMP_InDesignFile" ref="385c44f6fb256e5716a2302a5b94038879cbf96ecc4ac3e0ebfb2d182bc75e60" args="" -->kXMP_InDesignFile</em>&nbsp;</td><td>
+Adobe application file format constant: 'INDD'. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b9403885fb9e99541bbb2d8e375d0cc9fd92a2e"></a><!-- doxytag: member="kXMP_AEProjectFile" ref="385c44f6fb256e5716a2302a5b9403885fb9e99541bbb2d8e375d0cc9fd92a2e" args="" -->kXMP_AEProjectFile</em>&nbsp;</td><td>
+Adobe application file format constant: 'AEP '. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388da5b138722448c4d4595fe760668c3df"></a><!-- doxytag: member="kXMP_AEProjTemplateFile" ref="385c44f6fb256e5716a2302a5b940388da5b138722448c4d4595fe760668c3df" args="" -->kXMP_AEProjTemplateFile</em>&nbsp;</td><td>
+Adobe application file format constant: 'AET ', After Effects Project Template. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388fd8d3d1c8c84bc6ab773f1298b3938f0"></a><!-- doxytag: member="kXMP_AEFilterPresetFile" ref="385c44f6fb256e5716a2302a5b940388fd8d3d1c8c84bc6ab773f1298b3938f0" args="" -->kXMP_AEFilterPresetFile</em>&nbsp;</td><td>
+Adobe application file format constant: 'FFX '. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388e28efb65bde55f3f8ddfd1fd8a168e2a"></a><!-- doxytag: member="kXMP_EncoreProjectFile" ref="385c44f6fb256e5716a2302a5b940388e28efb65bde55f3f8ddfd1fd8a168e2a" args="" -->kXMP_EncoreProjectFile</em>&nbsp;</td><td>
+Adobe application file format constant: 'NCOR'. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b940388eff4f68cd5162370f7bf938a868e280d"></a><!-- doxytag: member="kXMP_PremiereProjectFile" ref="385c44f6fb256e5716a2302a5b940388eff4f68cd5162370f7bf938a868e280d" args="" -->kXMP_PremiereProjectFile</em>&nbsp;</td><td>
+Adobe application file format constant: 'PRPJ'. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b9403881ad712bbd349dc899ca1e71971032b0a"></a><!-- doxytag: member="kXMP_PremiereTitleFile" ref="385c44f6fb256e5716a2302a5b9403881ad712bbd349dc899ca1e71971032b0a" args="" -->kXMP_PremiereTitleFile</em>&nbsp;</td><td>
+Adobe application file format constant: 'PRTL'. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b94038896804f7b8ce83786051c4dac4930aa96"></a><!-- doxytag: member="kXMP_UCFFile" ref="385c44f6fb256e5716a2302a5b94038896804f7b8ce83786051c4dac4930aa96" args="" -->kXMP_UCFFile</em>&nbsp;</td><td>
+Adobe application file format constant: 'UCF ', Universal Container Format. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="385c44f6fb256e5716a2302a5b9403882845f95eaaaf492f5011bff05a398719"></a><!-- doxytag: member="kXMP_UnknownFile" ref="385c44f6fb256e5716a2302a5b9403882845f95eaaaf492f5011bff05a398719" args="" -->kXMP_UnknownFile</em>&nbsp;</td><td>
+Unknown file format constant: ' '. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="c36f475ca5b446f4fde4c9b90bec77c8"></a><!-- doxytag: member="XMP_Const.h::@12" ref="c36f475ca5b446f4fde4c9b90bec77c8" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Constants to allow easy testing for 16/32 bit and big/little endian.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="c36f475ca5b446f4fde4c9b90bec77c8f5b20dd9abbef29169a362b265049637"></a><!-- doxytag: member="kXMP_Char8Bit" ref="c36f475ca5b446f4fde4c9b90bec77c8f5b20dd9abbef29169a362b265049637" args="" -->kXMP_Char8Bit</em>&nbsp;</td><td>
+8-bit </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="c36f475ca5b446f4fde4c9b90bec77c80966bca9b241646f6a730f96c5c14a2d"></a><!-- doxytag: member="kXMP_Char16BitBig" ref="c36f475ca5b446f4fde4c9b90bec77c80966bca9b241646f6a730f96c5c14a2d" args="" -->kXMP_Char16BitBig</em>&nbsp;</td><td>
+16-bit big-endian </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="c36f475ca5b446f4fde4c9b90bec77c819b97b941d6586031190025225ee0eaa"></a><!-- doxytag: member="kXMP_Char16BitLittle" ref="c36f475ca5b446f4fde4c9b90bec77c819b97b941d6586031190025225ee0eaa" args="" -->kXMP_Char16BitLittle</em>&nbsp;</td><td>
+16-bit little-endian </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="c36f475ca5b446f4fde4c9b90bec77c887f8231aec6dd125baf77c9f3f918fbc"></a><!-- doxytag: member="kXMP_Char32BitBig" ref="c36f475ca5b446f4fde4c9b90bec77c887f8231aec6dd125baf77c9f3f918fbc" args="" -->kXMP_Char32BitBig</em>&nbsp;</td><td>
+32-bit big-endian </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="c36f475ca5b446f4fde4c9b90bec77c8859e7aa88e7dfd3f55ad2b6445a4708e"></a><!-- doxytag: member="kXMP_Char32BitLittle" ref="c36f475ca5b446f4fde4c9b90bec77c8859e7aa88e7dfd3f55ad2b6445a4708e" args="" -->kXMP_Char32BitLittle</em>&nbsp;</td><td>
+32-bit little-endian </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="c36f475ca5b446f4fde4c9b90bec77c86c37f0724299a9c88e2f622d3246d63b"></a><!-- doxytag: member="kXMP_CharUnknown" ref="c36f475ca5b446f4fde4c9b90bec77c86c37f0724299a9c88e2f622d3246d63b" args="" -->kXMP_CharUnknown</em>&nbsp;</td><td>
+Variable or not-yet-known cases. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="05589fbab0657f08285ebdfe93f5ec9e"></a><!-- doxytag: member="XMP_Const.h::@13" ref="05589fbab0657f08285ebdfe93f5ec9e" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Version of the <a class="el" href="structXMP__PacketInfo.html" title="XMP packet description.">XMP_PacketInfo</a> type.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="05589fbab0657f08285ebdfe93f5ec9e767b4847575a8de28e691be660d43817"></a><!-- doxytag: member="kXMP_PacketInfoVersion" ref="05589fbab0657f08285ebdfe93f5ec9e767b4847575a8de28e691be660d43817" args="" -->kXMP_PacketInfoVersion</em>&nbsp;</td><td>
+Version of the <a class="el" href="structXMP__PacketInfo.html" title="XMP packet description.">XMP_PacketInfo</a> type. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="16af7b253440dadd46a80a4b9fddba4d"></a><!-- doxytag: member="XMP_Const.h::@14" ref="16af7b253440dadd46a80a4b9fddba4d" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Values for <code><a class="el" href="structXMP__ThumbnailInfo.html#f57b103c5a78c636afc3a391f28a5906" title="The format of the thumbnail image data.">XMP_ThumbnailInfo::tnailFormat</a></code>.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="16af7b253440dadd46a80a4b9fddba4d7a20b5cd0872055d043b3593e18f41d6"></a><!-- doxytag: member="kXMP_UnknownTNail" ref="16af7b253440dadd46a80a4b9fddba4d7a20b5cd0872055d043b3593e18f41d6" args="" -->kXMP_UnknownTNail</em>&nbsp;</td><td>
+The thumbnail data has an unknown format. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="16af7b253440dadd46a80a4b9fddba4d5184f12e2695285b081ddafc5aeb4321"></a><!-- doxytag: member="kXMP_JPEGTNail" ref="16af7b253440dadd46a80a4b9fddba4d5184f12e2695285b081ddafc5aeb4321" args="" -->kXMP_JPEGTNail</em>&nbsp;</td><td>
+The thumbnail data is a JPEG stream, presumably compressed. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="16af7b253440dadd46a80a4b9fddba4ddf767c0e478570baac04311b7b79f951"></a><!-- doxytag: member="kXMP_TIFFTNail" ref="16af7b253440dadd46a80a4b9fddba4ddf767c0e478570baac04311b7b79f951" args="" -->kXMP_TIFFTNail</em>&nbsp;</td><td>
+The thumbnail data is a TIFF stream, presumably uncompressed. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="16af7b253440dadd46a80a4b9fddba4db3207f0166247f17fa913daec2b771ab"></a><!-- doxytag: member="kXMP_PShopTNail" ref="16af7b253440dadd46a80a4b9fddba4db3207f0166247f17fa913daec2b771ab" args="" -->kXMP_PShopTNail</em>&nbsp;</td><td>
+The thumbnail data is in the format of Photoshop Image Resource 1036. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="ba01db17f4a2bfbc3db60dc172972a25"></a><!-- doxytag: member="XMP_Const.h::@15" ref="ba01db17f4a2bfbc3db60dc172972a25" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Version of the <a class="el" href="structXMP__ThumbnailInfo.html" title="Thumbnail descriptor.">XMP_ThumbnailInfo</a> type.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="ba01db17f4a2bfbc3db60dc172972a25b1e9c825d1f58e696f34c8940b0176be"></a><!-- doxytag: member="kXMP_ThumbnailInfoVersion" ref="ba01db17f4a2bfbc3db60dc172972a25b1e9c825d1f58e696f34c8940b0176be" args="" -->kXMP_ThumbnailInfoVersion</em>&nbsp;</td><td>
+Version of the <a class="el" href="structXMP__ThumbnailInfo.html" title="Thumbnail descriptor.">XMP_ThumbnailInfo</a> type. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="af105ae5beaca1dee30ae54530691fce"></a><!-- doxytag: member="XMP_Const.h::@16" ref="af105ae5beaca1dee30ae54530691fce" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Option bit flags for <code><a class="el" href="classTXMPFiles.html#0874bbbf41c9490abfb613bfe297327d" title="Initializes the XMPFiles library; must be called before creating an SXMPFiles object...">TXMPFiles::Initialize()</a></code>.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="af105ae5beaca1dee30ae54530691fce4e1723c609cc341c88f254473e315ae9"></a><!-- doxytag: member="kXMPFiles_NoQuickTimeInit" ref="af105ae5beaca1dee30ae54530691fce4e1723c609cc341c88f254473e315ae9" args="" -->kXMPFiles_NoQuickTimeInit</em>&nbsp;</td><td>
+Do not initialize QuickTime, the client will. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="80155586fa275b28773c9b203f52caba"></a><!-- doxytag: member="XMP_Const.h::@17" ref="80155586fa275b28773c9b203f52caba" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Option bit flags for <code><a class="el" href="classTXMPFiles.html#cb9e16a1477ec67fa6da6d736a9bc131" title="GetFormatInfo() reports what features are supported for a specific file format.">TXMPFiles::GetFormatInfo()</a></code>.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="80155586fa275b28773c9b203f52caba23a3eb2a5e95292036a93ad6666fa388"></a><!-- doxytag: member="kXMPFiles_CanInjectXMP" ref="80155586fa275b28773c9b203f52caba23a3eb2a5e95292036a93ad6666fa388" args="" -->kXMPFiles_CanInjectXMP</em>&nbsp;</td><td>
+Can inject first-time XMP into an existing file. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="80155586fa275b28773c9b203f52caba126c9cc056f6569c424431edbcb9521c"></a><!-- doxytag: member="kXMPFiles_CanExpand" ref="80155586fa275b28773c9b203f52caba126c9cc056f6569c424431edbcb9521c" args="" -->kXMPFiles_CanExpand</em>&nbsp;</td><td>
+Can expand XMP or other metadata in an existing file. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="80155586fa275b28773c9b203f52caba8957f1ef358b4ab3a1df519903f2ae07"></a><!-- doxytag: member="kXMPFiles_CanRewrite" ref="80155586fa275b28773c9b203f52caba8957f1ef358b4ab3a1df519903f2ae07" args="" -->kXMPFiles_CanRewrite</em>&nbsp;</td><td>
+Can copy one file to another, writing new metadata. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="80155586fa275b28773c9b203f52cabab55e1873e67048928de3fc47550678c3"></a><!-- doxytag: member="kXMPFiles_PrefersInPlace" ref="80155586fa275b28773c9b203f52cabab55e1873e67048928de3fc47550678c3" args="" -->kXMPFiles_PrefersInPlace</em>&nbsp;</td><td>
+Can expand, but prefers in-place update. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="80155586fa275b28773c9b203f52cabafc2bc7cfdd28a326788d563ec0357694"></a><!-- doxytag: member="kXMPFiles_CanReconcile" ref="80155586fa275b28773c9b203f52cabafc2bc7cfdd28a326788d563ec0357694" args="" -->kXMPFiles_CanReconcile</em>&nbsp;</td><td>
+Supports reconciliation between XMP and other forms. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="80155586fa275b28773c9b203f52caba4a183c3ec4994cf09993e5b31dee9733"></a><!-- doxytag: member="kXMPFiles_AllowsOnlyXMP" ref="80155586fa275b28773c9b203f52caba4a183c3ec4994cf09993e5b31dee9733" args="" -->kXMPFiles_AllowsOnlyXMP</em>&nbsp;</td><td>
+Allows access to just the XMP, ignoring other forms. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="80155586fa275b28773c9b203f52cabadb116eed738d1fcdfe4ab9c1635e08ea"></a><!-- doxytag: member="kXMPFiles_ReturnsRawPacket" ref="80155586fa275b28773c9b203f52cabadb116eed738d1fcdfe4ab9c1635e08ea" args="" -->kXMPFiles_ReturnsRawPacket</em>&nbsp;</td><td>
+File handler returns raw XMP packet information. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="80155586fa275b28773c9b203f52cabaf7fe49636dc1fcc0d6938d4b6fb83a09"></a><!-- doxytag: member="kXMPFiles_ReturnsTNail" ref="80155586fa275b28773c9b203f52cabaf7fe49636dc1fcc0d6938d4b6fb83a09" args="" -->kXMPFiles_ReturnsTNail</em>&nbsp;</td><td>
+File handler returns native thumbnail. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="80155586fa275b28773c9b203f52cabafc2c5b585e698ebf24a9379de35954b4"></a><!-- doxytag: member="kXMPFiles_HandlerOwnsFile" ref="80155586fa275b28773c9b203f52cabafc2c5b585e698ebf24a9379de35954b4" args="" -->kXMPFiles_HandlerOwnsFile</em>&nbsp;</td><td>
+The file handler does the file open and close. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="80155586fa275b28773c9b203f52caba9fe958d4ccde02516a3a267db63874cd"></a><!-- doxytag: member="kXMPFiles_AllowsSafeUpdate" ref="80155586fa275b28773c9b203f52caba9fe958d4ccde02516a3a267db63874cd" args="" -->kXMPFiles_AllowsSafeUpdate</em>&nbsp;</td><td>
+The file handler allows crash-safe file updates. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="80155586fa275b28773c9b203f52cabaee13099f78018a5e1ce033266c27e999"></a><!-- doxytag: member="kXMPFiles_NeedsReadOnlyPacket" ref="80155586fa275b28773c9b203f52cabaee13099f78018a5e1ce033266c27e999" args="" -->kXMPFiles_NeedsReadOnlyPacket</em>&nbsp;</td><td>
+The file format needs the XMP packet to be read-only. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="80155586fa275b28773c9b203f52cabad3027b786992e2a4762a4fa37c92943c"></a><!-- doxytag: member="kXMPFiles_UsesSidecarXMP" ref="80155586fa275b28773c9b203f52cabad3027b786992e2a4762a4fa37c92943c" args="" -->kXMPFiles_UsesSidecarXMP</em>&nbsp;</td><td>
+The file handler uses a "sidecar" file for the XMP. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="80155586fa275b28773c9b203f52cabaa2a6a4b744b40055387234632b688fcd"></a><!-- doxytag: member="kXMPFiles_FolderBasedFormat" ref="80155586fa275b28773c9b203f52cabaa2a6a4b744b40055387234632b688fcd" args="" -->kXMPFiles_FolderBasedFormat</em>&nbsp;</td><td>
+The format is folder oriented, for example the P2 video format. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="6b7b47dd702d9e331586d485013fd1ea"></a><!-- doxytag: member="XMP_Const.h::@18" ref="6b7b47dd702d9e331586d485013fd1ea" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Option bit flags for <code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">TXMPFiles::OpenFile()</a></code>.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="6b7b47dd702d9e331586d485013fd1ea4c61ec4ed571dbc5f1832ff6772320d2"></a><!-- doxytag: member="kXMPFiles_OpenForRead" ref="6b7b47dd702d9e331586d485013fd1ea4c61ec4ed571dbc5f1832ff6772320d2" args="" -->kXMPFiles_OpenForRead</em>&nbsp;</td><td>
+Open for read-only access. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6b7b47dd702d9e331586d485013fd1ea91fa388b3888bcb6a68615537b66a49b"></a><!-- doxytag: member="kXMPFiles_OpenForUpdate" ref="6b7b47dd702d9e331586d485013fd1ea91fa388b3888bcb6a68615537b66a49b" args="" -->kXMPFiles_OpenForUpdate</em>&nbsp;</td><td>
+Open for reading and writing. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6b7b47dd702d9e331586d485013fd1eaa58279b2b1311242e7374117f455bb96"></a><!-- doxytag: member="kXMPFiles_OpenOnlyXMP" ref="6b7b47dd702d9e331586d485013fd1eaa58279b2b1311242e7374117f455bb96" args="" -->kXMPFiles_OpenOnlyXMP</em>&nbsp;</td><td>
+Only the XMP is wanted, allows space/time optimizations. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6b7b47dd702d9e331586d485013fd1eaca2002b03d2a88da0203bf52a3122063"></a><!-- doxytag: member="kXMPFiles_OpenCacheTNail" ref="6b7b47dd702d9e331586d485013fd1eaca2002b03d2a88da0203bf52a3122063" args="" -->kXMPFiles_OpenCacheTNail</em>&nbsp;</td><td>
+Cache thumbnail if possible, <code><a class="el" href="classTXMPFiles.html#4ea1eda39f803322e10b2a554ef8ab06" title="GetThumbnail() retrieves the native thumbnail from an open file.">TXMPFiles::GetThumbnail()</a></code> will be called. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6b7b47dd702d9e331586d485013fd1ea0bef4db2ecdaf82a85df9e9d417aab18"></a><!-- doxytag: member="kXMPFiles_OpenStrictly" ref="6b7b47dd702d9e331586d485013fd1ea0bef4db2ecdaf82a85df9e9d417aab18" args="" -->kXMPFiles_OpenStrictly</em>&nbsp;</td><td>
+Be strict about locating XMP and reconciling with other forms. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6b7b47dd702d9e331586d485013fd1eaf6332435c7fc89cb0b7381e13fe43646"></a><!-- doxytag: member="kXMPFiles_OpenUseSmartHandler" ref="6b7b47dd702d9e331586d485013fd1eaf6332435c7fc89cb0b7381e13fe43646" args="" -->kXMPFiles_OpenUseSmartHandler</em>&nbsp;</td><td>
+Require the use of a smart handler. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6b7b47dd702d9e331586d485013fd1ea77b47c63e579b28cbd25083ceb58c285"></a><!-- doxytag: member="kXMPFiles_OpenUsePacketScanning" ref="6b7b47dd702d9e331586d485013fd1ea77b47c63e579b28cbd25083ceb58c285" args="" -->kXMPFiles_OpenUsePacketScanning</em>&nbsp;</td><td>
+Force packet scanning, do not use a smart handler. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6b7b47dd702d9e331586d485013fd1ea77f34b1873bb2584feabe26a2c8f1182"></a><!-- doxytag: member="kXMPFiles_OpenLimitedScanning" ref="6b7b47dd702d9e331586d485013fd1ea77f34b1873bb2584feabe26a2c8f1182" args="" -->kXMPFiles_OpenLimitedScanning</em>&nbsp;</td><td>
+Only packet scan files "known" to need scanning. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6b7b47dd702d9e331586d485013fd1ea05acd568597f72b4812b432ea6cf606a"></a><!-- doxytag: member="kXMPFiles_OpenRepairFile" ref="6b7b47dd702d9e331586d485013fd1ea05acd568597f72b4812b432ea6cf606a" args="" -->kXMPFiles_OpenRepairFile</em>&nbsp;</td><td>
+Attempt to repair a file opened for update, default is to not open (throw an exception). </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6b7b47dd702d9e331586d485013fd1eafaccd8151900b2c7fc3e7de598a92d34"></a><!-- doxytag: member="kXMPFiles_OpenInBackground" ref="6b7b47dd702d9e331586d485013fd1eafaccd8151900b2c7fc3e7de598a92d34" args="" -->kXMPFiles_OpenInBackground</em>&nbsp;</td><td>
+Set if calling from background thread. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="f9bdc3014f3d54c426b6d2df10de4960"></a><!-- doxytag: member="XMP_Const.h::@19" ref="f9bdc3014f3d54c426b6d2df10de4960" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Option bit flags for <code><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">TXMPFiles::CloseFile()</a></code>.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="f9bdc3014f3d54c426b6d2df10de4960dbf8d744f355ef9800a4ec44325baf54"></a><!-- doxytag: member="kXMPFiles_UpdateSafely" ref="f9bdc3014f3d54c426b6d2df10de4960dbf8d744f355ef9800a4ec44325baf54" args="" -->kXMPFiles_UpdateSafely</em>&nbsp;</td><td>
+Write into a temporary file and swap for crash safety. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="99fb83031ce9923c84392b4e92f956b5"></a><!-- doxytag: member="XMP_Const.h::@2" ref="99fb83031ce9923c84392b4e92f956b5" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Option bit flags for the <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> property accessor functions.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b5ab51f87b5c48f47f5cefb9e03293dafb"></a><!-- doxytag: member="kXMP_PropValueIsURI" ref="99fb83031ce9923c84392b4e92f956b5ab51f87b5c48f47f5cefb9e03293dafb" args="" -->kXMP_PropValueIsURI</em>&nbsp;</td><td>
+The XML string form of the property value is a URI, use rdf:resource attribute. DISCOURAGED. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b58e34a33a2eed56499d4f6f62da25d159"></a><!-- doxytag: member="kXMP_PropHasQualifiers" ref="99fb83031ce9923c84392b4e92f956b58e34a33a2eed56499d4f6f62da25d159" args="" -->kXMP_PropHasQualifiers</em>&nbsp;</td><td>
+The property has qualifiers, includes <code>rdf:type</code> and <code>xml:lang</code>. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b530146ed5209f5c3eb4eeb1fd8e4fb9fe"></a><!-- doxytag: member="kXMP_PropIsQualifier" ref="99fb83031ce9923c84392b4e92f956b530146ed5209f5c3eb4eeb1fd8e4fb9fe" args="" -->kXMP_PropIsQualifier</em>&nbsp;</td><td>
+This is a qualifier for some other property, includes <code>rdf:type</code> and <code>xml:lang</code>. Qualifiers can have arbitrary structure, and can themselves have qualifiers. If the qualifier itself has a structured value, this flag is only set for the top node of the qualifier's subtree. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b53fa5ed87edc731bfb3817f58ba70a217"></a><!-- doxytag: member="kXMP_PropHasLang" ref="99fb83031ce9923c84392b4e92f956b53fa5ed87edc731bfb3817f58ba70a217" args="" -->kXMP_PropHasLang</em>&nbsp;</td><td>
+Implies <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b58e34a33a2eed56499d4f6f62da25d159" title="The property has qualifiers, includes rdf:type and xml:lang.">kXMP_PropHasQualifiers</a></code>, property has <code>xml:lang</code>. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b5eff16fdf167afc73db25b30b529bd9d5"></a><!-- doxytag: member="kXMP_PropHasType" ref="99fb83031ce9923c84392b4e92f956b5eff16fdf167afc73db25b30b529bd9d5" args="" -->kXMP_PropHasType</em>&nbsp;</td><td>
+Implies <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b58e34a33a2eed56499d4f6f62da25d159" title="The property has qualifiers, includes rdf:type and xml:lang.">kXMP_PropHasQualifiers</a></code>, property has <code>rdf:type</code>. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e"></a><!-- doxytag: member="kXMP_PropValueIsStruct" ref="99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" args="" -->kXMP_PropValueIsStruct</em>&nbsp;</td><td>
+The value is a structure with nested fields. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b59b7706e0f0716ac7546bdc24ffedd0bc"></a><!-- doxytag: member="kXMP_PropValueIsArray" ref="99fb83031ce9923c84392b4e92f956b59b7706e0f0716ac7546bdc24ffedd0bc" args="" -->kXMP_PropValueIsArray</em>&nbsp;</td><td>
+The value is an array (RDF alt/bag/seq). The "ArrayIs..." flags identify specific types of array; default is a general unordered array, serialized using an <code>rdf:Bag</code> container. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b50d70c23394c0676657c89de5491192c0"></a><!-- doxytag: member="kXMP_PropArrayIsUnordered" ref="99fb83031ce9923c84392b4e92f956b50d70c23394c0676657c89de5491192c0" args="" -->kXMP_PropArrayIsUnordered</em>&nbsp;</td><td>
+The item order does not matter. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b5f1cdb3b0a3e852ec55e747a1686aba04"></a><!-- doxytag: member="kXMP_PropArrayIsOrdered" ref="99fb83031ce9923c84392b4e92f956b5f1cdb3b0a3e852ec55e747a1686aba04" args="" -->kXMP_PropArrayIsOrdered</em>&nbsp;</td><td>
+Implies <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b59b7706e0f0716ac7546bdc24ffedd0bc">kXMP_PropValueIsArray</a></code>, item order matters. It is serialized using an <code>rdf:Seq</code> container. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b52596b1f0ea4600270c99102c86b5f1f1"></a><!-- doxytag: member="kXMP_PropArrayIsAlternate" ref="99fb83031ce9923c84392b4e92f956b52596b1f0ea4600270c99102c86b5f1f1" args="" -->kXMP_PropArrayIsAlternate</em>&nbsp;</td><td>
+Implies <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5f1cdb3b0a3e852ec55e747a1686aba04" title="Implies kXMP_PropValueIsArray, item order matters. It is serialized using an rdf:Seq...">kXMP_PropArrayIsOrdered</a></code>, items are alternates. It is serialized using an <code>rdf:Alt</code> container. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b5ba253f67a6cf44b7438a3f96b516846d"></a><!-- doxytag: member="kXMP_PropArrayIsAltText" ref="99fb83031ce9923c84392b4e92f956b5ba253f67a6cf44b7438a3f96b516846d" args="" -->kXMP_PropArrayIsAltText</em>&nbsp;</td><td>
+Implies <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b52596b1f0ea4600270c99102c86b5f1f1" title="Implies kXMP_PropArrayIsOrdered, items are alternates. It is serialized using an...">kXMP_PropArrayIsAlternate</a></code>, items are localized text. Each array element is a simple property with an <code>xml:lang</code> attribute. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b5b975c19fb5c50f732a1a0d84dadb7c37"></a><!-- doxytag: member="kXMP_PropIsAlias" ref="99fb83031ce9923c84392b4e92f956b5b975c19fb5c50f732a1a0d84dadb7c37" args="" -->kXMP_PropIsAlias</em>&nbsp;</td><td>
+This property is an alias name for another property. This is only returned by <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">TXMPMeta::GetProperty()</a></code> and then only if the property name is simple, not an path expression. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b51f819ef281d1f52c4c12d5d02f49d3f0"></a><!-- doxytag: member="kXMP_PropHasAliases" ref="99fb83031ce9923c84392b4e92f956b51f819ef281d1f52c4c12d5d02f49d3f0" args="" -->kXMP_PropHasAliases</em>&nbsp;</td><td>
+This property is the base value (actual) for a set of aliases.This is only returned by <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">TXMPMeta::GetProperty()</a></code> and then only if the property name is simple, not an path expression. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b548097c6ea309f240965d77ab564a5464"></a><!-- doxytag: member="kXMP_PropIsInternal" ref="99fb83031ce9923c84392b4e92f956b548097c6ea309f240965d77ab564a5464" args="" -->kXMP_PropIsInternal</em>&nbsp;</td><td>
+The value of this property is "owned" by the application, and should not generally be editable in a UI. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b581dcd06251771a0ddee6c1e36128c65c"></a><!-- doxytag: member="kXMP_PropIsStable" ref="99fb83031ce9923c84392b4e92f956b581dcd06251771a0ddee6c1e36128c65c" args="" -->kXMP_PropIsStable</em>&nbsp;</td><td>
+The value of this property is not derived from the document content. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b50d898ea7f6b3db513bb24f8a6a285877"></a><!-- doxytag: member="kXMP_PropIsDerived" ref="99fb83031ce9923c84392b4e92f956b50d898ea7f6b3db513bb24f8a6a285877" args="" -->kXMP_PropIsDerived</em>&nbsp;</td><td>
+The value of this property is derived from the document content. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b56b5b5f4b869994b7390edc9589745e9f"></a><!-- doxytag: member="kXMP_PropArrayFormMask" ref="99fb83031ce9923c84392b4e92f956b56b5b5f4b869994b7390edc9589745e9f" args="" -->kXMP_PropArrayFormMask</em>&nbsp;</td><td>
+Property type bit-flag mask for all array types. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b560a9f26fb66c2e65cf40d9bc44968956"></a><!-- doxytag: member="kXMP_PropCompositeMask" ref="99fb83031ce9923c84392b4e92f956b560a9f26fb66c2e65cf40d9bc44968956" args="" -->kXMP_PropCompositeMask</em>&nbsp;</td><td>
+Property type bit-flag mask for composite types (array and struct). </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="99fb83031ce9923c84392b4e92f956b5e154b58429b257b18963ba3503e67974"></a><!-- doxytag: member="kXMP_ImplReservedMask" ref="99fb83031ce9923c84392b4e92f956b5e154b58429b257b18963ba3503e67974" args="" -->kXMP_ImplReservedMask</em>&nbsp;</td><td>
+Mask for bits that are reserved for transient use by the implementation. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409"></a><!-- doxytag: member="XMP_Const.h::@20" ref="db49720dc49f7d4e4cf9adbf2948e409" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Exception code constants.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e40914813595824de97382fffeae7b6fe581"></a><!-- doxytag: member="kXMPErr_Unknown" ref="db49720dc49f7d4e4cf9adbf2948e40914813595824de97382fffeae7b6fe581" args="" -->kXMPErr_Unknown</em>&nbsp;</td><td>
+Generic unknown error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409cd9fa1b621efafd5b218e3a785cbeda1"></a><!-- doxytag: member="kXMPErr_TBD" ref="db49720dc49f7d4e4cf9adbf2948e409cd9fa1b621efafd5b218e3a785cbeda1" args="" -->kXMPErr_TBD</em>&nbsp;</td><td>
+Generic undefined error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409c7ac408582c194cc723a24acb8b4e4c3"></a><!-- doxytag: member="kXMPErr_Unavailable" ref="db49720dc49f7d4e4cf9adbf2948e409c7ac408582c194cc723a24acb8b4e4c3" args="" -->kXMPErr_Unavailable</em>&nbsp;</td><td>
+Generic unavailable error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409115f3d761d2cad952aab23f35cbdf3a1"></a><!-- doxytag: member="kXMPErr_BadObject" ref="db49720dc49f7d4e4cf9adbf2948e409115f3d761d2cad952aab23f35cbdf3a1" args="" -->kXMPErr_BadObject</em>&nbsp;</td><td>
+Generic bad object error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e40952d197a8b0af3c55f16958162a4132f1"></a><!-- doxytag: member="kXMPErr_BadParam" ref="db49720dc49f7d4e4cf9adbf2948e40952d197a8b0af3c55f16958162a4132f1" args="" -->kXMPErr_BadParam</em>&nbsp;</td><td>
+Generic bad parameter error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409716956a038782e595ce61d3fbdd1a25a"></a><!-- doxytag: member="kXMPErr_BadValue" ref="db49720dc49f7d4e4cf9adbf2948e409716956a038782e595ce61d3fbdd1a25a" args="" -->kXMPErr_BadValue</em>&nbsp;</td><td>
+Generic bad value error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e40914bd6c24087d280c722c1a044eec27d6"></a><!-- doxytag: member="kXMPErr_AssertFailure" ref="db49720dc49f7d4e4cf9adbf2948e40914bd6c24087d280c722c1a044eec27d6" args="" -->kXMPErr_AssertFailure</em>&nbsp;</td><td>
+Generic assertion failure. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409a856bb36a9742d8542b483e00fc6511b"></a><!-- doxytag: member="kXMPErr_EnforceFailure" ref="db49720dc49f7d4e4cf9adbf2948e409a856bb36a9742d8542b483e00fc6511b" args="" -->kXMPErr_EnforceFailure</em>&nbsp;</td><td>
+Generic enforcement failure. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e4093de1ac8f4e4afb705d5a4654cb9579e2"></a><!-- doxytag: member="kXMPErr_Unimplemented" ref="db49720dc49f7d4e4cf9adbf2948e4093de1ac8f4e4afb705d5a4654cb9579e2" args="" -->kXMPErr_Unimplemented</em>&nbsp;</td><td>
+Generic unimplemented error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e4098babbd758d2c64fd04e85fa48e0675c0"></a><!-- doxytag: member="kXMPErr_InternalFailure" ref="db49720dc49f7d4e4cf9adbf2948e4098babbd758d2c64fd04e85fa48e0675c0" args="" -->kXMPErr_InternalFailure</em>&nbsp;</td><td>
+Generic internal failure. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e40914342c486ddf394ebc110a446becbfa7"></a><!-- doxytag: member="kXMPErr_Deprecated" ref="db49720dc49f7d4e4cf9adbf2948e40914342c486ddf394ebc110a446becbfa7" args="" -->kXMPErr_Deprecated</em>&nbsp;</td><td>
+Generic deprecated error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e40982941dc15c6ccde6b8fb2f9cc85c2eeb"></a><!-- doxytag: member="kXMPErr_ExternalFailure" ref="db49720dc49f7d4e4cf9adbf2948e40982941dc15c6ccde6b8fb2f9cc85c2eeb" args="" -->kXMPErr_ExternalFailure</em>&nbsp;</td><td>
+Generic external failure. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409c4ba7b1a57629e4994a0f7a515d51195"></a><!-- doxytag: member="kXMPErr_UserAbort" ref="db49720dc49f7d4e4cf9adbf2948e409c4ba7b1a57629e4994a0f7a515d51195" args="" -->kXMPErr_UserAbort</em>&nbsp;</td><td>
+Generic user abort error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e4095322df07e2a7792824d2468c4837f1cb"></a><!-- doxytag: member="kXMPErr_StdException" ref="db49720dc49f7d4e4cf9adbf2948e4095322df07e2a7792824d2468c4837f1cb" args="" -->kXMPErr_StdException</em>&nbsp;</td><td>
+Generic standard exception. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409ac7558097a1f5a0f99097199f1bf8ff4"></a><!-- doxytag: member="kXMPErr_UnknownException" ref="db49720dc49f7d4e4cf9adbf2948e409ac7558097a1f5a0f99097199f1bf8ff4" args="" -->kXMPErr_UnknownException</em>&nbsp;</td><td>
+Generic unknown exception. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e40969eb7fef422fbca62cdbc554afffd813"></a><!-- doxytag: member="kXMPErr_NoMemory" ref="db49720dc49f7d4e4cf9adbf2948e40969eb7fef422fbca62cdbc554afffd813" args="" -->kXMPErr_NoMemory</em>&nbsp;</td><td>
+Generic out-of-memory error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e4092bc66eec6ce830979089d5c336f75539"></a><!-- doxytag: member="kXMPErr_BadSchema" ref="db49720dc49f7d4e4cf9adbf2948e4092bc66eec6ce830979089d5c336f75539" args="" -->kXMPErr_BadSchema</em>&nbsp;</td><td>
+Bad schema parameter. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e4093f1efec0aa5452f43c55c05aba616ef7"></a><!-- doxytag: member="kXMPErr_BadXPath" ref="db49720dc49f7d4e4cf9adbf2948e4093f1efec0aa5452f43c55c05aba616ef7" args="" -->kXMPErr_BadXPath</em>&nbsp;</td><td>
+Bad XPath parameter. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e40940ca77d98bd366442bb8d438c420a444"></a><!-- doxytag: member="kXMPErr_BadOptions" ref="db49720dc49f7d4e4cf9adbf2948e40940ca77d98bd366442bb8d438c420a444" args="" -->kXMPErr_BadOptions</em>&nbsp;</td><td>
+Bad options parameter. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e40931adb57da79b4fb1f1f5f999ec740010"></a><!-- doxytag: member="kXMPErr_BadIndex" ref="db49720dc49f7d4e4cf9adbf2948e40931adb57da79b4fb1f1f5f999ec740010" args="" -->kXMPErr_BadIndex</em>&nbsp;</td><td>
+Bad index parameter. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e4092584fc813bfcd9158b7adf28a3454bb9"></a><!-- doxytag: member="kXMPErr_BadIterPosition" ref="db49720dc49f7d4e4cf9adbf2948e4092584fc813bfcd9158b7adf28a3454bb9" args="" -->kXMPErr_BadIterPosition</em>&nbsp;</td><td>
+Bad iteration position. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409052b1b525fba7da8c98be5c135f434b8"></a><!-- doxytag: member="kXMPErr_BadParse" ref="db49720dc49f7d4e4cf9adbf2948e409052b1b525fba7da8c98be5c135f434b8" args="" -->kXMPErr_BadParse</em>&nbsp;</td><td>
+XML parsing error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409c4f936ff6788ce17f6098b7cbda77ed9"></a><!-- doxytag: member="kXMPErr_BadSerialize" ref="db49720dc49f7d4e4cf9adbf2948e409c4f936ff6788ce17f6098b7cbda77ed9" args="" -->kXMPErr_BadSerialize</em>&nbsp;</td><td>
+Serialization error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409a0a05e07925d1f3daf5f36f6da0840f8"></a><!-- doxytag: member="kXMPErr_BadFileFormat" ref="db49720dc49f7d4e4cf9adbf2948e409a0a05e07925d1f3daf5f36f6da0840f8" args="" -->kXMPErr_BadFileFormat</em>&nbsp;</td><td>
+File format error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e40910fa053f279fed01b075f34a70f11795"></a><!-- doxytag: member="kXMPErr_NoFileHandler" ref="db49720dc49f7d4e4cf9adbf2948e40910fa053f279fed01b075f34a70f11795" args="" -->kXMPErr_NoFileHandler</em>&nbsp;</td><td>
+No file handler found for format. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409a9c1c20e53db12b20068d830a8990c0b"></a><!-- doxytag: member="kXMPErr_TooLargeForJPEG" ref="db49720dc49f7d4e4cf9adbf2948e409a9c1c20e53db12b20068d830a8990c0b" args="" -->kXMPErr_TooLargeForJPEG</em>&nbsp;</td><td>
+Data too large for JPEG file format. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409c57f1cf1c24778536fd32972e87334c5"></a><!-- doxytag: member="kXMPErr_BadXML" ref="db49720dc49f7d4e4cf9adbf2948e409c57f1cf1c24778536fd32972e87334c5" args="" -->kXMPErr_BadXML</em>&nbsp;</td><td>
+XML format error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e4095464b823e619618d9aa58433cdb45a8e"></a><!-- doxytag: member="kXMPErr_BadRDF" ref="db49720dc49f7d4e4cf9adbf2948e4095464b823e619618d9aa58433cdb45a8e" args="" -->kXMPErr_BadRDF</em>&nbsp;</td><td>
+RDF format error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409211bb632ed1264d9e2236f35c6414821"></a><!-- doxytag: member="kXMPErr_BadXMP" ref="db49720dc49f7d4e4cf9adbf2948e409211bb632ed1264d9e2236f35c6414821" args="" -->kXMPErr_BadXMP</em>&nbsp;</td><td>
+XMP format error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409078c69d0d76f25187a11981a2552b179"></a><!-- doxytag: member="kXMPErr_EmptyIterator" ref="db49720dc49f7d4e4cf9adbf2948e409078c69d0d76f25187a11981a2552b179" args="" -->kXMPErr_EmptyIterator</em>&nbsp;</td><td>
+Empty iterator. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409c4cf86fa29624c5e19111e09a97fe05f"></a><!-- doxytag: member="kXMPErr_BadUnicode" ref="db49720dc49f7d4e4cf9adbf2948e409c4cf86fa29624c5e19111e09a97fe05f" args="" -->kXMPErr_BadUnicode</em>&nbsp;</td><td>
+Unicode error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409ecd25299aa177de7bc7f3674fcf2e22d"></a><!-- doxytag: member="kXMPErr_BadTIFF" ref="db49720dc49f7d4e4cf9adbf2948e409ecd25299aa177de7bc7f3674fcf2e22d" args="" -->kXMPErr_BadTIFF</em>&nbsp;</td><td>
+TIFF format error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409d685e1f839e3bc53dfc55611a0803cee"></a><!-- doxytag: member="kXMPErr_BadJPEG" ref="db49720dc49f7d4e4cf9adbf2948e409d685e1f839e3bc53dfc55611a0803cee" args="" -->kXMPErr_BadJPEG</em>&nbsp;</td><td>
+JPEG format error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409d98fc9a9c050e9fc19c3af9c8abb2d6d"></a><!-- doxytag: member="kXMPErr_BadPSD" ref="db49720dc49f7d4e4cf9adbf2948e409d98fc9a9c050e9fc19c3af9c8abb2d6d" args="" -->kXMPErr_BadPSD</em>&nbsp;</td><td>
+PSD format error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e4091606a687cb790af16dc561b2a8f2e6a3"></a><!-- doxytag: member="kXMPErr_BadPSIR" ref="db49720dc49f7d4e4cf9adbf2948e4091606a687cb790af16dc561b2a8f2e6a3" args="" -->kXMPErr_BadPSIR</em>&nbsp;</td><td>
+PSIR format error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e40923b2d7cab10b3d80549e6b60855bb15e"></a><!-- doxytag: member="kXMPErr_BadIPTC" ref="db49720dc49f7d4e4cf9adbf2948e40923b2d7cab10b3d80549e6b60855bb15e" args="" -->kXMPErr_BadIPTC</em>&nbsp;</td><td>
+IPTC format error. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="db49720dc49f7d4e4cf9adbf2948e409d596daed4ac92f8bf7871669d03effad"></a><!-- doxytag: member="kXMPErr_BadMPEG" ref="db49720dc49f7d4e4cf9adbf2948e409d596daed4ac92f8bf7871669d03effad" args="" -->kXMPErr_BadMPEG</em>&nbsp;</td><td>
+MPEG format error. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="bc6126af1d45847bc59afa0aa3216b04"></a><!-- doxytag: member="XMP_Const.h::@3" ref="bc6126af1d45847bc59afa0aa3216b04" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Option bit flags for the <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> property setting functions. These option bits are shared with the accessor functions: <ul>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ab51f87b5c48f47f5cefb9e03293dafb" title="The XML string form of the property value is a URI, use rdf:resource attribute. DISCOURAGED...">kXMP_PropValueIsURI</a></code> </li>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a></code> </li>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b59b7706e0f0716ac7546bdc24ffedd0bc">kXMP_PropValueIsArray</a></code> </li>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5f1cdb3b0a3e852ec55e747a1686aba04" title="Implies kXMP_PropValueIsArray, item order matters. It is serialized using an rdf:Seq...">kXMP_PropArrayIsOrdered</a></code> </li>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b52596b1f0ea4600270c99102c86b5f1f1" title="Implies kXMP_PropArrayIsOrdered, items are alternates. It is serialized using an...">kXMP_PropArrayIsAlternate</a></code> </li>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ba253f67a6cf44b7438a3f96b516846d">kXMP_PropArrayIsAltText</a></code> </li>
+</ul>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="bc6126af1d45847bc59afa0aa3216b04873411f673fc2a6337083fd024df727f"></a><!-- doxytag: member="kXMP_InsertBeforeItem" ref="bc6126af1d45847bc59afa0aa3216b04873411f673fc2a6337083fd024df727f" args="" -->kXMP_InsertBeforeItem</em>&nbsp;</td><td>
+Option for array item location: Insert a new item before the given index. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="bc6126af1d45847bc59afa0aa3216b0498cedd5fa29d47abb2ac8903ac7f5a05"></a><!-- doxytag: member="kXMP_InsertAfterItem" ref="bc6126af1d45847bc59afa0aa3216b0498cedd5fa29d47abb2ac8903ac7f5a05" args="" -->kXMP_InsertAfterItem</em>&nbsp;</td><td>
+Option for array item location: Insert a new item after the given index. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="bc6126af1d45847bc59afa0aa3216b04ddd07b4a38b25ab3841e28a9cb169d1c"></a><!-- doxytag: member="kXMP_DeleteExisting" ref="bc6126af1d45847bc59afa0aa3216b04ddd07b4a38b25ab3841e28a9cb169d1c" args="" -->kXMP_DeleteExisting</em>&nbsp;</td><td>
+Delete any pre-existing property. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="bc6126af1d45847bc59afa0aa3216b04d1b42a8a4c479d9bfaf406b79f2e1465"></a><!-- doxytag: member="kXMP_PropValueOptionsMask" ref="bc6126af1d45847bc59afa0aa3216b04d1b42a8a4c479d9bfaf406b79f2e1465" args="" -->kXMP_PropValueOptionsMask</em>&nbsp;</td><td>
+Bit-flag mask for property-value option bits. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="bc6126af1d45847bc59afa0aa3216b04ef8c1934a17b0e5d8f0b20a7e89df0df"></a><!-- doxytag: member="kXMP_PropArrayLocationMask" ref="bc6126af1d45847bc59afa0aa3216b04ef8c1934a17b0e5d8f0b20a7e89df0df" args="" -->kXMP_PropArrayLocationMask</em>&nbsp;</td><td>
+Bit-flag mask for array-item location bits. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="dc29c2ff13d900c2f185ee95427fb06c"></a><!-- doxytag: member="XMP_Const.h::@4" ref="dc29c2ff13d900c2f185ee95427fb06c" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Option bit flags for <code><a class="el" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26" title="ParseFromBuffer() parses RDF from a series of input buffers into this XMP object...">TXMPMeta::ParseFromBuffer()</a></code>.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="dc29c2ff13d900c2f185ee95427fb06c1e533852436acf75f594a4fb50a64400"></a><!-- doxytag: member="kXMP_RequireXMPMeta" ref="dc29c2ff13d900c2f185ee95427fb06c1e533852436acf75f594a4fb50a64400" args="" -->kXMP_RequireXMPMeta</em>&nbsp;</td><td>
+Require a surrounding <code>x:xmpmeta</code> element. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="dc29c2ff13d900c2f185ee95427fb06c79b36427b7bf0c0a1ed010a44dec2d3e"></a><!-- doxytag: member="kXMP_ParseMoreBuffers" ref="dc29c2ff13d900c2f185ee95427fb06c79b36427b7bf0c0a1ed010a44dec2d3e" args="" -->kXMP_ParseMoreBuffers</em>&nbsp;</td><td>
+This is the not last input buffer for this parse stream. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="dc29c2ff13d900c2f185ee95427fb06c7107906eab0e1fa6f9f2dc6254ad88b1"></a><!-- doxytag: member="kXMP_StrictAliasing" ref="dc29c2ff13d900c2f185ee95427fb06c7107906eab0e1fa6f9f2dc6254ad88b1" args="" -->kXMP_StrictAliasing</em>&nbsp;</td><td>
+Do not reconcile alias differences, throw an exception. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="61dadd085c1777f559549e05962b2c9e"></a><!-- doxytag: member="XMP_Const.h::@5" ref="61dadd085c1777f559549e05962b2c9e" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Option bit flags for <code><a class="el" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49" title="SerializeToBuffer() serializes metadata in this XMP object into a string as RDF.">TXMPMeta::SerializeToBuffer()</a></code>.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="61dadd085c1777f559549e05962b2c9edbb9e4c7ee139da0dd4126ddea794c76"></a><!-- doxytag: member="kXMP_OmitPacketWrapper" ref="61dadd085c1777f559549e05962b2c9edbb9e4c7ee139da0dd4126ddea794c76" args="" -->kXMP_OmitPacketWrapper</em>&nbsp;</td><td>
+Omit the XML packet wrapper. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="61dadd085c1777f559549e05962b2c9e238c792322c5bd5f9e4db3165e01f9d6"></a><!-- doxytag: member="kXMP_ReadOnlyPacket" ref="61dadd085c1777f559549e05962b2c9e238c792322c5bd5f9e4db3165e01f9d6" args="" -->kXMP_ReadOnlyPacket</em>&nbsp;</td><td>
+Default is a writeable packet. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="61dadd085c1777f559549e05962b2c9e041dc6b7b8684be7112ae40f5f259ebb"></a><!-- doxytag: member="kXMP_UseCompactFormat" ref="61dadd085c1777f559549e05962b2c9e041dc6b7b8684be7112ae40f5f259ebb" args="" -->kXMP_UseCompactFormat</em>&nbsp;</td><td>
+Use a compact form of RDF. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="61dadd085c1777f559549e05962b2c9e0b659b3b544c7a5a076fbd3132cd7f7a"></a><!-- doxytag: member="kXMP_IncludeThumbnailPad" ref="61dadd085c1777f559549e05962b2c9e0b659b3b544c7a5a076fbd3132cd7f7a" args="" -->kXMP_IncludeThumbnailPad</em>&nbsp;</td><td>
+Include a padding allowance for a thumbnail image. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="61dadd085c1777f559549e05962b2c9edb35599da481cc22ea6342b7b4de6bc6"></a><!-- doxytag: member="kXMP_ExactPacketLength" ref="61dadd085c1777f559549e05962b2c9edb35599da481cc22ea6342b7b4de6bc6" args="" -->kXMP_ExactPacketLength</em>&nbsp;</td><td>
+The padding parameter is the overall packet length. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="61dadd085c1777f559549e05962b2c9e9ee6f7e9597b93ed12b8ae654ade2654"></a><!-- doxytag: member="kXMP_WriteAliasComments" ref="61dadd085c1777f559549e05962b2c9e9ee6f7e9597b93ed12b8ae654ade2654" args="" -->kXMP_WriteAliasComments</em>&nbsp;</td><td>
+Show aliases as XML comments. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="61dadd085c1777f559549e05962b2c9e79230f1d70d2625f7650db6ff5b1ea29"></a><!-- doxytag: member="kXMP_OmitAllFormatting" ref="61dadd085c1777f559549e05962b2c9e79230f1d70d2625f7650db6ff5b1ea29" args="" -->kXMP_OmitAllFormatting</em>&nbsp;</td><td>
+Omit all formatting whitespace. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="61dadd085c1777f559549e05962b2c9e9fb498d749d939e2ba9adf555a75b856"></a><!-- doxytag: member="kXMP_OmitXMPMetaElement" ref="61dadd085c1777f559549e05962b2c9e9fb498d749d939e2ba9adf555a75b856" args="" -->kXMP_OmitXMPMetaElement</em>&nbsp;</td><td>
+Omit the x:xmpmeta element surrounding the rdf:RDF element. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="61dadd085c1777f559549e05962b2c9eeb79571cac99ee97feefb0347b1c1845"></a><!-- doxytag: member="kXMP_EncodingMask" ref="61dadd085c1777f559549e05962b2c9eeb79571cac99ee97feefb0347b1c1845" args="" -->kXMP_EncodingMask</em>&nbsp;</td><td>
+Bit-flag mask for encoding-type bits. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="61dadd085c1777f559549e05962b2c9edc8f241694f5a758e5ee3f6db69d02ab"></a><!-- doxytag: member="kXMP_EncodeUTF8" ref="61dadd085c1777f559549e05962b2c9edc8f241694f5a758e5ee3f6db69d02ab" args="" -->kXMP_EncodeUTF8</em>&nbsp;</td><td>
+Use UTF8 encoding. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="61dadd085c1777f559549e05962b2c9e310e4cbf639e783163778566b439f01d"></a><!-- doxytag: member="kXMP_EncodeUTF16Big" ref="61dadd085c1777f559549e05962b2c9e310e4cbf639e783163778566b439f01d" args="" -->kXMP_EncodeUTF16Big</em>&nbsp;</td><td>
+Use UTF16 big-endian encoding. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="61dadd085c1777f559549e05962b2c9efc6417e382c98a2d507830de62fd4830"></a><!-- doxytag: member="kXMP_EncodeUTF16Little" ref="61dadd085c1777f559549e05962b2c9efc6417e382c98a2d507830de62fd4830" args="" -->kXMP_EncodeUTF16Little</em>&nbsp;</td><td>
+Use UTF16 little-endian encoding. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="61dadd085c1777f559549e05962b2c9e793e99d9ea83f0aadd5b4193a95ea713"></a><!-- doxytag: member="kXMP_EncodeUTF32Big" ref="61dadd085c1777f559549e05962b2c9e793e99d9ea83f0aadd5b4193a95ea713" args="" -->kXMP_EncodeUTF32Big</em>&nbsp;</td><td>
+Use UTF32 big-endian encoding. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="61dadd085c1777f559549e05962b2c9ee0137d98ea990fa23d292489031ba09e"></a><!-- doxytag: member="kXMP_EncodeUTF32Little" ref="61dadd085c1777f559549e05962b2c9ee0137d98ea990fa23d292489031ba09e" args="" -->kXMP_EncodeUTF32Little</em>&nbsp;</td><td>
+Use UTF13 little-endian encoding. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="726ca809ffd3d67ab4b8476646f26635"></a><!-- doxytag: member="XMP_Const.h::@6" ref="726ca809ffd3d67ab4b8476646f26635" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Option bit flags for <code><a class="el" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a></code> construction.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="726ca809ffd3d67ab4b8476646f2663593f77b837d89759af3a721712c13f044"></a><!-- doxytag: member="kXMP_IterClassMask" ref="726ca809ffd3d67ab4b8476646f2663593f77b837d89759af3a721712c13f044" args="" -->kXMP_IterClassMask</em>&nbsp;</td><td>
+The low 8 bits are an enum of what data structure to iterate. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="726ca809ffd3d67ab4b8476646f26635a0643c076a3b3737ff88ed20f16afd2b"></a><!-- doxytag: member="kXMP_IterProperties" ref="726ca809ffd3d67ab4b8476646f26635a0643c076a3b3737ff88ed20f16afd2b" args="" -->kXMP_IterProperties</em>&nbsp;</td><td>
+Iterate the property tree of a <a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a> object. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="726ca809ffd3d67ab4b8476646f266353333450505cd3712320aeac895e541b9"></a><!-- doxytag: member="kXMP_IterAliases" ref="726ca809ffd3d67ab4b8476646f266353333450505cd3712320aeac895e541b9" args="" -->kXMP_IterAliases</em>&nbsp;</td><td>
+Iterate the global alias table. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="726ca809ffd3d67ab4b8476646f26635a325d9ffba68a934f0a0a0f6ecfc2f7b"></a><!-- doxytag: member="kXMP_IterNamespaces" ref="726ca809ffd3d67ab4b8476646f26635a325d9ffba68a934f0a0a0f6ecfc2f7b" args="" -->kXMP_IterNamespaces</em>&nbsp;</td><td>
+Iterate the global namespace table. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="726ca809ffd3d67ab4b8476646f26635b26e1a38d1d0343fcc5bdaab1b60e3ed"></a><!-- doxytag: member="kXMP_IterJustChildren" ref="726ca809ffd3d67ab4b8476646f26635b26e1a38d1d0343fcc5bdaab1b60e3ed" args="" -->kXMP_IterJustChildren</em>&nbsp;</td><td>
+Just do the immediate children of the root, default is subtree. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="726ca809ffd3d67ab4b8476646f266354589f99b5b4a55e785e3baf4fe1d9b19"></a><!-- doxytag: member="kXMP_IterJustLeafNodes" ref="726ca809ffd3d67ab4b8476646f266354589f99b5b4a55e785e3baf4fe1d9b19" args="" -->kXMP_IterJustLeafNodes</em>&nbsp;</td><td>
+Just do the leaf nodes, default is all nodes in the subtree. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="726ca809ffd3d67ab4b8476646f26635cf22e638f4144bcec8207b2ab69bb344"></a><!-- doxytag: member="kXMP_IterJustLeafName" ref="726ca809ffd3d67ab4b8476646f26635cf22e638f4144bcec8207b2ab69bb344" args="" -->kXMP_IterJustLeafName</em>&nbsp;</td><td>
+Return just the leaf part of the path, default is the full path. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="726ca809ffd3d67ab4b8476646f26635c06dbc804df2e5ac24d77ca50a21fa08"></a><!-- doxytag: member="kXMP_IterIncludeAliases" ref="726ca809ffd3d67ab4b8476646f26635c06dbc804df2e5ac24d77ca50a21fa08" args="" -->kXMP_IterIncludeAliases</em>&nbsp;</td><td>
+Include aliases, default is just actual properties. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="726ca809ffd3d67ab4b8476646f266351b91947105ae68c48c5d5e36aa70d101"></a><!-- doxytag: member="kXMP_IterOmitQualifiers" ref="726ca809ffd3d67ab4b8476646f266351b91947105ae68c48c5d5e36aa70d101" args="" -->kXMP_IterOmitQualifiers</em>&nbsp;</td><td>
+Omit all qualifiers. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="0411cd49bb5b71852cecd93bcbf0ca2d"></a><!-- doxytag: member="XMP_Const.h::@7" ref="0411cd49bb5b71852cecd93bcbf0ca2d" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Option bit flags for <code><a class="el" href="classTXMPIterator.html#30b4d78974b347e4fcd275f1f65a61b2" title="Skip() skips some portion of the remaining iterations.">TXMPIterator::Skip()</a></code>.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="0411cd49bb5b71852cecd93bcbf0ca2db0b540cd3841f411471a827f833c606e"></a><!-- doxytag: member="kXMP_IterSkipSubtree" ref="0411cd49bb5b71852cecd93bcbf0ca2db0b540cd3841f411471a827f833c606e" args="" -->kXMP_IterSkipSubtree</em>&nbsp;</td><td>
+Skip the subtree below the current node. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="0411cd49bb5b71852cecd93bcbf0ca2d2537b4b8db838f85b47988b198cd2a12"></a><!-- doxytag: member="kXMP_IterSkipSiblings" ref="0411cd49bb5b71852cecd93bcbf0ca2d2537b4b8db838f85b47988b198cd2a12" args="" -->kXMP_IterSkipSiblings</em>&nbsp;</td><td>
+Skip the subtree below and remaining siblings of the current node. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="bed82baf7f470b522273a3e37c24c600"></a><!-- doxytag: member="XMP_Const.h::@8" ref="bed82baf7f470b522273a3e37c24c600" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Option bit flags for <code><a class="el" href="classTXMPUtils.html#d7e1aa7928252fb88a24fb5c3aef22ba" title="CatenateArrayItems() creates a single edit string from a set of array item values...">TXMPUtils::CatenateArrayItems()</a></code> and <code><a class="el" href="classTXMPUtils.html#66c5ddee47aa36ed906353f94ca18d2e" title="SeparateArrayItems() updates an array from a concatenated edit string of values.">TXMPUtils::SeparateArrayItems()</a></code>. These option bits are shared with the accessor functions: <ul>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b59b7706e0f0716ac7546bdc24ffedd0bc">kXMP_PropValueIsArray</a></code>, </li>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5f1cdb3b0a3e852ec55e747a1686aba04" title="Implies kXMP_PropValueIsArray, item order matters. It is serialized using an rdf:Seq...">kXMP_PropArrayIsOrdered</a></code>, </li>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b52596b1f0ea4600270c99102c86b5f1f1" title="Implies kXMP_PropArrayIsOrdered, items are alternates. It is serialized using an...">kXMP_PropArrayIsAlternate</a></code>, </li>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ba253f67a6cf44b7438a3f96b516846d">kXMP_PropArrayIsAltText</a></code> </li>
+</ul>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="bed82baf7f470b522273a3e37c24c600d6d41710c689f16d19ac26dc9f5cc506"></a><!-- doxytag: member="kXMPUtil_AllowCommas" ref="bed82baf7f470b522273a3e37c24c600d6d41710c689f16d19ac26dc9f5cc506" args="" -->kXMPUtil_AllowCommas</em>&nbsp;</td><td>
+Allow commas in item values, default is separator. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="b04a0655cd1e3bcac5e8f48c18df1a57"></a><!-- doxytag: member="XMP_Const.h::@9" ref="b04a0655cd1e3bcac5e8f48c18df1a57" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">anonymous enum </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Option bit flags for <code><a class="el" href="classTXMPUtils.html#40c645803530662e08d042b4b7c6190d" title="RemoveProperties() removes multiple properties from an XMP object.">TXMPUtils::RemoveProperties()</a></code> and <code><a class="el" href="classTXMPUtils.html#4795244ffcbda927800f789b0e40c262" title="AppendProperties() adds or moves properties from one XMP object to another.">TXMPUtils::AppendProperties()</a></code>.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="b04a0655cd1e3bcac5e8f48c18df1a578ddfb0572b7602a52e533d92d8b1e9fb"></a><!-- doxytag: member="kXMPUtil_DoAllProperties" ref="b04a0655cd1e3bcac5e8f48c18df1a578ddfb0572b7602a52e533d92d8b1e9fb" args="" -->kXMPUtil_DoAllProperties</em>&nbsp;</td><td>
+Do all properties, default is just external properties. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="b04a0655cd1e3bcac5e8f48c18df1a57dab4dad658d2d218c5b1e7d829b12962"></a><!-- doxytag: member="kXMPUtil_ReplaceOldValues" ref="b04a0655cd1e3bcac5e8f48c18df1a57dab4dad658d2d218c5b1e7d829b12962" args="" -->kXMPUtil_ReplaceOldValues</em>&nbsp;</td><td>
+Replace existing values, default is to leave them. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="b04a0655cd1e3bcac5e8f48c18df1a5797753b4c5afda9c55e807e41377d86d9"></a><!-- doxytag: member="kXMPUtil_DeleteEmptyValues" ref="b04a0655cd1e3bcac5e8f48c18df1a5797753b4c5afda9c55e807e41377d86d9" args="" -->kXMPUtil_DeleteEmptyValues</em>&nbsp;</td><td>
+Delete properties if the new value is empty. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="b04a0655cd1e3bcac5e8f48c18df1a57843589b878f53d42d59258f945ad770b"></a><!-- doxytag: member="kXMPUtil_IncludeAliases" ref="b04a0655cd1e3bcac5e8f48c18df1a57843589b878f53d42d59258f945ad770b" args="" -->kXMPUtil_IncludeAliases</em>&nbsp;</td><td>
+Include aliases, default is just actual properties. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/XMP__Const_8h__incl.png b/docs/API/XMP__Const_8h__incl.png
new file mode 100644
index 0000000..eb45aad
--- /dev/null
+++ b/docs/API/XMP__Const_8h__incl.png
Binary files differ
diff --git a/docs/API/annotated.html b/docs/API/annotated.html
new file mode 100644
index 0000000..7d6540d
--- /dev/null
+++ b/docs/API/annotated.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Class List</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li class="current"><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>Class List</h1>Here are the classes, structs, unions and interfaces with brief descriptions:<table>
+ <tr><td class="indexkey"><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td class="indexvalue">API for access to the main (document-level) metadata in a file </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td class="indexvalue">API for access to the XMP Toolkit iteration services </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td class="indexvalue">API for access to the XMP Toolkit core services </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a></td><td class="indexvalue">API for access to the XMP Toolkit utility services </td></tr>
+ <tr><td class="indexkey"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></td><td class="indexvalue">The expanded type for a date and time </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classXMP__Error.html">XMP_Error</a></td><td class="indexvalue">XMP Toolkit error, associates an error code with a descriptive error string </td></tr>
+ <tr><td class="indexkey"><a class="el" href="structXMP__PacketInfo.html">XMP_PacketInfo</a></td><td class="indexvalue">XMP packet description </td></tr>
+ <tr><td class="indexkey"><a class="el" href="structXMP__ThumbnailInfo.html">XMP_ThumbnailInfo</a></td><td class="indexvalue">Thumbnail descriptor </td></tr>
+ <tr><td class="indexkey"><a class="el" href="structXMP__VersionInfo.html">XMP_VersionInfo</a></td><td class="indexvalue">XMP Toolkit version information </td></tr>
+</table>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/classTXMPFiles-members.html b/docs/API/classTXMPFiles-members.html
new file mode 100644
index 0000000..8985a53
--- /dev/null
+++ b/docs/API/classTXMPFiles-members.html
@@ -0,0 +1,99 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Member List</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>TXMPFiles&lt; tStringObj &gt; Member List</h1>This is the complete list of members for <a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6">CanPutXMP</a>(const SXMPMeta &amp;xmpObj)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#1d3f32c2b95659ada198775e2f67c808">CanPutXMP</a>(const tStringObj &amp;xmpPacket)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#2303dfcc00f108bda202600e3da9c109">CanPutXMP</a>(XMP_StringPtr xmpPacket, XMP_StringLen xmpLength=kXMP_UseNullTermination)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#07b7c4b44fb0e0a7d115ddd5ba22f926">CheckFileFormat</a>(XMP_StringPtr filePath)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#7f505664c41d7304fb757d6009b0751c">CheckPackageFormat</a>(XMP_StringPtr folderPath)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927">CloseFile</a>(XMP_OptionBits closeFlags=0)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#f9931d081cb19f98c81e41786030765b">GetFileInfo</a>(tStringObj *filePath=0, XMP_OptionBits *openFlags=0, XMP_FileFormat *format=0, XMP_OptionBits *handlerFlags=0)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#cb9e16a1477ec67fa6da6d736a9bc131">GetFormatInfo</a>(XMP_FileFormat format, XMP_OptionBits *handlerFlags=0)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#311fc36fdf7270fe05b1c531cdbbd009">GetInternalRef</a>()</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#4ea1eda39f803322e10b2a554ef8ab06">GetThumbnail</a>(XMP_ThumbnailInfo *tnailInfo)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#6e521c034728b59ab55213a9d8203d1e">GetVersionInfo</a>(XMP_VersionInfo *versionInfo)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3">GetXMP</a>(SXMPMeta *xmpObj=0, tStringObj *xmpPacket=0, XMP_PacketInfo *packetInfo=0)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#0874bbbf41c9490abfb613bfe297327d">Initialize</a>()</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#794e1830a84a6328eaa1995ba5aa6874">Initialize</a>(XMP_OptionBits options)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb">OpenFile</a>(XMP_StringPtr filePath, XMP_FileFormat format=kXMP_UnknownFile, XMP_OptionBits openFlags=0)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#cfef1688f3a62e2f465bb3a27da7b4ac">OpenFile</a>(const tStringObj &amp;filePath, XMP_FileFormat format=kXMP_UnknownFile, XMP_OptionBits openFlags=0)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#3f1483fcc92860460d3772216dfaef81">operator=</a>(const TXMPFiles&lt; tStringObj &gt; &amp;rhs)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a">PutXMP</a>(const SXMPMeta &amp;xmpObj)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#da77eab74c3440659db3122f6ec8b7f4">PutXMP</a>(const tStringObj &amp;xmpPacket)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#502ed01119e0421413e773f4f42683ec">PutXMP</a>(XMP_StringPtr xmpPacket, XMP_StringLen xmpLength=kXMP_UseNullTermination)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#7b86c130fdbd54b5ac158ec3fee93777">SetAbortProc</a>(XMP_AbortProc abortProc, void *abortArg)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#1e8de80c252b60b332dc4bc524139fd8">Terminate</a>()</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#14f01e38454178578fd25fff6024fd54">TXMPFiles</a>()</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#36abe01988d4ca3939138e871c7b75e7">TXMPFiles</a>(XMP_StringPtr filePath, XMP_FileFormat format=kXMP_UnknownFile, XMP_OptionBits openFlags=0)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#f540b3ea689a6d7381dca4f52132a4ac">TXMPFiles</a>(const tStringObj &amp;filePath, XMP_FileFormat format=kXMP_UnknownFile, XMP_OptionBits openFlags=0)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#cf343fb6771b482ca72d467233a6f920">TXMPFiles</a>(const TXMPFiles&lt; tStringObj &gt; &amp;original)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#d986c7b2e2d82eaef6cf6a33e9d09b65">TXMPFiles</a>(XMPFilesRef xmpFilesObj)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#5eaa92724cc82d933a32eff9c4636739">~TXMPFiles</a>()</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td><code> [virtual]</code></td></tr>
+</table></div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/classTXMPFiles.html b/docs/API/classTXMPFiles.html
new file mode 100644
index 0000000..22b1063
--- /dev/null
+++ b/docs/API/classTXMPFiles.html
@@ -0,0 +1,1191 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: TXMPFiles&lt; tStringObj &gt; Class Template Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>TXMPFiles&lt; tStringObj &gt; Class Template Reference</h1><!-- doxytag: class="TXMPFiles" -->API for access to the main (document-level) metadata in a file.
+<a href="#_details">More...</a>
+<p>
+<code>#include &lt;<a class="el" href="TXMPFiles_8hpp-source.html">TXMPFiles.hpp</a>&gt;</code>
+<p>
+
+<p>
+<a href="classTXMPFiles-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>File operations</h2></td></tr>
+<tr><td colspan="2">These functions allow you to open, close, and query files. <br><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static <a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#07b7c4b44fb0e0a7d115ddd5ba22f926">CheckFileFormat</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> filePath)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPFiles.html#07b7c4b44fb0e0a7d115ddd5ba22f926" title="CheckFileFormat() tries to determine the format of a file.">CheckFileFormat()</a></code> tries to determine the format of a file. <a href="#07b7c4b44fb0e0a7d115ddd5ba22f926"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static <a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#7f505664c41d7304fb757d6009b0751c">CheckPackageFormat</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> folderPath)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPFiles.html#7f505664c41d7304fb757d6009b0751c" title="CheckPackageFormat() tries to determine the format of a &quot;package&quot; folder...">CheckPackageFormat()</a></code> tries to determine the format of a "package" folder. <a href="#7f505664c41d7304fb757d6009b0751c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb">OpenFile</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> filePath, <a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a> format=kXMP_UnknownFile, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> openFlags=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile()</a></code> opens a file for metadata access. <a href="#fcd21cfe5d6f13c648c5541e161919cb"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#cfef1688f3a62e2f465bb3a27da7b4ac">OpenFile</a> (const tStringObj &amp;filePath, <a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a> format=kXMP_UnknownFile, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> openFlags=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile()</a></code> opens a file for metadata access, using a string object <a href="#cfef1688f3a62e2f465bb3a27da7b4ac"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927">CloseFile</a> (<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> closeFlags=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile()</a> explicitly closes an opened file. <a href="#eca89170c7aa3e2d56e30bff04dd7927"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#f9931d081cb19f98c81e41786030765b">GetFileInfo</a> (tStringObj *filePath=0, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *openFlags=0, <a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a> *format=0, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *handlerFlags=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPFiles.html#f9931d081cb19f98c81e41786030765b" title="GetFileInfo() retrieves basic information about an opened file.">GetFileInfo()</a></code> retrieves basic information about an opened file. <a href="#f9931d081cb19f98c81e41786030765b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#7b86c130fdbd54b5ac158ec3fee93777">SetAbortProc</a> (<a class="el" href="XMP__Const_8h.html#a2738ce2fca7f1809b12834b1b5e2d0e">XMP_AbortProc</a> abortProc, void *abortArg)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPFiles.html#7b86c130fdbd54b5ac158ec3fee93777" title="SetAbortProc() registers a callback function used to check for a user-signaled abort...">SetAbortProc()</a></code> registers a callback function used to check for a user-signaled abort. <a href="#7b86c130fdbd54b5ac158ec3fee93777"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Constructors and destructor</div></td></tr>
+<tr><td colspan="2"><div class="groupText">The default constructor initializes an object that is associated with no file. The alternate constructors call <code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile()</a></code>. <br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14f01e38454178578fd25fff6024fd54"></a><!-- doxytag: member="TXMPFiles::TXMPFiles" ref="14f01e38454178578fd25fff6024fd54" args="()" -->
+&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#14f01e38454178578fd25fff6024fd54">TXMPFiles</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Default constructor initializes an object that is associated with no file. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#5eaa92724cc82d933a32eff9c4636739">~TXMPFiles</a> () throw ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Destructor; typical virtual destructor. <a href="#5eaa92724cc82d933a32eff9c4636739"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#36abe01988d4ca3939138e871c7b75e7">TXMPFiles</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> filePath, <a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a> format=kXMP_UnknownFile, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> openFlags=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Alternate constructor associates the new <code>XMPFiles</code> object with a specific file. <a href="#36abe01988d4ca3939138e871c7b75e7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#f540b3ea689a6d7381dca4f52132a4ac">TXMPFiles</a> (const tStringObj &amp;filePath, <a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a> format=kXMP_UnknownFile, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> openFlags=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Alternate constructor associates the new <code>XMPFiles</code> object with a specific file, using a string object. <a href="#f540b3ea689a6d7381dca4f52132a4ac"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#cf343fb6771b482ca72d467233a6f920">TXMPFiles</a> (const <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt; &amp;original)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Copy constructor. <a href="#cf343fb6771b482ca72d467233a6f920"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#3f1483fcc92860460d3772216dfaef81">operator=</a> (const <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt; &amp;rhs)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Assignment operator. <a href="#3f1483fcc92860460d3772216dfaef81"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#d986c7b2e2d82eaef6cf6a33e9d09b65">TXMPFiles</a> (<a class="el" href="XMP__Const_8h.html#a4bca98ad67d7a62c60cb13dbbab0f25">XMPFilesRef</a> xmpFilesObj)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Reconstructs a <code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code> object from an internal reference. <a href="#d986c7b2e2d82eaef6cf6a33e9d09b65"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="XMP__Const_8h.html#a4bca98ad67d7a62c60cb13dbbab0f25">XMPFilesRef</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#311fc36fdf7270fe05b1c531cdbbd009">GetInternalRef</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><a class="el" href="classTXMPFiles.html#311fc36fdf7270fe05b1c531cdbbd009" title="GetInternalRef() retrieves an internal reference that can be safely passed across...">GetInternalRef()</a> retrieves an internal reference that can be safely passed across DLL boundaries and reconstructed. <a href="#311fc36fdf7270fe05b1c531cdbbd009"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Accessing metadata</div></td></tr>
+<tr><td colspan="2"><div class="groupText">These functions allow you to retrieve XMP metadata from open files, so that you can use the <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> API to manipulate it. The <code><a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a" title="PutXMP() updates the XMP metadata in this object without writing out the file.">PutXMP()</a></code> functions update the XMP packet in memory. Changed XMP is not actually written out to the file until the file is closed. <br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3">GetXMP</a> (SXMPMeta *xmpObj=0, tStringObj *xmpPacket=0, <a class="el" href="structXMP__PacketInfo.html">XMP_PacketInfo</a> *packetInfo=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3" title="GetXMP() retrieves the XMP metadata from an open file.">GetXMP()</a></code> retrieves the XMP metadata from an open file. <a href="#42ca0bbc5ac66a8de1710e03a7ff17b3"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#4ea1eda39f803322e10b2a554ef8ab06">GetThumbnail</a> (<a class="el" href="structXMP__ThumbnailInfo.html">XMP_ThumbnailInfo</a> *tnailInfo)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPFiles.html#4ea1eda39f803322e10b2a554ef8ab06" title="GetThumbnail() retrieves the native thumbnail from an open file.">GetThumbnail()</a></code> retrieves the native thumbnail from an open file. <a href="#4ea1eda39f803322e10b2a554ef8ab06"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a">PutXMP</a> (const SXMPMeta &amp;xmpObj)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a" title="PutXMP() updates the XMP metadata in this object without writing out the file.">PutXMP()</a></code> updates the XMP metadata in this object without writing out the file. <a href="#d3f7babdc07c7de0d0cd9a3362b4710a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#da77eab74c3440659db3122f6ec8b7f4">PutXMP</a> (const tStringObj &amp;xmpPacket)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a" title="PutXMP() updates the XMP metadata in this object without writing out the file.">PutXMP()</a></code> updates the XMP metadata in this object without writing out the file, using a string object for input. <a href="#da77eab74c3440659db3122f6ec8b7f4"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#502ed01119e0421413e773f4f42683ec">PutXMP</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> xmpPacket, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> xmpLength=kXMP_UseNullTermination)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a" title="PutXMP() updates the XMP metadata in this object without writing out the file.">PutXMP()</a></code> updates the XMP metadata in this object without writing out the file, using a string object and optional length. <a href="#502ed01119e0421413e773f4f42683ec"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6">CanPutXMP</a> (const SXMPMeta &amp;xmpObj)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6" title="CanPutXMP() reports whether this file can be updated with a specific XMP packet.">CanPutXMP()</a></code> reports whether this file can be updated with a specific XMP packet. <a href="#29a11a1539d6300da3fb4c7e9ea02bb6"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#1d3f32c2b95659ada198775e2f67c808">CanPutXMP</a> (const tStringObj &amp;xmpPacket)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6" title="CanPutXMP() reports whether this file can be updated with a specific XMP packet.">CanPutXMP()</a></code> reports whether this file can be updated with a specific XMP packet, passed in a string object. <a href="#1d3f32c2b95659ada198775e2f67c808"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#2303dfcc00f108bda202600e3da9c109">CanPutXMP</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> xmpPacket, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> xmpLength=kXMP_UseNullTermination)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6" title="CanPutXMP() reports whether this file can be updated with a specific XMP packet.">CanPutXMP()</a></code> reports whether this file can be updated with a specific XMP packet, passed in a string object. <a href="#2303dfcc00f108bda202600e3da9c109"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Initialization and termination</div></td></tr>
+<tr><td colspan="2"><div class="groupText">A <code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code> object must be initialized before use and can be terminated when done. <br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#6e521c034728b59ab55213a9d8203d1e">GetVersionInfo</a> (<a class="el" href="structXMP__VersionInfo.html">XMP_VersionInfo</a> *versionInfo)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPFiles.html#6e521c034728b59ab55213a9d8203d1e" title="GetVersionInfo() retrieves version information for the XMPFiles component.">GetVersionInfo()</a></code> retrieves version information for the XMPFiles component. <a href="#6e521c034728b59ab55213a9d8203d1e"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#0874bbbf41c9490abfb613bfe297327d">Initialize</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Initializes the XMPFiles library; must be called before creating an <code>SXMPFiles</code> object. <a href="#0874bbbf41c9490abfb613bfe297327d"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#794e1830a84a6328eaa1995ba5aa6874">Initialize</a> (<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Initializes the XMPFiles library; must be called before creating an <code>SXMPFiles</code> object. <a href="#794e1830a84a6328eaa1995ba5aa6874"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#1e8de80c252b60b332dc4bc524139fd8">Terminate</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Terminates use of the XMPFiles library. <a href="#1e8de80c252b60b332dc4bc524139fd8"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">File handler information</div></td></tr>
+<tr><td colspan="2"><div class="groupText">Call this static function from the concrete class, <code>SXMPFiles</code>, to obtain information about the file handlers for the XMPFiles component. <br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">*static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#cb9e16a1477ec67fa6da6d736a9bc131">GetFormatInfo</a> (<a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a> format, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *handlerFlags=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><a class="el" href="classTXMPFiles.html#cb9e16a1477ec67fa6da6d736a9bc131" title="GetFormatInfo() reports what features are supported for a specific file format.">GetFormatInfo()</a> reports what features are supported for a specific file format. <a href="#cb9e16a1477ec67fa6da6d736a9bc131"></a><br></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template&lt;class tStringObj&gt;<br>
+ class TXMPFiles&lt; tStringObj &gt;</h3>
+
+API for access to the main (document-level) metadata in a file.
+<p>
+<code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code> is a template class that provides the API for the Adobe XMP Toolkit's XMPFiles component. This provides convenient access to the main, or document level, XMP for a file. Use it to obtain metadata from a file, which you can then manipulate with the XMP Core component (the classes <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code>, <code><a class="el" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a></code>, and <code><a class="el" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a></code>); and to write new or changed metadata back out to a file.<p>
+The functions allow you to open a file, read and write the metadata, then close the file. While open, portions of the file might be maintained in RAM data structures. Memory usage can vary considerably depending onfile format and access options.<p>
+A file can be opened for read-only or read-write access, with typical exclusion for both modes. Errors result in the throw of an <code>XMPError</code> exception.<p>
+<code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code> is the template class. It must be instantiated with a string class such as <code>std::string</code>. Read the Toolkit Overview for information about the overall architecture of the XMP API, and the documentation for <code>XMP.hpp</code> for specific instantiation instructions.<p>
+Access these functions through the concrete class, <code>SXMPFiles</code>. <hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="5eaa92724cc82d933a32eff9c4636739"></a><!-- doxytag: member="TXMPFiles::~TXMPFiles" ref="5eaa92724cc82d933a32eff9c4636739" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::~<a class="el" href="classTXMPFiles.html">TXMPFiles</a> </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td> throw ()<code> [virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Destructor; typical virtual destructor.
+<p>
+The destructor does not call <code><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile()</a></code>; pending updates are lost when the destructor is run.<p>
+<dl class="see" compact><dt><b>See also:</b></dt><dd><code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile()</a></code>, <code><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile()</a></code> </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="36abe01988d4ca3939138e871c7b75e7"></a><!-- doxytag: member="TXMPFiles::TXMPFiles" ref="36abe01988d4ca3939138e871c7b75e7" args="(XMP_StringPtr filePath, XMP_FileFormat format=kXMP_UnknownFile, XMP_OptionBits openFlags=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPFiles.html">TXMPFiles</a> </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>filePath</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a>&nbsp;</td>
+ <td class="paramname"> <em>format</em> = <code>kXMP_UnknownFile</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>openFlags</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Alternate constructor associates the new <code>XMPFiles</code> object with a specific file.
+<p>
+Calls <code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile()</a></code> to open the specified file after performing a default construct.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>filePath</em>&nbsp;</td><td>The path for the file, specified as a nul-terminated UTF-8 string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>format</em>&nbsp;</td><td>A format hint for the file, if known.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>openFlags</em>&nbsp;</td><td>Options for how the file is to be opened (for read or read/write, for example). Use a logical OR of these bit-flag constants:</td></tr>
+ </table>
+</dl>
+<ul>
+<li><code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea4c61ec4ed571dbc5f1832ff6772320d2" title="Open for read-only access.">kXMPFiles_OpenForRead</a></code> </li>
+<li><code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea91fa388b3888bcb6a68615537b66a49b" title="Open for reading and writing.">kXMPFiles_OpenForUpdate</a></code> </li>
+<li><code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaa58279b2b1311242e7374117f455bb96" title="Only the XMP is wanted, allows space/time optimizations.">kXMPFiles_OpenOnlyXMP</a></code> </li>
+<li><code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaca2002b03d2a88da0203bf52a3122063" title="Cache thumbnail if possible, TXMPFiles::GetThumbnail() will be called.">kXMPFiles_OpenCacheTNail</a></code> </li>
+<li><code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea0bef4db2ecdaf82a85df9e9d417aab18" title="Be strict about locating XMP and reconciling with other forms.">kXMPFiles_OpenStrictly</a></code> </li>
+<li><code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaf6332435c7fc89cb0b7381e13fe43646" title="Require the use of a smart handler.">kXMPFiles_OpenUseSmartHandler</a></code> </li>
+<li><code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea77b47c63e579b28cbd25083ceb58c285" title="Force packet scanning, do not use a smart handler.">kXMPFiles_OpenUsePacketScanning</a></code> </li>
+<li><code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea77f34b1873bb2584feabe26a2c8f1182" title="Only packet scan files &quot;known&quot; to need scanning.">kXMPFiles_OpenLimitedScanning</a></code> </li>
+<li><code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eafaccd8151900b2c7fc3e7de598a92d34" title="Set if calling from background thread.">kXMPFiles_OpenInBackground</a></code> </li>
+</ul>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The new <code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code> object. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="f540b3ea689a6d7381dca4f52132a4ac"></a><!-- doxytag: member="TXMPFiles::TXMPFiles" ref="f540b3ea689a6d7381dca4f52132a4ac" args="(const tStringObj &amp;filePath, XMP_FileFormat format=kXMP_UnknownFile, XMP_OptionBits openFlags=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPFiles.html">TXMPFiles</a> </td>
+ <td>(</td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>filePath</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a>&nbsp;</td>
+ <td class="paramname"> <em>format</em> = <code>kXMP_UnknownFile</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>openFlags</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Alternate constructor associates the new <code>XMPFiles</code> object with a specific file, using a string object.
+<p>
+Overloads the basic form of the function, allowing you to pass a string object for the file path. It is otherwise identical; see details in the canonical form.
+</div>
+</div><p>
+<a class="anchor" name="cf343fb6771b482ca72d467233a6f920"></a><!-- doxytag: member="TXMPFiles::TXMPFiles" ref="cf343fb6771b482ca72d467233a6f920" args="(const TXMPFiles&lt; tStringObj &gt; &amp;original)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPFiles.html">TXMPFiles</a> </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
+ <td class="paramname"> <em>original</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Copy constructor.
+<p>
+Increments an internal reference count but does not perform a deep copy.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>original</em>&nbsp;</td><td>The existing <code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code> object to copy.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The new <code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code> object. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="d986c7b2e2d82eaef6cf6a33e9d09b65"></a><!-- doxytag: member="TXMPFiles::TXMPFiles" ref="d986c7b2e2d82eaef6cf6a33e9d09b65" args="(XMPFilesRef xmpFilesObj)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPFiles.html">TXMPFiles</a> </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#a4bca98ad67d7a62c60cb13dbbab0f25">XMPFilesRef</a>&nbsp;</td>
+ <td class="paramname"> <em>xmpFilesObj</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Reconstructs a <code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code> object from an internal reference.
+<p>
+This constructor creates a new <code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code> object that refers to the underlying reference object of an existing <code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code> object. Use to safely pass <code>SXMPFiles</code> references across DLL boundaries.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmpFilesObj</em>&nbsp;</td><td>The underlying reference object, obtained from some other XMP object with <code><a class="el" href="classTXMPFiles.html#311fc36fdf7270fe05b1c531cdbbd009" title="GetInternalRef() retrieves an internal reference that can be safely passed across...">TXMPFiles::GetInternalRef()</a></code>.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The new object. </dd></dl>
+
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="6e521c034728b59ab55213a9d8203d1e"></a><!-- doxytag: member="TXMPFiles::GetVersionInfo" ref="6e521c034728b59ab55213a9d8203d1e" args="(XMP_VersionInfo *versionInfo)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::GetVersionInfo </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structXMP__VersionInfo.html">XMP_VersionInfo</a> *&nbsp;</td>
+ <td class="paramname"> <em>versionInfo</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPFiles.html#6e521c034728b59ab55213a9d8203d1e" title="GetVersionInfo() retrieves version information for the XMPFiles component.">GetVersionInfo()</a></code> retrieves version information for the XMPFiles component.
+<p>
+Can be called before <code><a class="el" href="classTXMPFiles.html#0874bbbf41c9490abfb613bfe297327d" title="Initializes the XMPFiles library; must be called before creating an SXMPFiles object...">Initialize()</a></code>. This function is static; make the call directly from the concrete class (<code>SXMPFiles</code>).<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>versionInfo</em>&nbsp;</td><td>[out] A buffer in which to return the version information. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="0874bbbf41c9490abfb613bfe297327d"></a><!-- doxytag: member="TXMPFiles::Initialize" ref="0874bbbf41c9490abfb613bfe297327d" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::Initialize </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Initializes the XMPFiles library; must be called before creating an <code>SXMPFiles</code> object.
+<p>
+The main action is to activate the available smart file handlers. Must be called before using any methods except <code><a class="el" href="classTXMPFiles.html#6e521c034728b59ab55213a9d8203d1e" title="GetVersionInfo() retrieves version information for the XMPFiles component.">GetVersionInfo()</a></code>.<p>
+This function is static; make the call directly from the concrete class (<code>SXMPFiles</code>).<p>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True on success. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="794e1830a84a6328eaa1995ba5aa6874"></a><!-- doxytag: member="TXMPFiles::Initialize" ref="794e1830a84a6328eaa1995ba5aa6874" args="(XMP_OptionBits options)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::Initialize </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Initializes the XMPFiles library; must be called before creating an <code>SXMPFiles</code> object.
+<p>
+This overload of <a class="el" href="classTXMPFiles.html#0874bbbf41c9490abfb613bfe297327d" title="Initializes the XMPFiles library; must be called before creating an SXMPFiles object...">TXMPFiles::Initialize()</a> accepts option bits to customize the initialization actions. At this time only one option is defined, <code>kXMPFiles_NoQuickTimeInit</code>. This option prevents calling the QuickTime initialization on Windows, which can be slow. The MOV file handler on Windows uses Apple's QuickTime SDK for the actual file I/O.<p>
+The main action is to activate the available smart file handlers. Must be called before using any methods except <code><a class="el" href="classTXMPFiles.html#6e521c034728b59ab55213a9d8203d1e" title="GetVersionInfo() retrieves version information for the XMPFiles component.">GetVersionInfo()</a></code>.<p>
+This function is static; make the call directly from the concrete class (<code>SXMPFiles</code>).<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the initialization actions.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True on success. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="1e8de80c252b60b332dc4bc524139fd8"></a><!-- doxytag: member="TXMPFiles::Terminate" ref="1e8de80c252b60b332dc4bc524139fd8" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::Terminate </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Terminates use of the XMPFiles library.
+<p>
+Optional. Deallocates global data structures created by intialization. Its main action is to deallocate heap-allocated global storage, for the benefit of client leak checkers.<p>
+This function is static; make the call directly from the concrete class (<code>SXMPFiles</code>).
+</div>
+</div><p>
+<a class="anchor" name="3f1483fcc92860460d3772216dfaef81"></a><!-- doxytag: member="TXMPFiles::operator=" ref="3f1483fcc92860460d3772216dfaef81" args="(const TXMPFiles&lt; tStringObj &gt; &amp;rhs)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::operator= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
+ <td class="paramname"> <em>rhs</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Assignment operator.
+<p>
+Increments an internal reference count but does not perform a deep copy.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rhs</em>&nbsp;</td><td>The existing <code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code> object. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="311fc36fdf7270fe05b1c531cdbbd009"></a><!-- doxytag: member="TXMPFiles::GetInternalRef" ref="311fc36fdf7270fe05b1c531cdbbd009" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="XMP__Const_8h.html#a4bca98ad67d7a62c60cb13dbbab0f25">XMPFilesRef</a> <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::GetInternalRef </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<a class="el" href="classTXMPFiles.html#311fc36fdf7270fe05b1c531cdbbd009" title="GetInternalRef() retrieves an internal reference that can be safely passed across...">GetInternalRef()</a> retrieves an internal reference that can be safely passed across DLL boundaries and reconstructed.
+<p>
+Use with the reconstruction constructor to safely pass <code>SXMPFiles</code> references across DLL boundaries where the clients might have used different string types when instantiating <code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code>.<p>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The internal reference.</dd></dl>
+<dl class="see" compact><dt><b>See also:</b></dt><dd><code><a class="el" href="classTXMPMeta.html#fbfebded0b85b08bd9c5ba0d7dae07e0" title="Retrieves an internal reference that can be safely passed across DLL boundaries and...">TXMPMeta::GetInternalRef()</a></code> for usage. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="cb9e16a1477ec67fa6da6d736a9bc131"></a><!-- doxytag: member="TXMPFiles::GetFormatInfo" ref="cb9e16a1477ec67fa6da6d736a9bc131" args="(XMP_FileFormat format, XMP_OptionBits *handlerFlags=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">* static bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::GetFormatInfo </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a>&nbsp;</td>
+ <td class="paramname"> <em>format</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
+ <td class="paramname"> <em>handlerFlags</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<a class="el" href="classTXMPFiles.html#cb9e16a1477ec67fa6da6d736a9bc131" title="GetFormatInfo() reports what features are supported for a specific file format.">GetFormatInfo()</a> reports what features are supported for a specific file format.
+<p>
+The file handlers for different file formats vary considerably in what features they support. Support depends on both the general capabilities of the format and the implementation of the handler for that format.<p>
+This function is static; make the call directly from the concrete class (<code>SXMPFiles</code>).<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>format</em>&nbsp;</td><td>The file format whose support flags are desired.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>handlerFlags</em>&nbsp;</td><td>[out] A buffer in which to return a logical OR of option bit flags. The following constants are defined:</td></tr>
+ </table>
+</dl>
+<ul>
+<li><code><a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba23a3eb2a5e95292036a93ad6666fa388" title="Can inject first-time XMP into an existing file.">kXMPFiles_CanInjectXMP</a></code> - Can inject first-time XMP into an existing file. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba126c9cc056f6569c424431edbcb9521c" title="Can expand XMP or other metadata in an existing file.">kXMPFiles_CanExpand</a></code> - Can expand XMP or other metadata in an existing file. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba8957f1ef358b4ab3a1df519903f2ae07" title="Can copy one file to another, writing new metadata.">kXMPFiles_CanRewrite</a></code> - Can copy one file to another, writing new metadata (as in SaveAs) </li>
+<li><code><a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabafc2bc7cfdd28a326788d563ec0357694" title="Supports reconciliation between XMP and other forms.">kXMPFiles_CanReconcile</a></code> - Supports reconciliation between XMP and other forms. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba4a183c3ec4994cf09993e5b31dee9733" title="Allows access to just the XMP, ignoring other forms.">kXMPFiles_AllowsOnlyXMP</a></code> - Allows access to just the XMP, ignoring other forms. This is only meaningful if <code><a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabafc2bc7cfdd28a326788d563ec0357694" title="Supports reconciliation between XMP and other forms.">kXMPFiles_CanReconcile</a></code> is set. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabaf7fe49636dc1fcc0d6938d4b6fb83a09" title="File handler returns native thumbnail.">kXMPFiles_ReturnsTNail</a></code> - File handler returns native thumbnail information. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabadb116eed738d1fcdfe4ab9c1635e08ea" title="File handler returns raw XMP packet information.">kXMPFiles_ReturnsRawPacket</a></code> - File handler returns raw XMP packet information and string.</li>
+</ul>
+Even if <code><a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabadb116eed738d1fcdfe4ab9c1635e08ea" title="File handler returns raw XMP packet information.">kXMPFiles_ReturnsRawPacket</a></code> is set, the returned packet information might have an offset of -1 to indicate an unknown offset. While all file handlers should be able to return the raw packet, some might not know the offset of the packet within the file. This is typical in cases where external libraries are used. These cases might not even allow return of the raw packet.<p>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the format has explicit "smart" support, false if the format is handled by the default packet scanning plus heuristics. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="07b7c4b44fb0e0a7d115ddd5ba22f926"></a><!-- doxytag: member="TXMPFiles::CheckFileFormat" ref="07b7c4b44fb0e0a7d115ddd5ba22f926" args="(XMP_StringPtr filePath)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a> <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::CheckFileFormat </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>filePath</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPFiles.html#07b7c4b44fb0e0a7d115ddd5ba22f926" title="CheckFileFormat() tries to determine the format of a file.">CheckFileFormat()</a></code> tries to determine the format of a file.
+<p>
+<code>CheckFileFormat</code> tries to determine the format of a file, returning an XMP_FileFormat value. It uses the same logic as <code>OpenFile</code> will use to select a smart handler.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>filePath</em>&nbsp;</td><td>The path for the file, appropriate for the local operating system. Passed as a nul-terminated UTF-8 string. The path is the same as would be passed to <code>OpenFile</code>.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The file's format if a smart handler would be selected, otherwise <code>kXMP_UnknownFile</code>. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="7f505664c41d7304fb757d6009b0751c"></a><!-- doxytag: member="TXMPFiles::CheckPackageFormat" ref="7f505664c41d7304fb757d6009b0751c" args="(XMP_StringPtr folderPath)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a> <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::CheckPackageFormat </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>folderPath</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPFiles.html#7f505664c41d7304fb757d6009b0751c" title="CheckPackageFormat() tries to determine the format of a &quot;package&quot; folder...">CheckPackageFormat()</a></code> tries to determine the format of a "package" folder.
+<p>
+<code>CheckPackageFormat</code> tries to determine the format of a "package" given the name of the top level folder, returning an XMP_FileFormat value. Examples of recognized packages include the video formats P2, XDCAM, or Sony HDV. These packages contain collections of "clips", stored as multiple files in specific subfolders.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>folderPath</em>&nbsp;</td><td>The path for the top level folder, appropriate for the local operating system. Passed as a nul-terminated UTF-8 string. The path is not the same as would be passed to <code>OpenFile</code>. For example the path passed to <code>CheckPackageFormat</code> might be ".../MyMovie", while the path passed to <code>OpenFile</code> would be ".../MyMovie/SomeClip".</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The package's format if a smart handler would be selected, otherwise <code>kXMP_UnknownFile</code>. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="fcd21cfe5d6f13c648c5541e161919cb"></a><!-- doxytag: member="TXMPFiles::OpenFile" ref="fcd21cfe5d6f13c648c5541e161919cb" args="(XMP_StringPtr filePath, XMP_FileFormat format=kXMP_UnknownFile, XMP_OptionBits openFlags=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::OpenFile </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>filePath</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a>&nbsp;</td>
+ <td class="paramname"> <em>format</em> = <code>kXMP_UnknownFile</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>openFlags</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile()</a></code> opens a file for metadata access.
+<p>
+Opens a file for the requested forms of metadata access. Opening the file at a minimum causes the raw XMP packet to be read from the file. If the file handler supports legacy metadata reconciliation then legacy metadata is also read, unless <code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaa58279b2b1311242e7374117f455bb96" title="Only the XMP is wanted, allows space/time optimizations.">kXMPFiles_OpenOnlyXMP</a></code> is passed. If the file handler supports native thumbnails and <code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaca2002b03d2a88da0203bf52a3122063" title="Cache thumbnail if possible, TXMPFiles::GetThumbnail() will be called.">kXMPFiles_OpenCacheTNail</a></code> is passed, the native thumbnail is cached.<p>
+If the file is opened for read-only access (passing <code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea4c61ec4ed571dbc5f1832ff6772320d2" title="Open for read-only access.">kXMPFiles_OpenForRead</a></code>), the disk file is closed immediately after reading the data from it; the <code>XMPFiles</code> object, however, remains in the open state. You must call <code><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile()</a></code> when finished using it. Other methods, such as <code><a class="el" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3" title="GetXMP() retrieves the XMP metadata from an open file.">GetXMP()</a></code>, can only be used between the <code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile()</a></code> and <code><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile()</a></code> calls. The <code>XMPFiles</code> destructor does not call <code><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile()</a></code>; if you call it without closing, any pending updates are lost.<p>
+If the file is opened for update (passing <code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea91fa388b3888bcb6a68615537b66a49b" title="Open for reading and writing.">kXMPFiles_OpenForUpdate</a></code>), the disk file remains open until <code><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile()</a></code> is called. The disk file is only updated once, when <code><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile()</a></code> is called, regardless of how many calls are made to <code><a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a" title="PutXMP() updates the XMP metadata in this object without writing out the file.">PutXMP()</a></code>.<p>
+Typically, the XMP is not parsed and legacy reconciliation is not performed until <code><a class="el" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3" title="GetXMP() retrieves the XMP metadata from an open file.">GetXMP()</a></code> is called, but this is not guaranteed. Specific file handlers might do earlier parsing of the XMP. Delayed parsing and early disk file close for read-only access are optimizations to help clients implementing file browsers, so that they can access the file briefly and possibly display a thumbnail, then postpone more expensive XMP processing until later.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>filePath</em>&nbsp;</td><td>The path for the file, appropriate for the local operating system. Passed as a nul-terminated UTF-8 string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>format</em>&nbsp;</td><td>The format of the file. If the format is unknown (<code><a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403882845f95eaaaf492f5011bff05a398719" title="Unknown file format constant: &#39; &#39;.">kXMP_UnknownFile</a></code>) the format is determined from the file content. The first handler to check is guessed from the file's extension. Passing a specific format value is generally just a hint about what file handler to try first (instead of the one based on the extension). If <code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea0bef4db2ecdaf82a85df9e9d417aab18" title="Be strict about locating XMP and reconciling with other forms.">kXMPFiles_OpenStrictly</a></code> is set, then any format other than <code><a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403882845f95eaaaf492f5011bff05a398719" title="Unknown file format constant: &#39; &#39;.">kXMP_UnknownFile</a></code> requires that the file actually be that format; otherwise an exception is thrown.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>openFlags</em>&nbsp;</td><td>A set of option flags that describe the desired access. By default (zero) the file is opened for read-only access and the format handler decides on the level of reconciliation that will be performed. A logical OR of these bit-flag constants:</td></tr>
+ </table>
+</dl>
+<ul>
+<li><code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea4c61ec4ed571dbc5f1832ff6772320d2" title="Open for read-only access.">kXMPFiles_OpenForRead</a></code> - Open for read-only access. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea91fa388b3888bcb6a68615537b66a49b" title="Open for reading and writing.">kXMPFiles_OpenForUpdate</a></code> - Open for reading and writing. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaa58279b2b1311242e7374117f455bb96" title="Only the XMP is wanted, allows space/time optimizations.">kXMPFiles_OpenOnlyXMP</a></code> - Only the XMP is wanted, no reconciliation. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaca2002b03d2a88da0203bf52a3122063" title="Cache thumbnail if possible, TXMPFiles::GetThumbnail() will be called.">kXMPFiles_OpenCacheTNail</a></code> - Cache thumbnail if possible, GetThumbnail will be called. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea0bef4db2ecdaf82a85df9e9d417aab18" title="Be strict about locating XMP and reconciling with other forms.">kXMPFiles_OpenStrictly</a></code> - Be strict about locating XMP and reconciling with other forms. By default, a best effort is made to locate the correct XMP and to reconcile XMP with other forms (if reconciliation is done). This option forces stricter rules, resulting in exceptions for errors. The definition of strictness is specific to each handler, there might be no difference. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaf6332435c7fc89cb0b7381e13fe43646" title="Require the use of a smart handler.">kXMPFiles_OpenUseSmartHandler</a></code> - Require the use of a smart handler. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea77b47c63e579b28cbd25083ceb58c285" title="Force packet scanning, do not use a smart handler.">kXMPFiles_OpenUsePacketScanning</a></code> - Force packet scanning, do not use a smart handler.</li>
+</ul>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the file is succesfully opened and attached to a file handler. False for anticipated problems, such as passing <code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaf6332435c7fc89cb0b7381e13fe43646" title="Require the use of a smart handler.">kXMPFiles_OpenUseSmartHandler</a></code> but not having an appropriate smart handler. Throws an exception for serious problems. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="cfef1688f3a62e2f465bb3a27da7b4ac"></a><!-- doxytag: member="TXMPFiles::OpenFile" ref="cfef1688f3a62e2f465bb3a27da7b4ac" args="(const tStringObj &amp;filePath, XMP_FileFormat format=kXMP_UnknownFile, XMP_OptionBits openFlags=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::OpenFile </td>
+ <td>(</td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>filePath</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a>&nbsp;</td>
+ <td class="paramname"> <em>format</em> = <code>kXMP_UnknownFile</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>openFlags</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile()</a></code> opens a file for metadata access, using a string object
+<p>
+Overloads the basic form of the function, allowing you to pass a string object for the file path. It is otherwise identical; see details in the canonical form.
+</div>
+</div><p>
+<a class="anchor" name="eca89170c7aa3e2d56e30bff04dd7927"></a><!-- doxytag: member="TXMPFiles::CloseFile" ref="eca89170c7aa3e2d56e30bff04dd7927" args="(XMP_OptionBits closeFlags=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::CloseFile </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>closeFlags</em> = <code>0</code> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile()</a> explicitly closes an opened file.
+<p>
+Performs any necessary output to the file and closes it. Files that are opened for update are written to only when closing.<p>
+If the file is opened for read-only access (passing <code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea4c61ec4ed571dbc5f1832ff6772320d2" title="Open for read-only access.">kXMPFiles_OpenForRead</a></code>), the disk file is closed immediately after reading the data from it; the <code>XMPFiles</code> object, however, remains in the open state. You must call <code><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile()</a></code> when finished using it. Other methods, such as <code><a class="el" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3" title="GetXMP() retrieves the XMP metadata from an open file.">GetXMP()</a></code>, can only be used between the <code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile()</a></code> and <code><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile()</a></code> calls. The <code>XMPFiles</code> destructor does not call <code><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile()</a></code>; if you call it without closing, any pending updates are lost.<p>
+If the file is opened for update (passing <code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea91fa388b3888bcb6a68615537b66a49b" title="Open for reading and writing.">kXMPFiles_OpenForUpdate</a></code>), the disk file remains open until <code><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile()</a></code> is called. The disk file is only updated once, when <code><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile()</a></code> is called, regardless of how many calls are made to <code><a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a" title="PutXMP() updates the XMP metadata in this object without writing out the file.">PutXMP()</a></code>.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>closeFlags</em>&nbsp;</td><td>Option flags for optional closing actions. This bit-flag constant is defined:</td></tr>
+ </table>
+</dl>
+<ul>
+<li><code><a class="el" href="XMP__Const_8h.html#f9bdc3014f3d54c426b6d2df10de4960dbf8d744f355ef9800a4ec44325baf54" title="Write into a temporary file and swap for crash safety.">kXMPFiles_UpdateSafely</a></code> - Write into a temporary file then swap for crash safety. </li>
+</ul>
+
+</div>
+</div><p>
+<a class="anchor" name="f9931d081cb19f98c81e41786030765b"></a><!-- doxytag: member="TXMPFiles::GetFileInfo" ref="f9931d081cb19f98c81e41786030765b" args="(tStringObj *filePath=0, XMP_OptionBits *openFlags=0, XMP_FileFormat *format=0, XMP_OptionBits *handlerFlags=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::GetFileInfo </td>
+ <td>(</td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>filePath</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
+ <td class="paramname"> <em>openFlags</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a> *&nbsp;</td>
+ <td class="paramname"> <em>format</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
+ <td class="paramname"> <em>handlerFlags</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPFiles.html#f9931d081cb19f98c81e41786030765b" title="GetFileInfo() retrieves basic information about an opened file.">GetFileInfo()</a></code> retrieves basic information about an opened file.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>filePath</em>&nbsp;</td><td>[out] A buffer in which to return the path passed to <code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile()</a></code>. Can be null if value is not wanted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>openFlags</em>&nbsp;</td><td>[out] A buffer in which to return the option flags passed to <code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile()</a></code>. Can be null if value is not wanted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>format</em>&nbsp;</td><td>[out] A buffer in which to return the file format. Can be null if value is not wanted. </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>handlerFlags</em>&nbsp;</td><td>[out] A buffer in which to return the handler's capability flags. Can be null if value is not wanted.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the file object is in the open state; that is, <code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile()</a></code> has been called but <code><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile()</a></code> has not. False otherwise. Even if the file object is open, the actual disk file might be closed in the host file-system sense; see <code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile()</a></code>. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="7b86c130fdbd54b5ac158ec3fee93777"></a><!-- doxytag: member="TXMPFiles::SetAbortProc" ref="7b86c130fdbd54b5ac158ec3fee93777" args="(XMP_AbortProc abortProc, void *abortArg)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::SetAbortProc </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#a2738ce2fca7f1809b12834b1b5e2d0e">XMP_AbortProc</a>&nbsp;</td>
+ <td class="paramname"> <em>abortProc</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&nbsp;</td>
+ <td class="paramname"> <em>abortArg</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPFiles.html#7b86c130fdbd54b5ac158ec3fee93777" title="SetAbortProc() registers a callback function used to check for a user-signaled abort...">SetAbortProc()</a></code> registers a callback function used to check for a user-signaled abort.
+<p>
+The specified procedure is called periodically to allow a user to cancel time-consuming operations. The callback function should return true to signal an abort, which results in an exception being thrown.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>abortProc</em>&nbsp;</td><td>The callback function.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>abortArg</em>&nbsp;</td><td>A pointer to caller-defined data to pass to the callback function. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="42ca0bbc5ac66a8de1710e03a7ff17b3"></a><!-- doxytag: member="TXMPFiles::GetXMP" ref="42ca0bbc5ac66a8de1710e03a7ff17b3" args="(SXMPMeta *xmpObj=0, tStringObj *xmpPacket=0, XMP_PacketInfo *packetInfo=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::GetXMP </td>
+ <td>(</td>
+ <td class="paramtype">SXMPMeta *&nbsp;</td>
+ <td class="paramname"> <em>xmpObj</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>xmpPacket</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="structXMP__PacketInfo.html">XMP_PacketInfo</a> *&nbsp;</td>
+ <td class="paramname"> <em>packetInfo</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3" title="GetXMP() retrieves the XMP metadata from an open file.">GetXMP()</a></code> retrieves the XMP metadata from an open file.
+<p>
+The function reports whether XMP is present in the file; you can choose to retrieve any or all of the parsed XMP, the raw XMP packet,or information about the raw XMP packet. The options provided when the file was opened determine if reconciliation is done with other forms of metadata.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmpObj</em>&nbsp;</td><td>[out] An XMP object in which to return the parsed XMP metadata. Can be null.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>xmpPacket</em>&nbsp;</td><td>[out] An string object in which to return the raw XMP packet as stored in the file. Can be null. The encoding of the packet is given in the <code>packetInfo</code>. Returns an empty string if the low level file handler does not provide the raw packet.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>packetInfo</em>&nbsp;</td><td>[out] An string object in which to return the location and form of the raw XMP in the file. <code><a class="el" href="structXMP__PacketInfo.html#039ce6665fe8e08d922a46f266799f75" title="Character format using the values kXMP_Char8Bit, kXMP_Char16BitBig, etc.">XMP_PacketInfo::charForm</a></code> and <code><a class="el" href="structXMP__PacketInfo.html#66845c1d5f3f9f36a1543a7322bd7bd1" title="True if there is a packet wrapper and the trailer says writeable by dumb packet scanners...">XMP_PacketInfo::writeable</a></code> reflect the raw XMP in the file. The parsed XMP property values are always UTF-8. The writeable flag is taken from the packet trailer; it applies only to "format ignorant" writing. The <code><a class="el" href="structXMP__PacketInfo.html" title="XMP packet description.">XMP_PacketInfo</a></code> structure always reflects the state of the XMP in the file. The offset, length, and character form do not change as a result of calling <code><a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a" title="PutXMP() updates the XMP metadata in this object without writing out the file.">PutXMP()</a></code> unless the file is also written. Some file handlers might not return location or contents of the raw packet string. To determine whether one does, check the <code><a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabadb116eed738d1fcdfe4ab9c1635e08ea" title="File handler returns raw XMP packet information.">kXMPFiles_ReturnsRawPacket</a></code> bit returned by <code><a class="el" href="classTXMPFiles.html#cb9e16a1477ec67fa6da6d736a9bc131" title="GetFormatInfo() reports what features are supported for a specific file format.">GetFormatInfo()</a></code>. If the low-level file handler does not provide the raw packet location, <code><a class="el" href="structXMP__PacketInfo.html#20f65fcfd0f3658ab93ff441a9d61d2c" title="Packet offset in the file in bytes, -1 if unknown.">XMP_PacketInfo::offset</a></code> and <code><a class="el" href="structXMP__PacketInfo.html#f526c582b66e24553f2d4b11eb714a44" title="Packet length in the file in bytes, -1 if unknown.">XMP_PacketInfo::length</a></code> are both 0, <code><a class="el" href="structXMP__PacketInfo.html#039ce6665fe8e08d922a46f266799f75" title="Character format using the values kXMP_Char8Bit, kXMP_Char16BitBig, etc.">XMP_PacketInfo::charForm</a></code> is UTF-8, and <code><a class="el" href="structXMP__PacketInfo.html#66845c1d5f3f9f36a1543a7322bd7bd1" title="True if there is a packet wrapper and the trailer says writeable by dumb packet scanners...">XMP_PacketInfo::writeable</a></code> is false.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the file has XMP, false otherwise. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="4ea1eda39f803322e10b2a554ef8ab06"></a><!-- doxytag: member="TXMPFiles::GetThumbnail" ref="4ea1eda39f803322e10b2a554ef8ab06" args="(XMP_ThumbnailInfo *tnailInfo)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::GetThumbnail </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structXMP__ThumbnailInfo.html">XMP_ThumbnailInfo</a> *&nbsp;</td>
+ <td class="paramname"> <em>tnailInfo</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPFiles.html#4ea1eda39f803322e10b2a554ef8ab06" title="GetThumbnail() retrieves the native thumbnail from an open file.">GetThumbnail()</a></code> retrieves the native thumbnail from an open file.
+<p>
+Use this function to obtain native thumbnail information, if the associated file handler supports that and the thumbnail was cached by the call to <code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile()</a></code>; that is, the <code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaca2002b03d2a88da0203bf52a3122063" title="Cache thumbnail if possible, TXMPFiles::GetThumbnail() will be called.">kXMPFiles_OpenCacheTNail</a></code> option flag was set. The return value reports whether a thumbnail is present in the file.<p>
+The returned thumbnail information can be incomplete, depending on the file format, the file handler's capabilities, and the specific file content.<p>
+<ul>
+<li>The <code><a class="el" href="structXMP__ThumbnailInfo.html#89f158688c90cef1df24bbfb7770a881" title="Full image size in pixels.">XMP_ThumbnailInfo::fullWidth</a></code>, <code>fullHeight</code>, and <code>fullOrientation</code> fields are only meaningful for image files. They are not meaningful for multi-page files such as PDF or InDesign, for dynamic audio or video files, and so on. The field values are zero if not meaningful or not determined. </li>
+<li>The <code><a class="el" href="structXMP__ThumbnailInfo.html#683c74dc7168f0046204ea153de3c179" title="Raw image data from the host file, valid for life of the owning XMPFiles object....">XMP_ThumbnailInfo::tnailImage</a></code> and <code><a class="el" href="structXMP__ThumbnailInfo.html#77072568158233d0c44dd4c8636366ff" title="The size in bytes of the thumbnail image data.">XMP_ThumbnailInfo::tnailSize</a></code> fields might be zero even if a recognized thumbnail is present.</li>
+</ul>
+Being recognized means only that the handler has determined that the file does contain a native thumbnail. The thumbnail data might be of a format that the file handler cannot return as a single contiguous block of thumbnail data. For example, for a TIFF uncompressed thumbnail, the handler might not have logic to gather the various disjoint pieces of the thumbnail from the overall TIFF stream.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>tnailInfo</em>&nbsp;</td><td>[out] Optional. A buffer in which to return information about a recognized native thumbnail, and related information about the primary image if appropriate. Can be null if the information is not desired.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if a recognized native thumbnail is present and the thumbnail was cached by the call to <code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">OpenFile()</a></code>; that is, the <code><a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaca2002b03d2a88da0203bf52a3122063" title="Cache thumbnail if possible, TXMPFiles::GetThumbnail() will be called.">kXMPFiles_OpenCacheTNail</a></code> option flag was set. Can return true even if the function cannot retrieve the actual thumbnail image. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="d3f7babdc07c7de0d0cd9a3362b4710a"></a><!-- doxytag: member="TXMPFiles::PutXMP" ref="d3f7babdc07c7de0d0cd9a3362b4710a" args="(const SXMPMeta &amp;xmpObj)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::PutXMP </td>
+ <td>(</td>
+ <td class="paramtype">const SXMPMeta &amp;&nbsp;</td>
+ <td class="paramname"> <em>xmpObj</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a" title="PutXMP() updates the XMP metadata in this object without writing out the file.">PutXMP()</a></code> updates the XMP metadata in this object without writing out the file.
+<p>
+This function supplies new XMP for the file. However, the disk file is not written until the object is closed with <code><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927" title="CloseFile() explicitly closes an opened file.">CloseFile()</a></code>. The options provided when the file was opened determine if reconciliation is done with other forms of metadata.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmpObj</em>&nbsp;</td><td>The new metadata as an XMP object. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="da77eab74c3440659db3122f6ec8b7f4"></a><!-- doxytag: member="TXMPFiles::PutXMP" ref="da77eab74c3440659db3122f6ec8b7f4" args="(const tStringObj &amp;xmpPacket)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::PutXMP </td>
+ <td>(</td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>xmpPacket</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a" title="PutXMP() updates the XMP metadata in this object without writing out the file.">PutXMP()</a></code> updates the XMP metadata in this object without writing out the file, using a string object for input.
+<p>
+Overloads the basic form of the function, allowing you to pass the metadata as a string object instead of an XMP object. It is otherwise identical; see details in the canonical form.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmpPacket</em>&nbsp;</td><td>The new metadata as a string object containing a complete XMP packet. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="502ed01119e0421413e773f4f42683ec"></a><!-- doxytag: member="TXMPFiles::PutXMP" ref="502ed01119e0421413e773f4f42683ec" args="(XMP_StringPtr xmpPacket, XMP_StringLen xmpLength=kXMP_UseNullTermination)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::PutXMP </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>xmpPacket</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a>&nbsp;</td>
+ <td class="paramname"> <em>xmpLength</em> = <code>kXMP_UseNullTermination</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a" title="PutXMP() updates the XMP metadata in this object without writing out the file.">PutXMP()</a></code> updates the XMP metadata in this object without writing out the file, using a string object and optional length.
+<p>
+Overloads the basic form of the function, allowing you to pass the metadata as a string object instead of an XMP object. It is otherwise identical; see details in the canonical form.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmpPacket</em>&nbsp;</td><td>The new metadata as a <code>const char *</code> string containing an XMP packet.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>xmpLength</em>&nbsp;</td><td>Optional. The number of bytes in the string. If not supplied, the string is assumed to be nul-terminated. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="29a11a1539d6300da3fb4c7e9ea02bb6"></a><!-- doxytag: member="TXMPFiles::CanPutXMP" ref="29a11a1539d6300da3fb4c7e9ea02bb6" args="(const SXMPMeta &amp;xmpObj)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::CanPutXMP </td>
+ <td>(</td>
+ <td class="paramtype">const SXMPMeta &amp;&nbsp;</td>
+ <td class="paramname"> <em>xmpObj</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6" title="CanPutXMP() reports whether this file can be updated with a specific XMP packet.">CanPutXMP()</a></code> reports whether this file can be updated with a specific XMP packet.
+<p>
+Use to determine if the file can probably be updated with a given set of XMP metadata. This depends on the size of the packet, the options with which the file was opened, and the capabilities of the handler for the file format. The function obtains the length of the serialized packet for the provided XMP, but does not keep it or modify it, and does not cause the file to be written when closed. This is implemented roughly as follows:<p>
+<pre>
+ bool CanPutXMP ( XMP_StringPtr xmpPacket )
+ {
+ XMP_FileFormat format;
+ this-&gt;GetFileInfo ( 0, &amp;format, 0 );</pre><p>
+<pre> XMP_OptionBits formatFlags;
+ GetFormatInfo ( format, &amp;formatFlags );</pre><p>
+<pre> if ( (formatFlags &amp; kXMPFiles_CanInjectXMP) &amp;&amp; (formatFlags &amp; kXMPFiles_CanExpand) ) return true;</pre><p>
+<pre> <a class="el" href="structXMP__PacketInfo.html" title="XMP packet description.">XMP_PacketInfo</a> packetInfo;
+ bool hasXMP = this-&gt;GetXMP ( 0, 0, &amp;packetInfo );</pre><p>
+<pre> if ( ! hasXMP ) {
+ if ( formatFlags &amp; kXMPFiles_CanInjectXMP ) return true;
+ } else {
+ if ( (formatFlags &amp; kXMPFiles_CanExpand) ||
+ (packetInfo.length &gt;= strlen(xmpPacket)) ) return true;
+ }
+ return false;
+ }
+ </pre><p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmpObj</em>&nbsp;</td><td>The proposed new metadata as an XMP object. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="1d3f32c2b95659ada198775e2f67c808"></a><!-- doxytag: member="TXMPFiles::CanPutXMP" ref="1d3f32c2b95659ada198775e2f67c808" args="(const tStringObj &amp;xmpPacket)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::CanPutXMP </td>
+ <td>(</td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>xmpPacket</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6" title="CanPutXMP() reports whether this file can be updated with a specific XMP packet.">CanPutXMP()</a></code> reports whether this file can be updated with a specific XMP packet, passed in a string object.
+<p>
+Overloads the basic form of the function, allowing you to pass the metadata as a string object instead of an XMP object. It is otherwise identical; see details in the canonical form.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmpPacket</em>&nbsp;</td><td>The proposed new metadata as a string object containing an XMP packet. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="2303dfcc00f108bda202600e3da9c109"></a><!-- doxytag: member="TXMPFiles::CanPutXMP" ref="2303dfcc00f108bda202600e3da9c109" args="(XMP_StringPtr xmpPacket, XMP_StringLen xmpLength=kXMP_UseNullTermination)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::CanPutXMP </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>xmpPacket</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a>&nbsp;</td>
+ <td class="paramname"> <em>xmpLength</em> = <code>kXMP_UseNullTermination</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6" title="CanPutXMP() reports whether this file can be updated with a specific XMP packet.">CanPutXMP()</a></code> reports whether this file can be updated with a specific XMP packet, passed in a string object.
+<p>
+Overloads the basic form of the function, allowing you to pass the metadata as a string object instead of an XMP object. It is otherwise identical; see details in the canonical form.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmpPacket</em>&nbsp;</td><td>The proposed new metadata as a <code>const char *</code> string containing an XMP packet.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>xmpLength</em>&nbsp;</td><td>Optional. The number of bytes in the string. If not supplied, the string is assumed to be nul-terminated. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="TXMPFiles_8hpp-source.html">TXMPFiles.hpp</a></ul>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/classTXMPIterator-members.html b/docs/API/classTXMPIterator-members.html
new file mode 100644
index 0000000..50a5888
--- /dev/null
+++ b/docs/API/classTXMPIterator-members.html
@@ -0,0 +1,80 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Member List</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>TXMPIterator&lt; tStringObj &gt; Member List</h1>This is the complete list of members for <a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="classTXMPIterator.html#124a1dd1ab3ff0d236e4d4b967dafcd9">Next</a>(tStringObj *schemaNS=0, tStringObj *propPath=0, tStringObj *propValue=0, XMP_OptionBits *options=0)</td><td><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPIterator.html#d767d731320d3f4c997c6ce9f7f8fa63">operator=</a>(const TXMPIterator&lt; tStringObj &gt; &amp;rhs)</td><td><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPIterator.html#30b4d78974b347e4fcd275f1f65a61b2">Skip</a>(XMP_OptionBits options)</td><td><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPIterator.html#88e855c18b2b15f7b8a5ccf3b9398352">TXMPIterator</a>(const TXMPIterator&lt; tStringObj &gt; &amp;original)</td><td><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPIterator.html#5c1bd03e776a91cbb6fd02991fe08e1b">TXMPIterator</a>(const TXMPMeta&lt; tStringObj &gt; &amp;xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options=0)</td><td><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPIterator.html#3aab7b2ddd84f25e024d7c3e66161cac">TXMPIterator</a>(const TXMPMeta&lt; tStringObj &gt; &amp;xmpObj, XMP_StringPtr schemaNS, XMP_OptionBits options=0)</td><td><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPIterator.html#b0965286a8cabeafc92fdc52f643003f">TXMPIterator</a>(const TXMPMeta&lt; tStringObj &gt; &amp;xmpObj, XMP_OptionBits options=0)</td><td><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPIterator.html#6b2b7a3d6359aec216adf32bdf7fb140">TXMPIterator</a>(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options)</td><td><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPIterator.html#911554533e8a3f09ab8870bd54462196">~TXMPIterator</a>()</td><td><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td><code> [virtual]</code></td></tr>
+</table></div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/classTXMPIterator.html b/docs/API/classTXMPIterator.html
new file mode 100644
index 0000000..09d7aff
--- /dev/null
+++ b/docs/API/classTXMPIterator.html
@@ -0,0 +1,452 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: TXMPIterator&lt; tStringObj &gt; Class Template Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>TXMPIterator&lt; tStringObj &gt; Class Template Reference</h1><!-- doxytag: class="TXMPIterator" -->API for access to the XMP Toolkit iteration services.
+<a href="#_details">More...</a>
+<p>
+<code>#include &lt;<a class="el" href="TXMPIterator_8hpp-source.html">TXMPIterator.hpp</a>&gt;</code>
+<p>
+
+<p>
+<a href="classTXMPIterator-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html#d767d731320d3f4c997c6ce9f7f8fa63">operator=</a> (const <a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt; &amp;rhs)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Assignment operator, assigns the internal ref and increments the ref count. <a href="#d767d731320d3f4c997c6ce9f7f8fa63"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html#88e855c18b2b15f7b8a5ccf3b9398352">TXMPIterator</a> (const <a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt; &amp;original)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Copy constructor, creates a client object refering to the same internal object. <a href="#88e855c18b2b15f7b8a5ccf3b9398352"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html#5c1bd03e776a91cbb6fd02991fe08e1b">TXMPIterator</a> (const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;xmpObj, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constructs an iterator for properties within a schema in an XMP object. <a href="#5c1bd03e776a91cbb6fd02991fe08e1b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html#3aab7b2ddd84f25e024d7c3e66161cac">TXMPIterator</a> (const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;xmpObj, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constructs an iterator for a subtree of properties within an XMP object. <a href="#3aab7b2ddd84f25e024d7c3e66161cac"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html#b0965286a8cabeafc92fdc52f643003f">TXMPIterator</a> (const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;xmpObj, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constructs an iterator for the entire data tree within an XMP object. <a href="#b0965286a8cabeafc92fdc52f643003f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6b2b7a3d6359aec216adf32bdf7fb140"></a><!-- doxytag: member="TXMPIterator::TXMPIterator" ref="6b2b7a3d6359aec216adf32bdf7fb140" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options)" -->
+&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html#6b2b7a3d6359aec216adf32bdf7fb140">TXMPIterator</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constructs an iterator for the global tables of the XMP toolkit. Not implemented. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="911554533e8a3f09ab8870bd54462196"></a><!-- doxytag: member="TXMPIterator::~TXMPIterator" ref="911554533e8a3f09ab8870bd54462196" args="()" -->
+virtual&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html#911554533e8a3f09ab8870bd54462196">~TXMPIterator</a> () throw ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Destructor, typical virtual destructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html#124a1dd1ab3ff0d236e4d4b967dafcd9">Next</a> (tStringObj *schemaNS=0, tStringObj *propPath=0, tStringObj *propValue=0, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPIterator.html#124a1dd1ab3ff0d236e4d4b967dafcd9" title="Next() visits the next node in the iteration.">Next()</a></code> visits the next node in the iteration. <a href="#124a1dd1ab3ff0d236e4d4b967dafcd9"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html#30b4d78974b347e4fcd275f1f65a61b2">Skip</a> (<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPIterator.html#30b4d78974b347e4fcd275f1f65a61b2" title="Skip() skips some portion of the remaining iterations.">Skip()</a></code> skips some portion of the remaining iterations. <a href="#30b4d78974b347e4fcd275f1f65a61b2"></a><br></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template&lt;class tStringObj&gt;<br>
+ class TXMPIterator&lt; tStringObj &gt;</h3>
+
+API for access to the XMP Toolkit iteration services.
+<p>
+<code><a class="el" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a></code> provides a uniform means to iterate over the schema and properties within an XMP object. <code><a class="el" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a></code> is a template class which must be instantiated with a string class such as <code>std::string</code>. See the instructions in XMP.hpp, and the Overview for a discussion of the overall architecture of the XMP API. Access these functions through the concrete class, <code>SXMPIterator</code>.<p>
+<dl class="note" compact><dt><b>Note:</b></dt><dd>Only XMP object iteration is currently available. Future development may include iteration over global tables, such as registered namespaces.</dd></dl>
+To understand how iteration works, you should have a thorough understanding of the XMP data tree, as described in the XMP Specification Part 1. You might also find it helpful to create some complex XMP and examine the output of <code><a class="el" href="classTXMPMeta.html#466fa349c9765f39ca6b1450908e769f" title="DumpObject() outputs the content of an XMP object to a callback handler for debugging...">TXMPMeta::DumpObject()</a></code>.<p>
+<ul>
+<li>The top of the XMP data tree is a single root node. This does not explicitly appear in the dump and is never visited by an iterator; that is, it is never returned from <code><a class="el" href="classTXMPIterator.html#124a1dd1ab3ff0d236e4d4b967dafcd9" title="Next() visits the next node in the iteration.">TXMPIterator::Next()</a></code>.</li>
+</ul>
+<ul>
+<li>Beneath the root are schema nodes; these collect the top-level properties in the same namespace. They are created and destroyed implicitly.</li>
+</ul>
+<ul>
+<li>Beneath the schema nodes are the property nodes. The nodes below a property node depend on its type (simple, struct, or array) and whether it has qualifiers.</li>
+</ul>
+A <code><a class="el" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a></code> constructor defines a starting point for the iteration, and options that control how it proceeds. By default, iteration starts at the root and visits all nodes beneath it in a depth-first manner. The root node iteself is not visited; the first visited node is a schema node. You can provide a schema name or property path to select a different starting node. By default, this visits the named root node first then all nodes beneath it in a depth-first manner.<p>
+The function <code><a class="el" href="classTXMPIterator.html#124a1dd1ab3ff0d236e4d4b967dafcd9" title="Next() visits the next node in the iteration.">TXMPIterator::Next()</a></code> delivers the schema URI, path, and option flags for the node being visited. If the node is simple, it also delivers the value. Qualifiers for this node are visited next. The fields of a struct or items of an array are visited after the qualifiers of the parent.<p>
+You can specify options when contructing the iteration object to control how the iteration is performed.<p>
+<ul>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635b26e1a38d1d0343fcc5bdaab1b60e3ed" title="Just do the immediate children of the root, default is subtree.">kXMP_IterJustChildren</a></code> - Visit just the immediate children of the root. Skip the root itself and all nodes below the immediate children. This omits the qualifiers of the immediate children, the qualifier nodes being below what they qualify. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266354589f99b5b4a55e785e3baf4fe1d9b19" title="Just do the leaf nodes, default is all nodes in the subtree.">kXMP_IterJustLeafNodes</a></code> - Visit just the leaf property nodes and their qualifiers. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635cf22e638f4144bcec8207b2ab69bb344" title="Return just the leaf part of the path, default is the full path.">kXMP_IterJustLeafName</a></code> - Return just the leaf component of the node names. The default is to return the full path name. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635c06dbc804df2e5ac24d77ca50a21fa08" title="Include aliases, default is just actual properties.">kXMP_IterIncludeAliases</a></code> - Include aliases as part of the iteration. Since aliases are not actual nodes the default iteration does not visit them. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266351b91947105ae68c48c5d5e36aa70d101" title="Omit all qualifiers.">kXMP_IterOmitQualifiers</a></code> - Do not visit the qualifiers of a node. </li>
+</ul>
+<hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="88e855c18b2b15f7b8a5ccf3b9398352"></a><!-- doxytag: member="TXMPIterator::TXMPIterator" ref="88e855c18b2b15f7b8a5ccf3b9398352" args="(const TXMPIterator&lt; tStringObj &gt; &amp;original)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPIterator.html">TXMPIterator</a> </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
+ <td class="paramname"> <em>original</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Copy constructor, creates a client object refering to the same internal object.
+<p>
+Creates a new client iterator that refers to the same underlying iterator as an existing object.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>original</em>&nbsp;</td><td>An existing iteration object to copy. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="5c1bd03e776a91cbb6fd02991fe08e1b"></a><!-- doxytag: member="TXMPIterator::TXMPIterator" ref="5c1bd03e776a91cbb6fd02991fe08e1b" args="(const TXMPMeta&lt; tStringObj &gt; &amp;xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPIterator.html">TXMPIterator</a> </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
+ <td class="paramname"> <em>xmpObj</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Constructs an iterator for properties within a schema in an XMP object.
+<p>
+See the class description for the general operation of an XMP object iterator. Overloaded forms are provided to iterate the entire data tree, a subtree rooted at a specific node, or properties within a specific schema.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmpObj</em>&nbsp;</td><td>The XMP object over which to iterate.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>Optional schema namespace URI to restrict the iteration. To visit all of the schema, pass 0 or the empty string "".</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>Optional property name to restrict the iteration. May be an arbitrary path expression. If provided, a schema URI must also be provided. To visit all properties, pass 0 or the empty string "".</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the iteration. A logical OR of these bit flag constants: <ul>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635b26e1a38d1d0343fcc5bdaab1b60e3ed" title="Just do the immediate children of the root, default is subtree.">kXMP_IterJustChildren</a></code> - Visit only the immediate children of the root; default visits subtrees. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266354589f99b5b4a55e785e3baf4fe1d9b19" title="Just do the leaf nodes, default is all nodes in the subtree.">kXMP_IterJustLeafNodes</a></code> - Visit only the leaf nodes; default visits all nodes. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635cf22e638f4144bcec8207b2ab69bb344" title="Return just the leaf part of the path, default is the full path.">kXMP_IterJustLeafName</a></code> - Return just the leaf part of the path; default returns the full path. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266351b91947105ae68c48c5d5e36aa70d101" title="Omit all qualifiers.">kXMP_IterOmitQualifiers</a></code> - Omit all qualifiers.</li>
+</ul>
+</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The new <a class="el" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a> object. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="3aab7b2ddd84f25e024d7c3e66161cac"></a><!-- doxytag: member="TXMPIterator::TXMPIterator" ref="3aab7b2ddd84f25e024d7c3e66161cac" args="(const TXMPMeta&lt; tStringObj &gt; &amp;xmpObj, XMP_StringPtr schemaNS, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPIterator.html">TXMPIterator</a> </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
+ <td class="paramname"> <em>xmpObj</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Constructs an iterator for a subtree of properties within an XMP object.
+<p>
+See the class description for the general operation of an XMP object iterator. Overloaded forms are provided to iterate the entire data tree, a subtree rooted at a specific node, or properties within a specific schema.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmpObj</em>&nbsp;</td><td>The XMP object over which to iterate.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>Optional schema namespace URI to restrict the iteration. To visit all of the schema, pass 0 or the empty string "".</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the iteration. A logical OR of these bit flag constants: <ul>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635b26e1a38d1d0343fcc5bdaab1b60e3ed" title="Just do the immediate children of the root, default is subtree.">kXMP_IterJustChildren</a></code> - Visit only the immediate children of the root; default visits subtrees. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266354589f99b5b4a55e785e3baf4fe1d9b19" title="Just do the leaf nodes, default is all nodes in the subtree.">kXMP_IterJustLeafNodes</a></code> - Visit only the leaf nodes; default visits all nodes. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635cf22e638f4144bcec8207b2ab69bb344" title="Return just the leaf part of the path, default is the full path.">kXMP_IterJustLeafName</a></code> - Return just the leaf part of the path; default returns the full path. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266351b91947105ae68c48c5d5e36aa70d101" title="Omit all qualifiers.">kXMP_IterOmitQualifiers</a></code> - Omit all qualifiers.</li>
+</ul>
+</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The new <a class="el" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a> object. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="b0965286a8cabeafc92fdc52f643003f"></a><!-- doxytag: member="TXMPIterator::TXMPIterator" ref="b0965286a8cabeafc92fdc52f643003f" args="(const TXMPMeta&lt; tStringObj &gt; &amp;xmpObj, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPIterator.html">TXMPIterator</a> </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
+ <td class="paramname"> <em>xmpObj</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Constructs an iterator for the entire data tree within an XMP object.
+<p>
+See the class description for the general operation of an XMP object iterator. Overloaded forms are provided to iterate the entire data tree, a subtree rooted at a specific node, or properties within a specific schema.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmpObj</em>&nbsp;</td><td>The XMP object over which to iterate.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the iteration. A logical OR of these bit flag constants: <ul>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635b26e1a38d1d0343fcc5bdaab1b60e3ed" title="Just do the immediate children of the root, default is subtree.">kXMP_IterJustChildren</a></code> - Visit only the immediate children of the root; default visits subtrees. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266354589f99b5b4a55e785e3baf4fe1d9b19" title="Just do the leaf nodes, default is all nodes in the subtree.">kXMP_IterJustLeafNodes</a></code> - Visit only the leaf nodes; default visits all nodes. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635cf22e638f4144bcec8207b2ab69bb344" title="Return just the leaf part of the path, default is the full path.">kXMP_IterJustLeafName</a></code> - Return just the leaf part of the path; default returns the full path. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266351b91947105ae68c48c5d5e36aa70d101" title="Omit all qualifiers.">kXMP_IterOmitQualifiers</a></code> - Omit all qualifiers.</li>
+</ul>
+</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The new <code><a class="el" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a></code> object. </dd></dl>
+
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="d767d731320d3f4c997c6ce9f7f8fa63"></a><!-- doxytag: member="TXMPIterator::operator=" ref="d767d731320d3f4c997c6ce9f7f8fa63" args="(const TXMPIterator&lt; tStringObj &gt; &amp;rhs)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt;::operator= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
+ <td class="paramname"> <em>rhs</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Assignment operator, assigns the internal ref and increments the ref count.
+<p>
+Assigns the internal reference from an existing object and increments the reference count on the underlying internal XMP iterator.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rhs</em>&nbsp;</td><td>An existing iteration object. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="124a1dd1ab3ff0d236e4d4b967dafcd9"></a><!-- doxytag: member="TXMPIterator::Next" ref="124a1dd1ab3ff0d236e4d4b967dafcd9" args="(tStringObj *schemaNS=0, tStringObj *propPath=0, tStringObj *propValue=0, XMP_OptionBits *options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt;::Next </td>
+ <td>(</td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>propPath</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>propValue</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPIterator.html#124a1dd1ab3ff0d236e4d4b967dafcd9" title="Next() visits the next node in the iteration.">Next()</a></code> visits the next node in the iteration.
+<p>
+Proceeds to the next node according to the options specified on creation of this object, and delivers the schema URI, path, and option flags for the node being visited. If the node is simple, it also delivers the value.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>[out] A string object in which to return the assigned the schema namespace URI of the current property. Can be null if the value is not wanted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propPath</em>&nbsp;</td><td>[out] A string object in which to return the XPath name of the current property. Can be null if the value is not wanted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>[out] A string object in which to return the value of the current property. Can be null if the value is not wanted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>[out] A buffer in which to return the flags describing the current property, which are a logical OR of <code><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a></code> bit-flag constants.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if there was another node to visit, false if the iteration is complete. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="30b4d78974b347e4fcd275f1f65a61b2"></a><!-- doxytag: member="TXMPIterator::Skip" ref="30b4d78974b347e4fcd275f1f65a61b2" args="(XMP_OptionBits options)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt;::Skip </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPIterator.html#30b4d78974b347e4fcd275f1f65a61b2" title="Skip() skips some portion of the remaining iterations.">Skip()</a></code> skips some portion of the remaining iterations.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the iteration, a logical OR of these bit-flag constants: <ul>
+<li><code><a class="el" href="XMP__Const_8h.html#0411cd49bb5b71852cecd93bcbf0ca2db0b540cd3841f411471a827f833c606e" title="Skip the subtree below the current node.">kXMP_IterSkipSubtree</a></code> - Skip the subtree below the current node. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#0411cd49bb5b71852cecd93bcbf0ca2d2537b4b8db838f85b47988b198cd2a12" title="Skip the subtree below and remaining siblings of the current node.">kXMP_IterSkipSiblings</a></code> - Skip the subtree below and remaining siblings of the current node. </li>
+</ul>
+</td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="TXMPIterator_8hpp-source.html">TXMPIterator.hpp</a></ul>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/XMPToolkit/classTXMPMeta-members.html b/docs/API/classTXMPMeta-members.html
index 8df4145..631e83a 100644
--- a/docs/XMPToolkit/classTXMPMeta-members.html
+++ b/docs/API/classTXMPMeta-members.html
@@ -1,22 +1,68 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Member List</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul></div>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
<h1>TXMPMeta&lt; tStringObj &gt; Member List</h1>This is the complete list of members for <a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a>, including all inherited members.<p><table>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#00d7314dc970ad390499ce9db27d314a">AppendArrayItem</a>(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits arrayOptions, XMP_StringPtr itemValue, XMP_OptionBits itemOptions=0)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#4f768a8cb35cabff1cf4187aa6a88dd3">AppendArrayItem</a>(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits arrayOptions, const tStringObj &amp;itemValue, XMP_OptionBits itemOptions=0)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
@@ -32,35 +78,36 @@
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#f22b116d71ecbbebea016ec5337e7066">DoesPropertyExist</a>(XMP_StringPtr schemaNS, XMP_StringPtr propName) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#81347a92becd387a14f4d47c582f129a">DoesQualifierExist</a>(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#9261b80d62e77a10ff1a89843bfa10a5">DoesStructFieldExist</a>(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#afb027f200b85467298d237a0c23949b">DumpAliases</a>(XMP_TextOutputProc outProc, void *refCon)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#44250140a710c0b7c5cc0881e387d004">DumpNamespaces</a>(XMP_TextOutputProc outProc, void *refCon)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#976c1eb889f44080f76628805712b618">DumpObject</a>(XMP_TextOutputProc outProc, void *refCon) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#c2e1bbfd6b9188afb730260808557512">DumpAliases</a>(XMP_TextOutputProc outProc, void *clientData)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#addc5f555de57472939a41346e276817">DumpNamespaces</a>(XMP_TextOutputProc outProc, void *clientData)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#466fa349c9765f39ca6b1450908e769f">DumpObject</a>(XMP_TextOutputProc outProc, void *clientData) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#df57895625ad118782ed48a3931848b7">Erase</a>()</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#c64a4251d157937f69b73f2ffac4f7cc">GetArrayItem</a>(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, tStringObj *itemValue, XMP_OptionBits *options) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#12b2435ba039c62a164951948c016eb4">GetGlobalOptions</a>()</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#4d35b44f1f017a27772ee902a3dacf04">GetInternalRef</a>() const</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#fbfebded0b85b08bd9c5ba0d7dae07e0">GetInternalRef</a>() const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#eefe49bbf669770d769f4fe0ea566bd0">GetLocalizedText</a>(XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, tStringObj *actualLang, tStringObj *itemValue, XMP_OptionBits *options) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#f28589472d8c0397db6cef868f2b8c97">GetNamespacePrefix</a>(XMP_StringPtr namespaceURI, tStringObj *namespacePrefix)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#a20c84e7549d0a3252fa29a1e83a757a">GetNamespaceURI</a>(XMP_StringPtr namespacePrefix, tStringObj *namespaceURI)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#b0d179ed95487d4fd4f2680c1fbe0d40">GetObjectName</a>(tStringObj *name) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#39aeaf9eb83cfc1c5455807b95f055f9">GetObjectOptions</a>() const</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#0bfc04142a35671a4c8989fcaca6d6c2">GetObjectOptions</a>() const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c">GetProperty</a>(XMP_StringPtr schemaNS, XMP_StringPtr propName, tStringObj *propValue, XMP_OptionBits *options) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#dcf8a1959a8bd42641a42cbd4d64a5b7">GetProperty_Bool</a>(XMP_StringPtr schemaNS, XMP_StringPtr propName, bool *propValue, XMP_OptionBits *options) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#2f561295e73047ee90765558d29bd650">GetProperty_Date</a>(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_DateTime *propValue, XMP_OptionBits *options) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#7708c31c9af3e740b27a4893dcd9aa47">GetProperty_Float</a>(XMP_StringPtr schemaNS, XMP_StringPtr propName, double *propValue, XMP_OptionBits *options) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#3b6ba486c02607b544917091c43b05cc">GetProperty_Int</a>(XMP_StringPtr schemaNS, XMP_StringPtr propName, long *propValue, XMP_OptionBits *options) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#d1a6629b0466981b67d31c9dc3840ea7">GetProperty_Int64</a>(XMP_StringPtr schemaNS, XMP_StringPtr propName, long long *propValue, XMP_OptionBits *options) const</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#669e0625cd271b6e7902fe0b51020402">GetProperty_Int64</a>(XMP_StringPtr schemaNS, XMP_StringPtr propName, long long *propValue, XMP_OptionBits *options) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#2cc58d8316043b035643e7c21633bc13">GetQualifier</a>(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, tStringObj *qualValue, XMP_OptionBits *options) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#e99d2bc414d5cd68851147aef6710d4a">GetStructField</a>(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, tStringObj *fieldValue, XMP_OptionBits *options) const</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#885ef7127b897e349f71fa493ace3c94">GetStructField</a>(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, tStringObj *fieldValue, XMP_OptionBits *options) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#5415cfc01a9cb8786939246571a23a9d">GetVersionInfo</a>(XMP_VersionInfo *info)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#bfddf1df0e01ab33d5636a80edc973ca">Initialize</a>()</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#f1defbb73f919eae06456a655dea726c">Initialize</a>()</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#4d5a601c9b77f6f6ab5f14e658de58ef">operator=</a>(const TXMPMeta&lt; tStringObj &gt; &amp;rhs)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26">ParseFromBuffer</a>(XMP_StringPtr buffer, XMP_StringLen bufferSize, XMP_OptionBits options=0)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#b9463c7459125ca0038db2e586c5e4df">RegisterAlias</a>(XMP_StringPtr aliasNS, XMP_StringPtr aliasProp, XMP_StringPtr actualNS, XMP_StringPtr actualProp, XMP_OptionBits arrayForm=kXMP_NoOptions)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#4c69d31a37ff24c85679229c479aa1ac">RegisterNamespace</a>(XMP_StringPtr namespaceURI, XMP_StringPtr suggestedPrefix, tStringObj *registeredPrefix)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#c47027a765b6365e268f4de3e61b006a">RegisterAlias</a>(XMP_StringPtr aliasNS, XMP_StringPtr aliasProp, XMP_StringPtr actualNS, XMP_StringPtr actualProp, XMP_OptionBits arrayForm=kXMP_NoOptions)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#c0368ddbaa4d689cd5b1aff1c88bb0e1">RegisterNamespace</a>(XMP_StringPtr namespaceURI, XMP_StringPtr suggestedPrefix, tStringObj *registeredPrefix)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#b77cf73fa0cc63d845f113b3d1c83602">RegisterStandardAliases</a>(XMP_StringPtr schemaNS)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#c4b9c75202f2b961ad92f10a9e504e9a">ResolveAlias</a>(XMP_StringPtr aliasNS, XMP_StringPtr aliasProp, tStringObj *actualNS, tStringObj *actualProp, XMP_OptionBits *arrayForm)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49">SerializeToBuffer</a>(tStringObj *rdfString, XMP_OptionBits options, XMP_StringLen padding, XMP_StringPtr newline, XMP_StringPtr indent=&quot;&quot;, XMP_Index baseIndent=0) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#34143727d979b47a2f2209367aec9a1c">SerializeToBuffer</a>(tStringObj *rdfString, XMP_OptionBits options=0, XMP_StringLen padding=0) const</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#0d98bc15bdb0f45737b15fc6822f3bc6">SerializeToBuffer</a>(tStringObj *rdfString, XMP_OptionBits options=0, XMP_StringLen padding=0) const </td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#1570eb89d613b4a94ca572e4644168cc">SetArrayItem</a>(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, XMP_StringPtr itemValue, XMP_OptionBits options=0)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#15720ee8e732232fa25989870cf99846">SetArrayItem</a>(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, const tStringObj &amp;itemValue, XMP_OptionBits options=0)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#e7bb38d9b3857b08106630a386b47332">SetGlobalOptions</a>(XMP_OptionBits options)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
@@ -80,14 +127,15 @@
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#c395e094cab251a0593d508594b21521">SetQualifier</a>(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, const tStringObj &amp;qualValue, XMP_OptionBits options=0)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#0e44c30e7527064909e5f7035d53c4f5">SetStructField</a>(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, XMP_OptionBits options=0)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#77d4a1bf7831f39073af9ea1544ebefa">SetStructField</a>(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, const tStringObj &amp;fieldValue, XMP_OptionBits options=0)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#8ac5a02a13d439ff33ed4431986da681">Sort</a>()</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#6c30fae26173167958b6f0da95a53865">Terminate</a>()</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#7729cbce91956632289b88d85fdc65ae">TXMPMeta</a>()</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#21a4d06fc2e77b28991bb900f0f48e50">TXMPMeta</a>(const TXMPMeta&lt; tStringObj &gt; &amp;original)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#61ffb3aa3e387d8ff9c1f4ebd26606c7">TXMPMeta</a>()</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPMeta.html#da43d63894350e23a4307c41b7335eca">TXMPMeta</a>(const TXMPMeta&lt; tStringObj &gt; &amp;original)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#cbe8f556a5b32542c44fa9de9648ad41">TXMPMeta</a>(XMPMetaRef xmpRef)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#05199e2a4bc61db7aed207759e899bc2">TXMPMeta</a>(XMP_StringPtr buffer, XMP_StringLen xmpSize)</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPMeta.html#bab5013870cd47eb0d9d701653735a02">~TXMPMeta</a>()</td><td><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td><code> [virtual]</code></td></tr>
-</table><hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:59 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
+</table></div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
</body>
</html>
diff --git a/docs/API/classTXMPMeta.html b/docs/API/classTXMPMeta.html
new file mode 100644
index 0000000..3a1de8e
--- /dev/null
+++ b/docs/API/classTXMPMeta.html
@@ -0,0 +1,3610 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: TXMPMeta&lt; tStringObj &gt; Class Template Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>TXMPMeta&lt; tStringObj &gt; Class Template Reference</h1><!-- doxytag: class="TXMPMeta" -->API for access to the XMP Toolkit core services.
+<a href="#_details">More...</a>
+<p>
+<code>#include &lt;<a class="el" href="TXMPMeta_8hpp-source.html">TXMPMeta.hpp</a>&gt;</code>
+<p>
+
+<p>
+<a href="classTXMPMeta-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Constructors and destructor</div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">*&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#61ffb3aa3e387d8ff9c1f4ebd26606c7">TXMPMeta</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Default constructor, creates an empty object. <a href="#61ffb3aa3e387d8ff9c1f4ebd26606c7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">*&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#da43d63894350e23a4307c41b7335eca">TXMPMeta</a> (const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;original)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Copy constructor, creates a client object refering to the same internal object. <a href="#da43d63894350e23a4307c41b7335eca"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#4d5a601c9b77f6f6ab5f14e658de58ef">operator=</a> (const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;rhs)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Assignment operator, assigns the internal reference and increments the reference count. <a href="#4d5a601c9b77f6f6ab5f14e658de58ef"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#cbe8f556a5b32542c44fa9de9648ad41">TXMPMeta</a> (<a class="el" href="XMP__Const_8h.html#549d5e2cbcb58302d3df840a0205283e">XMPMetaRef</a> xmpRef)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Reconstructs an XMP object from an internal reference. <a href="#cbe8f556a5b32542c44fa9de9648ad41"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#05199e2a4bc61db7aed207759e899bc2">TXMPMeta</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> buffer, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> xmpSize)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constructs an object and parse one buffer of RDF into it. <a href="#05199e2a4bc61db7aed207759e899bc2"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bab5013870cd47eb0d9d701653735a02"></a><!-- doxytag: member="TXMPMeta::~TXMPMeta" ref="bab5013870cd47eb0d9d701653735a02" args="()" -->
+virtual&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#bab5013870cd47eb0d9d701653735a02">~TXMPMeta</a> () throw ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Destructor, typical virtual destructor. */. <br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Accessing property values</div></td></tr>
+<tr><td colspan="2"><div class="groupText">The property value accessors all take a property specification; the top level namespace URI (the "schema" namespace) and the basic name of the property being referenced. See the introductory discussion of path expression usage for more information.<p>
+The accessor functions return true if the specified property exists. If it does, output parameters return the value (if any) and option flags describing the property. The option bit-flag constants that describe properties are <code>kXMP_PropXx</code> and <code>kXMP_ArrayIsXx</code>. See <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ab51f87b5c48f47f5cefb9e03293dafb" title="The XML string form of the property value is a URI, use rdf:resource attribute. DISCOURAGED...">kXMP_PropValueIsURI</a></code> and following, and macros <code><a class="el" href="XMP__Const_8h.html#510b75338bd488ddd8d9bd4e326806f9" title="Macro reports the property type specified by an options flag.">XMP_PropIsSimple</a></code> and following in <code><a class="el" href="XMP__Const_8h.html" title="Common C/C++ types and constants for the XMP toolkit.">XMP_Const.h</a></code>. If the property exists and has a value, it is returned as a Unicode string in UTF-8 encoding. Arrays and the non-leaf levels of structs do not have values. <br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c">GetProperty</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, tStringObj *propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> reports whether a property exists, and retrieves its value. <a href="#06a3241c7fa5df87f61dff02fca23a0c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#c64a4251d157937f69b73f2ffac4f7cc">GetArrayItem</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex, tStringObj *itemValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#c64a4251d157937f69b73f2ffac4f7cc" title="GetArrayItem() provides access to items within an array.">GetArrayItem()</a></code> provides access to items within an array. <a href="#c64a4251d157937f69b73f2ffac4f7cc"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#885ef7127b897e349f71fa493ace3c94">GetStructField</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName, tStringObj *fieldValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#885ef7127b897e349f71fa493ace3c94" title="GetStructField() provides access to fields within a nested structure.">GetStructField()</a></code> provides access to fields within a nested structure. <a href="#885ef7127b897e349f71fa493ace3c94"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#2cc58d8316043b035643e7c21633bc13">GetQualifier</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName, tStringObj *qualValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#2cc58d8316043b035643e7c21633bc13" title="GetQualifier() provides access to a qualifier attached to a property.">GetQualifier()</a></code> provides access to a qualifier attached to a property. <a href="#2cc58d8316043b035643e7c21633bc13"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Creating properties and setting their values</div></td></tr>
+<tr><td colspan="2"><div class="groupText">These functions all take a property specification; the top level namespace URI (the "schema" namespace) and the basic name of the property being referenced. See the introductory discussion of path expression usage for more information.<p>
+All of the functions take a UTF-8 encoded Unicode string for the property value. Arrays and non-leaf levels of structs do not have values. The value can be passed as an <code><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a></code> (a pointer to a null-terminated string), or as a string object (<code>tStringObj</code>). <br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#1dfd6a08ebfd1a6364b3a7b6584bcc28">SetProperty</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#1dfd6a08ebfd1a6364b3a7b6584bcc28" title="SetProperty() creates or sets a property value.">SetProperty()</a></code> creates or sets a property value. <a href="#1dfd6a08ebfd1a6364b3a7b6584bcc28"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#cc50625611f6aad405aa47197b6d0055">SetProperty</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, const tStringObj &amp;propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#1dfd6a08ebfd1a6364b3a7b6584bcc28" title="SetProperty() creates or sets a property value.">SetProperty()</a></code> creates or sets a property value using a string object. <a href="#cc50625611f6aad405aa47197b6d0055"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#1570eb89d613b4a94ca572e4644168cc">SetArrayItem</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> itemValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#1570eb89d613b4a94ca572e4644168cc" title="SetArrayItem() creates or sets the value of an item within an array.">SetArrayItem()</a></code> creates or sets the value of an item within an array. <a href="#1570eb89d613b4a94ca572e4644168cc"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#15720ee8e732232fa25989870cf99846">SetArrayItem</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex, const tStringObj &amp;itemValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#1570eb89d613b4a94ca572e4644168cc" title="SetArrayItem() creates or sets the value of an item within an array.">SetArrayItem()</a></code> creates or sets the value of an item within an array using a string object. <a href="#15720ee8e732232fa25989870cf99846"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#00d7314dc970ad390499ce9db27d314a">AppendArrayItem</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> arrayOptions, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> itemValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> itemOptions=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#00d7314dc970ad390499ce9db27d314a" title="AppendArrayItem() adds an item to an array, creating the array if necessary.">AppendArrayItem()</a></code> adds an item to an array, creating the array if necessary. <a href="#00d7314dc970ad390499ce9db27d314a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#4f768a8cb35cabff1cf4187aa6a88dd3">AppendArrayItem</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> arrayOptions, const tStringObj &amp;itemValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> itemOptions=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#00d7314dc970ad390499ce9db27d314a" title="AppendArrayItem() adds an item to an array, creating the array if necessary.">AppendArrayItem()</a></code> adds an item to an array using a string object value, creating the array if necessary. <a href="#4f768a8cb35cabff1cf4187aa6a88dd3"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#0e44c30e7527064909e5f7035d53c4f5">SetStructField</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#0e44c30e7527064909e5f7035d53c4f5" title="SetStructField() creates or sets the value of a field within a nested structure.">SetStructField()</a></code> creates or sets the value of a field within a nested structure. <a href="#0e44c30e7527064909e5f7035d53c4f5"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#77d4a1bf7831f39073af9ea1544ebefa">SetStructField</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName, const tStringObj &amp;fieldValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#0e44c30e7527064909e5f7035d53c4f5" title="SetStructField() creates or sets the value of a field within a nested structure.">SetStructField()</a></code> creates or sets the value of a field within a nested structure, using a string object. <a href="#77d4a1bf7831f39073af9ea1544ebefa"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#c2e798da5f9d94e486382a41e73fcea3">SetQualifier</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#c2e798da5f9d94e486382a41e73fcea3" title="SetQualifier() creates or sets a qualifier attached to a property.">SetQualifier()</a></code> creates or sets a qualifier attached to a property. <a href="#c2e798da5f9d94e486382a41e73fcea3"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#c395e094cab251a0593d508594b21521">SetQualifier</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName, const tStringObj &amp;qualValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#c2e798da5f9d94e486382a41e73fcea3" title="SetQualifier() creates or sets a qualifier attached to a property.">SetQualifier()</a></code> creates or sets a qualifier attached to a property using a string object. <a href="#c395e094cab251a0593d508594b21521"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Detecting and deleting properties.</div></td></tr>
+<tr><td colspan="2"><div class="groupText">The namespace URI and prefix usage for property specifiers in these functions is the same as for <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">TXMPMeta::GetProperty()</a></code>. <br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#c8b555ba99904fa49bb4851a60cc3844">DeleteProperty</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#c8b555ba99904fa49bb4851a60cc3844" title="DeleteProperty() deletes an XMP subtree rooted at a given property.">DeleteProperty()</a></code> deletes an XMP subtree rooted at a given property. <a href="#c8b555ba99904fa49bb4851a60cc3844"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#bc1211f47225b5973a170ff952743264">DeleteArrayItem</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#bc1211f47225b5973a170ff952743264" title="DeleteArrayItem() deletes an XMP subtree rooted at a given array item.">DeleteArrayItem()</a></code> deletes an XMP subtree rooted at a given array item. <a href="#bc1211f47225b5973a170ff952743264"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#bc258e027780a15be65a88fcfd4e1fd4">DeleteStructField</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#bc258e027780a15be65a88fcfd4e1fd4" title="DeleteStructField() deletes an XMP subtree rooted at a given struct field.">DeleteStructField()</a></code> deletes an XMP subtree rooted at a given struct field. <a href="#bc258e027780a15be65a88fcfd4e1fd4"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#8ce15f7de7fd3b258f07158ab5fa88be">DeleteQualifier</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#8ce15f7de7fd3b258f07158ab5fa88be" title="DeleteQualifier() deletes an XMP subtree rooted at a given qualifier.">DeleteQualifier()</a></code> deletes an XMP subtree rooted at a given qualifier. <a href="#8ce15f7de7fd3b258f07158ab5fa88be"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#f22b116d71ecbbebea016ec5337e7066">DoesPropertyExist</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#f22b116d71ecbbebea016ec5337e7066" title="DoesPropertyExist() reports whether a property currently exists.">DoesPropertyExist()</a></code> reports whether a property currently exists. <a href="#f22b116d71ecbbebea016ec5337e7066"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#492465c588d6d4cb8e30f94790e66f58">DoesArrayItemExist</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#492465c588d6d4cb8e30f94790e66f58" title="DoesArrayItemExist() reports whether an array item currently exists.">DoesArrayItemExist()</a></code> reports whether an array item currently exists. <a href="#492465c588d6d4cb8e30f94790e66f58"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#9261b80d62e77a10ff1a89843bfa10a5">DoesStructFieldExist</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#9261b80d62e77a10ff1a89843bfa10a5" title="DoesStructFieldExist() reports whether a struct field currently exists.">DoesStructFieldExist()</a></code> reports whether a struct field currently exists. <a href="#9261b80d62e77a10ff1a89843bfa10a5"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#81347a92becd387a14f4d47c582f129a">DoesQualifierExist</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#81347a92becd387a14f4d47c582f129a" title="DoesQualifierExist() reports whether a qualifier currently exists.">DoesQualifierExist()</a></code> reports whether a qualifier currently exists. <a href="#81347a92becd387a14f4d47c582f129a"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Accessing properties as binary values.</div></td></tr>
+<tr><td colspan="2"><div class="groupText">These are very similar to <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">TXMPMeta::GetProperty()</a></code> and <code><a class="el" href="classTXMPMeta.html#1dfd6a08ebfd1a6364b3a7b6584bcc28" title="SetProperty() creates or sets a property value.">TXMPMeta::SetProperty()</a></code>, except that the value is returned or provided in binary form instead of as a UTF-8 string. <code><a class="el" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a></code> provides functions for converting between binary and string values. Use the path composition functions in <code><a class="el" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a></code> to compose complex path expressions for fields or items in nested structures or arrays, or for qualifiers. <br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#dcf8a1959a8bd42641a42cbd4d64a5b7">GetProperty_Bool</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, bool *propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#dcf8a1959a8bd42641a42cbd4d64a5b7" title="GetProperty_Bool() retrieves the value of a Boolean property as a C++ bool.">GetProperty_Bool()</a></code> retrieves the value of a Boolean property as a C++ bool. <a href="#dcf8a1959a8bd42641a42cbd4d64a5b7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#3b6ba486c02607b544917091c43b05cc">GetProperty_Int</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, long *propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#3b6ba486c02607b544917091c43b05cc" title="GetProperty_Int() retrieves the value of an integer property as a C long integer...">GetProperty_Int()</a></code> retrieves the value of an integer property as a C long integer. <a href="#3b6ba486c02607b544917091c43b05cc"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#669e0625cd271b6e7902fe0b51020402">GetProperty_Int64</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, long long *propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#669e0625cd271b6e7902fe0b51020402" title="GetProperty_Int64() retrieves the value of an integer property as a C long long integer...">GetProperty_Int64()</a></code> retrieves the value of an integer property as a C long long integer. <a href="#669e0625cd271b6e7902fe0b51020402"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#7708c31c9af3e740b27a4893dcd9aa47">GetProperty_Float</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, double *propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#7708c31c9af3e740b27a4893dcd9aa47" title="GetProperty_Float() retrieves the value of a floating-point property as a C double...">GetProperty_Float()</a></code> retrieves the value of a floating-point property as a C double float. <a href="#7708c31c9af3e740b27a4893dcd9aa47"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#2f561295e73047ee90765558d29bd650">GetProperty_Date</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#2f561295e73047ee90765558d29bd650" title="GetProperty_Date() retrieves the value of a date-time property as an XMP_DateTime...">GetProperty_Date()</a></code> retrieves the value of a date-time property as an <code><a class="el" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a></code> structure. <a href="#2f561295e73047ee90765558d29bd650"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#9521e3838272ec501ffdb60ff3eb482f">SetProperty_Bool</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, bool propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#9521e3838272ec501ffdb60ff3eb482f" title="SetProperty_Bool() sets the value of a Boolean property using a C++ bool.">SetProperty_Bool()</a></code> sets the value of a Boolean property using a C++ bool. <a href="#9521e3838272ec501ffdb60ff3eb482f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#b8ae94130d9a05c1b9a3ee25588b6421">SetProperty_Int</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, long propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#b8ae94130d9a05c1b9a3ee25588b6421" title="SetProperty_Int() sets the value of an integer property using a C long integer.">SetProperty_Int()</a></code> sets the value of an integer property using a C long integer. <a href="#b8ae94130d9a05c1b9a3ee25588b6421"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#df919aff205e934e4c8250a067f7b377">SetProperty_Int64</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, long long propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#df919aff205e934e4c8250a067f7b377" title="SetProperty_Int64() sets the value of an integer property using a C long long integer...">SetProperty_Int64()</a></code> sets the value of an integer property using a C long long integer. <a href="#df919aff205e934e4c8250a067f7b377"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#3b0f2f6bae57931ea96775f03608c0ed">SetProperty_Float</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, double propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#3b0f2f6bae57931ea96775f03608c0ed" title="SetProperty_Float() sets the value of a floating-point property using a C double...">SetProperty_Float()</a></code> sets the value of a floating-point property using a C double float. <a href="#3b0f2f6bae57931ea96775f03608c0ed"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#eee10669445f77139d5634199ff01079">SetProperty_Date</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, const <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> &amp;propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#eee10669445f77139d5634199ff01079" title="SetProperty_Date() sets the value of a date/time property using an XMP_DateTime structure...">SetProperty_Date()</a></code> sets the value of a date/time property using an <code><a class="el" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a></code> structure. <a href="#eee10669445f77139d5634199ff01079"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Accessing localized text (alt-text) properties.</div></td></tr>
+<tr><td colspan="2"><div class="groupText">Localized text properties are stored in alt-text arrays. They allow multiple concurrent localizations of a property value, for example a document title or copyright in several languages.<p>
+These functions provide convenient support for localized text properties, including a number of special and obscure aspects. The most important aspect of these functions is that they select an appropriate array item based on one or two RFC 3066 language tags. One of these languages, the "specific" language, is preferred and selected if there is an exact match. For many languages it is also possible to define a "generic" language that can be used if there is no specific language match. The generic language must be a valid RFC 3066 primary subtag, or the empty string.<p>
+For example, a specific language of "en-US" should be used in the US, and a specific language of "en-UK" should be used in England. It is also appropriate to use "en" as the generic language in each case. If a US document goes to England, the "en-US" title is selected by using the "en" generic language and the "en-UK" specific language.<p>
+It is considered poor practice, but allowed, to pass a specific language that is just an RFC 3066 primary tag. For example "en" is not a good specific language, it should only be used as a generic language. Passing "i" or "x" as the generic language is also considered poor practice but allowed.<p>
+Advice from the W3C about the use of RFC 3066 language tags can be found at: <ul>
+<li><a href="http://www.w3.org/International/articles/language-tags/">http://www.w3.org/International/articles/language-tags/</a></li>
+</ul>
+<dl class="note" compact><dt><b>Note:</b></dt><dd>RFC 3066 language tags must be treated in a case insensitive manner. The XMP toolkit does this by normalizing their capitalization: <ul>
+<li>The primary subtag is lower case, the suggested practice of ISO 639. </li>
+<li>All 2 letter secondary subtags are upper case, the suggested practice of ISO 3166. </li>
+<li>All other subtags are lower case.</li>
+</ul>
+The XMP specification defines an artificial language, "x-default", that is used to explicitly denote a default item in an alt-text array. The XMP toolkit normalizes alt-text arrays such that the x-default item is the first item. The <code><a class="el" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19" title="SetLocalizedText() modifies the value of a selected item in an alt-text array.">SetLocalizedText()</a></code> function has several special features related to the x-default item, see its description for details. </dd></dl>
+<br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#eefe49bbf669770d769f4fe0ea566bd0">GetLocalizedText</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> altTextName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> genericLang, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> specificLang, tStringObj *actualLang, tStringObj *itemValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#eefe49bbf669770d769f4fe0ea566bd0" title="GetLocalizedText() retrieves information about a selected item in an alt-text array...">GetLocalizedText()</a></code> retrieves information about a selected item in an alt-text array. <a href="#eefe49bbf669770d769f4fe0ea566bd0"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19">SetLocalizedText</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> altTextName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> genericLang, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> specificLang, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> itemValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19" title="SetLocalizedText() modifies the value of a selected item in an alt-text array.">SetLocalizedText()</a></code> modifies the value of a selected item in an alt-text array. <a href="#f9531b949a462f5663b1f3fd99464c19"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#81273a152fb7b19e99c62ee39bf723f2">SetLocalizedText</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> altTextName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> genericLang, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> specificLang, const tStringObj &amp;itemValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19" title="SetLocalizedText() modifies the value of a selected item in an alt-text array.">SetLocalizedText()</a></code> modifies the value of a selected item in an alt-text array using a string object. <a href="#81273a152fb7b19e99c62ee39bf723f2"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Creating and reading serialized RDF.</div></td></tr>
+<tr><td colspan="2"><div class="groupText">The metadata contained in an XMP object must be serialized as RDF for storage in an XMP packet and output to a file. Similarly, metadata in the form of serialized RDF (such as metadata read from a file using <code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code>) must be parsed into an XMP object for manipulation with the XMP Toolkit.<p>
+These functions support parsing serialized RDF into an XMP object, and serializing an XMP object into RDF. The input for parsing can be any valid Unicode encoding. ISO Latin-1 is also recognized, but its use is strongly discouraged. Serialization is always as UTF-8. <br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26">ParseFromBuffer</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> buffer, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> bufferSize, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26" title="ParseFromBuffer() parses RDF from a series of input buffers into this XMP object...">ParseFromBuffer()</a></code> parses RDF from a series of input buffers into this XMP object. <a href="#7b383f5b357fff040cdbde82f4f43f26"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49">SerializeToBuffer</a> (tStringObj *rdfString, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> padding, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> newline, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> indent=&quot;&quot;, <a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> baseIndent=0) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49" title="SerializeToBuffer() serializes metadata in this XMP object into a string as RDF.">SerializeToBuffer()</a></code> serializes metadata in this XMP object into a string as RDF. <a href="#2774a6f15ae22f0002201b58c46bfb49"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#0d98bc15bdb0f45737b15fc6822f3bc6">SerializeToBuffer</a> (tStringObj *rdfString, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> padding=0) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49" title="SerializeToBuffer() serializes metadata in this XMP object into a string as RDF.">SerializeToBuffer()</a></code> serializes metadata in this XMP object into a string as RDF. <a href="#0d98bc15bdb0f45737b15fc6822f3bc6"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Helper functions.</div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="XMP__Const_8h.html#549d5e2cbcb58302d3df840a0205283e">XMPMetaRef</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#fbfebded0b85b08bd9c5ba0d7dae07e0">GetInternalRef</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Retrieves an internal reference that can be safely passed across DLL boundaries and reconstructed. <a href="#fbfebded0b85b08bd9c5ba0d7dae07e0"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#b0d179ed95487d4fd4f2680c1fbe0d40">GetObjectName</a> (tStringObj *name) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#b0d179ed95487d4fd4f2680c1fbe0d40" title="GetObjectName() retrieves the client-assigned name of this XMP object.">GetObjectName()</a></code> retrieves the client-assigned name of this XMP object. <a href="#b0d179ed95487d4fd4f2680c1fbe0d40"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#cf1935be8e4849976dfc02325424960a">SetObjectName</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> name)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#cf1935be8e4849976dfc02325424960a" title="SetObjectName() assigns a name to this XMP object.">SetObjectName()</a></code> assigns a name to this XMP object. <a href="#cf1935be8e4849976dfc02325424960a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#fd059cc7cd9f906e12dab04e380e495c">SetObjectName</a> (tStringObj name)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#cf1935be8e4849976dfc02325424960a" title="SetObjectName() assigns a name to this XMP object.">SetObjectName()</a></code> assigns a name to this XMP object. <a href="#fd059cc7cd9f906e12dab04e380e495c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#8ac5a02a13d439ff33ed4431986da681">Sort</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#8ac5a02a13d439ff33ed4431986da681" title="Sort() sorts the data model tree of an XMP object.">Sort()</a></code> sorts the data model tree of an XMP object. <a href="#8ac5a02a13d439ff33ed4431986da681"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="df57895625ad118782ed48a3931848b7"></a><!-- doxytag: member="TXMPMeta::Erase" ref="df57895625ad118782ed48a3931848b7" args="()" -->
+void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#df57895625ad118782ed48a3931848b7">Erase</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#df57895625ad118782ed48a3931848b7" title="Erase() restores the object to a &quot;just constructed&quot; state.">Erase()</a></code> restores the object to a "just constructed" state. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#6ca653436995bbb76315efe7934afd4c">Clone</a> (<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#6ca653436995bbb76315efe7934afd4c" title="Clone() creates a deep copy of an XMP object.">Clone()</a></code> creates a deep copy of an XMP object. <a href="#6ca653436995bbb76315efe7934afd4c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#b79aae864b3ce190d0699252f48e0acc">CountArrayItems</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#b79aae864b3ce190d0699252f48e0acc" title="CountArrayItems() reports the number of items currently defined in an array.">CountArrayItems()</a></code> reports the number of items currently defined in an array. <a href="#b79aae864b3ce190d0699252f48e0acc"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Status</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#466fa349c9765f39ca6b1450908e769f">DumpObject</a> (<a class="el" href="XMP__Const_8h.html#8ce3570e6e5ac14cd603e96fa9d2936f">XMP_TextOutputProc</a> outProc, void *clientData) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#466fa349c9765f39ca6b1450908e769f" title="DumpObject() outputs the content of an XMP object to a callback handler for debugging...">DumpObject()</a></code> outputs the content of an XMP object to a callback handler for debugging. <a href="#466fa349c9765f39ca6b1450908e769f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0bfc04142a35671a4c8989fcaca6d6c2"></a><!-- doxytag: member="TXMPMeta::GetObjectOptions" ref="0bfc04142a35671a4c8989fcaca6d6c2" args="() const " -->
+<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#0bfc04142a35671a4c8989fcaca6d6c2">GetObjectOptions</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Not implemented. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="92055b3ae18dfd5e5491108f59318f17"></a><!-- doxytag: member="TXMPMeta::SetObjectOptions" ref="92055b3ae18dfd5e5491108f59318f17" args="(XMP_OptionBits options)" -->
+void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#92055b3ae18dfd5e5491108f59318f17">SetObjectOptions</a> (<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Not implemented. <br></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Initialization and termination</div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#5415cfc01a9cb8786939246571a23a9d">GetVersionInfo</a> (<a class="el" href="structXMP__VersionInfo.html">XMP_VersionInfo</a> *info)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#5415cfc01a9cb8786939246571a23a9d" title="GetVersionInfo() retrieves runtime version information.">GetVersionInfo()</a></code> retrieves runtime version information. <a href="#5415cfc01a9cb8786939246571a23a9d"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">*static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#f1defbb73f919eae06456a655dea726c">Initialize</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#f1defbb73f919eae06456a655dea726c" title="Initialize() explicitly initializes the XMP Toolkit before use. */">Initialize()</a></code> explicitly initializes the XMP Toolkit before use. */ <a href="#f1defbb73f919eae06456a655dea726c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#6c30fae26173167958b6f0da95a53865">Terminate</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#6c30fae26173167958b6f0da95a53865" title="Terminate() explicitly terminates usage of the XMP Toolkit.">Terminate()</a></code> explicitly terminates usage of the XMP Toolkit. <a href="#6c30fae26173167958b6f0da95a53865"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Global option flags</div></td></tr>
+<tr><td colspan="2"><div class="groupText">Global option flags affect the overall behavior of the XMP Toolkit. The available options will be declared in <code><a class="el" href="XMP__Const_8h.html" title="Common C/C++ types and constants for the XMP toolkit.">XMP_Const.h</a></code>. There are none in this version of the Toolkit. <br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#12b2435ba039c62a164951948c016eb4">GetGlobalOptions</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#12b2435ba039c62a164951948c016eb4" title="GetGlobalOptions() retrieves the set of global option flags. There are none in this...">GetGlobalOptions()</a></code> retrieves the set of global option flags. There are none in this version of the Toolkit. <a href="#12b2435ba039c62a164951948c016eb4"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#e7bb38d9b3857b08106630a386b47332">SetGlobalOptions</a> (<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#e7bb38d9b3857b08106630a386b47332" title="SetGlobalOptions() updates the set of global option flags. There are none in this...">SetGlobalOptions()</a></code> updates the set of global option flags. There are none in this version of the Toolkit. <a href="#e7bb38d9b3857b08106630a386b47332"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Internal data structure dump utilities</div></td></tr>
+<tr><td colspan="2"><div class="groupText">These are debugging utilities that dump internal data structures, to be handled by client-defined callback described in <code><a class="el" href="XMP__Const_8h.html" title="Common C/C++ types and constants for the XMP toolkit.">XMP_Const.h</a></code>.<p>
+<dl class="see" compact><dt><b>See also:</b></dt><dd>Member function <code><a class="el" href="classTXMPMeta.html#466fa349c9765f39ca6b1450908e769f" title="DumpObject() outputs the content of an XMP object to a callback handler for debugging...">TXMPMeta::DumpObject()</a></code> </dd></dl>
+<br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static <a class="el" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Status</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#addc5f555de57472939a41346e276817">DumpNamespaces</a> (<a class="el" href="XMP__Const_8h.html#8ce3570e6e5ac14cd603e96fa9d2936f">XMP_TextOutputProc</a> outProc, void *clientData)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#addc5f555de57472939a41346e276817" title="DumpNamespaces() sends the list of registered namespace URIs and prefixes to a handler...">DumpNamespaces()</a></code> sends the list of registered namespace URIs and prefixes to a handler. <a href="#addc5f555de57472939a41346e276817"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static <a class="el" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Status</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#c2e1bbfd6b9188afb730260808557512">DumpAliases</a> (<a class="el" href="XMP__Const_8h.html#8ce3570e6e5ac14cd603e96fa9d2936f">XMP_TextOutputProc</a> outProc, void *clientData)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#c2e1bbfd6b9188afb730260808557512" title="DumpAliases() sends the list of registered aliases and corresponding actuals to a...">DumpAliases()</a></code> sends the list of registered aliases and corresponding actuals to a handler. <a href="#c2e1bbfd6b9188afb730260808557512"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Namespace Functions</div></td></tr>
+<tr><td colspan="2"><div class="groupText">Namespaces must be registered before use in namespace URI parameters or path expressions. Within the XMP Toolkit the registered namespace URIs and prefixes must be unique. Additional namespaces encountered when parsing RDF are automatically registered.<p>
+The namespace URI should always end in an XML name separator such as '/' or '#'. This is because some forms of RDF shorthand catenate a namespace URI with an element name to form a new URI. <br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">*static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#c0368ddbaa4d689cd5b1aff1c88bb0e1">RegisterNamespace</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> namespaceURI, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> suggestedPrefix, tStringObj *registeredPrefix)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#c0368ddbaa4d689cd5b1aff1c88bb0e1" title="RegisterNamespace() registers a namespace URI with a suggested prefix.">RegisterNamespace()</a></code> registers a namespace URI with a suggested prefix. <a href="#c0368ddbaa4d689cd5b1aff1c88bb0e1"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#f28589472d8c0397db6cef868f2b8c97">GetNamespacePrefix</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> namespaceURI, tStringObj *namespacePrefix)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#f28589472d8c0397db6cef868f2b8c97" title="GetNamespacePrefix() obtains the prefix for a registered namespace URI, and reports...">GetNamespacePrefix()</a></code> obtains the prefix for a registered namespace URI, and reports whether the URI is registered. <a href="#f28589472d8c0397db6cef868f2b8c97"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#a20c84e7549d0a3252fa29a1e83a757a">GetNamespaceURI</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> namespacePrefix, tStringObj *namespaceURI)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#a20c84e7549d0a3252fa29a1e83a757a" title="GetNamespaceURI() obtains the URI for a registered namespace prefix, and reports...">GetNamespaceURI()</a></code> obtains the URI for a registered namespace prefix, and reports whether the prefix is registered. <a href="#a20c84e7549d0a3252fa29a1e83a757a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#3f989597e95db929676273cacd4ea09a">DeleteNamespace</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> namespaceURI)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Not implemented. <a href="#3f989597e95db929676273cacd4ea09a"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Alias functions</div></td></tr>
+<tr><td colspan="2"><div class="groupText">Aliases in XMP serve the same purpose as Windows file shortcuts, Mac OS file aliases, or UNIX file symbolic links. The aliases are multiple names for the same property. One distinction of XMP aliases is that they are ordered. An alias name points to an actual name; the primary significance of the actual name is that it is the preferred name for output, generally the most widely recognized name.<p>
+XMP restricts the names that can be aliased. The alias must be a top-level property name, not a field within a structure or an element within an array. The actual can be a top-level property name, the first element within a top-level array, or the default element in an alt-text array. This does not mean the alias can only be a simple property; you can alias a top-level structure or array to an identical top-level structure or array, or to the first item of an array of structures. <br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">*static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#c47027a765b6365e268f4de3e61b006a">RegisterAlias</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasProp, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> actualNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> actualProp, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> arrayForm=kXMP_NoOptions)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#c47027a765b6365e268f4de3e61b006a" title="RegisterAlias() associates an alias name with an actual name.">RegisterAlias()</a></code> associates an alias name with an actual name. <a href="#c47027a765b6365e268f4de3e61b006a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#c4b9c75202f2b961ad92f10a9e504e9a">ResolveAlias</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasProp, tStringObj *actualNS, tStringObj *actualProp, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *arrayForm)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#c4b9c75202f2b961ad92f10a9e504e9a" title="ResolveAlias() reports whether a name is an alias, and what it is aliased to.">ResolveAlias()</a></code> reports whether a name is an alias, and what it is aliased to. <a href="#c4b9c75202f2b961ad92f10a9e504e9a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#af64964e983235247ef65c86a42a4675">DeleteAlias</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasProp)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#af64964e983235247ef65c86a42a4675" title="DeleteAlias() deletes an alias.">DeleteAlias()</a></code> deletes an alias. <a href="#af64964e983235247ef65c86a42a4675"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#b77cf73fa0cc63d845f113b3d1c83602">RegisterStandardAliases</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPMeta.html#b77cf73fa0cc63d845f113b3d1c83602" title="RegisterStandardAliases() registers all of the built-in aliases for a standard namespace...">RegisterStandardAliases()</a></code> registers all of the built-in aliases for a standard namespace. <a href="#b77cf73fa0cc63d845f113b3d1c83602"></a><br></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template&lt;class tStringObj&gt;<br>
+ class TXMPMeta&lt; tStringObj &gt;</h3>
+
+API for access to the XMP Toolkit core services.
+<p>
+<code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> is the template class providing the core services of the XMP Toolkit. It should be instantiated with a string class such as <code>std::string</code>. Read the Toolkit Overview for information about the overall architecture of the XMP API, and the documentation for <code>XMP.hpp</code> for specific instantiation instructions.<p>
+Access these functions through the concrete class, <code>SXMPMeta</code>.<p>
+You can create <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> objects (also called XMP objects) from metadata that you construct, or that you obtain from files using the XMP Toolkit's XMPFiles component; see <code><a class="el" href="TXMPFiles_8hpp.html" title="API for access to the main (document-level) metadata in a file_.">TXMPFiles.hpp</a></code>. <hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="61ffb3aa3e387d8ff9c1f4ebd26606c7"></a><!-- doxytag: member="TXMPMeta::TXMPMeta" ref="61ffb3aa3e387d8ff9c1f4ebd26606c7" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">* <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPMeta.html">TXMPMeta</a> </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Default constructor, creates an empty object.
+<p>
+The default constructor creates a new empty <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> object.<p>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The new object. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="da43d63894350e23a4307c41b7335eca"></a><!-- doxytag: member="TXMPMeta::TXMPMeta" ref="da43d63894350e23a4307c41b7335eca" args="(const TXMPMeta&lt; tStringObj &gt; &amp;original)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">* <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPMeta.html">TXMPMeta</a> </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
+ <td class="paramname"> <em>original</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Copy constructor, creates a client object refering to the same internal object.
+<p>
+The copy constructor creates a new <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> object that refers to the same internal XMP object. as an existing <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> object.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>original</em>&nbsp;</td><td>The object to copy.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The new object. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="cbe8f556a5b32542c44fa9de9648ad41"></a><!-- doxytag: member="TXMPMeta::TXMPMeta" ref="cbe8f556a5b32542c44fa9de9648ad41" args="(XMPMetaRef xmpRef)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPMeta.html">TXMPMeta</a> </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#549d5e2cbcb58302d3df840a0205283e">XMPMetaRef</a>&nbsp;</td>
+ <td class="paramname"> <em>xmpRef</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Reconstructs an XMP object from an internal reference.
+<p>
+This constructor creates a new <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> object that refers to the underlying reference object of an existing <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> object. Use to safely pass XMP objects across DLL boundaries.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmpRef</em>&nbsp;</td><td>The underlying reference object, obtained from some other XMP object with <code><a class="el" href="classTXMPMeta.html#fbfebded0b85b08bd9c5ba0d7dae07e0" title="Retrieves an internal reference that can be safely passed across DLL boundaries and...">TXMPMeta::GetInternalRef()</a></code>.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The new object. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="05199e2a4bc61db7aed207759e899bc2"></a><!-- doxytag: member="TXMPMeta::TXMPMeta" ref="05199e2a4bc61db7aed207759e899bc2" args="(XMP_StringPtr buffer, XMP_StringLen xmpSize)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPMeta.html">TXMPMeta</a> </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>buffer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a>&nbsp;</td>
+ <td class="paramname"> <em>xmpSize</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Constructs an object and parse one buffer of RDF into it.
+<p>
+This constructor creates a new <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> object and populates it with metadata from a buffer containing serialized RDF. This buffer must be a complete RDF parse stream.<p>
+The result of passing serialized data to this function is identical to creating an empty object then calling <code><a class="el" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26" title="ParseFromBuffer() parses RDF from a series of input buffers into this XMP object...">TXMPMeta::ParseFromBuffer()</a></code>. To use the constructor, however, the RDF must be complete. If you need to parse data from multiple buffers, create an empty object and use <code><a class="el" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26" title="ParseFromBuffer() parses RDF from a series of input buffers into this XMP object...">TXMPMeta::ParseFromBuffer()</a></code>.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>buffer</em>&nbsp;</td><td>A pointer to the buffer of RDF to be parsed. Can be null if the length is 0; in this case, the function creates an empty object.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>xmpSize</em>&nbsp;</td><td>The length in bytes of the buffer.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The new object. </dd></dl>
+
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="5415cfc01a9cb8786939246571a23a9d"></a><!-- doxytag: member="TXMPMeta::GetVersionInfo" ref="5415cfc01a9cb8786939246571a23a9d" args="(XMP_VersionInfo *info)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetVersionInfo </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structXMP__VersionInfo.html">XMP_VersionInfo</a> *&nbsp;</td>
+ <td class="paramname"> <em>info</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#5415cfc01a9cb8786939246571a23a9d" title="GetVersionInfo() retrieves runtime version information.">GetVersionInfo()</a></code> retrieves runtime version information.
+<p>
+The header <code>XMPVersion.hpp</code> defines a static version number for the XMP Toolkit, which describes the version of the API used at client compile time. It is not necessarily the same as the runtime version. Do not base runtime decisions on the static version alone; you can, however, compare the runtime and static versions.<p>
+This function is static; make the call directly from the concrete class (<code>SXMPMeta</code>). The function can be called before calling <code><a class="el" href="classTXMPMeta.html#f1defbb73f919eae06456a655dea726c" title="Initialize() explicitly initializes the XMP Toolkit before use. */">TXMPMeta::Initialize()</a></code>.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>info</em>&nbsp;</td><td>[out] A buffer in which to return the version information. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="f1defbb73f919eae06456a655dea726c"></a><!-- doxytag: member="TXMPMeta::Initialize" ref="f1defbb73f919eae06456a655dea726c" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">* static bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::Initialize </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#f1defbb73f919eae06456a655dea726c" title="Initialize() explicitly initializes the XMP Toolkit before use. */">Initialize()</a></code> explicitly initializes the XMP Toolkit before use. */
+<p>
+Initializes the XMP Toolkit.<p>
+Call this function before making any other calls to the <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> functions, except <code><a class="el" href="classTXMPMeta.html#5415cfc01a9cb8786939246571a23a9d" title="GetVersionInfo() retrieves runtime version information.">TXMPMeta::GetVersionInfo()</a></code>.<p>
+This function is static; make the call directly from the concrete class (<code>SXMPMeta</code>).<p>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True on success. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="6c30fae26173167958b6f0da95a53865"></a><!-- doxytag: member="TXMPMeta::Terminate" ref="6c30fae26173167958b6f0da95a53865" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::Terminate </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#6c30fae26173167958b6f0da95a53865" title="Terminate() explicitly terminates usage of the XMP Toolkit.">Terminate()</a></code> explicitly terminates usage of the XMP Toolkit.
+<p>
+Frees structures created on initialization.<p>
+This function is static; make the call directly from the concrete class (<code>SXMPMeta</code>).
+</div>
+</div><p>
+<a class="anchor" name="4d5a601c9b77f6f6ab5f14e658de58ef"></a><!-- doxytag: member="TXMPMeta::operator=" ref="4d5a601c9b77f6f6ab5f14e658de58ef" args="(const TXMPMeta&lt; tStringObj &gt; &amp;rhs)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::operator= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
+ <td class="paramname"> <em>rhs</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Assignment operator, assigns the internal reference and increments the reference count.
+<p>
+The assignment operator assigns the internal ref from the rhs object and increments the reference count on the underlying internal XMP object.
+</div>
+</div><p>
+<a class="anchor" name="12b2435ba039c62a164951948c016eb4"></a><!-- doxytag: member="TXMPMeta::GetGlobalOptions" ref="12b2435ba039c62a164951948c016eb4" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetGlobalOptions </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#12b2435ba039c62a164951948c016eb4" title="GetGlobalOptions() retrieves the set of global option flags. There are none in this...">GetGlobalOptions()</a></code> retrieves the set of global option flags. There are none in this version of the Toolkit.
+<p>
+This function is static; you can make the call from the class without instantiating it.<p>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>A logical OR of global option bit-flag constants. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="e7bb38d9b3857b08106630a386b47332"></a><!-- doxytag: member="TXMPMeta::SetGlobalOptions" ref="e7bb38d9b3857b08106630a386b47332" args="(XMP_OptionBits options)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetGlobalOptions </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#e7bb38d9b3857b08106630a386b47332" title="SetGlobalOptions() updates the set of global option flags. There are none in this...">SetGlobalOptions()</a></code> updates the set of global option flags. There are none in this version of the Toolkit.
+<p>
+The entire set is replaced with the new values. If only one flag is to be modified, use <code><a class="el" href="classTXMPMeta.html#12b2435ba039c62a164951948c016eb4" title="GetGlobalOptions() retrieves the set of global option flags. There are none in this...">TXMPMeta::GetGlobalOptions()</a></code> to obtain the current set, modify the desired flag, then use this function to reset the value.<p>
+This function is static; you can make the call from the class without instantiating it.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>A logical OR of global option bit-flag constants. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="addc5f555de57472939a41346e276817"></a><!-- doxytag: member="TXMPMeta::DumpNamespaces" ref="addc5f555de57472939a41346e276817" args="(XMP_TextOutputProc outProc, void *clientData)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Status</a> <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DumpNamespaces </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#8ce3570e6e5ac14cd603e96fa9d2936f">XMP_TextOutputProc</a>&nbsp;</td>
+ <td class="paramname"> <em>outProc</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&nbsp;</td>
+ <td class="paramname"> <em>clientData</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#addc5f555de57472939a41346e276817" title="DumpNamespaces() sends the list of registered namespace URIs and prefixes to a handler...">DumpNamespaces()</a></code> sends the list of registered namespace URIs and prefixes to a handler.
+<p>
+For debugging. Invokes a client-defined callback for each line of output.<p>
+This function is static; make the call directly from the concrete class (<code>SXMPMeta</code>).<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>outProc</em>&nbsp;</td><td>The client-defined procedure to handle each line of output.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>clientData</em>&nbsp;</td><td>A pointer to client-defined data to pass to the handler.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>A success-fail status value, returned from the handler. Zero is success, failure values are client-defined. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="c2e1bbfd6b9188afb730260808557512"></a><!-- doxytag: member="TXMPMeta::DumpAliases" ref="c2e1bbfd6b9188afb730260808557512" args="(XMP_TextOutputProc outProc, void *clientData)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static <a class="el" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Status</a> <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DumpAliases </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#8ce3570e6e5ac14cd603e96fa9d2936f">XMP_TextOutputProc</a>&nbsp;</td>
+ <td class="paramname"> <em>outProc</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&nbsp;</td>
+ <td class="paramname"> <em>clientData</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#c2e1bbfd6b9188afb730260808557512" title="DumpAliases() sends the list of registered aliases and corresponding actuals to a...">DumpAliases()</a></code> sends the list of registered aliases and corresponding actuals to a handler.
+<p>
+For debugging. Invokes a client-defined callback for each line of output.<p>
+This function is static; make the call directly from the concrete class (<code>SXMPMeta</code>).<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>outProc</em>&nbsp;</td><td>The client-defined procedure to handle each line of output.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>clientData</em>&nbsp;</td><td>A pointer to client-defined data to pass to the handler.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>A success-fail status value, returned from the handler. Zero is success, failure values are client-defined. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="c0368ddbaa4d689cd5b1aff1c88bb0e1"></a><!-- doxytag: member="TXMPMeta::RegisterNamespace" ref="c0368ddbaa4d689cd5b1aff1c88bb0e1" args="(XMP_StringPtr namespaceURI, XMP_StringPtr suggestedPrefix, tStringObj *registeredPrefix)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">* static bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::RegisterNamespace </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>namespaceURI</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>suggestedPrefix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>registeredPrefix</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#c0368ddbaa4d689cd5b1aff1c88bb0e1" title="RegisterNamespace() registers a namespace URI with a suggested prefix.">RegisterNamespace()</a></code> registers a namespace URI with a suggested prefix.
+<p>
+If the URI is not registered but the suggested prefix is in use, a unique prefix is created from the suggested one. The actual registered prefix is returned. The function result tells if the registered prefix is the suggested one. It is not an error if the URI is already registered, regardless of the prefix.<p>
+This function is static; make the call directly from the concrete class (<code>SXMPMeta</code>).<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>namespaceURI</em>&nbsp;</td><td>The URI for the namespace. Must be a valid XML URI.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>suggestedPrefix</em>&nbsp;</td><td>The suggested prefix to be used if the URI is not yet registered. Must be a valid XML name.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>registeredPrefix</em>&nbsp;</td><td>[out] A string object in which to return the prefix actually registered for this URI.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the registered prefix matches the suggested prefix.</dd></dl>
+<dl class="note" compact><dt><b>Note:</b></dt><dd>No checking is done on either the URI or the prefix. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="f28589472d8c0397db6cef868f2b8c97"></a><!-- doxytag: member="TXMPMeta::GetNamespacePrefix" ref="f28589472d8c0397db6cef868f2b8c97" args="(XMP_StringPtr namespaceURI, tStringObj *namespacePrefix)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetNamespacePrefix </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>namespaceURI</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>namespacePrefix</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#f28589472d8c0397db6cef868f2b8c97" title="GetNamespacePrefix() obtains the prefix for a registered namespace URI, and reports...">GetNamespacePrefix()</a></code> obtains the prefix for a registered namespace URI, and reports whether the URI is registered.
+<p>
+This function is static; make the call directly from the concrete class (<code>SXMPMeta</code>).<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>namespaceURI</em>&nbsp;</td><td>The URI for the namespace. Must not be null or the empty string. It is not an error if the namespace URI is not registered.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>namespacePrefix</em>&nbsp;</td><td>[out] A string object in which to return the prefix registered for this URI, with a terminating colon character, ':'. If the namespace is not registered, this string is not modified.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the namespace URI is registered. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="a20c84e7549d0a3252fa29a1e83a757a"></a><!-- doxytag: member="TXMPMeta::GetNamespaceURI" ref="a20c84e7549d0a3252fa29a1e83a757a" args="(XMP_StringPtr namespacePrefix, tStringObj *namespaceURI)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetNamespaceURI </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>namespacePrefix</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>namespaceURI</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#a20c84e7549d0a3252fa29a1e83a757a" title="GetNamespaceURI() obtains the URI for a registered namespace prefix, and reports...">GetNamespaceURI()</a></code> obtains the URI for a registered namespace prefix, and reports whether the prefix is registered.
+<p>
+This function is static; make the call directly from the concrete class (<code>SXMPMeta</code>).<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>namespacePrefix</em>&nbsp;</td><td>The prefix for the namespace. Must not be null or the empty string. It is not an error if the namespace prefix is not registered.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>namespaceURI</em>&nbsp;</td><td>[out] A string object in which to return the URI registered for this prefix. If the prefix is not registered, this string is not modified.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the namespace prefix is registered. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="3f989597e95db929676273cacd4ea09a"></a><!-- doxytag: member="TXMPMeta::DeleteNamespace" ref="3f989597e95db929676273cacd4ea09a" args="(XMP_StringPtr namespaceURI)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DeleteNamespace </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>namespaceURI</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Not implemented.
+<p>
+Deletes a namespace from the registry. Does nothing if the URI is not registered, or if the parameter is null or the empty string.<p>
+This function is static; make the call directly from the concrete class (<code>SXMPMeta</code>).<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>namespaceURI</em>&nbsp;</td><td>The URI for the namespace. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="c47027a765b6365e268f4de3e61b006a"></a><!-- doxytag: member="TXMPMeta::RegisterAlias" ref="c47027a765b6365e268f4de3e61b006a" args="(XMP_StringPtr aliasNS, XMP_StringPtr aliasProp, XMP_StringPtr actualNS, XMP_StringPtr actualProp, XMP_OptionBits arrayForm=kXMP_NoOptions)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">* static void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::RegisterAlias </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>aliasNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>aliasProp</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>actualNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>actualProp</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayForm</em> = <code>kXMP_NoOptions</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#c47027a765b6365e268f4de3e61b006a" title="RegisterAlias() associates an alias name with an actual name.">RegisterAlias()</a></code> associates an alias name with an actual name.
+<p>
+Defines an alias mapping from one namespace/property to another. Both property names must be simple names. An alias can be a direct mapping, where the alias and actual have the same data type. It is also possible to map a simple alias to an item in an array. This can either be to the first item in the array, or to the 'x-default' item in an alt-text array. Multiple alias names can map to the same actual, as long as the forms match. It is a no-op to reregister an alias in an identical fashion.<p>
+This function is static; make the call directly from the concrete class (<code>SXMPMeta</code>).<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>aliasNS</em>&nbsp;</td><td>The namespace URI for the alias. Must not be null or the empty string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>aliasProp</em>&nbsp;</td><td>The name of the alias. Must be a simple name, not null or the empty string and not a general path expression.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>actualNS</em>&nbsp;</td><td>The namespace URI for the actual. Must not be null or the empty string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>actualProp</em>&nbsp;</td><td>The name of the actual. Must be a simple name, not null or the empty string and not a general path expression.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>arrayForm</em>&nbsp;</td><td>Provides the array form for simple aliases to an array item. This is needed to know what kind of array to create if set for the first time via the simple alias. Pass <code><a class="el" href="XMP__Const_8h.html#ff1df9f3cf050f8b8d3a574db3c3326b" title="Options macro clears all property-type bits.">kXMP_NoOptions</a></code>, the default value, for all direct aliases regardless of whether the actual data type is an array or not. One of these constants:</td></tr>
+ </table>
+</dl>
+<ul>
+<li><code><a class="el" href="XMP__Const_8h.html#ff1df9f3cf050f8b8d3a574db3c3326b" title="Options macro clears all property-type bits.">kXMP_NoOptions</a></code> - This is a direct mapping. The actual data type does not matter. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b59b7706e0f0716ac7546bdc24ffedd0bc">kXMP_PropValueIsArray</a></code> - The actual is an unordered array, the alias is to the first element of the array. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5f1cdb3b0a3e852ec55e747a1686aba04" title="Implies kXMP_PropValueIsArray, item order matters. It is serialized using an rdf:Seq...">kXMP_PropArrayIsOrdered</a></code> - The actual is an ordered array, the alias is to the first element of the array. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b52596b1f0ea4600270c99102c86b5f1f1" title="Implies kXMP_PropArrayIsOrdered, items are alternates. It is serialized using an...">kXMP_PropArrayIsAlternate</a></code> - The actual is an alternate array, the alias is to the first element of the array. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ba253f67a6cf44b7438a3f96b516846d">kXMP_PropArrayIsAltText</a></code> - The actual is an alternate text array, the alias is to the 'x-default' element of the array. </li>
+</ul>
+
+</div>
+</div><p>
+<a class="anchor" name="c4b9c75202f2b961ad92f10a9e504e9a"></a><!-- doxytag: member="TXMPMeta::ResolveAlias" ref="c4b9c75202f2b961ad92f10a9e504e9a" args="(XMP_StringPtr aliasNS, XMP_StringPtr aliasProp, tStringObj *actualNS, tStringObj *actualProp, XMP_OptionBits *arrayForm)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::ResolveAlias </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>aliasNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>aliasProp</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>actualNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>actualProp</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
+ <td class="paramname"> <em>arrayForm</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#c4b9c75202f2b961ad92f10a9e504e9a" title="ResolveAlias() reports whether a name is an alias, and what it is aliased to.">ResolveAlias()</a></code> reports whether a name is an alias, and what it is aliased to.
+<p>
+Output strings are not written until return, so you can use this to "reduce" a path to the base form as follows: <pre>
+ isAlias = SXMPMeta::ResolveAlias ( ns.c_str(), path.c_str(), &amp;ns, &amp;path, 0 );
+ </pre> This function is static; make the call directly from the concrete class (<code>SXMPMeta</code>).<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>aliasNS</em>&nbsp;</td><td>The namespace URI for the alias. Must not be null or the empty string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>aliasProp</em>&nbsp;</td><td>The name of the alias. Can be an arbitrary path expression path, must not null or the empty string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>actualNS</em>&nbsp;</td><td>[out] A string object in which to return the namespace URI for the actual. Not modified if the given name is not an alias. Can be null if the namespace URI is not wanted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>actualProp</em>&nbsp;</td><td>[out] A string object in which to return the path of the actual. Not modified if the given name is not an alias. Can be null if the actual's path is not wanted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>arrayForm</em>&nbsp;</td><td>[out] A string object in which to return the array form of the actual. This is 0 (<code><a class="el" href="XMP__Const_8h.html#ff1df9f3cf050f8b8d3a574db3c3326b" title="Options macro clears all property-type bits.">kXMP_NoOptions</a></code>) if the alias and actual forms match, otherwise it is the options passed to <code><a class="el" href="classTXMPMeta.html#c47027a765b6365e268f4de3e61b006a" title="RegisterAlias() associates an alias name with an actual name.">TXMPMeta::RegisterAlias()</a></code>. Not modified if the given name is not an alias. Can be null if the actual's array form is not wanted.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the provided name is an alias. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="af64964e983235247ef65c86a42a4675"></a><!-- doxytag: member="TXMPMeta::DeleteAlias" ref="af64964e983235247ef65c86a42a4675" args="(XMP_StringPtr aliasNS, XMP_StringPtr aliasProp)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DeleteAlias </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>aliasNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>aliasProp</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#af64964e983235247ef65c86a42a4675" title="DeleteAlias() deletes an alias.">DeleteAlias()</a></code> deletes an alias.
+<p>
+This deletes only the registration of the alias, it does not delete the actual property. It deletes any view of the property through the alias name.<p>
+This function is static; make the call directly from the concrete class (<code>SXMPMeta</code>).<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>aliasNS</em>&nbsp;</td><td>The namespace URI for the alias. Must not be null or the empty string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>aliasProp</em>&nbsp;</td><td>The name of the alias. Must be a simple name, not null or the empty string and not a general path expression. It is not an error to provide a name that has not been registered as an alias. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="b77cf73fa0cc63d845f113b3d1c83602"></a><!-- doxytag: member="TXMPMeta::RegisterStandardAliases" ref="b77cf73fa0cc63d845f113b3d1c83602" args="(XMP_StringPtr schemaNS)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::RegisterStandardAliases </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#b77cf73fa0cc63d845f113b3d1c83602" title="RegisterStandardAliases() registers all of the built-in aliases for a standard namespace...">RegisterStandardAliases()</a></code> registers all of the built-in aliases for a standard namespace.
+<p>
+The built-in aliases are documented in the XMP Specification. This function registers the aliases in the given namespace; that is, it creates the aliases from this namespace to actuals in other namespaces.<p>
+This function is static; make the call directly from the concrete class (<code>SXMPMeta</code>).<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the aliases. Must not be null or the empty string. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="06a3241c7fa5df87f61dff02fca23a0c"></a><!-- doxytag: member="TXMPMeta::GetProperty" ref="06a3241c7fa5df87f61dff02fca23a0c" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, tStringObj *propValue, XMP_OptionBits *options) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetProperty </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>propValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
+ <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> reports whether a property exists, and retrieves its value.
+<p>
+This is the simplest property accessor. Use this to retrieve the values of top-level simple properties, or after using the path composition functions in <code><a class="el" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a></code>.<p>
+When specifying a namespace and path (in this and all other accessors): <ul>
+<li>If a namespace URI is specified, it must be for a registered namespace. </li>
+<li>If the namespace is specified only by a prefix in the property name path, it must be a registered prefix. </li>
+<li>If both a URI and path prefix are present, they must be corresponding parts of a registered namespace.</li>
+</ul>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property. The URI must be for a registered namespace. Can be null or the empty string if the first component of the <code>propName</code> path contains a namespace prefix.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Can be a general path expression, must not be null or the empty string. The first component can be a namespace prefix; if present without a <code>schemaNS</code> value, the prefix specifies the namespace. The prefix must be for a registered namespace, and if a namespace URI is specified, must match the registered prefix for that namespace.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>[out] A string object in which to return the value of the property, if the property exists and has a value. Arrays and non-leaf levels of structs do not have values. Can be null if the value is not wanted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>A buffer in which to return option flags describing the property. Can be null if the flags are not wanted.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the property exists. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="c64a4251d157937f69b73f2ffac4f7cc"></a><!-- doxytag: member="TXMPMeta::GetArrayItem" ref="c64a4251d157937f69b73f2ffac4f7cc" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, tStringObj *itemValue, XMP_OptionBits *options) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetArrayItem </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>&nbsp;</td>
+ <td class="paramname"> <em>itemIndex</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>itemValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
+ <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#c64a4251d157937f69b73f2ffac4f7cc" title="GetArrayItem() provides access to items within an array.">GetArrayItem()</a></code> provides access to items within an array.
+<p>
+Reports whether the item exists; if it does, and if it has a value, the function retrieves the value. Items are accessed by an integer index, where the first item has index 1.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the array; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>itemIndex</em>&nbsp;</td><td>The 1-based index of the desired item. Use the macro <code><a class="el" href="XMP__Const_8h.html#9549b9a138a896257b5a70176d125317" title="Options macro accesses last array item.">kXMP_ArrayLastItem</a></code> to specify the last existing array item.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>itemValue</em>&nbsp;</td><td>[out] A string object in which to return the value of the array item, if it has a value. Arrays and non-leaf levels of structs do not have values. Can be null if the value is not wanted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>[out] A buffer in which to return the option flags describing the array item. Can be null if the flags are not wanted.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the array item exists. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="885ef7127b897e349f71fa493ace3c94"></a><!-- doxytag: member="TXMPMeta::GetStructField" ref="885ef7127b897e349f71fa493ace3c94" args="(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, tStringObj *fieldValue, XMP_OptionBits *options) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetStructField </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>structName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>fieldValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
+ <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#885ef7127b897e349f71fa493ace3c94" title="GetStructField() provides access to fields within a nested structure.">GetStructField()</a></code> provides access to fields within a nested structure.
+<p>
+Reports whether the field exists; if it does, and if it has a value, the function retrieves the value.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the struct; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>structName</em>&nbsp;</td><td>The name of the struct. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldNS</em>&nbsp;</td><td>The namespace URI for the field. Same URI and prefix usage as the <code>schemaNS</code> and <code>structName</code> parameters.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldName</em>&nbsp;</td><td>The name of the field. Must be a single XML name, must not be null or the empty string. Same URI and prefix usage as the <code>schemaNS</code> and <code>structName</code> parameters.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldValue</em>&nbsp;</td><td>[out] A string object in which to return the value of the field, if the field has a value. Arrays and non-leaf levels of structs do not have values. Can be null if the value is not wanted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>[out] A buffer in which to return the option flags describing the field. Can be null if the flags are not wanted.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the field exists. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="2cc58d8316043b035643e7c21633bc13"></a><!-- doxytag: member="TXMPMeta::GetQualifier" ref="2cc58d8316043b035643e7c21633bc13" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, tStringObj *qualValue, XMP_OptionBits *options) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetQualifier </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>qualNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>qualName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>qualValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
+ <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#2cc58d8316043b035643e7c21633bc13" title="GetQualifier() provides access to a qualifier attached to a property.">GetQualifier()</a></code> provides access to a qualifier attached to a property.
+<p>
+<dl class="note" compact><dt><b>Note:</b></dt><dd>In this version of the Toolkit, qualifiers are supported only for simple leaf properties.</dd></dl>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property to which the qualifier is attached. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>qualNS</em>&nbsp;</td><td>The namespace URI for the qualifier. Same URI and prefix usage as the <code>schemaNS</code> and <code>propName</code> parameters.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>qualName</em>&nbsp;</td><td>The name of the qualifier. Must be a single XML name, must not be null or the empty string. Same URI and prefix usage as the <code>schemaNS</code> and <code>propName</code> parameters.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>qualValue</em>&nbsp;</td><td>[out] A string object in which to return the value of the qualifier, if the qualifier has a value. Arrays and non-leaf levels of structs do not have values. Can be null if the value is not wanted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>[out] A buffer in which to return the option flags describing the qualifier. Can be null if the flags are not wanted.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the qualifier exists. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="1dfd6a08ebfd1a6364b3a7b6584bcc28"></a><!-- doxytag: member="TXMPMeta::SetProperty" ref="1dfd6a08ebfd1a6364b3a7b6584bcc28" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr propValue, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetProperty </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#1dfd6a08ebfd1a6364b3a7b6584bcc28" title="SetProperty() creates or sets a property value.">SetProperty()</a></code> creates or sets a property value.
+<p>
+Each function takes an options flag that describes the property. You can use these functions to create empty arrays and structs by setting appropriate option flags. When you assign a value, all levels of a struct that are implicit in the assignment are created if necessary. <code><a class="el" href="classTXMPMeta.html#00d7314dc970ad390499ce9db27d314a" title="AppendArrayItem() adds an item to an array, creating the array if necessary.">TXMPMeta::AppendArrayItem()</a></code> implicitly creates the named array if necessary.<p>
+The allowed option bit-flags include: <ul>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a></code> - Can be used to create an empty struct. A struct is implicitly created when the first field is set. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b59b7706e0f0716ac7546bdc24ffedd0bc">kXMP_PropValueIsArray</a></code> - By default, a general unordered array (bag). </li>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5f1cdb3b0a3e852ec55e747a1686aba04" title="Implies kXMP_PropValueIsArray, item order matters. It is serialized using an rdf:Seq...">kXMP_PropArrayIsOrdered</a></code> - An ordered array. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b52596b1f0ea4600270c99102c86b5f1f1" title="Implies kXMP_PropArrayIsOrdered, items are alternates. It is serialized using an...">kXMP_PropArrayIsAlternate</a></code> - An alternative array. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ba253f67a6cf44b7438a3f96b516846d">kXMP_PropArrayIsAltText</a></code> - An alt-text array. Each array element must be a simple property with an <code>xml:lang</code> attribute. This is the simplest property setter. Use it for top-level simple properties, or after using the path composition functions in <code><a class="el" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a></code>.</li>
+</ul>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>The new value, a pointer to a null terminated UTF-8 string. Must be null for arrays and non-leaf levels of structs that do not have values.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the property; a logical OR of allowed bit-flag constants; see <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a></code> and following. Must match the type of a property that already exists. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="cc50625611f6aad405aa47197b6d0055"></a><!-- doxytag: member="TXMPMeta::SetProperty" ref="cc50625611f6aad405aa47197b6d0055" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, const tStringObj &amp;propValue, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetProperty </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>propValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#1dfd6a08ebfd1a6364b3a7b6584bcc28" title="SetProperty() creates or sets a property value.">SetProperty()</a></code> creates or sets a property value using a string object.
+<p>
+Overloads the basic form of the function, allowing you to pass a string object for the item value. It is otherwise identical; see details in the canonical form.
+</div>
+</div><p>
+<a class="anchor" name="1570eb89d613b4a94ca572e4644168cc"></a><!-- doxytag: member="TXMPMeta::SetArrayItem" ref="1570eb89d613b4a94ca572e4644168cc" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, XMP_StringPtr itemValue, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetArrayItem </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>&nbsp;</td>
+ <td class="paramname"> <em>itemIndex</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>itemValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#1570eb89d613b4a94ca572e4644168cc" title="SetArrayItem() creates or sets the value of an item within an array.">SetArrayItem()</a></code> creates or sets the value of an item within an array.
+<p>
+Items are accessed by an integer index, where the first item has index 1. This function creates the item if necessary, but the array itself must already exist Use <code><a class="el" href="classTXMPMeta.html#00d7314dc970ad390499ce9db27d314a" title="AppendArrayItem() adds an item to an array, creating the array if necessary.">AppendArrayItem()</a></code> to create arrays. A new item is automatically appended if the index is the array size plus 1. To insert a new item before or after an existing item, use option flags.<p>
+Use <code><a class="el" href="classTXMPUtils.html#47fa195aa2e1457aa1f74f7e1ed06da6" title="ComposeArrayItemPath() composes the path expression for an item in an array.">TXMPUtils::ComposeArrayItemPath()</a></code> to create a complex path.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>itemIndex</em>&nbsp;</td><td>The 1-based index of the desired item. Use the macro <code><a class="el" href="XMP__Const_8h.html#9549b9a138a896257b5a70176d125317" title="Options macro accesses last array item.">kXMP_ArrayLastItem</a></code> to specify the last existing array item.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>itemValue</em>&nbsp;</td><td>The new item value, a null-terminated UTF-8 string, if the array item has a value.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the array type and insertion location for a new item; a logical OR of allowed bit-flag constants. The type, if specified, must match the existing array type, <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5f1cdb3b0a3e852ec55e747a1686aba04" title="Implies kXMP_PropValueIsArray, item order matters. It is serialized using an rdf:Seq...">kXMP_PropArrayIsOrdered</a></code>, <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b52596b1f0ea4600270c99102c86b5f1f1" title="Implies kXMP_PropArrayIsOrdered, items are alternates. It is serialized using an...">kXMP_PropArrayIsAlternate</a></code>, or <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ba253f67a6cf44b7438a3f96b516846d">kXMP_PropArrayIsAltText</a></code>. Default (0 or <code><a class="el" href="XMP__Const_8h.html#ff1df9f3cf050f8b8d3a574db3c3326b" title="Options macro clears all property-type bits.">kXMP_NoOptions</a></code>) matches the existing array type.</td></tr>
+ </table>
+</dl>
+To insert a new item before or after the specified index, set flag <code><a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04873411f673fc2a6337083fd024df727f" title="Option for array item location: Insert a new item before the given index.">kXMP_InsertBeforeItem</a></code> or <code><a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b0498cedd5fa29d47abb2ac8903ac7f5a05" title="Option for array item location: Insert a new item after the given index.">kXMP_InsertAfterItem</a></code>.
+</div>
+</div><p>
+<a class="anchor" name="15720ee8e732232fa25989870cf99846"></a><!-- doxytag: member="TXMPMeta::SetArrayItem" ref="15720ee8e732232fa25989870cf99846" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, const tStringObj &amp;itemValue, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetArrayItem </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>&nbsp;</td>
+ <td class="paramname"> <em>itemIndex</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>itemValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#1570eb89d613b4a94ca572e4644168cc" title="SetArrayItem() creates or sets the value of an item within an array.">SetArrayItem()</a></code> creates or sets the value of an item within an array using a string object.
+<p>
+Overloads the basic form of the function, allowing you to pass a string object in which to return the item value. It is otherwise identical; see details in the canonical form.
+</div>
+</div><p>
+<a class="anchor" name="00d7314dc970ad390499ce9db27d314a"></a><!-- doxytag: member="TXMPMeta::AppendArrayItem" ref="00d7314dc970ad390499ce9db27d314a" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits arrayOptions, XMP_StringPtr itemValue, XMP_OptionBits itemOptions=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::AppendArrayItem </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayOptions</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>itemValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>itemOptions</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#00d7314dc970ad390499ce9db27d314a" title="AppendArrayItem() adds an item to an array, creating the array if necessary.">AppendArrayItem()</a></code> adds an item to an array, creating the array if necessary.
+<p>
+This function simplifies construction of an array by not requiring that you pre-create an empty array. The array that is assigned is created automatically if it does not yet exist. If the array exists, it must have the form specified by the options. Each call appends a new item to the array.<p>
+Use <code><a class="el" href="classTXMPUtils.html#47fa195aa2e1457aa1f74f7e1ed06da6" title="ComposeArrayItemPath() composes the path expression for an item in an array.">TXMPUtils::ComposeArrayItemPath()</a></code> to create a complex path.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>arrayOptions</em>&nbsp;</td><td>Option flags describing the array type to create; a logical OR of allowed bit-flag constants, <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5f1cdb3b0a3e852ec55e747a1686aba04" title="Implies kXMP_PropValueIsArray, item order matters. It is serialized using an rdf:Seq...">kXMP_PropArrayIsOrdered</a></code>, <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b52596b1f0ea4600270c99102c86b5f1f1" title="Implies kXMP_PropArrayIsOrdered, items are alternates. It is serialized using an...">kXMP_PropArrayIsAlternate</a></code>, or <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ba253f67a6cf44b7438a3f96b516846d">kXMP_PropArrayIsAltText</a></code>. If the array exists, must match the existing array type or be null (0 or <code><a class="el" href="XMP__Const_8h.html#ff1df9f3cf050f8b8d3a574db3c3326b" title="Options macro clears all property-type bits.">kXMP_NoOptions</a></code>).</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>itemValue</em>&nbsp;</td><td>The new item value, a null-terminated UTF-8 string, if the array item has a value.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>itemOptions</em>&nbsp;</td><td>Option flags describing the item type to create; one of the bit-flag constants <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b59b7706e0f0716ac7546bdc24ffedd0bc">kXMP_PropValueIsArray</a></code> or <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a></code> to create a complex array item. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="4f768a8cb35cabff1cf4187aa6a88dd3"></a><!-- doxytag: member="TXMPMeta::AppendArrayItem" ref="4f768a8cb35cabff1cf4187aa6a88dd3" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits arrayOptions, const tStringObj &amp;itemValue, XMP_OptionBits itemOptions=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::AppendArrayItem </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayOptions</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>itemValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>itemOptions</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#00d7314dc970ad390499ce9db27d314a" title="AppendArrayItem() adds an item to an array, creating the array if necessary.">AppendArrayItem()</a></code> adds an item to an array using a string object value, creating the array if necessary.
+<p>
+Overloads the basic form of the function, allowing you to pass a string object in which to return the item value. It is otherwise identical; see details in the canonical form.
+</div>
+</div><p>
+<a class="anchor" name="0e44c30e7527064909e5f7035d53c4f5"></a><!-- doxytag: member="TXMPMeta::SetStructField" ref="0e44c30e7527064909e5f7035d53c4f5" args="(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetStructField </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>structName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#0e44c30e7527064909e5f7035d53c4f5" title="SetStructField() creates or sets the value of a field within a nested structure.">SetStructField()</a></code> creates or sets the value of a field within a nested structure.
+<p>
+Use this to set a value within an existing structure, create a new field within an existing structure, or create an empty structure of any depth. If you set a field in a structure that does not exist, the structure is automatically created.<p>
+Use <code><a class="el" href="classTXMPUtils.html#706eb85b8401b8682a01348f7e25ee3d" title="ComposeStructFieldPath() composes the path expression for a field in a struct.">TXMPUtils::ComposeStructFieldPath()</a></code> to create a complex path.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>structName</em>&nbsp;</td><td>The name of the struct. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldNS</em>&nbsp;</td><td>The namespace URI for the field. Same namespace and prefix usage as <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldName</em>&nbsp;</td><td>The name of the field. Must be a single XML name, must not be null or the empty string. Same namespace and prefix usage as <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldValue</em>&nbsp;</td><td>The new value, a null-terminated UTF-8 string, if the field has a value. Null to create a new, empty struct or empty field in an existing struct.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the property, in which the bit-flag <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a></code> must be set to create a struct. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="77d4a1bf7831f39073af9ea1544ebefa"></a><!-- doxytag: member="TXMPMeta::SetStructField" ref="77d4a1bf7831f39073af9ea1544ebefa" args="(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, const tStringObj &amp;fieldValue, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetStructField </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>structName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>fieldValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#0e44c30e7527064909e5f7035d53c4f5" title="SetStructField() creates or sets the value of a field within a nested structure.">SetStructField()</a></code> creates or sets the value of a field within a nested structure, using a string object.
+<p>
+Overloads the basic form of the function, allowing you to pass a string object in which to return the field value. It is otherwise identical; see details in the canonical form.
+</div>
+</div><p>
+<a class="anchor" name="c2e798da5f9d94e486382a41e73fcea3"></a><!-- doxytag: member="TXMPMeta::SetQualifier" ref="c2e798da5f9d94e486382a41e73fcea3" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, XMP_StringPtr qualValue, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetQualifier </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>qualNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>qualName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>qualValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#c2e798da5f9d94e486382a41e73fcea3" title="SetQualifier() creates or sets a qualifier attached to a property.">SetQualifier()</a></code> creates or sets a qualifier attached to a property.
+<p>
+Use this to set a value for an existing qualifier, or create a new qualifier. &lt;&lt;how do options work? macro vs bit-flag? interaction w/XMP_PropHasQualifier?&gt;&gt; Use <code><a class="el" href="classTXMPUtils.html#40ae0ce2065fcb71725e37137884e172" title="ComposeQualifierPath() composes the path expression for a qualifier.">TXMPUtils::ComposeQualifierPath()</a></code> to create a complex path.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property to which the qualifier is attached. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>qualNS</em>&nbsp;</td><td>The namespace URI for the qualifier. Same namespace and prefix usage as <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>qualName</em>&nbsp;</td><td>The name of the qualifier. Must be a single XML name, must not be null or the empty string. Same namespace and prefix usage as <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>qualValue</em>&nbsp;</td><td>The new value, a null-terminated UTF-8 string, if the qualifier has a value. Null to create a new, empty qualifier.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the &lt;&lt;qualified property? qualifier?&gt;&gt;, a logical OR of property-type bit-flag constants. Use the macro <code><a class="el" href="XMP__Const_8h.html#8d1b4da6b3cb3a67bf4f8e79352eeeaa" title="Macro reports the property type specified by an options flag.">XMP_PropIsQualifier</a></code> to create a qualifier. &lt;&lt;??&gt;&gt; </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="c395e094cab251a0593d508594b21521"></a><!-- doxytag: member="TXMPMeta::SetQualifier" ref="c395e094cab251a0593d508594b21521" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, const tStringObj &amp;qualValue, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetQualifier </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>qualNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>qualName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>qualValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#c2e798da5f9d94e486382a41e73fcea3" title="SetQualifier() creates or sets a qualifier attached to a property.">SetQualifier()</a></code> creates or sets a qualifier attached to a property using a string object.
+<p>
+Overloads the basic form of the function, allowing you to pass a string object for the qualifier value. It is otherwise identical; see details in the canonical form.
+</div>
+</div><p>
+<a class="anchor" name="c8b555ba99904fa49bb4851a60cc3844"></a><!-- doxytag: member="TXMPMeta::DeleteProperty" ref="c8b555ba99904fa49bb4851a60cc3844" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DeleteProperty </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#c8b555ba99904fa49bb4851a60cc3844" title="DeleteProperty() deletes an XMP subtree rooted at a given property.">DeleteProperty()</a></code> deletes an XMP subtree rooted at a given property.
+<p>
+It is not an error if the property does not exist.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="bc1211f47225b5973a170ff952743264"></a><!-- doxytag: member="TXMPMeta::DeleteArrayItem" ref="bc1211f47225b5973a170ff952743264" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DeleteArrayItem </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>&nbsp;</td>
+ <td class="paramname"> <em>itemIndex</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#bc1211f47225b5973a170ff952743264" title="DeleteArrayItem() deletes an XMP subtree rooted at a given array item.">DeleteArrayItem()</a></code> deletes an XMP subtree rooted at a given array item.
+<p>
+It is not an error if the array item does not exist. Use <code><a class="el" href="classTXMPUtils.html#47fa195aa2e1457aa1f74f7e1ed06da6" title="ComposeArrayItemPath() composes the path expression for an item in an array.">TXMPUtils::ComposeArrayItemPath()</a></code> to create a complex path.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the array; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>itemIndex</em>&nbsp;</td><td>The 1-based index of the desired item. Use the macro <code><a class="el" href="XMP__Const_8h.html#9549b9a138a896257b5a70176d125317" title="Options macro accesses last array item.">kXMP_ArrayLastItem</a></code> to specify the last existing array item. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="bc258e027780a15be65a88fcfd4e1fd4"></a><!-- doxytag: member="TXMPMeta::DeleteStructField" ref="bc258e027780a15be65a88fcfd4e1fd4" args="(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DeleteStructField </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>structName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldName</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#bc258e027780a15be65a88fcfd4e1fd4" title="DeleteStructField() deletes an XMP subtree rooted at a given struct field.">DeleteStructField()</a></code> deletes an XMP subtree rooted at a given struct field.
+<p>
+It is not an error if the field does not exist.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the struct; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>structName</em>&nbsp;</td><td>The name of the struct. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldNS</em>&nbsp;</td><td>The namespace URI for the field. Same namespace and prefix usage as <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldName</em>&nbsp;</td><td>The name of the field. Must be a single XML name, must not be null or the empty string. Same namespace and prefix usage as <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="8ce15f7de7fd3b258f07158ab5fa88be"></a><!-- doxytag: member="TXMPMeta::DeleteQualifier" ref="8ce15f7de7fd3b258f07158ab5fa88be" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DeleteQualifier </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>qualNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>qualName</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#8ce15f7de7fd3b258f07158ab5fa88be" title="DeleteQualifier() deletes an XMP subtree rooted at a given qualifier.">DeleteQualifier()</a></code> deletes an XMP subtree rooted at a given qualifier.
+<p>
+It is not an error if the qualifier does not exist.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property to which the qualifier is attached. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>qualNS</em>&nbsp;</td><td>The namespace URI for the qualifier. Same namespace and prefix usage as <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>qualName</em>&nbsp;</td><td>The name of the qualifier. Must be a single XML name, must not be null or the empty string. Same namespace and prefix usage as <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="f22b116d71ecbbebea016ec5337e7066"></a><!-- doxytag: member="TXMPMeta::DoesPropertyExist" ref="f22b116d71ecbbebea016ec5337e7066" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DoesPropertyExist </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#f22b116d71ecbbebea016ec5337e7066" title="DoesPropertyExist() reports whether a property currently exists.">DoesPropertyExist()</a></code> reports whether a property currently exists.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the property exists. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="492465c588d6d4cb8e30f94790e66f58"></a><!-- doxytag: member="TXMPMeta::DoesArrayItemExist" ref="492465c588d6d4cb8e30f94790e66f58" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DoesArrayItemExist </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>&nbsp;</td>
+ <td class="paramname"> <em>itemIndex</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#492465c588d6d4cb8e30f94790e66f58" title="DoesArrayItemExist() reports whether an array item currently exists.">DoesArrayItemExist()</a></code> reports whether an array item currently exists.
+<p>
+Use <code><a class="el" href="classTXMPUtils.html#47fa195aa2e1457aa1f74f7e1ed06da6" title="ComposeArrayItemPath() composes the path expression for an item in an array.">TXMPUtils::ComposeArrayItemPath()</a></code> to create a complex path.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>itemIndex</em>&nbsp;</td><td>The 1-based index of the desired item. Use the macro <code><a class="el" href="XMP__Const_8h.html#9549b9a138a896257b5a70176d125317" title="Options macro accesses last array item.">kXMP_ArrayLastItem</a></code> to specify the last existing array item.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the array item exists. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="9261b80d62e77a10ff1a89843bfa10a5"></a><!-- doxytag: member="TXMPMeta::DoesStructFieldExist" ref="9261b80d62e77a10ff1a89843bfa10a5" args="(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DoesStructFieldExist </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>structName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldName</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#9261b80d62e77a10ff1a89843bfa10a5" title="DoesStructFieldExist() reports whether a struct field currently exists.">DoesStructFieldExist()</a></code> reports whether a struct field currently exists.
+<p>
+Use <code><a class="el" href="classTXMPUtils.html#706eb85b8401b8682a01348f7e25ee3d" title="ComposeStructFieldPath() composes the path expression for a field in a struct.">TXMPUtils::ComposeStructFieldPath()</a></code> to create a complex path.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>structName</em>&nbsp;</td><td>The name of the struct. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldNS</em>&nbsp;</td><td>The namespace URI for the field. Same namespace and prefix usage as <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldName</em>&nbsp;</td><td>The name of the field. Must be a single XML name, must not be null or the empty string. Same namespace and prefix usage as <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the field exists. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="81347a92becd387a14f4d47c582f129a"></a><!-- doxytag: member="TXMPMeta::DoesQualifierExist" ref="81347a92becd387a14f4d47c582f129a" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DoesQualifierExist </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>qualNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>qualName</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#81347a92becd387a14f4d47c582f129a" title="DoesQualifierExist() reports whether a qualifier currently exists.">DoesQualifierExist()</a></code> reports whether a qualifier currently exists.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property to which the qualifier is attached. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>qualNS</em>&nbsp;</td><td>The namespace URI for the qualifier. Same namespace and prefix usage as <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>qualName</em>&nbsp;</td><td>The name of the qualifier. Must be a single XML name, must not be null or the empty string. Same namespace and prefix usage as <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the qualifier exists. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="dcf8a1959a8bd42641a42cbd4d64a5b7"></a><!-- doxytag: member="TXMPMeta::GetProperty_Bool" ref="dcf8a1959a8bd42641a42cbd4d64a5b7" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, bool *propValue, XMP_OptionBits *options) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetProperty_Bool </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">bool *&nbsp;</td>
+ <td class="paramname"> <em>propValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
+ <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#dcf8a1959a8bd42641a42cbd4d64a5b7" title="GetProperty_Bool() retrieves the value of a Boolean property as a C++ bool.">GetProperty_Bool()</a></code> retrieves the value of a Boolean property as a C++ bool.
+<p>
+Reports whether a property exists, and retrieves its binary value and property type information.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>[out] A buffer in which to return the binary value. Can be null if the value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have values.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>[out] A buffer in which to return the option flags describing the property, a logical OR of allowed bit-flag constants; see <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a></code> and following. Can be null if flags are not wanted.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the property exists. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="3b6ba486c02607b544917091c43b05cc"></a><!-- doxytag: member="TXMPMeta::GetProperty_Int" ref="3b6ba486c02607b544917091c43b05cc" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, long *propValue, XMP_OptionBits *options) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetProperty_Int </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">long *&nbsp;</td>
+ <td class="paramname"> <em>propValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
+ <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#3b6ba486c02607b544917091c43b05cc" title="GetProperty_Int() retrieves the value of an integer property as a C long integer...">GetProperty_Int()</a></code> retrieves the value of an integer property as a C long integer.
+<p>
+Reports whether a property exists, and retrieves its binary value and property type information.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>[out] A buffer in which to return the binary value. Can be null if the value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have values.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>[out] A buffer in which to return the option flags describing the property, a logical OR of allowed bit-flag constants; see <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a></code> and following. Can be null if flags are not wanted.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the property exists. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="669e0625cd271b6e7902fe0b51020402"></a><!-- doxytag: member="TXMPMeta::GetProperty_Int64" ref="669e0625cd271b6e7902fe0b51020402" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, long long *propValue, XMP_OptionBits *options) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetProperty_Int64 </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">long long *&nbsp;</td>
+ <td class="paramname"> <em>propValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
+ <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#669e0625cd271b6e7902fe0b51020402" title="GetProperty_Int64() retrieves the value of an integer property as a C long long integer...">GetProperty_Int64()</a></code> retrieves the value of an integer property as a C long long integer.
+<p>
+Reports whether a property exists, and retrieves its binary value and property type information.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>[out] A buffer in which to return the binary value. Can be null if the value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have values.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>[out] A buffer in which to return the option flags describing the property, a logical OR of allowed bit-flag constants; see <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a></code> and following. Can be null if flags are not wanted.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the property exists. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="7708c31c9af3e740b27a4893dcd9aa47"></a><!-- doxytag: member="TXMPMeta::GetProperty_Float" ref="7708c31c9af3e740b27a4893dcd9aa47" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, double *propValue, XMP_OptionBits *options) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetProperty_Float </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">double *&nbsp;</td>
+ <td class="paramname"> <em>propValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
+ <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#7708c31c9af3e740b27a4893dcd9aa47" title="GetProperty_Float() retrieves the value of a floating-point property as a C double...">GetProperty_Float()</a></code> retrieves the value of a floating-point property as a C double float.
+<p>
+Reports whether a property exists, and retrieves its binary value and property type information.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>[out] A buffer in which to return the binary value. Can be null if the value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have values.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>[out] A buffer in which to return the option flags describing the property, a logical OR of allowed bit-flag constants; see <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a></code> and following. Can be null if flags are not wanted.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the property exists. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="2f561295e73047ee90765558d29bd650"></a><!-- doxytag: member="TXMPMeta::GetProperty_Date" ref="2f561295e73047ee90765558d29bd650" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_DateTime *propValue, XMP_OptionBits *options) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetProperty_Date </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *&nbsp;</td>
+ <td class="paramname"> <em>propValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
+ <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#2f561295e73047ee90765558d29bd650" title="GetProperty_Date() retrieves the value of a date-time property as an XMP_DateTime...">GetProperty_Date()</a></code> retrieves the value of a date-time property as an <code><a class="el" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a></code> structure.
+<p>
+Reports whether a property exists, and retrieves its binary value and property type information.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>[out] A buffer in which to return the binary value. Can be null if the value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have values.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>[out] A buffer in which to return the option flags describing the property, a logical OR of allowed bit-flag constants; see <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a></code> and following. Can be null if flags are not wanted.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if the property exists. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="9521e3838272ec501ffdb60ff3eb482f"></a><!-- doxytag: member="TXMPMeta::SetProperty_Bool" ref="9521e3838272ec501ffdb60ff3eb482f" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, bool propValue, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetProperty_Bool </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">bool&nbsp;</td>
+ <td class="paramname"> <em>propValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#9521e3838272ec501ffdb60ff3eb482f" title="SetProperty_Bool() sets the value of a Boolean property using a C++ bool.">SetProperty_Bool()</a></code> sets the value of a Boolean property using a C++ bool.
+<p>
+Sets a property with a binary value, creating it if necessary.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>The new binary value. Can be null if creating the property. Must be null for arrays and non-leaf levels of structs that do not have values.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the property; a logical OR of allowed bit-flag constants; see <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a></code> and following. Must match the type of a property that already exists. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="b8ae94130d9a05c1b9a3ee25588b6421"></a><!-- doxytag: member="TXMPMeta::SetProperty_Int" ref="b8ae94130d9a05c1b9a3ee25588b6421" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, long propValue, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetProperty_Int </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">long&nbsp;</td>
+ <td class="paramname"> <em>propValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#b8ae94130d9a05c1b9a3ee25588b6421" title="SetProperty_Int() sets the value of an integer property using a C long integer.">SetProperty_Int()</a></code> sets the value of an integer property using a C long integer.
+<p>
+Sets a property with a binary value, creating it if necessary.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>The new binary value. Can be null if creating the property. Must be null for arrays and non-leaf levels of structs that do not have values.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the property; a logical OR of allowed bit-flag constants; see <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a></code> and following. Must match the type of a property that already exists. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="df919aff205e934e4c8250a067f7b377"></a><!-- doxytag: member="TXMPMeta::SetProperty_Int64" ref="df919aff205e934e4c8250a067f7b377" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, long long propValue, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetProperty_Int64 </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">long long&nbsp;</td>
+ <td class="paramname"> <em>propValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#df919aff205e934e4c8250a067f7b377" title="SetProperty_Int64() sets the value of an integer property using a C long long integer...">SetProperty_Int64()</a></code> sets the value of an integer property using a C long long integer.
+<p>
+Sets a property with a binary value, creating it if necessary.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>The new binary value. Can be null if creating the property. Must be null for arrays and non-leaf levels of structs that do not have values.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the property; a logical OR of allowed bit-flag constants; see <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a></code> and following. Must match the type of a property that already exists. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="3b0f2f6bae57931ea96775f03608c0ed"></a><!-- doxytag: member="TXMPMeta::SetProperty_Float" ref="3b0f2f6bae57931ea96775f03608c0ed" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, double propValue, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetProperty_Float </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">double&nbsp;</td>
+ <td class="paramname"> <em>propValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#3b0f2f6bae57931ea96775f03608c0ed" title="SetProperty_Float() sets the value of a floating-point property using a C double...">SetProperty_Float()</a></code> sets the value of a floating-point property using a C double float.
+<p>
+Sets a property with a binary value, creating it if necessary.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>The new binary value. Can be null if creating the property. Must be null for arrays and non-leaf levels of structs that do not have values.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the property; a logical OR of allowed bit-flag constants; see <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a></code> and following. Must match the type of a property that already exists. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="eee10669445f77139d5634199ff01079"></a><!-- doxytag: member="TXMPMeta::SetProperty_Date" ref="eee10669445f77139d5634199ff01079" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, const XMP_DateTime &amp;propValue, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetProperty_Date </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> &amp;&nbsp;</td>
+ <td class="paramname"> <em>propValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#eee10669445f77139d5634199ff01079" title="SetProperty_Date() sets the value of a date/time property using an XMP_DateTime structure...">SetProperty_Date()</a></code> sets the value of a date/time property using an <code><a class="el" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a></code> structure.
+<p>
+Sets a property with a binary value, creating it if necessary.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>The new binary value. Can be null if creating the property. Must be null for arrays and non-leaf levels of structs that do not have values.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the property; a logical OR of allowed bit-flag constants; see <code><a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e" title="The value is a structure with nested fields.">kXMP_PropValueIsStruct</a></code> and following. Must match the type of a property that already exists. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="eefe49bbf669770d769f4fe0ea566bd0"></a><!-- doxytag: member="TXMPMeta::GetLocalizedText" ref="eefe49bbf669770d769f4fe0ea566bd0" args="(XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, tStringObj *actualLang, tStringObj *itemValue, XMP_OptionBits *options) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetLocalizedText </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>altTextName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>genericLang</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>specificLang</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>actualLang</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>itemValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
+ <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#eefe49bbf669770d769f4fe0ea566bd0" title="GetLocalizedText() retrieves information about a selected item in an alt-text array...">GetLocalizedText()</a></code> retrieves information about a selected item in an alt-text array.
+<p>
+The array item is selected according to these rules: <ul>
+<li>Look for an exact match with the specific language. </li>
+<li>If a generic language is given, look for a partial match. </li>
+<li>Look for an x-default item. </li>
+<li>Choose the first item.</li>
+</ul>
+A partial match with the generic language is where the start of the item's language matches the generic string and the next character is '-'. An exact match is also recognized as a degenerate case.<p>
+You can pass "x-default" as the specific language. In this case, selection of an <code>x-default</code> item is an exact match by the first rule, not a selection by the 3rd rule. The last 2 rules are fallbacks used when the specific and generic languages fail to produce a match.<p>
+The return value reports whether a match was successfully made.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the alt-text array; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>altTextName</em>&nbsp;</td><td>The name of the alt-text array. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>genericLang</em>&nbsp;</td><td>The name of the generic language as an RFC 3066 primary subtag. Can be null or the empty string if no generic language is wanted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>specificLang</em>&nbsp;</td><td>The name of the specific language as an RFC 3066 tag, or "x-default". Must not be null or the empty string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>actualLang</em>&nbsp;</td><td>[out] A string object in which to return the language of the selected array item, if an appropriate array item is found. Can be null if the language is not wanted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>itemValue</em>&nbsp;</td><td>[out] A string object in which to return the value of the array item, if an appropriate array item is found. Can be null if the value is not wanted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>A buffer in which to return the option flags that describe the array item, if an appropriate array item is found. Can be null if the flags are not wanted.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>True if an appropriate array item exists. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="f9531b949a462f5663b1f3fd99464c19"></a><!-- doxytag: member="TXMPMeta::SetLocalizedText" ref="f9531b949a462f5663b1f3fd99464c19" args="(XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, XMP_StringPtr itemValue, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetLocalizedText </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>altTextName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>genericLang</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>specificLang</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>itemValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19" title="SetLocalizedText() modifies the value of a selected item in an alt-text array.">SetLocalizedText()</a></code> modifies the value of a selected item in an alt-text array.
+<p>
+Creates an appropriate array item if necessary, and handles special cases for the x-default item.<p>
+The array item is selected according to these rules: <ul>
+<li>Look for an exact match with the specific language. </li>
+<li>If a generic language is given, look for a partial match. </li>
+<li>Look for an x-default item. </li>
+<li>Choose the first item.</li>
+</ul>
+A partial match with the generic language is where the start of the item's language matches the generic string and the next character is '-'. An exact match is also recognized as a degenerate case.<p>
+You can pass "x-default" as the specific language. In this case, selection of an <code>x-default</code> item is an exact match by the first rule, not a selection by the 3rd rule. The last 2 rules are fallbacks used when the specific and generic languages fail to produce a match.<p>
+Item values are modified according to these rules:<p>
+<ul>
+<li>If the selected item is from a match with the specific language, the value of that item is modified. If the existing value of that item matches the existing value of the x-default item, the x-default item is also modified. If the array only has 1 existing item (which is not x-default), an x-default item is added with the given value.</li>
+</ul>
+<ul>
+<li>If the selected item is from a match with the generic language and there are no other generic matches, the value of that item is modified. If the existing value of that item matches the existing value of the x-default item, the x-default item is also modified. If the array only has 1 existing item (which is not x-default), an x-default item is added with the given value.</li>
+</ul>
+<ul>
+<li>If the selected item is from a partial match with the generic language and there are other partial matches, a new item is created for the specific language. The x-default item is not modified.</li>
+</ul>
+<ul>
+<li>If the selected item is from the last 2 rules then a new item is created for the specific language. If the array only had an x-default item, the x-default item is also modified. If the array was empty, items are created for the specific language and x-default.</li>
+</ul>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the alt-text array; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>altTextName</em>&nbsp;</td><td>The name of the alt-text array. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>genericLang</em>&nbsp;</td><td>The name of the generic language as an RFC 3066 primary subtag. Can be null or the empty string if no generic language is wanted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>specificLang</em>&nbsp;</td><td>The name of the specific language as an RFC 3066 tag, or "x-default". Must not be null or the empty string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>itemValue</em>&nbsp;</td><td>The new value for the matching array item, specified as a null-terminated UTF-8 string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags, none currently defined. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="81273a152fb7b19e99c62ee39bf723f2"></a><!-- doxytag: member="TXMPMeta::SetLocalizedText" ref="81273a152fb7b19e99c62ee39bf723f2" args="(XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, const tStringObj &amp;itemValue, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetLocalizedText </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>altTextName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>genericLang</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>specificLang</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>itemValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19" title="SetLocalizedText() modifies the value of a selected item in an alt-text array.">SetLocalizedText()</a></code> modifies the value of a selected item in an alt-text array using a string object.
+<p>
+Creates an appropriate array item if necessary, and handles special cases for the x-default item.<p>
+The array item is selected according to these rules: <ul>
+<li>Look for an exact match with the specific language. </li>
+<li>If a generic language is given, look for a partial match. </li>
+<li>Look for an x-default item. </li>
+<li>Choose the first item.</li>
+</ul>
+A partial match with the generic language is where the start of the item's language matches the generic string and the next character is '-'. An exact match is also recognized as a degenerate case.<p>
+You can pass "x-default" as the specific language. In this case, selection of an <code>x-default</code> item is an exact match by the first rule, not a selection by the 3rd rule. The last 2 rules are fallbacks used when the specific and generic languages fail to produce a match.<p>
+Item values are modified according to these rules:<p>
+<ul>
+<li>If the selected item is from a match with the specific language, the value of that item is modified. If the existing value of that item matches the existing value of the x-default item, the x-default item is also modified. If the array only has 1 existing item (which is not x-default), an x-default item is added with the given value.</li>
+</ul>
+<ul>
+<li>If the selected item is from a match with the generic language and there are no other generic matches, the value of that item is modified. If the existing value of that item matches the existing value of the x-default item, the x-default item is also modified. If the array only has 1 existing item (which is not x-default), an x-default item is added with the given value.</li>
+</ul>
+<ul>
+<li>If the selected item is from a partial match with the generic language and there are other partial matches, a new item is created for the specific language. The x-default item is not modified.</li>
+</ul>
+<ul>
+<li>If the selected item is from the last 2 rules then a new item is created for the specific language. If the array only had an x-default item, the x-default item is also modified. If the array was empty, items are created for the specific language and x-default.</li>
+</ul>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the alt-text array; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>altTextName</em>&nbsp;</td><td>The name of the alt-text array. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>genericLang</em>&nbsp;</td><td>The name of the generic language as an RFC 3066 primary subtag. Can be null or the empty string if no generic language is wanted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>specificLang</em>&nbsp;</td><td>The name of the specific language as an RFC 3066 tag, or "x-default". Must not be null or the empty string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>itemValue</em>&nbsp;</td><td>The new value for the matching array item, specified as a string object.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags, none currently defined. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="7b383f5b357fff040cdbde82f4f43f26"></a><!-- doxytag: member="TXMPMeta::ParseFromBuffer" ref="7b383f5b357fff040cdbde82f4f43f26" args="(XMP_StringPtr buffer, XMP_StringLen bufferSize, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::ParseFromBuffer </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>buffer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a>&nbsp;</td>
+ <td class="paramname"> <em>bufferSize</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26" title="ParseFromBuffer() parses RDF from a series of input buffers into this XMP object...">ParseFromBuffer()</a></code> parses RDF from a series of input buffers into this XMP object.
+<p>
+Use this to convert metadata from serialized RDF form (as, for example, read from an XMP packet embedded in a file) into an XMP object that you can manipulate with the XMP Toolkit. If this XMP object is empty and the input buffer contains a complete XMP packet, this is the same as creating a new XMP object from that buffer with the constructor.<p>
+You can use this function to combine multiple buffers into a single metadata tree. To terminate an input loop conveniently, pass the option <code><a class="el" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c79b36427b7bf0c0a1ed010a44dec2d3e" title="This is the not last input buffer for this parse stream.">kXMP_ParseMoreBuffers</a></code> for all real input, then make a final call with a zero length and <code><a class="el" href="XMP__Const_8h.html#ff1df9f3cf050f8b8d3a574db3c3326b" title="Options macro clears all property-type bits.">kXMP_NoOptions</a></code>. The buffers can be any length. The buffer boundaries need not respect XML tokens or even Unicode characters.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>buffer</em>&nbsp;</td><td>A pointer to a buffer of input. Can be null if <code>bufferSize</code> is 0.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>bufferSize</em>&nbsp;</td><td>The length of the input buffer in bytes. Zero is a valid value.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>An options flag that controls how the parse operation is performed. A logical OR of these bit-flag constants: <ul>
+<li><code><a class="el" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c79b36427b7bf0c0a1ed010a44dec2d3e" title="This is the not last input buffer for this parse stream.">kXMP_ParseMoreBuffers</a></code> - This is not the last buffer of input, more calls follow. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c1e533852436acf75f594a4fb50a64400" title="Require a surrounding x:xmpmeta element.">kXMP_RequireXMPMeta</a></code> - The <code>x:xmpmeta</code> XML element is required around <code>rdf:RDF</code>.</li>
+</ul>
+</td></tr>
+ </table>
+</dl>
+<dl class="see" compact><dt><b>See also:</b></dt><dd><code><a class="el" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3" title="GetXMP() retrieves the XMP metadata from an open file.">TXMPFiles::GetXMP()</a></code> </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="2774a6f15ae22f0002201b58c46bfb49"></a><!-- doxytag: member="TXMPMeta::SerializeToBuffer" ref="2774a6f15ae22f0002201b58c46bfb49" args="(tStringObj *rdfString, XMP_OptionBits options, XMP_StringLen padding, XMP_StringPtr newline, XMP_StringPtr indent=&quot;&quot;, XMP_Index baseIndent=0) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SerializeToBuffer </td>
+ <td>(</td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>rdfString</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a>&nbsp;</td>
+ <td class="paramname"> <em>padding</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>newline</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>indent</em> = <code>&quot;&quot;</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>&nbsp;</td>
+ <td class="paramname"> <em>baseIndent</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49" title="SerializeToBuffer() serializes metadata in this XMP object into a string as RDF.">SerializeToBuffer()</a></code> serializes metadata in this XMP object into a string as RDF.
+<p>
+Use this to prepare metadata for storage as an XMP packet embedded in a file. See <code><a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a" title="PutXMP() updates the XMP metadata in this object without writing out the file.">TXMPFiles::PutXMP()</a></code>.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rdfString</em>&nbsp;</td><td>[out] A string object in which to return the serialized RDF. Must not be null.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>An options flag that controls how the serialization operation is performed. The specified options must be logically consistent; an exception is thrown if they are not. A logical OR of these bit-flag constants: <ul>
+<li><code>kXMP_OmitPacketWrapper</code> - Do not include an XML packet wrapper. This cannot be specified together with <code><a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e238c792322c5bd5f9e4db3165e01f9d6" title="Default is a writeable packet.">kXMP_ReadOnlyPacket</a></code>, <code><a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e0b659b3b544c7a5a076fbd3132cd7f7a" title="Include a padding allowance for a thumbnail image.">kXMP_IncludeThumbnailPad</a></code>, or <code><a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edb35599da481cc22ea6342b7b4de6bc6" title="The padding parameter is the overall packet length.">kXMP_ExactPacketLength</a></code>. </li>
+<li><code>kXMP_ReadOnlyPacket</code> - Create a read-only XML packet wapper. Cannot be specified together with <code>kXMP_OmitPacketWrapper</code>. </li>
+<li><code>kXMP_UseCompactFormat</code> - Use a highly compact RDF syntax and layout. </li>
+<li><code>kXMP_WriteAliasComments</code> - Include XML comments for aliases. </li>
+<li><code>kXMP_IncludeThumbnailPad</code> - Include typical space for a JPEG thumbnail in the padding if no <code>xmp:Thumbnails</code> property is present. Cannot be specified together with <code>kXMP_OmitPacketWrapper</code>. </li>
+<li><code>kXMP_ExactPacketLength</code> - The padding parameter provides the overall packet length. The actual amount of padding is computed. An exception is thrown if the packet exceeds this length with no padding. Cannot be specified together with <code>kXMP_OmitPacketWrapper</code>.</li>
+</ul>
+In addition to the above options, you can include one of the following encoding options: <ul>
+<li><code><a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edc8f241694f5a758e5ee3f6db69d02ab" title="Use UTF8 encoding.">kXMP_EncodeUTF8</a></code> - Encode as UTF-8, the default. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e310e4cbf639e783163778566b439f01d" title="Use UTF16 big-endian encoding.">kXMP_EncodeUTF16Big</a></code> - Encode as big-endian UTF-16. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9efc6417e382c98a2d507830de62fd4830" title="Use UTF16 little-endian encoding.">kXMP_EncodeUTF16Little</a></code> - Encode as little-endian UTF-16. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e793e99d9ea83f0aadd5b4193a95ea713" title="Use UTF32 big-endian encoding.">kXMP_EncodeUTF32Big</a></code> - Encode as big-endian UTF-32. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9ee0137d98ea990fa23d292489031ba09e" title="Use UTF13 little-endian encoding.">kXMP_EncodeUTF32Little</a></code> - Encode as little-endian UTF-32.</li>
+</ul>
+</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>padding</em>&nbsp;</td><td>The amount of padding to be added if a writeable XML packet is created. If zero (the default) an appropriate amount of padding is computed.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>newline</em>&nbsp;</td><td>The string to be used as a line terminator. If empty, defaults to linefeed, U+000A, the standard XML newline.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>indent</em>&nbsp;</td><td>The string to be used for each level of indentation in the serialized RDF. If empty, defaults to two ASCII spaces, U+0020.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>baseIndent</em>&nbsp;</td><td>The number of levels of indentation to be used for the outermost XML element in the serialized RDF. This is convenient when embedding the RDF in other text. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="0d98bc15bdb0f45737b15fc6822f3bc6"></a><!-- doxytag: member="TXMPMeta::SerializeToBuffer" ref="0d98bc15bdb0f45737b15fc6822f3bc6" args="(tStringObj *rdfString, XMP_OptionBits options=0, XMP_StringLen padding=0) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SerializeToBuffer </td>
+ <td>(</td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>rdfString</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a>&nbsp;</td>
+ <td class="paramname"> <em>padding</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49" title="SerializeToBuffer() serializes metadata in this XMP object into a string as RDF.">SerializeToBuffer()</a></code> serializes metadata in this XMP object into a string as RDF.
+<p>
+This simpler form of the function uses default values for the <code>newline</code>, <code>indent</code>, and <code>baseIndent</code> parameters.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rdfString</em>&nbsp;</td><td>[out] A string object in which to return the serialized RDF. Must not be null.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>An options flag that controls how the serialization operation is performed. The specified options must be logically consistent; an exception is thrown if they are not. A logical OR of these bit-flag constants: <ul>
+<li><code>kXMP_OmitPacketWrapper</code> - Do not include an XML packet wrapper. This cannot be specified together with <code><a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e238c792322c5bd5f9e4db3165e01f9d6" title="Default is a writeable packet.">kXMP_ReadOnlyPacket</a></code>, <code><a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e0b659b3b544c7a5a076fbd3132cd7f7a" title="Include a padding allowance for a thumbnail image.">kXMP_IncludeThumbnailPad</a></code>, or <code><a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edb35599da481cc22ea6342b7b4de6bc6" title="The padding parameter is the overall packet length.">kXMP_ExactPacketLength</a></code>. </li>
+<li><code>kXMP_ReadOnlyPacket</code> - Create a read-only XML packet wapper. Cannot be specified together with <code>kXMP_OmitPacketWrapper</code>. </li>
+<li><code>kXMP_UseCompactFormat</code> - Use a highly compact RDF syntax and layout. </li>
+<li><code>kXMP_WriteAliasComments</code> - Include XML comments for aliases. </li>
+<li><code>kXMP_IncludeThumbnailPad</code> - Include typical space for a JPEG thumbnail in the padding if no <code>xmp:Thumbnails</code> property is present. Cannot be specified together with <code>kXMP_OmitPacketWrapper</code>. </li>
+<li><code>kXMP_ExactPacketLength</code> - The padding parameter provides the overall packet length. The actual amount of padding is computed. An exception is thrown if the packet exceeds this length with no padding. Cannot be specified together with <code>kXMP_OmitPacketWrapper</code>.</li>
+</ul>
+In addition to the above options, you can include one of the following encoding options: <ul>
+<li><code><a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edc8f241694f5a758e5ee3f6db69d02ab" title="Use UTF8 encoding.">kXMP_EncodeUTF8</a></code> - Encode as UTF-8, the default. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e310e4cbf639e783163778566b439f01d" title="Use UTF16 big-endian encoding.">kXMP_EncodeUTF16Big</a></code> - Encode as big-endian UTF-16. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9efc6417e382c98a2d507830de62fd4830" title="Use UTF16 little-endian encoding.">kXMP_EncodeUTF16Little</a></code> - Encode as little-endian UTF-16. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e793e99d9ea83f0aadd5b4193a95ea713" title="Use UTF32 big-endian encoding.">kXMP_EncodeUTF32Big</a></code> - Encode as big-endian UTF-32. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9ee0137d98ea990fa23d292489031ba09e" title="Use UTF13 little-endian encoding.">kXMP_EncodeUTF32Little</a></code> - Encode as little-endian UTF-32.</li>
+</ul>
+</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>padding</em>&nbsp;</td><td>The amount of padding to be added if a writeable XML packet is created. If zero (the default) an appropriate amount of padding is computed. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="fbfebded0b85b08bd9c5ba0d7dae07e0"></a><!-- doxytag: member="TXMPMeta::GetInternalRef" ref="fbfebded0b85b08bd9c5ba0d7dae07e0" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="XMP__Const_8h.html#549d5e2cbcb58302d3df840a0205283e">XMPMetaRef</a> <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetInternalRef </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Retrieves an internal reference that can be safely passed across DLL boundaries and reconstructed.
+<p>
+The <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> class is a normal C++ template, it is instantiated and local to each client executable, as are the other <code>TXMP*</code> classes. Different clients might not use the same string type to instantiate <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code>.<p>
+Because of this you should not pass <code>SXMPMeta</code> objects, or pointers to <code>SXMPMeta</code> objects, across DLL boundaries. Use this function to obtain a safe internal reference that you can pass, then construct a local object on the callee side. This construction does not create a cloned XMP tree, it is the same underlying XMP object safely wrapped in each client's <code>SXMPMeta</code> object.<p>
+Use this function and the associated constructor like this: <ul>
+<li>The callee's header contains: <pre>
+ CalleeMethod ( XMPMetaRef xmpRef );
+ </pre></li>
+</ul>
+<ul>
+<li>The caller's code contains: <pre>
+ SXMPMeta callerXMP;
+ CalleeMethod ( callerXMP.GetInternalRef() );
+ </pre></li>
+</ul>
+<ul>
+<li>The callee's code contains: <pre>
+ SXMPMeta calleeXMP ( xmpRef );
+ </pre></li>
+</ul>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The reference object. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="b0d179ed95487d4fd4f2680c1fbe0d40"></a><!-- doxytag: member="TXMPMeta::GetObjectName" ref="b0d179ed95487d4fd4f2680c1fbe0d40" args="(tStringObj *name) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetObjectName </td>
+ <td>(</td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>name</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#b0d179ed95487d4fd4f2680c1fbe0d40" title="GetObjectName() retrieves the client-assigned name of this XMP object.">GetObjectName()</a></code> retrieves the client-assigned name of this XMP object.
+<p>
+Assign this name with <code><a class="el" href="classTXMPMeta.html#cf1935be8e4849976dfc02325424960a" title="SetObjectName() assigns a name to this XMP object.">SetObjectName()</a></code>.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>[out] A string object in which to return the name. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="cf1935be8e4849976dfc02325424960a"></a><!-- doxytag: member="TXMPMeta::SetObjectName" ref="cf1935be8e4849976dfc02325424960a" args="(XMP_StringPtr name)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetObjectName </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>name</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#cf1935be8e4849976dfc02325424960a" title="SetObjectName() assigns a name to this XMP object.">SetObjectName()</a></code> assigns a name to this XMP object.
+<p>
+Retrieve this client-assigned name with <code><a class="el" href="classTXMPMeta.html#b0d179ed95487d4fd4f2680c1fbe0d40" title="GetObjectName() retrieves the client-assigned name of this XMP object.">GetObjectName()</a></code>.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>The name as a null-terminated UTF-8 string. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="fd059cc7cd9f906e12dab04e380e495c"></a><!-- doxytag: member="TXMPMeta::SetObjectName" ref="fd059cc7cd9f906e12dab04e380e495c" args="(tStringObj name)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetObjectName </td>
+ <td>(</td>
+ <td class="paramtype">tStringObj&nbsp;</td>
+ <td class="paramname"> <em>name</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#cf1935be8e4849976dfc02325424960a" title="SetObjectName() assigns a name to this XMP object.">SetObjectName()</a></code> assigns a name to this XMP object.
+<p>
+Retrieve this client-assigned name with <code><a class="el" href="classTXMPMeta.html#b0d179ed95487d4fd4f2680c1fbe0d40" title="GetObjectName() retrieves the client-assigned name of this XMP object.">GetObjectName()</a></code>.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>The name as a string object. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="8ac5a02a13d439ff33ed4431986da681"></a><!-- doxytag: member="TXMPMeta::Sort" ref="8ac5a02a13d439ff33ed4431986da681" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::Sort </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#8ac5a02a13d439ff33ed4431986da681" title="Sort() sorts the data model tree of an XMP object.">Sort()</a></code> sorts the data model tree of an XMP object.
+<p>
+Use this function to sort the data model of an XMP object into a canonical order. This can be convenient when comparing data models, (e.g. by text comparison of DumpObject output).<p>
+At the top level the namespaces are sorted by their prefixes. Within a namespace, the top level properties are sorted by name. Within a struct, the fields are sorted by their qualified name, i.e. their XML prefix:local form. Unordered arrays of simple items are sorted by value. Language Alternative arrays are sorted by the xml:lang qualifiers, with the "x-default" item placed first.
+</div>
+</div><p>
+<a class="anchor" name="6ca653436995bbb76315efe7934afd4c"></a><!-- doxytag: member="TXMPMeta::Clone" ref="6ca653436995bbb76315efe7934afd4c" args="(XMP_OptionBits options=0) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classTXMPMeta.html">TXMPMeta</a> <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::Clone </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#6ca653436995bbb76315efe7934afd4c" title="Clone() creates a deep copy of an XMP object.">Clone()</a></code> creates a deep copy of an XMP object.
+<p>
+Use this function to copy an entire XMP metadata tree. Assignment and copy constructors only increment a reference count, they do not do a deep copy. This function returns an object, not a pointer. The following shows correct usage:<p>
+<pre>
+ SXMPMeta * clone1 = new SXMPMeta ( sourceXMP.Clone() ); // This works.
+ SXMPMeta clone2 ( sourceXMP.Clone ); // This works also. (Not a pointer.)
+ </pre> The <code>clone2</code> example does not use an explicit pointer. This is good for local usage, protecting against memory leaks.<p>
+This is an example of incorrect usage: <pre>
+ SXMPMeta * clone3 = &amp;sourceXMP.Clone(); // ! This does not work!
+ </pre> The assignment to <code>clone3</code> creates a temporary object, initializes it with the clone, assigns the address of the temporary to <code>clone3</code>, then deletes the temporary.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags, not currently defined..</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>An XMP object cloned from the original. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="b79aae864b3ce190d0699252f48e0acc"></a><!-- doxytag: member="TXMPMeta::CountArrayItems" ref="b79aae864b3ce190d0699252f48e0acc" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::CountArrayItems </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayName</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#b79aae864b3ce190d0699252f48e0acc" title="CountArrayItems() reports the number of items currently defined in an array.">CountArrayItems()</a></code> reports the number of items currently defined in an array.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. Can be a general path expression, must not be null or the empty string; see <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">GetProperty()</a></code> for namespace prefix usage.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The number of items. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="466fa349c9765f39ca6b1450908e769f"></a><!-- doxytag: member="TXMPMeta::DumpObject" ref="466fa349c9765f39ca6b1450908e769f" args="(XMP_TextOutputProc outProc, void *clientData) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Status</a> <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DumpObject </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#8ce3570e6e5ac14cd603e96fa9d2936f">XMP_TextOutputProc</a>&nbsp;</td>
+ <td class="paramname"> <em>outProc</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&nbsp;</td>
+ <td class="paramname"> <em>clientData</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPMeta.html#466fa349c9765f39ca6b1450908e769f" title="DumpObject() outputs the content of an XMP object to a callback handler for debugging...">DumpObject()</a></code> outputs the content of an XMP object to a callback handler for debugging.
+<p>
+Invokes a client-defined callback for each line of output.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>outProc</em>&nbsp;</td><td>The client-defined procedure to handle each line of output.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>clientData</em>&nbsp;</td><td>A pointer to client-defined data to pass to the handler.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>A success-fail status value, returned from the handler. Zero is success, failure values are client-defined.</dd></dl>
+<dl class="see" compact><dt><b>See also:</b></dt><dd>Static functions <code><a class="el" href="classTXMPMeta.html#addc5f555de57472939a41346e276817" title="DumpNamespaces() sends the list of registered namespace URIs and prefixes to a handler...">DumpNamespaces()</a></code> and <code><a class="el" href="classTXMPMeta.html#c2e1bbfd6b9188afb730260808557512" title="DumpAliases() sends the list of registered aliases and corresponding actuals to a...">DumpAliases()</a></code> </dd></dl>
+
+</div>
+</div><p>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="TXMPMeta_8hpp-source.html">TXMPMeta.hpp</a></ul>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/XMPToolkit/classTXMPUtils-members.html b/docs/API/classTXMPUtils-members.html
index f905f69..1b76559 100644
--- a/docs/XMPToolkit/classTXMPUtils-members.html
+++ b/docs/API/classTXMPUtils-members.html
@@ -1,22 +1,68 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Member List</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul></div>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
<h1>TXMPUtils&lt; tStringObj &gt; Member List</h1>This is the complete list of members for <a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a>, including all inherited members.<p><table>
<tr class="memlist"><td><a class="el" href="classTXMPUtils.html#4795244ffcbda927800f789b0e40c262">AppendProperties</a>(const TXMPMeta&lt; tStringObj &gt; &amp;source, TXMPMeta&lt; tStringObj &gt; *dest, XMP_OptionBits options=0)</td><td><a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPUtils.html#d7e1aa7928252fb88a24fb5c3aef22ba">CatenateArrayItems</a>(const TXMPMeta&lt; tStringObj &gt; &amp;xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr separator, XMP_StringPtr quotes, XMP_OptionBits options, tStringObj *catedStr)</td><td><a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
@@ -32,6 +78,7 @@
<tr class="memlist"><td><a class="el" href="classTXMPUtils.html#6146a522a3974b4088d6e8241e9cd223">ConvertFromDate</a>(const XMP_DateTime &amp;binValue, tStringObj *strValue)</td><td><a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPUtils.html#e67ef3931836432b7e574832f0610ed0">ConvertFromFloat</a>(double binValue, XMP_StringPtr format, tStringObj *strValue)</td><td><a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPUtils.html#eec45b4d1a26717290105c9f4e8b4235">ConvertFromInt</a>(long binValue, XMP_StringPtr format, tStringObj *strValue)</td><td><a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTXMPUtils.html#eae4617e05358433015eaa80953c5e60">ConvertFromInt64</a>(long long binValue, XMP_StringPtr format, tStringObj *strValue)</td><td><a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPUtils.html#aaaaadb23f4089daa795f50cba4f405c">ConvertToBool</a>(XMP_StringPtr strValue)</td><td><a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPUtils.html#84f2a7b3960a17315032915674e21960">ConvertToBool</a>(const tStringObj &amp;strValue)</td><td><a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPUtils.html#60d33e6ce30286028acca47b2b6e7a0b">ConvertToDate</a>(XMP_StringPtr strValue, XMP_DateTime *binValue)</td><td><a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
@@ -56,8 +103,8 @@
<tr class="memlist"><td><a class="el" href="classTXMPUtils.html#66c5ddee47aa36ed906353f94ca18d2e">SeparateArrayItems</a>(TXMPMeta&lt; tStringObj &gt; *xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits options, XMP_StringPtr catedStr)</td><td><a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPUtils.html#1bb2ed614886ff67863744ec56041c43">SeparateArrayItems</a>(TXMPMeta&lt; tStringObj &gt; *xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits options, const tStringObj &amp;catedStr)</td><td><a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTXMPUtils.html#96bcc45febac55f6c49951815b7de2ef">SetTimeZone</a>(XMP_DateTime *time)</td><td><a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
-</table><hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:59 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
+</table></div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
</body>
</html>
diff --git a/docs/API/classTXMPUtils.html b/docs/API/classTXMPUtils.html
new file mode 100644
index 0000000..a89ff32
--- /dev/null
+++ b/docs/API/classTXMPUtils.html
@@ -0,0 +1,2116 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: TXMPUtils&lt; tStringObj &gt; Class Template Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>TXMPUtils&lt; tStringObj &gt; Class Template Reference</h1><!-- doxytag: class="TXMPUtils" -->API for access to the XMP Toolkit utility services.
+<a href="#_details">More...</a>
+<p>
+<code>#include &lt;<a class="el" href="TXMPUtils_8hpp-source.html">TXMPUtils.hpp</a>&gt;</code>
+<p>
+
+<p>
+<a href="classTXMPUtils-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Path composition</div></td></tr>
+<tr><td colspan="2"><div class="groupText">These functions provide support for composing path expressions to deeply nested properties. The functions in <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> such as <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">TXMPMeta::GetProperty()</a></code>, <code><a class="el" href="classTXMPMeta.html#c64a4251d157937f69b73f2ffac4f7cc" title="GetArrayItem() provides access to items within an array.">TXMPMeta::GetArrayItem()</a></code>, and <code><a class="el" href="classTXMPMeta.html#885ef7127b897e349f71fa493ace3c94" title="GetStructField() provides access to fields within a nested structure.">TXMPMeta::GetStructField()</a></code> provide easy access to top level simple properties, items in top level arrays, and fields of top level structs. They are not as convenient for more complex things, such as fields several levels deep in a complex struct, or fields within an array of structs, or items of an array that is a field of a struct. You can use these utility functions to compose these paths, which you can then pass to the property access functions. You can also compose paths to top-level array items or struct fields so that you can use the binary accessors such as <code><a class="el" href="classTXMPMeta.html#3b6ba486c02607b544917091c43b05cc" title="GetProperty_Int() retrieves the value of an integer property as a C long integer...">TXMPMeta::GetProperty_Int()</a></code>.<p>
+You can use these functions is to compose a complete path expression, or all but the last component. For example, suppose you have a property that is an array of integers within a struct. You can access one of the array items like this:<p>
+<pre>
+ SXMPUtils::ComposeStructFieldPath ( schemaNS, "Struct", fieldNS, "Array", &amp;path );
+ SXMPUtils::ComposeArrayItemPath ( schemaNS, path, index, &amp;path );
+ exists = xmpObj.GetProperty_Int ( schemaNS, path, &amp;value, &amp;options );
+ </pre><p>
+You could also use this code if you want the string form of the integer:<p>
+<pre>
+ SXMPUtils::ComposeStructFieldPath ( schemaNS, "Struct", fieldNS, "Array", &amp;path );
+ xmpObj.GetArrayItem ( schemaNS, path, index, &amp;value, &amp;options );
+ </pre><p>
+<dl class="note" compact><dt><b>Note:</b></dt><dd>It might look confusing that the <code>schemaNS</code> is passed in all of the calls above. This is because the XMP Toolkit keeps the top-level "schema" namespace separate from the rest of the path expression. </dd></dl>
+<br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#47fa195aa2e1457aa1f74f7e1ed06da6">ComposeArrayItemPath</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex, tStringObj *fullPath)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#47fa195aa2e1457aa1f74f7e1ed06da6" title="ComposeArrayItemPath() composes the path expression for an item in an array.">ComposeArrayItemPath()</a></code> composes the path expression for an item in an array. <a href="#47fa195aa2e1457aa1f74f7e1ed06da6"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#706eb85b8401b8682a01348f7e25ee3d">ComposeStructFieldPath</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName, tStringObj *fullPath)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#706eb85b8401b8682a01348f7e25ee3d" title="ComposeStructFieldPath() composes the path expression for a field in a struct.">ComposeStructFieldPath()</a></code> composes the path expression for a field in a struct. <a href="#706eb85b8401b8682a01348f7e25ee3d"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#40ae0ce2065fcb71725e37137884e172">ComposeQualifierPath</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName, tStringObj *fullPath)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#40ae0ce2065fcb71725e37137884e172" title="ComposeQualifierPath() composes the path expression for a qualifier.">ComposeQualifierPath()</a></code> composes the path expression for a qualifier. <a href="#40ae0ce2065fcb71725e37137884e172"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#e4989e5c199a2a4287ee3ae89b872e69">ComposeLangSelector</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> langName, tStringObj *fullPath)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#e4989e5c199a2a4287ee3ae89b872e69" title="ComposeLangSelector() composes the path expression to select an alternate item by...">ComposeLangSelector()</a></code> composes the path expression to select an alternate item by language. <a href="#e4989e5c199a2a4287ee3ae89b872e69"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#7882bbc2e412ff476c2d97d98808d91c">ComposeLangSelector</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, const tStringObj &amp;langName, tStringObj *fullPath)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#e4989e5c199a2a4287ee3ae89b872e69" title="ComposeLangSelector() composes the path expression to select an alternate item by...">ComposeLangSelector()</a></code> composes a path expression to select an alternate item by language. <a href="#7882bbc2e412ff476c2d97d98808d91c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#458f8e8729e2334fe54ca8f691a9db23">ComposeFieldSelector</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldValue, tStringObj *fullPath)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#458f8e8729e2334fe54ca8f691a9db23" title="ComposeFieldSelector() composes a path expression to select an alternate item by...">ComposeFieldSelector()</a></code> composes a path expression to select an alternate item by a field's value. <a href="#458f8e8729e2334fe54ca8f691a9db23"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#d2d2361b8a4d0709ec9e3bd837265cba">ComposeFieldSelector</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName, const tStringObj &amp;fieldValue, tStringObj *fullPath)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#458f8e8729e2334fe54ca8f691a9db23" title="ComposeFieldSelector() composes a path expression to select an alternate item by...">ComposeFieldSelector()</a></code> composes a path expression to select an alternate item by a field's value. <a href="#d2d2361b8a4d0709ec9e3bd837265cba"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Conversion between binary types and strings</div></td></tr>
+<tr><td colspan="2"><div class="groupText">The main accessors in <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> set and retrieve property values as strings. additional functions, such as <code>TXMPMeta::SetPropertyInt()</code>, set and retrieve property values as explicit binary data types. Use these functions to convert between binary and string values.<p>
+Strings can be specified as null-terminated UTF-8 (<code><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a></code>), or as string objects (<code>tStringObj</code>) of the type declared when instantiating the XMP classes; see <code>XMP.hpp</code>. Alternate forms of each conversion function allow either type of string. <br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#509691eb270988de6a770c9c8304ab6b">ConvertFromBool</a> (bool binValue, tStringObj *strValue)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#509691eb270988de6a770c9c8304ab6b" title="ConvertFromBool() converts a Boolean value to a string.">ConvertFromBool()</a></code> converts a Boolean value to a string. <a href="#509691eb270988de6a770c9c8304ab6b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#eec45b4d1a26717290105c9f4e8b4235">ConvertFromInt</a> (long binValue, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> format, tStringObj *strValue)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#eec45b4d1a26717290105c9f4e8b4235" title="ConvertFromInt() converts a 32-bit integer value to a string.">ConvertFromInt()</a></code> converts a 32-bit integer value to a string. <a href="#eec45b4d1a26717290105c9f4e8b4235"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#eae4617e05358433015eaa80953c5e60">ConvertFromInt64</a> (long long binValue, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> format, tStringObj *strValue)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#eae4617e05358433015eaa80953c5e60" title="ConvertFromInt64() converts a 64-bit integer value to a string.">ConvertFromInt64()</a></code> converts a 64-bit integer value to a string. <a href="#eae4617e05358433015eaa80953c5e60"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#e67ef3931836432b7e574832f0610ed0">ConvertFromFloat</a> (double binValue, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> format, tStringObj *strValue)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#e67ef3931836432b7e574832f0610ed0" title="ConvertFromFloat() converts a floating-point value to a string.">ConvertFromFloat()</a></code> converts a floating-point value to a string. <a href="#e67ef3931836432b7e574832f0610ed0"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#6146a522a3974b4088d6e8241e9cd223">ConvertFromDate</a> (const <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> &amp;binValue, tStringObj *strValue)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#6146a522a3974b4088d6e8241e9cd223" title="ConvertFromDate() converts a date/time value to a string.">ConvertFromDate()</a></code> converts a date/time value to a string. <a href="#6146a522a3974b4088d6e8241e9cd223"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#aaaaadb23f4089daa795f50cba4f405c">ConvertToBool</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> strValue)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#aaaaadb23f4089daa795f50cba4f405c" title="ConvertToBool() converts a string to a Boolean value.">ConvertToBool()</a></code> converts a string to a Boolean value. <a href="#aaaaadb23f4089daa795f50cba4f405c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#84f2a7b3960a17315032915674e21960">ConvertToBool</a> (const tStringObj &amp;strValue)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#aaaaadb23f4089daa795f50cba4f405c" title="ConvertToBool() converts a string to a Boolean value.">ConvertToBool()</a></code> converts a string to a Boolean value. <a href="#84f2a7b3960a17315032915674e21960"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static long&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#dfd9d1c522377d5db4ad667a7973ba00">ConvertToInt</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> strValue)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#dfd9d1c522377d5db4ad667a7973ba00" title="ConvertToInt() converts a string to a 32-bit integer value.">ConvertToInt()</a></code> converts a string to a 32-bit integer value. <a href="#dfd9d1c522377d5db4ad667a7973ba00"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static long&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#47d93f9cb4acd9d7ec6b450100209bec">ConvertToInt</a> (const tStringObj &amp;strValue)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#dfd9d1c522377d5db4ad667a7973ba00" title="ConvertToInt() converts a string to a 32-bit integer value.">ConvertToInt()</a></code> converts a string to a 32-bit integer value. <a href="#47d93f9cb4acd9d7ec6b450100209bec"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static long long&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#be5d2dcc03c5442202203bba5ca7b172">ConvertToInt64</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> strValue)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#be5d2dcc03c5442202203bba5ca7b172" title="ConvertToInt64() converts a string to a 64-bit integer value.">ConvertToInt64()</a></code> converts a string to a 64-bit integer value. <a href="#be5d2dcc03c5442202203bba5ca7b172"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static long long&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#711cae0cb1b673ff5e208b4ae458d120">ConvertToInt64</a> (const tStringObj &amp;strValue)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#be5d2dcc03c5442202203bba5ca7b172" title="ConvertToInt64() converts a string to a 64-bit integer value.">ConvertToInt64()</a></code> converts a string to a 64-bit integer value. <a href="#711cae0cb1b673ff5e208b4ae458d120"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static double&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#8a507b006286460814e0486c622d828c">ConvertToFloat</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> strValue)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#8a507b006286460814e0486c622d828c" title="ConvertToFloat() converts a string to a floating-point value.">ConvertToFloat()</a></code> converts a string to a floating-point value. <a href="#8a507b006286460814e0486c622d828c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static double&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#abd4e479d2708a9ea3135cd441faa7ea">ConvertToFloat</a> (const tStringObj &amp;strValue)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#8a507b006286460814e0486c622d828c" title="ConvertToFloat() converts a string to a floating-point value.">ConvertToFloat()</a></code> converts a string to a floating-point value. <a href="#abd4e479d2708a9ea3135cd441faa7ea"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#60d33e6ce30286028acca47b2b6e7a0b">ConvertToDate</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> strValue, <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *binValue)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#60d33e6ce30286028acca47b2b6e7a0b" title="ConvertToDate() converts a string to a date/time value.">ConvertToDate()</a></code> converts a string to a date/time value. <a href="#60d33e6ce30286028acca47b2b6e7a0b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#265559d1b4b78e34a460e935c11177d7">ConvertToDate</a> (const tStringObj &amp;strValue, <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *binValue)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#60d33e6ce30286028acca47b2b6e7a0b" title="ConvertToDate() converts a string to a date/time value.">ConvertToDate()</a></code> converts a string to a date/time value. <a href="#265559d1b4b78e34a460e935c11177d7"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Date-time manipulation</div></td></tr>
+<tr><td colspan="2"><div class="groupText">In addition to the type-conversion functions that convert between strings and binary date-time values, these functions create, manipulate, and compare date-time values. <br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#c83f0b963ea64d7eee0b481e15a8439c">CurrentDateTime</a> (<a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *time)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#c83f0b963ea64d7eee0b481e15a8439c" title="CurrentDateTime() obtains the current date and time.">CurrentDateTime()</a></code> obtains the current date and time. <a href="#c83f0b963ea64d7eee0b481e15a8439c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#96bcc45febac55f6c49951815b7de2ef">SetTimeZone</a> (<a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *time)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#96bcc45febac55f6c49951815b7de2ef" title="SetTimeZone() sets the time zone in a date/time value to the local time zone.">SetTimeZone()</a></code> sets the time zone in a date/time value to the local time zone. <a href="#96bcc45febac55f6c49951815b7de2ef"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#bbd4d691c83287ea2fc6b1e33e5858b8">ConvertToUTCTime</a> (<a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *time)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#bbd4d691c83287ea2fc6b1e33e5858b8" title="ConvertToUTCTime() ensures that a time is UTC.">ConvertToUTCTime()</a></code> ensures that a time is UTC. <a href="#bbd4d691c83287ea2fc6b1e33e5858b8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#61852aaba494c8fbad5a6c0c4caf21f5">ConvertToLocalTime</a> (<a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *time)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#61852aaba494c8fbad5a6c0c4caf21f5" title="ConvertToLocalTime() ensures that a time is local.">ConvertToLocalTime()</a></code> ensures that a time is local. <a href="#61852aaba494c8fbad5a6c0c4caf21f5"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#9fc7f1771032f59f9020aeda4f91991d">CompareDateTime</a> (const <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> &amp;left, const <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> &amp;right)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#9fc7f1771032f59f9020aeda4f91991d" title="CompareDateTime() compares the order of two date/time values.">CompareDateTime()</a></code> compares the order of two date/time values. <a href="#9fc7f1771032f59f9020aeda4f91991d"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Base64 encoding and decoding</div></td></tr>
+<tr><td colspan="2"><div class="groupText">These functions convert between raw data values and Base64-encoded strings. <br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#ef3b23bbc152480f699e269620ecad4a">EncodeToBase64</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> rawStr, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> rawLen, tStringObj *encodedStr)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#ef3b23bbc152480f699e269620ecad4a" title="EncodeToBase64() converts a raw data value to a Base64-encoded string.">EncodeToBase64()</a></code> converts a raw data value to a Base64-encoded string. <a href="#ef3b23bbc152480f699e269620ecad4a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#39d5de77b29441a30f2f879755b8e7d8">EncodeToBase64</a> (const tStringObj &amp;rawStr, tStringObj *encodedStr)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#ef3b23bbc152480f699e269620ecad4a" title="EncodeToBase64() converts a raw data value to a Base64-encoded string.">EncodeToBase64()</a></code> converts a raw data value passed in a string object to a Base64-encoded string. <a href="#39d5de77b29441a30f2f879755b8e7d8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#e5bdd91c0c3ee9262dc0a8b9f591b921">DecodeFromBase64</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> encodedStr, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> encodedLen, tStringObj *rawStr)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#e5bdd91c0c3ee9262dc0a8b9f591b921" title="DecodeFromBase64() Decodes a Base64-encoded string to raw data.">DecodeFromBase64()</a></code> Decodes a Base64-encoded string to raw data. <a href="#e5bdd91c0c3ee9262dc0a8b9f591b921"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#1e61e273065b10517ca127d5a553a8dc">DecodeFromBase64</a> (const tStringObj &amp;encodedStr, tStringObj *rawStr)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#e5bdd91c0c3ee9262dc0a8b9f591b921" title="DecodeFromBase64() Decodes a Base64-encoded string to raw data.">DecodeFromBase64()</a></code> Decodes a Base64-encoded string, passed as a string object, to raw data. <a href="#1e61e273065b10517ca127d5a553a8dc"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">JPEG file handling</div></td></tr>
+<tr><td colspan="2"><div class="groupText">These functions support the partitioning of XMP in JPEG files into standard and extended portions in order to work around the 64KB size limit of JPEG marker segments.<p>
+<dl class="note" compact><dt><b>Note:</b></dt><dd>(Doc note) Add detail about how to write out and read back extended data </dd></dl>
+<br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#6001b4ff54c60fdf0c40e6b78a5c457a">PackageForJPEG</a> (const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;xmpObj, tStringObj *standardXMP, tStringObj *extendedXMP, tStringObj *extendedDigest)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#6001b4ff54c60fdf0c40e6b78a5c457a" title="PackageForJPEG() creates XMP serializations appropriate for a JPEG file.">PackageForJPEG()</a></code> creates XMP serializations appropriate for a JPEG file. <a href="#6001b4ff54c60fdf0c40e6b78a5c457a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#6187cd5fef0eccecac6805d4114dcd2e">MergeFromJPEG</a> (<a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *fullXMP, const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;extendedXMP)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#6187cd5fef0eccecac6805d4114dcd2e" title="MergeFromJPEG() merges standard and extended XMP retrieved from a JPEG file.">MergeFromJPEG()</a></code> merges standard and extended XMP retrieved from a JPEG file. <a href="#6187cd5fef0eccecac6805d4114dcd2e"></a><br></td></tr>
+<tr><td colspan="2"><div class="groupHeader">Editing utilities</div></td></tr>
+<tr><td colspan="2"><div class="groupText">These functions are useful in implementing a user interface for editing XMP. They convert sets of property values to and from displayable and manipulable strings, and perform operations on sets of metadata, such as those available from the File Info dialog box. <br><br></div></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#d7e1aa7928252fb88a24fb5c3aef22ba">CatenateArrayItems</a> (const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;xmpObj, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> separator, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> quotes, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options, tStringObj *catedStr)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#d7e1aa7928252fb88a24fb5c3aef22ba" title="CatenateArrayItems() creates a single edit string from a set of array item values...">CatenateArrayItems()</a></code> creates a single edit string from a set of array item values. <a href="#d7e1aa7928252fb88a24fb5c3aef22ba"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#66c5ddee47aa36ed906353f94ca18d2e">SeparateArrayItems</a> (<a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *xmpObj, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> catedStr)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#66c5ddee47aa36ed906353f94ca18d2e" title="SeparateArrayItems() updates an array from a concatenated edit string of values.">SeparateArrayItems()</a></code> updates an array from a concatenated edit string of values. <a href="#66c5ddee47aa36ed906353f94ca18d2e"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#1bb2ed614886ff67863744ec56041c43">SeparateArrayItems</a> (<a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *xmpObj, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options, const tStringObj &amp;catedStr)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#66c5ddee47aa36ed906353f94ca18d2e" title="SeparateArrayItems() updates an array from a concatenated edit string of values.">SeparateArrayItems()</a></code> updates an array from a concatenated edit string of values. <a href="#1bb2ed614886ff67863744ec56041c43"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#40c645803530662e08d042b4b7c6190d">RemoveProperties</a> (<a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *xmpObj, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS=0, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName=0, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#40c645803530662e08d042b4b7c6190d" title="RemoveProperties() removes multiple properties from an XMP object.">RemoveProperties()</a></code> removes multiple properties from an XMP object. <a href="#40c645803530662e08d042b4b7c6190d"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#4795244ffcbda927800f789b0e40c262">AppendProperties</a> (const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;source, <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *dest, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#4795244ffcbda927800f789b0e40c262" title="AppendProperties() adds or moves properties from one XMP object to another.">AppendProperties()</a></code> adds or moves properties from one XMP object to another. <a href="#4795244ffcbda927800f789b0e40c262"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#a17838f062e5414bc0929f67ac94a3aa">DuplicateSubtree</a> (const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;source, <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *dest, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> sourceNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> sourceRoot, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> destNS=0, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> destRoot=0, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code><a class="el" href="classTXMPUtils.html#a17838f062e5414bc0929f67ac94a3aa" title="DuplicateSubtree() replicates a subtree from one XMP object into another.">DuplicateSubtree()</a></code> replicates a subtree from one XMP object into another. <a href="#a17838f062e5414bc0929f67ac94a3aa"></a><br></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template&lt;class tStringObj&gt;<br>
+ class TXMPUtils&lt; tStringObj &gt;</h3>
+
+API for access to the XMP Toolkit utility services.
+<p>
+<code><a class="el" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a></code> is a template class which must be instantiated with a string class such as <code>std::string</code>. See the instructions in XMP.hpp, and the Overview for a discussion of the overall architecture of the XMP API.<p>
+This class defines helper functions that support the basic metadata manipulation provided by <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code>. All of the functions are static; that is, you call them directly from the concrete class (<code>SXMPUtils</code>), which is never itself instantiated.<p>
+General categories of utilities include:<p>
+<ul>
+<li>Composing complex path expressions, which you can then pass to the property access functions in <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> </li>
+<li>Converting between binary and string forms of property values </li>
+<li>Manipulating date/time values </li>
+<li>Encoding and decoding base-64 strings </li>
+<li>JPEG file handling </li>
+<li>Editing aids for creating a user interface for the XMP Toolkit </li>
+</ul>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="47fa195aa2e1457aa1f74f7e1ed06da6"></a><!-- doxytag: member="TXMPUtils::ComposeArrayItemPath" ref="47fa195aa2e1457aa1f74f7e1ed06da6" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, tStringObj *fullPath)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ComposeArrayItemPath </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>&nbsp;</td>
+ <td class="paramname"> <em>itemIndex</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>fullPath</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#47fa195aa2e1457aa1f74f7e1ed06da6" title="ComposeArrayItemPath() composes the path expression for an item in an array.">ComposeArrayItemPath()</a></code> composes the path expression for an item in an array.
+<p>
+The returned string is in the form <code>ns:arrayName[i]</code>, where "ns" is the prefix for the specified namespace, and "i" is the decimal representation of specified item index. If the last item was specified, the path is <code>ns:arrayName[last()]</code>.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the array; see <code>GetProperty()</code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. Can be a general path expression, must not be null or the empty string; see <code>GetProperty()</code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>itemIndex</em>&nbsp;</td><td>The 1-based index of the desired item. Use the macro <code><a class="el" href="XMP__Const_8h.html#9549b9a138a896257b5a70176d125317" title="Options macro accesses last array item.">kXMP_ArrayLastItem</a></code> to specify the last existing array item.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fullPath</em>&nbsp;</td><td>[out] A string in which to return the composed path. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="706eb85b8401b8682a01348f7e25ee3d"></a><!-- doxytag: member="TXMPUtils::ComposeStructFieldPath" ref="706eb85b8401b8682a01348f7e25ee3d" args="(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, tStringObj *fullPath)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ComposeStructFieldPath </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>structName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>fullPath</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#706eb85b8401b8682a01348f7e25ee3d" title="ComposeStructFieldPath() composes the path expression for a field in a struct.">ComposeStructFieldPath()</a></code> composes the path expression for a field in a struct.
+<p>
+The returned string is in the form <code>ns:structName/fNS:fieldName</code>, where "ns" is the prefix for the schema namespace, and "fNS" is the prefix for field namespace.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the struct; see <code>GetProperty()</code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>structName</em>&nbsp;</td><td>The name of the struct. Can be a general path expression, must not be null or the empty string; see <code>GetProperty()</code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldNS</em>&nbsp;</td><td>The namespace URI for the field. Same URI and prefix usage as the <code>schemaNS</code> and <code>structName</code> parameters.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldName</em>&nbsp;</td><td>The name of the field. Must be a single XML name, must not be null or the empty string. Same URI and prefix usage as the <code>schemaNS</code> and <code>structName</code> parameters.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fullPath</em>&nbsp;</td><td>[out] A string in which to return the composed path. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="40ae0ce2065fcb71725e37137884e172"></a><!-- doxytag: member="TXMPUtils::ComposeQualifierPath" ref="40ae0ce2065fcb71725e37137884e172" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, tStringObj *fullPath)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ComposeQualifierPath </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>qualNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>qualName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>fullPath</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#40ae0ce2065fcb71725e37137884e172" title="ComposeQualifierPath() composes the path expression for a qualifier.">ComposeQualifierPath()</a></code> composes the path expression for a qualifier.
+<p>
+The returned string is in the form <code>ns:propName/?qNS:qualName</code>, where "ns" is the prefix for the schema namespace, and "qNS" is the prefix for the qualifier namespace.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI; see <code>GetProperty()</code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property to which the qualifier is attached. Can be a general path expression, must not be null or the empty string; see <code>GetProperty()</code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>qualNS</em>&nbsp;</td><td>The namespace URI for the qualifier. Same URI and prefix usage as the <code>schemaNS</code> and <code>propName</code> parameters.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>qualName</em>&nbsp;</td><td>The name of the qualifier. Must be a single XML name, must not be null or the empty string. Same URI and prefix usage as the <code>schemaNS</code> and <code>propName</code> parameters.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fullPath</em>&nbsp;</td><td>[out] A string in which to return the composed path. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="e4989e5c199a2a4287ee3ae89b872e69"></a><!-- doxytag: member="TXMPUtils::ComposeLangSelector" ref="e4989e5c199a2a4287ee3ae89b872e69" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr langName, tStringObj *fullPath)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ComposeLangSelector </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>langName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>fullPath</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#e4989e5c199a2a4287ee3ae89b872e69" title="ComposeLangSelector() composes the path expression to select an alternate item by...">ComposeLangSelector()</a></code> composes the path expression to select an alternate item by language.
+<p>
+Path syntax allows two forms of "content addressing" to select an item in an array of alternatives. The form used in this function lets you select an item in an alt-text array based on the value of its <code>xml:lang</code> qualifier. The other form of content addressing is shown in <code><a class="el" href="classTXMPUtils.html#458f8e8729e2334fe54ca8f691a9db23" title="ComposeFieldSelector() composes a path expression to select an alternate item by...">ComposeFieldSelector()</a></code>.<p>
+The returned string is in the form <code>ns:arrayName[@xml:lang='langName']</code>, where "ns" is the prefix for the schema namespace<p>
+This function provides a path expression that is explicitly and only for a specific language. In most cases, <code><a class="el" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19" title="SetLocalizedText() modifies the value of a selected item in an alt-text array.">TXMPMeta::SetLocalizedText()</a></code> and <code><a class="el" href="classTXMPMeta.html#eefe49bbf669770d769f4fe0ea566bd0" title="GetLocalizedText() retrieves information about a selected item in an alt-text array...">TXMPMeta::GetLocalizedText()</a></code> are preferred, because they provide extra logic to choose the appropriate language and maintain consistency with the 'x-default' value.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the array; see <code>GetProperty()</code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. Can be a general path expression, must not be null or the empty string; see <code>GetProperty()</code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>langName</em>&nbsp;</td><td>The RFC 3066 code for the desired language, as a null-terminated UTF-8 string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fullPath</em>&nbsp;</td><td>[out] A string in which to return the composed path. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="7882bbc2e412ff476c2d97d98808d91c"></a><!-- doxytag: member="TXMPUtils::ComposeLangSelector" ref="7882bbc2e412ff476c2d97d98808d91c" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, const tStringObj &amp;langName, tStringObj *fullPath)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ComposeLangSelector </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>langName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>fullPath</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#e4989e5c199a2a4287ee3ae89b872e69" title="ComposeLangSelector() composes the path expression to select an alternate item by...">ComposeLangSelector()</a></code> composes a path expression to select an alternate item by language.
+<p>
+Path syntax allows two forms of "content addressing" to select an item in an array of alternatives. The form used in this function lets you select an item in an alt-text array based on the value of its <code>xml:lang</code> qualifier. The other form of content addressing is shown in <code><a class="el" href="classTXMPUtils.html#458f8e8729e2334fe54ca8f691a9db23" title="ComposeFieldSelector() composes a path expression to select an alternate item by...">ComposeFieldSelector()</a></code>.<p>
+The returned string is in the form <code>ns:arrayName[@xml:lang='langName']</code>, where "ns" is the prefix for the schema namespace<p>
+This function provides a path expression that is explicitly and only for a specific language. In most cases, <code><a class="el" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19" title="SetLocalizedText() modifies the value of a selected item in an alt-text array.">TXMPMeta::SetLocalizedText()</a></code> and <code><a class="el" href="classTXMPMeta.html#eefe49bbf669770d769f4fe0ea566bd0" title="GetLocalizedText() retrieves information about a selected item in an alt-text array...">TXMPMeta::GetLocalizedText()</a></code> are preferred, because they provide extra logic to choose the appropriate language and maintain consistency with the 'x-default' value.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the array; see <code>GetProperty()</code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. Can be a general path expression, must not be null or the empty string; see <code>GetProperty()</code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>langName</em>&nbsp;</td><td>The RFC 3066 code for the desired language, as a string object.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fullPath</em>&nbsp;</td><td>[out] A string in which to return the composed path. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="458f8e8729e2334fe54ca8f691a9db23"></a><!-- doxytag: member="TXMPUtils::ComposeFieldSelector" ref="458f8e8729e2334fe54ca8f691a9db23" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, tStringObj *fullPath)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ComposeFieldSelector </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>fullPath</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#458f8e8729e2334fe54ca8f691a9db23" title="ComposeFieldSelector() composes a path expression to select an alternate item by...">ComposeFieldSelector()</a></code> composes a path expression to select an alternate item by a field's value.
+<p>
+Path syntax allows two forms of "content addressing" to select an item in an array of alternatives. The form used in this function lets you select an item in an array of structs based on the value of one of the fields in the structs. The other form of content addressing is shown in <code><a class="el" href="classTXMPUtils.html#e4989e5c199a2a4287ee3ae89b872e69" title="ComposeLangSelector() composes the path expression to select an alternate item by...">ComposeLangSelector()</a></code>.<p>
+For example, consider a simple struct that has two fields, the name of a city and the URI of an FTP site in that city. Use this to create an array of download alternatives. You can show the user a popup built from the values of the city fields, then get the corresponding URI as follows: <pre>
+ ComposeFieldSelector ( schemaNS, "Downloads", fieldNS, "City", chosenCity, &amp;path );
+ exists = GetStructField ( schemaNS, path, fieldNS, "URI", &amp;uri );
+ </pre><p>
+The returned string is in the form <code>ns:arrayName[fNS:fieldName='fieldValue']</code>, where "ns" is the prefix for the schema namespace and "fNS" is the prefix for the field namespace.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the array; see <code>GetProperty()</code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. Can be a general path expression, must not be null or the empty string; see <code>GetProperty()</code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldNS</em>&nbsp;</td><td>The namespace URI for the field used as the selector. Same URI and prefix usage as the <code>schemaNS</code> and <code>arrayName</code> parameters.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldName</em>&nbsp;</td><td>The name of the field used as the selector. Must be a single XML name, must not be null or the empty string. It must be the name of a field that is itself simple.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldValue</em>&nbsp;</td><td>The desired value of the field, specified as a null-terminated UTF-8 string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fullPath</em>&nbsp;</td><td>[out] A string in which to return the composed path. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="d2d2361b8a4d0709ec9e3bd837265cba"></a><!-- doxytag: member="TXMPUtils::ComposeFieldSelector" ref="d2d2361b8a4d0709ec9e3bd837265cba" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, const tStringObj &amp;fieldValue, tStringObj *fullPath)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ComposeFieldSelector </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>fieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>fieldValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>fullPath</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#458f8e8729e2334fe54ca8f691a9db23" title="ComposeFieldSelector() composes a path expression to select an alternate item by...">ComposeFieldSelector()</a></code> composes a path expression to select an alternate item by a field's value.
+<p>
+Path syntax allows two forms of "content addressing" to select an item in an array of alternatives. The form used in this function lets you select an item in an array of structs based on the value of one of the fields in the structs. The other form of content addressing is shown in <code><a class="el" href="classTXMPUtils.html#e4989e5c199a2a4287ee3ae89b872e69" title="ComposeLangSelector() composes the path expression to select an alternate item by...">ComposeLangSelector()</a></code>.<p>
+For example, consider a simple struct that has two fields, the name of a city and the URI of an FTP site in that city. Use this to create an array of download alternatives. You can show the user a popup built from the values of the city fields, then get the corresponding URI as follows: <pre>
+ ComposeFieldSelector ( schemaNS, "Downloads", fieldNS, "City", chosenCity, &amp;path );
+ exists = GetStructField ( schemaNS, path, fieldNS, "URI", &amp;uri );
+ </pre><p>
+The returned string is in the form <code>ns:arrayName[fNS:fieldName='fieldValue']</code>, where "ns" is the prefix for the schema namespace and "fNS" is the prefix for the field namespace.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the array; see <code>GetProperty()</code>.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. Can be a general path expression, must not be null or the empty string; see <code>GetProperty()</code> for namespace prefix usage.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldNS</em>&nbsp;</td><td>The namespace URI for the field used as the selector. Same URI and prefix usage as the <code>schemaNS</code> and <code>arrayName</code> parameters.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldName</em>&nbsp;</td><td>The name of the field used as the selector. Must be a single XML name, must not be null or the empty string. It must be the name of a field that is itself simple.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fieldValue</em>&nbsp;</td><td>The desired value of the field, specified as a string object.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>fullPath</em>&nbsp;</td><td>[out] A string in which to return the composed path. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="509691eb270988de6a770c9c8304ab6b"></a><!-- doxytag: member="TXMPUtils::ConvertFromBool" ref="509691eb270988de6a770c9c8304ab6b" args="(bool binValue, tStringObj *strValue)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertFromBool </td>
+ <td>(</td>
+ <td class="paramtype">bool&nbsp;</td>
+ <td class="paramname"> <em>binValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>strValue</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#509691eb270988de6a770c9c8304ab6b" title="ConvertFromBool() converts a Boolean value to a string.">ConvertFromBool()</a></code> converts a Boolean value to a string.
+<p>
+The string values of Booleans are returned by the macros <code><a class="el" href="XMP__Const_8h.html#4c39e0131b0e3d7db66e1cfa82b67141" title="The canonical true string value for Booleans in serialized XMP.">kXMP_TrueStr</a></code> and <code><a class="el" href="XMP__Const_8h.html#2dc55b533ed63ed7ff0c3be16a97e278" title="The canonical false string value for Booleans in serialized XMP.">kXMP_FalseStr</a></code> in <code><a class="el" href="XMP__Const_8h.html" title="Common C/C++ types and constants for the XMP toolkit.">XMP_Const.h</a></code>.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>binValue</em>&nbsp;</td><td>The Boolean value to be converted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>[out] A buffer in which to return the string representation of the value. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="eec45b4d1a26717290105c9f4e8b4235"></a><!-- doxytag: member="TXMPUtils::ConvertFromInt" ref="eec45b4d1a26717290105c9f4e8b4235" args="(long binValue, XMP_StringPtr format, tStringObj *strValue)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertFromInt </td>
+ <td>(</td>
+ <td class="paramtype">long&nbsp;</td>
+ <td class="paramname"> <em>binValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>format</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>strValue</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#eec45b4d1a26717290105c9f4e8b4235" title="ConvertFromInt() converts a 32-bit integer value to a string.">ConvertFromInt()</a></code> converts a 32-bit integer value to a string.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>binValue</em>&nbsp;</td><td>The integer value to be converted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>format</em>&nbsp;</td><td>Optional. A C <code>sprintf</code> format for the conversion. Default is "%d".</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>[out] A buffer in which to return the string representation of the value. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="eae4617e05358433015eaa80953c5e60"></a><!-- doxytag: member="TXMPUtils::ConvertFromInt64" ref="eae4617e05358433015eaa80953c5e60" args="(long long binValue, XMP_StringPtr format, tStringObj *strValue)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertFromInt64 </td>
+ <td>(</td>
+ <td class="paramtype">long long&nbsp;</td>
+ <td class="paramname"> <em>binValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>format</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>strValue</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#eae4617e05358433015eaa80953c5e60" title="ConvertFromInt64() converts a 64-bit integer value to a string.">ConvertFromInt64()</a></code> converts a 64-bit integer value to a string.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>binValue</em>&nbsp;</td><td>The integer value to be converted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>format</em>&nbsp;</td><td>Optional. A C <code>sprintf</code> format for the conversion. Default is "%d".</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>[out] A buffer in which to return the string representation of the value. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="e67ef3931836432b7e574832f0610ed0"></a><!-- doxytag: member="TXMPUtils::ConvertFromFloat" ref="e67ef3931836432b7e574832f0610ed0" args="(double binValue, XMP_StringPtr format, tStringObj *strValue)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertFromFloat </td>
+ <td>(</td>
+ <td class="paramtype">double&nbsp;</td>
+ <td class="paramname"> <em>binValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>format</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>strValue</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#e67ef3931836432b7e574832f0610ed0" title="ConvertFromFloat() converts a floating-point value to a string.">ConvertFromFloat()</a></code> converts a floating-point value to a string.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>binValue</em>&nbsp;</td><td>The floating-point value to be converted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>format</em>&nbsp;</td><td>Optional. A C <code>sprintf</code> format for the conversion. Default is "%d".</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>[out] A buffer in which to return the string representation of the value. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="6146a522a3974b4088d6e8241e9cd223"></a><!-- doxytag: member="TXMPUtils::ConvertFromDate" ref="6146a522a3974b4088d6e8241e9cd223" args="(const XMP_DateTime &amp;binValue, tStringObj *strValue)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertFromDate </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> &amp;&nbsp;</td>
+ <td class="paramname"> <em>binValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>strValue</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#6146a522a3974b4088d6e8241e9cd223" title="ConvertFromDate() converts a date/time value to a string.">ConvertFromDate()</a></code> converts a date/time value to a string.
+<p>
+Formats a date according to the ISO 8601 profile in <a href="http://www.w3.org/TR/NOTE-datetime:">http://www.w3.org/TR/NOTE-datetime:</a> <pre>
+ YYYY
+ YYYY-MM
+ YYYY-MM-DD
+ YYYY-MM-DDThh:mmTZD
+ YYYY-MM-DDThh:mm:ssTZD
+ YYYY-MM-DDThh:mm:ss.sTZD
+ </pre><p>
+<code>YYYY</code> = four-digit year, formatted as "%.4d" <br>
+ <code>MM</code> = two-digit month (01=January) <br>
+ <code>DD</code> = two-digit day of month (01 through 31) <br>
+ <code>hh</code> = two digits of hour (00 through 23) <br>
+ <code>mm</code> = two digits of minute (00 through 59) <br>
+ <code>ss</code> = two digits of second (00 through 59) <br>
+ <code>s</code> = one or more digits representing a decimal fraction of a second <br>
+ <code>TZD</code> = time zone designator (Z or +hh:mm or -hh:mm)<p>
+Time-only input is allowed where the year, month, and day are all zero. This is output as "0000-00-00...".<p>
+<dl class="note" compact><dt><b>Note:</b></dt><dd>ISO 8601 does not allow years less than 1000 or greater than 9999. This API allows any year, even negative ones.</dd></dl>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>binValue</em>&nbsp;</td><td>The date/time value to be converted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>[out] A buffer in which to return the ISO 8601 string representation of the date/time. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="aaaaadb23f4089daa795f50cba4f405c"></a><!-- doxytag: member="TXMPUtils::ConvertToBool" ref="aaaaadb23f4089daa795f50cba4f405c" args="(XMP_StringPtr strValue)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static bool <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToBool </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>strValue</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#aaaaadb23f4089daa795f50cba4f405c" title="ConvertToBool() converts a string to a Boolean value.">ConvertToBool()</a></code> converts a string to a Boolean value.
+<p>
+The preferred strings are those returned by the macros <code><a class="el" href="XMP__Const_8h.html#4c39e0131b0e3d7db66e1cfa82b67141" title="The canonical true string value for Booleans in serialized XMP.">kXMP_TrueStr</a></code> and <code><a class="el" href="XMP__Const_8h.html#2dc55b533ed63ed7ff0c3be16a97e278" title="The canonical false string value for Booleans in serialized XMP.">kXMP_FalseStr</a></code>. If these do not match, the function does a case insensitive comparison, then simply 't' or 'f', and finally non-zero and zero integer representations.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The string representation of the value, specified as a null-terminated UTF-8 string.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The appropriate C++ bool value for the string. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="84f2a7b3960a17315032915674e21960"></a><!-- doxytag: member="TXMPUtils::ConvertToBool" ref="84f2a7b3960a17315032915674e21960" args="(const tStringObj &amp;strValue)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static bool <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToBool </td>
+ <td>(</td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>strValue</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#aaaaadb23f4089daa795f50cba4f405c" title="ConvertToBool() converts a string to a Boolean value.">ConvertToBool()</a></code> converts a string to a Boolean value.
+<p>
+Overloads the basic form of the function, allowing you to pass a string object, rather than a <code>const * char</code>. It is otherwise identical; see details in the canonical form.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The string representation of the value, specified as a string object.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The appropriate C++ bool value for the string. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="dfd9d1c522377d5db4ad667a7973ba00"></a><!-- doxytag: member="TXMPUtils::ConvertToInt" ref="dfd9d1c522377d5db4ad667a7973ba00" args="(XMP_StringPtr strValue)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static long <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToInt </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>strValue</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#dfd9d1c522377d5db4ad667a7973ba00" title="ConvertToInt() converts a string to a 32-bit integer value.">ConvertToInt()</a></code> converts a string to a 32-bit integer value.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The string representation of the value, specified as a null-terminated UTF-8 string.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The 32-bit integer value. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="47d93f9cb4acd9d7ec6b450100209bec"></a><!-- doxytag: member="TXMPUtils::ConvertToInt" ref="47d93f9cb4acd9d7ec6b450100209bec" args="(const tStringObj &amp;strValue)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static long <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToInt </td>
+ <td>(</td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>strValue</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#dfd9d1c522377d5db4ad667a7973ba00" title="ConvertToInt() converts a string to a 32-bit integer value.">ConvertToInt()</a></code> converts a string to a 32-bit integer value.
+<p>
+Overloads the basic form of the function, allowing you to pass a string object, rather than a <code>const * char</code>. It is otherwise identical.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The string representation of the value, specified as a string object.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The 32-bit integer value. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="be5d2dcc03c5442202203bba5ca7b172"></a><!-- doxytag: member="TXMPUtils::ConvertToInt64" ref="be5d2dcc03c5442202203bba5ca7b172" args="(XMP_StringPtr strValue)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static long long <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToInt64 </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>strValue</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#be5d2dcc03c5442202203bba5ca7b172" title="ConvertToInt64() converts a string to a 64-bit integer value.">ConvertToInt64()</a></code> converts a string to a 64-bit integer value.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The string representation of the value, specified as a null-terminated UTF-8 string.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The 64-bit integer value. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="711cae0cb1b673ff5e208b4ae458d120"></a><!-- doxytag: member="TXMPUtils::ConvertToInt64" ref="711cae0cb1b673ff5e208b4ae458d120" args="(const tStringObj &amp;strValue)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static long long <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToInt64 </td>
+ <td>(</td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>strValue</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#be5d2dcc03c5442202203bba5ca7b172" title="ConvertToInt64() converts a string to a 64-bit integer value.">ConvertToInt64()</a></code> converts a string to a 64-bit integer value.
+<p>
+Overloads the basic form of the function, allowing you to pass a string object, rather than a <code>const * char</code>. It is otherwise identical.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The string representation of the value, specified as a string object.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The 64-bit integer value. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="8a507b006286460814e0486c622d828c"></a><!-- doxytag: member="TXMPUtils::ConvertToFloat" ref="8a507b006286460814e0486c622d828c" args="(XMP_StringPtr strValue)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static double <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToFloat </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>strValue</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#8a507b006286460814e0486c622d828c" title="ConvertToFloat() converts a string to a floating-point value.">ConvertToFloat()</a></code> converts a string to a floating-point value.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The string representation of the value, specified as a null-terminated UTF-8 string.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The floating-point value. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="abd4e479d2708a9ea3135cd441faa7ea"></a><!-- doxytag: member="TXMPUtils::ConvertToFloat" ref="abd4e479d2708a9ea3135cd441faa7ea" args="(const tStringObj &amp;strValue)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static double <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToFloat </td>
+ <td>(</td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>strValue</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#8a507b006286460814e0486c622d828c" title="ConvertToFloat() converts a string to a floating-point value.">ConvertToFloat()</a></code> converts a string to a floating-point value.
+<p>
+Overloads the basic form of the function, allowing you to pass a string object, rather than a <code>const * char</code>. It is otherwise identical.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The string representation of the value, specified as a string object.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The floating-point value. </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="60d33e6ce30286028acca47b2b6e7a0b"></a><!-- doxytag: member="TXMPUtils::ConvertToDate" ref="60d33e6ce30286028acca47b2b6e7a0b" args="(XMP_StringPtr strValue, XMP_DateTime *binValue)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToDate </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>strValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *&nbsp;</td>
+ <td class="paramname"> <em>binValue</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#60d33e6ce30286028acca47b2b6e7a0b" title="ConvertToDate() converts a string to a date/time value.">ConvertToDate()</a></code> converts a string to a date/time value.
+<p>
+Parses a date according to the ISO 8601 profile in <a href="http://www.w3.org/TR/NOTE-datetime:">http://www.w3.org/TR/NOTE-datetime:</a> <pre>
+ YYYY
+ YYYY-MM
+ YYYY-MM-DD
+ YYYY-MM-DDThh:mmTZD
+ YYYY-MM-DDThh:mm:ssTZD
+ YYYY-MM-DDThh:mm:ss.sTZD
+ </pre><p>
+<code>YYYY</code> = four-digit year, formatted as "%.4d" <br>
+ <code>MM</code> = two-digit month (01=January) <br>
+ <code>DD</code> = two-digit day of month (01 through 31) <br>
+ <code>hh</code> = two digits of hour (00 through 23) <br>
+ <code>mm</code> = two digits of minute (00 through 59) <br>
+ <code>ss</code> = two digits of second (00 through 59) <br>
+ <code>s</code> = one or more digits representing a decimal fraction of a second <br>
+ <code>TZD</code> = time zone designator (Z or +hh:mm or -hh:mm)<p>
+A missing date portion or missing TZD are tolerated. A missing date value can begin with "Thh:" or "hh:"; the year, month, and day are all set to zero in the <code><a class="el" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a></code> value. A missing TZD is assumed to be UTC.<p>
+<dl class="note" compact><dt><b>Note:</b></dt><dd>ISO 8601 does not allow years less than 1000 or greater than 9999. This API allows any year, even negative ones.</dd></dl>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The ISO 8601 string representation of the date/time, specified as a null-terminated UTF-8 string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>binValue</em>&nbsp;</td><td>[out] A buffer in which to return the binary date/time value. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="265559d1b4b78e34a460e935c11177d7"></a><!-- doxytag: member="TXMPUtils::ConvertToDate" ref="265559d1b4b78e34a460e935c11177d7" args="(const tStringObj &amp;strValue, XMP_DateTime *binValue)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToDate </td>
+ <td>(</td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>strValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *&nbsp;</td>
+ <td class="paramname"> <em>binValue</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#60d33e6ce30286028acca47b2b6e7a0b" title="ConvertToDate() converts a string to a date/time value.">ConvertToDate()</a></code> converts a string to a date/time value.
+<p>
+Overloads the basic form of the function, allowing you to pass a string object, rather than a <code>const * char</code>. It is otherwise identical. See details for the canonical form.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The ISO 8601 string representation of the date/time, specified as a string object.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>binValue</em>&nbsp;</td><td>[out] A buffer in which to return the binary date/time value. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="c83f0b963ea64d7eee0b481e15a8439c"></a><!-- doxytag: member="TXMPUtils::CurrentDateTime" ref="c83f0b963ea64d7eee0b481e15a8439c" args="(XMP_DateTime *time)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::CurrentDateTime </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *&nbsp;</td>
+ <td class="paramname"> <em>time</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#c83f0b963ea64d7eee0b481e15a8439c" title="CurrentDateTime() obtains the current date and time.">CurrentDateTime()</a></code> obtains the current date and time.
+<p>
+Creates and returns a binary <code><a class="el" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a></code> value. The returned time is UTC, properly adjusted for the local time zone. The resolution of the time is not guaranteed to be finer than seconds.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>time</em>&nbsp;</td><td>[out] A buffer in which to return the date/time value. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="96bcc45febac55f6c49951815b7de2ef"></a><!-- doxytag: member="TXMPUtils::SetTimeZone" ref="96bcc45febac55f6c49951815b7de2ef" args="(XMP_DateTime *time)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::SetTimeZone </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *&nbsp;</td>
+ <td class="paramname"> <em>time</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#96bcc45febac55f6c49951815b7de2ef" title="SetTimeZone() sets the time zone in a date/time value to the local time zone.">SetTimeZone()</a></code> sets the time zone in a date/time value to the local time zone.
+<p>
+Any existing time zone value is replaced. The other date/time fields are not adjusted in any way.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>time</em>&nbsp;</td><td>A pointer to the date-time value, which is modified in place. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="bbd4d691c83287ea2fc6b1e33e5858b8"></a><!-- doxytag: member="TXMPUtils::ConvertToUTCTime" ref="bbd4d691c83287ea2fc6b1e33e5858b8" args="(XMP_DateTime *time)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToUTCTime </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *&nbsp;</td>
+ <td class="paramname"> <em>time</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#bbd4d691c83287ea2fc6b1e33e5858b8" title="ConvertToUTCTime() ensures that a time is UTC.">ConvertToUTCTime()</a></code> ensures that a time is UTC.
+<p>
+If the time zone is not UTC, the time is adjusted and the time zone set to be UTC. If the time zone is already UTC, the value is not modified.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>time</em>&nbsp;</td><td>A pointer to the date-time value, which is modified in place. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="61852aaba494c8fbad5a6c0c4caf21f5"></a><!-- doxytag: member="TXMPUtils::ConvertToLocalTime" ref="61852aaba494c8fbad5a6c0c4caf21f5" args="(XMP_DateTime *time)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToLocalTime </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *&nbsp;</td>
+ <td class="paramname"> <em>time</em> </td>
+ <td>&nbsp;)&nbsp;</td>
+ <td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#61852aaba494c8fbad5a6c0c4caf21f5" title="ConvertToLocalTime() ensures that a time is local.">ConvertToLocalTime()</a></code> ensures that a time is local.
+<p>
+If the time zone is not the local zone, the time is adjusted and the time zone set to be local. If the time zone is already the local zone, the value is not modified.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>time</em>&nbsp;</td><td>A pointer to the date-time value, which is modified in place. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="9fc7f1771032f59f9020aeda4f91991d"></a><!-- doxytag: member="TXMPUtils::CompareDateTime" ref="9fc7f1771032f59f9020aeda4f91991d" args="(const XMP_DateTime &amp;left, const XMP_DateTime &amp;right)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static int <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::CompareDateTime </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> &amp;&nbsp;</td>
+ <td class="paramname"> <em>left</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> &amp;&nbsp;</td>
+ <td class="paramname"> <em>right</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#9fc7f1771032f59f9020aeda4f91991d" title="CompareDateTime() compares the order of two date/time values.">CompareDateTime()</a></code> compares the order of two date/time values.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>left</em>&nbsp;</td><td>The left-side date/time value.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>right</em>&nbsp;</td><td>The right-side date/time value.</td></tr>
+ </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>An integer indicating the order: <ul>
+<li>-1 if left is earlier than right </li>
+<li>0 if left matches right </li>
+<li>+1 if left is later than right </li>
+</ul>
+</dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="ef3b23bbc152480f699e269620ecad4a"></a><!-- doxytag: member="TXMPUtils::EncodeToBase64" ref="ef3b23bbc152480f699e269620ecad4a" args="(XMP_StringPtr rawStr, XMP_StringLen rawLen, tStringObj *encodedStr)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::EncodeToBase64 </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>rawStr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a>&nbsp;</td>
+ <td class="paramname"> <em>rawLen</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>encodedStr</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#ef3b23bbc152480f699e269620ecad4a" title="EncodeToBase64() converts a raw data value to a Base64-encoded string.">EncodeToBase64()</a></code> converts a raw data value to a Base64-encoded string.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rawStr</em>&nbsp;</td><td>An <code><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a></code> (char *) string containing the raw data to be converted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>rawLen</em>&nbsp;</td><td>The number of characters of raw data to be converted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>encodedStr</em>&nbsp;</td><td>[out] A string object in which to return the encoded string. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="39d5de77b29441a30f2f879755b8e7d8"></a><!-- doxytag: member="TXMPUtils::EncodeToBase64" ref="39d5de77b29441a30f2f879755b8e7d8" args="(const tStringObj &amp;rawStr, tStringObj *encodedStr)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::EncodeToBase64 </td>
+ <td>(</td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>rawStr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>encodedStr</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#ef3b23bbc152480f699e269620ecad4a" title="EncodeToBase64() converts a raw data value to a Base64-encoded string.">EncodeToBase64()</a></code> converts a raw data value passed in a string object to a Base64-encoded string.
+<p>
+Overloads the basic form of the function, allowing you to pass a string object as input. It is otherwise identical.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rawStr</em>&nbsp;</td><td>A string object containing the raw data to be converted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>encodedStr</em>&nbsp;</td><td>[out] A string object in which to return the encoded string. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="e5bdd91c0c3ee9262dc0a8b9f591b921"></a><!-- doxytag: member="TXMPUtils::DecodeFromBase64" ref="e5bdd91c0c3ee9262dc0a8b9f591b921" args="(XMP_StringPtr encodedStr, XMP_StringLen encodedLen, tStringObj *rawStr)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::DecodeFromBase64 </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>encodedStr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a>&nbsp;</td>
+ <td class="paramname"> <em>encodedLen</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>rawStr</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#e5bdd91c0c3ee9262dc0a8b9f591b921" title="DecodeFromBase64() Decodes a Base64-encoded string to raw data.">DecodeFromBase64()</a></code> Decodes a Base64-encoded string to raw data.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>encodedStr</em>&nbsp;</td><td>An <code><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a></code> (char *) string containing the encoded data to be converted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>encodedLen</em>&nbsp;</td><td>The number of characters of raw data to be converted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>rawStr</em>&nbsp;</td><td>[out] A string object in which to return the decoded data. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="1e61e273065b10517ca127d5a553a8dc"></a><!-- doxytag: member="TXMPUtils::DecodeFromBase64" ref="1e61e273065b10517ca127d5a553a8dc" args="(const tStringObj &amp;encodedStr, tStringObj *rawStr)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::DecodeFromBase64 </td>
+ <td>(</td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>encodedStr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>rawStr</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#e5bdd91c0c3ee9262dc0a8b9f591b921" title="DecodeFromBase64() Decodes a Base64-encoded string to raw data.">DecodeFromBase64()</a></code> Decodes a Base64-encoded string, passed as a string object, to raw data.
+<p>
+Overloads the basic form of the function, allowing you to pass a string object as input. It is otherwise identical.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>encodedStr</em>&nbsp;</td><td>An string object containing the encoded data to be converted.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>rawStr</em>&nbsp;</td><td>[out] A string object in which to return the decoded data. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="6001b4ff54c60fdf0c40e6b78a5c457a"></a><!-- doxytag: member="TXMPUtils::PackageForJPEG" ref="6001b4ff54c60fdf0c40e6b78a5c457a" args="(const TXMPMeta&lt; tStringObj &gt; &amp;xmpObj, tStringObj *standardXMP, tStringObj *extendedXMP, tStringObj *extendedDigest)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::PackageForJPEG </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
+ <td class="paramname"> <em>xmpObj</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>standardXMP</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>extendedXMP</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>extendedDigest</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#6001b4ff54c60fdf0c40e6b78a5c457a" title="PackageForJPEG() creates XMP serializations appropriate for a JPEG file.">PackageForJPEG()</a></code> creates XMP serializations appropriate for a JPEG file.
+<p>
+The standard XMP in a JPEG file is limited to 64K bytes. This function serializes the XMP metadata in an XMP object into a string of RDF (see <code><a class="el" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49" title="SerializeToBuffer() serializes metadata in this XMP object into a string as RDF.">TXMPMeta::SerializeToBuffer()</a></code>). If the data does not fit into the 64K byte limit, it creates a second packet string with the extended data.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmpObj</em>&nbsp;</td><td>The XMP object containing the metadata.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>standardXMP</em>&nbsp;</td><td>[out] A string object in which to return the full standard XMP packet.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>extendedXMP</em>&nbsp;</td><td>[out] A string object in which to return the serialized extended XMP, empty if not needed.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>extendedDigest</em>&nbsp;</td><td>[out] A string object in which to return an MD5 digest of the serialized extended XMP, empty if not needed.</td></tr>
+ </table>
+</dl>
+<dl class="see" compact><dt><b>See also:</b></dt><dd><code><a class="el" href="classTXMPUtils.html#6187cd5fef0eccecac6805d4114dcd2e" title="MergeFromJPEG() merges standard and extended XMP retrieved from a JPEG file.">MergeFromJPEG()</a></code> </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="6187cd5fef0eccecac6805d4114dcd2e"></a><!-- doxytag: member="TXMPUtils::MergeFromJPEG" ref="6187cd5fef0eccecac6805d4114dcd2e" args="(TXMPMeta&lt; tStringObj &gt; *fullXMP, const TXMPMeta&lt; tStringObj &gt; &amp;extendedXMP)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::MergeFromJPEG </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *&nbsp;</td>
+ <td class="paramname"> <em>fullXMP</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
+ <td class="paramname"> <em>extendedXMP</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#6187cd5fef0eccecac6805d4114dcd2e" title="MergeFromJPEG() merges standard and extended XMP retrieved from a JPEG file.">MergeFromJPEG()</a></code> merges standard and extended XMP retrieved from a JPEG file.
+<p>
+When an extended partition stores properties that do not fit into the JPEG file limitation of 64K bytes, this function integrates those properties back into the same XMP object with those from the standard XMP packet.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>fullXMP</em>&nbsp;</td><td>[in, out] An XMP object which the caller has initialized from the standard XMP packet in a JPEG file. The extended XMP is added to this object.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>extendedXMP</em>&nbsp;</td><td>An XMP object which the caller has initialized from the extended XMP packet in a JPEG file.</td></tr>
+ </table>
+</dl>
+<dl class="see" compact><dt><b>See also:</b></dt><dd><code><a class="el" href="classTXMPUtils.html#6001b4ff54c60fdf0c40e6b78a5c457a" title="PackageForJPEG() creates XMP serializations appropriate for a JPEG file.">PackageForJPEG()</a></code> </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="d7e1aa7928252fb88a24fb5c3aef22ba"></a><!-- doxytag: member="TXMPUtils::CatenateArrayItems" ref="d7e1aa7928252fb88a24fb5c3aef22ba" args="(const TXMPMeta&lt; tStringObj &gt; &amp;xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr separator, XMP_StringPtr quotes, XMP_OptionBits options, tStringObj *catedStr)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::CatenateArrayItems </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
+ <td class="paramname"> <em>xmpObj</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>separator</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>quotes</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">tStringObj *&nbsp;</td>
+ <td class="paramname"> <em>catedStr</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#d7e1aa7928252fb88a24fb5c3aef22ba" title="CatenateArrayItems() creates a single edit string from a set of array item values...">CatenateArrayItems()</a></code> creates a single edit string from a set of array item values.
+<p>
+Collects the values of all items in an array into a single string, using a specified separation string. Each item in the specified array must be a simple string value.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmpObj</em>&nbsp;</td><td>The XMP object containing the array to be catenated.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The schema namespace URI for the array. Must not be null or the empty string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. May be a general path expression, must not be null or the empty string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>separator</em>&nbsp;</td><td>The string with which to separate the items in the catenated string. Defaults to "; ", ASCII semicolon and space (U+003B, U+0020).</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>quotes</em>&nbsp;</td><td>The character or characters to use as quotes around array items that contain a separator. Defaults to the double-quote character ("), ASCII quote (U+0022).</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the catenation. &lt;&lt;what options?&gt;&gt;</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>catedStr</em>&nbsp;</td><td>[out] A string object in which to return the catenated array items.</td></tr>
+ </table>
+</dl>
+<dl class="see" compact><dt><b>See also:</b></dt><dd><code><a class="el" href="classTXMPUtils.html#66c5ddee47aa36ed906353f94ca18d2e" title="SeparateArrayItems() updates an array from a concatenated edit string of values.">SeparateArrayItems()</a></code> </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="66c5ddee47aa36ed906353f94ca18d2e"></a><!-- doxytag: member="TXMPUtils::SeparateArrayItems" ref="66c5ddee47aa36ed906353f94ca18d2e" args="(TXMPMeta&lt; tStringObj &gt; *xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits options, XMP_StringPtr catedStr)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::SeparateArrayItems </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *&nbsp;</td>
+ <td class="paramname"> <em>xmpObj</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>catedStr</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#66c5ddee47aa36ed906353f94ca18d2e" title="SeparateArrayItems() updates an array from a concatenated edit string of values.">SeparateArrayItems()</a></code> updates an array from a concatenated edit string of values.
+<p>
+This reverses the action of <code><a class="el" href="classTXMPUtils.html#d7e1aa7928252fb88a24fb5c3aef22ba" title="CatenateArrayItems() creates a single edit string from a set of array item values...">CatenateArrayItems()</a></code>, separating out individual array items from the edit string and updating the array with the new values. Each item in the array must be a simple string value.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmpObj</em>&nbsp;</td><td>The XMP object containing the array to be updated.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The schema namespace URI for the array. Must not be null or the empty string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. May be a general path expression, must not be null or the empty string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the separation. &lt;&lt;what options?&gt;&gt;</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>catedStr</em>&nbsp;</td><td>The concatenated array items, as created by <code><a class="el" href="classTXMPUtils.html#d7e1aa7928252fb88a24fb5c3aef22ba" title="CatenateArrayItems() creates a single edit string from a set of array item values...">CatenateArrayItems()</a></code>, specified as a null-terminated UTF-8 string. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="1bb2ed614886ff67863744ec56041c43"></a><!-- doxytag: member="TXMPUtils::SeparateArrayItems" ref="1bb2ed614886ff67863744ec56041c43" args="(TXMPMeta&lt; tStringObj &gt; *xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits options, const tStringObj &amp;catedStr)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::SeparateArrayItems </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *&nbsp;</td>
+ <td class="paramname"> <em>xmpObj</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>arrayName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const tStringObj &amp;&nbsp;</td>
+ <td class="paramname"> <em>catedStr</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#66c5ddee47aa36ed906353f94ca18d2e" title="SeparateArrayItems() updates an array from a concatenated edit string of values.">SeparateArrayItems()</a></code> updates an array from a concatenated edit string of values.
+<p>
+Overloads the basic form of the function, allowing you to pass a string object in which to return the concatenated string. It is otherwise identical; see details for the canonical form.
+</div>
+</div><p>
+<a class="anchor" name="40c645803530662e08d042b4b7c6190d"></a><!-- doxytag: member="TXMPUtils::RemoveProperties" ref="40c645803530662e08d042b4b7c6190d" args="(TXMPMeta&lt; tStringObj &gt; *xmpObj, XMP_StringPtr schemaNS=0, XMP_StringPtr propName=0, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::RemoveProperties </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *&nbsp;</td>
+ <td class="paramname"> <em>xmpObj</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>schemaNS</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>propName</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#40c645803530662e08d042b4b7c6190d" title="RemoveProperties() removes multiple properties from an XMP object.">RemoveProperties()</a></code> removes multiple properties from an XMP object.
+<p>
+The operation depends on how the namespace and property are specified:<p>
+<ul>
+<li>Non-empty <code>schemaNS</code> and <code>propName</code> - The named property is removed if it is an external property, or if the <code><a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a578ddfb0572b7602a52e533d92d8b1e9fb" title="Do all properties, default is just external properties.">kXMPUtil_DoAllProperties</a></code> option flag is set. It does not matter whether the named property is an actual property or an alias.</li>
+</ul>
+<ul>
+<li>Non-empty <code>schemaNS</code> and empty <code>propName</code> - All external properties in the named schema are removed. Internal properties are also removed if the <code><a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a578ddfb0572b7602a52e533d92d8b1e9fb" title="Do all properties, default is just external properties.">kXMPUtil_DoAllProperties</a></code> option flag is set. In addition, aliases from the named schema are removed if the <code><a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a57843589b878f53d42d59258f945ad770b" title="Include aliases, default is just actual properties.">kXMPUtil_IncludeAliases</a></code> option flag is set.</li>
+</ul>
+<ul>
+<li>Empty <code>schemaNS</code> and empty <code>propName</code> - All external properties in all schemas are removed. Internal properties are also removed if the <code><a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a578ddfb0572b7602a52e533d92d8b1e9fb" title="Do all properties, default is just external properties.">kXMPUtil_DoAllProperties</a></code> option flag is set. Aliases are handled implicitly, because the associated actuals are removed or not.</li>
+</ul>
+<ul>
+<li>It is an error to pass an empty <code>schemaNS</code> and non-empty <code>propName</code>.</li>
+</ul>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmpObj</em>&nbsp;</td><td>The XMP object containing the properties to be removed.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>Optional schema namespace URI for the properties to be removed.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>Optional path expression for the property to be removed.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the deletion operation. A logical OR of these bit-flag constants: <ul>
+<li><code><a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a578ddfb0572b7602a52e533d92d8b1e9fb" title="Do all properties, default is just external properties.">kXMPUtil_DoAllProperties</a></code> - Delete internal properties in addition to external properties. </li>
+<li><code><a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a57843589b878f53d42d59258f945ad770b" title="Include aliases, default is just actual properties.">kXMPUtil_IncludeAliases</a></code> - Include aliases if the schema is explicitly specified. </li>
+</ul>
+</td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="4795244ffcbda927800f789b0e40c262"></a><!-- doxytag: member="TXMPUtils::AppendProperties" ref="4795244ffcbda927800f789b0e40c262" args="(const TXMPMeta&lt; tStringObj &gt; &amp;source, TXMPMeta&lt; tStringObj &gt; *dest, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::AppendProperties </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
+ <td class="paramname"> <em>source</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *&nbsp;</td>
+ <td class="paramname"> <em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#4795244ffcbda927800f789b0e40c262" title="AppendProperties() adds or moves properties from one XMP object to another.">AppendProperties()</a></code> adds or moves properties from one XMP object to another.
+<p>
+The default operation is to append only external properties that do not already exist in the destination. Option flags allow you to add internal properties, and to merge values of properties that exist in both the source and destination.<p>
+<ul>
+<li><code><a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a578ddfb0572b7602a52e533d92d8b1e9fb" title="Do all properties, default is just external properties.">kXMPUtil_DoAllProperties</a>:</code> Operate on all top-level properties, external and internal. You can use this flag together with <code><a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a57dab4dad658d2d218c5b1e7d829b12962" title="Replace existing values, default is to leave them.">kXMPUtil_ReplaceOldValues</a></code> to replace the values of existing top-level properties.</li>
+</ul>
+<ul>
+<li><code><a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a57dab4dad658d2d218c5b1e7d829b12962" title="Replace existing values, default is to leave them.">kXMPUtil_ReplaceOldValues</a>:</code> Propogate all top-level properties from the source to the destination, replacing any existing values. The values of properties in the destination that are not in the source are not modified.<br>
+ The keep-or-replace-old notion also applies within structs and arrays. Top-level properties are added to the destination if they do not already exist. If they do exist but differ in form (simple/struct/array) then the destination is not modified. If the forms match, simple properties are left unchanged, while structs and arrays are merged.<br>
+ Do not use this option when the processing is more complicated. &lt;&lt;than what??&gt;&gt;</li>
+</ul>
+<ul>
+<li><code><a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a5797753b4c5afda9c55e807e41377d86d9" title="Delete properties if the new value is empty.">kXMPUtil_DeleteEmptyValues</a>:</code> An empty value in the source XMP causes the corresponding destination property to be deleted. By default, empty values are treated in the same way as non-empty values. An empty value is a simple empty string, an array with no items,or a struct with no fields. Qualifiers are ignored.</li>
+</ul>
+The detailed behavior is defined by the following pseudo-code:<p>
+<pre>
+ AppendProperties ( sourceXMP, destXMP, options ):
+ doAll = options &amp; kXMPUtil_DoAllProperties
+ replaceOld = options &amp; kXMPUtil_ReplaceOldValues
+ deleteEmpty = options &amp; kXMPUtil_DeleteEmptyValues
+ for all source schema (top level namespaces):
+ for all top level properties in sourceSchema:
+ if doAll or prop is external:
+ AppendSubtree ( sourceNode, destSchema, replaceOld, deleteEmpty )</pre><p>
+<pre> AppendSubtree ( sourceNode, destParent, replaceOld, deleteEmpty ):
+ if deleteEmpty and source value is empty:
+ delete the corresponding child from destParent
+ else if sourceNode not in destParent (by name):
+ copy sourceNode's subtree to destParent
+ else if replaceOld:
+ delete subtree from destParent
+ copy sourceNode's subtree to destParent
+ else: // (Already exists in dest and not replacing, merge structs and arrays)
+ if sourceNode and destNode forms differ:
+ return, leave the destNode alone
+ else if form is a struct:
+ for each field in sourceNode:
+ AppendSubtree ( sourceNode.field, destNode, replaceOld )
+ else if form is an alt-text array:
+ copy new items by xml:lang value into the destination
+ else if form is an array:
+ copy new items by value into the destination, ignoring order and duplicates
+ </pre><p>
+Array item checking is n-squared; this can be time-intensive if the replace-old options is not specified. Each source item is checked to see if it already exists in the destination, without regard to order or duplicates. Simple items are compared by value and <code>xml:lang</code> qualifier; other qualifiers are ignored. Structs are recursively compared by field names, without regard to field order. Arrays are compared by recursively comparing all items.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>source</em>&nbsp;</td><td>The source XMP object.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>dest</em>&nbsp;</td><td>The destination XMP object.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the copying. A logical OR of these bit-flag constants: <ul>
+<li><code>kXMPUtil_DoAllProperties</code> - Operate on internal properties in addition to external properties. </li>
+<li><code>kXMPUtil_ReplaceOldValues</code> - Replace the values of existing properties. </li>
+<li><code>kXMPUtil_DeleteEmptyValues</code> - Delete properties if the new value is empty. </li>
+</ul>
+</td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="a17838f062e5414bc0929f67ac94a3aa"></a><!-- doxytag: member="TXMPUtils::DuplicateSubtree" ref="a17838f062e5414bc0929f67ac94a3aa" args="(const TXMPMeta&lt; tStringObj &gt; &amp;source, TXMPMeta&lt; tStringObj &gt; *dest, XMP_StringPtr sourceNS, XMP_StringPtr sourceRoot, XMP_StringPtr destNS=0, XMP_StringPtr destRoot=0, XMP_OptionBits options=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class tStringObj&gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::DuplicateSubtree </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
+ <td class="paramname"> <em>source</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *&nbsp;</td>
+ <td class="paramname"> <em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>sourceNS</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>sourceRoot</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>destNS</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>destRoot</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
+ <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [static]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+<code><a class="el" href="classTXMPUtils.html#a17838f062e5414bc0929f67ac94a3aa" title="DuplicateSubtree() replicates a subtree from one XMP object into another.">DuplicateSubtree()</a></code> replicates a subtree from one XMP object into another.
+<p>
+The destination can be a different namespace and root location in the same object, or the same or a different location in another XMP object.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>source</em>&nbsp;</td><td>The source XMP object.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>dest</em>&nbsp;</td><td>The destination XMP object.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>sourceNS</em>&nbsp;</td><td>The schema namespace URI for the source subtree.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>sourceRoot</em>&nbsp;</td><td>The root location for the source subtree. Can be a general path expression, must not be null or the empty string.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>destNS</em>&nbsp;</td><td>The schema namespace URI for the destination. Defaults to the source namespace.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>destRoot</em>&nbsp;</td><td>The root location for the destination. Can be a general path expression. Defaults to the source location.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the operation. &lt;&lt;options?&gt;&gt; </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="TXMPUtils_8hpp-source.html">TXMPUtils.hpp</a></ul>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/classXMP__Error-members.html b/docs/API/classXMP__Error-members.html
new file mode 100644
index 0000000..5696bce
--- /dev/null
+++ b/docs/API/classXMP__Error-members.html
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Member List</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>XMP_Error Member List</h1>This is the complete list of members for <a class="el" href="classXMP__Error.html">XMP_Error</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="classXMP__Error.html#31fd80098e50026985e05abd16f3e045">errMsg</a></td><td><a class="el" href="classXMP__Error.html">XMP_Error</a></td><td><code> [private]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classXMP__Error.html#9a3560c67612dec9a6ca37c34eb2c153">GetErrMsg</a>() const </td><td><a class="el" href="classXMP__Error.html">XMP_Error</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classXMP__Error.html#56aaa6fc6644ccfc9470ae1af8f3a8cd">GetID</a>() const </td><td><a class="el" href="classXMP__Error.html">XMP_Error</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classXMP__Error.html#ad714bd7c428e10eff07a8ab6a4f3125">id</a></td><td><a class="el" href="classXMP__Error.html">XMP_Error</a></td><td><code> [private]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classXMP__Error.html#a8b3b859899759d679b00237254e30aa">XMP_Error</a>(XMP_Int32 _id, XMP_StringPtr _errMsg)</td><td><a class="el" href="classXMP__Error.html">XMP_Error</a></td><td><code> [inline]</code></td></tr>
+</table></div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/classXMP__Error.html b/docs/API/classXMP__Error.html
new file mode 100644
index 0000000..f782a34
--- /dev/null
+++ b/docs/API/classXMP__Error.html
@@ -0,0 +1,156 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: XMP_Error Class Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>XMP_Error Class Reference</h1><!-- doxytag: class="XMP_Error" -->XMP Toolkit error, associates an error code with a descriptive error string.
+<a href="#_details">More...</a>
+<p>
+<code>#include &lt;<a class="el" href="XMP__Const_8h-source.html">XMP_Const.h</a>&gt;</code>
+<p>
+
+<p>
+<a href="classXMP__Error-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classXMP__Error.html#a8b3b859899759d679b00237254e30aa">XMP_Error</a> (XMP_Int32 _id, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> _errMsg)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constructor for an <a class="el" href="classXMP__Error.html" title="XMP Toolkit error, associates an error code with a descriptive error string.">XMP_Error</a>. <a href="#a8b3b859899759d679b00237254e30aa"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="56aaa6fc6644ccfc9470ae1af8f3a8cd"></a><!-- doxytag: member="XMP_Error::GetID" ref="56aaa6fc6644ccfc9470ae1af8f3a8cd" args="() const " -->
+XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classXMP__Error.html#56aaa6fc6644ccfc9470ae1af8f3a8cd">GetID</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Retrieves the numeric code from an <a class="el" href="classXMP__Error.html" title="XMP Toolkit error, associates an error code with a descriptive error string.">XMP_Error</a>. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9a3560c67612dec9a6ca37c34eb2c153"></a><!-- doxytag: member="XMP_Error::GetErrMsg" ref="9a3560c67612dec9a6ca37c34eb2c153" args="() const " -->
+<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classXMP__Error.html#9a3560c67612dec9a6ca37c34eb2c153">GetErrMsg</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Retrieves the descriptive string from an <a class="el" href="classXMP__Error.html" title="XMP Toolkit error, associates an error code with a descriptive error string.">XMP_Error</a>. <br></td></tr>
+<tr><td colspan="2"><br><h2>Private Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad714bd7c428e10eff07a8ab6a4f3125"></a><!-- doxytag: member="XMP_Error::id" ref="ad714bd7c428e10eff07a8ab6a4f3125" args="" -->
+XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classXMP__Error.html#ad714bd7c428e10eff07a8ab6a4f3125">id</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Exception code. See constants <code><a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40914813595824de97382fffeae7b6fe581" title="Generic unknown error.">kXMPErr_Unknown</a></code> and following. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classXMP__Error.html#31fd80098e50026985e05abd16f3e045">errMsg</a></td></tr>
+
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+XMP Toolkit error, associates an error code with a descriptive error string. <hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="a8b3b859899759d679b00237254e30aa"></a><!-- doxytag: member="XMP_Error::XMP_Error" ref="a8b3b859899759d679b00237254e30aa" args="(XMP_Int32 _id, XMP_StringPtr _errMsg)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">XMP_Error::XMP_Error </td>
+ <td>(</td>
+ <td class="paramtype">XMP_Int32&nbsp;</td>
+ <td class="paramname"> <em>_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
+ <td class="paramname"> <em>_errMsg</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Constructor for an <a class="el" href="classXMP__Error.html" title="XMP Toolkit error, associates an error code with a descriptive error string.">XMP_Error</a>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>_id</em>&nbsp;</td><td>The numeric code.</td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>_errMsg</em>&nbsp;</td><td>The descriptive string, for debugging use only. It must not be shown to users in a final product. It is written for developers, not users, and never localized. </td></tr>
+ </table>
+</dl>
+
+</div>
+</div><p>
+<hr><h2>Member Data Documentation</h2>
+<a class="anchor" name="31fd80098e50026985e05abd16f3e045"></a><!-- doxytag: member="XMP_Error::errMsg" ref="31fd80098e50026985e05abd16f3e045" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> <a class="el" href="classXMP__Error.html#31fd80098e50026985e05abd16f3e045">XMP_Error::errMsg</a><code> [private]</code> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Descriptive string, for debugging use only. It must not be shown to users in a final product. It is written for developers, not users, and never localized.
+</div>
+</div><p>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="XMP__Const_8h-source.html">XMP_Const.h</a></ul>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/closed.gif b/docs/API/closed.gif
new file mode 100644
index 0000000..5310631
--- /dev/null
+++ b/docs/API/closed.gif
Binary files differ
diff --git a/docs/XMPToolkit/doxygen.png b/docs/API/doxygen.png
index f0a274b..f0a274b 100644
--- a/docs/XMPToolkit/doxygen.png
+++ b/docs/API/doxygen.png
Binary files differ
diff --git a/docs/API/files.html b/docs/API/files.html
new file mode 100644
index 0000000..5767a96
--- /dev/null
+++ b/docs/API/files.html
@@ -0,0 +1,82 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: File Index</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li class="current"><a href="files.html"><span>File&nbsp;List</span></a></li>
+ <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>File List</h1>Here is a list of all documented files with brief descriptions:<table>
+ <tr><td class="indexkey"><a class="el" href="TXMPFiles_8hpp.html">TXMPFiles.hpp</a> <a href="TXMPFiles_8hpp-source.html">[code]</a></td><td class="indexvalue">API for access to the main (document-level) metadata in a file_ </td></tr>
+ <tr><td class="indexkey"><a class="el" href="TXMPFiles_8incl__cpp.html">TXMPFiles.incl_cpp</a></td><td class="indexvalue">The implementation of the <a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a> template class </td></tr>
+ <tr><td class="indexkey"><a class="el" href="TXMPIterator_8hpp.html">TXMPIterator.hpp</a> <a href="TXMPIterator_8hpp-source.html">[code]</a></td><td class="indexvalue">API for access to the XMP Toolkit iteration services </td></tr>
+ <tr><td class="indexkey"><a class="el" href="TXMPIterator_8incl__cpp.html">TXMPIterator.incl_cpp</a></td><td class="indexvalue">The implementation of the <a class="el" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a> template class </td></tr>
+ <tr><td class="indexkey"><a class="el" href="TXMPMeta_8hpp.html">TXMPMeta.hpp</a> <a href="TXMPMeta_8hpp-source.html">[code]</a></td><td class="indexvalue">API for access to the XMP Toolkit core services </td></tr>
+ <tr><td class="indexkey"><a class="el" href="TXMPMeta_8incl__cpp.html">TXMPMeta.incl_cpp</a></td><td class="indexvalue">The implementation of the <a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a> template class </td></tr>
+ <tr><td class="indexkey"><a class="el" href="TXMPUtils_8hpp.html">TXMPUtils.hpp</a> <a href="TXMPUtils_8hpp-source.html">[code]</a></td><td class="indexvalue">API for access to the XMP Toolkit utility services </td></tr>
+ <tr><td class="indexkey"><a class="el" href="TXMPUtils_8incl__cpp.html">TXMPUtils.incl_cpp</a></td><td class="indexvalue">The implementation of the <a class="el" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a> template class </td></tr>
+ <tr><td class="indexkey"><a class="el" href="XMP_8incl__cpp.html">XMP.incl_cpp</a></td><td class="indexvalue">Overall client glue file for the XMP toolkit </td></tr>
+ <tr><td class="indexkey"><a class="el" href="XMP__Const_8h.html">XMP_Const.h</a> <a href="XMP__Const_8h-source.html">[code]</a></td><td class="indexvalue">Common C/C++ types and constants for the XMP toolkit </td></tr>
+</table>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/functions.html b/docs/API/functions.html
new file mode 100644
index 0000000..265b526
--- /dev/null
+++ b/docs/API/functions.html
@@ -0,0 +1,441 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Class Members</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="#index_a"><span>a</span></a></li>
+ <li><a href="#index_b"><span>b</span></a></li>
+ <li><a href="#index_c"><span>c</span></a></li>
+ <li><a href="#index_d"><span>d</span></a></li>
+ <li><a href="#index_e"><span>e</span></a></li>
+ <li><a href="#index_f"><span>f</span></a></li>
+ <li><a href="#index_g"><span>g</span></a></li>
+ <li><a href="#index_h"><span>h</span></a></li>
+ <li><a href="#index_i"><span>i</span></a></li>
+ <li><a href="#index_l"><span>l</span></a></li>
+ <li><a href="#index_m"><span>m</span></a></li>
+ <li><a href="#index_n"><span>n</span></a></li>
+ <li><a href="#index_o"><span>o</span></a></li>
+ <li><a href="#index_p"><span>p</span></a></li>
+ <li><a href="#index_r"><span>r</span></a></li>
+ <li><a href="#index_s"><span>s</span></a></li>
+ <li><a href="#index_t"><span>t</span></a></li>
+ <li><a href="#index_w"><span>w</span></a></li>
+ <li><a href="#index_x"><span>x</span></a></li>
+ <li><a href="#index_y"><span>y</span></a></li>
+ <li><a href="#index_~"><span>~</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+Here is a list of all documented class members with links to the class documentation for each member:
+<p>
+<h3><a class="anchor" name="index_a">- a -</a></h3><ul>
+<li>AppendArrayItem()
+: <a class="el" href="classTXMPMeta.html#00d7314dc970ad390499ce9db27d314a">TXMPMeta&lt; tStringObj &gt;</a>
+<li>AppendProperties()
+: <a class="el" href="classTXMPUtils.html#4795244ffcbda927800f789b0e40c262">TXMPUtils&lt; tStringObj &gt;</a>
+</ul>
+<h3><a class="anchor" name="index_b">- b -</a></h3><ul>
+<li>build
+: <a class="el" href="structXMP__VersionInfo.html#0e20a6bf10da4c17bdfc8027f1586ffc">XMP_VersionInfo</a>
+</ul>
+<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
+<li>CanPutXMP()
+: <a class="el" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6">TXMPFiles&lt; tStringObj &gt;</a>
+<li>CatenateArrayItems()
+: <a class="el" href="classTXMPUtils.html#d7e1aa7928252fb88a24fb5c3aef22ba">TXMPUtils&lt; tStringObj &gt;</a>
+<li>charForm
+: <a class="el" href="structXMP__PacketInfo.html#039ce6665fe8e08d922a46f266799f75">XMP_PacketInfo</a>
+<li>CheckFileFormat()
+: <a class="el" href="classTXMPFiles.html#07b7c4b44fb0e0a7d115ddd5ba22f926">TXMPFiles&lt; tStringObj &gt;</a>
+<li>CheckPackageFormat()
+: <a class="el" href="classTXMPFiles.html#7f505664c41d7304fb757d6009b0751c">TXMPFiles&lt; tStringObj &gt;</a>
+<li>Clone()
+: <a class="el" href="classTXMPMeta.html#6ca653436995bbb76315efe7934afd4c">TXMPMeta&lt; tStringObj &gt;</a>
+<li>CloseFile()
+: <a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927">TXMPFiles&lt; tStringObj &gt;</a>
+<li>CompareDateTime()
+: <a class="el" href="classTXMPUtils.html#9fc7f1771032f59f9020aeda4f91991d">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ComposeArrayItemPath()
+: <a class="el" href="classTXMPUtils.html#47fa195aa2e1457aa1f74f7e1ed06da6">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ComposeFieldSelector()
+: <a class="el" href="classTXMPUtils.html#458f8e8729e2334fe54ca8f691a9db23">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ComposeLangSelector()
+: <a class="el" href="classTXMPUtils.html#e4989e5c199a2a4287ee3ae89b872e69">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ComposeQualifierPath()
+: <a class="el" href="classTXMPUtils.html#40ae0ce2065fcb71725e37137884e172">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ComposeStructFieldPath()
+: <a class="el" href="classTXMPUtils.html#706eb85b8401b8682a01348f7e25ee3d">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ConvertFromBool()
+: <a class="el" href="classTXMPUtils.html#509691eb270988de6a770c9c8304ab6b">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ConvertFromDate()
+: <a class="el" href="classTXMPUtils.html#6146a522a3974b4088d6e8241e9cd223">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ConvertFromFloat()
+: <a class="el" href="classTXMPUtils.html#e67ef3931836432b7e574832f0610ed0">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ConvertFromInt()
+: <a class="el" href="classTXMPUtils.html#eec45b4d1a26717290105c9f4e8b4235">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ConvertFromInt64()
+: <a class="el" href="classTXMPUtils.html#eae4617e05358433015eaa80953c5e60">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ConvertToBool()
+: <a class="el" href="classTXMPUtils.html#aaaaadb23f4089daa795f50cba4f405c">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ConvertToDate()
+: <a class="el" href="classTXMPUtils.html#60d33e6ce30286028acca47b2b6e7a0b">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ConvertToFloat()
+: <a class="el" href="classTXMPUtils.html#8a507b006286460814e0486c622d828c">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ConvertToInt()
+: <a class="el" href="classTXMPUtils.html#47d93f9cb4acd9d7ec6b450100209bec">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ConvertToInt64()
+: <a class="el" href="classTXMPUtils.html#711cae0cb1b673ff5e208b4ae458d120">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ConvertToLocalTime()
+: <a class="el" href="classTXMPUtils.html#61852aaba494c8fbad5a6c0c4caf21f5">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ConvertToUTCTime()
+: <a class="el" href="classTXMPUtils.html#bbd4d691c83287ea2fc6b1e33e5858b8">TXMPUtils&lt; tStringObj &gt;</a>
+<li>CountArrayItems()
+: <a class="el" href="classTXMPMeta.html#b79aae864b3ce190d0699252f48e0acc">TXMPMeta&lt; tStringObj &gt;</a>
+<li>CurrentDateTime()
+: <a class="el" href="classTXMPUtils.html#c83f0b963ea64d7eee0b481e15a8439c">TXMPUtils&lt; tStringObj &gt;</a>
+</ul>
+<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
+<li>day
+: <a class="el" href="structXMP__DateTime.html#58496718277eea9dc5e3e19d80a69094">XMP_DateTime</a>
+<li>DecodeFromBase64()
+: <a class="el" href="classTXMPUtils.html#e5bdd91c0c3ee9262dc0a8b9f591b921">TXMPUtils&lt; tStringObj &gt;</a>
+<li>DeleteAlias()
+: <a class="el" href="classTXMPMeta.html#af64964e983235247ef65c86a42a4675">TXMPMeta&lt; tStringObj &gt;</a>
+<li>DeleteArrayItem()
+: <a class="el" href="classTXMPMeta.html#bc1211f47225b5973a170ff952743264">TXMPMeta&lt; tStringObj &gt;</a>
+<li>DeleteNamespace()
+: <a class="el" href="classTXMPMeta.html#3f989597e95db929676273cacd4ea09a">TXMPMeta&lt; tStringObj &gt;</a>
+<li>DeleteProperty()
+: <a class="el" href="classTXMPMeta.html#c8b555ba99904fa49bb4851a60cc3844">TXMPMeta&lt; tStringObj &gt;</a>
+<li>DeleteQualifier()
+: <a class="el" href="classTXMPMeta.html#8ce15f7de7fd3b258f07158ab5fa88be">TXMPMeta&lt; tStringObj &gt;</a>
+<li>DeleteStructField()
+: <a class="el" href="classTXMPMeta.html#bc258e027780a15be65a88fcfd4e1fd4">TXMPMeta&lt; tStringObj &gt;</a>
+<li>DoesArrayItemExist()
+: <a class="el" href="classTXMPMeta.html#492465c588d6d4cb8e30f94790e66f58">TXMPMeta&lt; tStringObj &gt;</a>
+<li>DoesPropertyExist()
+: <a class="el" href="classTXMPMeta.html#f22b116d71ecbbebea016ec5337e7066">TXMPMeta&lt; tStringObj &gt;</a>
+<li>DoesQualifierExist()
+: <a class="el" href="classTXMPMeta.html#81347a92becd387a14f4d47c582f129a">TXMPMeta&lt; tStringObj &gt;</a>
+<li>DoesStructFieldExist()
+: <a class="el" href="classTXMPMeta.html#9261b80d62e77a10ff1a89843bfa10a5">TXMPMeta&lt; tStringObj &gt;</a>
+<li>DumpAliases()
+: <a class="el" href="classTXMPMeta.html#c2e1bbfd6b9188afb730260808557512">TXMPMeta&lt; tStringObj &gt;</a>
+<li>DumpNamespaces()
+: <a class="el" href="classTXMPMeta.html#addc5f555de57472939a41346e276817">TXMPMeta&lt; tStringObj &gt;</a>
+<li>DumpObject()
+: <a class="el" href="classTXMPMeta.html#466fa349c9765f39ca6b1450908e769f">TXMPMeta&lt; tStringObj &gt;</a>
+<li>DuplicateSubtree()
+: <a class="el" href="classTXMPUtils.html#a17838f062e5414bc0929f67ac94a3aa">TXMPUtils&lt; tStringObj &gt;</a>
+</ul>
+<h3><a class="anchor" name="index_e">- e -</a></h3><ul>
+<li>EncodeToBase64()
+: <a class="el" href="classTXMPUtils.html#ef3b23bbc152480f699e269620ecad4a">TXMPUtils&lt; tStringObj &gt;</a>
+<li>Erase()
+: <a class="el" href="classTXMPMeta.html#df57895625ad118782ed48a3931848b7">TXMPMeta&lt; tStringObj &gt;</a>
+<li>errMsg
+: <a class="el" href="classXMP__Error.html#31fd80098e50026985e05abd16f3e045">XMP_Error</a>
+</ul>
+<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
+<li>fileFormat
+: <a class="el" href="structXMP__ThumbnailInfo.html#9bd0982c79d43f96a253486e79c453df">XMP_ThumbnailInfo</a>
+<li>flags
+: <a class="el" href="structXMP__VersionInfo.html#d018f35b382046ca77b1252bafa93f74">XMP_VersionInfo</a>
+<li>fullOrientation
+: <a class="el" href="structXMP__ThumbnailInfo.html#ffcd0f874cb6c5faaf8d595956cabf24">XMP_ThumbnailInfo</a>
+<li>fullWidth
+: <a class="el" href="structXMP__ThumbnailInfo.html#89f158688c90cef1df24bbfb7770a881">XMP_ThumbnailInfo</a>
+</ul>
+<h3><a class="anchor" name="index_g">- g -</a></h3><ul>
+<li>GetArrayItem()
+: <a class="el" href="classTXMPMeta.html#c64a4251d157937f69b73f2ffac4f7cc">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetErrMsg()
+: <a class="el" href="classXMP__Error.html#9a3560c67612dec9a6ca37c34eb2c153">XMP_Error</a>
+<li>GetFileInfo()
+: <a class="el" href="classTXMPFiles.html#f9931d081cb19f98c81e41786030765b">TXMPFiles&lt; tStringObj &gt;</a>
+<li>GetFormatInfo()
+: <a class="el" href="classTXMPFiles.html#cb9e16a1477ec67fa6da6d736a9bc131">TXMPFiles&lt; tStringObj &gt;</a>
+<li>GetGlobalOptions()
+: <a class="el" href="classTXMPMeta.html#12b2435ba039c62a164951948c016eb4">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetID()
+: <a class="el" href="classXMP__Error.html#56aaa6fc6644ccfc9470ae1af8f3a8cd">XMP_Error</a>
+<li>GetInternalRef()
+: <a class="el" href="classTXMPMeta.html#fbfebded0b85b08bd9c5ba0d7dae07e0">TXMPMeta&lt; tStringObj &gt;</a>
+, <a class="el" href="classTXMPFiles.html#311fc36fdf7270fe05b1c531cdbbd009">TXMPFiles&lt; tStringObj &gt;</a>
+<li>GetLocalizedText()
+: <a class="el" href="classTXMPMeta.html#eefe49bbf669770d769f4fe0ea566bd0">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetNamespacePrefix()
+: <a class="el" href="classTXMPMeta.html#f28589472d8c0397db6cef868f2b8c97">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetNamespaceURI()
+: <a class="el" href="classTXMPMeta.html#a20c84e7549d0a3252fa29a1e83a757a">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetObjectName()
+: <a class="el" href="classTXMPMeta.html#b0d179ed95487d4fd4f2680c1fbe0d40">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetObjectOptions()
+: <a class="el" href="classTXMPMeta.html#0bfc04142a35671a4c8989fcaca6d6c2">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetProperty()
+: <a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetProperty_Bool()
+: <a class="el" href="classTXMPMeta.html#dcf8a1959a8bd42641a42cbd4d64a5b7">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetProperty_Date()
+: <a class="el" href="classTXMPMeta.html#2f561295e73047ee90765558d29bd650">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetProperty_Float()
+: <a class="el" href="classTXMPMeta.html#7708c31c9af3e740b27a4893dcd9aa47">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetProperty_Int()
+: <a class="el" href="classTXMPMeta.html#3b6ba486c02607b544917091c43b05cc">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetProperty_Int64()
+: <a class="el" href="classTXMPMeta.html#669e0625cd271b6e7902fe0b51020402">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetQualifier()
+: <a class="el" href="classTXMPMeta.html#2cc58d8316043b035643e7c21633bc13">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetStructField()
+: <a class="el" href="classTXMPMeta.html#885ef7127b897e349f71fa493ace3c94">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetThumbnail()
+: <a class="el" href="classTXMPFiles.html#4ea1eda39f803322e10b2a554ef8ab06">TXMPFiles&lt; tStringObj &gt;</a>
+<li>GetVersionInfo()
+: <a class="el" href="classTXMPFiles.html#6e521c034728b59ab55213a9d8203d1e">TXMPFiles&lt; tStringObj &gt;</a>
+, <a class="el" href="classTXMPMeta.html#5415cfc01a9cb8786939246571a23a9d">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetXMP()
+: <a class="el" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3">TXMPFiles&lt; tStringObj &gt;</a>
+</ul>
+<h3><a class="anchor" name="index_h">- h -</a></h3><ul>
+<li>hasWrapper
+: <a class="el" href="structXMP__PacketInfo.html#6725d8ab8b4eedddaac950d2b1b00a7f">XMP_PacketInfo</a>
+<li>hour
+: <a class="el" href="structXMP__DateTime.html#bc79cdca8cfa5df6583279e3f3e70e9f">XMP_DateTime</a>
+</ul>
+<h3><a class="anchor" name="index_i">- i -</a></h3><ul>
+<li>id
+: <a class="el" href="classXMP__Error.html#ad714bd7c428e10eff07a8ab6a4f3125">XMP_Error</a>
+<li>Initialize()
+: <a class="el" href="classTXMPFiles.html#0874bbbf41c9490abfb613bfe297327d">TXMPFiles&lt; tStringObj &gt;</a>
+, <a class="el" href="classTXMPMeta.html#f1defbb73f919eae06456a655dea726c">TXMPMeta&lt; tStringObj &gt;</a>
+, <a class="el" href="classTXMPFiles.html#794e1830a84a6328eaa1995ba5aa6874">TXMPFiles&lt; tStringObj &gt;</a>
+<li>isDebug
+: <a class="el" href="structXMP__VersionInfo.html#f1643d86f32f5a5a275dc9c5ba843018">XMP_VersionInfo</a>
+</ul>
+<h3><a class="anchor" name="index_l">- l -</a></h3><ul>
+<li>length
+: <a class="el" href="structXMP__PacketInfo.html#f526c582b66e24553f2d4b11eb714a44">XMP_PacketInfo</a>
+</ul>
+<h3><a class="anchor" name="index_m">- m -</a></h3><ul>
+<li>major
+: <a class="el" href="structXMP__VersionInfo.html#7edfa1613a58a248fd15267008bd8afb">XMP_VersionInfo</a>
+<li>MergeFromJPEG()
+: <a class="el" href="classTXMPUtils.html#6187cd5fef0eccecac6805d4114dcd2e">TXMPUtils&lt; tStringObj &gt;</a>
+<li>message
+: <a class="el" href="structXMP__VersionInfo.html#19654242b92bffd7517e92882850e834">XMP_VersionInfo</a>
+<li>micro
+: <a class="el" href="structXMP__VersionInfo.html#4b448a8253e26a37d2df35e04ac25d28">XMP_VersionInfo</a>
+<li>minor
+: <a class="el" href="structXMP__VersionInfo.html#f5b56598e15febd742b431dadae7c317">XMP_VersionInfo</a>
+<li>minute
+: <a class="el" href="structXMP__DateTime.html#e84965f3296a9c106d1f6c88aa6a7bdf">XMP_DateTime</a>
+<li>month
+: <a class="el" href="structXMP__DateTime.html#b4b71c1a54879d7da1b4135e23d5446f">XMP_DateTime</a>
+</ul>
+<h3><a class="anchor" name="index_n">- n -</a></h3><ul>
+<li>nanoSecond
+: <a class="el" href="structXMP__DateTime.html#190c2a19f01e90997ec2973aec37712c">XMP_DateTime</a>
+<li>Next()
+: <a class="el" href="classTXMPIterator.html#124a1dd1ab3ff0d236e4d4b967dafcd9">TXMPIterator&lt; tStringObj &gt;</a>
+</ul>
+<h3><a class="anchor" name="index_o">- o -</a></h3><ul>
+<li>offset
+: <a class="el" href="structXMP__PacketInfo.html#20f65fcfd0f3658ab93ff441a9d61d2c">XMP_PacketInfo</a>
+<li>OpenFile()
+: <a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb">TXMPFiles&lt; tStringObj &gt;</a>
+<li>operator=()
+: <a class="el" href="classTXMPFiles.html#3f1483fcc92860460d3772216dfaef81">TXMPFiles&lt; tStringObj &gt;</a>
+, <a class="el" href="classTXMPIterator.html#d767d731320d3f4c997c6ce9f7f8fa63">TXMPIterator&lt; tStringObj &gt;</a>
+, <a class="el" href="classTXMPMeta.html#4d5a601c9b77f6f6ab5f14e658de58ef">TXMPMeta&lt; tStringObj &gt;</a>
+</ul>
+<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
+<li>PackageForJPEG()
+: <a class="el" href="classTXMPUtils.html#6001b4ff54c60fdf0c40e6b78a5c457a">TXMPUtils&lt; tStringObj &gt;</a>
+<li>pad
+: <a class="el" href="structXMP__PacketInfo.html#83ec12161a36451fef05d88cc754104e">XMP_PacketInfo</a>
+<li>pad1
+: <a class="el" href="structXMP__ThumbnailInfo.html#6ccab4dea65d89c7ab141b59ac055955">XMP_ThumbnailInfo</a>
+<li>padSize
+: <a class="el" href="structXMP__PacketInfo.html#f4f99e6a5b36b05fdf4a519421875256">XMP_PacketInfo</a>
+<li>ParseFromBuffer()
+: <a class="el" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26">TXMPMeta&lt; tStringObj &gt;</a>
+<li>PutXMP()
+: <a class="el" href="classTXMPFiles.html#502ed01119e0421413e773f4f42683ec">TXMPFiles&lt; tStringObj &gt;</a>
+</ul>
+<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
+<li>RegisterAlias()
+: <a class="el" href="classTXMPMeta.html#c47027a765b6365e268f4de3e61b006a">TXMPMeta&lt; tStringObj &gt;</a>
+<li>RegisterNamespace()
+: <a class="el" href="classTXMPMeta.html#c0368ddbaa4d689cd5b1aff1c88bb0e1">TXMPMeta&lt; tStringObj &gt;</a>
+<li>RegisterStandardAliases()
+: <a class="el" href="classTXMPMeta.html#b77cf73fa0cc63d845f113b3d1c83602">TXMPMeta&lt; tStringObj &gt;</a>
+<li>RemoveProperties()
+: <a class="el" href="classTXMPUtils.html#40c645803530662e08d042b4b7c6190d">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ResolveAlias()
+: <a class="el" href="classTXMPMeta.html#c4b9c75202f2b961ad92f10a9e504e9a">TXMPMeta&lt; tStringObj &gt;</a>
+</ul>
+<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
+<li>second
+: <a class="el" href="structXMP__DateTime.html#675313c70a7e05b7ca50d21300b7d81b">XMP_DateTime</a>
+<li>SeparateArrayItems()
+: <a class="el" href="classTXMPUtils.html#66c5ddee47aa36ed906353f94ca18d2e">TXMPUtils&lt; tStringObj &gt;</a>
+<li>SerializeToBuffer()
+: <a class="el" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49">TXMPMeta&lt; tStringObj &gt;</a>
+<li>SetAbortProc()
+: <a class="el" href="classTXMPFiles.html#7b86c130fdbd54b5ac158ec3fee93777">TXMPFiles&lt; tStringObj &gt;</a>
+<li>SetArrayItem()
+: <a class="el" href="classTXMPMeta.html#15720ee8e732232fa25989870cf99846">TXMPMeta&lt; tStringObj &gt;</a>
+<li>SetGlobalOptions()
+: <a class="el" href="classTXMPMeta.html#e7bb38d9b3857b08106630a386b47332">TXMPMeta&lt; tStringObj &gt;</a>
+<li>SetLocalizedText()
+: <a class="el" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19">TXMPMeta&lt; tStringObj &gt;</a>
+<li>SetObjectName()
+: <a class="el" href="classTXMPMeta.html#cf1935be8e4849976dfc02325424960a">TXMPMeta&lt; tStringObj &gt;</a>
+<li>SetObjectOptions()
+: <a class="el" href="classTXMPMeta.html#92055b3ae18dfd5e5491108f59318f17">TXMPMeta&lt; tStringObj &gt;</a>
+<li>SetProperty()
+: <a class="el" href="classTXMPMeta.html#cc50625611f6aad405aa47197b6d0055">TXMPMeta&lt; tStringObj &gt;</a>
+<li>SetProperty_Bool()
+: <a class="el" href="classTXMPMeta.html#9521e3838272ec501ffdb60ff3eb482f">TXMPMeta&lt; tStringObj &gt;</a>
+<li>SetProperty_Date()
+: <a class="el" href="classTXMPMeta.html#eee10669445f77139d5634199ff01079">TXMPMeta&lt; tStringObj &gt;</a>
+<li>SetProperty_Float()
+: <a class="el" href="classTXMPMeta.html#3b0f2f6bae57931ea96775f03608c0ed">TXMPMeta&lt; tStringObj &gt;</a>
+<li>SetProperty_Int()
+: <a class="el" href="classTXMPMeta.html#b8ae94130d9a05c1b9a3ee25588b6421">TXMPMeta&lt; tStringObj &gt;</a>
+<li>SetProperty_Int64()
+: <a class="el" href="classTXMPMeta.html#df919aff205e934e4c8250a067f7b377">TXMPMeta&lt; tStringObj &gt;</a>
+<li>SetQualifier()
+: <a class="el" href="classTXMPMeta.html#c2e798da5f9d94e486382a41e73fcea3">TXMPMeta&lt; tStringObj &gt;</a>
+<li>SetStructField()
+: <a class="el" href="classTXMPMeta.html#77d4a1bf7831f39073af9ea1544ebefa">TXMPMeta&lt; tStringObj &gt;</a>
+<li>SetTimeZone()
+: <a class="el" href="classTXMPUtils.html#96bcc45febac55f6c49951815b7de2ef">TXMPUtils&lt; tStringObj &gt;</a>
+<li>Skip()
+: <a class="el" href="classTXMPIterator.html#30b4d78974b347e4fcd275f1f65a61b2">TXMPIterator&lt; tStringObj &gt;</a>
+<li>Sort()
+: <a class="el" href="classTXMPMeta.html#8ac5a02a13d439ff33ed4431986da681">TXMPMeta&lt; tStringObj &gt;</a>
+</ul>
+<h3><a class="anchor" name="index_t">- t -</a></h3><ul>
+<li>Terminate()
+: <a class="el" href="classTXMPFiles.html#1e8de80c252b60b332dc4bc524139fd8">TXMPFiles&lt; tStringObj &gt;</a>
+, <a class="el" href="classTXMPMeta.html#6c30fae26173167958b6f0da95a53865">TXMPMeta&lt; tStringObj &gt;</a>
+<li>tnailFormat
+: <a class="el" href="structXMP__ThumbnailInfo.html#f57b103c5a78c636afc3a391f28a5906">XMP_ThumbnailInfo</a>
+<li>tnailImage
+: <a class="el" href="structXMP__ThumbnailInfo.html#683c74dc7168f0046204ea153de3c179">XMP_ThumbnailInfo</a>
+<li>tnailSize
+: <a class="el" href="structXMP__ThumbnailInfo.html#77072568158233d0c44dd4c8636366ff">XMP_ThumbnailInfo</a>
+<li>tnailWidth
+: <a class="el" href="structXMP__ThumbnailInfo.html#17ac245bb300328031f998ba13f0169b">XMP_ThumbnailInfo</a>
+<li>TXMPFiles()
+: <a class="el" href="classTXMPFiles.html#36abe01988d4ca3939138e871c7b75e7">TXMPFiles&lt; tStringObj &gt;</a>
+<li>TXMPIterator()
+: <a class="el" href="classTXMPIterator.html#b0965286a8cabeafc92fdc52f643003f">TXMPIterator&lt; tStringObj &gt;</a>
+<li>TXMPMeta()
+: <a class="el" href="classTXMPMeta.html#cbe8f556a5b32542c44fa9de9648ad41">TXMPMeta&lt; tStringObj &gt;</a>
+<li>tzHour
+: <a class="el" href="structXMP__DateTime.html#6045133feeef41ac1f78c4664ab13db4">XMP_DateTime</a>
+<li>tzMinute
+: <a class="el" href="structXMP__DateTime.html#45baa70f30a3dc9f88819886cfb91aa1">XMP_DateTime</a>
+<li>tzSign
+: <a class="el" href="structXMP__DateTime.html#2786ad8875bd59f07b8dc2b1d09c6f96">XMP_DateTime</a>
+</ul>
+<h3><a class="anchor" name="index_w">- w -</a></h3><ul>
+<li>writeable
+: <a class="el" href="structXMP__PacketInfo.html#66845c1d5f3f9f36a1543a7322bd7bd1">XMP_PacketInfo</a>
+</ul>
+<h3><a class="anchor" name="index_x">- x -</a></h3><ul>
+<li>XMP_Error()
+: <a class="el" href="classXMP__Error.html#a8b3b859899759d679b00237254e30aa">XMP_Error</a>
+<li>XMP_PacketInfo()
+: <a class="el" href="structXMP__PacketInfo.html#2ae03a1b3d03fa9ebc829105037155a8">XMP_PacketInfo</a>
+<li>XMP_ThumbnailInfo()
+: <a class="el" href="structXMP__ThumbnailInfo.html#20b6acef9b825defe492b3d120532828">XMP_ThumbnailInfo</a>
+</ul>
+<h3><a class="anchor" name="index_y">- y -</a></h3><ul>
+<li>year
+: <a class="el" href="structXMP__DateTime.html#2db713deacfd5a5cb2deea660ca2ccad">XMP_DateTime</a>
+</ul>
+<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
+<li>~TXMPFiles()
+: <a class="el" href="classTXMPFiles.html#5eaa92724cc82d933a32eff9c4636739">TXMPFiles&lt; tStringObj &gt;</a>
+<li>~TXMPIterator()
+: <a class="el" href="classTXMPIterator.html#911554533e8a3f09ab8870bd54462196">TXMPIterator&lt; tStringObj &gt;</a>
+<li>~TXMPMeta()
+: <a class="el" href="classTXMPMeta.html#bab5013870cd47eb0d9d701653735a02">TXMPMeta&lt; tStringObj &gt;</a>
+</ul>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/XMPToolkit/functions.html b/docs/API/functions_func.html
index a083661..e9ed7cb 100644
--- a/docs/XMPToolkit/functions.html
+++ b/docs/API/functions_func.html
@@ -1,49 +1,95 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: Class Members</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Class Members - Functions</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li id="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li id="current"><a href="functions.html"><span>All</span></a></li>
- <li><a href="functions_func.html"><span>Functions</span></a></li>
- </ul>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="#index_a"><span>a</span></a></li>
+ <li><a href="#index_c"><span>c</span></a></li>
+ <li><a href="#index_d"><span>d</span></a></li>
+ <li><a href="#index_e"><span>e</span></a></li>
+ <li><a href="#index_g"><span>g</span></a></li>
+ <li><a href="#index_i"><span>i</span></a></li>
+ <li><a href="#index_m"><span>m</span></a></li>
+ <li><a href="#index_n"><span>n</span></a></li>
+ <li><a href="#index_o"><span>o</span></a></li>
+ <li><a href="#index_p"><span>p</span></a></li>
+ <li><a href="#index_r"><span>r</span></a></li>
+ <li><a href="#index_s"><span>s</span></a></li>
+ <li><a href="#index_t"><span>t</span></a></li>
+ <li><a href="#index_x"><span>x</span></a></li>
+ <li><a href="#index_~"><span>~</span></a></li>
+ </ul>
+ </div>
</div>
-<div class="tabs">
- <ul>
- <li><a href="#index_a"><span>a</span></a></li>
- <li><a href="#index_c"><span>c</span></a></li>
- <li><a href="#index_d"><span>d</span></a></li>
- <li><a href="#index_e"><span>e</span></a></li>
- <li><a href="#index_g"><span>g</span></a></li>
- <li><a href="#index_i"><span>i</span></a></li>
- <li><a href="#index_m"><span>m</span></a></li>
- <li><a href="#index_n"><span>n</span></a></li>
- <li><a href="#index_o"><span>o</span></a></li>
- <li><a href="#index_p"><span>p</span></a></li>
- <li><a href="#index_r"><span>r</span></a></li>
- <li><a href="#index_s"><span>s</span></a></li>
- <li><a href="#index_t"><span>t</span></a></li>
- <li><a href="#index_~"><span>~</span></a></li>
- </ul>
-</div>
-
-<p>
-Here is a list of all documented class members with links to the class documentation for each member:
+<div class="contents">
+&nbsp;
<p>
<h3><a class="anchor" name="index_a">- a -</a></h3><ul>
<li>AppendArrayItem()
@@ -56,6 +102,10 @@ Here is a list of all documented class members with links to the class documenta
: <a class="el" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6">TXMPFiles&lt; tStringObj &gt;</a>
<li>CatenateArrayItems()
: <a class="el" href="classTXMPUtils.html#d7e1aa7928252fb88a24fb5c3aef22ba">TXMPUtils&lt; tStringObj &gt;</a>
+<li>CheckFileFormat()
+: <a class="el" href="classTXMPFiles.html#07b7c4b44fb0e0a7d115ddd5ba22f926">TXMPFiles&lt; tStringObj &gt;</a>
+<li>CheckPackageFormat()
+: <a class="el" href="classTXMPFiles.html#7f505664c41d7304fb757d6009b0751c">TXMPFiles&lt; tStringObj &gt;</a>
<li>Clone()
: <a class="el" href="classTXMPMeta.html#6ca653436995bbb76315efe7934afd4c">TXMPMeta&lt; tStringObj &gt;</a>
<li>CloseFile()
@@ -80,14 +130,16 @@ Here is a list of all documented class members with links to the class documenta
: <a class="el" href="classTXMPUtils.html#e67ef3931836432b7e574832f0610ed0">TXMPUtils&lt; tStringObj &gt;</a>
<li>ConvertFromInt()
: <a class="el" href="classTXMPUtils.html#eec45b4d1a26717290105c9f4e8b4235">TXMPUtils&lt; tStringObj &gt;</a>
+<li>ConvertFromInt64()
+: <a class="el" href="classTXMPUtils.html#eae4617e05358433015eaa80953c5e60">TXMPUtils&lt; tStringObj &gt;</a>
<li>ConvertToBool()
: <a class="el" href="classTXMPUtils.html#aaaaadb23f4089daa795f50cba4f405c">TXMPUtils&lt; tStringObj &gt;</a>
<li>ConvertToDate()
-: <a class="el" href="classTXMPUtils.html#60d33e6ce30286028acca47b2b6e7a0b">TXMPUtils&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPUtils.html#265559d1b4b78e34a460e935c11177d7">TXMPUtils&lt; tStringObj &gt;</a>
<li>ConvertToFloat()
: <a class="el" href="classTXMPUtils.html#abd4e479d2708a9ea3135cd441faa7ea">TXMPUtils&lt; tStringObj &gt;</a>
<li>ConvertToInt()
-: <a class="el" href="classTXMPUtils.html#dfd9d1c522377d5db4ad667a7973ba00">TXMPUtils&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPUtils.html#47d93f9cb4acd9d7ec6b450100209bec">TXMPUtils&lt; tStringObj &gt;</a>
<li>ConvertToInt64()
: <a class="el" href="classTXMPUtils.html#be5d2dcc03c5442202203bba5ca7b172">TXMPUtils&lt; tStringObj &gt;</a>
<li>ConvertToLocalTime()
@@ -123,29 +175,36 @@ Here is a list of all documented class members with links to the class documenta
<li>DoesStructFieldExist()
: <a class="el" href="classTXMPMeta.html#9261b80d62e77a10ff1a89843bfa10a5">TXMPMeta&lt; tStringObj &gt;</a>
<li>DumpAliases()
-: <a class="el" href="classTXMPMeta.html#afb027f200b85467298d237a0c23949b">TXMPMeta&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPMeta.html#c2e1bbfd6b9188afb730260808557512">TXMPMeta&lt; tStringObj &gt;</a>
<li>DumpNamespaces()
-: <a class="el" href="classTXMPMeta.html#44250140a710c0b7c5cc0881e387d004">TXMPMeta&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPMeta.html#addc5f555de57472939a41346e276817">TXMPMeta&lt; tStringObj &gt;</a>
<li>DumpObject()
-: <a class="el" href="classTXMPMeta.html#976c1eb889f44080f76628805712b618">TXMPMeta&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPMeta.html#466fa349c9765f39ca6b1450908e769f">TXMPMeta&lt; tStringObj &gt;</a>
<li>DuplicateSubtree()
: <a class="el" href="classTXMPUtils.html#a17838f062e5414bc0929f67ac94a3aa">TXMPUtils&lt; tStringObj &gt;</a>
</ul>
<h3><a class="anchor" name="index_e">- e -</a></h3><ul>
<li>EncodeToBase64()
: <a class="el" href="classTXMPUtils.html#ef3b23bbc152480f699e269620ecad4a">TXMPUtils&lt; tStringObj &gt;</a>
+<li>Erase()
+: <a class="el" href="classTXMPMeta.html#df57895625ad118782ed48a3931848b7">TXMPMeta&lt; tStringObj &gt;</a>
</ul>
<h3><a class="anchor" name="index_g">- g -</a></h3><ul>
<li>GetArrayItem()
: <a class="el" href="classTXMPMeta.html#c64a4251d157937f69b73f2ffac4f7cc">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetErrMsg()
+: <a class="el" href="classXMP__Error.html#9a3560c67612dec9a6ca37c34eb2c153">XMP_Error</a>
<li>GetFileInfo()
: <a class="el" href="classTXMPFiles.html#f9931d081cb19f98c81e41786030765b">TXMPFiles&lt; tStringObj &gt;</a>
<li>GetFormatInfo()
-: <a class="el" href="classTXMPFiles.html#6ac78e3c7286ca8dcb41eaa007aa00e8">TXMPFiles&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPFiles.html#cb9e16a1477ec67fa6da6d736a9bc131">TXMPFiles&lt; tStringObj &gt;</a>
<li>GetGlobalOptions()
: <a class="el" href="classTXMPMeta.html#12b2435ba039c62a164951948c016eb4">TXMPMeta&lt; tStringObj &gt;</a>
+<li>GetID()
+: <a class="el" href="classXMP__Error.html#56aaa6fc6644ccfc9470ae1af8f3a8cd">XMP_Error</a>
<li>GetInternalRef()
-: <a class="el" href="classTXMPMeta.html#4d35b44f1f017a27772ee902a3dacf04">TXMPMeta&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPMeta.html#fbfebded0b85b08bd9c5ba0d7dae07e0">TXMPMeta&lt; tStringObj &gt;</a>
+, <a class="el" href="classTXMPFiles.html#311fc36fdf7270fe05b1c531cdbbd009">TXMPFiles&lt; tStringObj &gt;</a>
<li>GetLocalizedText()
: <a class="el" href="classTXMPMeta.html#eefe49bbf669770d769f4fe0ea566bd0">TXMPMeta&lt; tStringObj &gt;</a>
<li>GetNamespacePrefix()
@@ -155,7 +214,7 @@ Here is a list of all documented class members with links to the class documenta
<li>GetObjectName()
: <a class="el" href="classTXMPMeta.html#b0d179ed95487d4fd4f2680c1fbe0d40">TXMPMeta&lt; tStringObj &gt;</a>
<li>GetObjectOptions()
-: <a class="el" href="classTXMPMeta.html#39aeaf9eb83cfc1c5455807b95f055f9">TXMPMeta&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPMeta.html#0bfc04142a35671a4c8989fcaca6d6c2">TXMPMeta&lt; tStringObj &gt;</a>
<li>GetProperty()
: <a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c">TXMPMeta&lt; tStringObj &gt;</a>
<li>GetProperty_Bool()
@@ -167,22 +226,24 @@ Here is a list of all documented class members with links to the class documenta
<li>GetProperty_Int()
: <a class="el" href="classTXMPMeta.html#3b6ba486c02607b544917091c43b05cc">TXMPMeta&lt; tStringObj &gt;</a>
<li>GetProperty_Int64()
-: <a class="el" href="classTXMPMeta.html#d1a6629b0466981b67d31c9dc3840ea7">TXMPMeta&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPMeta.html#669e0625cd271b6e7902fe0b51020402">TXMPMeta&lt; tStringObj &gt;</a>
<li>GetQualifier()
: <a class="el" href="classTXMPMeta.html#2cc58d8316043b035643e7c21633bc13">TXMPMeta&lt; tStringObj &gt;</a>
<li>GetStructField()
-: <a class="el" href="classTXMPMeta.html#e99d2bc414d5cd68851147aef6710d4a">TXMPMeta&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPMeta.html#885ef7127b897e349f71fa493ace3c94">TXMPMeta&lt; tStringObj &gt;</a>
<li>GetThumbnail()
: <a class="el" href="classTXMPFiles.html#4ea1eda39f803322e10b2a554ef8ab06">TXMPFiles&lt; tStringObj &gt;</a>
<li>GetVersionInfo()
-: <a class="el" href="classTXMPMeta.html#5415cfc01a9cb8786939246571a23a9d">TXMPMeta&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPFiles.html#6e521c034728b59ab55213a9d8203d1e">TXMPFiles&lt; tStringObj &gt;</a>
+, <a class="el" href="classTXMPMeta.html#5415cfc01a9cb8786939246571a23a9d">TXMPMeta&lt; tStringObj &gt;</a>
<li>GetXMP()
: <a class="el" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3">TXMPFiles&lt; tStringObj &gt;</a>
</ul>
<h3><a class="anchor" name="index_i">- i -</a></h3><ul>
<li>Initialize()
: <a class="el" href="classTXMPFiles.html#0874bbbf41c9490abfb613bfe297327d">TXMPFiles&lt; tStringObj &gt;</a>
-, <a class="el" href="classTXMPMeta.html#bfddf1df0e01ab33d5636a80edc973ca">TXMPMeta&lt; tStringObj &gt;</a>
+, <a class="el" href="classTXMPMeta.html#f1defbb73f919eae06456a655dea726c">TXMPMeta&lt; tStringObj &gt;</a>
+, <a class="el" href="classTXMPFiles.html#794e1830a84a6328eaa1995ba5aa6874">TXMPFiles&lt; tStringObj &gt;</a>
</ul>
<h3><a class="anchor" name="index_m">- m -</a></h3><ul>
<li>MergeFromJPEG()
@@ -196,8 +257,9 @@ Here is a list of all documented class members with links to the class documenta
<li>OpenFile()
: <a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb">TXMPFiles&lt; tStringObj &gt;</a>
<li>operator=()
-: <a class="el" href="classTXMPMeta.html#4d5a601c9b77f6f6ab5f14e658de58ef">TXMPMeta&lt; tStringObj &gt;</a>
-, <a class="el" href="classTXMPIterator.html#d767d731320d3f4c997c6ce9f7f8fa63">TXMPIterator&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPIterator.html#d767d731320d3f4c997c6ce9f7f8fa63">TXMPIterator&lt; tStringObj &gt;</a>
+, <a class="el" href="classTXMPFiles.html#3f1483fcc92860460d3772216dfaef81">TXMPFiles&lt; tStringObj &gt;</a>
+, <a class="el" href="classTXMPMeta.html#4d5a601c9b77f6f6ab5f14e658de58ef">TXMPMeta&lt; tStringObj &gt;</a>
</ul>
<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
<li>PackageForJPEG()
@@ -205,13 +267,13 @@ Here is a list of all documented class members with links to the class documenta
<li>ParseFromBuffer()
: <a class="el" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26">TXMPMeta&lt; tStringObj &gt;</a>
<li>PutXMP()
-: <a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a">TXMPFiles&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPFiles.html#da77eab74c3440659db3122f6ec8b7f4">TXMPFiles&lt; tStringObj &gt;</a>
</ul>
<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
<li>RegisterAlias()
-: <a class="el" href="classTXMPMeta.html#b9463c7459125ca0038db2e586c5e4df">TXMPMeta&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPMeta.html#c47027a765b6365e268f4de3e61b006a">TXMPMeta&lt; tStringObj &gt;</a>
<li>RegisterNamespace()
-: <a class="el" href="classTXMPMeta.html#4c69d31a37ff24c85679229c479aa1ac">TXMPMeta&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPMeta.html#c0368ddbaa4d689cd5b1aff1c88bb0e1">TXMPMeta&lt; tStringObj &gt;</a>
<li>RegisterStandardAliases()
: <a class="el" href="classTXMPMeta.html#b77cf73fa0cc63d845f113b3d1c83602">TXMPMeta&lt; tStringObj &gt;</a>
<li>RemoveProperties()
@@ -223,7 +285,7 @@ Here is a list of all documented class members with links to the class documenta
<li>SeparateArrayItems()
: <a class="el" href="classTXMPUtils.html#66c5ddee47aa36ed906353f94ca18d2e">TXMPUtils&lt; tStringObj &gt;</a>
<li>SerializeToBuffer()
-: <a class="el" href="classTXMPMeta.html#34143727d979b47a2f2209367aec9a1c">TXMPMeta&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPMeta.html#0d98bc15bdb0f45737b15fc6822f3bc6">TXMPMeta&lt; tStringObj &gt;</a>
<li>SetAbortProc()
: <a class="el" href="classTXMPFiles.html#7b86c130fdbd54b5ac158ec3fee93777">TXMPFiles&lt; tStringObj &gt;</a>
<li>SetArrayItem()
@@ -233,7 +295,7 @@ Here is a list of all documented class members with links to the class documenta
<li>SetLocalizedText()
: <a class="el" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19">TXMPMeta&lt; tStringObj &gt;</a>
<li>SetObjectName()
-: <a class="el" href="classTXMPMeta.html#fd059cc7cd9f906e12dab04e380e495c">TXMPMeta&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPMeta.html#cf1935be8e4849976dfc02325424960a">TXMPMeta&lt; tStringObj &gt;</a>
<li>SetObjectOptions()
: <a class="el" href="classTXMPMeta.html#92055b3ae18dfd5e5491108f59318f17">TXMPMeta&lt; tStringObj &gt;</a>
<li>SetProperty()
@@ -249,33 +311,45 @@ Here is a list of all documented class members with links to the class documenta
<li>SetProperty_Int64()
: <a class="el" href="classTXMPMeta.html#df919aff205e934e4c8250a067f7b377">TXMPMeta&lt; tStringObj &gt;</a>
<li>SetQualifier()
-: <a class="el" href="classTXMPMeta.html#c395e094cab251a0593d508594b21521">TXMPMeta&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPMeta.html#c2e798da5f9d94e486382a41e73fcea3">TXMPMeta&lt; tStringObj &gt;</a>
<li>SetStructField()
-: <a class="el" href="classTXMPMeta.html#0e44c30e7527064909e5f7035d53c4f5">TXMPMeta&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPMeta.html#77d4a1bf7831f39073af9ea1544ebefa">TXMPMeta&lt; tStringObj &gt;</a>
<li>SetTimeZone()
: <a class="el" href="classTXMPUtils.html#96bcc45febac55f6c49951815b7de2ef">TXMPUtils&lt; tStringObj &gt;</a>
<li>Skip()
: <a class="el" href="classTXMPIterator.html#30b4d78974b347e4fcd275f1f65a61b2">TXMPIterator&lt; tStringObj &gt;</a>
+<li>Sort()
+: <a class="el" href="classTXMPMeta.html#8ac5a02a13d439ff33ed4431986da681">TXMPMeta&lt; tStringObj &gt;</a>
</ul>
<h3><a class="anchor" name="index_t">- t -</a></h3><ul>
<li>Terminate()
: <a class="el" href="classTXMPFiles.html#1e8de80c252b60b332dc4bc524139fd8">TXMPFiles&lt; tStringObj &gt;</a>
, <a class="el" href="classTXMPMeta.html#6c30fae26173167958b6f0da95a53865">TXMPMeta&lt; tStringObj &gt;</a>
<li>TXMPFiles()
-: <a class="el" href="classTXMPFiles.html#14f01e38454178578fd25fff6024fd54">TXMPFiles&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPFiles.html#36abe01988d4ca3939138e871c7b75e7">TXMPFiles&lt; tStringObj &gt;</a>
<li>TXMPIterator()
-: <a class="el" href="classTXMPIterator.html#6b2b7a3d6359aec216adf32bdf7fb140">TXMPIterator&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPIterator.html#88e855c18b2b15f7b8a5ccf3b9398352">TXMPIterator&lt; tStringObj &gt;</a>
<li>TXMPMeta()
-: <a class="el" href="classTXMPMeta.html#21a4d06fc2e77b28991bb900f0f48e50">TXMPMeta&lt; tStringObj &gt;</a>
+: <a class="el" href="classTXMPMeta.html#da43d63894350e23a4307c41b7335eca">TXMPMeta&lt; tStringObj &gt;</a>
+</ul>
+<h3><a class="anchor" name="index_x">- x -</a></h3><ul>
+<li>XMP_Error()
+: <a class="el" href="classXMP__Error.html#a8b3b859899759d679b00237254e30aa">XMP_Error</a>
+<li>XMP_PacketInfo()
+: <a class="el" href="structXMP__PacketInfo.html#2ae03a1b3d03fa9ebc829105037155a8">XMP_PacketInfo</a>
+<li>XMP_ThumbnailInfo()
+: <a class="el" href="structXMP__ThumbnailInfo.html#20b6acef9b825defe492b3d120532828">XMP_ThumbnailInfo</a>
</ul>
<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
+<li>~TXMPFiles()
+: <a class="el" href="classTXMPFiles.html#5eaa92724cc82d933a32eff9c4636739">TXMPFiles&lt; tStringObj &gt;</a>
<li>~TXMPIterator()
: <a class="el" href="classTXMPIterator.html#911554533e8a3f09ab8870bd54462196">TXMPIterator&lt; tStringObj &gt;</a>
<li>~TXMPMeta()
: <a class="el" href="classTXMPMeta.html#bab5013870cd47eb0d9d701653735a02">TXMPMeta&lt; tStringObj &gt;</a>
</ul>
-<hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:58 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
</body>
</html>
diff --git a/docs/API/functions_vars.html b/docs/API/functions_vars.html
new file mode 100644
index 0000000..513f375
--- /dev/null
+++ b/docs/API/functions_vars.html
@@ -0,0 +1,199 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Class Members - Variables</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="#index_b"><span>b</span></a></li>
+ <li><a href="#index_c"><span>c</span></a></li>
+ <li><a href="#index_d"><span>d</span></a></li>
+ <li><a href="#index_e"><span>e</span></a></li>
+ <li><a href="#index_f"><span>f</span></a></li>
+ <li><a href="#index_h"><span>h</span></a></li>
+ <li><a href="#index_i"><span>i</span></a></li>
+ <li><a href="#index_l"><span>l</span></a></li>
+ <li><a href="#index_m"><span>m</span></a></li>
+ <li><a href="#index_n"><span>n</span></a></li>
+ <li><a href="#index_o"><span>o</span></a></li>
+ <li><a href="#index_p"><span>p</span></a></li>
+ <li><a href="#index_s"><span>s</span></a></li>
+ <li><a href="#index_t"><span>t</span></a></li>
+ <li><a href="#index_w"><span>w</span></a></li>
+ <li><a href="#index_y"><span>y</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+&nbsp;
+<p>
+<h3><a class="anchor" name="index_b">- b -</a></h3><ul>
+<li>build
+: <a class="el" href="structXMP__VersionInfo.html#0e20a6bf10da4c17bdfc8027f1586ffc">XMP_VersionInfo</a>
+</ul>
+<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
+<li>charForm
+: <a class="el" href="structXMP__PacketInfo.html#039ce6665fe8e08d922a46f266799f75">XMP_PacketInfo</a>
+</ul>
+<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
+<li>day
+: <a class="el" href="structXMP__DateTime.html#58496718277eea9dc5e3e19d80a69094">XMP_DateTime</a>
+</ul>
+<h3><a class="anchor" name="index_e">- e -</a></h3><ul>
+<li>errMsg
+: <a class="el" href="classXMP__Error.html#31fd80098e50026985e05abd16f3e045">XMP_Error</a>
+</ul>
+<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
+<li>fileFormat
+: <a class="el" href="structXMP__ThumbnailInfo.html#9bd0982c79d43f96a253486e79c453df">XMP_ThumbnailInfo</a>
+<li>flags
+: <a class="el" href="structXMP__VersionInfo.html#d018f35b382046ca77b1252bafa93f74">XMP_VersionInfo</a>
+<li>fullOrientation
+: <a class="el" href="structXMP__ThumbnailInfo.html#ffcd0f874cb6c5faaf8d595956cabf24">XMP_ThumbnailInfo</a>
+<li>fullWidth
+: <a class="el" href="structXMP__ThumbnailInfo.html#89f158688c90cef1df24bbfb7770a881">XMP_ThumbnailInfo</a>
+</ul>
+<h3><a class="anchor" name="index_h">- h -</a></h3><ul>
+<li>hasWrapper
+: <a class="el" href="structXMP__PacketInfo.html#6725d8ab8b4eedddaac950d2b1b00a7f">XMP_PacketInfo</a>
+<li>hour
+: <a class="el" href="structXMP__DateTime.html#bc79cdca8cfa5df6583279e3f3e70e9f">XMP_DateTime</a>
+</ul>
+<h3><a class="anchor" name="index_i">- i -</a></h3><ul>
+<li>id
+: <a class="el" href="classXMP__Error.html#ad714bd7c428e10eff07a8ab6a4f3125">XMP_Error</a>
+<li>isDebug
+: <a class="el" href="structXMP__VersionInfo.html#f1643d86f32f5a5a275dc9c5ba843018">XMP_VersionInfo</a>
+</ul>
+<h3><a class="anchor" name="index_l">- l -</a></h3><ul>
+<li>length
+: <a class="el" href="structXMP__PacketInfo.html#f526c582b66e24553f2d4b11eb714a44">XMP_PacketInfo</a>
+</ul>
+<h3><a class="anchor" name="index_m">- m -</a></h3><ul>
+<li>major
+: <a class="el" href="structXMP__VersionInfo.html#7edfa1613a58a248fd15267008bd8afb">XMP_VersionInfo</a>
+<li>message
+: <a class="el" href="structXMP__VersionInfo.html#19654242b92bffd7517e92882850e834">XMP_VersionInfo</a>
+<li>micro
+: <a class="el" href="structXMP__VersionInfo.html#4b448a8253e26a37d2df35e04ac25d28">XMP_VersionInfo</a>
+<li>minor
+: <a class="el" href="structXMP__VersionInfo.html#f5b56598e15febd742b431dadae7c317">XMP_VersionInfo</a>
+<li>minute
+: <a class="el" href="structXMP__DateTime.html#e84965f3296a9c106d1f6c88aa6a7bdf">XMP_DateTime</a>
+<li>month
+: <a class="el" href="structXMP__DateTime.html#b4b71c1a54879d7da1b4135e23d5446f">XMP_DateTime</a>
+</ul>
+<h3><a class="anchor" name="index_n">- n -</a></h3><ul>
+<li>nanoSecond
+: <a class="el" href="structXMP__DateTime.html#190c2a19f01e90997ec2973aec37712c">XMP_DateTime</a>
+</ul>
+<h3><a class="anchor" name="index_o">- o -</a></h3><ul>
+<li>offset
+: <a class="el" href="structXMP__PacketInfo.html#20f65fcfd0f3658ab93ff441a9d61d2c">XMP_PacketInfo</a>
+</ul>
+<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
+<li>pad
+: <a class="el" href="structXMP__PacketInfo.html#83ec12161a36451fef05d88cc754104e">XMP_PacketInfo</a>
+<li>pad1
+: <a class="el" href="structXMP__ThumbnailInfo.html#6ccab4dea65d89c7ab141b59ac055955">XMP_ThumbnailInfo</a>
+<li>padSize
+: <a class="el" href="structXMP__PacketInfo.html#f4f99e6a5b36b05fdf4a519421875256">XMP_PacketInfo</a>
+</ul>
+<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
+<li>second
+: <a class="el" href="structXMP__DateTime.html#675313c70a7e05b7ca50d21300b7d81b">XMP_DateTime</a>
+</ul>
+<h3><a class="anchor" name="index_t">- t -</a></h3><ul>
+<li>tnailFormat
+: <a class="el" href="structXMP__ThumbnailInfo.html#f57b103c5a78c636afc3a391f28a5906">XMP_ThumbnailInfo</a>
+<li>tnailImage
+: <a class="el" href="structXMP__ThumbnailInfo.html#683c74dc7168f0046204ea153de3c179">XMP_ThumbnailInfo</a>
+<li>tnailSize
+: <a class="el" href="structXMP__ThumbnailInfo.html#77072568158233d0c44dd4c8636366ff">XMP_ThumbnailInfo</a>
+<li>tnailWidth
+: <a class="el" href="structXMP__ThumbnailInfo.html#17ac245bb300328031f998ba13f0169b">XMP_ThumbnailInfo</a>
+<li>tzHour
+: <a class="el" href="structXMP__DateTime.html#6045133feeef41ac1f78c4664ab13db4">XMP_DateTime</a>
+<li>tzMinute
+: <a class="el" href="structXMP__DateTime.html#45baa70f30a3dc9f88819886cfb91aa1">XMP_DateTime</a>
+<li>tzSign
+: <a class="el" href="structXMP__DateTime.html#2786ad8875bd59f07b8dc2b1d09c6f96">XMP_DateTime</a>
+</ul>
+<h3><a class="anchor" name="index_w">- w -</a></h3><ul>
+<li>writeable
+: <a class="el" href="structXMP__PacketInfo.html#66845c1d5f3f9f36a1543a7322bd7bd1">XMP_PacketInfo</a>
+</ul>
+<h3><a class="anchor" name="index_y">- y -</a></h3><ul>
+<li>year
+: <a class="el" href="structXMP__DateTime.html#2db713deacfd5a5cb2deea660ca2ccad">XMP_DateTime</a>
+</ul>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/globals.html b/docs/API/globals.html
new file mode 100644
index 0000000..f112192
--- /dev/null
+++ b/docs/API/globals.html
@@ -0,0 +1,504 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Class Members</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_type.html"><span>Typedefs</span></a></li>
+ <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
+ <li><a href="globals_defs.html"><span>Defines</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li class="current"><a href="globals.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+Here is a list of all documented file members with links to the documentation:
+<p>
+<h3><a class="anchor" name="index_k">- k -</a></h3><ul>
+<li>kXMP_AEFilterPresetFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388fd8d3d1c8c84bc6ab773f1298b3938f0">XMP_Const.h</a>
+<li>kXMP_AEProjectFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403885fb9e99541bbb2d8e375d0cc9fd92a2e">XMP_Const.h</a>
+<li>kXMP_AEProjTemplateFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388da5b138722448c4d4595fe760668c3df">XMP_Const.h</a>
+<li>kXMP_AIFFFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388f093d01e7e9cc55a7d1e204498521fc3">XMP_Const.h</a>
+<li>kXMP_ArrayLastItem
+: <a class="el" href="XMP__Const_8h.html#9549b9a138a896257b5a70176d125317">XMP_Const.h</a>
+<li>kXMP_AVCHDFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388fc5ff976e78df2d79d651de818b011f2">XMP_Const.h</a>
+<li>kXMP_AVIFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388e3a6333624e5c292caf14ad849a5e26e">XMP_Const.h</a>
+<li>kXMP_CELFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403886c949ee85f42eaaed035591338be6789">XMP_Const.h</a>
+<li>kXMP_Char16BitBig
+: <a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c80966bca9b241646f6a730f96c5c14a2d">XMP_Const.h</a>
+<li>kXMP_Char16BitLittle
+: <a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c819b97b941d6586031190025225ee0eaa">XMP_Const.h</a>
+<li>kXMP_Char32BitBig
+: <a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c887f8231aec6dd125baf77c9f3f918fbc">XMP_Const.h</a>
+<li>kXMP_Char32BitLittle
+: <a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c8859e7aa88e7dfd3f55ad2b6445a4708e">XMP_Const.h</a>
+<li>kXMP_Char8Bit
+: <a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c8f5b20dd9abbef29169a362b265049637">XMP_Const.h</a>
+<li>kXMP_CharUnknown
+: <a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c86c37f0724299a9c88e2f622d3246d63b">XMP_Const.h</a>
+<li>kXMP_CINFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d2935ea79b4f9253891e3a68a002c5bb">XMP_Const.h</a>
+<li>kXMP_DeleteExisting
+: <a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04ddd07b4a38b25ab3841e28a9cb169d1c">XMP_Const.h</a>
+<li>kXMP_EncodeUTF16Big
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e310e4cbf639e783163778566b439f01d">XMP_Const.h</a>
+<li>kXMP_EncodeUTF16Little
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9efc6417e382c98a2d507830de62fd4830">XMP_Const.h</a>
+<li>kXMP_EncodeUTF32Big
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e793e99d9ea83f0aadd5b4193a95ea713">XMP_Const.h</a>
+<li>kXMP_EncodeUTF32Little
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9ee0137d98ea990fa23d292489031ba09e">XMP_Const.h</a>
+<li>kXMP_EncodeUTF8
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edc8f241694f5a758e5ee3f6db69d02ab">XMP_Const.h</a>
+<li>kXMP_EncodingMask
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9eeb79571cac99ee97feefb0347b1c1845">XMP_Const.h</a>
+<li>kXMP_EncoreProjectFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388e28efb65bde55f3f8ddfd1fd8a168e2a">XMP_Const.h</a>
+<li>kXMP_EPSFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d947e6da0c4d923195d93e0c53a79c4e">XMP_Const.h</a>
+<li>kXMP_ExactPacketLength
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edb35599da481cc22ea6342b7b4de6bc6">XMP_Const.h</a>
+<li>kXMP_FalseStr
+: <a class="el" href="XMP__Const_8h.html#2dc55b533ed63ed7ff0c3be16a97e278">XMP_Const.h</a>
+<li>kXMP_FLAFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388b1eeba00d1d92e313acfe68cd054daf9">XMP_Const.h</a>
+<li>kXMP_FLVFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388455bc501088bbd8061fe3ea386a5066f">XMP_Const.h</a>
+<li>kXMP_GIFFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388851d2f4525d705cd2dcabb540d0ddc06">XMP_Const.h</a>
+<li>kXMP_HTMLFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388542634e6051139c44fd7b92d08c64760">XMP_Const.h</a>
+<li>kXMP_IllustratorFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038882935c41c6222ff4cca954278f18e554">XMP_Const.h</a>
+<li>kXMP_ImplReservedMask
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5e154b58429b257b18963ba3503e67974">XMP_Const.h</a>
+<li>kXMP_IncludeThumbnailPad
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e0b659b3b544c7a5a076fbd3132cd7f7a">XMP_Const.h</a>
+<li>kXMP_InDesignFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038879cbf96ecc4ac3e0ebfb2d182bc75e60">XMP_Const.h</a>
+<li>kXMP_InsertAfterItem
+: <a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b0498cedd5fa29d47abb2ac8903ac7f5a05">XMP_Const.h</a>
+<li>kXMP_InsertBeforeItem
+: <a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04873411f673fc2a6337083fd024df727f">XMP_Const.h</a>
+<li>kXMP_IterAliases
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266353333450505cd3712320aeac895e541b9">XMP_Const.h</a>
+<li>kXMP_IterClassMask
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f2663593f77b837d89759af3a721712c13f044">XMP_Const.h</a>
+<li>kXMP_IterIncludeAliases
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635c06dbc804df2e5ac24d77ca50a21fa08">XMP_Const.h</a>
+<li>kXMP_IterJustChildren
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635b26e1a38d1d0343fcc5bdaab1b60e3ed">XMP_Const.h</a>
+<li>kXMP_IterJustLeafName
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635cf22e638f4144bcec8207b2ab69bb344">XMP_Const.h</a>
+<li>kXMP_IterJustLeafNodes
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266354589f99b5b4a55e785e3baf4fe1d9b19">XMP_Const.h</a>
+<li>kXMP_IterNamespaces
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635a325d9ffba68a934f0a0a0f6ecfc2f7b">XMP_Const.h</a>
+<li>kXMP_IterOmitQualifiers
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266351b91947105ae68c48c5d5e36aa70d101">XMP_Const.h</a>
+<li>kXMP_IterProperties
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635a0643c076a3b3737ff88ed20f16afd2b">XMP_Const.h</a>
+<li>kXMP_IterSkipSiblings
+: <a class="el" href="XMP__Const_8h.html#0411cd49bb5b71852cecd93bcbf0ca2d2537b4b8db838f85b47988b198cd2a12">XMP_Const.h</a>
+<li>kXMP_IterSkipSubtree
+: <a class="el" href="XMP__Const_8h.html#0411cd49bb5b71852cecd93bcbf0ca2db0b540cd3841f411471a827f833c606e">XMP_Const.h</a>
+<li>kXMP_JPEG2KFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038878b8fa38aaa2067e3e1baa0dcaa7571d">XMP_Const.h</a>
+<li>kXMP_JPEGFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d752b2d3e1139e0745223a9385ef6487">XMP_Const.h</a>
+<li>kXMP_JPEGTNail
+: <a class="el" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4d5184f12e2695285b081ddafc5aeb4321">XMP_Const.h</a>
+<li>kXMP_MOVFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388ebdb172c8a75b4ead2eff2d26ed3dc37">XMP_Const.h</a>
+<li>kXMP_MP3File
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388f3ee34ed2bc26dec0e2d572eeb0de89b">XMP_Const.h</a>
+<li>kXMP_MPEG2File
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388b58eaebed494530072ad990ac7a9807a">XMP_Const.h</a>
+<li>kXMP_MPEG4File
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038889e6282c3f0c8966d788500f5d8eaa91">XMP_Const.h</a>
+<li>kXMP_MPEGFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388043afdc1db730db9ac03c505140c61c8">XMP_Const.h</a>
+<li>kXMP_NoOptions
+: <a class="el" href="XMP__Const_8h.html#ff1df9f3cf050f8b8d3a574db3c3326b">XMP_Const.h</a>
+<li>kXMP_NS_DC
+: <a class="el" href="XMP__Const_8h.html#44453f0d0a1dd295d41722c2387b36fa">XMP_Const.h</a>
+<li>kXMP_NS_EXIF
+: <a class="el" href="XMP__Const_8h.html#d12182e1df1652f56b5eec60c1fcdd8f">XMP_Const.h</a>
+<li>kXMP_NS_IPTCCore
+: <a class="el" href="XMP__Const_8h.html#b794d3d798daf75a963398347dcbb79b">XMP_Const.h</a>
+<li>kXMP_NS_PDF
+: <a class="el" href="XMP__Const_8h.html#0bcb67d0dd0922504e3da7ca5c40c82a">XMP_Const.h</a>
+<li>kXMP_NS_Photoshop
+: <a class="el" href="XMP__Const_8h.html#a1a6f38ebfcdb281c5bf2809859167c7">XMP_Const.h</a>
+<li>kXMP_NS_RDF
+: <a class="el" href="XMP__Const_8h.html#276fac0f70893607afa3f09030ad84c7">XMP_Const.h</a>
+<li>kXMP_NS_TIFF
+: <a class="el" href="XMP__Const_8h.html#673355818b7b9224e8fec0fbc60ba00c">XMP_Const.h</a>
+<li>kXMP_NS_XML
+: <a class="el" href="XMP__Const_8h.html#97564c70460d1f235c8a41b8ac40cfe9">XMP_Const.h</a>
+<li>kXMP_NS_XMP
+: <a class="el" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">XMP_Const.h</a>
+<li>kXMP_NS_XMP_BJ
+: <a class="el" href="XMP__Const_8h.html#308e156c325618acb2172e550929ebee">XMP_Const.h</a>
+<li>kXMP_NS_XMP_Dimensions
+: <a class="el" href="XMP__Const_8h.html#9618e013619aa92ebc808b62243d2ba8">XMP_Const.h</a>
+<li>kXMP_NS_XMP_IdentifierQual
+: <a class="el" href="XMP__Const_8h.html#b466db52a4b85cecfa04710682c1e671">XMP_Const.h</a>
+<li>kXMP_NS_XMP_Image
+: <a class="el" href="XMP__Const_8h.html#935641acc7d01e782ad7a457a7ff338b">XMP_Const.h</a>
+<li>kXMP_NS_XMP_MM
+: <a class="el" href="XMP__Const_8h.html#c67379a9ffa425d0d7976a51c4f2f754">XMP_Const.h</a>
+<li>kXMP_NS_XMP_ResourceEvent
+: <a class="el" href="XMP__Const_8h.html#861613273127156050b456eee11f6b0a">XMP_Const.h</a>
+<li>kXMP_NS_XMP_ResourceRef
+: <a class="el" href="XMP__Const_8h.html#9bf51f2653400645f7b5087e8c4e1c77">XMP_Const.h</a>
+<li>kXMP_NS_XMP_Rights
+: <a class="el" href="XMP__Const_8h.html#e52d761e5a4fc8c8499215d2f3d82b90">XMP_Const.h</a>
+<li>kXMP_NS_XMP_ST_Job
+: <a class="el" href="XMP__Const_8h.html#c7dc4d65bcbba2862e410cc8cfdff6f6">XMP_Const.h</a>
+<li>kXMP_NS_XMP_ST_Version
+: <a class="el" href="XMP__Const_8h.html#b4923bed71ab29c6aa88debe8816c0a2">XMP_Const.h</a>
+<li>kXMP_NS_XMP_T
+: <a class="el" href="XMP__Const_8h.html#0a2d9c5f7beb27553214a7ad1df4f27e">XMP_Const.h</a>
+<li>kXMP_NS_XMP_T_PG
+: <a class="el" href="XMP__Const_8h.html#39afb495ffb24bb3082493c6811e65d0">XMP_Const.h</a>
+<li>kXMP_OmitAllFormatting
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e79230f1d70d2625f7650db6ff5b1ea29">XMP_Const.h</a>
+<li>kXMP_OmitPacketWrapper
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edbb9e4c7ee139da0dd4126ddea794c76">XMP_Const.h</a>
+<li>kXMP_OmitXMPMetaElement
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e9fb498d749d939e2ba9adf555a75b856">XMP_Const.h</a>
+<li>kXMP_P2File
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388bad9584845edf66f2f8fc3c336977e34">XMP_Const.h</a>
+<li>kXMP_PacketInfoVersion
+: <a class="el" href="XMP__Const_8h.html#05589fbab0657f08285ebdfe93f5ec9e767b4847575a8de28e691be660d43817">XMP_Const.h</a>
+<li>kXMP_ParseMoreBuffers
+: <a class="el" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c79b36427b7bf0c0a1ed010a44dec2d3e">XMP_Const.h</a>
+<li>kXMP_PDFFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038817ab6d429c1550eb3cc16d2e544b78eb">XMP_Const.h</a>
+<li>kXMP_PhotoshopFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038822b478a9d0d52d12e8e4a1181024eb1c">XMP_Const.h</a>
+<li>kXMP_PNGFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388c989381d37de320495e4d13f9ecc6371">XMP_Const.h</a>
+<li>kXMP_PostScriptFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038852c90935ee28a0875a49843d463cad70">XMP_Const.h</a>
+<li>kXMP_PremiereProjectFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388eff4f68cd5162370f7bf938a868e280d">XMP_Const.h</a>
+<li>kXMP_PremiereTitleFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403881ad712bbd349dc899ca1e71971032b0a">XMP_Const.h</a>
+<li>kXMP_PropArrayFormMask
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b56b5b5f4b869994b7390edc9589745e9f">XMP_Const.h</a>
+<li>kXMP_PropArrayIsAlternate
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b52596b1f0ea4600270c99102c86b5f1f1">XMP_Const.h</a>
+<li>kXMP_PropArrayIsAltText
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ba253f67a6cf44b7438a3f96b516846d">XMP_Const.h</a>
+<li>kXMP_PropArrayIsOrdered
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5f1cdb3b0a3e852ec55e747a1686aba04">XMP_Const.h</a>
+<li>kXMP_PropArrayIsUnordered
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b50d70c23394c0676657c89de5491192c0">XMP_Const.h</a>
+<li>kXMP_PropArrayLocationMask
+: <a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04ef8c1934a17b0e5d8f0b20a7e89df0df">XMP_Const.h</a>
+<li>kXMP_PropCompositeMask
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b560a9f26fb66c2e65cf40d9bc44968956">XMP_Const.h</a>
+<li>kXMP_PropHasAliases
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b51f819ef281d1f52c4c12d5d02f49d3f0">XMP_Const.h</a>
+<li>kXMP_PropHasLang
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b53fa5ed87edc731bfb3817f58ba70a217">XMP_Const.h</a>
+<li>kXMP_PropHasQualifiers
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b58e34a33a2eed56499d4f6f62da25d159">XMP_Const.h</a>
+<li>kXMP_PropHasType
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5eff16fdf167afc73db25b30b529bd9d5">XMP_Const.h</a>
+<li>kXMP_PropIsAlias
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5b975c19fb5c50f732a1a0d84dadb7c37">XMP_Const.h</a>
+<li>kXMP_PropIsDerived
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b50d898ea7f6b3db513bb24f8a6a285877">XMP_Const.h</a>
+<li>kXMP_PropIsInternal
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b548097c6ea309f240965d77ab564a5464">XMP_Const.h</a>
+<li>kXMP_PropIsQualifier
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b530146ed5209f5c3eb4eeb1fd8e4fb9fe">XMP_Const.h</a>
+<li>kXMP_PropIsStable
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b581dcd06251771a0ddee6c1e36128c65c">XMP_Const.h</a>
+<li>kXMP_PropValueIsArray
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b59b7706e0f0716ac7546bdc24ffedd0bc">XMP_Const.h</a>
+<li>kXMP_PropValueIsStruct
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e">XMP_Const.h</a>
+<li>kXMP_PropValueIsURI
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ab51f87b5c48f47f5cefb9e03293dafb">XMP_Const.h</a>
+<li>kXMP_PropValueOptionsMask
+: <a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04d1b42a8a4c479d9bfaf406b79f2e1465">XMP_Const.h</a>
+<li>kXMP_PShopTNail
+: <a class="el" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4db3207f0166247f17fa913daec2b771ab">XMP_Const.h</a>
+<li>kXMP_ReadOnlyPacket
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e238c792322c5bd5f9e4db3165e01f9d6">XMP_Const.h</a>
+<li>kXMP_RequireXMPMeta
+: <a class="el" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c1e533852436acf75f594a4fb50a64400">XMP_Const.h</a>
+<li>kXMP_SESFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038842cb8767d9cf16eaeb7aec68a4f224e9">XMP_Const.h</a>
+<li>kXMP_SonyHDVFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388a0edb070c11f87c3dad9f8f7a83b9b5e">XMP_Const.h</a>
+<li>kXMP_StrictAliasing
+: <a class="el" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c7107906eab0e1fa6f9f2dc6254ad88b1">XMP_Const.h</a>
+<li>kXMP_SWFFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388564a8095f65d951f451e16eb56650597">XMP_Const.h</a>
+<li>kXMP_TextFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038827051cd824d3ae7bb59e3af7a7908ffd">XMP_Const.h</a>
+<li>kXMP_ThumbnailInfoVersion
+: <a class="el" href="XMP__Const_8h.html#ba01db17f4a2bfbc3db60dc172972a25b1e9c825d1f58e696f34c8940b0176be">XMP_Const.h</a>
+<li>kXMP_TIFFFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388dc0edf25d933c2a21b25449692c3ba08">XMP_Const.h</a>
+<li>kXMP_TIFFTNail
+: <a class="el" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4ddf767c0e478570baac04311b7b79f951">XMP_Const.h</a>
+<li>kXMP_TimeEastOfUTC
+: <a class="el" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b768851b70cc1d2346fa21bc0b0ae6cfec">XMP_Const.h</a>
+<li>kXMP_TimeIsUTC
+: <a class="el" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b73f41be55491204982acb39c9f6c7ad13">XMP_Const.h</a>
+<li>kXMP_TimeWestOfUTC
+: <a class="el" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b7511551ce156d5fd96c26ad464b837801">XMP_Const.h</a>
+<li>kXMP_TrueStr
+: <a class="el" href="XMP__Const_8h.html#4c39e0131b0e3d7db66e1cfa82b67141">XMP_Const.h</a>
+<li>kXMP_UCFFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038896804f7b8ce83786051c4dac4930aa96">XMP_Const.h</a>
+<li>kXMP_UnknownFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403882845f95eaaaf492f5011bff05a398719">XMP_Const.h</a>
+<li>kXMP_UnknownTNail
+: <a class="el" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4d7a20b5cd0872055d043b3593e18f41d6">XMP_Const.h</a>
+<li>kXMP_UseCompactFormat
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e041dc6b7b8684be7112ae40f5f259ebb">XMP_Const.h</a>
+<li>kXMP_UseNullTermination
+: <a class="el" href="XMP__Const_8h.html#8283c9596c03b6d626d5a2b7a90e23ab">XMP_Const.h</a>
+<li>kXMP_WAVFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388cc1fcd4e52423c0dd2966a2e92352fb8">XMP_Const.h</a>
+<li>kXMP_WMAVFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038878c62f7c10b16b1a862d93f6226a4622">XMP_Const.h</a>
+<li>kXMP_WriteAliasComments
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e9ee6f7e9597b93ed12b8ae654ade2654">XMP_Const.h</a>
+<li>kXMP_XDCAM_EXFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038845bf9b21d5ffed3594fbd585c47cc4fc">XMP_Const.h</a>
+<li>kXMP_XDCAM_FAMFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403885f78caa0871695cc92e058e4f4b2dd57">XMP_Const.h</a>
+<li>kXMP_XDCAM_SAMFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038864fe7908df6341e13d9d8c8199cdf852">XMP_Const.h</a>
+<li>kXMP_XMLFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d217b996403fa13caef3d6e978023124">XMP_Const.h</a>
+<li>kXMPErr_AssertFailure
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40914bd6c24087d280c722c1a044eec27d6">XMP_Const.h</a>
+<li>kXMPErr_BadFileFormat
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409a0a05e07925d1f3daf5f36f6da0840f8">XMP_Const.h</a>
+<li>kXMPErr_BadIndex
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40931adb57da79b4fb1f1f5f999ec740010">XMP_Const.h</a>
+<li>kXMPErr_BadIPTC
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40923b2d7cab10b3d80549e6b60855bb15e">XMP_Const.h</a>
+<li>kXMPErr_BadIterPosition
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4092584fc813bfcd9158b7adf28a3454bb9">XMP_Const.h</a>
+<li>kXMPErr_BadJPEG
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409d685e1f839e3bc53dfc55611a0803cee">XMP_Const.h</a>
+<li>kXMPErr_BadMPEG
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409d596daed4ac92f8bf7871669d03effad">XMP_Const.h</a>
+<li>kXMPErr_BadObject
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409115f3d761d2cad952aab23f35cbdf3a1">XMP_Const.h</a>
+<li>kXMPErr_BadOptions
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40940ca77d98bd366442bb8d438c420a444">XMP_Const.h</a>
+<li>kXMPErr_BadParam
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40952d197a8b0af3c55f16958162a4132f1">XMP_Const.h</a>
+<li>kXMPErr_BadParse
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409052b1b525fba7da8c98be5c135f434b8">XMP_Const.h</a>
+<li>kXMPErr_BadPSD
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409d98fc9a9c050e9fc19c3af9c8abb2d6d">XMP_Const.h</a>
+<li>kXMPErr_BadPSIR
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4091606a687cb790af16dc561b2a8f2e6a3">XMP_Const.h</a>
+<li>kXMPErr_BadRDF
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4095464b823e619618d9aa58433cdb45a8e">XMP_Const.h</a>
+<li>kXMPErr_BadSchema
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4092bc66eec6ce830979089d5c336f75539">XMP_Const.h</a>
+<li>kXMPErr_BadSerialize
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c4f936ff6788ce17f6098b7cbda77ed9">XMP_Const.h</a>
+<li>kXMPErr_BadTIFF
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409ecd25299aa177de7bc7f3674fcf2e22d">XMP_Const.h</a>
+<li>kXMPErr_BadUnicode
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c4cf86fa29624c5e19111e09a97fe05f">XMP_Const.h</a>
+<li>kXMPErr_BadValue
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409716956a038782e595ce61d3fbdd1a25a">XMP_Const.h</a>
+<li>kXMPErr_BadXML
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c57f1cf1c24778536fd32972e87334c5">XMP_Const.h</a>
+<li>kXMPErr_BadXMP
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409211bb632ed1264d9e2236f35c6414821">XMP_Const.h</a>
+<li>kXMPErr_BadXPath
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4093f1efec0aa5452f43c55c05aba616ef7">XMP_Const.h</a>
+<li>kXMPErr_Deprecated
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40914342c486ddf394ebc110a446becbfa7">XMP_Const.h</a>
+<li>kXMPErr_EmptyIterator
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409078c69d0d76f25187a11981a2552b179">XMP_Const.h</a>
+<li>kXMPErr_EnforceFailure
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409a856bb36a9742d8542b483e00fc6511b">XMP_Const.h</a>
+<li>kXMPErr_ExternalFailure
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40982941dc15c6ccde6b8fb2f9cc85c2eeb">XMP_Const.h</a>
+<li>kXMPErr_InternalFailure
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4098babbd758d2c64fd04e85fa48e0675c0">XMP_Const.h</a>
+<li>kXMPErr_NoFileHandler
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40910fa053f279fed01b075f34a70f11795">XMP_Const.h</a>
+<li>kXMPErr_NoMemory
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40969eb7fef422fbca62cdbc554afffd813">XMP_Const.h</a>
+<li>kXMPErr_StdException
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4095322df07e2a7792824d2468c4837f1cb">XMP_Const.h</a>
+<li>kXMPErr_TBD
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409cd9fa1b621efafd5b218e3a785cbeda1">XMP_Const.h</a>
+<li>kXMPErr_TooLargeForJPEG
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409a9c1c20e53db12b20068d830a8990c0b">XMP_Const.h</a>
+<li>kXMPErr_Unavailable
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c7ac408582c194cc723a24acb8b4e4c3">XMP_Const.h</a>
+<li>kXMPErr_Unimplemented
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4093de1ac8f4e4afb705d5a4654cb9579e2">XMP_Const.h</a>
+<li>kXMPErr_Unknown
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40914813595824de97382fffeae7b6fe581">XMP_Const.h</a>
+<li>kXMPErr_UnknownException
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409ac7558097a1f5a0f99097199f1bf8ff4">XMP_Const.h</a>
+<li>kXMPErr_UserAbort
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c4ba7b1a57629e4994a0f7a515d51195">XMP_Const.h</a>
+<li>kXMPFiles_AllowsOnlyXMP
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba4a183c3ec4994cf09993e5b31dee9733">XMP_Const.h</a>
+<li>kXMPFiles_AllowsSafeUpdate
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba9fe958d4ccde02516a3a267db63874cd">XMP_Const.h</a>
+<li>kXMPFiles_CanExpand
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba126c9cc056f6569c424431edbcb9521c">XMP_Const.h</a>
+<li>kXMPFiles_CanInjectXMP
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba23a3eb2a5e95292036a93ad6666fa388">XMP_Const.h</a>
+<li>kXMPFiles_CanReconcile
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabafc2bc7cfdd28a326788d563ec0357694">XMP_Const.h</a>
+<li>kXMPFiles_CanRewrite
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba8957f1ef358b4ab3a1df519903f2ae07">XMP_Const.h</a>
+<li>kXMPFiles_FolderBasedFormat
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabaa2a6a4b744b40055387234632b688fcd">XMP_Const.h</a>
+<li>kXMPFiles_HandlerOwnsFile
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabafc2c5b585e698ebf24a9379de35954b4">XMP_Const.h</a>
+<li>kXMPFiles_NeedsReadOnlyPacket
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabaee13099f78018a5e1ce033266c27e999">XMP_Const.h</a>
+<li>kXMPFiles_NoQuickTimeInit
+: <a class="el" href="XMP__Const_8h.html#af105ae5beaca1dee30ae54530691fce4e1723c609cc341c88f254473e315ae9">XMP_Const.h</a>
+<li>kXMPFiles_OpenCacheTNail
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaca2002b03d2a88da0203bf52a3122063">XMP_Const.h</a>
+<li>kXMPFiles_OpenForRead
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea4c61ec4ed571dbc5f1832ff6772320d2">XMP_Const.h</a>
+<li>kXMPFiles_OpenForUpdate
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea91fa388b3888bcb6a68615537b66a49b">XMP_Const.h</a>
+<li>kXMPFiles_OpenInBackground
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eafaccd8151900b2c7fc3e7de598a92d34">XMP_Const.h</a>
+<li>kXMPFiles_OpenLimitedScanning
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea77f34b1873bb2584feabe26a2c8f1182">XMP_Const.h</a>
+<li>kXMPFiles_OpenOnlyXMP
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaa58279b2b1311242e7374117f455bb96">XMP_Const.h</a>
+<li>kXMPFiles_OpenRepairFile
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea05acd568597f72b4812b432ea6cf606a">XMP_Const.h</a>
+<li>kXMPFiles_OpenStrictly
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea0bef4db2ecdaf82a85df9e9d417aab18">XMP_Const.h</a>
+<li>kXMPFiles_OpenUsePacketScanning
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea77b47c63e579b28cbd25083ceb58c285">XMP_Const.h</a>
+<li>kXMPFiles_OpenUseSmartHandler
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaf6332435c7fc89cb0b7381e13fe43646">XMP_Const.h</a>
+<li>kXMPFiles_PrefersInPlace
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabab55e1873e67048928de3fc47550678c3">XMP_Const.h</a>
+<li>kXMPFiles_ReturnsRawPacket
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabadb116eed738d1fcdfe4ab9c1635e08ea">XMP_Const.h</a>
+<li>kXMPFiles_ReturnsTNail
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabaf7fe49636dc1fcc0d6938d4b6fb83a09">XMP_Const.h</a>
+<li>kXMPFiles_UnknownLength
+: <a class="el" href="XMP__Const_8h.html#e0901aabcf619f17cff03f08e5ed3658">XMP_Const.h</a>
+<li>kXMPFiles_UnknownOffset
+: <a class="el" href="XMP__Const_8h.html#6a9b77b60c63781a8776f10880856bf4">XMP_Const.h</a>
+<li>kXMPFiles_UpdateSafely
+: <a class="el" href="XMP__Const_8h.html#f9bdc3014f3d54c426b6d2df10de4960dbf8d744f355ef9800a4ec44325baf54">XMP_Const.h</a>
+<li>kXMPFiles_UsesSidecarXMP
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabad3027b786992e2a4762a4fa37c92943c">XMP_Const.h</a>
+<li>kXMPTS_Maybe
+: <a class="el" href="XMP__Const_8h.html#06fc87d81c62e9abb8790b6e5713c55b7a73219cd125bb21e294ba474112a584">XMP_Const.h</a>
+<li>kXMPTS_No
+: <a class="el" href="XMP__Const_8h.html#06fc87d81c62e9abb8790b6e5713c55b2a88f4d4589bf413377283843f70bc90">XMP_Const.h</a>
+<li>kXMPTS_Yes
+: <a class="el" href="XMP__Const_8h.html#06fc87d81c62e9abb8790b6e5713c55bcf4bfe01497bd0d88c2af337e4bac39e">XMP_Const.h</a>
+<li>kXMPUtil_AllowCommas
+: <a class="el" href="XMP__Const_8h.html#bed82baf7f470b522273a3e37c24c600d6d41710c689f16d19ac26dc9f5cc506">XMP_Const.h</a>
+<li>kXMPUtil_DeleteEmptyValues
+: <a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a5797753b4c5afda9c55e807e41377d86d9">XMP_Const.h</a>
+<li>kXMPUtil_DoAllProperties
+: <a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a578ddfb0572b7602a52e533d92d8b1e9fb">XMP_Const.h</a>
+<li>kXMPUtil_IncludeAliases
+: <a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a57843589b878f53d42d59258f945ad770b">XMP_Const.h</a>
+<li>kXMPUtil_ReplaceOldValues
+: <a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a57dab4dad658d2d218c5b1e7d829b12962">XMP_Const.h</a>
+</ul>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/globals_0x78.html b/docs/API/globals_0x78.html
new file mode 100644
index 0000000..a5233f9
--- /dev/null
+++ b/docs/API/globals_0x78.html
@@ -0,0 +1,160 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Class Members</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_type.html"><span>Typedefs</span></a></li>
+ <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
+ <li><a href="globals_defs.html"><span>Defines</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="globals.html#index_k"><span>k</span></a></li>
+ <li class="current"><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+Here is a list of all documented file members with links to the documentation:
+<p>
+<h3><a class="anchor" name="index_x">- x -</a></h3><ul>
+<li>XMP_AbortProc
+: <a class="el" href="XMP__Const_8h.html#a2738ce2fca7f1809b12834b1b5e2d0e">XMP_Const.h</a>
+<li>XMP_ArrayIsAlternate
+: <a class="el" href="XMP__Const_8h.html#86bc34c4e64dec75618c348163a88720">XMP_Const.h</a>
+<li>XMP_ArrayIsAltText
+: <a class="el" href="XMP__Const_8h.html#bbef21da7bce1491f780586c3e01cd9e">XMP_Const.h</a>
+<li>XMP_ArrayIsOrdered
+: <a class="el" href="XMP__Const_8h.html#72c7077f3ff3e39804a899533867327d">XMP_Const.h</a>
+<li>XMP_ArrayIsUnordered
+: <a class="el" href="XMP__Const_8h.html#8d763b3d36c7067cd7bccd32d4066b43">XMP_Const.h</a>
+<li>XMP_CharFormIs16Bit
+: <a class="el" href="XMP__Const_8h.html#a7596216164335f926cb91d600cddf99">XMP_Const.h</a>
+<li>XMP_CharFormIs32Bit
+: <a class="el" href="XMP__Const_8h.html#1e99ef08266943f52f5c649ab2836ddf">XMP_Const.h</a>
+<li>XMP_CharFormIsBigEndian
+: <a class="el" href="XMP__Const_8h.html#ba2539629b8d238fc56a1901dd07ebca">XMP_Const.h</a>
+<li>XMP_CharFormIsLittleEndian
+: <a class="el" href="XMP__Const_8h.html#906ec1cd2fb1631c1b5ad9ccdf9c0a6b">XMP_Const.h</a>
+<li>XMP_CharFromSerializeForm
+: <a class="el" href="XMP__Const_8h.html#93e7900e6c9fb4057dfd685b5201057d">XMP_Const.h</a>
+<li>XMP_CharToSerializeForm
+: <a class="el" href="XMP__Const_8h.html#8f522964919b742b4138c79611997bae">XMP_Const.h</a>
+<li>XMP_ClearOption
+: <a class="el" href="XMP__Const_8h.html#10c3c9b1b6e266b0b4eb6abe7b03b7d8">XMP_Const.h</a>
+<li>XMP_FileFormat
+: <a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_Const.h</a>
+<li>XMP_GetCharSize
+: <a class="el" href="XMP__Const_8h.html#85bbf023b1b799c3c20176aa289d32b0">XMP_Const.h</a>
+<li>XMP_Index
+: <a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Const.h</a>
+<li>XMP_NodeIsSchema
+: <a class="el" href="XMP__Const_8h.html#12870d8442720ce5230791abc26f9597">XMP_Const.h</a>
+<li>XMP_OptionBits
+: <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_Const.h</a>
+<li>XMP_OptionIsClear
+: <a class="el" href="XMP__Const_8h.html#1d41f53bd1d5c88fad8322ce15e39516">XMP_Const.h</a>
+<li>XMP_OptionIsSet
+: <a class="el" href="XMP__Const_8h.html#ba3edaa921326c7916adb0b70b1bcfb4">XMP_Const.h</a>
+<li>XMP_PropHasLang
+: <a class="el" href="XMP__Const_8h.html#7dc82df90f45b0d746b67d8fdc529c83">XMP_Const.h</a>
+<li>XMP_PropHasQualifiers
+: <a class="el" href="XMP__Const_8h.html#10828aa191aa666aa1166c27beead2a6">XMP_Const.h</a>
+<li>XMP_PropIsAlias
+: <a class="el" href="XMP__Const_8h.html#193b1414fa5312da2aa1d833b85612d0">XMP_Const.h</a>
+<li>XMP_PropIsArray
+: <a class="el" href="XMP__Const_8h.html#98ae521b621cfa3611211e3922a0fce8">XMP_Const.h</a>
+<li>XMP_PropIsQualifier
+: <a class="el" href="XMP__Const_8h.html#8d1b4da6b3cb3a67bf4f8e79352eeeaa">XMP_Const.h</a>
+<li>XMP_PropIsSimple
+: <a class="el" href="XMP__Const_8h.html#510b75338bd488ddd8d9bd4e326806f9">XMP_Const.h</a>
+<li>XMP_PropIsStruct
+: <a class="el" href="XMP__Const_8h.html#ebea8c35e09da7db613e27d0e3ce945f">XMP_Const.h</a>
+<li>XMP_SetOption
+: <a class="el" href="XMP__Const_8h.html#69c4d1b80c4dd581366e0c60209ef612">XMP_Const.h</a>
+<li>XMP_Status
+: <a class="el" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Const.h</a>
+<li>XMP_StringLen
+: <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_Const.h</a>
+<li>XMP_StringPtr
+: <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_Const.h</a>
+<li>XMP_TestOption
+: <a class="el" href="XMP__Const_8h.html#a31596e850cb6b208f5920833d67b9f1">XMP_Const.h</a>
+<li>XMP_TextOutputProc
+: <a class="el" href="XMP__Const_8h.html#8ce3570e6e5ac14cd603e96fa9d2936f">XMP_Const.h</a>
+<li>XMPDocOpsRef
+: <a class="el" href="XMP__Const_8h.html#b516453dd7d906e911f8951983cde5f1">XMP_Const.h</a>
+<li>XMPFilesRef
+: <a class="el" href="XMP__Const_8h.html#a4bca98ad67d7a62c60cb13dbbab0f25">XMP_Const.h</a>
+<li>XMPIteratorRef
+: <a class="el" href="XMP__Const_8h.html#6ade57a30fb1e40d6aa9695c440fc3d2">XMP_Const.h</a>
+<li>XMPMetaRef
+: <a class="el" href="XMP__Const_8h.html#549d5e2cbcb58302d3df840a0205283e">XMP_Const.h</a>
+</ul>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/globals_defs.html b/docs/API/globals_defs.html
new file mode 100644
index 0000000..f2a3b2d
--- /dev/null
+++ b/docs/API/globals_defs.html
@@ -0,0 +1,194 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Class Members</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_type.html"><span>Typedefs</span></a></li>
+ <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
+ <li class="current"><a href="globals_defs.html"><span>Defines</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="#index_k"><span>k</span></a></li>
+ <li><a href="#index_x"><span>x</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+&nbsp;
+<p>
+<h3><a class="anchor" name="index_k">- k -</a></h3><ul>
+<li>kXMP_ArrayLastItem
+: <a class="el" href="XMP__Const_8h.html#9549b9a138a896257b5a70176d125317">XMP_Const.h</a>
+<li>kXMP_FalseStr
+: <a class="el" href="XMP__Const_8h.html#2dc55b533ed63ed7ff0c3be16a97e278">XMP_Const.h</a>
+<li>kXMP_NoOptions
+: <a class="el" href="XMP__Const_8h.html#ff1df9f3cf050f8b8d3a574db3c3326b">XMP_Const.h</a>
+<li>kXMP_NS_DC
+: <a class="el" href="XMP__Const_8h.html#44453f0d0a1dd295d41722c2387b36fa">XMP_Const.h</a>
+<li>kXMP_NS_EXIF
+: <a class="el" href="XMP__Const_8h.html#d12182e1df1652f56b5eec60c1fcdd8f">XMP_Const.h</a>
+<li>kXMP_NS_IPTCCore
+: <a class="el" href="XMP__Const_8h.html#b794d3d798daf75a963398347dcbb79b">XMP_Const.h</a>
+<li>kXMP_NS_PDF
+: <a class="el" href="XMP__Const_8h.html#0bcb67d0dd0922504e3da7ca5c40c82a">XMP_Const.h</a>
+<li>kXMP_NS_Photoshop
+: <a class="el" href="XMP__Const_8h.html#a1a6f38ebfcdb281c5bf2809859167c7">XMP_Const.h</a>
+<li>kXMP_NS_RDF
+: <a class="el" href="XMP__Const_8h.html#276fac0f70893607afa3f09030ad84c7">XMP_Const.h</a>
+<li>kXMP_NS_TIFF
+: <a class="el" href="XMP__Const_8h.html#673355818b7b9224e8fec0fbc60ba00c">XMP_Const.h</a>
+<li>kXMP_NS_XML
+: <a class="el" href="XMP__Const_8h.html#97564c70460d1f235c8a41b8ac40cfe9">XMP_Const.h</a>
+<li>kXMP_NS_XMP
+: <a class="el" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">XMP_Const.h</a>
+<li>kXMP_NS_XMP_BJ
+: <a class="el" href="XMP__Const_8h.html#308e156c325618acb2172e550929ebee">XMP_Const.h</a>
+<li>kXMP_NS_XMP_Dimensions
+: <a class="el" href="XMP__Const_8h.html#9618e013619aa92ebc808b62243d2ba8">XMP_Const.h</a>
+<li>kXMP_NS_XMP_IdentifierQual
+: <a class="el" href="XMP__Const_8h.html#b466db52a4b85cecfa04710682c1e671">XMP_Const.h</a>
+<li>kXMP_NS_XMP_Image
+: <a class="el" href="XMP__Const_8h.html#935641acc7d01e782ad7a457a7ff338b">XMP_Const.h</a>
+<li>kXMP_NS_XMP_MM
+: <a class="el" href="XMP__Const_8h.html#c67379a9ffa425d0d7976a51c4f2f754">XMP_Const.h</a>
+<li>kXMP_NS_XMP_ResourceEvent
+: <a class="el" href="XMP__Const_8h.html#861613273127156050b456eee11f6b0a">XMP_Const.h</a>
+<li>kXMP_NS_XMP_ResourceRef
+: <a class="el" href="XMP__Const_8h.html#9bf51f2653400645f7b5087e8c4e1c77">XMP_Const.h</a>
+<li>kXMP_NS_XMP_Rights
+: <a class="el" href="XMP__Const_8h.html#e52d761e5a4fc8c8499215d2f3d82b90">XMP_Const.h</a>
+<li>kXMP_NS_XMP_ST_Job
+: <a class="el" href="XMP__Const_8h.html#c7dc4d65bcbba2862e410cc8cfdff6f6">XMP_Const.h</a>
+<li>kXMP_NS_XMP_ST_Version
+: <a class="el" href="XMP__Const_8h.html#b4923bed71ab29c6aa88debe8816c0a2">XMP_Const.h</a>
+<li>kXMP_NS_XMP_T
+: <a class="el" href="XMP__Const_8h.html#0a2d9c5f7beb27553214a7ad1df4f27e">XMP_Const.h</a>
+<li>kXMP_NS_XMP_T_PG
+: <a class="el" href="XMP__Const_8h.html#39afb495ffb24bb3082493c6811e65d0">XMP_Const.h</a>
+<li>kXMP_TrueStr
+: <a class="el" href="XMP__Const_8h.html#4c39e0131b0e3d7db66e1cfa82b67141">XMP_Const.h</a>
+<li>kXMP_UseNullTermination
+: <a class="el" href="XMP__Const_8h.html#8283c9596c03b6d626d5a2b7a90e23ab">XMP_Const.h</a>
+<li>kXMPFiles_UnknownLength
+: <a class="el" href="XMP__Const_8h.html#e0901aabcf619f17cff03f08e5ed3658">XMP_Const.h</a>
+<li>kXMPFiles_UnknownOffset
+: <a class="el" href="XMP__Const_8h.html#6a9b77b60c63781a8776f10880856bf4">XMP_Const.h</a>
+</ul>
+<h3><a class="anchor" name="index_x">- x -</a></h3><ul>
+<li>XMP_ArrayIsAlternate
+: <a class="el" href="XMP__Const_8h.html#86bc34c4e64dec75618c348163a88720">XMP_Const.h</a>
+<li>XMP_ArrayIsAltText
+: <a class="el" href="XMP__Const_8h.html#bbef21da7bce1491f780586c3e01cd9e">XMP_Const.h</a>
+<li>XMP_ArrayIsOrdered
+: <a class="el" href="XMP__Const_8h.html#72c7077f3ff3e39804a899533867327d">XMP_Const.h</a>
+<li>XMP_ArrayIsUnordered
+: <a class="el" href="XMP__Const_8h.html#8d763b3d36c7067cd7bccd32d4066b43">XMP_Const.h</a>
+<li>XMP_CharFormIs16Bit
+: <a class="el" href="XMP__Const_8h.html#a7596216164335f926cb91d600cddf99">XMP_Const.h</a>
+<li>XMP_CharFormIs32Bit
+: <a class="el" href="XMP__Const_8h.html#1e99ef08266943f52f5c649ab2836ddf">XMP_Const.h</a>
+<li>XMP_CharFormIsBigEndian
+: <a class="el" href="XMP__Const_8h.html#ba2539629b8d238fc56a1901dd07ebca">XMP_Const.h</a>
+<li>XMP_CharFormIsLittleEndian
+: <a class="el" href="XMP__Const_8h.html#906ec1cd2fb1631c1b5ad9ccdf9c0a6b">XMP_Const.h</a>
+<li>XMP_CharFromSerializeForm
+: <a class="el" href="XMP__Const_8h.html#93e7900e6c9fb4057dfd685b5201057d">XMP_Const.h</a>
+<li>XMP_CharToSerializeForm
+: <a class="el" href="XMP__Const_8h.html#8f522964919b742b4138c79611997bae">XMP_Const.h</a>
+<li>XMP_ClearOption
+: <a class="el" href="XMP__Const_8h.html#10c3c9b1b6e266b0b4eb6abe7b03b7d8">XMP_Const.h</a>
+<li>XMP_GetCharSize
+: <a class="el" href="XMP__Const_8h.html#85bbf023b1b799c3c20176aa289d32b0">XMP_Const.h</a>
+<li>XMP_NodeIsSchema
+: <a class="el" href="XMP__Const_8h.html#12870d8442720ce5230791abc26f9597">XMP_Const.h</a>
+<li>XMP_OptionIsClear
+: <a class="el" href="XMP__Const_8h.html#1d41f53bd1d5c88fad8322ce15e39516">XMP_Const.h</a>
+<li>XMP_OptionIsSet
+: <a class="el" href="XMP__Const_8h.html#ba3edaa921326c7916adb0b70b1bcfb4">XMP_Const.h</a>
+<li>XMP_PropHasLang
+: <a class="el" href="XMP__Const_8h.html#7dc82df90f45b0d746b67d8fdc529c83">XMP_Const.h</a>
+<li>XMP_PropHasQualifiers
+: <a class="el" href="XMP__Const_8h.html#10828aa191aa666aa1166c27beead2a6">XMP_Const.h</a>
+<li>XMP_PropIsAlias
+: <a class="el" href="XMP__Const_8h.html#193b1414fa5312da2aa1d833b85612d0">XMP_Const.h</a>
+<li>XMP_PropIsArray
+: <a class="el" href="XMP__Const_8h.html#98ae521b621cfa3611211e3922a0fce8">XMP_Const.h</a>
+<li>XMP_PropIsQualifier
+: <a class="el" href="XMP__Const_8h.html#8d1b4da6b3cb3a67bf4f8e79352eeeaa">XMP_Const.h</a>
+<li>XMP_PropIsSimple
+: <a class="el" href="XMP__Const_8h.html#510b75338bd488ddd8d9bd4e326806f9">XMP_Const.h</a>
+<li>XMP_PropIsStruct
+: <a class="el" href="XMP__Const_8h.html#ebea8c35e09da7db613e27d0e3ce945f">XMP_Const.h</a>
+<li>XMP_SetOption
+: <a class="el" href="XMP__Const_8h.html#69c4d1b80c4dd581366e0c60209ef612">XMP_Const.h</a>
+<li>XMP_TestOption
+: <a class="el" href="XMP__Const_8h.html#a31596e850cb6b208f5920833d67b9f1">XMP_Const.h</a>
+</ul>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/globals_eval.html b/docs/API/globals_eval.html
new file mode 100644
index 0000000..1f633db
--- /dev/null
+++ b/docs/API/globals_eval.html
@@ -0,0 +1,447 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Class Members</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_type.html"><span>Typedefs</span></a></li>
+ <li class="current"><a href="globals_eval.html"><span>Enumerator</span></a></li>
+ <li><a href="globals_defs.html"><span>Defines</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="#index_k"><span>k</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+&nbsp;
+<p>
+<h3><a class="anchor" name="index_k">- k -</a></h3><ul>
+<li>kXMP_AEFilterPresetFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388fd8d3d1c8c84bc6ab773f1298b3938f0">XMP_Const.h</a>
+<li>kXMP_AEProjectFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403885fb9e99541bbb2d8e375d0cc9fd92a2e">XMP_Const.h</a>
+<li>kXMP_AEProjTemplateFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388da5b138722448c4d4595fe760668c3df">XMP_Const.h</a>
+<li>kXMP_AIFFFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388f093d01e7e9cc55a7d1e204498521fc3">XMP_Const.h</a>
+<li>kXMP_AVCHDFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388fc5ff976e78df2d79d651de818b011f2">XMP_Const.h</a>
+<li>kXMP_AVIFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388e3a6333624e5c292caf14ad849a5e26e">XMP_Const.h</a>
+<li>kXMP_CELFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403886c949ee85f42eaaed035591338be6789">XMP_Const.h</a>
+<li>kXMP_Char16BitBig
+: <a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c80966bca9b241646f6a730f96c5c14a2d">XMP_Const.h</a>
+<li>kXMP_Char16BitLittle
+: <a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c819b97b941d6586031190025225ee0eaa">XMP_Const.h</a>
+<li>kXMP_Char32BitBig
+: <a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c887f8231aec6dd125baf77c9f3f918fbc">XMP_Const.h</a>
+<li>kXMP_Char32BitLittle
+: <a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c8859e7aa88e7dfd3f55ad2b6445a4708e">XMP_Const.h</a>
+<li>kXMP_Char8Bit
+: <a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c8f5b20dd9abbef29169a362b265049637">XMP_Const.h</a>
+<li>kXMP_CharUnknown
+: <a class="el" href="XMP__Const_8h.html#c36f475ca5b446f4fde4c9b90bec77c86c37f0724299a9c88e2f622d3246d63b">XMP_Const.h</a>
+<li>kXMP_CINFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d2935ea79b4f9253891e3a68a002c5bb">XMP_Const.h</a>
+<li>kXMP_DeleteExisting
+: <a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04ddd07b4a38b25ab3841e28a9cb169d1c">XMP_Const.h</a>
+<li>kXMP_EncodeUTF16Big
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e310e4cbf639e783163778566b439f01d">XMP_Const.h</a>
+<li>kXMP_EncodeUTF16Little
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9efc6417e382c98a2d507830de62fd4830">XMP_Const.h</a>
+<li>kXMP_EncodeUTF32Big
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e793e99d9ea83f0aadd5b4193a95ea713">XMP_Const.h</a>
+<li>kXMP_EncodeUTF32Little
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9ee0137d98ea990fa23d292489031ba09e">XMP_Const.h</a>
+<li>kXMP_EncodeUTF8
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edc8f241694f5a758e5ee3f6db69d02ab">XMP_Const.h</a>
+<li>kXMP_EncodingMask
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9eeb79571cac99ee97feefb0347b1c1845">XMP_Const.h</a>
+<li>kXMP_EncoreProjectFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388e28efb65bde55f3f8ddfd1fd8a168e2a">XMP_Const.h</a>
+<li>kXMP_EPSFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d947e6da0c4d923195d93e0c53a79c4e">XMP_Const.h</a>
+<li>kXMP_ExactPacketLength
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edb35599da481cc22ea6342b7b4de6bc6">XMP_Const.h</a>
+<li>kXMP_FLAFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388b1eeba00d1d92e313acfe68cd054daf9">XMP_Const.h</a>
+<li>kXMP_FLVFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388455bc501088bbd8061fe3ea386a5066f">XMP_Const.h</a>
+<li>kXMP_GIFFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388851d2f4525d705cd2dcabb540d0ddc06">XMP_Const.h</a>
+<li>kXMP_HTMLFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388542634e6051139c44fd7b92d08c64760">XMP_Const.h</a>
+<li>kXMP_IllustratorFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038882935c41c6222ff4cca954278f18e554">XMP_Const.h</a>
+<li>kXMP_ImplReservedMask
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5e154b58429b257b18963ba3503e67974">XMP_Const.h</a>
+<li>kXMP_IncludeThumbnailPad
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e0b659b3b544c7a5a076fbd3132cd7f7a">XMP_Const.h</a>
+<li>kXMP_InDesignFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038879cbf96ecc4ac3e0ebfb2d182bc75e60">XMP_Const.h</a>
+<li>kXMP_InsertAfterItem
+: <a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b0498cedd5fa29d47abb2ac8903ac7f5a05">XMP_Const.h</a>
+<li>kXMP_InsertBeforeItem
+: <a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04873411f673fc2a6337083fd024df727f">XMP_Const.h</a>
+<li>kXMP_IterAliases
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266353333450505cd3712320aeac895e541b9">XMP_Const.h</a>
+<li>kXMP_IterClassMask
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f2663593f77b837d89759af3a721712c13f044">XMP_Const.h</a>
+<li>kXMP_IterIncludeAliases
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635c06dbc804df2e5ac24d77ca50a21fa08">XMP_Const.h</a>
+<li>kXMP_IterJustChildren
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635b26e1a38d1d0343fcc5bdaab1b60e3ed">XMP_Const.h</a>
+<li>kXMP_IterJustLeafName
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635cf22e638f4144bcec8207b2ab69bb344">XMP_Const.h</a>
+<li>kXMP_IterJustLeafNodes
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266354589f99b5b4a55e785e3baf4fe1d9b19">XMP_Const.h</a>
+<li>kXMP_IterNamespaces
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635a325d9ffba68a934f0a0a0f6ecfc2f7b">XMP_Const.h</a>
+<li>kXMP_IterOmitQualifiers
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f266351b91947105ae68c48c5d5e36aa70d101">XMP_Const.h</a>
+<li>kXMP_IterProperties
+: <a class="el" href="XMP__Const_8h.html#726ca809ffd3d67ab4b8476646f26635a0643c076a3b3737ff88ed20f16afd2b">XMP_Const.h</a>
+<li>kXMP_IterSkipSiblings
+: <a class="el" href="XMP__Const_8h.html#0411cd49bb5b71852cecd93bcbf0ca2d2537b4b8db838f85b47988b198cd2a12">XMP_Const.h</a>
+<li>kXMP_IterSkipSubtree
+: <a class="el" href="XMP__Const_8h.html#0411cd49bb5b71852cecd93bcbf0ca2db0b540cd3841f411471a827f833c606e">XMP_Const.h</a>
+<li>kXMP_JPEG2KFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038878b8fa38aaa2067e3e1baa0dcaa7571d">XMP_Const.h</a>
+<li>kXMP_JPEGFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d752b2d3e1139e0745223a9385ef6487">XMP_Const.h</a>
+<li>kXMP_JPEGTNail
+: <a class="el" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4d5184f12e2695285b081ddafc5aeb4321">XMP_Const.h</a>
+<li>kXMP_MOVFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388ebdb172c8a75b4ead2eff2d26ed3dc37">XMP_Const.h</a>
+<li>kXMP_MP3File
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388f3ee34ed2bc26dec0e2d572eeb0de89b">XMP_Const.h</a>
+<li>kXMP_MPEG2File
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388b58eaebed494530072ad990ac7a9807a">XMP_Const.h</a>
+<li>kXMP_MPEG4File
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038889e6282c3f0c8966d788500f5d8eaa91">XMP_Const.h</a>
+<li>kXMP_MPEGFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388043afdc1db730db9ac03c505140c61c8">XMP_Const.h</a>
+<li>kXMP_OmitAllFormatting
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e79230f1d70d2625f7650db6ff5b1ea29">XMP_Const.h</a>
+<li>kXMP_OmitPacketWrapper
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9edbb9e4c7ee139da0dd4126ddea794c76">XMP_Const.h</a>
+<li>kXMP_OmitXMPMetaElement
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e9fb498d749d939e2ba9adf555a75b856">XMP_Const.h</a>
+<li>kXMP_P2File
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388bad9584845edf66f2f8fc3c336977e34">XMP_Const.h</a>
+<li>kXMP_PacketInfoVersion
+: <a class="el" href="XMP__Const_8h.html#05589fbab0657f08285ebdfe93f5ec9e767b4847575a8de28e691be660d43817">XMP_Const.h</a>
+<li>kXMP_ParseMoreBuffers
+: <a class="el" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c79b36427b7bf0c0a1ed010a44dec2d3e">XMP_Const.h</a>
+<li>kXMP_PDFFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038817ab6d429c1550eb3cc16d2e544b78eb">XMP_Const.h</a>
+<li>kXMP_PhotoshopFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038822b478a9d0d52d12e8e4a1181024eb1c">XMP_Const.h</a>
+<li>kXMP_PNGFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388c989381d37de320495e4d13f9ecc6371">XMP_Const.h</a>
+<li>kXMP_PostScriptFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038852c90935ee28a0875a49843d463cad70">XMP_Const.h</a>
+<li>kXMP_PremiereProjectFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388eff4f68cd5162370f7bf938a868e280d">XMP_Const.h</a>
+<li>kXMP_PremiereTitleFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403881ad712bbd349dc899ca1e71971032b0a">XMP_Const.h</a>
+<li>kXMP_PropArrayFormMask
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b56b5b5f4b869994b7390edc9589745e9f">XMP_Const.h</a>
+<li>kXMP_PropArrayIsAlternate
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b52596b1f0ea4600270c99102c86b5f1f1">XMP_Const.h</a>
+<li>kXMP_PropArrayIsAltText
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ba253f67a6cf44b7438a3f96b516846d">XMP_Const.h</a>
+<li>kXMP_PropArrayIsOrdered
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5f1cdb3b0a3e852ec55e747a1686aba04">XMP_Const.h</a>
+<li>kXMP_PropArrayIsUnordered
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b50d70c23394c0676657c89de5491192c0">XMP_Const.h</a>
+<li>kXMP_PropArrayLocationMask
+: <a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04ef8c1934a17b0e5d8f0b20a7e89df0df">XMP_Const.h</a>
+<li>kXMP_PropCompositeMask
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b560a9f26fb66c2e65cf40d9bc44968956">XMP_Const.h</a>
+<li>kXMP_PropHasAliases
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b51f819ef281d1f52c4c12d5d02f49d3f0">XMP_Const.h</a>
+<li>kXMP_PropHasLang
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b53fa5ed87edc731bfb3817f58ba70a217">XMP_Const.h</a>
+<li>kXMP_PropHasQualifiers
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b58e34a33a2eed56499d4f6f62da25d159">XMP_Const.h</a>
+<li>kXMP_PropHasType
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5eff16fdf167afc73db25b30b529bd9d5">XMP_Const.h</a>
+<li>kXMP_PropIsAlias
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5b975c19fb5c50f732a1a0d84dadb7c37">XMP_Const.h</a>
+<li>kXMP_PropIsDerived
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b50d898ea7f6b3db513bb24f8a6a285877">XMP_Const.h</a>
+<li>kXMP_PropIsInternal
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b548097c6ea309f240965d77ab564a5464">XMP_Const.h</a>
+<li>kXMP_PropIsQualifier
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b530146ed5209f5c3eb4eeb1fd8e4fb9fe">XMP_Const.h</a>
+<li>kXMP_PropIsStable
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b581dcd06251771a0ddee6c1e36128c65c">XMP_Const.h</a>
+<li>kXMP_PropValueIsArray
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b59b7706e0f0716ac7546bdc24ffedd0bc">XMP_Const.h</a>
+<li>kXMP_PropValueIsStruct
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b590d8e49a828a7e18c64be36a73076a7e">XMP_Const.h</a>
+<li>kXMP_PropValueIsURI
+: <a class="el" href="XMP__Const_8h.html#99fb83031ce9923c84392b4e92f956b5ab51f87b5c48f47f5cefb9e03293dafb">XMP_Const.h</a>
+<li>kXMP_PropValueOptionsMask
+: <a class="el" href="XMP__Const_8h.html#bc6126af1d45847bc59afa0aa3216b04d1b42a8a4c479d9bfaf406b79f2e1465">XMP_Const.h</a>
+<li>kXMP_PShopTNail
+: <a class="el" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4db3207f0166247f17fa913daec2b771ab">XMP_Const.h</a>
+<li>kXMP_ReadOnlyPacket
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e238c792322c5bd5f9e4db3165e01f9d6">XMP_Const.h</a>
+<li>kXMP_RequireXMPMeta
+: <a class="el" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c1e533852436acf75f594a4fb50a64400">XMP_Const.h</a>
+<li>kXMP_SESFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038842cb8767d9cf16eaeb7aec68a4f224e9">XMP_Const.h</a>
+<li>kXMP_SonyHDVFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388a0edb070c11f87c3dad9f8f7a83b9b5e">XMP_Const.h</a>
+<li>kXMP_StrictAliasing
+: <a class="el" href="XMP__Const_8h.html#dc29c2ff13d900c2f185ee95427fb06c7107906eab0e1fa6f9f2dc6254ad88b1">XMP_Const.h</a>
+<li>kXMP_SWFFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388564a8095f65d951f451e16eb56650597">XMP_Const.h</a>
+<li>kXMP_TextFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038827051cd824d3ae7bb59e3af7a7908ffd">XMP_Const.h</a>
+<li>kXMP_ThumbnailInfoVersion
+: <a class="el" href="XMP__Const_8h.html#ba01db17f4a2bfbc3db60dc172972a25b1e9c825d1f58e696f34c8940b0176be">XMP_Const.h</a>
+<li>kXMP_TIFFFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388dc0edf25d933c2a21b25449692c3ba08">XMP_Const.h</a>
+<li>kXMP_TIFFTNail
+: <a class="el" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4ddf767c0e478570baac04311b7b79f951">XMP_Const.h</a>
+<li>kXMP_TimeEastOfUTC
+: <a class="el" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b768851b70cc1d2346fa21bc0b0ae6cfec">XMP_Const.h</a>
+<li>kXMP_TimeIsUTC
+: <a class="el" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b73f41be55491204982acb39c9f6c7ad13">XMP_Const.h</a>
+<li>kXMP_TimeWestOfUTC
+: <a class="el" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b7511551ce156d5fd96c26ad464b837801">XMP_Const.h</a>
+<li>kXMP_UCFFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038896804f7b8ce83786051c4dac4930aa96">XMP_Const.h</a>
+<li>kXMP_UnknownFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403882845f95eaaaf492f5011bff05a398719">XMP_Const.h</a>
+<li>kXMP_UnknownTNail
+: <a class="el" href="XMP__Const_8h.html#16af7b253440dadd46a80a4b9fddba4d7a20b5cd0872055d043b3593e18f41d6">XMP_Const.h</a>
+<li>kXMP_UseCompactFormat
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e041dc6b7b8684be7112ae40f5f259ebb">XMP_Const.h</a>
+<li>kXMP_WAVFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388cc1fcd4e52423c0dd2966a2e92352fb8">XMP_Const.h</a>
+<li>kXMP_WMAVFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038878c62f7c10b16b1a862d93f6226a4622">XMP_Const.h</a>
+<li>kXMP_WriteAliasComments
+: <a class="el" href="XMP__Const_8h.html#61dadd085c1777f559549e05962b2c9e9ee6f7e9597b93ed12b8ae654ade2654">XMP_Const.h</a>
+<li>kXMP_XDCAM_EXFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038845bf9b21d5ffed3594fbd585c47cc4fc">XMP_Const.h</a>
+<li>kXMP_XDCAM_FAMFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b9403885f78caa0871695cc92e058e4f4b2dd57">XMP_Const.h</a>
+<li>kXMP_XDCAM_SAMFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b94038864fe7908df6341e13d9d8c8199cdf852">XMP_Const.h</a>
+<li>kXMP_XMLFile
+: <a class="el" href="XMP__Const_8h.html#385c44f6fb256e5716a2302a5b940388d217b996403fa13caef3d6e978023124">XMP_Const.h</a>
+<li>kXMPErr_AssertFailure
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40914bd6c24087d280c722c1a044eec27d6">XMP_Const.h</a>
+<li>kXMPErr_BadFileFormat
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409a0a05e07925d1f3daf5f36f6da0840f8">XMP_Const.h</a>
+<li>kXMPErr_BadIndex
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40931adb57da79b4fb1f1f5f999ec740010">XMP_Const.h</a>
+<li>kXMPErr_BadIPTC
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40923b2d7cab10b3d80549e6b60855bb15e">XMP_Const.h</a>
+<li>kXMPErr_BadIterPosition
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4092584fc813bfcd9158b7adf28a3454bb9">XMP_Const.h</a>
+<li>kXMPErr_BadJPEG
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409d685e1f839e3bc53dfc55611a0803cee">XMP_Const.h</a>
+<li>kXMPErr_BadMPEG
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409d596daed4ac92f8bf7871669d03effad">XMP_Const.h</a>
+<li>kXMPErr_BadObject
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409115f3d761d2cad952aab23f35cbdf3a1">XMP_Const.h</a>
+<li>kXMPErr_BadOptions
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40940ca77d98bd366442bb8d438c420a444">XMP_Const.h</a>
+<li>kXMPErr_BadParam
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40952d197a8b0af3c55f16958162a4132f1">XMP_Const.h</a>
+<li>kXMPErr_BadParse
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409052b1b525fba7da8c98be5c135f434b8">XMP_Const.h</a>
+<li>kXMPErr_BadPSD
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409d98fc9a9c050e9fc19c3af9c8abb2d6d">XMP_Const.h</a>
+<li>kXMPErr_BadPSIR
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4091606a687cb790af16dc561b2a8f2e6a3">XMP_Const.h</a>
+<li>kXMPErr_BadRDF
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4095464b823e619618d9aa58433cdb45a8e">XMP_Const.h</a>
+<li>kXMPErr_BadSchema
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4092bc66eec6ce830979089d5c336f75539">XMP_Const.h</a>
+<li>kXMPErr_BadSerialize
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c4f936ff6788ce17f6098b7cbda77ed9">XMP_Const.h</a>
+<li>kXMPErr_BadTIFF
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409ecd25299aa177de7bc7f3674fcf2e22d">XMP_Const.h</a>
+<li>kXMPErr_BadUnicode
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c4cf86fa29624c5e19111e09a97fe05f">XMP_Const.h</a>
+<li>kXMPErr_BadValue
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409716956a038782e595ce61d3fbdd1a25a">XMP_Const.h</a>
+<li>kXMPErr_BadXML
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c57f1cf1c24778536fd32972e87334c5">XMP_Const.h</a>
+<li>kXMPErr_BadXMP
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409211bb632ed1264d9e2236f35c6414821">XMP_Const.h</a>
+<li>kXMPErr_BadXPath
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4093f1efec0aa5452f43c55c05aba616ef7">XMP_Const.h</a>
+<li>kXMPErr_Deprecated
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40914342c486ddf394ebc110a446becbfa7">XMP_Const.h</a>
+<li>kXMPErr_EmptyIterator
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409078c69d0d76f25187a11981a2552b179">XMP_Const.h</a>
+<li>kXMPErr_EnforceFailure
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409a856bb36a9742d8542b483e00fc6511b">XMP_Const.h</a>
+<li>kXMPErr_ExternalFailure
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40982941dc15c6ccde6b8fb2f9cc85c2eeb">XMP_Const.h</a>
+<li>kXMPErr_InternalFailure
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4098babbd758d2c64fd04e85fa48e0675c0">XMP_Const.h</a>
+<li>kXMPErr_NoFileHandler
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40910fa053f279fed01b075f34a70f11795">XMP_Const.h</a>
+<li>kXMPErr_NoMemory
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40969eb7fef422fbca62cdbc554afffd813">XMP_Const.h</a>
+<li>kXMPErr_StdException
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4095322df07e2a7792824d2468c4837f1cb">XMP_Const.h</a>
+<li>kXMPErr_TBD
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409cd9fa1b621efafd5b218e3a785cbeda1">XMP_Const.h</a>
+<li>kXMPErr_TooLargeForJPEG
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409a9c1c20e53db12b20068d830a8990c0b">XMP_Const.h</a>
+<li>kXMPErr_Unavailable
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c7ac408582c194cc723a24acb8b4e4c3">XMP_Const.h</a>
+<li>kXMPErr_Unimplemented
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4093de1ac8f4e4afb705d5a4654cb9579e2">XMP_Const.h</a>
+<li>kXMPErr_Unknown
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e40914813595824de97382fffeae7b6fe581">XMP_Const.h</a>
+<li>kXMPErr_UnknownException
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409ac7558097a1f5a0f99097199f1bf8ff4">XMP_Const.h</a>
+<li>kXMPErr_UserAbort
+: <a class="el" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e409c4ba7b1a57629e4994a0f7a515d51195">XMP_Const.h</a>
+<li>kXMPFiles_AllowsOnlyXMP
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba4a183c3ec4994cf09993e5b31dee9733">XMP_Const.h</a>
+<li>kXMPFiles_AllowsSafeUpdate
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba9fe958d4ccde02516a3a267db63874cd">XMP_Const.h</a>
+<li>kXMPFiles_CanExpand
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba126c9cc056f6569c424431edbcb9521c">XMP_Const.h</a>
+<li>kXMPFiles_CanInjectXMP
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba23a3eb2a5e95292036a93ad6666fa388">XMP_Const.h</a>
+<li>kXMPFiles_CanReconcile
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabafc2bc7cfdd28a326788d563ec0357694">XMP_Const.h</a>
+<li>kXMPFiles_CanRewrite
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52caba8957f1ef358b4ab3a1df519903f2ae07">XMP_Const.h</a>
+<li>kXMPFiles_FolderBasedFormat
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabaa2a6a4b744b40055387234632b688fcd">XMP_Const.h</a>
+<li>kXMPFiles_HandlerOwnsFile
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabafc2c5b585e698ebf24a9379de35954b4">XMP_Const.h</a>
+<li>kXMPFiles_NeedsReadOnlyPacket
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabaee13099f78018a5e1ce033266c27e999">XMP_Const.h</a>
+<li>kXMPFiles_NoQuickTimeInit
+: <a class="el" href="XMP__Const_8h.html#af105ae5beaca1dee30ae54530691fce4e1723c609cc341c88f254473e315ae9">XMP_Const.h</a>
+<li>kXMPFiles_OpenCacheTNail
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaca2002b03d2a88da0203bf52a3122063">XMP_Const.h</a>
+<li>kXMPFiles_OpenForRead
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea4c61ec4ed571dbc5f1832ff6772320d2">XMP_Const.h</a>
+<li>kXMPFiles_OpenForUpdate
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea91fa388b3888bcb6a68615537b66a49b">XMP_Const.h</a>
+<li>kXMPFiles_OpenInBackground
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eafaccd8151900b2c7fc3e7de598a92d34">XMP_Const.h</a>
+<li>kXMPFiles_OpenLimitedScanning
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea77f34b1873bb2584feabe26a2c8f1182">XMP_Const.h</a>
+<li>kXMPFiles_OpenOnlyXMP
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaa58279b2b1311242e7374117f455bb96">XMP_Const.h</a>
+<li>kXMPFiles_OpenRepairFile
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea05acd568597f72b4812b432ea6cf606a">XMP_Const.h</a>
+<li>kXMPFiles_OpenStrictly
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea0bef4db2ecdaf82a85df9e9d417aab18">XMP_Const.h</a>
+<li>kXMPFiles_OpenUsePacketScanning
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1ea77b47c63e579b28cbd25083ceb58c285">XMP_Const.h</a>
+<li>kXMPFiles_OpenUseSmartHandler
+: <a class="el" href="XMP__Const_8h.html#6b7b47dd702d9e331586d485013fd1eaf6332435c7fc89cb0b7381e13fe43646">XMP_Const.h</a>
+<li>kXMPFiles_PrefersInPlace
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabab55e1873e67048928de3fc47550678c3">XMP_Const.h</a>
+<li>kXMPFiles_ReturnsRawPacket
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabadb116eed738d1fcdfe4ab9c1635e08ea">XMP_Const.h</a>
+<li>kXMPFiles_ReturnsTNail
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabaf7fe49636dc1fcc0d6938d4b6fb83a09">XMP_Const.h</a>
+<li>kXMPFiles_UpdateSafely
+: <a class="el" href="XMP__Const_8h.html#f9bdc3014f3d54c426b6d2df10de4960dbf8d744f355ef9800a4ec44325baf54">XMP_Const.h</a>
+<li>kXMPFiles_UsesSidecarXMP
+: <a class="el" href="XMP__Const_8h.html#80155586fa275b28773c9b203f52cabad3027b786992e2a4762a4fa37c92943c">XMP_Const.h</a>
+<li>kXMPTS_Maybe
+: <a class="el" href="XMP__Const_8h.html#06fc87d81c62e9abb8790b6e5713c55b7a73219cd125bb21e294ba474112a584">XMP_Const.h</a>
+<li>kXMPTS_No
+: <a class="el" href="XMP__Const_8h.html#06fc87d81c62e9abb8790b6e5713c55b2a88f4d4589bf413377283843f70bc90">XMP_Const.h</a>
+<li>kXMPTS_Yes
+: <a class="el" href="XMP__Const_8h.html#06fc87d81c62e9abb8790b6e5713c55bcf4bfe01497bd0d88c2af337e4bac39e">XMP_Const.h</a>
+<li>kXMPUtil_AllowCommas
+: <a class="el" href="XMP__Const_8h.html#bed82baf7f470b522273a3e37c24c600d6d41710c689f16d19ac26dc9f5cc506">XMP_Const.h</a>
+<li>kXMPUtil_DeleteEmptyValues
+: <a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a5797753b4c5afda9c55e807e41377d86d9">XMP_Const.h</a>
+<li>kXMPUtil_DoAllProperties
+: <a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a578ddfb0572b7602a52e533d92d8b1e9fb">XMP_Const.h</a>
+<li>kXMPUtil_IncludeAliases
+: <a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a57843589b878f53d42d59258f945ad770b">XMP_Const.h</a>
+<li>kXMPUtil_ReplaceOldValues
+: <a class="el" href="XMP__Const_8h.html#b04a0655cd1e3bcac5e8f48c18df1a57dab4dad658d2d218c5b1e7d829b12962">XMP_Const.h</a>
+</ul>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/globals_type.html b/docs/API/globals_type.html
new file mode 100644
index 0000000..e1ad153
--- /dev/null
+++ b/docs/API/globals_type.html
@@ -0,0 +1,106 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Class Members</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_type.html"><span>Typedefs</span></a></li>
+ <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
+ <li><a href="globals_defs.html"><span>Defines</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+&nbsp;
+<p>
+<ul>
+<li>XMP_AbortProc
+: <a class="el" href="XMP__Const_8h.html#a2738ce2fca7f1809b12834b1b5e2d0e">XMP_Const.h</a>
+<li>XMP_FileFormat
+: <a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_Const.h</a>
+<li>XMP_Index
+: <a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Const.h</a>
+<li>XMP_OptionBits
+: <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_Const.h</a>
+<li>XMP_Status
+: <a class="el" href="XMP__Const_8h.html#05b81829c04746826f4f85fbac76e3dd">XMP_Const.h</a>
+<li>XMP_StringLen
+: <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_Const.h</a>
+<li>XMP_StringPtr
+: <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_Const.h</a>
+<li>XMP_TextOutputProc
+: <a class="el" href="XMP__Const_8h.html#8ce3570e6e5ac14cd603e96fa9d2936f">XMP_Const.h</a>
+<li>XMPDocOpsRef
+: <a class="el" href="XMP__Const_8h.html#b516453dd7d906e911f8951983cde5f1">XMP_Const.h</a>
+<li>XMPFilesRef
+: <a class="el" href="XMP__Const_8h.html#a4bca98ad67d7a62c60cb13dbbab0f25">XMP_Const.h</a>
+<li>XMPIteratorRef
+: <a class="el" href="XMP__Const_8h.html#6ade57a30fb1e40d6aa9695c440fc3d2">XMP_Const.h</a>
+<li>XMPMetaRef
+: <a class="el" href="XMP__Const_8h.html#549d5e2cbcb58302d3df840a0205283e">XMP_Const.h</a>
+</ul>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/graph_legend.dot b/docs/API/graph_legend.dot
new file mode 100644
index 0000000..1f7c6e4
--- /dev/null
+++ b/docs/API/graph_legend.dot
@@ -0,0 +1,23 @@
+digraph G
+{
+ bgcolor="transparent";
+ edge [fontname="FreeSans",fontsize=10,labelfontname="FreeSans",labelfontsize=10];
+ node [fontname="FreeSans",fontsize=10,shape=record];
+ Node9 [shape="box",label="Inherited",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",fillcolor="grey75",style="filled" fontcolor="black"];
+ Node10 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"];
+ Node10 [shape="box",label="PublicBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPublicBase.html"];
+ Node11 -> Node10 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"];
+ Node11 [shape="box",label="Truncated",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="red",URL="$classTruncated.html"];
+ Node13 -> Node9 [dir=back,color="darkgreen",fontsize=10,style="solid",fontname="FreeSans"];
+ Node13 [shape="box",label="ProtectedBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classProtectedBase.html"];
+ Node14 -> Node9 [dir=back,color="firebrick4",fontsize=10,style="solid",fontname="FreeSans"];
+ Node14 [shape="box",label="PrivateBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPrivateBase.html"];
+ Node15 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"];
+ Node15 [shape="box",label="Undocumented",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="grey75"];
+ Node16 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"];
+ Node16 [shape="box",label="Templ< int >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"];
+ Node17 -> Node16 [dir=back,color="orange",fontsize=10,style="dashed",label="< int >",fontname="FreeSans"];
+ Node17 [shape="box",label="Templ< T >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"];
+ Node18 -> Node9 [dir=back,color="darkorchid3",fontsize=10,style="dashed",label="m_usedClass",fontname="FreeSans"];
+ Node18 [shape="box",label="Used",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classUsed.html"];
+}
diff --git a/docs/XMPToolkit/graph_legend.html b/docs/API/graph_legend.html
index d259d70..c178a08 100644
--- a/docs/XMPToolkit/graph_legend.html
+++ b/docs/API/graph_legend.html
@@ -1,17 +1,62 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: Graph Legend</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Graph Legend</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
<h1>Graph Legend</h1>This page explains how to interpret the graphs that are generated by doxygen.<p>
Consider the following example: <div class="fragment"><pre class="fragment"><span class="comment">/*! Invisible class because of truncation */</span>
<span class="keyword">class </span>Invisible { };
@@ -41,7 +86,7 @@ Consider the following example: <div class="fragment"><pre class="fragment"><spa
<span class="keyword">class </span>Inherited : <span class="keyword">public</span> PublicBase,
<span class="keyword">protected</span> ProtectedBase,
<span class="keyword">private</span> PrivateBase,
- <span class="keyword">public</span> Undocumented
+ <span class="keyword">public</span> Undocumented,
<span class="keyword">public</span> Templ&lt;int&gt;
{
<span class="keyword">private</span>:
@@ -54,7 +99,7 @@ Consider the following example: <div class="fragment"><pre class="fragment"><spa
</center> <p>
The boxes in the above graph have the following meaning: <ul>
<li>
-A filled black box represents the struct or class for which the graph is generated. </li>
+A filled gray box represents the struct or class for which the graph is generated. </li>
<li>
A box with a black border denotes a documented struct or class. </li>
<li>
@@ -74,8 +119,8 @@ A purple dashed arrow is used if a class is contained or used by another class.
<li>
A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance. </li>
</ul>
-<hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:59 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
</body>
</html>
diff --git a/docs/API/graph_legend.png b/docs/API/graph_legend.png
new file mode 100644
index 0000000..5e2a339
--- /dev/null
+++ b/docs/API/graph_legend.png
Binary files differ
diff --git a/docs/API/index.html b/docs/API/index.html
new file mode 100644
index 0000000..bf96a3d
--- /dev/null
+++ b/docs/API/index.html
@@ -0,0 +1,178 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: XMP Toolkit API Overview</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li class="current"><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>XMP Toolkit API Overview</h1>
+<p>
+The XMPCore component provides the tools that allow you to parse, manipulate, and serialize XMP data, according to the Data Model and Serialization Model given in the XMP Specification. XMPCore has no knowledge of files. <br>
+<br>
+ The client view of the XMPCore API is provided through these C++ class templates:<p>
+<ul>
+<li><code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> provides the fundamental methods for manipulating XMP metadata. </li>
+<li><code><a class="el" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a></code> provides methods to iterate over existing XMP metadata. </li>
+<li><code><a class="el" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a></code> provides additional utilities layered on top of <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code>.</li>
+</ul>
+The XMPFiles component provides support for locating the XMP in a file, adding XMP to a file, or updating the XMP in a file. Use it to retrieve an entire XMP packet from a file, which you can either manipulate directly or use to create a <code><a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a></code> object, so that you can use the XMPCore component to manipulate the individual XMP properties. XMPFiles contains a number of format-specific file handlers that know how to efficiently access the XMP in particular formats. It also includes a fallback packet scanner that can be used for unknown file formats.<p>
+<ul>
+<li>The client view of the XMPFiles API is provided through <code><a class="el" href="classTXMPFiles.html" title="API for access to the main (document-level) metadata in a file.">TXMPFiles</a></code>.</li>
+</ul>
+The <code>TXMP*</code> classes are C++ template classes. The templates must be instantiated for use. You can read the template header files, <a class="el" href="TXMPMeta_8hpp.html" title="API for access to the XMP Toolkit core services.">TXMPMeta.hpp</a>, and so on, for detailed information, but do not include them directly in your code.<br>
+<br>
+ There is one overall header file, XMP.hpp, which is the only one that C++ clients should include with the <code>include</code> directive. Read the instructions in this file for instantiating the template classes. When you have done this, the API is available through the concrete classes <code>SXMPMeta</code>, <code>SXMPUtils</code>, <code>SXMPIterator</code>, and <code>SXMPFiles</code>. <br>
+<br>
+ You should also read <a class="el" href="XMP__Const_8h.html" title="Common C/C++ types and constants for the XMP toolkit.">XMP_Const.h</a> for detailed information about types and constants for namespace URIs and option flags.<h2><a class="anchor" name="second-sec">
+Using of the XMP Toolkit API</a></h2>
+Developers should understand the XMP Data Model before working with the XMP Toolkit. The data model is documented in the XMP Specification. The XMPCoverage sample in the SDK provides an in-depth illustration of the use of the XMP Toolkit. An XMP Programmer's Guide with tutorial examples is provided in the docs folder within the SDK. <br>
+<br>
+ Use of the XMP Toolkit is reasonably straightforward once you understand the XMP Data Model. An XMP property tree that conforms to the Data Model is encapsulated by a <a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a> object, and the functions of that class allow you to manipulate the namespaces, properties, and values.<br>
+<br>
+ To prepare XMP data for output (transferring it or embedding it in a file), it must be serialized as XML text (specifically, RDF conforming to the Serialization Model).<p>
+<ul>
+<li>Use <code><a class="el" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49" title="SerializeToBuffer() serializes metadata in this XMP object into a string as RDF.">TXMPMeta::SerializeToBuffer()</a></code> to creates the serialized XML for the data contained in the object.</li>
+</ul>
+<ul>
+<li>Use the XMPFiles component (<code><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb" title="OpenFile() opens a file for metadata access.">TXMPFiles::OpenFile()</a></code> and <code><a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a" title="PutXMP() updates the XMP metadata in this object without writing out the file.">TXMPFiles::PutXMP()</a></code>)to write out the serialized XMP as an XMP packet embedded in a file.</li>
+</ul>
+Similarly, you use the XMPFiles component (<code><a class="el" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3" title="GetXMP() retrieves the XMP metadata from an open file.">TXMPFiles::GetXMP()</a></code>) to extract an XMP packet from a file. To work with the XMP, create a <a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a> object and populate it with the data using <code><a class="el" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26" title="ParseFromBuffer() parses RDF from a series of input buffers into this XMP object...">TXMPMeta::ParseFromBuffer()</a></code>. <br>
+<br>
+ You can use the XMPCore component to generate new XMP data.<p>
+<ul>
+<li>You can create your own private namespaces, but must register them before use, using <code><a class="el" href="classTXMPMeta.html#c0368ddbaa4d689cd5b1aff1c88bb0e1" title="RegisterNamespace() registers a namespace URI with a suggested prefix.">TXMPMeta::RegisterNamespace()</a></code>.</li>
+</ul>
+<ul>
+<li>Property accessor functions of various kinds allow you to retrieve and set existing property values, and to create new properties.</li>
+</ul>
+<ul>
+<li>You can get and set property values as strings, or as binary types. <a class="el" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a> provides functions for converting between types.</li>
+</ul>
+<ul>
+<li>Use <code><a class="el" href="classTXMPMeta.html#eefe49bbf669770d769f4fe0ea566bd0" title="GetLocalizedText() retrieves information about a selected item in an alt-text array...">TXMPMeta::GetLocalizedText()</a></code> and <code><a class="el" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19" title="SetLocalizedText() modifies the value of a selected item in an alt-text array.">TXMPMeta::SetLocalizedText()</a></code> when dealing with language alternative (alt-text) arrays.</li>
+</ul>
+<ul>
+<li>Use the path composition functions provided by <a class="el" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a> to construct complex paths with nested structs or arrays. It is recommended that you not depend on specific namespace prefixes; rather than hard-coding the prefixes for struct fields, use functions like <code><a class="el" href="classTXMPUtils.html#706eb85b8401b8682a01348f7e25ee3d" title="ComposeStructFieldPath() composes the path expression for a field in a struct.">TXMPUtils::ComposeStructFieldPath()</a></code> and <code><a class="el" href="classTXMPMeta.html#0e44c30e7527064909e5f7035d53c4f5" title="SetStructField() creates or sets the value of a field within a nested structure.">TXMPMeta::SetStructField()</a></code>.</li>
+</ul>
+<ul>
+<li>Create a <a class="el" href="classTXMPIterator.html" title="API for access to the XMP Toolkit iteration services.">TXMPIterator</a> object to operate on all or a subset of the properties in the metadata tree contained in a <a class="el" href="classTXMPMeta.html" title="API for access to the XMP Toolkit core services.">TXMPMeta</a> object.</li>
+</ul>
+<h2><a class="anchor" name="third-sec">
+Overview of XMP Toolkit Internal Architecture.</a></h2>
+The XMP Toolkit is implemented in three layers, which isolate the return of string values, synchronization for multi-threaded use, and exception propagation. While the SDK as provided from Adobe builds a static library, this layering can easily be adapted to build a DLL.<p>
+<ul>
+<li>The top layer is the implementation of the client template classes. This layer is for copying string results and releasing the threading lock if necessary.</li>
+</ul>
+<ul>
+<li>The middle layer consists of the three classes <code>WXMPMeta</code>, <code>WXMPIterator</code>, and <code>WXMPUtils</code>. They provide wrappers between the top client layer and the actual implementation. The middle layer is responsible for acquiring the threading lock, basic parameter checking, catching propagated exceptions, and releasing the threading lock when appropriate.</li>
+</ul>
+<ul>
+<li>The inner layer is the actual implementation, contained in the three classes <code>XMPMeta</code>, <code>XMPIterator</code>, and <code>XMPUtils</code>.</li>
+</ul>
+<h3><a class="anchor" name="callchain">
+Implementation Call Chain</a></h3>
+The implementation of <code>GetProperty</code> provides a good illustration of the toolkit layering. The declaration below for <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">TXMPMeta::GetProperty</a></code> is simplified by hardwiring <code>std::string</code>. The <code>XMP_StringPtr</code> type is simply <code>const char *</code>.<p>
+<div class="fragment"><pre class="fragment"> <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c" title="GetProperty() reports whether a property exists, and retrieves its value.">TXMPMeta::GetProperty</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+ <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+ std::string * propValue,
+ <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * options )<span class="keyword"> const</span>
+<span class="keyword"> </span>{
+ <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> resultPtr = 0;
+ <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a" title="The type for string length parameters. A 32-bit unsigned integer, as big as will...">XMP_StringLen</a> resultLen = 0;
+
+ <span class="keywordtype">bool</span> found = this-&gt;xmpObj.GetProperty ( schemaNS, propName,
+ &amp;resultPtr, &amp;resultLen, options );
+
+ <span class="keywordflow">if</span> ( found ) {
+ <span class="keywordflow">if</span> ( propValue != 0 ) propValue-&gt;assign ( resultPtr, resultLen );
+ this-&gt;xmpObj.UnlockObject ( <a class="code" href="XMP__Const_8h.html#ff1df9f3cf050f8b8d3a574db3c3326b" title="Options macro clears all property-type bits.">kXMP_NoOptions</a> );
+ }
+ <span class="keywordflow">return</span> found;
+
+ }
+</pre></div><p>
+The template object contains a data member pointer to the underlying <code>WXMPMeta</code> object. This is used to dispatch the call to the middle layer. The actual implementation of the XMP toolkit returns string values as a pointer and length, the pointer references private internal storage of the toolkit. The client code copies the string value to the client's string object. This minimizes the amount of string copying, and should the XMP toolkit be built as a DLL ensures that any memory allocation for the client's value is done on the client side. The call to <code>WXMPMeta::UnlockObject</code> is explained below.<p>
+<div class="fragment"><pre class="fragment"> <span class="keywordtype">bool</span> WXMPMeta::GetProperty ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> schemaNS,
+ <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> propName,
+ <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6" title="The type for input string parameters. A const char *, a null-terminated UTF-8 string...">XMP_StringPtr</a> * propValue,
+ <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a" title="The type for string length parameters. A 32-bit unsigned integer, as big as will...">XMP_StringLen</a> * valueSize,
+ <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8" title="The type for a collection of 32 flag bits. Individual flags are defined as enum value...">XMP_OptionBits</a> * options )<span class="keyword"> const</span>
+<span class="keyword"> </span>{
+ XMP_Bool found;
+ XMP_ENTER_WRAPPER ( <span class="stringliteral">"WXMPMeta::GetProperty"</span> )
+
+ if ( (schemaNS == 0) || (*schemaNS == 0) ) {
+ XMP_Throw ( <span class="stringliteral">"Empty schema namespace URI"</span>, <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4092bc66eec6ce830979089d5c336f75539" title="Bad schema parameter.">kXMPErr_BadSchema</a> );
+ }
+ <span class="keywordflow">if</span> ( (propName == 0) || (*propName == 0) ) {
+ XMP_Throw ( <span class="stringliteral">"Empty property name"</span>, <a class="code" href="XMP__Const_8h.html#db49720dc49f7d4e4cf9adbf2948e4093f1efec0aa5452f43c55c05aba616ef7" title="Bad XPath parameter.">kXMPErr_BadXPath</a> );
+ }
+
+ <span class="keywordflow">if</span> ( propValue == 0 ) propValue = &amp;voidStringPtr;
+ <span class="keywordflow">if</span> ( valueSize == 0 ) valueSize = &amp;voidStringLen;
+ <span class="keywordflow">if</span> ( options == 0 ) options = &amp;voidOptionBits;
+
+ <span class="keyword">const</span> XMPMeta &amp; meta = WtoXMPMeta_Ref ( *<span class="keyword">this</span> );
+ found = meta.GetProperty ( schemaNS, propName, propValue, valueSize, options );
+
+ XMP_EXIT_WRAPPER_KEEP_LOCK ( found )
+ return found;
+ }
+</pre></div><p>
+The entry and exit macros in the <code>WXMPMeta</code> layer acquire the threading lock on entry and usually release it on exit. The lock is kept on exit whenever a string value is returned. Since a pointer to internal data is returned, the threading lock can't be released until after the template code in the client copies the string. The entry and exit macros also prevent uncontrolled exception propagation from the lower layer back to the client. This is not critical for use of the XMP Toolkit as a static library. But it is generally not safe to propagate C++ exceptions across DLL boundaries. </div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/open.gif b/docs/API/open.gif
new file mode 100644
index 0000000..b903009
--- /dev/null
+++ b/docs/API/open.gif
Binary files differ
diff --git a/docs/API/structXMP__DateTime-members.html b/docs/API/structXMP__DateTime-members.html
new file mode 100644
index 0000000..76bd521
--- /dev/null
+++ b/docs/API/structXMP__DateTime-members.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Member List</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>XMP_DateTime Member List</h1>This is the complete list of members for <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="structXMP__DateTime.html#58496718277eea9dc5e3e19d80a69094">day</a></td><td><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__DateTime.html#bc79cdca8cfa5df6583279e3f3e70e9f">hour</a></td><td><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__DateTime.html#e84965f3296a9c106d1f6c88aa6a7bdf">minute</a></td><td><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__DateTime.html#b4b71c1a54879d7da1b4135e23d5446f">month</a></td><td><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__DateTime.html#190c2a19f01e90997ec2973aec37712c">nanoSecond</a></td><td><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__DateTime.html#675313c70a7e05b7ca50d21300b7d81b">second</a></td><td><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__DateTime.html#6045133feeef41ac1f78c4664ab13db4">tzHour</a></td><td><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__DateTime.html#45baa70f30a3dc9f88819886cfb91aa1">tzMinute</a></td><td><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__DateTime.html#2786ad8875bd59f07b8dc2b1d09c6f96">tzSign</a></td><td><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__DateTime.html#2db713deacfd5a5cb2deea660ca2ccad">year</a></td><td><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></td><td></td></tr>
+</table></div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/structXMP__DateTime.html b/docs/API/structXMP__DateTime.html
new file mode 100644
index 0000000..bec9155
--- /dev/null
+++ b/docs/API/structXMP__DateTime.html
@@ -0,0 +1,145 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: XMP_DateTime Struct Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>XMP_DateTime Struct Reference</h1><!-- doxytag: class="XMP_DateTime" -->The expanded type for a date and time.
+<a href="#_details">More...</a>
+<p>
+<code>#include &lt;<a class="el" href="XMP__Const_8h-source.html">XMP_Const.h</a>&gt;</code>
+<p>
+
+<p>
+<a href="structXMP__DateTime-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2db713deacfd5a5cb2deea660ca2ccad"></a><!-- doxytag: member="XMP_DateTime::year" ref="2db713deacfd5a5cb2deea660ca2ccad" args="" -->
+XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__DateTime.html#2db713deacfd5a5cb2deea660ca2ccad">year</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The year, can be negative. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b4b71c1a54879d7da1b4135e23d5446f"></a><!-- doxytag: member="XMP_DateTime::month" ref="b4b71c1a54879d7da1b4135e23d5446f" args="" -->
+XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__DateTime.html#b4b71c1a54879d7da1b4135e23d5446f">month</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The month in the range 1..12. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="58496718277eea9dc5e3e19d80a69094"></a><!-- doxytag: member="XMP_DateTime::day" ref="58496718277eea9dc5e3e19d80a69094" args="" -->
+XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__DateTime.html#58496718277eea9dc5e3e19d80a69094">day</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The day of the month in the range 1..31. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bc79cdca8cfa5df6583279e3f3e70e9f"></a><!-- doxytag: member="XMP_DateTime::hour" ref="bc79cdca8cfa5df6583279e3f3e70e9f" args="" -->
+XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__DateTime.html#bc79cdca8cfa5df6583279e3f3e70e9f">hour</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The hour in the range 0..23. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e84965f3296a9c106d1f6c88aa6a7bdf"></a><!-- doxytag: member="XMP_DateTime::minute" ref="e84965f3296a9c106d1f6c88aa6a7bdf" args="" -->
+XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__DateTime.html#e84965f3296a9c106d1f6c88aa6a7bdf">minute</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The minute in the range 0..59. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="675313c70a7e05b7ca50d21300b7d81b"></a><!-- doxytag: member="XMP_DateTime::second" ref="675313c70a7e05b7ca50d21300b7d81b" args="" -->
+XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__DateTime.html#675313c70a7e05b7ca50d21300b7d81b">second</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The second in the range 0..59. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__DateTime.html#2786ad8875bd59f07b8dc2b1d09c6f96">tzSign</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6045133feeef41ac1f78c4664ab13db4"></a><!-- doxytag: member="XMP_DateTime::tzHour" ref="6045133feeef41ac1f78c4664ab13db4" args="" -->
+XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__DateTime.html#6045133feeef41ac1f78c4664ab13db4">tzHour</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The time zone hour in the range 0..23. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45baa70f30a3dc9f88819886cfb91aa1"></a><!-- doxytag: member="XMP_DateTime::tzMinute" ref="45baa70f30a3dc9f88819886cfb91aa1" args="" -->
+XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__DateTime.html#45baa70f30a3dc9f88819886cfb91aa1">tzMinute</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The time zone minute in the range 0..59. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="190c2a19f01e90997ec2973aec37712c"></a><!-- doxytag: member="XMP_DateTime::nanoSecond" ref="190c2a19f01e90997ec2973aec37712c" args="" -->
+XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__DateTime.html#190c2a19f01e90997ec2973aec37712c">nanoSecond</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Nanoseconds within a second, often left as zero. <br></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+The expanded type for a date and time.
+<p>
+Dates and time in the serialized XMP are ISO 8601 strings. The <code><a class="el" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a></code> struct allows easy conversion with other formats.<p>
+All of the fields are 32 bit, even though most could be 8 bit. This avoids overflow when doing carries for arithmetic or normalization. All fields have signed values for the same reasons.<p>
+Date-time values are occasionally used with only a date or only a time component. A date without a time has zeros in the <code><a class="el" href="structXMP__DateTime.html" title="The expanded type for a date and time.">XMP_DateTime</a></code> struct for all time fields. A time without a date has zeros for all date fields (year, month, and day).<p>
+<code><a class="el" href="classTXMPUtils.html" title="API for access to the XMP Toolkit utility services.">TXMPUtils</a></code> provides utility functions for manipulating date-time values.<p>
+<dl class="see" compact><dt><b>See also:</b></dt><dd><code><a class="el" href="classTXMPUtils.html#60d33e6ce30286028acca47b2b6e7a0b" title="ConvertToDate() converts a string to a date/time value.">TXMPUtils::ConvertToDate()</a></code>, <code><a class="el" href="classTXMPUtils.html#6146a522a3974b4088d6e8241e9cd223" title="ConvertFromDate() converts a date/time value to a string.">TXMPUtils::ConvertFromDate()</a></code>, <code><a class="el" href="classTXMPUtils.html#9fc7f1771032f59f9020aeda4f91991d" title="CompareDateTime() compares the order of two date/time values.">TXMPUtils::CompareDateTime()</a></code>, <code><a class="el" href="classTXMPUtils.html#61852aaba494c8fbad5a6c0c4caf21f5" title="ConvertToLocalTime() ensures that a time is local.">TXMPUtils::ConvertToLocalTime()</a></code>, <code><a class="el" href="classTXMPUtils.html#bbd4d691c83287ea2fc6b1e33e5858b8" title="ConvertToUTCTime() ensures that a time is UTC.">TXMPUtils::ConvertToUTCTime()</a></code>, <code><a class="el" href="classTXMPUtils.html#c83f0b963ea64d7eee0b481e15a8439c" title="CurrentDateTime() obtains the current date and time.">TXMPUtils::CurrentDateTime()</a></code>, <code><a class="el" href="classTXMPUtils.html#96bcc45febac55f6c49951815b7de2ef" title="SetTimeZone() sets the time zone in a date/time value to the local time zone.">TXMPUtils::SetTimeZone()</a></code> </dd></dl>
+<hr><h2>Member Data Documentation</h2>
+<a class="anchor" name="2786ad8875bd59f07b8dc2b1d09c6f96"></a><!-- doxytag: member="XMP_DateTime::tzSign" ref="2786ad8875bd59f07b8dc2b1d09c6f96" args="" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">XMP_Int32 <a class="el" href="structXMP__DateTime.html#2786ad8875bd59f07b8dc2b1d09c6f96">XMP_DateTime::tzSign</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "sign" of the time zone, <code><a class="el" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b73f41be55491204982acb39c9f6c7ad13" title="UTC time.">kXMP_TimeIsUTC</a></code> (0) means UTC, <code><a class="el" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b7511551ce156d5fd96c26ad464b837801" title="Time zone is west of UTC.">kXMP_TimeWestOfUTC</a></code> (-1) is west, <code><a class="el" href="XMP__Const_8h.html#df764cbdea00d65edcd07bb9953ad2b768851b70cc1d2346fa21bc0b0ae6cfec" title="Time zone is east of UTC.">kXMP_TimeEastOfUTC</a></code> (+1) is east.
+</div>
+</div><p>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="XMP__Const_8h-source.html">XMP_Const.h</a></ul>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/structXMP__PacketInfo-members.html b/docs/API/structXMP__PacketInfo-members.html
new file mode 100644
index 0000000..254bcc8
--- /dev/null
+++ b/docs/API/structXMP__PacketInfo-members.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Member List</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>XMP_PacketInfo Member List</h1>This is the complete list of members for <a class="el" href="structXMP__PacketInfo.html">XMP_PacketInfo</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="structXMP__PacketInfo.html#039ce6665fe8e08d922a46f266799f75">charForm</a></td><td><a class="el" href="structXMP__PacketInfo.html">XMP_PacketInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__PacketInfo.html#6725d8ab8b4eedddaac950d2b1b00a7f">hasWrapper</a></td><td><a class="el" href="structXMP__PacketInfo.html">XMP_PacketInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__PacketInfo.html#f526c582b66e24553f2d4b11eb714a44">length</a></td><td><a class="el" href="structXMP__PacketInfo.html">XMP_PacketInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__PacketInfo.html#20f65fcfd0f3658ab93ff441a9d61d2c">offset</a></td><td><a class="el" href="structXMP__PacketInfo.html">XMP_PacketInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__PacketInfo.html#83ec12161a36451fef05d88cc754104e">pad</a></td><td><a class="el" href="structXMP__PacketInfo.html">XMP_PacketInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__PacketInfo.html#f4f99e6a5b36b05fdf4a519421875256">padSize</a></td><td><a class="el" href="structXMP__PacketInfo.html">XMP_PacketInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__PacketInfo.html#66845c1d5f3f9f36a1543a7322bd7bd1">writeable</a></td><td><a class="el" href="structXMP__PacketInfo.html">XMP_PacketInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__PacketInfo.html#2ae03a1b3d03fa9ebc829105037155a8">XMP_PacketInfo</a>()</td><td><a class="el" href="structXMP__PacketInfo.html">XMP_PacketInfo</a></td><td><code> [inline]</code></td></tr>
+</table></div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/structXMP__PacketInfo.html b/docs/API/structXMP__PacketInfo.html
new file mode 100644
index 0000000..00cdded
--- /dev/null
+++ b/docs/API/structXMP__PacketInfo.html
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: XMP_PacketInfo Struct Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>XMP_PacketInfo Struct Reference</h1><!-- doxytag: class="XMP_PacketInfo" -->XMP packet description.
+<a href="#_details">More...</a>
+<p>
+<code>#include &lt;<a class="el" href="XMP__Const_8h-source.html">XMP_Const.h</a>&gt;</code>
+<p>
+
+<p>
+<a href="structXMP__PacketInfo-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2ae03a1b3d03fa9ebc829105037155a8"></a><!-- doxytag: member="XMP_PacketInfo::XMP_PacketInfo" ref="2ae03a1b3d03fa9ebc829105037155a8" args="()" -->
+&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__PacketInfo.html#2ae03a1b3d03fa9ebc829105037155a8">XMP_PacketInfo</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Default constructor. <br></td></tr>
+<tr><td colspan="2"><br><h2>Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="20f65fcfd0f3658ab93ff441a9d61d2c"></a><!-- doxytag: member="XMP_PacketInfo::offset" ref="20f65fcfd0f3658ab93ff441a9d61d2c" args="" -->
+XMP_Int64&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__PacketInfo.html#20f65fcfd0f3658ab93ff441a9d61d2c">offset</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Packet offset in the file in bytes, -1 if unknown. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f526c582b66e24553f2d4b11eb714a44"></a><!-- doxytag: member="XMP_PacketInfo::length" ref="f526c582b66e24553f2d4b11eb714a44" args="" -->
+XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__PacketInfo.html#f526c582b66e24553f2d4b11eb714a44">length</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Packet length in the file in bytes, -1 if unknown. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f4f99e6a5b36b05fdf4a519421875256"></a><!-- doxytag: member="XMP_PacketInfo::padSize" ref="f4f99e6a5b36b05fdf4a519421875256" args="" -->
+XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__PacketInfo.html#f4f99e6a5b36b05fdf4a519421875256">padSize</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Packet padding size in bytes, zero if unknown. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="039ce6665fe8e08d922a46f266799f75"></a><!-- doxytag: member="XMP_PacketInfo::charForm" ref="039ce6665fe8e08d922a46f266799f75" args="" -->
+XMP_Uns8&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__PacketInfo.html#039ce6665fe8e08d922a46f266799f75">charForm</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Character format using the values <code>kXMP_Char8Bit</code>, <code>kXMP_Char16BitBig</code>, etc. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="66845c1d5f3f9f36a1543a7322bd7bd1"></a><!-- doxytag: member="XMP_PacketInfo::writeable" ref="66845c1d5f3f9f36a1543a7322bd7bd1" args="" -->
+XMP_Bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__PacketInfo.html#66845c1d5f3f9f36a1543a7322bd7bd1">writeable</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">True if there is a packet wrapper and the trailer says writeable by dumb packet scanners. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6725d8ab8b4eedddaac950d2b1b00a7f"></a><!-- doxytag: member="XMP_PacketInfo::hasWrapper" ref="6725d8ab8b4eedddaac950d2b1b00a7f" args="" -->
+XMP_Bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__PacketInfo.html#6725d8ab8b4eedddaac950d2b1b00a7f">hasWrapper</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">True if there is a packet wrapper, the "&lt;?xpacket...&gt;" XML processing instructions. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="83ec12161a36451fef05d88cc754104e"></a><!-- doxytag: member="XMP_PacketInfo::pad" ref="83ec12161a36451fef05d88cc754104e" args="" -->
+XMP_Uns8&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__PacketInfo.html#83ec12161a36451fef05d88cc754104e">pad</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Padding to make the struct's size be a multiple 4. <br></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+XMP packet description. <hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="XMP__Const_8h-source.html">XMP_Const.h</a></ul>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/structXMP__ThumbnailInfo-members.html b/docs/API/structXMP__ThumbnailInfo-members.html
new file mode 100644
index 0000000..4757a41
--- /dev/null
+++ b/docs/API/structXMP__ThumbnailInfo-members.html
@@ -0,0 +1,80 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Member List</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>XMP_ThumbnailInfo Member List</h1>This is the complete list of members for <a class="el" href="structXMP__ThumbnailInfo.html">XMP_ThumbnailInfo</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="structXMP__ThumbnailInfo.html#9bd0982c79d43f96a253486e79c453df">fileFormat</a></td><td><a class="el" href="structXMP__ThumbnailInfo.html">XMP_ThumbnailInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__ThumbnailInfo.html#ffcd0f874cb6c5faaf8d595956cabf24">fullOrientation</a></td><td><a class="el" href="structXMP__ThumbnailInfo.html">XMP_ThumbnailInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__ThumbnailInfo.html#89f158688c90cef1df24bbfb7770a881">fullWidth</a></td><td><a class="el" href="structXMP__ThumbnailInfo.html">XMP_ThumbnailInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__ThumbnailInfo.html#6ccab4dea65d89c7ab141b59ac055955">pad1</a></td><td><a class="el" href="structXMP__ThumbnailInfo.html">XMP_ThumbnailInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__ThumbnailInfo.html#f57b103c5a78c636afc3a391f28a5906">tnailFormat</a></td><td><a class="el" href="structXMP__ThumbnailInfo.html">XMP_ThumbnailInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__ThumbnailInfo.html#683c74dc7168f0046204ea153de3c179">tnailImage</a></td><td><a class="el" href="structXMP__ThumbnailInfo.html">XMP_ThumbnailInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__ThumbnailInfo.html#77072568158233d0c44dd4c8636366ff">tnailSize</a></td><td><a class="el" href="structXMP__ThumbnailInfo.html">XMP_ThumbnailInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__ThumbnailInfo.html#17ac245bb300328031f998ba13f0169b">tnailWidth</a></td><td><a class="el" href="structXMP__ThumbnailInfo.html">XMP_ThumbnailInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__ThumbnailInfo.html#20b6acef9b825defe492b3d120532828">XMP_ThumbnailInfo</a>()</td><td><a class="el" href="structXMP__ThumbnailInfo.html">XMP_ThumbnailInfo</a></td><td><code> [inline]</code></td></tr>
+</table></div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/structXMP__ThumbnailInfo.html b/docs/API/structXMP__ThumbnailInfo.html
new file mode 100644
index 0000000..7a93043
--- /dev/null
+++ b/docs/API/structXMP__ThumbnailInfo.html
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: XMP_ThumbnailInfo Struct Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>XMP_ThumbnailInfo Struct Reference</h1><!-- doxytag: class="XMP_ThumbnailInfo" -->Thumbnail descriptor.
+<a href="#_details">More...</a>
+<p>
+<code>#include &lt;<a class="el" href="XMP__Const_8h-source.html">XMP_Const.h</a>&gt;</code>
+<p>
+
+<p>
+<a href="structXMP__ThumbnailInfo-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="20b6acef9b825defe492b3d120532828"></a><!-- doxytag: member="XMP_ThumbnailInfo::XMP_ThumbnailInfo" ref="20b6acef9b825defe492b3d120532828" args="()" -->
+&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__ThumbnailInfo.html#20b6acef9b825defe492b3d120532828">XMP_ThumbnailInfo</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Default constructor. <br></td></tr>
+<tr><td colspan="2"><br><h2>Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9bd0982c79d43f96a253486e79c453df"></a><!-- doxytag: member="XMP_ThumbnailInfo::fileFormat" ref="9bd0982c79d43f96a253486e79c453df" args="" -->
+<a class="el" href="XMP__Const_8h.html#300d9a9189cb4ddb6970d05389f5c28e">XMP_FileFormat</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__ThumbnailInfo.html#9bd0982c79d43f96a253486e79c453df">fileFormat</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The format of the containing file. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="89f158688c90cef1df24bbfb7770a881"></a><!-- doxytag: member="XMP_ThumbnailInfo::fullWidth" ref="89f158688c90cef1df24bbfb7770a881" args="" -->
+XMP_Uns32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__ThumbnailInfo.html#89f158688c90cef1df24bbfb7770a881">fullWidth</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Full image size in pixels. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17ac245bb300328031f998ba13f0169b"></a><!-- doxytag: member="XMP_ThumbnailInfo::tnailWidth" ref="17ac245bb300328031f998ba13f0169b" args="" -->
+XMP_Uns32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__ThumbnailInfo.html#17ac245bb300328031f998ba13f0169b">tnailWidth</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Thumbnail image size in pixels. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ffcd0f874cb6c5faaf8d595956cabf24"></a><!-- doxytag: member="XMP_ThumbnailInfo::fullOrientation" ref="ffcd0f874cb6c5faaf8d595956cabf24" args="" -->
+XMP_Uns16&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__ThumbnailInfo.html#ffcd0f874cb6c5faaf8d595956cabf24">fullOrientation</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Orientation of full image and thumbnail, as defined by Exif for tag 274. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="683c74dc7168f0046204ea153de3c179"></a><!-- doxytag: member="XMP_ThumbnailInfo::tnailImage" ref="683c74dc7168f0046204ea153de3c179" args="" -->
+const XMP_Uns8 *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__ThumbnailInfo.html#683c74dc7168f0046204ea153de3c179">tnailImage</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Raw image data from the host file, valid for life of the owning <code>XMPFiles</code> object. Do not modify! <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="77072568158233d0c44dd4c8636366ff"></a><!-- doxytag: member="XMP_ThumbnailInfo::tnailSize" ref="77072568158233d0c44dd4c8636366ff" args="" -->
+XMP_Uns32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__ThumbnailInfo.html#77072568158233d0c44dd4c8636366ff">tnailSize</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The size in bytes of the thumbnail image data. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f57b103c5a78c636afc3a391f28a5906"></a><!-- doxytag: member="XMP_ThumbnailInfo::tnailFormat" ref="f57b103c5a78c636afc3a391f28a5906" args="" -->
+XMP_Uns8&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__ThumbnailInfo.html#f57b103c5a78c636afc3a391f28a5906">tnailFormat</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The format of the thumbnail image data. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6ccab4dea65d89c7ab141b59ac055955"></a><!-- doxytag: member="XMP_ThumbnailInfo::pad1" ref="6ccab4dea65d89c7ab141b59ac055955" args="" -->
+XMP_Uns8&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__ThumbnailInfo.html#6ccab4dea65d89c7ab141b59ac055955">pad1</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Padding to make the struct's size be a multiple 4. <br></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+Thumbnail descriptor. <hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="XMP__Const_8h-source.html">XMP_Const.h</a></ul>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/structXMP__VersionInfo-members.html b/docs/API/structXMP__VersionInfo-members.html
new file mode 100644
index 0000000..2c64127
--- /dev/null
+++ b/docs/API/structXMP__VersionInfo-members.html
@@ -0,0 +1,78 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: Member List</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>XMP_VersionInfo Member List</h1>This is the complete list of members for <a class="el" href="structXMP__VersionInfo.html">XMP_VersionInfo</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="structXMP__VersionInfo.html#0e20a6bf10da4c17bdfc8027f1586ffc">build</a></td><td><a class="el" href="structXMP__VersionInfo.html">XMP_VersionInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__VersionInfo.html#d018f35b382046ca77b1252bafa93f74">flags</a></td><td><a class="el" href="structXMP__VersionInfo.html">XMP_VersionInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__VersionInfo.html#f1643d86f32f5a5a275dc9c5ba843018">isDebug</a></td><td><a class="el" href="structXMP__VersionInfo.html">XMP_VersionInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__VersionInfo.html#7edfa1613a58a248fd15267008bd8afb">major</a></td><td><a class="el" href="structXMP__VersionInfo.html">XMP_VersionInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__VersionInfo.html#19654242b92bffd7517e92882850e834">message</a></td><td><a class="el" href="structXMP__VersionInfo.html">XMP_VersionInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__VersionInfo.html#4b448a8253e26a37d2df35e04ac25d28">micro</a></td><td><a class="el" href="structXMP__VersionInfo.html">XMP_VersionInfo</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structXMP__VersionInfo.html#f5b56598e15febd742b431dadae7c317">minor</a></td><td><a class="el" href="structXMP__VersionInfo.html">XMP_VersionInfo</a></td><td></td></tr>
+</table></div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/API/structXMP__VersionInfo.html b/docs/API/structXMP__VersionInfo.html
new file mode 100644
index 0000000..ac76c56
--- /dev/null
+++ b/docs/API/structXMP__VersionInfo.html
@@ -0,0 +1,112 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+<title>XMP-Toolkit-SDK-4.4.2: XMP_VersionInfo Struct Reference</title>
+<link href="xmp.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<img src="xmp_tagline_small.jpg" width="125" height="50" border="0"><p>
+<!-- Generated by Doxygen 1.5.6 -->
+<script type="text/javascript">
+<!--
+function changeDisplayState (e){
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+}
+function initDynSections(){
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=changeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ button.src='closed.gif';
+ section.id='dynsection'+sectionCounter;
+ section.style.display='none';
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
+window.onload = initDynSections;
+-->
+</script>
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+<h1>XMP_VersionInfo Struct Reference</h1><!-- doxytag: class="XMP_VersionInfo" -->XMP Toolkit version information.
+<a href="#_details">More...</a>
+<p>
+<code>#include &lt;<a class="el" href="XMP__Const_8h-source.html">XMP_Const.h</a>&gt;</code>
+<p>
+
+<p>
+<a href="structXMP__VersionInfo-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7edfa1613a58a248fd15267008bd8afb"></a><!-- doxytag: member="XMP_VersionInfo::major" ref="7edfa1613a58a248fd15267008bd8afb" args="" -->
+XMP_Uns8&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__VersionInfo.html#7edfa1613a58a248fd15267008bd8afb">major</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The primary release number, the "1" in version "1.2.3". <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f5b56598e15febd742b431dadae7c317"></a><!-- doxytag: member="XMP_VersionInfo::minor" ref="f5b56598e15febd742b431dadae7c317" args="" -->
+XMP_Uns8&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__VersionInfo.html#f5b56598e15febd742b431dadae7c317">minor</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The secondary release number, the "2" in version "1.2.3". <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b448a8253e26a37d2df35e04ac25d28"></a><!-- doxytag: member="XMP_VersionInfo::micro" ref="4b448a8253e26a37d2df35e04ac25d28" args="" -->
+XMP_Uns8&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__VersionInfo.html#4b448a8253e26a37d2df35e04ac25d28">micro</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The tertiary release number, the "3" in version "1.2.3". <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f1643d86f32f5a5a275dc9c5ba843018"></a><!-- doxytag: member="XMP_VersionInfo::isDebug" ref="f1643d86f32f5a5a275dc9c5ba843018" args="" -->
+XMP_Bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__VersionInfo.html#f1643d86f32f5a5a275dc9c5ba843018">isDebug</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A 0/1 boolean value, true if this is a debug build. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e20a6bf10da4c17bdfc8027f1586ffc"></a><!-- doxytag: member="XMP_VersionInfo::build" ref="0e20a6bf10da4c17bdfc8027f1586ffc" args="" -->
+XMP_Uns32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__VersionInfo.html#0e20a6bf10da4c17bdfc8027f1586ffc">build</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A rolling build number, monotonically increasing in a release. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d018f35b382046ca77b1252bafa93f74"></a><!-- doxytag: member="XMP_VersionInfo::flags" ref="d018f35b382046ca77b1252bafa93f74" args="" -->
+XMP_Uns32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__VersionInfo.html#d018f35b382046ca77b1252bafa93f74">flags</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Individual feature implementation flags. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="19654242b92bffd7517e92882850e834"></a><!-- doxytag: member="XMP_VersionInfo::message" ref="19654242b92bffd7517e92882850e834" args="" -->
+<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__VersionInfo.html#19654242b92bffd7517e92882850e834">message</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A comprehensive version information string. <br></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+XMP Toolkit version information. <hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="XMP__Const_8h-source.html">XMP_Const.h</a></ul>
+</div>
+<hr size="1"><address style="text-align: right;"><small>
+XMP-Toolkit-SDK-4.4.2 documentation generated by&nbsp;<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.6</small></address>
+</body>
+</html>
diff --git a/docs/XMPToolkit/tab_b.gif b/docs/API/tab_b.gif
index 0d62348..0d62348 100644
--- a/docs/XMPToolkit/tab_b.gif
+++ b/docs/API/tab_b.gif
Binary files differ
diff --git a/docs/XMPToolkit/tab_l.gif b/docs/API/tab_l.gif
index 9b1e633..9b1e633 100644
--- a/docs/XMPToolkit/tab_l.gif
+++ b/docs/API/tab_l.gif
Binary files differ
diff --git a/docs/XMPToolkit/tab_r.gif b/docs/API/tab_r.gif
index ce9dd9f..ce9dd9f 100644
--- a/docs/XMPToolkit/tab_r.gif
+++ b/docs/API/tab_r.gif
Binary files differ
diff --git a/docs/XMPToolkit/tabs.css b/docs/API/tabs.css
index a61552a..95f00a9 100644
--- a/docs/XMPToolkit/tabs.css
+++ b/docs/API/tabs.css
@@ -82,19 +82,19 @@ DIV.tabs A:hover SPAN
background-position: 0% -150px;
}
-DIV.tabs LI#current A
+DIV.tabs LI.current A
{
background-position: 100% -150px;
border-width : 0px;
}
-DIV.tabs LI#current SPAN
+DIV.tabs LI.current SPAN
{
background-position: 0% -150px;
padding-bottom : 6px;
}
-DIV.nav
+DIV.navpath
{
background : none;
border : none;
diff --git a/docs/XMPToolkit/doxygen.css b/docs/API/xmp.css
index c7db1a8..22c4843 100644
--- a/docs/XMPToolkit/doxygen.css
+++ b/docs/API/xmp.css
@@ -2,19 +2,21 @@ BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV {
font-family: Geneva, Arial, Helvetica, sans-serif;
}
BODY,TD {
- font-size: 90%;
+ font-size: 90%;
}
H1 {
text-align: center;
- font-size: 160%;
+ font-size: 160%;
}
H2 {
- font-size: 120%;
+ font-size: 120%;
}
H3 {
- font-size: 100%;
+ font-size: 100%;
+}
+CAPTION {
+ font-weight: bold
}
-CAPTION { font-weight: bold }
DIV.qindex {
width: 100%;
background-color: #e8eef2;
@@ -24,7 +26,7 @@ DIV.qindex {
padding: 2px;
line-height: 140%;
}
-DIV.nav {
+DIV.navpath {
width: 100%;
background-color: #e8eef2;
border: 1px solid #84b0c7;
@@ -70,15 +72,43 @@ A.qindexHL:hover {
background-color: #6666cc;
color: #ffffff;
}
-A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff }
-A.el { text-decoration: none; font-weight: bold }
-A.elRef { font-weight: bold }
-A.code:link { text-decoration: none; font-weight: normal; color: #0000FF}
-A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF}
-A.codeRef:link { font-weight: normal; color: #0000FF}
-A.codeRef:visited { font-weight: normal; color: #0000FF}
-A:hover { text-decoration: none; background-color: #f2f2ff }
-DL.el { margin-left: -1cm }
+A.qindexHL:visited {
+ text-decoration: none;
+ background-color: #6666cc;
+ color: #ffffff
+}
+A.el {
+ text-decoration: none;
+ font-weight: bold
+}
+A.elRef {
+ font-weight: bold
+}
+A.code:link {
+ text-decoration: none;
+ font-weight: normal;
+ color: #0000FF
+}
+A.code:visited {
+ text-decoration: none;
+ font-weight: normal;
+ color: #0000FF
+}
+A.codeRef:link {
+ font-weight: normal;
+ color: #0000FF
+}
+A.codeRef:visited {
+ font-weight: normal;
+ color: #0000FF
+}
+A:hover {
+ text-decoration: none;
+ background-color: #f2f2ff
+}
+DL.el {
+ margin-left: -1cm
+}
.fragment {
font-family: monospace, fixed;
font-size: 95%;
@@ -95,7 +125,13 @@ PRE.fragment {
padding-top: 4px;
padding-bottom: 4px;
}
-DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px }
+DIV.ah {
+ background-color: black;
+ font-weight: bold;
+ color: #ffffff;
+ margin-bottom: 3px;
+ margin-top: 3px
+}
DIV.groupHeader {
margin-left: 16px;
@@ -103,7 +139,11 @@ DIV.groupHeader {
margin-bottom: 6px;
font-weight: bold;
}
-DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% }
+DIV.groupText {
+ margin-left: 16px;
+ font-style: italic;
+ font-size: 90%
+}
BODY {
background: white;
color: black;
@@ -137,11 +177,16 @@ TD.indexvalue {
border: 1px solid #CCCCCC;
}
TR.memlist {
- background-color: #f0f0f0;
+ background-color: #f0f0f0;
+}
+P.formulaDsp {
+ text-align: center;
+}
+IMG.formulaDsp {
+}
+IMG.formulaInl {
+ vertical-align: middle;
}
-P.formulaDsp { text-align: center; }
-IMG.formulaDsp { }
-IMG.formulaInl { vertical-align: middle; }
SPAN.keyword { color: #008000 }
SPAN.keywordtype { color: #604020 }
SPAN.keywordflow { color: #e08000 }
@@ -149,8 +194,13 @@ SPAN.comment { color: #800000 }
SPAN.preprocessor { color: #806020 }
SPAN.stringliteral { color: #002080 }
SPAN.charliteral { color: #008080 }
+SPAN.vhdldigit { color: #ff00ff }
+SPAN.vhdlchar { color: #000000 }
+SPAN.vhdlkeyword { color: #700070 }
+SPAN.vhdllogic { color: #ff0000 }
+
.mdescLeft {
- padding: 0px 8px 4px 8px;
+ padding: 0px 8px 4px 8px;
font-size: 80%;
font-style: italic;
background-color: #FAFAFA;
@@ -161,7 +211,7 @@ SPAN.charliteral { color: #008080 }
margin: 0px;
}
.mdescRight {
- padding: 0px 8px 4px 8px;
+ padding: 0px 8px 4px 8px;
font-size: 80%;
font-style: italic;
background-color: #FAFAFA;
@@ -258,23 +308,26 @@ SPAN.charliteral { color: #008080 }
border-right-style: none;
border-bottom-style: none;
border-left-style: none;
- color: #606060;
+ color: #606060;
background-color: #FAFAFA;
font-size: 80%;
}
-.search { color: #003399;
- font-weight: bold;
+.search {
+ color: #003399;
+ font-weight: bold;
}
FORM.search {
- margin-bottom: 0px;
- margin-top: 0px;
+ margin-bottom: 0px;
+ margin-top: 0px;
}
-INPUT.search { font-size: 75%;
- color: #000080;
- font-weight: normal;
- background-color: #e8eef2;
+INPUT.search {
+ font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #e8eef2;
}
-TD.tiny { font-size: 75%;
+TD.tiny {
+ font-size: 75%;
}
a {
color: #1A41A8;
@@ -282,66 +335,70 @@ a {
a:visited {
color: #2A3798;
}
-.dirtab { padding: 4px;
- border-collapse: collapse;
- border: 1px solid #84b0c7;
+.dirtab {
+ padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid #84b0c7;
}
-TH.dirtab { background: #e8eef2;
- font-weight: bold;
+TH.dirtab {
+ background: #e8eef2;
+ font-weight: bold;
}
-HR { height: 1px;
- border: none;
- border-top: 1px solid black;
+HR {
+ height: 1px;
+ border: none;
+ border-top: 1px solid black;
}
/* Style for detailed member documentation */
.memtemplate {
- font-size: 80%;
- color: #606060;
- font-weight: normal;
+ font-size: 80%;
+ color: #606060;
+ font-weight: normal;
+ margin-left: 3px;
}
.memnav {
- background-color: #e8eef2;
- border: 1px solid #84b0c7;
- text-align: center;
- margin: 2px;
- margin-right: 15px;
- padding: 2px;
+ background-color: #e8eef2;
+ border: 1px solid #84b0c7;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
}
.memitem {
- padding: 4px;
- background-color: #eef3f5;
- border-width: 1px;
- border-style: solid;
- border-color: #dedeee;
- -moz-border-radius: 8px 8px 8px 8px;
+ padding: 4px;
+ background-color: #eef3f5;
+ border-width: 1px;
+ border-style: solid;
+ border-color: #dedeee;
+ -moz-border-radius: 8px 8px 8px 8px;
}
.memname {
- white-space: nowrap;
- font-weight: bold;
+ white-space: nowrap;
+ font-weight: bold;
}
.memdoc{
- padding-left: 10px;
+ padding-left: 10px;
}
.memproto {
- background-color: #d5e1e8;
- width: 100%;
- border-width: 1px;
- border-style: solid;
- border-color: #84b0c7;
- font-weight: bold;
- -moz-border-radius: 8px 8px 8px 8px;
+ background-color: #d5e1e8;
+ width: 100%;
+ border-width: 1px;
+ border-style: solid;
+ border-color: #84b0c7;
+ font-weight: bold;
+ -moz-border-radius: 8px 8px 8px 8px;
}
.paramkey {
- text-align: right;
+ text-align: right;
}
.paramtype {
- white-space: nowrap;
+ white-space: nowrap;
}
.paramname {
- color: #602020;
- font-style: italic;
- white-space: nowrap;
+ color: #602020;
+ font-style: italic;
+ white-space: nowrap;
}
/* End Styling for detailed member documentation */
@@ -350,9 +407,67 @@ HR { height: 1px;
font-family: sans-serif;
margin:0.5em;
}
-.directory { font-size: 9pt; font-weight: bold; }
-.directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; }
-.directory > h3 { margin-top: 0; }
-.directory p { margin: 0px; white-space: nowrap; }
-.directory div { display: none; margin: 0px; }
-.directory img { vertical-align: -30%; }
+/* these are for tree view when used as main index */
+.directory {
+ font-size: 9pt;
+ font-weight: bold;
+}
+.directory h3 {
+ margin: 0px;
+ margin-top: 1em;
+ font-size: 11pt;
+}
+
+/* The following two styles can be used to replace the root node title */
+/* with an image of your choice. Simply uncomment the next two styles, */
+/* specify the name of your image and be sure to set 'height' to the */
+/* proper pixel height of your image. */
+
+/* .directory h3.swap { */
+/* height: 61px; */
+/* background-repeat: no-repeat; */
+/* background-image: url("yourimage.gif"); */
+/* } */
+/* .directory h3.swap span { */
+/* display: none; */
+/* } */
+
+.directory > h3 {
+ margin-top: 0;
+}
+.directory p {
+ margin: 0px;
+ white-space: nowrap;
+}
+.directory div {
+ display: none;
+ margin: 0px;
+}
+.directory img {
+ vertical-align: -30%;
+}
+/* these are for tree view when not used as main index */
+.directory-alt {
+ font-size: 100%;
+ font-weight: bold;
+}
+.directory-alt h3 {
+ margin: 0px;
+ margin-top: 1em;
+ font-size: 11pt;
+}
+.directory-alt > h3 {
+ margin-top: 0;
+}
+.directory-alt p {
+ margin: 0px;
+ white-space: nowrap;
+}
+.directory-alt div {
+ display: none;
+ margin: 0px;
+}
+.directory-alt img {
+ vertical-align: -30%;
+}
+
diff --git a/docs/API/xmp_tagline_small.jpg b/docs/API/xmp_tagline_small.jpg
new file mode 100755
index 0000000..94ad334
--- /dev/null
+++ b/docs/API/xmp_tagline_small.jpg
Binary files differ
diff --git a/docs/XMP-SDK-Overview.pdf b/docs/XMP-SDK-Overview.pdf
deleted file mode 100644
index 9ad8b6d..0000000
--- a/docs/XMP-SDK-Overview.pdf
+++ /dev/null
Binary files differ
diff --git a/docs/XMP-Specification.pdf b/docs/XMP-Specification.pdf
deleted file mode 100644
index c66f122..0000000
--- a/docs/XMP-Specification.pdf
+++ /dev/null
Binary files differ
diff --git a/docs/XMPProgrammersGuide.pdf b/docs/XMPProgrammersGuide.pdf
new file mode 100644
index 0000000..78ea790
--- /dev/null
+++ b/docs/XMPProgrammersGuide.pdf
Binary files differ
diff --git a/docs/XMPSpecificationPart1.pdf b/docs/XMPSpecificationPart1.pdf
new file mode 100644
index 0000000..b1c5663
--- /dev/null
+++ b/docs/XMPSpecificationPart1.pdf
Binary files differ
diff --git a/docs/XMPSpecificationPart2.pdf b/docs/XMPSpecificationPart2.pdf
new file mode 100644
index 0000000..8b4a245
--- /dev/null
+++ b/docs/XMPSpecificationPart2.pdf
Binary files differ
diff --git a/docs/XMPSpecificationPart3.pdf b/docs/XMPSpecificationPart3.pdf
new file mode 100644
index 0000000..9af5ff6
--- /dev/null
+++ b/docs/XMPSpecificationPart3.pdf
Binary files differ
diff --git a/docs/XMPToolkit/TXMPFiles_8hpp-source.html b/docs/XMPToolkit/TXMPFiles_8hpp-source.html
deleted file mode 100644
index aa8571e..0000000
--- a/docs/XMPToolkit/TXMPFiles_8hpp-source.html
+++ /dev/null
@@ -1,162 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: TXMPFiles.hpp Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>TXMPFiles.hpp</h1><a href="TXMPFiles_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef __TXMPFiles_hpp__</span>
-<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define __TXMPFiles_hpp__ 1</span>
-<a name="l00003"></a>00003 <span class="preprocessor"></span>
-<a name="l00004"></a>00004 <span class="preprocessor">#if ( ! __XMP_hpp__ )</span>
-<a name="l00005"></a>00005 <span class="preprocessor"></span><span class="preprocessor"> #error "Do not directly include, use XMP.hpp"</span>
-<a name="l00006"></a>00006 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00007"></a>00007 <span class="preprocessor"></span>
-<a name="l00008"></a>00008 <span class="comment">// =================================================================================================</span>
-<a name="l00009"></a>00009 <span class="comment">// ADOBE SYSTEMS INCORPORATED</span>
-<a name="l00010"></a>00010 <span class="comment">// Copyright 2002-2007 Adobe Systems Incorporated</span>
-<a name="l00011"></a>00011 <span class="comment">// All Rights Reserved</span>
-<a name="l00012"></a>00012 <span class="comment">//</span>
-<a name="l00013"></a>00013 <span class="comment">// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms</span>
-<a name="l00014"></a>00014 <span class="comment">// of the Adobe license agreement accompanying it.</span>
-<a name="l00015"></a>00015 <span class="comment">// =================================================================================================</span>
-<a name="l00016"></a>00016
-<a name="l00017"></a>00017 <span class="comment">// ================================================================================================</span>
-<a name="l00033"></a>00033 <span class="comment"></span><span class="comment">// ================================================================================================</span>
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="comment">// ================================================================================================</span>
-<a name="l00060"></a>00060 <span class="comment"></span><span class="comment">// ================================================================================================</span>
-<a name="l00061"></a>00061
-<a name="l00062"></a>00062 <span class="keyword">template</span> &lt;<span class="keyword">class</span> tStringObj&gt;
-<a name="l00063"></a><a class="code" href="classTXMPFiles.html">00063</a> <span class="keyword">class </span><a class="code" href="classTXMPFiles.html">TXMPFiles</a> {
-<a name="l00064"></a>00064
-<a name="l00065"></a>00065 <span class="keyword">public</span>:
-<a name="l00066"></a>00066
-<a name="l00067"></a>00067 <span class="comment">// ============================================================================================</span>
-<a name="l00071"></a>00071 <span class="comment"></span>
-<a name="l00072"></a>00072 <span class="keyword">static</span> <span class="keywordtype">void</span> GetVersionInfo ( XMP_VersionInfo * versionInfo );
-<a name="l00073"></a>00073
-<a name="l00076"></a>00076
-<a name="l00077"></a>00077 <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#0874bbbf41c9490abfb613bfe297327d">Initialize</a>();
-<a name="l00078"></a>00078 <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#0874bbbf41c9490abfb613bfe297327d">Initialize</a> ( <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options );
-<a name="l00079"></a>00079
-<a name="l00082"></a>00082
-<a name="l00083"></a>00083 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classTXMPFiles.html#1e8de80c252b60b332dc4bc524139fd8">Terminate</a>();
-<a name="l00084"></a>00084
-<a name="l00086"></a>00086
-<a name="l00087"></a>00087 <span class="comment">// ============================================================================================</span>
-<a name="l00092"></a>00092 <span class="comment"></span>
-<a name="l00094"></a>00094
-<a name="l00095"></a>00095 <a class="code" href="classTXMPFiles.html#14f01e38454178578fd25fff6024fd54">TXMPFiles</a>();
-<a name="l00096"></a>00096 <span class="keyword">virtual</span> ~<a class="code" href="classTXMPFiles.html">TXMPFiles</a>() <span class="keywordflow">throw</span>();
-<a name="l00097"></a>00097
-<a name="l00100"></a>00100
-<a name="l00101"></a>00101 <a class="code" href="classTXMPFiles.html#14f01e38454178578fd25fff6024fd54">TXMPFiles</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> filePath,
-<a name="l00102"></a>00102 XMP_FileFormat format = kXMP_UnknownFile,
-<a name="l00103"></a>00103 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> openFlags = 0 );
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 <a class="code" href="classTXMPFiles.html#14f01e38454178578fd25fff6024fd54">TXMPFiles</a> ( <span class="keyword">const</span> tStringObj &amp; filePath,
-<a name="l00106"></a>00106 XMP_FileFormat format = kXMP_UnknownFile,
-<a name="l00107"></a>00107 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> openFlags = 0 );
-<a name="l00108"></a>00108
-<a name="l00111"></a>00111
-<a name="l00112"></a>00112 <a class="code" href="classTXMPFiles.html#14f01e38454178578fd25fff6024fd54">TXMPFiles</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPFiles.html">TXMPFiles&lt;tStringObj&gt;</a> &amp; original );
-<a name="l00113"></a>00113
-<a name="l00114"></a>00114 <span class="keywordtype">void</span> operator= ( <span class="keyword">const</span> <a class="code" href="classTXMPFiles.html">TXMPFiles&lt;tStringObj&gt;</a> &amp; rhs );
-<a name="l00115"></a>00115
-<a name="l00119"></a>00119
-<a name="l00120"></a>00120 <a class="code" href="classTXMPFiles.html#14f01e38454178578fd25fff6024fd54">TXMPFiles</a> ( XMPFilesRef xmpFilesObj );
-<a name="l00121"></a>00121
-<a name="l00122"></a>00122 XMPFilesRef GetInternalRef();
-<a name="l00123"></a>00123
-<a name="l00125"></a>00125
-<a name="l00126"></a>00126 <span class="comment">// ============================================================================================</span>
-<a name="l00129"></a>00129 <span class="comment"></span>
-<a name="l00130"></a>00130 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00158"></a>00158 <span class="comment"></span>
-<a name="l00159"></a>00159 <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#6ac78e3c7286ca8dcb41eaa007aa00e8">GetFormatInfo</a> ( XMP_FileFormat format,
-<a name="l00160"></a>00160 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * handlerFlags = 0 );
-<a name="l00161"></a>00161
-<a name="l00163"></a>00163
-<a name="l00164"></a>00164 <span class="comment">// ============================================================================================</span>
-<a name="l00167"></a>00167 <span class="comment"></span>
-<a name="l00168"></a>00168 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00223"></a>00223 <span class="comment"></span>
-<a name="l00224"></a>00224 <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb">OpenFile</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> filePath,
-<a name="l00225"></a>00225 XMP_FileFormat format = kXMP_UnknownFile,
-<a name="l00226"></a>00226 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> openFlags = 0 );
-<a name="l00227"></a>00227
-<a name="l00228"></a>00228 <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb">OpenFile</a> ( <span class="keyword">const</span> tStringObj &amp; filePath,
-<a name="l00229"></a>00229 XMP_FileFormat format = kXMP_UnknownFile,
-<a name="l00230"></a>00230 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> openFlags = 0 );
-<a name="l00231"></a>00231
-<a name="l00232"></a>00232 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00243"></a>00243 <span class="comment"></span>
-<a name="l00244"></a>00244 <span class="keywordtype">void</span> <a class="code" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927">CloseFile</a> ( <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> closeFlags = 0 );
-<a name="l00245"></a>00245
-<a name="l00246"></a>00246 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00260"></a>00260 <span class="comment"></span>
-<a name="l00261"></a>00261 <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#f9931d081cb19f98c81e41786030765b">GetFileInfo</a> ( tStringObj * filePath = 0,
-<a name="l00262"></a>00262 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * openFlags = 0,
-<a name="l00263"></a>00263 XMP_FileFormat * format = 0,
-<a name="l00264"></a>00264 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * handlerFlags = 0 );
-<a name="l00265"></a>00265
-<a name="l00266"></a>00266 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00274"></a>00274 <span class="comment"></span>
-<a name="l00275"></a>00275 <span class="keywordtype">void</span> <a class="code" href="classTXMPFiles.html#7b86c130fdbd54b5ac158ec3fee93777">SetAbortProc</a> ( XMP_AbortProc abortProc,
-<a name="l00276"></a>00276 <span class="keywordtype">void</span> * abortArg );
-<a name="l00277"></a>00277
-<a name="l00279"></a>00279
-<a name="l00280"></a>00280 <span class="comment">// ============================================================================================</span>
-<a name="l00283"></a>00283 <span class="comment"></span>
-<a name="l00284"></a>00284 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00313"></a>00313 <span class="comment"></span>
-<a name="l00314"></a>00314 <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3">GetXMP</a> ( SXMPMeta * xmpObj = 0,
-<a name="l00315"></a>00315 tStringObj * xmpPacket = 0,
-<a name="l00316"></a>00316 XMP_PacketInfo * packetInfo = 0 );
-<a name="l00317"></a>00317
-<a name="l00318"></a>00318 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00347"></a>00347 <span class="comment"></span>
-<a name="l00348"></a>00348 <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#4ea1eda39f803322e10b2a554ef8ab06">GetThumbnail</a> ( XMP_ThumbnailInfo * tnailInfo );
-<a name="l00349"></a>00349
-<a name="l00350"></a>00350 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00357"></a>00357 <span class="comment"></span>
-<a name="l00358"></a>00358 <span class="keywordtype">void</span> <a class="code" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a">PutXMP</a> ( <span class="keyword">const</span> SXMPMeta &amp; xmpObj );
-<a name="l00359"></a>00359
-<a name="l00360"></a>00360 <span class="keywordtype">void</span> <a class="code" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a">PutXMP</a> ( <span class="keyword">const</span> tStringObj &amp; xmpPacket );
-<a name="l00361"></a>00361
-<a name="l00362"></a>00362 <span class="keywordtype">void</span> <a class="code" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a">PutXMP</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> xmpPacket,
-<a name="l00363"></a>00363 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> xmpLength = kXMP_UseNullTermination );
-<a name="l00364"></a>00364
-<a name="l00365"></a>00365 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00399"></a>00399 <span class="comment"></span>
-<a name="l00400"></a>00400 <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6">CanPutXMP</a> ( <span class="keyword">const</span> SXMPMeta &amp; xmpObj );
-<a name="l00401"></a>00401
-<a name="l00402"></a>00402 <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6">CanPutXMP</a> ( <span class="keyword">const</span> tStringObj &amp; xmpPacket );
-<a name="l00403"></a>00403
-<a name="l00404"></a>00404 <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6">CanPutXMP</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> xmpPacket,
-<a name="l00405"></a>00405 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> xmpLength = kXMP_UseNullTermination );
-<a name="l00406"></a>00406
-<a name="l00408"></a>00408
-<a name="l00409"></a>00409 <span class="comment">// =============================================================================================</span>
-<a name="l00410"></a>00410
-<a name="l00411"></a>00411 <span class="keyword">private</span>:
-<a name="l00412"></a>00412 XMPFilesRef xmpFilesRef;
-<a name="l00413"></a>00413
-<a name="l00414"></a>00414 }; <span class="comment">// class TXMPFiles</span>
-<a name="l00415"></a>00415
-<a name="l00416"></a>00416 <span class="comment">// =================================================================================================</span>
-<a name="l00417"></a>00417
-<a name="l00418"></a>00418 <span class="preprocessor">#endif // __TXMPFiles_hpp__</span>
-</pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:57 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/TXMPFiles_8hpp.html b/docs/XMPToolkit/TXMPFiles_8hpp.html
deleted file mode 100644
index 48e78dc..0000000
--- a/docs/XMPToolkit/TXMPFiles_8hpp.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: TXMPFiles.hpp File Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>TXMPFiles.hpp File Reference</h1>API for access to the "main" metadata in a file. <a href="#_details">More...</a>
-<p>
-
-<p>
-<a href="TXMPFiles_8hpp-source.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">API for access to the "main" metadata in a file. <a href="classTXMPFiles.html#_details">More...</a><br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-API for access to the "main" metadata in a file.
-<p>
-<code><a class="el" href="classTXMPFiles.html">TXMPFiles</a></code> provides the API for the Adobe XMP Toolkit's File Handler component. This provides convenient access to the main, or document level, XMP for a file. The File Handler supports file I/O, the XMP Toolkit Core supports manipulation of the XMP properties. The File Handler is intended to eventually have smart, efficient support for all file formats for which the means to embed XMP is defined in the XMP Specification. Where possible this support will allow injection of XMP where none currently exists, expansion of XMP without regard to existing padding, and reconciliation of the XMP and other legacy forms of metadata.<p>
-<code><a class="el" href="classTXMPFiles.html">TXMPFiles</a></code> is designed for use by clients interested in the metadata and not in the primary file content. The Adobe Bridge application is a typical example. <code><a class="el" href="classTXMPFiles.html">TXMPFiles</a></code> is not intended to be particulary appropriate for files authored by an application. I.e. those files for which the application has explicit knowledge of the file format. <hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:57 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/TXMPFiles_8incl__cpp.html b/docs/XMPToolkit/TXMPFiles_8incl__cpp.html
deleted file mode 100644
index 146d09b..0000000
--- a/docs/XMPToolkit/TXMPFiles_8incl__cpp.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: TXMPFiles.incl_cpp File Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>TXMPFiles.incl_cpp File Reference</h1>The implementation of the <a class="el" href="classTXMPFiles.html">TXMPFiles</a> template class. <a href="#_details">More...</a>
-<p>
-<code>#include &quot;client-glue/WXMP_Common.hpp&quot;</code><br>
-<code>#include &quot;client-glue/WXMPFiles.hpp&quot;</code><br>
-
-<p>
-Include dependency graph for TXMPFiles.incl_cpp:<p><center><img src="TXMPFiles_8incl__cpp__incl.png" border="0" usemap="#TXMPFiles.incl_cpp_map" alt=""></center>
-<table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-The implementation of the <a class="el" href="classTXMPFiles.html">TXMPFiles</a> template class.
-<p>
-<hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:57 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/TXMPFiles_8incl__cpp__incl.png b/docs/XMPToolkit/TXMPFiles_8incl__cpp__incl.png
deleted file mode 100644
index 704bd4f..0000000
--- a/docs/XMPToolkit/TXMPFiles_8incl__cpp__incl.png
+++ /dev/null
Binary files differ
diff --git a/docs/XMPToolkit/TXMPIterator_8hpp-source.html b/docs/XMPToolkit/TXMPIterator_8hpp-source.html
deleted file mode 100644
index 8ef6239..0000000
--- a/docs/XMPToolkit/TXMPIterator_8hpp-source.html
+++ /dev/null
@@ -1,104 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: TXMPIterator.hpp Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>TXMPIterator.hpp</h1><a href="TXMPIterator_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef __TXMPIterator_hpp__</span>
-<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define __TXMPIterator_hpp__ 1</span>
-<a name="l00003"></a>00003 <span class="preprocessor"></span>
-<a name="l00004"></a>00004 <span class="preprocessor">#if ( ! __XMP_hpp__ )</span>
-<a name="l00005"></a>00005 <span class="preprocessor"></span><span class="preprocessor"> #error "Do not directly include, use XMP.hpp"</span>
-<a name="l00006"></a>00006 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00007"></a>00007 <span class="preprocessor"></span>
-<a name="l00008"></a>00008 <span class="comment">// =================================================================================================</span>
-<a name="l00009"></a>00009 <span class="comment">// ADOBE SYSTEMS INCORPORATED</span>
-<a name="l00010"></a>00010 <span class="comment">// Copyright 2002-2007 Adobe Systems Incorporated</span>
-<a name="l00011"></a>00011 <span class="comment">// All Rights Reserved</span>
-<a name="l00012"></a>00012 <span class="comment">//</span>
-<a name="l00013"></a>00013 <span class="comment">// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms</span>
-<a name="l00014"></a>00014 <span class="comment">// of the Adobe license agreement accompanying it.</span>
-<a name="l00015"></a>00015 <span class="comment">// =================================================================================================</span>
-<a name="l00016"></a>00016
-<a name="l00017"></a>00017 <span class="comment">// ================================================================================================</span>
-<a name="l00024"></a>00024 <span class="comment"></span><span class="comment">// ================================================================================================</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="comment">// ================================================================================================</span>
-<a name="l00084"></a>00084 <span class="comment"></span><span class="comment">// ================================================================================================</span>
-<a name="l00085"></a>00085
-<a name="l00086"></a>00086 <span class="preprocessor">#include "client-glue/WXMPIterator.hpp"</span>
-<a name="l00087"></a>00087
-<a name="l00088"></a>00088 <span class="keyword">template</span> &lt;<span class="keyword">class</span> tStringObj&gt;
-<a name="l00089"></a><a class="code" href="classTXMPIterator.html">00089</a> <span class="keyword">class </span><a class="code" href="classTXMPIterator.html">TXMPIterator</a> {
-<a name="l00090"></a>00090
-<a name="l00091"></a>00091 <span class="keyword">public</span>:
-<a name="l00092"></a>00092
-<a name="l00093"></a>00093 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00098"></a>00098 <span class="comment"></span>
-<a name="l00099"></a>00099 <span class="keywordtype">void</span> <a class="code" href="classTXMPIterator.html#d767d731320d3f4c997c6ce9f7f8fa63">operator= </a>( <span class="keyword">const</span> <a class="code" href="classTXMPIterator.html">TXMPIterator&lt;tStringObj&gt;</a> &amp; rhs );
-<a name="l00100"></a>00100
-<a name="l00101"></a>00101 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00105"></a>00105 <span class="comment"></span>
-<a name="l00106"></a>00106 <a class="code" href="classTXMPIterator.html">TXMPIterator</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPIterator.html">TXMPIterator&lt;tStringObj&gt;</a> &amp; original );
-<a name="l00107"></a>00107
-<a name="l00108"></a>00108 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00132"></a>00132 <span class="comment"></span>
-<a name="l00133"></a>00133 <a class="code" href="classTXMPIterator.html">TXMPIterator</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html">TXMPMeta&lt;tStringObj&gt;</a> &amp; xmpObj,
-<a name="l00134"></a>00134 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00135"></a>00135 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l00136"></a>00136 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l00137"></a>00137
-<a name="l00138"></a>00138 <a class="code" href="classTXMPIterator.html">TXMPIterator</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html">TXMPMeta&lt;tStringObj&gt;</a> &amp; xmpObj,
-<a name="l00139"></a>00139 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00140"></a>00140 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l00141"></a>00141
-<a name="l00142"></a>00142 <a class="code" href="classTXMPIterator.html">TXMPIterator</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html">TXMPMeta&lt;tStringObj&gt;</a> &amp; xmpObj,
-<a name="l00143"></a>00143 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l00144"></a>00144
-<a name="l00145"></a>00145 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00149"></a>00149 <span class="comment"></span>
-<a name="l00150"></a>00150 <a class="code" href="classTXMPIterator.html">TXMPIterator</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00151"></a>00151 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l00152"></a>00152 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options );
-<a name="l00153"></a>00153
-<a name="l00154"></a>00154 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00156"></a>00156 <span class="comment"></span>
-<a name="l00157"></a>00157 <span class="keyword">virtual</span> <a class="code" href="classTXMPIterator.html#911554533e8a3f09ab8870bd54462196">~TXMPIterator</a>() <span class="keywordflow">throw</span>();
-<a name="l00158"></a>00158
-<a name="l00159"></a>00159 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00175"></a>00175 <span class="comment"></span>
-<a name="l00176"></a>00176 <span class="keywordtype">bool</span>
-<a name="l00177"></a>00177 <a class="code" href="classTXMPIterator.html#124a1dd1ab3ff0d236e4d4b967dafcd9">Next</a> ( tStringObj * schemaNS = 0,
-<a name="l00178"></a>00178 tStringObj * propPath = 0,
-<a name="l00179"></a>00179 tStringObj * propValue = 0,
-<a name="l00180"></a>00180 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * options = 0 );
-<a name="l00181"></a>00181
-<a name="l00182"></a>00182 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00191"></a>00191 <span class="comment"></span>
-<a name="l00192"></a>00192 <span class="keywordtype">void</span>
-<a name="l00193"></a>00193 <a class="code" href="classTXMPIterator.html#30b4d78974b347e4fcd275f1f65a61b2">Skip</a> ( <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options );
-<a name="l00194"></a>00194
-<a name="l00195"></a>00195 <span class="keyword">private</span>:
-<a name="l00196"></a>00196
-<a name="l00197"></a>00197 XMPIteratorRef iterRef;
-<a name="l00198"></a>00198
-<a name="l00199"></a>00199 <a class="code" href="classTXMPIterator.html">TXMPIterator</a>(); <span class="comment">// ! Hidden, must choose property or table iteration.</span>
-<a name="l00200"></a>00200
-<a name="l00201"></a>00201 }; <span class="comment">// class TXMPIterator</span>
-<a name="l00202"></a>00202
-<a name="l00203"></a>00203 <span class="comment">// =================================================================================================</span>
-<a name="l00204"></a>00204
-<a name="l00205"></a>00205 <span class="preprocessor">#endif // __TXMPIterator_hpp__</span>
-</pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:57 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/TXMPIterator_8hpp.html b/docs/XMPToolkit/TXMPIterator_8hpp.html
deleted file mode 100644
index 4bca589..0000000
--- a/docs/XMPToolkit/TXMPIterator_8hpp.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: TXMPIterator.hpp File Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>TXMPIterator.hpp File Reference</h1>Template class for the XMP Toolkit iteration services. <a href="#_details">More...</a>
-<p>
-<code>#include &quot;client-glue/WXMPIterator.hpp&quot;</code><br>
-
-<p>
-Include dependency graph for TXMPIterator.hpp:<p><center><img src="TXMPIterator_8hpp__incl.png" border="0" usemap="#TXMPIterator.hpp_map" alt=""></center>
-
-<p>
-<a href="TXMPIterator_8hpp-source.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Template class for the XMP Toolkit iteration services. <a href="classTXMPIterator.html#_details">More...</a><br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-Template class for the XMP Toolkit iteration services.
-<p>
-This template class provides iteration services for the XMP Toolkit. It should be instantiated with a string class such as <code>std::string</code>. Please read the general usage notes for information on the overall architecture of the XMP API. <hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:57 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/TXMPIterator_8hpp__incl.png b/docs/XMPToolkit/TXMPIterator_8hpp__incl.png
deleted file mode 100644
index b3e627b..0000000
--- a/docs/XMPToolkit/TXMPIterator_8hpp__incl.png
+++ /dev/null
Binary files differ
diff --git a/docs/XMPToolkit/TXMPIterator_8incl__cpp.html b/docs/XMPToolkit/TXMPIterator_8incl__cpp.html
deleted file mode 100644
index ee6f9d8..0000000
--- a/docs/XMPToolkit/TXMPIterator_8incl__cpp.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: TXMPIterator.incl_cpp File Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>TXMPIterator.incl_cpp File Reference</h1>The implementation of the <a class="el" href="classTXMPIterator.html">TXMPIterator</a> template class. <a href="#_details">More...</a>
-<p>
-<code>#include &quot;XMP.hpp&quot;</code><br>
-<code>#include &quot;client-glue/WXMP_Common.hpp&quot;</code><br>
-<code>#include &quot;client-glue/WXMPIterator.hpp&quot;</code><br>
-
-<p>
-Include dependency graph for TXMPIterator.incl_cpp:<p><center><img src="TXMPIterator_8incl__cpp__incl.png" border="0" usemap="#TXMPIterator.incl_cpp_map" alt=""></center>
-<table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-The implementation of the <a class="el" href="classTXMPIterator.html">TXMPIterator</a> template class.
-<p>
-<hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:58 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/TXMPIterator_8incl__cpp__incl.png b/docs/XMPToolkit/TXMPIterator_8incl__cpp__incl.png
deleted file mode 100644
index e2c9422..0000000
--- a/docs/XMPToolkit/TXMPIterator_8incl__cpp__incl.png
+++ /dev/null
Binary files differ
diff --git a/docs/XMPToolkit/TXMPMeta_8hpp-source.html b/docs/XMPToolkit/TXMPMeta_8hpp-source.html
deleted file mode 100644
index 1aa7688..0000000
--- a/docs/XMPToolkit/TXMPMeta_8hpp-source.html
+++ /dev/null
@@ -1,617 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: TXMPMeta.hpp Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>TXMPMeta.hpp</h1><a href="TXMPMeta_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef __TXMPMeta_hpp__</span>
-<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define __TXMPMeta_hpp__ 1</span>
-<a name="l00003"></a>00003 <span class="preprocessor"></span>
-<a name="l00004"></a>00004 <span class="preprocessor">#if ( ! __XMP_hpp__ )</span>
-<a name="l00005"></a>00005 <span class="preprocessor"></span><span class="preprocessor"> #error "Do not directly include, use XMP.hpp"</span>
-<a name="l00006"></a>00006 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00007"></a>00007 <span class="preprocessor"></span>
-<a name="l00008"></a>00008 <span class="comment">// =================================================================================================</span>
-<a name="l00009"></a>00009 <span class="comment">// ADOBE SYSTEMS INCORPORATED</span>
-<a name="l00010"></a>00010 <span class="comment">// Copyright 2002-2007 Adobe Systems Incorporated</span>
-<a name="l00011"></a>00011 <span class="comment">// All Rights Reserved</span>
-<a name="l00012"></a>00012 <span class="comment">//</span>
-<a name="l00013"></a>00013 <span class="comment">// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms</span>
-<a name="l00014"></a>00014 <span class="comment">// of the Adobe license agreement accompanying it.</span>
-<a name="l00015"></a>00015 <span class="comment">// =================================================================================================</span>
-<a name="l00016"></a>00016
-<a name="l00017"></a>00017 <span class="comment">// ================================================================================================</span>
-<a name="l00024"></a>00024 <span class="comment"></span><span class="comment">// ================================================================================================</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="comment">// ================================================================================================</span>
-<a name="l00063"></a>00063 <span class="comment"></span><span class="comment">// ================================================================================================</span>
-<a name="l00064"></a>00064
-<a name="l00065"></a>00065 <span class="keyword">template</span> &lt;<span class="keyword">class</span> tStringObj&gt; <span class="keyword">class </span><a class="code" href="classTXMPIterator.html">TXMPIterator</a>;
-<a name="l00066"></a>00066 <span class="keyword">template</span> &lt;<span class="keyword">class</span> tStringObj&gt; <span class="keyword">class </span><a class="code" href="classTXMPUtils.html">TXMPUtils</a>;
-<a name="l00067"></a>00067
-<a name="l00068"></a>00068 <span class="comment">// -------------------------------------------------------------------------------------------------</span>
-<a name="l00069"></a>00069
-<a name="l00070"></a>00070 <span class="keyword">template</span> &lt;<span class="keyword">class</span> tStringObj&gt;
-<a name="l00071"></a><a class="code" href="classTXMPMeta.html">00071</a> <span class="keyword">class </span><a class="code" href="classTXMPMeta.html">TXMPMeta</a> {
-<a name="l00072"></a>00072
-<a name="l00073"></a>00073 <span class="keyword">public</span>:
-<a name="l00074"></a>00074
-<a name="l00075"></a>00075 <span class="comment">// =============================================================================================</span>
-<a name="l00076"></a>00076 <span class="comment">// Initialization and termination</span>
-<a name="l00077"></a>00077 <span class="comment">// ==============================</span>
-<a name="l00078"></a>00078
-<a name="l00079"></a>00079 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00082"></a>00082 <span class="comment"></span>
-<a name="l00083"></a>00083 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00085"></a>00085 <span class="comment"></span>
-<a name="l00086"></a>00086 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00087"></a>00087 <a class="code" href="classTXMPMeta.html#5415cfc01a9cb8786939246571a23a9d">GetVersionInfo</a> ( XMP_VersionInfo * info );
-<a name="l00088"></a>00088
-<a name="l00089"></a>00089 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00094"></a>00094 <span class="comment"></span>
-<a name="l00095"></a>00095 <span class="keyword">static</span> <span class="keywordtype">bool</span>
-<a name="l00096"></a>00096 <a class="code" href="classTXMPMeta.html#bfddf1df0e01ab33d5636a80edc973ca">Initialize</a>();
-<a name="l00097"></a>00097 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00099"></a>00099 <span class="comment"></span>
-<a name="l00100"></a>00100 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00101"></a>00101 <a class="code" href="classTXMPMeta.html#6c30fae26173167958b6f0da95a53865">Terminate</a>();
-<a name="l00102"></a>00102
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 <span class="comment">// =============================================================================================</span>
-<a name="l00106"></a>00106 <span class="comment">// Constuctors and destructor</span>
-<a name="l00107"></a>00107 <span class="comment">// =========================</span>
-<a name="l00108"></a>00108
-<a name="l00109"></a>00109 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00112"></a>00112 <span class="comment"></span>
-<a name="l00113"></a>00113 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00117"></a>00117 <span class="comment"></span>
-<a name="l00118"></a>00118 <a class="code" href="classTXMPMeta.html#7729cbce91956632289b88d85fdc65ae">TXMPMeta</a>();
-<a name="l00119"></a>00119
-<a name="l00120"></a>00120 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00124"></a>00124 <span class="comment"></span>
-<a name="l00125"></a>00125 <a class="code" href="classTXMPMeta.html#7729cbce91956632289b88d85fdc65ae">TXMPMeta</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html">TXMPMeta&lt;tStringObj&gt;</a> &amp; original );
-<a name="l00126"></a>00126
-<a name="l00127"></a>00127 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00132"></a>00132 <span class="comment"></span>
-<a name="l00133"></a>00133 <span class="keywordtype">void</span> <a class="code" href="classTXMPMeta.html#4d5a601c9b77f6f6ab5f14e658de58ef">operator= </a>( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html">TXMPMeta&lt;tStringObj&gt;</a> &amp; rhs );
-<a name="l00134"></a>00134
-<a name="l00135"></a>00135 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00141"></a>00141 <span class="comment"></span>
-<a name="l00142"></a>00142 <a class="code" href="classTXMPMeta.html#7729cbce91956632289b88d85fdc65ae">TXMPMeta</a> ( <a class="code" href="XMP__Const_8h.html#5912613564f80e17eb10acef9236f70a">XMPMetaRef</a> xmpRef );
-<a name="l00143"></a>00143
-<a name="l00144"></a>00144 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00157"></a>00157 <span class="comment"></span>
-<a name="l00158"></a>00158 <a class="code" href="classTXMPMeta.html#7729cbce91956632289b88d85fdc65ae">TXMPMeta</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> buffer,
-<a name="l00159"></a>00159 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> xmpSize );
-<a name="l00160"></a>00160
-<a name="l00161"></a>00161 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00163"></a>00163 <span class="comment"></span>
-<a name="l00164"></a>00164 <span class="keyword">virtual</span> <a class="code" href="classTXMPMeta.html#bab5013870cd47eb0d9d701653735a02">~TXMPMeta</a>() <span class="keywordflow">throw</span>();
-<a name="l00165"></a>00165
-<a name="l00167"></a>00167
-<a name="l00168"></a>00168 <span class="comment">// =============================================================================================</span>
-<a name="l00169"></a>00169 <span class="comment">// Global state functions</span>
-<a name="l00170"></a>00170 <span class="comment">// ======================</span>
-<a name="l00171"></a>00171
-<a name="l00172"></a>00172 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00177"></a>00177 <span class="comment"></span>
-<a name="l00179"></a>00179
-<a name="l00180"></a>00180 <span class="keyword">static</span> <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>
-<a name="l00181"></a>00181 <a class="code" href="classTXMPMeta.html#12b2435ba039c62a164951948c016eb4">GetGlobalOptions</a>();
-<a name="l00182"></a>00182
-<a name="l00188"></a>00188
-<a name="l00189"></a>00189 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00190"></a>00190 <a class="code" href="classTXMPMeta.html#e7bb38d9b3857b08106630a386b47332">SetGlobalOptions</a> ( <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options );
-<a name="l00191"></a>00191
-<a name="l00193"></a>00193
-<a name="l00194"></a>00194 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00199"></a>00199 <span class="comment"></span>
-<a name="l00201"></a>00201
-<a name="l00202"></a>00202 <span class="keyword">static</span> <a class="code" href="XMP__Const_8h.html#91efdc0a7fbe6e1d42ca34e6ce589b98">XMP_Status</a>
-<a name="l00203"></a>00203 <a class="code" href="classTXMPMeta.html#44250140a710c0b7c5cc0881e387d004">DumpNamespaces</a> ( <a class="code" href="XMP__Const_8h.html#36eab570ab85ff8fb5789661692d13c2">XMP_TextOutputProc</a> outProc,
-<a name="l00204"></a>00204 <span class="keywordtype">void</span> * refCon );
-<a name="l00205"></a>00205
-<a name="l00207"></a>00207
-<a name="l00208"></a>00208 <span class="keyword">static</span> <a class="code" href="XMP__Const_8h.html#91efdc0a7fbe6e1d42ca34e6ce589b98">XMP_Status</a>
-<a name="l00209"></a>00209 <a class="code" href="classTXMPMeta.html#afb027f200b85467298d237a0c23949b">DumpAliases</a> ( <a class="code" href="XMP__Const_8h.html#36eab570ab85ff8fb5789661692d13c2">XMP_TextOutputProc</a> outProc,
-<a name="l00210"></a>00210 <span class="keywordtype">void</span> * refCon );
-<a name="l00211"></a>00211
-<a name="l00213"></a>00213
-<a name="l00214"></a>00214 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00224"></a>00224 <span class="comment"></span>
-<a name="l00225"></a>00225 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00243"></a>00243 <span class="comment"></span>
-<a name="l00244"></a>00244 <span class="keyword">static</span> <span class="keywordtype">bool</span>
-<a name="l00245"></a>00245 <a class="code" href="classTXMPMeta.html#4c69d31a37ff24c85679229c479aa1ac">RegisterNamespace</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> namespaceURI,
-<a name="l00246"></a>00246 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> suggestedPrefix,
-<a name="l00247"></a>00247 tStringObj * registeredPrefix );
-<a name="l00248"></a>00248
-<a name="l00249"></a>00249 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00260"></a>00260 <span class="comment"></span>
-<a name="l00261"></a>00261 <span class="keyword">static</span> <span class="keywordtype">bool</span>
-<a name="l00262"></a>00262 <a class="code" href="classTXMPMeta.html#f28589472d8c0397db6cef868f2b8c97">GetNamespacePrefix</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> namespaceURI,
-<a name="l00263"></a>00263 tStringObj * namespacePrefix );
-<a name="l00264"></a>00264
-<a name="l00265"></a>00265 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00276"></a>00276 <span class="comment"></span>
-<a name="l00277"></a>00277 <span class="keyword">static</span> <span class="keywordtype">bool</span>
-<a name="l00278"></a>00278 <a class="code" href="classTXMPMeta.html#a20c84e7549d0a3252fa29a1e83a757a">GetNamespaceURI</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> namespacePrefix,
-<a name="l00279"></a>00279 tStringObj * namespaceURI );
-<a name="l00280"></a>00280
-<a name="l00281"></a>00281 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00290"></a>00290 <span class="comment"></span>
-<a name="l00291"></a>00291 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00292"></a>00292 <a class="code" href="classTXMPMeta.html#3f989597e95db929676273cacd4ea09a">DeleteNamespace</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> namespaceURI );
-<a name="l00293"></a>00293
-<a name="l00295"></a>00295
-<a name="l00296"></a>00296 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00311"></a>00311 <span class="comment"></span>
-<a name="l00312"></a>00312 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00348"></a>00348 <span class="comment"></span>
-<a name="l00349"></a>00349 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00350"></a>00350 <a class="code" href="classTXMPMeta.html#b9463c7459125ca0038db2e586c5e4df">RegisterAlias</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasNS,
-<a name="l00351"></a>00351 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasProp,
-<a name="l00352"></a>00352 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> actualNS,
-<a name="l00353"></a>00353 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> actualProp,
-<a name="l00354"></a>00354 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> arrayForm = kXMP_NoOptions );
-<a name="l00355"></a>00355
-<a name="l00356"></a>00356 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00382"></a>00382 <span class="comment"></span>
-<a name="l00383"></a>00383 <span class="keyword">static</span> <span class="keywordtype">bool</span>
-<a name="l00384"></a>00384 <a class="code" href="classTXMPMeta.html#c4b9c75202f2b961ad92f10a9e504e9a">ResolveAlias</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasNS,
-<a name="l00385"></a>00385 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasProp,
-<a name="l00386"></a>00386 tStringObj * actualNS,
-<a name="l00387"></a>00387 tStringObj * actualProp,
-<a name="l00388"></a>00388 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * arrayForm );
-<a name="l00389"></a>00389
-<a name="l00390"></a>00390 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00401"></a>00401 <span class="comment"></span>
-<a name="l00402"></a>00402 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00403"></a>00403 <a class="code" href="classTXMPMeta.html#af64964e983235247ef65c86a42a4675">DeleteAlias</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasNS,
-<a name="l00404"></a>00404 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasProp );
-<a name="l00405"></a>00405
-<a name="l00406"></a>00406 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00413"></a>00413 <span class="comment"></span>
-<a name="l00414"></a>00414 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00415"></a>00415 <a class="code" href="classTXMPMeta.html#b77cf73fa0cc63d845f113b3d1c83602">RegisterStandardAliases</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS );
-<a name="l00416"></a>00416
-<a name="l00418"></a>00418
-<a name="l00419"></a>00419 <span class="comment">// =============================================================================================</span>
-<a name="l00420"></a>00420 <span class="comment">// Basic property manipulation functions</span>
-<a name="l00421"></a>00421 <span class="comment">// =====================================</span>
-<a name="l00422"></a>00422
-<a name="l00423"></a>00423 <span class="comment">// *** Should add discussion of schemaNS and propName prefix usage.</span>
-<a name="l00424"></a>00424
-<a name="l00425"></a>00425 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00484"></a>00484 <span class="comment"></span>
-<a name="l00485"></a>00485 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00507"></a>00507 <span class="comment"></span>
-<a name="l00508"></a>00508 <span class="keywordtype">bool</span>
-<a name="l00509"></a>00509 <a class="code" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c">GetProperty</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00510"></a>00510 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l00511"></a>00511 tStringObj * propValue,
-<a name="l00512"></a>00512 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
-<a name="l00513"></a>00513
-<a name="l00514"></a>00514 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00535"></a>00535 <span class="comment"></span>
-<a name="l00536"></a>00536 <span class="keywordtype">bool</span>
-<a name="l00537"></a>00537 <a class="code" href="classTXMPMeta.html#c64a4251d157937f69b73f2ffac4f7cc">GetArrayItem</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00538"></a>00538 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName,
-<a name="l00539"></a>00539 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex,
-<a name="l00540"></a>00540 tStringObj * itemValue,
-<a name="l00541"></a>00541 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
-<a name="l00542"></a>00542
-<a name="l00543"></a>00543 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00571"></a>00571 <span class="comment"></span>
-<a name="l00572"></a>00572 <span class="keywordtype">bool</span>
-<a name="l00573"></a>00573 <a class="code" href="classTXMPMeta.html#e99d2bc414d5cd68851147aef6710d4a">GetStructField</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00574"></a>00574 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName,
-<a name="l00575"></a>00575 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS,
-<a name="l00576"></a>00576 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName,
-<a name="l00577"></a>00577 tStringObj * fieldValue,
-<a name="l00578"></a>00578 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
-<a name="l00579"></a>00579
-<a name="l00580"></a>00580 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00613"></a>00613 <span class="comment"></span>
-<a name="l00614"></a>00614 <span class="keywordtype">bool</span>
-<a name="l00615"></a>00615 <a class="code" href="classTXMPMeta.html#2cc58d8316043b035643e7c21633bc13">GetQualifier</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00616"></a>00616 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l00617"></a>00617 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS,
-<a name="l00618"></a>00618 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName,
-<a name="l00619"></a>00619 tStringObj * qualValue,
-<a name="l00620"></a>00620 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
-<a name="l00621"></a>00621
-<a name="l00623"></a>00623
-<a name="l00624"></a>00624 <span class="comment">// =============================================================================================</span>
-<a name="l00625"></a>00625
-<a name="l00626"></a>00626 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00670"></a>00670 <span class="comment"></span>
-<a name="l00671"></a>00671 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00684"></a>00684 <span class="comment"></span>
-<a name="l00685"></a>00685 <span class="keywordtype">void</span>
-<a name="l00686"></a>00686 <a class="code" href="classTXMPMeta.html#1dfd6a08ebfd1a6364b3a7b6584bcc28">SetProperty</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00687"></a>00687 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l00688"></a>00688 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propValue,
-<a name="l00689"></a>00689 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l00690"></a>00690
-<a name="l00691"></a>00691 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00694"></a>00694 <span class="comment"></span>
-<a name="l00695"></a>00695 <span class="keywordtype">void</span>
-<a name="l00696"></a>00696 <a class="code" href="classTXMPMeta.html#1dfd6a08ebfd1a6364b3a7b6584bcc28">SetProperty</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00697"></a>00697 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l00698"></a>00698 <span class="keyword">const</span> tStringObj &amp; propValue,
-<a name="l00699"></a>00699 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l00700"></a>00700
-<a name="l00701"></a>00701 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00726"></a>00726 <span class="comment"></span>
-<a name="l00727"></a>00727 <span class="keywordtype">void</span>
-<a name="l00728"></a>00728 <a class="code" href="classTXMPMeta.html#1570eb89d613b4a94ca572e4644168cc">SetArrayItem</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00729"></a>00729 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName,
-<a name="l00730"></a>00730 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex,
-<a name="l00731"></a>00731 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> itemValue,
-<a name="l00732"></a>00732 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l00733"></a>00733
-<a name="l00734"></a>00734 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00737"></a>00737 <span class="comment"></span>
-<a name="l00738"></a>00738 <span class="keywordtype">void</span>
-<a name="l00739"></a>00739 <a class="code" href="classTXMPMeta.html#1570eb89d613b4a94ca572e4644168cc">SetArrayItem</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00740"></a>00740 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName,
-<a name="l00741"></a>00741 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex,
-<a name="l00742"></a>00742 <span class="keyword">const</span> tStringObj &amp; itemValue,
-<a name="l00743"></a>00743 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l00744"></a>00744
-<a name="l00745"></a>00745 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00767"></a>00767 <span class="comment"></span>
-<a name="l00768"></a>00768 <span class="keywordtype">void</span>
-<a name="l00769"></a>00769 <a class="code" href="classTXMPMeta.html#00d7314dc970ad390499ce9db27d314a">AppendArrayItem</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00770"></a>00770 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName,
-<a name="l00771"></a>00771 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> arrayOptions,
-<a name="l00772"></a>00772 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> itemValue,
-<a name="l00773"></a>00773 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> itemOptions = 0 );
-<a name="l00774"></a>00774
-<a name="l00775"></a>00775 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00778"></a>00778 <span class="comment"></span>
-<a name="l00779"></a>00779 <span class="keywordtype">void</span>
-<a name="l00780"></a>00780 <a class="code" href="classTXMPMeta.html#00d7314dc970ad390499ce9db27d314a">AppendArrayItem</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00781"></a>00781 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName,
-<a name="l00782"></a>00782 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> arrayOptions,
-<a name="l00783"></a>00783 <span class="keyword">const</span> tStringObj &amp; itemValue,
-<a name="l00784"></a>00784 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> itemOptions = 0 );
-<a name="l00785"></a>00785
-<a name="l00786"></a>00786 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00811"></a>00811 <span class="comment"></span>
-<a name="l00812"></a>00812 <span class="keywordtype">void</span>
-<a name="l00813"></a>00813 <a class="code" href="classTXMPMeta.html#0e44c30e7527064909e5f7035d53c4f5">SetStructField</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00814"></a>00814 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName,
-<a name="l00815"></a>00815 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS,
-<a name="l00816"></a>00816 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName,
-<a name="l00817"></a>00817 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldValue,
-<a name="l00818"></a>00818 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l00819"></a>00819
-<a name="l00820"></a>00820 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00823"></a>00823 <span class="comment"></span>
-<a name="l00824"></a>00824 <span class="keywordtype">void</span>
-<a name="l00825"></a>00825 <a class="code" href="classTXMPMeta.html#0e44c30e7527064909e5f7035d53c4f5">SetStructField</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00826"></a>00826 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName,
-<a name="l00827"></a>00827 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS,
-<a name="l00828"></a>00828 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName,
-<a name="l00829"></a>00829 <span class="keyword">const</span> tStringObj &amp; fieldValue,
-<a name="l00830"></a>00830 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l00831"></a>00831
-<a name="l00832"></a>00832 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00859"></a>00859 <span class="comment"></span>
-<a name="l00860"></a>00860 <span class="keywordtype">void</span>
-<a name="l00861"></a>00861 <a class="code" href="classTXMPMeta.html#c2e798da5f9d94e486382a41e73fcea3">SetQualifier</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00862"></a>00862 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l00863"></a>00863 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS,
-<a name="l00864"></a>00864 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName,
-<a name="l00865"></a>00865 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualValue,
-<a name="l00866"></a>00866 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l00867"></a>00867
-<a name="l00868"></a>00868 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00871"></a>00871 <span class="comment"></span>
-<a name="l00872"></a>00872 <span class="keywordtype">void</span>
-<a name="l00873"></a>00873 <a class="code" href="classTXMPMeta.html#c2e798da5f9d94e486382a41e73fcea3">SetQualifier</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00874"></a>00874 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l00875"></a>00875 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS,
-<a name="l00876"></a>00876 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName,
-<a name="l00877"></a>00877 <span class="keyword">const</span> tStringObj &amp; qualValue,
-<a name="l00878"></a>00878 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l00879"></a>00879
-<a name="l00881"></a>00881
-<a name="l00882"></a>00882 <span class="comment">// =============================================================================================</span>
-<a name="l00883"></a>00883
-<a name="l00884"></a>00884 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00888"></a>00888 <span class="comment"></span>
-<a name="l00889"></a>00889 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00896"></a>00896 <span class="comment"></span>
-<a name="l00897"></a>00897 <span class="keywordtype">void</span>
-<a name="l00898"></a>00898 <a class="code" href="classTXMPMeta.html#c8b555ba99904fa49bb4851a60cc3844">DeleteProperty</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00899"></a>00899 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName );
-<a name="l00900"></a>00900
-<a name="l00901"></a>00901 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00912"></a>00912 <span class="comment"></span>
-<a name="l00913"></a>00913 <span class="keywordtype">void</span>
-<a name="l00914"></a>00914 <a class="code" href="classTXMPMeta.html#bc1211f47225b5973a170ff952743264">DeleteArrayItem</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00915"></a>00915 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName,
-<a name="l00916"></a>00916 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex );
-<a name="l00917"></a>00917
-<a name="l00918"></a>00918 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00932"></a>00932 <span class="comment"></span>
-<a name="l00933"></a>00933 <span class="keywordtype">void</span>
-<a name="l00934"></a>00934 <a class="code" href="classTXMPMeta.html#bc258e027780a15be65a88fcfd4e1fd4">DeleteStructField</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00935"></a>00935 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName,
-<a name="l00936"></a>00936 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS,
-<a name="l00937"></a>00937 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName );
-<a name="l00938"></a>00938
-<a name="l00939"></a>00939 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00953"></a>00953 <span class="comment"></span>
-<a name="l00954"></a>00954 <span class="keywordtype">void</span>
-<a name="l00955"></a>00955 <a class="code" href="classTXMPMeta.html#8ce15f7de7fd3b258f07158ab5fa88be">DeleteQualifier</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00956"></a>00956 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l00957"></a>00957 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS,
-<a name="l00958"></a>00958 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName );
-<a name="l00959"></a>00959
-<a name="l00960"></a>00960 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00968"></a>00968 <span class="comment"></span>
-<a name="l00969"></a>00969 <span class="keywordtype">bool</span>
-<a name="l00970"></a>00970 <a class="code" href="classTXMPMeta.html#f22b116d71ecbbebea016ec5337e7066">DoesPropertyExist</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00971"></a>00971 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName ) <span class="keyword">const</span>;
-<a name="l00972"></a>00972
-<a name="l00973"></a>00973 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00985"></a>00985 <span class="comment"></span>
-<a name="l00986"></a>00986 <span class="keywordtype">bool</span>
-<a name="l00987"></a>00987 <a class="code" href="classTXMPMeta.html#492465c588d6d4cb8e30f94790e66f58">DoesArrayItemExist</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00988"></a>00988 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName,
-<a name="l00989"></a>00989 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex ) <span class="keyword">const</span>;
-<a name="l00990"></a>00990
-<a name="l00991"></a>00991 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01006"></a>01006 <span class="comment"></span>
-<a name="l01007"></a>01007 <span class="keywordtype">bool</span>
-<a name="l01008"></a>01008 <a class="code" href="classTXMPMeta.html#9261b80d62e77a10ff1a89843bfa10a5">DoesStructFieldExist</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l01009"></a>01009 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName,
-<a name="l01010"></a>01010 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS,
-<a name="l01011"></a>01011 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName ) <span class="keyword">const</span>;
-<a name="l01012"></a>01012
-<a name="l01013"></a>01013 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01028"></a>01028 <span class="comment"></span>
-<a name="l01029"></a>01029 <span class="keywordtype">bool</span>
-<a name="l01030"></a>01030 <a class="code" href="classTXMPMeta.html#81347a92becd387a14f4d47c582f129a">DoesQualifierExist</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l01031"></a>01031 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l01032"></a>01032 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS,
-<a name="l01033"></a>01033 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName ) <span class="keyword">const</span>;
-<a name="l01034"></a>01034
-<a name="l01036"></a>01036
-<a name="l01037"></a>01037 <span class="comment">// =============================================================================================</span>
-<a name="l01038"></a>01038 <span class="comment">// Specialized Get and Set functions</span>
-<a name="l01039"></a>01039 <span class="comment">// =================================</span>
-<a name="l01040"></a>01040
-<a name="l01041"></a>01041 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01094"></a>01094 <span class="comment"></span>
-<a name="l01095"></a>01095 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01123"></a>01123 <span class="comment"></span>
-<a name="l01124"></a>01124 <span class="keywordtype">bool</span>
-<a name="l01125"></a>01125 <a class="code" href="classTXMPMeta.html#eefe49bbf669770d769f4fe0ea566bd0">GetLocalizedText</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l01126"></a>01126 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> altTextName,
-<a name="l01127"></a>01127 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> genericLang,
-<a name="l01128"></a>01128 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> specificLang,
-<a name="l01129"></a>01129 tStringObj * actualLang,
-<a name="l01130"></a>01130 tStringObj * itemValue,
-<a name="l01131"></a>01131 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
-<a name="l01132"></a>01132
-<a name="l01133"></a>01133 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01174"></a>01174 <span class="comment"></span>
-<a name="l01175"></a>01175 <span class="keywordtype">void</span>
-<a name="l01176"></a>01176 <a class="code" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19">SetLocalizedText</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l01177"></a>01177 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> altTextName,
-<a name="l01178"></a>01178 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> genericLang,
-<a name="l01179"></a>01179 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> specificLang,
-<a name="l01180"></a>01180 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> itemValue,
-<a name="l01181"></a>01181 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l01182"></a>01182
-<a name="l01183"></a>01183 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01186"></a>01186 <span class="comment"></span>
-<a name="l01187"></a>01187 <span class="keywordtype">void</span>
-<a name="l01188"></a>01188 <a class="code" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19">SetLocalizedText</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l01189"></a>01189 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> altTextName,
-<a name="l01190"></a>01190 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> genericLang,
-<a name="l01191"></a>01191 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> specificLang,
-<a name="l01192"></a>01192 <span class="keyword">const</span> tStringObj &amp; itemValue,
-<a name="l01193"></a>01193 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l01194"></a>01194
-<a name="l01196"></a>01196
-<a name="l01197"></a>01197 <span class="comment">// =============================================================================================</span>
-<a name="l01198"></a>01198
-<a name="l01199"></a>01199 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01207"></a>01207 <span class="comment"></span>
-<a name="l01208"></a>01208 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01222"></a>01222 <span class="comment"></span>
-<a name="l01223"></a>01223 <span class="keywordtype">bool</span>
-<a name="l01224"></a>01224 <a class="code" href="classTXMPMeta.html#dcf8a1959a8bd42641a42cbd4d64a5b7">GetProperty_Bool</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l01225"></a>01225 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l01226"></a>01226 <span class="keywordtype">bool</span> * propValue,
-<a name="l01227"></a>01227 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
-<a name="l01228"></a>01228
-<a name="l01229"></a>01229 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01243"></a>01243 <span class="comment"></span>
-<a name="l01244"></a>01244 <span class="keywordtype">bool</span>
-<a name="l01245"></a>01245 <a class="code" href="classTXMPMeta.html#3b6ba486c02607b544917091c43b05cc">GetProperty_Int</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l01246"></a>01246 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l01247"></a>01247 <span class="keywordtype">long</span> * propValue,
-<a name="l01248"></a>01248 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
-<a name="l01249"></a>01249
-<a name="l01250"></a>01250 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01264"></a>01264 <span class="comment"></span>
-<a name="l01265"></a>01265 <span class="keywordtype">bool</span>
-<a name="l01266"></a>01266 <a class="code" href="classTXMPMeta.html#d1a6629b0466981b67d31c9dc3840ea7">GetProperty_Int64</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l01267"></a>01267 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l01268"></a>01268 <span class="keywordtype">long</span> <span class="keywordtype">long</span> * propValue,
-<a name="l01269"></a>01269 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
-<a name="l01270"></a>01270
-<a name="l01271"></a>01271 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01285"></a>01285 <span class="comment"></span>
-<a name="l01286"></a>01286 <span class="keywordtype">bool</span>
-<a name="l01287"></a>01287 <a class="code" href="classTXMPMeta.html#7708c31c9af3e740b27a4893dcd9aa47">GetProperty_Float</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l01288"></a>01288 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l01289"></a>01289 <span class="keywordtype">double</span> * propValue,
-<a name="l01290"></a>01290 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
-<a name="l01291"></a>01291
-<a name="l01292"></a>01292 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01306"></a>01306 <span class="comment"></span>
-<a name="l01307"></a>01307 <span class="keywordtype">bool</span>
-<a name="l01308"></a>01308 <a class="code" href="classTXMPMeta.html#2f561295e73047ee90765558d29bd650">GetProperty_Date</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l01309"></a>01309 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l01310"></a>01310 <a class="code" href="structXMP__DateTime.html">XMP_DateTime</a> * propValue,
-<a name="l01311"></a>01311 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * options ) <span class="keyword">const</span>;
-<a name="l01312"></a>01312
-<a name="l01313"></a>01313 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01324"></a>01324 <span class="comment"></span>
-<a name="l01325"></a>01325 <span class="keywordtype">void</span>
-<a name="l01326"></a>01326 <a class="code" href="classTXMPMeta.html#9521e3838272ec501ffdb60ff3eb482f">SetProperty_Bool</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l01327"></a>01327 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l01328"></a>01328 <span class="keywordtype">bool</span> propValue,
-<a name="l01329"></a>01329 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l01330"></a>01330
-<a name="l01331"></a>01331 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01341"></a>01341 <span class="comment"></span>
-<a name="l01342"></a>01342 <span class="keywordtype">void</span>
-<a name="l01343"></a>01343 <a class="code" href="classTXMPMeta.html#b8ae94130d9a05c1b9a3ee25588b6421">SetProperty_Int</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l01344"></a>01344 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l01345"></a>01345 <span class="keywordtype">long</span> propValue,
-<a name="l01346"></a>01346 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l01347"></a>01347
-<a name="l01348"></a>01348 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01358"></a>01358 <span class="comment"></span>
-<a name="l01359"></a>01359 <span class="keywordtype">void</span>
-<a name="l01360"></a>01360 <a class="code" href="classTXMPMeta.html#df919aff205e934e4c8250a067f7b377">SetProperty_Int64</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l01361"></a>01361 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l01362"></a>01362 <span class="keywordtype">long</span> <span class="keywordtype">long</span> propValue,
-<a name="l01363"></a>01363 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l01364"></a>01364
-<a name="l01365"></a>01365 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01375"></a>01375 <span class="comment"></span>
-<a name="l01376"></a>01376 <span class="keywordtype">void</span>
-<a name="l01377"></a>01377 <a class="code" href="classTXMPMeta.html#3b0f2f6bae57931ea96775f03608c0ed">SetProperty_Float</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l01378"></a>01378 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l01379"></a>01379 <span class="keywordtype">double</span> propValue,
-<a name="l01380"></a>01380 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l01381"></a>01381
-<a name="l01382"></a>01382 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01392"></a>01392 <span class="comment"></span>
-<a name="l01393"></a>01393 <span class="keywordtype">void</span>
-<a name="l01394"></a>01394 <a class="code" href="classTXMPMeta.html#eee10669445f77139d5634199ff01079">SetProperty_Date</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l01395"></a>01395 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l01396"></a>01396 <span class="keyword">const</span> <a class="code" href="structXMP__DateTime.html">XMP_DateTime</a> &amp; propValue,
-<a name="l01397"></a>01397 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l01398"></a>01398
-<a name="l01400"></a>01400
-<a name="l01401"></a>01401 <span class="comment">// =============================================================================================</span>
-<a name="l01402"></a>01402 <span class="comment">// Miscellaneous Member Functions</span>
-<a name="l01403"></a>01403 <span class="comment">// ==============================</span>
-<a name="l01404"></a>01404
-<a name="l01405"></a>01405 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01408"></a>01408 <span class="comment"></span>
-<a name="l01409"></a>01409 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01412"></a>01412 <span class="comment"></span>
-<a name="l01413"></a>01413 <a class="code" href="XMP__Const_8h.html#5912613564f80e17eb10acef9236f70a">XMPMetaRef</a>
-<a name="l01414"></a>01414 <a class="code" href="classTXMPMeta.html#4d35b44f1f017a27772ee902a3dacf04">GetInternalRef</a>() <span class="keyword">const</span>;
-<a name="l01415"></a>01415
-<a name="l01416"></a>01416 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01418"></a>01418 <span class="comment"></span>
-<a name="l01419"></a>01419 <span class="keywordtype">void</span>
-<a name="l01420"></a>01420 <a class="code" href="classTXMPMeta.html#b0d179ed95487d4fd4f2680c1fbe0d40">GetObjectName</a> ( tStringObj * name ) <span class="keyword">const</span>;
-<a name="l01421"></a>01421
-<a name="l01422"></a>01422 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01424"></a>01424 <span class="comment"></span>
-<a name="l01425"></a>01425 <span class="keywordtype">void</span>
-<a name="l01426"></a>01426 <a class="code" href="classTXMPMeta.html#cf1935be8e4849976dfc02325424960a">SetObjectName</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> name );
-<a name="l01427"></a>01427
-<a name="l01428"></a>01428 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01430"></a>01430 <span class="comment"></span>
-<a name="l01431"></a>01431 <span class="keywordtype">void</span>
-<a name="l01432"></a>01432 <a class="code" href="classTXMPMeta.html#cf1935be8e4849976dfc02325424960a">SetObjectName</a> ( tStringObj name );
-<a name="l01433"></a>01433
-<a name="l01434"></a>01434 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01436"></a>01436 <span class="comment"></span>
-<a name="l01437"></a>01437 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>
-<a name="l01438"></a>01438 <a class="code" href="classTXMPMeta.html#39aeaf9eb83cfc1c5455807b95f055f9">GetObjectOptions</a>() <span class="keyword">const</span>;
-<a name="l01439"></a>01439
-<a name="l01440"></a>01440 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01444"></a>01444 <span class="comment"></span>
-<a name="l01445"></a>01445 <span class="keywordtype">void</span>
-<a name="l01446"></a>01446 <a class="code" href="classTXMPMeta.html#92055b3ae18dfd5e5491108f59318f17">SetObjectOptions</a> ( <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options );
-<a name="l01447"></a>01447
-<a name="l01448"></a>01448 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01469"></a>01469 <span class="comment"></span>
-<a name="l01470"></a>01470 <a class="code" href="classTXMPMeta.html">TXMPMeta</a>
-<a name="l01471"></a>01471 <a class="code" href="classTXMPMeta.html#6ca653436995bbb76315efe7934afd4c">Clone</a> ( <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 ) <span class="keyword">const</span>;
-<a name="l01472"></a>01472
-<a name="l01473"></a>01473 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01475"></a>01475 <span class="comment"></span>
-<a name="l01476"></a>01476 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>
-<a name="l01477"></a>01477 <a class="code" href="classTXMPMeta.html#b79aae864b3ce190d0699252f48e0acc">CountArrayItems</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l01478"></a>01478 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName ) <span class="keyword">const</span>;
-<a name="l01479"></a>01479
-<a name="l01480"></a>01480 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01482"></a>01482 <span class="comment"></span>
-<a name="l01483"></a>01483 <a class="code" href="XMP__Const_8h.html#91efdc0a7fbe6e1d42ca34e6ce589b98">XMP_Status</a>
-<a name="l01484"></a>01484 <a class="code" href="classTXMPMeta.html#976c1eb889f44080f76628805712b618">DumpObject</a> ( <a class="code" href="XMP__Const_8h.html#36eab570ab85ff8fb5789661692d13c2">XMP_TextOutputProc</a> outProc,
-<a name="l01485"></a>01485 <span class="keywordtype">void</span> * refCon ) <span class="keyword">const</span>;
-<a name="l01486"></a>01486
-<a name="l01488"></a>01488
-<a name="l01489"></a>01489 <span class="comment">// =============================================================================================</span>
-<a name="l01490"></a>01490
-<a name="l01491"></a>01491 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01497"></a>01497 <span class="comment"></span>
-<a name="l01498"></a>01498 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01517"></a>01517 <span class="comment"></span>
-<a name="l01518"></a>01518 <span class="keywordtype">void</span>
-<a name="l01519"></a>01519 <a class="code" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26">ParseFromBuffer</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> buffer,
-<a name="l01520"></a>01520 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> bufferSize,
-<a name="l01521"></a>01521 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l01522"></a>01522
-<a name="l01523"></a>01523 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01565"></a>01565 <span class="comment"></span>
-<a name="l01566"></a>01566 <span class="keywordtype">void</span>
-<a name="l01567"></a>01567 <a class="code" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49">SerializeToBuffer</a> ( tStringObj * rdfString,
-<a name="l01568"></a>01568 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options,
-<a name="l01569"></a>01569 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> padding,
-<a name="l01570"></a>01570 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> newline,
-<a name="l01571"></a>01571 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> indent = <span class="stringliteral">""</span>,
-<a name="l01572"></a>01572 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> baseIndent = 0 ) <span class="keyword">const</span>;
-<a name="l01573"></a>01573
-<a name="l01574"></a>01574 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l01578"></a>01578 <span class="comment"></span>
-<a name="l01579"></a>01579 <span class="keywordtype">void</span>
-<a name="l01580"></a>01580 <a class="code" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49">SerializeToBuffer</a> ( tStringObj * rdfString,
-<a name="l01581"></a>01581 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0,
-<a name="l01582"></a>01582 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> padding = 0 ) <span class="keyword">const</span>;
-<a name="l01583"></a>01583
-<a name="l01585"></a>01585
-<a name="l01586"></a>01586 <span class="comment">// =============================================================================================</span>
-<a name="l01587"></a>01587
-<a name="l01588"></a>01588 <a class="code" href="XMP__Const_8h.html#5912613564f80e17eb10acef9236f70a">XMPMetaRef</a> xmpRef; <span class="comment">// *** Should be private, see below.</span>
-<a name="l01589"></a>01589
-<a name="l01590"></a>01590 <span class="keyword">private</span>:
-<a name="l01591"></a>01591
-<a name="l01592"></a>01592 <span class="preprocessor">#if 0 // *** VS.Net and gcc seem to not handle the friend declarations properly.</span>
-<a name="l01593"></a>01593 <span class="preprocessor"></span> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classTXMPIterator.html">TXMPIterator</a> &lt;class tStringObj&gt;;
-<a name="l01594"></a>01594 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classTXMPUtils.html">TXMPUtils</a> &lt;class tStringObj&gt;;
-<a name="l01595"></a>01595 <span class="preprocessor">#endif</span>
-<a name="l01596"></a>01596 <span class="preprocessor"></span>
-<a name="l01597"></a>01597 }; <span class="comment">// class TXMPMeta</span>
-<a name="l01598"></a>01598
-<a name="l01599"></a>01599 <span class="preprocessor">#endif // __TXMPMeta_hpp__</span>
-</pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:57 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/TXMPMeta_8hpp.html b/docs/XMPToolkit/TXMPMeta_8hpp.html
deleted file mode 100644
index 162e5eb..0000000
--- a/docs/XMPToolkit/TXMPMeta_8hpp.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: TXMPMeta.hpp File Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>TXMPMeta.hpp File Reference</h1>Template class for the XMP Toolkit core services. <a href="#_details">More...</a>
-<p>
-
-<p>
-<a href="TXMPMeta_8hpp-source.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Template class for the XMP Toolkit core services. <a href="classTXMPMeta.html#_details">More...</a><br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-Template class for the XMP Toolkit core services.
-<p>
-<a class="el" href="classTXMPMeta.html">TXMPMeta</a> is the template class providing the core services of the XMP Toolkit. It should be instantiated with a string class such as <code>std::string</code>. Please read the general toolkit usage notes for information about the overall architecture of the XMP API. <hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:58 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/TXMPMeta_8incl__cpp.html b/docs/XMPToolkit/TXMPMeta_8incl__cpp.html
deleted file mode 100644
index c0b862b..0000000
--- a/docs/XMPToolkit/TXMPMeta_8incl__cpp.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: TXMPMeta.incl_cpp File Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>TXMPMeta.incl_cpp File Reference</h1>The implementation of the <a class="el" href="classTXMPMeta.html">TXMPMeta</a> template class. <a href="#_details">More...</a>
-<p>
-<code>#include &quot;XMP.hpp&quot;</code><br>
-<code>#include &quot;client-glue/WXMP_Common.hpp&quot;</code><br>
-<code>#include &quot;client-glue/WXMPMeta.hpp&quot;</code><br>
-
-<p>
-Include dependency graph for TXMPMeta.incl_cpp:<p><center><img src="TXMPMeta_8incl__cpp__incl.png" border="0" usemap="#TXMPMeta.incl_cpp_map" alt=""></center>
-<table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-The implementation of the <a class="el" href="classTXMPMeta.html">TXMPMeta</a> template class.
-<p>
-<hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:58 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/TXMPMeta_8incl__cpp__incl.png b/docs/XMPToolkit/TXMPMeta_8incl__cpp__incl.png
deleted file mode 100644
index f453f8c..0000000
--- a/docs/XMPToolkit/TXMPMeta_8incl__cpp__incl.png
+++ /dev/null
Binary files differ
diff --git a/docs/XMPToolkit/TXMPUtils_8hpp-source.html b/docs/XMPToolkit/TXMPUtils_8hpp-source.html
deleted file mode 100644
index 5b4777c..0000000
--- a/docs/XMPToolkit/TXMPUtils_8hpp-source.html
+++ /dev/null
@@ -1,360 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: TXMPUtils.hpp Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>TXMPUtils.hpp</h1><a href="TXMPUtils_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef __TXMPUtils_hpp__</span>
-<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define __TXMPUtils_hpp__ 1</span>
-<a name="l00003"></a>00003 <span class="preprocessor"></span>
-<a name="l00004"></a>00004 <span class="preprocessor">#if ( ! __XMP_hpp__ )</span>
-<a name="l00005"></a>00005 <span class="preprocessor"></span><span class="preprocessor"> #error "Do not directly include, use XMP.hpp"</span>
-<a name="l00006"></a>00006 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00007"></a>00007 <span class="preprocessor"></span>
-<a name="l00008"></a>00008 <span class="comment">// =================================================================================================</span>
-<a name="l00009"></a>00009 <span class="comment">// ADOBE SYSTEMS INCORPORATED</span>
-<a name="l00010"></a>00010 <span class="comment">// Copyright 2002-2007 Adobe Systems Incorporated</span>
-<a name="l00011"></a>00011 <span class="comment">// All Rights Reserved</span>
-<a name="l00012"></a>00012 <span class="comment">//</span>
-<a name="l00013"></a>00013 <span class="comment">// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms</span>
-<a name="l00014"></a>00014 <span class="comment">// of the Adobe license agreement accompanying it.</span>
-<a name="l00015"></a>00015 <span class="comment">// =================================================================================================</span>
-<a name="l00016"></a>00016
-<a name="l00017"></a>00017 <span class="comment">// ================================================================================================</span>
-<a name="l00024"></a>00024 <span class="comment"></span><span class="comment">// ================================================================================================</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="comment">// ================================================================================================</span>
-<a name="l00041"></a>00041 <span class="comment"></span><span class="comment">// ================================================================================================</span>
-<a name="l00042"></a>00042
-<a name="l00043"></a>00043 <span class="keyword">template</span> &lt;<span class="keyword">class</span> tStringObj&gt;
-<a name="l00044"></a><a class="code" href="classTXMPUtils.html">00044</a> <span class="keyword">class </span><a class="code" href="classTXMPUtils.html">TXMPUtils</a> {
-<a name="l00045"></a>00045
-<a name="l00046"></a>00046 <span class="keyword">public</span>:
-<a name="l00047"></a>00047
-<a name="l00048"></a>00048 <span class="comment">// =============================================================================================</span>
-<a name="l00049"></a>00049 <span class="comment">// No constructors or destructor declared or needed</span>
-<a name="l00050"></a>00050 <span class="comment">// ================================================</span>
-<a name="l00051"></a>00051
-<a name="l00052"></a>00052 <span class="comment">// =============================================================================================</span>
-<a name="l00053"></a>00053 <span class="comment">// =============================================================================================</span>
-<a name="l00054"></a>00054
-<a name="l00055"></a>00055 <span class="comment">// ============================================================================================</span>
-<a name="l00087"></a>00087 <span class="comment"></span>
-<a name="l00088"></a>00088 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00103"></a>00103 <span class="comment"></span>
-<a name="l00104"></a>00104 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00105"></a>00105 <a class="code" href="classTXMPUtils.html#47fa195aa2e1457aa1f74f7e1ed06da6">ComposeArrayItemPath</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00106"></a>00106 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName,
-<a name="l00107"></a>00107 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex,
-<a name="l00108"></a>00108 tStringObj * fullPath );
-<a name="l00109"></a>00109
-<a name="l00110"></a>00110 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00126"></a>00126 <span class="comment"></span>
-<a name="l00127"></a>00127 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00128"></a>00128 <a class="code" href="classTXMPUtils.html#706eb85b8401b8682a01348f7e25ee3d">ComposeStructFieldPath</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00129"></a>00129 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName,
-<a name="l00130"></a>00130 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS,
-<a name="l00131"></a>00131 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName,
-<a name="l00132"></a>00132 tStringObj * fullPath );
-<a name="l00133"></a>00133
-<a name="l00134"></a>00134 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00152"></a>00152 <span class="comment"></span>
-<a name="l00153"></a>00153 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00154"></a>00154 <a class="code" href="classTXMPUtils.html#40ae0ce2065fcb71725e37137884e172">ComposeQualifierPath</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00155"></a>00155 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
-<a name="l00156"></a>00156 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS,
-<a name="l00157"></a>00157 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName,
-<a name="l00158"></a>00158 tStringObj * fullPath );
-<a name="l00159"></a>00159
-<a name="l00160"></a>00160 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00184"></a>00184 <span class="comment"></span>
-<a name="l00185"></a>00185 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00186"></a>00186 <a class="code" href="classTXMPUtils.html#e4989e5c199a2a4287ee3ae89b872e69">ComposeLangSelector</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00187"></a>00187 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName,
-<a name="l00188"></a>00188 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> langName,
-<a name="l00189"></a>00189 tStringObj * fullPath );
-<a name="l00190"></a>00190
-<a name="l00191"></a>00191 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00194"></a>00194 <span class="comment"></span>
-<a name="l00195"></a>00195 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00196"></a>00196 <a class="code" href="classTXMPUtils.html#e4989e5c199a2a4287ee3ae89b872e69">ComposeLangSelector</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00197"></a>00197 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName,
-<a name="l00198"></a>00198 <span class="keyword">const</span> tStringObj &amp; langName,
-<a name="l00199"></a>00199 tStringObj * fullPath );
-<a name="l00200"></a>00200
-<a name="l00201"></a>00201 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00235"></a>00235 <span class="comment"></span>
-<a name="l00236"></a>00236 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00237"></a>00237 <a class="code" href="classTXMPUtils.html#458f8e8729e2334fe54ca8f691a9db23">ComposeFieldSelector</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00238"></a>00238 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName,
-<a name="l00239"></a>00239 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS,
-<a name="l00240"></a>00240 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName,
-<a name="l00241"></a>00241 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldValue,
-<a name="l00242"></a>00242 tStringObj * fullPath );
-<a name="l00243"></a>00243
-<a name="l00244"></a>00244 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00247"></a>00247 <span class="comment"></span>
-<a name="l00248"></a>00248 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00249"></a>00249 <a class="code" href="classTXMPUtils.html#458f8e8729e2334fe54ca8f691a9db23">ComposeFieldSelector</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00250"></a>00250 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName,
-<a name="l00251"></a>00251 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS,
-<a name="l00252"></a>00252 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName,
-<a name="l00253"></a>00253 <span class="keyword">const</span> tStringObj &amp; fieldValue,
-<a name="l00254"></a>00254 tStringObj * fullPath );
-<a name="l00255"></a>00255
-<a name="l00257"></a>00257
-<a name="l00258"></a>00258 <span class="comment">// =============================================================================================</span>
-<a name="l00259"></a>00259 <span class="comment">// =============================================================================================</span>
-<a name="l00260"></a>00260
-<a name="l00261"></a>00261 <span class="comment">// ============================================================================================</span>
-<a name="l00264"></a>00264 <span class="comment"></span>
-<a name="l00265"></a>00265 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00272"></a>00272 <span class="comment"></span>
-<a name="l00273"></a>00273 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00274"></a>00274 <a class="code" href="classTXMPUtils.html#509691eb270988de6a770c9c8304ab6b">ConvertFromBool</a> ( <span class="keywordtype">bool</span> binValue,
-<a name="l00275"></a>00275 tStringObj * strValue );
-<a name="l00276"></a>00276
-<a name="l00277"></a>00277 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00285"></a>00285 <span class="comment"></span>
-<a name="l00286"></a>00286 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00287"></a>00287 <a class="code" href="classTXMPUtils.html#eec45b4d1a26717290105c9f4e8b4235">ConvertFromInt</a> ( <span class="keywordtype">long</span> binValue,
-<a name="l00288"></a>00288 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> format,
-<a name="l00289"></a>00289 tStringObj * strValue );
-<a name="l00290"></a>00290
-<a name="l00291"></a>00291 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00292"></a>00292 ConvertFromInt64 ( <span class="keywordtype">long</span> <span class="keywordtype">long</span> binValue,
-<a name="l00293"></a>00293 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> format,
-<a name="l00294"></a>00294 tStringObj * strValue );
-<a name="l00295"></a>00295
-<a name="l00296"></a>00296 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00304"></a>00304 <span class="comment"></span>
-<a name="l00305"></a>00305 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00306"></a>00306 <a class="code" href="classTXMPUtils.html#e67ef3931836432b7e574832f0610ed0">ConvertFromFloat</a> ( <span class="keywordtype">double</span> binValue,
-<a name="l00307"></a>00307 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> format,
-<a name="l00308"></a>00308 tStringObj * strValue );
-<a name="l00309"></a>00309
-<a name="l00310"></a>00310 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00339"></a>00339 <span class="comment"></span>
-<a name="l00340"></a>00340 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00341"></a>00341 <a class="code" href="classTXMPUtils.html#6146a522a3974b4088d6e8241e9cd223">ConvertFromDate</a> ( <span class="keyword">const</span> <a class="code" href="structXMP__DateTime.html">XMP_DateTime</a> &amp; binValue,
-<a name="l00342"></a>00342 tStringObj * strValue );
-<a name="l00343"></a>00343
-<a name="l00344"></a>00344 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00352"></a>00352 <span class="comment"></span>
-<a name="l00353"></a>00353 <span class="keyword">static</span> <span class="keywordtype">bool</span>
-<a name="l00354"></a>00354 <a class="code" href="classTXMPUtils.html#aaaaadb23f4089daa795f50cba4f405c">ConvertToBool</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> strValue );
-<a name="l00355"></a>00355
-<a name="l00356"></a>00356 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00359"></a>00359 <span class="comment"></span>
-<a name="l00360"></a>00360 <span class="keyword">static</span> <span class="keywordtype">bool</span>
-<a name="l00361"></a>00361 <a class="code" href="classTXMPUtils.html#aaaaadb23f4089daa795f50cba4f405c">ConvertToBool</a> ( <span class="keyword">const</span> tStringObj &amp; strValue );
-<a name="l00362"></a>00362
-<a name="l00363"></a>00363 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00369"></a>00369 <span class="comment"></span>
-<a name="l00370"></a>00370 <span class="keyword">static</span> <span class="keywordtype">long</span>
-<a name="l00371"></a>00371 <a class="code" href="classTXMPUtils.html#dfd9d1c522377d5db4ad667a7973ba00">ConvertToInt</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> strValue );
-<a name="l00372"></a>00372
-<a name="l00373"></a>00373 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00376"></a>00376 <span class="comment"></span>
-<a name="l00377"></a>00377 <span class="keyword">static</span> <span class="keywordtype">long</span>
-<a name="l00378"></a>00378 <a class="code" href="classTXMPUtils.html#dfd9d1c522377d5db4ad667a7973ba00">ConvertToInt</a> ( <span class="keyword">const</span> tStringObj &amp; strValue );
-<a name="l00379"></a>00379
-<a name="l00380"></a>00380 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00386"></a>00386 <span class="comment"></span>
-<a name="l00387"></a>00387 <span class="keyword">static</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>
-<a name="l00388"></a>00388 <a class="code" href="classTXMPUtils.html#be5d2dcc03c5442202203bba5ca7b172">ConvertToInt64</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> strValue );
-<a name="l00389"></a>00389
-<a name="l00390"></a>00390 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00393"></a>00393 <span class="comment"></span>
-<a name="l00394"></a>00394 <span class="keyword">static</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>
-<a name="l00395"></a>00395 <a class="code" href="classTXMPUtils.html#be5d2dcc03c5442202203bba5ca7b172">ConvertToInt64</a> ( <span class="keyword">const</span> tStringObj &amp; strValue );
-<a name="l00396"></a>00396
-<a name="l00397"></a>00397 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00403"></a>00403 <span class="comment"></span>
-<a name="l00404"></a>00404 <span class="keyword">static</span> <span class="keywordtype">double</span>
-<a name="l00405"></a>00405 <a class="code" href="classTXMPUtils.html#8a507b006286460814e0486c622d828c">ConvertToFloat</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> strValue );
-<a name="l00406"></a>00406
-<a name="l00407"></a>00407 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00410"></a>00410 <span class="comment"></span>
-<a name="l00411"></a>00411 <span class="keyword">static</span> <span class="keywordtype">double</span>
-<a name="l00412"></a>00412 <a class="code" href="classTXMPUtils.html#8a507b006286460814e0486c622d828c">ConvertToFloat</a> ( <span class="keyword">const</span> tStringObj &amp; strValue );
-<a name="l00413"></a>00413
-<a name="l00414"></a>00414 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00444"></a>00444 <span class="comment"></span>
-<a name="l00445"></a>00445 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00446"></a>00446 <a class="code" href="classTXMPUtils.html#60d33e6ce30286028acca47b2b6e7a0b">ConvertToDate</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> strValue,
-<a name="l00447"></a>00447 <a class="code" href="structXMP__DateTime.html">XMP_DateTime</a> * binValue );
-<a name="l00448"></a>00448
-<a name="l00449"></a>00449 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00452"></a>00452 <span class="comment"></span>
-<a name="l00453"></a>00453 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00454"></a>00454 <a class="code" href="classTXMPUtils.html#60d33e6ce30286028acca47b2b6e7a0b">ConvertToDate</a> ( <span class="keyword">const</span> tStringObj &amp; strValue,
-<a name="l00455"></a>00455 <a class="code" href="structXMP__DateTime.html">XMP_DateTime</a> * binValue );
-<a name="l00456"></a>00456
-<a name="l00458"></a>00458
-<a name="l00459"></a>00459 <span class="comment">// =============================================================================================</span>
-<a name="l00460"></a>00460 <span class="comment">// =============================================================================================</span>
-<a name="l00461"></a>00461
-<a name="l00462"></a>00462 <span class="comment">// ============================================================================================</span>
-<a name="l00465"></a>00465 <span class="comment"></span>
-<a name="l00466"></a>00466 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00472"></a>00472 <span class="comment"></span>
-<a name="l00473"></a>00473 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00474"></a>00474 <a class="code" href="classTXMPUtils.html#c83f0b963ea64d7eee0b481e15a8439c">CurrentDateTime</a> ( <a class="code" href="structXMP__DateTime.html">XMP_DateTime</a> * time );
-<a name="l00475"></a>00475
-<a name="l00476"></a>00476 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00481"></a>00481 <span class="comment"></span>
-<a name="l00482"></a>00482 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00483"></a>00483 <a class="code" href="classTXMPUtils.html#96bcc45febac55f6c49951815b7de2ef">SetTimeZone</a> ( <a class="code" href="structXMP__DateTime.html">XMP_DateTime</a> * time );
-<a name="l00484"></a>00484
-<a name="l00485"></a>00485 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00490"></a>00490 <span class="comment"></span>
-<a name="l00491"></a>00491 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00492"></a>00492 <a class="code" href="classTXMPUtils.html#bbd4d691c83287ea2fc6b1e33e5858b8">ConvertToUTCTime</a> ( <a class="code" href="structXMP__DateTime.html">XMP_DateTime</a> * time );
-<a name="l00493"></a>00493
-<a name="l00494"></a>00494 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00499"></a>00499 <span class="comment"></span>
-<a name="l00500"></a>00500 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00501"></a>00501 <a class="code" href="classTXMPUtils.html#61852aaba494c8fbad5a6c0c4caf21f5">ConvertToLocalTime</a> ( <a class="code" href="structXMP__DateTime.html">XMP_DateTime</a> * time );
-<a name="l00502"></a>00502
-<a name="l00503"></a>00503 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00514"></a>00514 <span class="comment"></span>
-<a name="l00515"></a>00515 <span class="keyword">static</span> <span class="keywordtype">int</span>
-<a name="l00516"></a>00516 <a class="code" href="classTXMPUtils.html#9fc7f1771032f59f9020aeda4f91991d">CompareDateTime</a> ( <span class="keyword">const</span> <a class="code" href="structXMP__DateTime.html">XMP_DateTime</a> &amp; left,
-<a name="l00517"></a>00517 <span class="keyword">const</span> <a class="code" href="structXMP__DateTime.html">XMP_DateTime</a> &amp; right );
-<a name="l00518"></a>00518
-<a name="l00520"></a>00520
-<a name="l00521"></a>00521 <span class="comment">// =============================================================================================</span>
-<a name="l00522"></a>00522 <span class="comment">// =============================================================================================</span>
-<a name="l00523"></a>00523
-<a name="l00524"></a>00524 <span class="comment">// ============================================================================================</span>
-<a name="l00527"></a>00527 <span class="comment"></span>
-<a name="l00528"></a>00528 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00536"></a>00536 <span class="comment"></span>
-<a name="l00537"></a>00537 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00538"></a>00538 <a class="code" href="classTXMPUtils.html#ef3b23bbc152480f699e269620ecad4a">EncodeToBase64</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> rawStr,
-<a name="l00539"></a>00539 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> rawLen,
-<a name="l00540"></a>00540 tStringObj * encodedStr );
-<a name="l00541"></a>00541
-<a name="l00542"></a>00542 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00545"></a>00545 <span class="comment"></span>
-<a name="l00546"></a>00546 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00547"></a>00547 <a class="code" href="classTXMPUtils.html#ef3b23bbc152480f699e269620ecad4a">EncodeToBase64</a> ( <span class="keyword">const</span> tStringObj &amp; rawStr,
-<a name="l00548"></a>00548 tStringObj * encodedStr );
-<a name="l00549"></a>00549
-<a name="l00550"></a>00550 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00558"></a>00558 <span class="comment"></span>
-<a name="l00559"></a>00559 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00560"></a>00560 <a class="code" href="classTXMPUtils.html#e5bdd91c0c3ee9262dc0a8b9f591b921">DecodeFromBase64</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> encodedStr,
-<a name="l00561"></a>00561 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> encodedLen,
-<a name="l00562"></a>00562 tStringObj * rawStr );
-<a name="l00563"></a>00563
-<a name="l00564"></a>00564 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00567"></a>00567 <span class="comment"></span>
-<a name="l00568"></a>00568 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00569"></a>00569 <a class="code" href="classTXMPUtils.html#e5bdd91c0c3ee9262dc0a8b9f591b921">DecodeFromBase64</a> ( <span class="keyword">const</span> tStringObj &amp; encodedStr,
-<a name="l00570"></a>00570 tStringObj * rawStr );
-<a name="l00571"></a>00571
-<a name="l00573"></a>00573
-<a name="l00574"></a>00574 <span class="comment">// =============================================================================================</span>
-<a name="l00575"></a>00575 <span class="comment">// =============================================================================================</span>
-<a name="l00576"></a>00576
-<a name="l00577"></a>00577 <span class="comment">// ============================================================================================</span>
-<a name="l00582"></a>00582 <span class="comment"></span>
-<a name="l00583"></a>00583 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00595"></a>00595 <span class="comment"></span>
-<a name="l00596"></a>00596 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00597"></a>00597 <a class="code" href="classTXMPUtils.html#6001b4ff54c60fdf0c40e6b78a5c457a">PackageForJPEG</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html">TXMPMeta&lt;tStringObj&gt;</a> &amp; xmpObj,
-<a name="l00598"></a>00598 tStringObj * standardXMP,
-<a name="l00599"></a>00599 tStringObj * extendedXMP,
-<a name="l00600"></a>00600 tStringObj * extendedDigest );
-<a name="l00601"></a>00601
-<a name="l00602"></a>00602 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00608"></a>00608 <span class="comment"></span>
-<a name="l00609"></a>00609 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00610"></a>00610 <a class="code" href="classTXMPUtils.html#6187cd5fef0eccecac6805d4114dcd2e">MergeFromJPEG</a> ( <a class="code" href="classTXMPMeta.html">TXMPMeta&lt;tStringObj&gt;</a> * fullXMP,
-<a name="l00611"></a>00611 <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html">TXMPMeta&lt;tStringObj&gt;</a> &amp; extendedXMP );
-<a name="l00612"></a>00612
-<a name="l00614"></a>00614
-<a name="l00615"></a>00615 <span class="comment">// =============================================================================================</span>
-<a name="l00616"></a>00616 <span class="comment">// =============================================================================================</span>
-<a name="l00617"></a>00617
-<a name="l00618"></a>00618 <span class="comment">// ============================================================================================</span>
-<a name="l00622"></a>00622 <span class="comment"></span>
-<a name="l00623"></a>00623 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00644"></a>00644 <span class="comment"></span>
-<a name="l00645"></a>00645 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00646"></a>00646 <a class="code" href="classTXMPUtils.html#d7e1aa7928252fb88a24fb5c3aef22ba">CatenateArrayItems</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html">TXMPMeta&lt;tStringObj&gt;</a> &amp; xmpObj,
-<a name="l00647"></a>00647 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00648"></a>00648 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName,
-<a name="l00649"></a>00649 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> separator,
-<a name="l00650"></a>00650 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> quotes,
-<a name="l00651"></a>00651 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options,
-<a name="l00652"></a>00652 tStringObj * catedStr );
-<a name="l00653"></a>00653
-<a name="l00654"></a>00654 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00669"></a>00669 <span class="comment"></span>
-<a name="l00670"></a>00670 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00671"></a>00671 <a class="code" href="classTXMPUtils.html#66c5ddee47aa36ed906353f94ca18d2e">SeparateArrayItems</a> ( <a class="code" href="classTXMPMeta.html">TXMPMeta&lt;tStringObj&gt;</a> * xmpObj,
-<a name="l00672"></a>00672 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00673"></a>00673 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName,
-<a name="l00674"></a>00674 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options,
-<a name="l00675"></a>00675 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> catedStr );
-<a name="l00676"></a>00676
-<a name="l00677"></a>00677 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00680"></a>00680 <span class="comment"></span>
-<a name="l00681"></a>00681 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00682"></a>00682 <a class="code" href="classTXMPUtils.html#66c5ddee47aa36ed906353f94ca18d2e">SeparateArrayItems</a> ( <a class="code" href="classTXMPMeta.html">TXMPMeta&lt;tStringObj&gt;</a> * xmpObj,
-<a name="l00683"></a>00683 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
-<a name="l00684"></a>00684 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName,
-<a name="l00685"></a>00685 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options,
-<a name="l00686"></a>00686 <span class="keyword">const</span> tStringObj &amp; catedStr );
-<a name="l00687"></a>00687
-<a name="l00688"></a>00688 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00719"></a>00719 <span class="comment"></span>
-<a name="l00720"></a>00720 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00721"></a>00721 <a class="code" href="classTXMPUtils.html#40c645803530662e08d042b4b7c6190d">RemoveProperties</a> ( <a class="code" href="classTXMPMeta.html">TXMPMeta&lt;tStringObj&gt;</a> * xmpObj,
-<a name="l00722"></a>00722 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS = 0,
-<a name="l00723"></a>00723 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName = 0,
-<a name="l00724"></a>00724 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l00725"></a>00725
-<a name="l00726"></a>00726 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00800"></a>00800 <span class="comment"></span>
-<a name="l00801"></a>00801 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00802"></a>00802 <a class="code" href="classTXMPUtils.html#4795244ffcbda927800f789b0e40c262">AppendProperties</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html">TXMPMeta&lt;tStringObj&gt;</a> &amp; source,
-<a name="l00803"></a>00803 <a class="code" href="classTXMPMeta.html">TXMPMeta&lt;tStringObj&gt;</a> * dest,
-<a name="l00804"></a>00804 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l00805"></a>00805
-<a name="l00806"></a>00806 <span class="comment">// --------------------------------------------------------------------------------------------</span>
-<a name="l00826"></a>00826 <span class="comment"></span>
-<a name="l00827"></a>00827 <span class="keyword">static</span> <span class="keywordtype">void</span>
-<a name="l00828"></a>00828 <a class="code" href="classTXMPUtils.html#a17838f062e5414bc0929f67ac94a3aa">DuplicateSubtree</a> ( <span class="keyword">const</span> <a class="code" href="classTXMPMeta.html">TXMPMeta&lt;tStringObj&gt;</a> &amp; source,
-<a name="l00829"></a>00829 <a class="code" href="classTXMPMeta.html">TXMPMeta&lt;tStringObj&gt;</a> * dest,
-<a name="l00830"></a>00830 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> sourceNS,
-<a name="l00831"></a>00831 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> sourceRoot,
-<a name="l00832"></a>00832 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> destNS = 0,
-<a name="l00833"></a>00833 <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> destRoot = 0,
-<a name="l00834"></a>00834 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options = 0 );
-<a name="l00835"></a>00835
-<a name="l00836"></a>00836
-<a name="l00838"></a>00838
-<a name="l00839"></a>00839 <span class="comment">// =============================================================================================</span>
-<a name="l00840"></a>00840
-<a name="l00841"></a>00841 }; <span class="comment">// class TXMPUtils</span>
-<a name="l00842"></a>00842
-<a name="l00843"></a>00843 <span class="comment">// =================================================================================================</span>
-<a name="l00844"></a>00844
-<a name="l00845"></a>00845 <span class="preprocessor">#endif // __TXMPUtils_hpp__</span>
-</pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:57 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/TXMPUtils_8hpp.html b/docs/XMPToolkit/TXMPUtils_8hpp.html
deleted file mode 100644
index d0f1cea..0000000
--- a/docs/XMPToolkit/TXMPUtils_8hpp.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: TXMPUtils.hpp File Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>TXMPUtils.hpp File Reference</h1>Template class for the XMP Toolkit utility services. <a href="#_details">More...</a>
-<p>
-
-<p>
-<a href="TXMPUtils_8hpp-source.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Template class for the XMP Toolkit utility services. <a href="classTXMPUtils.html#_details">More...</a><br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-Template class for the XMP Toolkit utility services.
-<p>
-<code><a class="el" href="classTXMPUtils.html">TXMPUtils</a></code> is the template class providing utility services for the XMP Toolkit. It should be instantiated with a string class such as <code>std::string</code>. Please read the general toolkit usage notes for information about the overall architecture of the XMP API. <hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:58 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/TXMPUtils_8incl__cpp.html b/docs/XMPToolkit/TXMPUtils_8incl__cpp.html
deleted file mode 100644
index 40480d0..0000000
--- a/docs/XMPToolkit/TXMPUtils_8incl__cpp.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: TXMPUtils.incl_cpp File Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>TXMPUtils.incl_cpp File Reference</h1>The implementation of the <a class="el" href="classTXMPUtils.html">TXMPUtils</a> template class. <a href="#_details">More...</a>
-<p>
-<code>#include &quot;XMP.hpp&quot;</code><br>
-<code>#include &quot;client-glue/WXMP_Common.hpp&quot;</code><br>
-<code>#include &quot;client-glue/WXMPUtils.hpp&quot;</code><br>
-
-<p>
-Include dependency graph for TXMPUtils.incl_cpp:<p><center><img src="TXMPUtils_8incl__cpp__incl.png" border="0" usemap="#TXMPUtils.incl_cpp_map" alt=""></center>
-<table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-The implementation of the <a class="el" href="classTXMPUtils.html">TXMPUtils</a> template class.
-<p>
-<hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:58 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/TXMPUtils_8incl__cpp__incl.png b/docs/XMPToolkit/TXMPUtils_8incl__cpp__incl.png
deleted file mode 100644
index fc3f99c..0000000
--- a/docs/XMPToolkit/TXMPUtils_8incl__cpp__incl.png
+++ /dev/null
Binary files differ
diff --git a/docs/XMPToolkit/XMP_8incl__cpp.html b/docs/XMPToolkit/XMP_8incl__cpp.html
deleted file mode 100644
index 767a855..0000000
--- a/docs/XMPToolkit/XMP_8incl__cpp.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: XMP.incl_cpp File Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>XMP.incl_cpp File Reference</h1>Overall client glue file for the XMP toolkit. <a href="#_details">More...</a>
-<p>
-<code>#include &quot;XMP.hpp&quot;</code><br>
-
-<p>
-Include dependency graph for XMP.incl_cpp:<p><center><img src="XMP_8incl__cpp__incl.png" border="0" usemap="#XMP.incl_cpp_map" alt=""></center>
-<table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-Overall client glue file for the XMP toolkit.
-<p>
-This is an overall client source file of XMP toolkit glue, the only XMP-specific one that clients should build in projects. This ensures that all of the client-side glue code for the XMP toolkit gets compiled.<p>
-You cannot compile this file directly, because the template's string type must be declared and only the client can do that. Instead, include this in some other source file. For example, to use <code>std::string</code> you only need these two lines:<p>
-<div class="fragment"><pre class="fragment"><span class="preprocessor"> #include &lt;string&gt;</span>
-<span class="preprocessor"> #include "<a class="code" href="XMP_8incl__cpp.html">XMP.incl_cpp</a>"</span>
-</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:58 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/XMP_8incl__cpp__incl.png b/docs/XMPToolkit/XMP_8incl__cpp__incl.png
deleted file mode 100644
index 26f5616..0000000
--- a/docs/XMPToolkit/XMP_8incl__cpp__incl.png
+++ /dev/null
Binary files differ
diff --git a/docs/XMPToolkit/XMP__Const_8h-source.html b/docs/XMPToolkit/XMP__Const_8h-source.html
deleted file mode 100644
index be0823f..0000000
--- a/docs/XMPToolkit/XMP__Const_8h-source.html
+++ /dev/null
@@ -1,661 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: XMP_Const.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>XMP_Const.h</h1><a href="XMP__Const_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef __XMP_Const_h__</span>
-<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define __XMP_Const_h__ 1</span>
-<a name="l00003"></a>00003 <span class="preprocessor"></span>
-<a name="l00004"></a>00004 <span class="comment">/* --------------------------------------------------------------------------------------------- */</span>
-<a name="l00005"></a>00005 <span class="comment">/* ** IMPORTANT ** This file must be usable by strict ANSI C compilers. No "//" comments, etc. */</span>
-<a name="l00006"></a>00006 <span class="comment">/* --------------------------------------------------------------------------------------------- */</span>
-<a name="l00007"></a>00007
-<a name="l00008"></a>00008 <span class="comment">/*</span>
-<a name="l00009"></a>00009 <span class="comment">// =================================================================================================</span>
-<a name="l00010"></a>00010 <span class="comment">// Copyright 2002-2007 Adobe Systems Incorporated</span>
-<a name="l00011"></a>00011 <span class="comment">// All Rights Reserved.</span>
-<a name="l00012"></a>00012 <span class="comment">//</span>
-<a name="l00013"></a>00013 <span class="comment">// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms</span>
-<a name="l00014"></a>00014 <span class="comment">// of the Adobe license agreement accompanying it.</span>
-<a name="l00015"></a>00015 <span class="comment">// =================================================================================================</span>
-<a name="l00016"></a>00016 <span class="comment">*/</span>
-<a name="l00017"></a>00017
-<a name="l00018"></a>00018 <span class="preprocessor">#include "XMP_Environment.h"</span>
-<a name="l00019"></a>00019
-<a name="l00020"></a>00020 <span class="preprocessor"> #include &lt;stddef.h&gt;</span>
-<a name="l00021"></a>00021
-<a name="l00022"></a>00022 <span class="preprocessor">#if XMP_MacBuild </span><span class="comment">/* ! No stdint.h on Windows and some UNIXes. */</span>
-<a name="l00023"></a>00023 <span class="preprocessor"> #include &lt;stdint.h&gt;</span>
-<a name="l00024"></a>00024 <span class="preprocessor">#endif</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span>
-<a name="l00026"></a>00026 <span class="preprocessor">#if __cplusplus</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {
-<a name="l00028"></a>00028 <span class="preprocessor">#endif</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span>
-<a name="l00030"></a>00030
-<a name="l00037"></a>00037 <span class="comment">/* ============================================================================================== */</span>
-<a name="l00038"></a>00038 <span class="comment">/* Basic types and constants */</span>
-<a name="l00039"></a>00039 <span class="comment">/* ========================= */</span>
-<a name="l00040"></a>00040
-<a name="l00041"></a>00041 <span class="comment">/* The XMP_... types are used on the off chance that the ..._t types present a problem. In that */</span>
-<a name="l00042"></a>00042 <span class="comment">/* case only the declarations of the XMP_... types needs to change, not all of the uses. These */</span>
-<a name="l00043"></a>00043 <span class="comment">/* types are used where fixed sizes are required in order to have a known ABI for a DLL build. */</span>
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 <span class="preprocessor">#if XMP_MacBuild</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span>
-<a name="l00047"></a>00047 <span class="keyword">typedef</span> int8_t XMP_Int8;
-<a name="l00048"></a>00048 <span class="keyword">typedef</span> int16_t XMP_Int16;
-<a name="l00049"></a>00049 <span class="keyword">typedef</span> int32_t XMP_Int32;
-<a name="l00050"></a>00050 <span class="keyword">typedef</span> int64_t XMP_Int64;
-<a name="l00051"></a>00051
-<a name="l00052"></a>00052 <span class="keyword">typedef</span> uint8_t XMP_Uns8;
-<a name="l00053"></a>00053 <span class="keyword">typedef</span> uint16_t XMP_Uns16;
-<a name="l00054"></a>00054 <span class="keyword">typedef</span> uint32_t XMP_Uns32;
-<a name="l00055"></a>00055 <span class="keyword">typedef</span> uint64_t XMP_Uns64;
-<a name="l00056"></a>00056
-<a name="l00057"></a>00057 <span class="preprocessor">#else</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span>
-<a name="l00059"></a>00059 <span class="keyword">typedef</span> <span class="keywordtype">signed</span> <span class="keywordtype">char</span> XMP_Int8;
-<a name="l00060"></a>00060 <span class="keyword">typedef</span> <span class="keywordtype">signed</span> <span class="keywordtype">short</span> XMP_Int16;
-<a name="l00061"></a>00061 <span class="keyword">typedef</span> <span class="keywordtype">signed</span> <span class="keywordtype">long</span> XMP_Int32;
-<a name="l00062"></a>00062 <span class="keyword">typedef</span> <span class="keywordtype">signed</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> XMP_Int64;
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> XMP_Uns8;
-<a name="l00065"></a>00065 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> XMP_Uns16;
-<a name="l00066"></a>00066 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> XMP_Uns32;
-<a name="l00067"></a>00067 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> XMP_Uns64;
-<a name="l00068"></a>00068
-<a name="l00069"></a>00069 <span class="preprocessor">#endif</span>
-<a name="l00070"></a>00070 <span class="preprocessor"></span>
-<a name="l00071"></a>00071 <span class="keyword">typedef</span> XMP_Uns8 XMP_Bool;
-<a name="l00072"></a>00072
-<a name="l00073"></a>00073 <span class="comment">/* Typedefs to preserve old, unfortunate spellings: */</span>
-<a name="l00074"></a>00074
-<a name="l00075"></a>00075 <span class="preprocessor">#if 0 </span><span class="comment">/* *** Enable after internal compiles work. */</span>
-<a name="l00076"></a>00076 <span class="keyword">typedef</span> XMP_Int8 XMPInt8;
-<a name="l00077"></a>00077 <span class="keyword">typedef</span> XMP_Int16 XMPInt16;
-<a name="l00078"></a>00078 <span class="keyword">typedef</span> XMP_Int32 XMPInt32;
-<a name="l00079"></a>00079 <span class="keyword">typedef</span> XMP_Int64 XMPInt64;
-<a name="l00080"></a>00080 <span class="keyword">typedef</span> XMP_Uns8 XMPUns8;
-<a name="l00081"></a>00081 <span class="keyword">typedef</span> XMP_Uns16 XMPUns16;
-<a name="l00082"></a>00082 <span class="keyword">typedef</span> XMP_Uns32 XMPUns32;
-<a name="l00083"></a>00083 <span class="keyword">typedef</span> XMP_Uns64 XMPUns64;
-<a name="l00084"></a>00084 <span class="keyword">typedef</span> XMP_Bool XMPBool;
-<a name="l00085"></a>00085 <span class="preprocessor">#endif</span>
-<a name="l00086"></a>00086 <span class="preprocessor"></span>
-<a name="l00095"></a><a class="code" href="XMP__Const_8h.html#5912613564f80e17eb10acef9236f70a">00095</a> <span class="keyword">typedef</span> <span class="keyword">struct </span>__XMPMeta__ * <a class="code" href="XMP__Const_8h.html#5912613564f80e17eb10acef9236f70a">XMPMetaRef</a>;
-<a name="l00096"></a>00096 <span class="keyword">typedef</span> <span class="keyword">struct </span>__XMPIterator__ * XMPIteratorRef;
-<a name="l00097"></a>00097 <span class="keyword">typedef</span> <span class="keyword">struct </span>__XMPFiles__ * XMPFilesRef;
-<a name="l00098"></a>00098
-<a name="l00099"></a>00099 <span class="comment">/* ============================================================================================== */</span>
-<a name="l00100"></a>00100
-<a name="l00132"></a><a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">00132</a> <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>; <span class="comment">/* Points to a null terminated UTF-8 string. */</span>
-<a name="l00133"></a><a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">00133</a> <span class="keyword">typedef</span> XMP_Uns32 <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a>;
-<a name="l00134"></a><a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">00134</a> <span class="keyword">typedef</span> XMP_Int32 <a class="code" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>; <span class="comment">/* Signed, sometimes -1 is handy. */</span>
-<a name="l00135"></a><a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">00135</a> <span class="keyword">typedef</span> XMP_Uns32 <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>; <span class="comment">/* Used as 32 individual bits. */</span>
-<a name="l00136"></a>00136
-<a name="l00149"></a><a class="code" href="XMP__Const_8h.html#4c39e0131b0e3d7db66e1cfa82b67141">00149</a> <span class="preprocessor">#define kXMP_TrueStr "True" </span><span class="comment">/* Serialized XMP spellings, not for the type bool. */</span>
-<a name="l00150"></a><a class="code" href="XMP__Const_8h.html#2dc55b533ed63ed7ff0c3be16a97e278">00150</a> <span class="preprocessor">#define kXMP_FalseStr "False"</span>
-<a name="l00151"></a>00151 <span class="preprocessor"></span>
-<a name="l00156"></a>00156 <span class="comment">/* ============================================================================================== */</span>
-<a name="l00157"></a>00157
-<a name="l00190"></a><a class="code" href="structXMP__DateTime.html">00190</a> <span class="keyword">struct </span><a class="code" href="structXMP__DateTime.html">XMP_DateTime</a> {
-<a name="l00191"></a>00191 XMP_Int32 year;
-<a name="l00192"></a>00192 XMP_Int32 month; <span class="comment">/* 1..12 */</span>
-<a name="l00193"></a>00193 XMP_Int32 day; <span class="comment">/* 1..31 */</span>
-<a name="l00194"></a>00194 XMP_Int32 hour; <span class="comment">/* 0..23 */</span>
-<a name="l00195"></a>00195 XMP_Int32 minute; <span class="comment">/* 0..59 */</span>
-<a name="l00196"></a>00196 XMP_Int32 second; <span class="comment">/* 0..59 */</span>
-<a name="l00197"></a>00197 XMP_Int32 tzSign; <span class="comment">/* -1..+1, 0 means UTC, -1 is west, +1 is east. */</span>
-<a name="l00198"></a>00198 XMP_Int32 tzHour; <span class="comment">/* 0..23 */</span>
-<a name="l00199"></a>00199 XMP_Int32 tzMinute; <span class="comment">/* 0..59 */</span>
-<a name="l00200"></a>00200 XMP_Int32 nanoSecond;
-<a name="l00201"></a>00201 };
-<a name="l00202"></a>00202
-<a name="l00203"></a>00203 <span class="keyword">enum</span> { <span class="comment">/* Values used for tzSign field. */</span>
-<a name="l00204"></a>00204 kXMP_TimeWestOfUTC = -1,
-<a name="l00205"></a>00205 kXMP_TimeIsUTC = 0,
-<a name="l00206"></a>00206 kXMP_TimeEastOfUTC = +1
-<a name="l00207"></a>00207 };
-<a name="l00208"></a>00208
-<a name="l00209"></a>00209
-<a name="l00210"></a>00210 <span class="comment">/* ============================================================================================== */</span>
-<a name="l00211"></a>00211 <span class="comment">/* Standard namespace URI constants */</span>
-<a name="l00212"></a>00212 <span class="comment">/* ================================ */</span>
-<a name="l00213"></a>00213
-<a name="l00273"></a><a class="code" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">00273</a> <span class="preprocessor">#define kXMP_NS_XMP "http://ns.adobe.com/xap/1.0/"</span>
-<a name="l00274"></a>00274 <span class="preprocessor"></span>
-<a name="l00275"></a><a class="code" href="XMP__Const_8h.html#e52d761e5a4fc8c8499215d2f3d82b90">00275</a> <span class="preprocessor">#define kXMP_NS_XMP_Rights "http://ns.adobe.com/xap/1.0/rights/"</span>
-<a name="l00276"></a><a class="code" href="XMP__Const_8h.html#c67379a9ffa425d0d7976a51c4f2f754">00276</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_MM "http://ns.adobe.com/xap/1.0/mm/"</span>
-<a name="l00277"></a><a class="code" href="XMP__Const_8h.html#308e156c325618acb2172e550929ebee">00277</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_BJ "http://ns.adobe.com/xap/1.0/bj/"</span>
-<a name="l00278"></a>00278 <span class="preprocessor"></span>
-<a name="l00279"></a><a class="code" href="XMP__Const_8h.html#0bcb67d0dd0922504e3da7ca5c40c82a">00279</a> <span class="preprocessor">#define kXMP_NS_PDF "http://ns.adobe.com/pdf/1.3/"</span>
-<a name="l00280"></a><a class="code" href="XMP__Const_8h.html#a1a6f38ebfcdb281c5bf2809859167c7">00280</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_Photoshop "http://ns.adobe.com/photoshop/1.0/"</span>
-<a name="l00281"></a>00281 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_PSAlbum "http://ns.adobe.com/album/1.0/"</span>
-<a name="l00282"></a><a class="code" href="XMP__Const_8h.html#d12182e1df1652f56b5eec60c1fcdd8f">00282</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_EXIF "http://ns.adobe.com/exif/1.0/"</span>
-<a name="l00283"></a>00283 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_EXIF_Aux "http://ns.adobe.com/exif/1.0/aux/"</span>
-<a name="l00284"></a><a class="code" href="XMP__Const_8h.html#673355818b7b9224e8fec0fbc60ba00c">00284</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_TIFF "http://ns.adobe.com/tiff/1.0/"</span>
-<a name="l00285"></a>00285 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_PNG "http://ns.adobe.com/png/1.0/"</span>
-<a name="l00286"></a>00286 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_SWF "http://ns.adobe.com/swf/1.0/"</span>
-<a name="l00287"></a>00287 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_JPEG "http://ns.adobe.com/jpeg/1.0/"</span>
-<a name="l00288"></a>00288 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_JP2K "http://ns.adobe.com/jp2k/1.0/"</span>
-<a name="l00289"></a>00289 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_CameraRaw "http://ns.adobe.com/camera-raw-settings/1.0/"</span>
-<a name="l00290"></a>00290 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_DM "http://ns.adobe.com/xmp/1.0/DynamicMedia/"</span>
-<a name="l00291"></a>00291 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_ASF "http://ns.adobe.com/asf/1.0/"</span>
-<a name="l00292"></a>00292 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_WAV "http://ns.adobe.com/xmp/wav/1.0/"</span>
-<a name="l00293"></a>00293 <span class="preprocessor"></span>
-<a name="l00294"></a>00294 <span class="preprocessor">#define kXMP_NS_XMP_Note "http://ns.adobe.com/xmp/note/"</span>
-<a name="l00295"></a>00295 <span class="preprocessor"></span>
-<a name="l00296"></a>00296 <span class="preprocessor">#define kXMP_NS_AdobeStockPhoto "http://ns.adobe.com/StockPhoto/1.0/"</span>
-<a name="l00297"></a>00297 <span class="preprocessor"></span>
-<a name="l00342"></a><a class="code" href="XMP__Const_8h.html#b466db52a4b85cecfa04710682c1e671">00342</a> <span class="preprocessor">#define kXMP_NS_XMP_IdentifierQual "http://ns.adobe.com/xmp/Identifier/qual/1.0/"</span>
-<a name="l00343"></a><a class="code" href="XMP__Const_8h.html#9618e013619aa92ebc808b62243d2ba8">00343</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_Dimensions "http://ns.adobe.com/xap/1.0/sType/Dimensions#"</span>
-<a name="l00344"></a>00344 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_Text "http://ns.adobe.com/xap/1.0/t/"</span>
-<a name="l00345"></a>00345 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_PagedFile "http://ns.adobe.com/xap/1.0/t/pg/"</span>
-<a name="l00346"></a>00346 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_Graphics "http://ns.adobe.com/xap/1.0/g/"</span>
-<a name="l00347"></a><a class="code" href="XMP__Const_8h.html#935641acc7d01e782ad7a457a7ff338b">00347</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_Image "http://ns.adobe.com/xap/1.0/g/img/"</span>
-<a name="l00348"></a>00348 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_Font "http://ns.adobe.com/xap/1.0/sType/Font#"</span>
-<a name="l00349"></a><a class="code" href="XMP__Const_8h.html#861613273127156050b456eee11f6b0a">00349</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_ResourceEvent "http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"</span>
-<a name="l00350"></a><a class="code" href="XMP__Const_8h.html#9bf51f2653400645f7b5087e8c4e1c77">00350</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_ResourceRef "http://ns.adobe.com/xap/1.0/sType/ResourceRef#"</span>
-<a name="l00351"></a><a class="code" href="XMP__Const_8h.html#b4923bed71ab29c6aa88debe8816c0a2">00351</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_ST_Version "http://ns.adobe.com/xap/1.0/sType/Version#"</span>
-<a name="l00352"></a><a class="code" href="XMP__Const_8h.html#c7dc4d65bcbba2862e410cc8cfdff6f6">00352</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_ST_Job "http://ns.adobe.com/xap/1.0/sType/Job#"</span>
-<a name="l00353"></a>00353 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_ManifestItem "http://ns.adobe.com/xap/1.0/sType/ManifestItem#"</span>
-<a name="l00354"></a>00354 <span class="preprocessor"></span>
-<a name="l00355"></a>00355 <span class="comment">/* Deprecated constant names */</span>
-<a name="l00356"></a><a class="code" href="XMP__Const_8h.html#0a2d9c5f7beb27553214a7ad1df4f27e">00356</a> <span class="preprocessor">#define kXMP_NS_XMP_T "http://ns.adobe.com/xap/1.0/t/"</span>
-<a name="l00357"></a><a class="code" href="XMP__Const_8h.html#39afb495ffb24bb3082493c6811e65d0">00357</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_T_PG "http://ns.adobe.com/xap/1.0/t/pg/"</span>
-<a name="l00358"></a>00358 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XMP_G_IMG "http://ns.adobe.com/xap/1.0/g/img/"</span>
-<a name="l00359"></a>00359 <span class="preprocessor"></span>
-<a name="l00389"></a><a class="code" href="XMP__Const_8h.html#44453f0d0a1dd295d41722c2387b36fa">00389</a> <span class="preprocessor">#define kXMP_NS_DC "http://purl.org/dc/elements/1.1/"</span>
-<a name="l00390"></a>00390 <span class="preprocessor"></span>
-<a name="l00391"></a><a class="code" href="XMP__Const_8h.html#b794d3d798daf75a963398347dcbb79b">00391</a> <span class="preprocessor">#define kXMP_NS_IPTCCore "http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"</span>
-<a name="l00392"></a>00392 <span class="preprocessor"></span>
-<a name="l00393"></a>00393 <span class="preprocessor">#define kXMP_NS_PDFA_Schema "http://www.aiim.org/pdfa/ns/schema#"</span>
-<a name="l00394"></a>00394 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_PDFA_Property "http://www.aiim.org/pdfa/ns/property#"</span>
-<a name="l00395"></a>00395 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_PDFA_Type "http://www.aiim.org/pdfa/ns/type#"</span>
-<a name="l00396"></a>00396 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_PDFA_Field "http://www.aiim.org/pdfa/ns/field#"</span>
-<a name="l00397"></a>00397 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_PDFA_ID "http://www.aiim.org/pdfa/ns/id/"</span>
-<a name="l00398"></a>00398 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_PDFA_Extension "http://www.aiim.org/pdfa/ns/extension/"</span>
-<a name="l00399"></a>00399 <span class="preprocessor"></span>
-<a name="l00400"></a>00400 <span class="preprocessor">#define kXMP_NS_PDFX "http://ns.adobe.com/pdfx/1.3/"</span>
-<a name="l00401"></a>00401 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_PDFX_ID "http://www.npes.org/pdfx/ns/id/"</span>
-<a name="l00402"></a>00402 <span class="preprocessor"></span>
-<a name="l00403"></a><a class="code" href="XMP__Const_8h.html#276fac0f70893607afa3f09030ad84c7">00403</a> <span class="preprocessor">#define kXMP_NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#"</span>
-<a name="l00404"></a><a class="code" href="XMP__Const_8h.html#97564c70460d1f235c8a41b8ac40cfe9">00404</a> <span class="preprocessor"></span><span class="preprocessor">#define kXMP_NS_XML "http://www.w3.org/XML/1998/namespace"</span>
-<a name="l00405"></a>00405 <span class="preprocessor"></span>
-<a name="l00406"></a>00406
-<a name="l00407"></a>00407 <span class="comment">/* ============================================================================================== */</span>
-<a name="l00408"></a>00408 <span class="comment">/* Enums and macros used for option bits */</span>
-<a name="l00409"></a>00409 <span class="comment">/* ===================================== */</span>
-<a name="l00410"></a>00410
-<a name="l00411"></a>00411 <span class="preprocessor">#define kXMP_ArrayLastItem ((XMP_Index)(-1L))</span>
-<a name="l00412"></a>00412 <span class="preprocessor"></span><span class="preprocessor">#define kXMP_UseNullTermination ((XMP_StringLen)(~0UL))</span>
-<a name="l00413"></a>00413 <span class="preprocessor"></span>
-<a name="l00414"></a>00414 <span class="preprocessor">#define kXMP_NoOptions ((XMP_OptionBits)0UL)</span>
-<a name="l00415"></a>00415 <span class="preprocessor"></span>
-<a name="l00416"></a>00416 <span class="preprocessor">#define XMP_SetOption(var,opt) var |= (opt)</span>
-<a name="l00417"></a>00417 <span class="preprocessor"></span><span class="preprocessor">#define XMP_ClearOption(var,opt) var &amp;= ~(opt)</span>
-<a name="l00418"></a>00418 <span class="preprocessor"></span><span class="preprocessor">#define XMP_TestOption(var,opt) (((var) &amp; (opt)) != 0)</span>
-<a name="l00419"></a>00419 <span class="preprocessor"></span><span class="preprocessor">#define XMP_OptionIsSet(var,opt) (((var) &amp; (opt)) != 0)</span>
-<a name="l00420"></a>00420 <span class="preprocessor"></span><span class="preprocessor">#define XMP_OptionIsClear(var,opt) (((var) &amp; (opt)) == 0)</span>
-<a name="l00421"></a>00421 <span class="preprocessor"></span>
-<a name="l00422"></a>00422 <span class="preprocessor">#define XMP_PropIsSimple(opt) (((opt) &amp; kXMP_PropCompositeMask) == 0)</span>
-<a name="l00423"></a>00423 <span class="preprocessor"></span><span class="preprocessor">#define XMP_PropIsStruct(opt) (((opt) &amp; kXMP_PropValueIsStruct) != 0)</span>
-<a name="l00424"></a>00424 <span class="preprocessor"></span><span class="preprocessor">#define XMP_PropIsArray(opt) (((opt) &amp; kXMP_PropValueIsArray) != 0)</span>
-<a name="l00425"></a>00425 <span class="preprocessor"></span><span class="preprocessor">#define XMP_ArrayIsUnordered(opt) (((opt) &amp; kXMP_PropArrayIsOrdered) == 0)</span>
-<a name="l00426"></a>00426 <span class="preprocessor"></span><span class="preprocessor">#define XMP_ArrayIsOrdered(opt) (((opt) &amp; kXMP_PropArrayIsOrdered) != 0)</span>
-<a name="l00427"></a>00427 <span class="preprocessor"></span><span class="preprocessor">#define XMP_ArrayIsAlternate(opt) (((opt) &amp; kXMP_PropArrayIsAlternate) != 0)</span>
-<a name="l00428"></a>00428 <span class="preprocessor"></span><span class="preprocessor">#define XMP_ArrayIsAltText(opt) (((opt) &amp; kXMP_PropArrayIsAltText) != 0)</span>
-<a name="l00429"></a>00429 <span class="preprocessor"></span>
-<a name="l00430"></a>00430 <span class="preprocessor">#define XMP_PropHasQualifiers(opt) (((opt) &amp; kXMP_PropHasQualifiers) != 0)</span>
-<a name="l00431"></a>00431 <span class="preprocessor"></span><span class="preprocessor">#define XMP_PropIsQualifier(opt) (((opt) &amp; kXMP_PropIsQualifier) != 0)</span>
-<a name="l00432"></a>00432 <span class="preprocessor"></span><span class="preprocessor">#define XMP_PropHasLang(opt) (((opt) &amp; kXMP_PropHasLang) != 0)</span>
-<a name="l00433"></a>00433 <span class="preprocessor"></span>
-<a name="l00434"></a>00434 <span class="preprocessor">#define XMP_NodeIsSchema(opt) (((opt) &amp; kXMP_SchemaNode) != 0)</span>
-<a name="l00435"></a>00435 <span class="preprocessor"></span><span class="preprocessor">#define XMP_PropIsAlias(opt) (((opt) &amp; kXMP_PropIsAlias) != 0)</span>
-<a name="l00436"></a>00436 <span class="preprocessor"></span>
-<a name="l00437"></a>00437 <span class="comment">/* ---------------------------------------------------------------------------------------------- */</span>
-<a name="l00438"></a>00438
-<a name="l00439"></a>00439 <span class="keyword">enum</span> { <span class="comment">/* Option bits returned from the TXMPMeta::GetXyz functions. */</span>
-<a name="l00440"></a>00440
-<a name="l00441"></a>00441 <span class="comment">/* Options relating to the XML string form of the property value. */</span>
-<a name="l00442"></a>00442 kXMP_PropValueIsURI = 0x00000002UL, <span class="comment">/* The value is a URI, use rdf:resource attribute. DISCOURAGED */</span>
-<a name="l00443"></a>00443
-<a name="l00444"></a>00444 <span class="comment">/* Options relating to qualifiers attached to a property. */</span>
-<a name="l00445"></a>00445 kXMP_PropHasQualifiers = 0x00000010UL, <span class="comment">/* The property has qualifiers, includes rdf:type and xml:lang. */</span>
-<a name="l00446"></a>00446 kXMP_PropIsQualifier = 0x00000020UL, <span class="comment">/* This is a qualifier, includes rdf:type and xml:lang. */</span>
-<a name="l00447"></a>00447 kXMP_PropHasLang = 0x00000040UL, <span class="comment">/* Implies kXMP_PropHasQualifiers, property has xml:lang. */</span>
-<a name="l00448"></a>00448 kXMP_PropHasType = 0x00000080UL, <span class="comment">/* Implies kXMP_PropHasQualifiers, property has rdf:type. */</span>
-<a name="l00449"></a>00449
-<a name="l00450"></a>00450 <span class="comment">/* Options relating to the data structure form. */</span>
-<a name="l00451"></a>00451 kXMP_PropValueIsStruct = 0x00000100UL, <span class="comment">/* The value is a structure with nested fields. */</span>
-<a name="l00452"></a>00452 kXMP_PropValueIsArray = 0x00000200UL, <span class="comment">/* The value is an array (RDF alt/bag/seq). */</span>
-<a name="l00453"></a>00453 kXMP_PropArrayIsUnordered = kXMP_PropValueIsArray, <span class="comment">/* The item order does not matter. */</span>
-<a name="l00454"></a>00454 kXMP_PropArrayIsOrdered = 0x00000400UL, <span class="comment">/* Implies kXMP_PropValueIsArray, item order matters. */</span>
-<a name="l00455"></a>00455 kXMP_PropArrayIsAlternate = 0x00000800UL, <span class="comment">/* Implies kXMP_PropArrayIsOrdered, items are alternates. */</span>
-<a name="l00456"></a>00456
-<a name="l00457"></a>00457 <span class="comment">/* Additional struct and array options. */</span>
-<a name="l00458"></a>00458 kXMP_PropArrayIsAltText = 0x00001000UL, <span class="comment">/* Implies kXMP_PropArrayIsAlternate, items are localized text. */</span>
-<a name="l00459"></a>00459 <span class="comment">/* kXMP_InsertBeforeItem = 0x00004000UL, ! Used by SetXyz functions. */</span>
-<a name="l00460"></a>00460 <span class="comment">/* kXMP_InsertAfterItem = 0x00008000UL, ! Used by SetXyz functions. */</span>
-<a name="l00461"></a>00461
-<a name="l00462"></a>00462 <span class="comment">/* Other miscellaneous options. */</span>
-<a name="l00463"></a>00463 kXMP_PropIsAlias = 0x00010000UL, <span class="comment">/* This property is an alias name for another property. */</span>
-<a name="l00464"></a>00464 kXMP_PropHasAliases = 0x00020000UL, <span class="comment">/* This property is the base value for a set of aliases. */</span>
-<a name="l00465"></a>00465 kXMP_PropIsInternal = 0x00040000UL, <span class="comment">/* This property is an "internal" property, owned by applications. */</span>
-<a name="l00466"></a>00466 kXMP_PropIsStable = 0x00100000UL, <span class="comment">/* This property is not derived from the document content. */</span>
-<a name="l00467"></a>00467 kXMP_PropIsDerived = 0x00200000UL, <span class="comment">/* This property is derived from the document content. */</span>
-<a name="l00468"></a>00468 <span class="comment">/* kXMPUtil_AllowCommas = 0x10000000UL, ! Used by TXMPUtils::CatenateArrayItems and ::SeparateArrayItems. */</span>
-<a name="l00469"></a>00469 <span class="comment">/* kXMP_DeleteExisting = 0x20000000UL, ! Used by TXMPMeta::SetXyz functions to delete any pre-existing property. */</span>
-<a name="l00470"></a>00470 <span class="comment">/* kXMP_SchemaNode = 0x80000000UL, ! Returned by iterators - #define to avoid warnings */</span>
-<a name="l00471"></a>00471
-<a name="l00472"></a>00472 <span class="comment">/* Masks that are multiple flags. */</span>
-<a name="l00473"></a>00473 kXMP_PropArrayFormMask = kXMP_PropValueIsArray | kXMP_PropArrayIsOrdered | kXMP_PropArrayIsAlternate | kXMP_PropArrayIsAltText,
-<a name="l00474"></a>00474 kXMP_PropCompositeMask = kXMP_PropValueIsStruct | kXMP_PropArrayFormMask, <span class="comment">/* Is it simple or composite (array or struct)? */</span>
-<a name="l00475"></a>00475 kXMP_ImplReservedMask = 0x70000000L <span class="comment">/* Reserved for transient use by the implementation. */</span>
-<a name="l00476"></a>00476 };
-<a name="l00477"></a>00477
-<a name="l00478"></a>00478 <span class="preprocessor">#define kXMP_SchemaNode ((XMP_OptionBits)0x80000000UL)</span>
-<a name="l00479"></a>00479 <span class="preprocessor"></span>
-<a name="l00480"></a>00480 <span class="keyword">enum</span> { <span class="comment">/* Option bits for the TXMPMeta::SetXyz functions. */</span>
-<a name="l00481"></a>00481
-<a name="l00482"></a>00482 <span class="comment">/* Options shared with GetXyz functions. */</span>
-<a name="l00483"></a>00483 <span class="comment">/*</span>
-<a name="l00484"></a>00484 <span class="comment"> kXMP_PropValueIsURI = 0x00000002UL, DISCOURAGED</span>
-<a name="l00485"></a>00485 <span class="comment"> kXMP_PropValueIsStruct = 0x00000100UL,</span>
-<a name="l00486"></a>00486 <span class="comment"> kXMP_PropValueIsArray = 0x00000200UL,</span>
-<a name="l00487"></a>00487 <span class="comment"> kXMP_PropArrayIsOrdered = 0x00000400UL,</span>
-<a name="l00488"></a>00488 <span class="comment"> kXMP_PropArrayIsAlternate = 0x00000800UL,</span>
-<a name="l00489"></a>00489 <span class="comment"> kXMP_PropArrayIsAltText = 0x00001000UL,</span>
-<a name="l00490"></a>00490 <span class="comment"> kXMP_PropValueIsCompact = 0x00002000UL, RESERVED</span>
-<a name="l00491"></a>00491 <span class="comment"> */</span>
-<a name="l00492"></a>00492
-<a name="l00493"></a>00493 <span class="comment">/* Options for array item location. */</span>
-<a name="l00494"></a>00494 kXMP_InsertBeforeItem = 0x00004000UL, <span class="comment">/* Insert a new item before the given index. */</span>
-<a name="l00495"></a>00495 kXMP_InsertAfterItem = 0x00008000UL, <span class="comment">/* Insert a new item after the given index. */</span>
-<a name="l00496"></a>00496
-<a name="l00497"></a>00497 <span class="comment">/* Miscellaneous options */</span>
-<a name="l00498"></a>00498 kXMP_DeleteExisting = 0x20000000UL, <span class="comment">/* Delete any pre-existing property. */</span>
-<a name="l00499"></a>00499
-<a name="l00500"></a>00500 <span class="comment">/* Masks that are multiple flags. */</span>
-<a name="l00501"></a>00501 kXMP_PropValueOptionsMask = kXMP_PropValueIsURI,
-<a name="l00502"></a>00502 kXMP_PropArrayLocationMask = kXMP_InsertBeforeItem | kXMP_InsertAfterItem
-<a name="l00503"></a>00503
-<a name="l00504"></a>00504 };
-<a name="l00505"></a>00505
-<a name="l00506"></a>00506 <span class="comment">/* ---------------------------------------------------------------------------------------------- */</span>
-<a name="l00507"></a>00507
-<a name="l00508"></a>00508 <span class="keyword">enum</span> { <span class="comment">/* Options for TXMPMeta::ParseFromBuffer. */</span>
-<a name="l00509"></a>00509 kXMP_RequireXMPMeta = 0x0001UL, <span class="comment">/* Require a surrounding x:xmpmeta element. */</span>
-<a name="l00510"></a>00510 kXMP_ParseMoreBuffers = 0x0002UL, <span class="comment">/* This is the not last input buffer for this parse stream. */</span>
-<a name="l00511"></a>00511 kXMP_StrictAliasing = 0x0004UL <span class="comment">/* Do not reconcile alias differences, throw an exception. */</span>
-<a name="l00512"></a>00512 };
-<a name="l00513"></a>00513
-<a name="l00514"></a>00514 <span class="keyword">enum</span> { <span class="comment">/* Options for TXMPMeta::SerializeToBuffer. */</span>
-<a name="l00515"></a>00515
-<a name="l00516"></a>00516 <span class="comment">/* *** Option to remove empty struct/array, or leaf with empty value? */</span>
-<a name="l00517"></a>00517
-<a name="l00518"></a>00518 kXMP_OmitPacketWrapper = 0x0010UL, <span class="comment">/* Omit the XML packet wrapper. */</span>
-<a name="l00519"></a>00519 kXMP_ReadOnlyPacket = 0x0020UL, <span class="comment">/* Default is a writeable packet. */</span>
-<a name="l00520"></a>00520 kXMP_UseCompactFormat = 0x0040UL, <span class="comment">/* Use a compact form of RDF. */</span>
-<a name="l00521"></a>00521
-<a name="l00522"></a>00522 kXMP_IncludeThumbnailPad = 0x0100UL, <span class="comment">/* Include a padding allowance for a thumbnail image. */</span>
-<a name="l00523"></a>00523 kXMP_ExactPacketLength = 0x0200UL, <span class="comment">/* The padding parameter is the overall packet length. */</span>
-<a name="l00524"></a>00524 kXMP_WriteAliasComments = 0x0400UL, <span class="comment">/* Show aliases as XML comments. */</span>
-<a name="l00525"></a>00525 kXMP_OmitAllFormatting = 0x0800UL, <span class="comment">/* Omit all formatting whitespace. */</span>
-<a name="l00526"></a>00526
-<a name="l00527"></a>00527 _XMP_LittleEndian_Bit = 0x0001UL, <span class="comment">/* ! Don't use directly, see the combined values below! */</span>
-<a name="l00528"></a>00528 _XMP_UTF16_Bit = 0x0002UL,
-<a name="l00529"></a>00529 _XMP_UTF32_Bit = 0x0004UL,
-<a name="l00530"></a>00530
-<a name="l00531"></a>00531 kXMP_EncodingMask = 0x0007UL,
-<a name="l00532"></a>00532 kXMP_EncodeUTF8 = 0UL,
-<a name="l00533"></a>00533 kXMP_EncodeUTF16Big = _XMP_UTF16_Bit,
-<a name="l00534"></a>00534 kXMP_EncodeUTF16Little = _XMP_UTF16_Bit | _XMP_LittleEndian_Bit,
-<a name="l00535"></a>00535 kXMP_EncodeUTF32Big = _XMP_UTF32_Bit,
-<a name="l00536"></a>00536 kXMP_EncodeUTF32Little = _XMP_UTF32_Bit | _XMP_LittleEndian_Bit
-<a name="l00537"></a>00537
-<a name="l00538"></a>00538 };
-<a name="l00539"></a>00539
-<a name="l00540"></a>00540 <span class="comment">/* ---------------------------------------------------------------------------------------------- */</span>
-<a name="l00541"></a>00541
-<a name="l00542"></a>00542 <span class="keyword">enum</span> { <span class="comment">/* Options for TXMPIterator construction. */</span>
-<a name="l00543"></a>00543
-<a name="l00544"></a>00544 kXMP_IterClassMask = 0x00FFUL, <span class="comment">/* The low 8 bits are an enum of what data structure to iterate. */</span>
-<a name="l00545"></a>00545 kXMP_IterProperties = 0x0000UL, <span class="comment">/* Iterate the property tree of a TXMPMeta object. */</span>
-<a name="l00546"></a>00546 kXMP_IterAliases = 0x0001UL, <span class="comment">/* Iterate the global alias table. */</span>
-<a name="l00547"></a>00547 kXMP_IterNamespaces = 0x0002UL, <span class="comment">/* Iterate the global namespace table. */</span>
-<a name="l00548"></a>00548 kXMP_IterJustChildren = 0x0100UL, <span class="comment">/* Just do the immediate children of the root, default is subtree. */</span>
-<a name="l00549"></a>00549 kXMP_IterJustLeafNodes = 0x0200UL, <span class="comment">/* Just do the leaf nodes, default is all nodes in the subtree. */</span>
-<a name="l00550"></a>00550 kXMP_IterJustLeafName = 0x0400UL, <span class="comment">/* Return just the leaf part of the path, default is the full path. */</span>
-<a name="l00551"></a>00551 kXMP_IterIncludeAliases = 0x0800UL, <span class="comment">/* Include aliases, default is just actual properties. */</span>
-<a name="l00552"></a>00552
-<a name="l00553"></a>00553 kXMP_IterOmitQualifiers = 0x1000UL <span class="comment">/* Omit all qualifiers. */</span>
-<a name="l00554"></a>00554
-<a name="l00555"></a>00555 };
-<a name="l00556"></a>00556
-<a name="l00557"></a>00557 <span class="keyword">enum</span> { <span class="comment">/* Options for TXMPIterator::Skip. */</span>
-<a name="l00558"></a>00558 kXMP_IterSkipSubtree = 0x0001UL, <span class="comment">/* Skip the subtree below the current node. */</span>
-<a name="l00559"></a>00559 kXMP_IterSkipSiblings = 0x0002UL <span class="comment">/* Skip the subtree below and remaining siblings of the current node. */</span>
-<a name="l00560"></a>00560 };
-<a name="l00561"></a>00561
-<a name="l00562"></a>00562 <span class="comment">/* ---------------------------------------------------------------------------------------------- */</span>
-<a name="l00563"></a>00563
-<a name="l00564"></a>00564 <span class="keyword">enum</span> { <span class="comment">/* Options for TXMPUtils::CatenateArrayItems and TXMPUtils::SeparateArrayItems. */</span>
-<a name="l00565"></a>00565
-<a name="l00566"></a>00566 <span class="comment">/* Options shared with GetXyz functions. */</span>
-<a name="l00567"></a>00567 <span class="comment">/*</span>
-<a name="l00568"></a>00568 <span class="comment"> kXMP_PropValueIsArray = 0x00000200UL,</span>
-<a name="l00569"></a>00569 <span class="comment"> kXMP_PropArrayIsOrdered = 0x00000400UL,</span>
-<a name="l00570"></a>00570 <span class="comment"> kXMP_PropArrayIsAlternate = 0x00000800UL,</span>
-<a name="l00571"></a>00571 <span class="comment"> kXMP_PropArrayIsAltText = 0x00001000UL,</span>
-<a name="l00572"></a>00572 <span class="comment"> */</span>
-<a name="l00573"></a>00573
-<a name="l00574"></a>00574 kXMPUtil_AllowCommas = 0x10000000UL <span class="comment">/* Allow commas in item values, default is separator. */</span>
-<a name="l00575"></a>00575
-<a name="l00576"></a>00576 };
-<a name="l00577"></a>00577
-<a name="l00578"></a>00578 <span class="keyword">enum</span> { <span class="comment">/* Options for TXMPUtils::RemoveProperties and TXMPUtils::AppendProperties. */</span>
-<a name="l00579"></a>00579 kXMPUtil_DoAllProperties = 0x0001UL, <span class="comment">/* Do all properties, default is just external properties. */</span>
-<a name="l00580"></a>00580 kXMPUtil_ReplaceOldValues = 0x0002UL, <span class="comment">/* Replace existing values, default is to leave them. */</span>
-<a name="l00581"></a>00581 kXMPUtil_DeleteEmptyValues = 0x0004UL, <span class="comment">/* Delete properties if the new value is empty. */</span>
-<a name="l00582"></a>00582 kXMPUtil_IncludeAliases = 0x0800UL <span class="comment">/* == kXMP_IterIncludeAliases */</span>
-<a name="l00583"></a>00583 };
-<a name="l00584"></a>00584
-<a name="l00585"></a>00585 <span class="comment">/* ============================================================================================== */</span>
-<a name="l00586"></a>00586 <span class="comment">/* Types and Constants for XMP File Handler */</span>
-<a name="l00587"></a>00587 <span class="comment">/* ======================================== */</span>
-<a name="l00588"></a>00588
-<a name="l00589"></a>00589 <span class="keyword">enum</span> {
-<a name="l00590"></a>00590
-<a name="l00591"></a>00591 <span class="comment">/* Public file formats. Hex used to avoid gcc warnings. */</span>
-<a name="l00592"></a>00592 <span class="comment">/* ! Leave them as big endian. There seems to be no decent way on UNIX to determine the target */</span>
-<a name="l00593"></a>00593 <span class="comment">/* ! endianness at compile time. Forcing it on the client isn't acceptable. */</span>
-<a name="l00594"></a>00594
-<a name="l00595"></a>00595 kXMP_PDFFile = 0x50444620UL, <span class="comment">/* 'PDF ' */</span>
-<a name="l00596"></a>00596 kXMP_PostScriptFile = 0x50532020UL, <span class="comment">/* 'PS ', general PostScript following DSC conventions. */</span>
-<a name="l00597"></a>00597 kXMP_EPSFile = 0x45505320UL, <span class="comment">/* 'EPS ', encapsulated PostScript. */</span>
-<a name="l00598"></a>00598
-<a name="l00599"></a>00599 kXMP_JPEGFile = 0x4A504547UL, <span class="comment">/* 'JPEG' */</span>
-<a name="l00600"></a>00600 kXMP_JPEG2KFile = 0x4A505820UL, <span class="comment">/* 'JPX ', ISO 15444-1 */</span>
-<a name="l00601"></a>00601 kXMP_TIFFFile = 0x54494646UL, <span class="comment">/* 'TIFF' */</span>
-<a name="l00602"></a>00602 kXMP_GIFFile = 0x47494620UL, <span class="comment">/* 'GIF ' */</span>
-<a name="l00603"></a>00603 kXMP_PNGFile = 0x504E4720UL, <span class="comment">/* 'PNG ' */</span>
-<a name="l00604"></a>00604
-<a name="l00605"></a>00605 kXMP_SWFFile = 0x53574620UL, <span class="comment">/* 'SWF ' */</span>
-<a name="l00606"></a>00606 kXMP_FLAFile = 0x464C4120UL, <span class="comment">/* 'FLA ' */</span>
-<a name="l00607"></a>00607 kXMP_FLVFile = 0x464C5620UL, <span class="comment">/* 'FLV ' */</span>
-<a name="l00608"></a>00608
-<a name="l00609"></a>00609 kXMP_MOVFile = 0x4D4F5620UL, <span class="comment">/* 'MOV ', Quicktime */</span>
-<a name="l00610"></a>00610 kXMP_AVIFile = 0x41564920UL, <span class="comment">/* 'AVI ' */</span>
-<a name="l00611"></a>00611 kXMP_CINFile = 0x43494E20UL, <span class="comment">/* 'CIN ', Cineon */</span>
-<a name="l00612"></a>00612 kXMP_WAVFile = 0x57415620UL, <span class="comment">/* 'WAV ' */</span>
-<a name="l00613"></a>00613 kXMP_MP3File = 0x4D503320UL, <span class="comment">/* 'MP3 ' */</span>
-<a name="l00614"></a>00614 kXMP_SESFile = 0x53455320UL, <span class="comment">/* 'SES ', Audition session */</span>
-<a name="l00615"></a>00615 kXMP_CELFile = 0x43454C20UL, <span class="comment">/* 'CEL ', Audition loop */</span>
-<a name="l00616"></a>00616 kXMP_MPEGFile = 0x4D504547UL, <span class="comment">/* 'MPEG' */</span>
-<a name="l00617"></a>00617 kXMP_MPEG2File = 0x4D503220UL, <span class="comment">/* 'MP2 ' */</span>
-<a name="l00618"></a>00618 kXMP_MPEG4File = 0x4D503420UL, <span class="comment">/* 'MP4 ', ISO 14494-12 and -14 */</span>
-<a name="l00619"></a>00619 kXMP_WMAVFile = 0x574D4156UL, <span class="comment">/* 'WMAV', Windows Media Audio and Video */</span>
-<a name="l00620"></a>00620 kXMP_AIFFFile = 0x41494646UL, <span class="comment">/* 'AIFF' */</span>
-<a name="l00621"></a>00621
-<a name="l00622"></a>00622 kXMP_HTMLFile = 0x48544D4CUL, <span class="comment">/* 'HTML' */</span>
-<a name="l00623"></a>00623 kXMP_XMLFile = 0x584D4C20UL, <span class="comment">/* 'XML ' */</span>
-<a name="l00624"></a>00624 kXMP_TextFile = 0x74657874UL, <span class="comment">/* 'text' */</span>
-<a name="l00625"></a>00625
-<a name="l00626"></a>00626 <span class="comment">/* Adobe application file formats. */</span>
-<a name="l00627"></a>00627
-<a name="l00628"></a>00628 kXMP_PhotoshopFile = 0x50534420UL, <span class="comment">/* 'PSD ' */</span>
-<a name="l00629"></a>00629 kXMP_IllustratorFile = 0x41492020UL, <span class="comment">/* 'AI ' */</span>
-<a name="l00630"></a>00630 kXMP_InDesignFile = 0x494E4444UL, <span class="comment">/* 'INDD' */</span>
-<a name="l00631"></a>00631 kXMP_AEProjectFile = 0x41455020UL, <span class="comment">/* 'AEP ' */</span>
-<a name="l00632"></a>00632 kXMP_AEProjTemplateFile = 0x41455420UL, <span class="comment">/* 'AET ', After Effects Project Template */</span>
-<a name="l00633"></a>00633 kXMP_AEFilterPresetFile = 0x46465820UL, <span class="comment">/* 'FFX ' */</span>
-<a name="l00634"></a>00634 kXMP_EncoreProjectFile = 0x4E434F52UL, <span class="comment">/* 'NCOR' */</span>
-<a name="l00635"></a>00635 kXMP_PremiereProjectFile = 0x5052504AUL, <span class="comment">/* 'PRPJ' */</span>
-<a name="l00636"></a>00636 kXMP_PremiereTitleFile = 0x5052544CUL, <span class="comment">/* 'PRTL' */</span>
-<a name="l00637"></a>00637
-<a name="l00638"></a>00638 <span class="comment">/* Catch all. */</span>
-<a name="l00639"></a>00639
-<a name="l00640"></a>00640 kXMP_UnknownFile = 0x20202020UL <span class="comment">/* ' ' */</span>
-<a name="l00641"></a>00641
-<a name="l00642"></a>00642 };
-<a name="l00643"></a>00643 <span class="keyword">typedef</span> XMP_Uns32 XMP_FileFormat;
-<a name="l00644"></a>00644
-<a name="l00645"></a>00645 <span class="comment">/* ---------------------------------------------------------------------------------------------- */</span>
-<a name="l00646"></a>00646
-<a name="l00647"></a>00647 <span class="keyword">enum</span> {
-<a name="l00648"></a>00648 kXMP_CharLittleEndianMask = 1,
-<a name="l00649"></a>00649 kXMP_Char16BitMask = 2, <span class="comment">/* Don't use these directly. */</span>
-<a name="l00650"></a>00650 kXMP_Char32BitMask = 4
-<a name="l00651"></a>00651 };
-<a name="l00652"></a>00652
-<a name="l00653"></a>00653 <span class="keyword">enum</span> { <span class="comment">/* The values allow easy testing for 16/32 bit and big/little endian. */</span>
-<a name="l00654"></a>00654 kXMP_Char8Bit = 0,
-<a name="l00655"></a>00655 kXMP_Char16BitBig = kXMP_Char16BitMask,
-<a name="l00656"></a>00656 kXMP_Char16BitLittle = kXMP_Char16BitMask | kXMP_CharLittleEndianMask,
-<a name="l00657"></a>00657 kXMP_Char32BitBig = kXMP_Char32BitMask,
-<a name="l00658"></a>00658 kXMP_Char32BitLittle = kXMP_Char32BitMask | kXMP_CharLittleEndianMask,
-<a name="l00659"></a>00659 kXMP_CharUnknown = 1 <span class="comment">/* ! A bit of a hack, for variable or not-yet-known cases. */</span>
-<a name="l00660"></a>00660 };
-<a name="l00661"></a>00661
-<a name="l00662"></a>00662 <span class="preprocessor">#define XMP_CharFormIs16Bit(f) ( ((int)(f) &amp; kXMP_Char16BitMask) != 0 )</span>
-<a name="l00663"></a>00663 <span class="preprocessor"></span><span class="preprocessor">#define XMP_CharFormIs32Bit(f) ( ((int)(f) &amp; kXMP_Char32BitMask) != 0 )</span>
-<a name="l00664"></a>00664 <span class="preprocessor"></span>
-<a name="l00665"></a>00665 <span class="preprocessor">#define XMP_CharFormIsBigEndian(f) ( ((int)(f) &amp; kXMP_CharLittleEndianMask) == 0 )</span>
-<a name="l00666"></a>00666 <span class="preprocessor"></span><span class="preprocessor">#define XMP_CharFormIsLittleEndian(f) ( ((int)(f) &amp; kXMP_CharLittleEndianMask) != 0 )</span>
-<a name="l00667"></a>00667 <span class="preprocessor"></span>
-<a name="l00668"></a>00668 <span class="preprocessor">#define XMP_GetCharSize(f) ( ((int)(f)&amp;6) == 0 ? 1 : (int)(f)&amp;6 )</span>
-<a name="l00669"></a>00669 <span class="preprocessor"></span>
-<a name="l00670"></a>00670 <span class="preprocessor">#define XMP_CharToSerializeForm(cf) ( (XMP_OptionBits)(cf) )</span>
-<a name="l00671"></a>00671 <span class="preprocessor"></span><span class="preprocessor">#define XMP_CharFromSerializeForm(sf) ( (XMP_Uns8)(sf) )</span>
-<a name="l00672"></a>00672 <span class="preprocessor"></span>
-<a name="l00673"></a>00673 <span class="keyword">struct </span>XMP_PacketInfo {
-<a name="l00674"></a>00674 XMP_Int64 offset;
-<a name="l00675"></a>00675 XMP_Int32 length;
-<a name="l00676"></a>00676 XMP_Int32 padSize; <span class="comment">/* Zero if unknown. */</span>
-<a name="l00677"></a>00677 XMP_Uns8 charForm;
-<a name="l00678"></a>00678 XMP_Bool writeable;
-<a name="l00679"></a>00679 XMP_Uns8 pad1, pad2;
-<a name="l00680"></a>00680 <span class="preprocessor"> #if __cplusplus</span>
-<a name="l00681"></a>00681 <span class="preprocessor"></span> XMP_PacketInfo() : offset(0), length(0), padSize(0), charForm(0), writeable(0), pad1(0), pad2(0) {};
-<a name="l00682"></a>00682 <span class="preprocessor"> #endif</span>
-<a name="l00683"></a>00683 <span class="preprocessor"></span>};
-<a name="l00684"></a>00684 <span class="preprocessor">#if ! __cplusplus</span>
-<a name="l00685"></a>00685 <span class="preprocessor"></span> <span class="keyword">typedef</span> <span class="keyword">struct </span>XMP_PacketInfo XMP_PacketInfo;
-<a name="l00686"></a>00686 <span class="preprocessor">#endif</span>
-<a name="l00687"></a>00687 <span class="preprocessor"></span><span class="keyword">enum</span> { kXMP_PacketInfoVersion = 3 };
-<a name="l00688"></a>00688
-<a name="l00689"></a>00689 <span class="comment">/* ---------------------------------------------------------------------------------------------- */</span>
-<a name="l00690"></a>00690
-<a name="l00691"></a>00691 <span class="keyword">enum</span> { <span class="comment">/* Values for XMP_ThumbnailInfo.tnailFormat. */</span>
-<a name="l00692"></a>00692 kXMP_UnknownTNail = 0, <span class="comment">/* The thumbnail data has an unknown format. */</span>
-<a name="l00693"></a>00693 kXMP_JPEGTNail = 1, <span class="comment">/* The thumbnail data is a JPEG stream, presumably compressed. */</span>
-<a name="l00694"></a>00694 kXMP_TIFFTNail = 2, <span class="comment">/* The thumbnail data is a TIFF stream, presumably uncompressed. */</span>
-<a name="l00695"></a>00695 kXMP_PShopTNail = 3 <span class="comment">/* The thumbnail data is in the format of Photoshop Image Resource 1036. */</span>
-<a name="l00696"></a>00696 };
-<a name="l00697"></a>00697
-<a name="l00698"></a>00698 <span class="keyword">struct </span>XMP_ThumbnailInfo {
-<a name="l00699"></a>00699 XMP_FileFormat fileFormat; <span class="comment">/* The format of the containing file. */</span>
-<a name="l00700"></a>00700 XMP_Uns32 fullWidth, fullHeight; <span class="comment">/* Full image size in pixels. */</span>
-<a name="l00701"></a>00701 XMP_Uns32 tnailWidth, tnailHeight; <span class="comment">/* Thumbnail image size in pixels. */</span>
-<a name="l00702"></a>00702 XMP_Uns16 fullOrientation, tnailOrientation; <span class="comment">/* Orientation of full image and thumbnail, as defined by Exif for tag 274. */</span>
-<a name="l00703"></a>00703 <span class="keyword">const</span> XMP_Uns8 * tnailImage; <span class="comment">/* Raw data from the host file, valid for life of the owning XMPFiles object. Do not modify! */</span>
-<a name="l00704"></a>00704 XMP_Uns32 tnailSize; <span class="comment">/* The size in bytes of the tnailImage data. */</span>
-<a name="l00705"></a>00705 XMP_Uns8 tnailFormat; <span class="comment">/* The format of the tnailImage data. */</span>
-<a name="l00706"></a>00706 XMP_Uns8 pad1, pad2, pad3;
-<a name="l00707"></a>00707 <span class="preprocessor"> #if __cplusplus</span>
-<a name="l00708"></a>00708 <span class="preprocessor"></span> XMP_ThumbnailInfo() : fileFormat(kXMP_UnknownFile), fullWidth(0), fullHeight(0),
-<a name="l00709"></a>00709 tnailWidth(0), tnailHeight(0), fullOrientation(0), tnailOrientation(0),
-<a name="l00710"></a>00710 tnailImage(0), tnailSize(0), tnailFormat(kXMP_UnknownTNail) {};
-<a name="l00711"></a>00711 <span class="preprocessor"> #endif</span>
-<a name="l00712"></a>00712 <span class="preprocessor"></span>};
-<a name="l00713"></a>00713 <span class="preprocessor">#if ! __cplusplus</span>
-<a name="l00714"></a>00714 <span class="preprocessor"></span> <span class="keyword">typedef</span> <span class="keyword">struct </span>XMP_ThumbnailInfo XMP_ThumbnailInfo;
-<a name="l00715"></a>00715 <span class="preprocessor">#endif</span>
-<a name="l00716"></a>00716 <span class="preprocessor"></span><span class="keyword">enum</span> { kXMP_ThumbnailInfoVersion = 1 };
-<a name="l00717"></a>00717
-<a name="l00718"></a>00718 <span class="comment">/* ---------------------------------------------------------------------------------------------- */</span>
-<a name="l00719"></a>00719
-<a name="l00720"></a>00720 <span class="preprocessor">#define kXMPFiles_UnknownOffset ((XMP_Int64)-1)</span>
-<a name="l00721"></a>00721 <span class="preprocessor"></span><span class="preprocessor">#define kXMPFiles_UnknownLength ((XMP_Int32)-1)</span>
-<a name="l00722"></a>00722 <span class="preprocessor"></span>
-<a name="l00723"></a>00723 <span class="keyword">enum</span> { <span class="comment">/* Options for Initialize. */</span>
-<a name="l00724"></a>00724 kXMPFiles_NoQuickTimeInit = 0x0001 <span class="comment">/* Don't initialize QuickTime, the client will. */</span>
-<a name="l00725"></a>00725 };
-<a name="l00726"></a>00726
-<a name="l00727"></a>00727 <span class="keyword">enum</span> { <span class="comment">/* Options for GetFormatInfo. */</span>
-<a name="l00728"></a>00728 kXMPFiles_CanInjectXMP = 0x00000001, <span class="comment">/* Can inject first-time XMP into an existing file. */</span>
-<a name="l00729"></a>00729 kXMPFiles_CanExpand = 0x00000002, <span class="comment">/* Can expand XMP or other metadata in an existing file. */</span>
-<a name="l00730"></a>00730 kXMPFiles_CanRewrite = 0x00000004, <span class="comment">/* Can copy one file to another, writing new metadata. */</span>
-<a name="l00731"></a>00731 kXMPFiles_PrefersInPlace = 0x00000008, <span class="comment">/* Can expand, but prefers in-place update. */</span>
-<a name="l00732"></a>00732 kXMPFiles_CanReconcile = 0x00000010, <span class="comment">/* Supports reconciliation between XMP and other forms. */</span>
-<a name="l00733"></a>00733 kXMPFiles_AllowsOnlyXMP = 0x00000020, <span class="comment">/* Allows access to just the XMP, ignoring other forms. */</span>
-<a name="l00734"></a>00734 kXMPFiles_ReturnsRawPacket = 0x00000040, <span class="comment">/* File handler returns raw XMP packet information. */</span>
-<a name="l00735"></a>00735 kXMPFiles_ReturnsTNail = 0x00000080, <span class="comment">/* File handler returns native thumbnail. */</span>
-<a name="l00736"></a>00736 kXMPFiles_HandlerOwnsFile = 0x00000100, <span class="comment">/* The file handler does the file open and close. */</span>
-<a name="l00737"></a>00737 kXMPFiles_AllowsSafeUpdate = 0x00000200, <span class="comment">/* The file handler allows crash-safe file updates. */</span>
-<a name="l00738"></a>00738 kXMPFiles_NeedsReadOnlyPacket = 0x00000400, <span class="comment">/* The file format needs the XMP packet to be read-only. */</span>
-<a name="l00739"></a>00739 kXMPFiles_UsesSidecarXMP = 0x00000800 <span class="comment">/* The file handler uses a "sidecar" file for the XMP. */</span>
-<a name="l00740"></a>00740 };
-<a name="l00741"></a>00741
-<a name="l00742"></a>00742 <span class="keyword">enum</span> { <span class="comment">/* Options for OpenFile. */</span>
-<a name="l00743"></a>00743 kXMPFiles_OpenForRead = 0x00000001, <span class="comment">/* Open for read-only access. */</span>
-<a name="l00744"></a>00744 kXMPFiles_OpenForUpdate = 0x00000002, <span class="comment">/* Open for reading and writing. */</span>
-<a name="l00745"></a>00745 kXMPFiles_OpenOnlyXMP = 0x00000004, <span class="comment">/* Only the XMP is wanted, allows space/time optimizations. */</span>
-<a name="l00746"></a>00746 kXMPFiles_OpenCacheTNail = 0x00000008, <span class="comment">/* Cache thumbnail if possible, GetThumbnail will be called. */</span>
-<a name="l00747"></a>00747 kXMPFiles_OpenStrictly = 0x00000010, <span class="comment">/* Be strict about locating XMP and reconciling with other forms. */</span>
-<a name="l00748"></a>00748 kXMPFiles_OpenUseSmartHandler = 0x00000020, <span class="comment">/* Require the use of a smart handler. */</span>
-<a name="l00749"></a>00749 kXMPFiles_OpenUsePacketScanning = 0x00000040, <span class="comment">/* Force packet scanning, don't use a smart handler. */</span>
-<a name="l00750"></a>00750 kXMPFiles_OpenLimitedScanning = 0x00000080, <span class="comment">/* Only packet scan files "known" to need scanning. */</span>
-<a name="l00751"></a>00751 kXMPFiles_OpenInBackground = 0x10000000 <span class="comment">/* Set if calling from background thread. */</span>
-<a name="l00752"></a>00752 };
-<a name="l00753"></a>00753
-<a name="l00754"></a>00754 <span class="comment">/* A note about kXMPFiles_OpenInBackground. The XMPFiles handler for .mov files currently uses */</span>
-<a name="l00755"></a>00755 <span class="comment">/* QuickTime. On Macintosh, calls to Enter/ExitMovies versus Enter/ExitMoviesOnThread must be made. */</span>
-<a name="l00756"></a>00756 <span class="comment">/* This option is used to signal background use so that the .mov handler can behave appropriately. */</span>
-<a name="l00757"></a>00757
-<a name="l00758"></a>00758 <span class="keyword">enum</span> { <span class="comment">/* Options for CloseFile. */</span>
-<a name="l00759"></a>00759 kXMPFiles_UpdateSafely = 0x0001 <span class="comment">/* Write into a temporary file and swap for crash safety. */</span>
-<a name="l00760"></a>00760 };
-<a name="l00761"></a>00761
-<a name="l00762"></a>00762 <span class="comment">/* ============================================================================================== */</span>
-<a name="l00763"></a>00763 <span class="comment">/* Exception codes */</span>
-<a name="l00764"></a>00764 <span class="comment">/* =============== */</span>
-<a name="l00765"></a>00765
-<a name="l00779"></a>00779 <span class="preprocessor">#if ! __cplusplus</span>
-<a name="l00780"></a>00780 <span class="preprocessor"></span>
-<a name="l00781"></a>00781 <span class="keyword">typedef</span> <span class="keyword">struct </span>XMP_Error {
-<a name="l00782"></a>00782 XMP_Int32 id;
-<a name="l00783"></a>00783 XMP_StringPtr errMsg;
-<a name="l00784"></a>00784 } XMP_Error;
-<a name="l00785"></a>00785
-<a name="l00786"></a>00786 <span class="preprocessor">#else</span>
-<a name="l00787"></a>00787 <span class="preprocessor"></span>
-<a name="l00788"></a>00788 <span class="keyword">class </span>XMP_Error {
-<a name="l00789"></a>00789 <span class="keyword">public</span>:
-<a name="l00790"></a>00790 XMP_Error ( XMP_Int32 _id, XMP_StringPtr _errMsg ) : id(_id), errMsg(_errMsg) {};
-<a name="l00791"></a>00791 <span class="keyword">inline</span> XMP_Int32 GetID()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> id; };
-<a name="l00792"></a>00792 <span class="keyword">inline</span> XMP_StringPtr GetErrMsg()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errMsg; };
-<a name="l00793"></a>00793 <span class="keyword">private</span>:
-<a name="l00794"></a>00794 XMP_Int32 id;
-<a name="l00795"></a>00795 XMP_StringPtr errMsg;
-<a name="l00796"></a>00796 };
-<a name="l00797"></a>00797
-<a name="l00798"></a>00798 <span class="preprocessor">#endif</span>
-<a name="l00799"></a>00799 <span class="preprocessor"></span>
-<a name="l00800"></a>00800 <span class="keyword">enum</span> {
-<a name="l00801"></a>00801
-<a name="l00802"></a>00802 <span class="comment">/* More or less generic error codes. */</span>
-<a name="l00803"></a>00803 kXMPErr_Unknown = 0,
-<a name="l00804"></a>00804 kXMPErr_TBD = 1,
-<a name="l00805"></a>00805 kXMPErr_Unavailable = 2,
-<a name="l00806"></a>00806 kXMPErr_BadObject = 3,
-<a name="l00807"></a>00807 kXMPErr_BadParam = 4,
-<a name="l00808"></a>00808 kXMPErr_BadValue = 5,
-<a name="l00809"></a>00809 kXMPErr_AssertFailure = 6,
-<a name="l00810"></a>00810 kXMPErr_EnforceFailure = 7,
-<a name="l00811"></a>00811 kXMPErr_Unimplemented = 8,
-<a name="l00812"></a>00812 kXMPErr_InternalFailure = 9,
-<a name="l00813"></a>00813 kXMPErr_Deprecated = 10,
-<a name="l00814"></a>00814 kXMPErr_ExternalFailure = 11,
-<a name="l00815"></a>00815 kXMPErr_UserAbort = 12,
-<a name="l00816"></a>00816 kXMPErr_StdException = 13,
-<a name="l00817"></a>00817 kXMPErr_UnknownException = 14,
-<a name="l00818"></a>00818 kXMPErr_NoMemory = 15,
-<a name="l00819"></a>00819
-<a name="l00820"></a>00820 <span class="comment">/* More specific parameter error codes. */</span>
-<a name="l00821"></a>00821 kXMPErr_BadSchema = 101,
-<a name="l00822"></a>00822 kXMPErr_BadXPath = 102,
-<a name="l00823"></a>00823 kXMPErr_BadOptions = 103,
-<a name="l00824"></a>00824 kXMPErr_BadIndex = 104,
-<a name="l00825"></a>00825 kXMPErr_BadIterPosition = 105,
-<a name="l00826"></a>00826 kXMPErr_BadParse = 106,
-<a name="l00827"></a>00827 kXMPErr_BadSerialize = 107,
-<a name="l00828"></a>00828 kXMPErr_BadFileFormat = 108,
-<a name="l00829"></a>00829 kXMPErr_NoFileHandler = 109,
-<a name="l00830"></a>00830 kXMPErr_TooLargeForJPEG = 110,
-<a name="l00831"></a>00831
-<a name="l00832"></a>00832 <span class="comment">/* File format and internal structure error codes. */</span>
-<a name="l00833"></a>00833 kXMPErr_BadXML = 201,
-<a name="l00834"></a>00834 kXMPErr_BadRDF = 202,
-<a name="l00835"></a>00835 kXMPErr_BadXMP = 203,
-<a name="l00836"></a>00836 kXMPErr_EmptyIterator = 204,
-<a name="l00837"></a>00837 kXMPErr_BadUnicode = 205,
-<a name="l00838"></a>00838 kXMPErr_BadTIFF = 206,
-<a name="l00839"></a>00839 kXMPErr_BadJPEG = 207,
-<a name="l00840"></a>00840 kXMPErr_BadPSD = 208,
-<a name="l00841"></a>00841 kXMPErr_BadPSIR = 209,
-<a name="l00842"></a>00842 kXMPErr_BadIPTC = 210,
-<a name="l00843"></a>00843 kXMPErr_BadMPEG = 211
-<a name="l00844"></a>00844
-<a name="l00845"></a>00845 };
-<a name="l00846"></a>00846
-<a name="l00852"></a>00852 <span class="comment">/* ============================================================================================== */</span>
-<a name="l00853"></a>00853 <span class="comment">/* Client callbacks */</span>
-<a name="l00854"></a>00854 <span class="comment">/* ================ */</span>
-<a name="l00855"></a>00855
-<a name="l00856"></a>00856
-<a name="l00880"></a><a class="code" href="XMP__Const_8h.html#91efdc0a7fbe6e1d42ca34e6ce589b98">00880</a> <span class="keyword">typedef</span> XMP_Int32 <a class="code" href="XMP__Const_8h.html#91efdc0a7fbe6e1d42ca34e6ce589b98">XMP_Status</a>;
-<a name="l00881"></a>00881
-<a name="l00882"></a><a class="code" href="XMP__Const_8h.html#36eab570ab85ff8fb5789661692d13c2">00882</a> <span class="keyword">typedef</span> <a class="code" href="XMP__Const_8h.html#91efdc0a7fbe6e1d42ca34e6ce589b98">XMP_Status</a> (* <a class="code" href="XMP__Const_8h.html#36eab570ab85ff8fb5789661692d13c2">XMP_TextOutputProc</a>) ( <span class="keywordtype">void</span> * refCon,
-<a name="l00883"></a>00883 XMP_StringPtr buffer,
-<a name="l00884"></a>00884 XMP_StringLen bufferSize );
-<a name="l00885"></a>00885
-<a name="l00891"></a>00891 <span class="comment">/* ============================================================================================== */</span>
-<a name="l00892"></a>00892 <span class="comment">/* Stuff with no better place to be */</span>
-<a name="l00893"></a>00893 <span class="comment">/* ================================ */</span>
-<a name="l00894"></a>00894
-<a name="l00895"></a>00895 <span class="keyword">typedef</span> <span class="keyword">struct </span>XMP_VersionInfo {
-<a name="l00896"></a>00896 XMP_Uns8 major; <span class="comment">/* The primary release number, the "1" in version "1.2.3". */</span>
-<a name="l00897"></a>00897 XMP_Uns8 minor; <span class="comment">/* The secondary release number, the "2" in version "1.2.3". */</span>
-<a name="l00898"></a>00898 XMP_Uns8 micro; <span class="comment">/* The tertiary release number, the "3" in version "1.2.3". */</span>
-<a name="l00899"></a>00899 XMP_Bool isDebug; <span class="comment">/* Really a 0/1 bool value. True if this is a debug build. */</span>
-<a name="l00900"></a>00900 XMP_Uns32 build; <span class="comment">/* A rolling build number, monotonically increasing in a release. */</span>
-<a name="l00901"></a>00901 XMP_Uns32 flags; <span class="comment">/* Individual feature implementation flags. */</span>
-<a name="l00902"></a>00902 XMP_StringPtr message; <span class="comment">/* A comprehensive version information string. */</span>
-<a name="l00903"></a>00903 } XMP_VersionInfo;
-<a name="l00904"></a>00904
-<a name="l00905"></a>00905 <span class="keyword">typedef</span> bool (* XMP_AbortProc) ( <span class="keywordtype">void</span> * arg ); <span class="comment">/* Used by SXMPFiles::SetAbortProc. */</span>
-<a name="l00906"></a>00906
-<a name="l00907"></a>00907 <span class="comment">/* ============================================================================================== */</span>
-<a name="l00908"></a>00908
-<a name="l00909"></a>00909 <span class="preprocessor">#if __cplusplus</span>
-<a name="l00910"></a>00910 <span class="preprocessor"></span>} <span class="comment">/* extern "C" */</span>
-<a name="l00911"></a>00911 <span class="preprocessor">#endif</span>
-<a name="l00912"></a>00912 <span class="preprocessor"></span>
-<a name="l00913"></a>00913 <span class="preprocessor">#endif </span><span class="comment">/* __XMP_Const_h__ */</span>
-</pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:57 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/XMP__Const_8h.html b/docs/XMPToolkit/XMP__Const_8h.html
deleted file mode 100644
index d991c56..0000000
--- a/docs/XMPToolkit/XMP__Const_8h.html
+++ /dev/null
@@ -1,190 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: XMP_Const.h File Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>XMP_Const.h File Reference</h1>Common C/C++ types and constants for the XMP toolkit. <a href="#_details">More...</a>
-<p>
-<code>#include &quot;XMP_Environment.h&quot;</code><br>
-<code>#include &lt;stddef.h&gt;</code><br>
-
-<p>
-Include dependency graph for XMP_Const.h:<p><center><img src="XMP__Const_8h__incl.png" border="0" usemap="#XMP_Const.h_map" alt=""></center>
-
-<p>
-<a href="XMP__Const_8h-source.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The expanded type for a date and time. Dates and time in the serialized XMP are ISO 8601 strings. The <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> struct allows easy conversion with other formats. <a href="structXMP__DateTime.html#_details">More...</a><br></td></tr>
-<tr><td colspan="2"><br><h2>General scalar types and constants</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c39e0131b0e3d7db66e1cfa82b67141"></a><!-- doxytag: member="XMP_Const.h::kXMP_TrueStr" ref="4c39e0131b0e3d7db66e1cfa82b67141" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#4c39e0131b0e3d7db66e1cfa82b67141">kXMP_TrueStr</a>&nbsp;&nbsp;&nbsp;&quot;True&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The canonical true string value for Booleans in serialized XMP. Code that converts from the string to a bool should be case insensitive, and even allow "1". <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2dc55b533ed63ed7ff0c3be16a97e278"></a><!-- doxytag: member="XMP_Const.h::kXMP_FalseStr" ref="2dc55b533ed63ed7ff0c3be16a97e278" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#2dc55b533ed63ed7ff0c3be16a97e278">kXMP_FalseStr</a>&nbsp;&nbsp;&nbsp;&quot;False&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The canonical false string value for Booleans in serialized XMP. Code that converts from the string to a bool should be case insensitive, and even allow "0". <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d439e3ceeb4590d310f6125aa12c6df6"></a><!-- doxytag: member="XMP_Const.h::XMP_StringPtr" ref="d439e3ceeb4590d310f6125aa12c6df6" args="" -->
-typedef const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The type for input string parameters. A <code>const char *</code>, a null-terminated UTF-8 string. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f7dcc184f901c713274edfdac5bcc9a"></a><!-- doxytag: member="XMP_Const.h::XMP_StringLen" ref="9f7dcc184f901c713274edfdac5bcc9a" args="" -->
-typedef XMP_Uns32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The type for string length parameters. A 32-bit unsigned integer, as big as will be practically needed. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="00e9d9a76c144421105a4c2742203315"></a><!-- doxytag: member="XMP_Const.h::XMP_Index" ref="00e9d9a76c144421105a4c2742203315" args="" -->
-typedef XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The type for offsets and indices. A 32-bit signed integer. It is signed because that often makes loop termination tests safer. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eb865118433be92d88e5f49ed11487c8"></a><!-- doxytag: member="XMP_Const.h::XMP_OptionBits" ref="eb865118433be92d88e5f49ed11487c8" args="" -->
-typedef XMP_Uns32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The type for a collection of 32 flag bits. Individual flags are defined as enum value bit masks. A number of macros provide common set or set operations, e.g. <code>XMP_PropIsSimple</code>. For other tests use an expression like "options &amp; kXMP_&lt;theOption&gt;". When passing multiple option flags use the bitwise-or operator. '|', not the arithmatic plus, '+'. <br></td></tr>
-<tr><td colspan="2"><br><h2>Defines</h2></td></tr>
-<tr><td colspan="2"><div class="groupHeader">XML namespace constants for standard XMP schema.</div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="030875c9dc0861c9251a3374ca14a376"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP" ref="030875c9dc0861c9251a3374ca14a376" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">kXMP_NS_XMP</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the XMP "basic" schema. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e52d761e5a4fc8c8499215d2f3d82b90"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_Rights" ref="e52d761e5a4fc8c8499215d2f3d82b90" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#e52d761e5a4fc8c8499215d2f3d82b90">kXMP_NS_XMP_Rights</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/rights/&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the XMP copyright schema. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c67379a9ffa425d0d7976a51c4f2f754"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_MM" ref="c67379a9ffa425d0d7976a51c4f2f754" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#c67379a9ffa425d0d7976a51c4f2f754">kXMP_NS_XMP_MM</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/mm/&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the XMP digital asset management schema. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="308e156c325618acb2172e550929ebee"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_BJ" ref="308e156c325618acb2172e550929ebee" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#308e156c325618acb2172e550929ebee">kXMP_NS_XMP_BJ</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/bj/&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the job management schema. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0bcb67d0dd0922504e3da7ca5c40c82a"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_PDF" ref="0bcb67d0dd0922504e3da7ca5c40c82a" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#0bcb67d0dd0922504e3da7ca5c40c82a">kXMP_NS_PDF</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/pdf/1.3/&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the PDF schema. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a1a6f38ebfcdb281c5bf2809859167c7"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_Photoshop" ref="a1a6f38ebfcdb281c5bf2809859167c7" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#a1a6f38ebfcdb281c5bf2809859167c7">kXMP_NS_Photoshop</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/photoshop/1.0/&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the Photoshop custom schema. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d12182e1df1652f56b5eec60c1fcdd8f"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_EXIF" ref="d12182e1df1652f56b5eec60c1fcdd8f" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#d12182e1df1652f56b5eec60c1fcdd8f">kXMP_NS_EXIF</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/exif/1.0/&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for Adobe's EXIF schema. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="673355818b7b9224e8fec0fbc60ba00c"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_TIFF" ref="673355818b7b9224e8fec0fbc60ba00c" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#673355818b7b9224e8fec0fbc60ba00c">kXMP_NS_TIFF</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/tiff/1.0/&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for Adobe's TIFF schema. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0a2d9c5f7beb27553214a7ad1df4f27e"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_T" ref="0a2d9c5f7beb27553214a7ad1df4f27e" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#0a2d9c5f7beb27553214a7ad1df4f27e">kXMP_NS_XMP_T</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/t/&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the XMP text document schema. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="39afb495ffb24bb3082493c6811e65d0"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_T_PG" ref="39afb495ffb24bb3082493c6811e65d0" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#39afb495ffb24bb3082493c6811e65d0">kXMP_NS_XMP_T_PG</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/t/pg/&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the XMP paged document schema. <br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">XML namespace constants for qualifiers and structured property fields.</div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b466db52a4b85cecfa04710682c1e671"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_IdentifierQual" ref="b466db52a4b85cecfa04710682c1e671" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#b466db52a4b85cecfa04710682c1e671">kXMP_NS_XMP_IdentifierQual</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xmp/Identifier/qual/1.0/&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for qualifiers of the xmp:Identifier property. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9618e013619aa92ebc808b62243d2ba8"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_Dimensions" ref="9618e013619aa92ebc808b62243d2ba8" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#9618e013619aa92ebc808b62243d2ba8">kXMP_NS_XMP_Dimensions</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/sType/Dimensions#&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for fields of the Dimensions type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="935641acc7d01e782ad7a457a7ff338b"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_Image" ref="935641acc7d01e782ad7a457a7ff338b" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#935641acc7d01e782ad7a457a7ff338b">kXMP_NS_XMP_Image</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/g/img/&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for fields of a graphical image. Used for the Thumbnail type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="861613273127156050b456eee11f6b0a"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_ResourceEvent" ref="861613273127156050b456eee11f6b0a" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#861613273127156050b456eee11f6b0a">kXMP_NS_XMP_ResourceEvent</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/sType/ResourceEvent#&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for fields of the ResourceEvent type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9bf51f2653400645f7b5087e8c4e1c77"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_ResourceRef" ref="9bf51f2653400645f7b5087e8c4e1c77" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#9bf51f2653400645f7b5087e8c4e1c77">kXMP_NS_XMP_ResourceRef</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/sType/ResourceRef#&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for fields of the ResourceRef type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b4923bed71ab29c6aa88debe8816c0a2"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_ST_Version" ref="b4923bed71ab29c6aa88debe8816c0a2" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#b4923bed71ab29c6aa88debe8816c0a2">kXMP_NS_XMP_ST_Version</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/sType/Version#&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for fields of the Version type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c7dc4d65bcbba2862e410cc8cfdff6f6"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XMP_ST_Job" ref="c7dc4d65bcbba2862e410cc8cfdff6f6" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#c7dc4d65bcbba2862e410cc8cfdff6f6">kXMP_NS_XMP_ST_Job</a>&nbsp;&nbsp;&nbsp;&quot;http://ns.adobe.com/xap/1.0/sType/Job#&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for fields of the JobRef type. <br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">XML namespace constants from outside Adobe.</div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="44453f0d0a1dd295d41722c2387b36fa"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_DC" ref="44453f0d0a1dd295d41722c2387b36fa" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#44453f0d0a1dd295d41722c2387b36fa">kXMP_NS_DC</a>&nbsp;&nbsp;&nbsp;&quot;http://purl.org/dc/elements/1.1/&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the Dublin Core schema. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b794d3d798daf75a963398347dcbb79b"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_IPTCCore" ref="b794d3d798daf75a963398347dcbb79b" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#b794d3d798daf75a963398347dcbb79b">kXMP_NS_IPTCCore</a>&nbsp;&nbsp;&nbsp;&quot;http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for the IPTC Core schema. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="276fac0f70893607afa3f09030ad84c7"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_RDF" ref="276fac0f70893607afa3f09030ad84c7" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#276fac0f70893607afa3f09030ad84c7">kXMP_NS_RDF</a>&nbsp;&nbsp;&nbsp;&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for RDF. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="97564c70460d1f235c8a41b8ac40cfe9"></a><!-- doxytag: member="XMP_Const.h::kXMP_NS_XML" ref="97564c70460d1f235c8a41b8ac40cfe9" args="" -->
-#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#97564c70460d1f235c8a41b8ac40cfe9">kXMP_NS_XML</a>&nbsp;&nbsp;&nbsp;&quot;http://www.w3.org/XML/1998/namespace&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The XML namespace for XML. <br></td></tr>
-<tr><td colspan="2"><br><h2>Typedefs</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef __XMPMeta__ *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#5912613564f80e17eb10acef9236f70a">XMPMetaRef</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">An "ABI safe" pointer to the internal part of an XMP object. <a href="#5912613564f80e17eb10acef9236f70a"></a><br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Special purpose callback functions</div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="91efdc0a7fbe6e1d42ca34e6ce589b98"></a><!-- doxytag: member="XMP_Const.h::XMP_Status" ref="91efdc0a7fbe6e1d42ca34e6ce589b98" args="" -->
-typedef XMP_Int32&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#91efdc0a7fbe6e1d42ca34e6ce589b98">XMP_Status</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A signed 32 bit integer used as a status result for the output callback routine. Zero means no error, all other values except -1 are private to the callback. The callback is wrapped to prevent exceptions being thrown across DLL boundaries. Any exceptions thrown out of the callback cause a return status of -1. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="36eab570ab85ff8fb5789661692d13c2"></a><!-- doxytag: member="XMP_Const.h::XMP_TextOutputProc" ref="36eab570ab85ff8fb5789661692d13c2" args="(void *refCon, XMP_StringPtr buffer, XMP_StringLen bufferSize)" -->
-typedef <a class="el" href="XMP__Const_8h.html#91efdc0a7fbe6e1d42ca34e6ce589b98">XMP_Status</a>(*)&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="XMP__Const_8h.html#36eab570ab85ff8fb5789661692d13c2">XMP_TextOutputProc</a> (void *refCon, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> buffer, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> bufferSize)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Direct text output from the XMP toolkit, such as debugging dumps, is done using client supplied callbacks. The callback is invoked one or more times for each line of output. The end of a line is signaled by a '<br>
-' character at the end of the buffer. Formatting newlines are never present in the middle of a buffer, but values of properties might contain any UTF-8 characters. A success/fail status is returned by the callback. Any failure result aborts the output. <br></td></tr>
-<tr><td colspan="2"><br><h2>Enumerations</h2></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Exception codes.</div></td></tr>
-<tr><td colspan="2"><div class="groupText">XMP tookit errors result in throwing an <code>XMP_Error</code> exception. Any exception thrown within the XMP toolkit is caught in the toolkit and rethrown as an <code>XMP_Error</code>. The <code>XMP_Error</code> struct contains a numeric code and an English explanation. New numeric codes may be added at any time. There are typically many possible explanations for each numeric code. The explanations try to be precise about the specific circumstances causing the error.<p>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>The explanation string is for debugging use only. It must not be shown to users in a final product. It is written for developers not users, and never localized. </dd></dl>
-<br><br></div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"></td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-Common C/C++ types and constants for the XMP toolkit.
-<p>
-================================================================================================ <hr><h2>Typedef Documentation</h2>
-<a class="anchor" name="5912613564f80e17eb10acef9236f70a"></a><!-- doxytag: member="XMP_Const.h::XMPMetaRef" ref="5912613564f80e17eb10acef9236f70a" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="XMP__Const_8h.html#5912613564f80e17eb10acef9236f70a">XMPMetaRef</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-An "ABI safe" pointer to the internal part of an XMP object.
-<p>
-<code>XMPMetaRef</code> is an "ABI safe" pointer to the internal part of an XMP object. It should be used for passing an XMP object across client DLL boundaries. See the discussion in <code><a class="el" href="TXMPMeta_8hpp.html">TXMPMeta.hpp</a></code>.
-</div>
-</div><p>
-<hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:58 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/XMP__Const_8h__incl.png b/docs/XMPToolkit/XMP__Const_8h__incl.png
deleted file mode 100644
index c1bdbeb..0000000
--- a/docs/XMPToolkit/XMP__Const_8h__incl.png
+++ /dev/null
Binary files differ
diff --git a/docs/XMPToolkit/annotated.html b/docs/XMPToolkit/annotated.html
deleted file mode 100644
index d3cb5e2..0000000
--- a/docs/XMPToolkit/annotated.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: Class List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li id="current"><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul></div>
-<h1>Adobe XMP Toolkit Class List</h1>Here are the classes, structs, unions and interfaces with brief descriptions:<table>
- <tr><td class="indexkey"><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td class="indexvalue">API for access to the "main" metadata in a file </td></tr>
- <tr><td class="indexkey"><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td class="indexvalue">Template class for the XMP Toolkit iteration services </td></tr>
- <tr><td class="indexkey"><a class="el" href="classTXMPMeta.html">TXMPMeta&lt; tStringObj &gt;</a></td><td class="indexvalue">Template class for the XMP Toolkit core services </td></tr>
- <tr><td class="indexkey"><a class="el" href="classTXMPUtils.html">TXMPUtils&lt; tStringObj &gt;</a></td><td class="indexvalue">Template class for the XMP Toolkit utility services </td></tr>
- <tr><td class="indexkey"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></td><td class="indexvalue">The expanded type for a date and time. Dates and time in the serialized XMP are ISO 8601 strings. The <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> struct allows easy conversion with other formats </td></tr>
-</table>
-<hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:58 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/classTXMPFiles-members.html b/docs/XMPToolkit/classTXMPFiles-members.html
deleted file mode 100644
index b5deac5..0000000
--- a/docs/XMPToolkit/classTXMPFiles-members.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul></div>
-<h1>TXMPFiles&lt; tStringObj &gt; Member List</h1>This is the complete list of members for <a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6">CanPutXMP</a>(const SXMPMeta &amp;xmpObj)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927">CloseFile</a>(XMP_OptionBits closeFlags=0)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#f9931d081cb19f98c81e41786030765b">GetFileInfo</a>(tStringObj *filePath=0, XMP_OptionBits *openFlags=0, XMP_FileFormat *format=0, XMP_OptionBits *handlerFlags=0)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#6ac78e3c7286ca8dcb41eaa007aa00e8">GetFormatInfo</a>(XMP_FileFormat format, XMP_OptionBits *handlerFlags=0)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#4ea1eda39f803322e10b2a554ef8ab06">GetThumbnail</a>(XMP_ThumbnailInfo *tnailInfo)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3">GetXMP</a>(SXMPMeta *xmpObj=0, tStringObj *xmpPacket=0, XMP_PacketInfo *packetInfo=0)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#0874bbbf41c9490abfb613bfe297327d">Initialize</a>()</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb">OpenFile</a>(XMP_StringPtr filePath, XMP_FileFormat format=kXMP_UnknownFile, XMP_OptionBits openFlags=0)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a">PutXMP</a>(const SXMPMeta &amp;xmpObj)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#7b86c130fdbd54b5ac158ec3fee93777">SetAbortProc</a>(XMP_AbortProc abortProc, void *abortArg)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#1e8de80c252b60b332dc4bc524139fd8">Terminate</a>()</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#14f01e38454178578fd25fff6024fd54">TXMPFiles</a>()</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#36abe01988d4ca3939138e871c7b75e7">TXMPFiles</a>(XMP_StringPtr filePath, XMP_FileFormat format=kXMP_UnknownFile, XMP_OptionBits openFlags=0)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#cf343fb6771b482ca72d467233a6f920">TXMPFiles</a>(const TXMPFiles&lt; tStringObj &gt; &amp;original)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPFiles.html#d986c7b2e2d82eaef6cf6a33e9d09b65">TXMPFiles</a>(XMPFilesRef xmpFilesObj)</td><td><a class="el" href="classTXMPFiles.html">TXMPFiles&lt; tStringObj &gt;</a></td><td></td></tr>
-</table><hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:58 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/classTXMPFiles.html b/docs/XMPToolkit/classTXMPFiles.html
deleted file mode 100644
index 689af11..0000000
--- a/docs/XMPToolkit/classTXMPFiles.html
+++ /dev/null
@@ -1,527 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: TXMPFiles&lt; tStringObj &gt; Class Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul></div>
-<h1>TXMPFiles&lt; tStringObj &gt; Class Template Reference</h1><!-- doxytag: class="TXMPFiles" -->API for access to the "main" metadata in a file.
-<a href="#_details">More...</a>
-<p>
-<code>#include &lt;<a class="el" href="TXMPFiles_8hpp-source.html">TXMPFiles.hpp</a>&gt;</code>
-<p>
-<a href="classTXMPFiles-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Constructors and destructor</h2></td></tr>
-<tr><td colspan="2">The default constructor initializes an object that is associated with no file. The alternate constructors call OpenFile. The destructor automatically calls CloseFile if necessary. <br><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14f01e38454178578fd25fff6024fd54"></a><!-- doxytag: member="TXMPFiles::TXMPFiles" ref="14f01e38454178578fd25fff6024fd54" args="()" -->
-&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#14f01e38454178578fd25fff6024fd54">TXMPFiles</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The default constructor initializes an object that is associated with no file. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5eaa92724cc82d933a32eff9c4636739"></a><!-- doxytag: member="TXMPFiles::~TXMPFiles" ref="5eaa92724cc82d933a32eff9c4636739" args="()" -->
-virtual&nbsp;</td><td class="memItemRight" valign="bottom"><b>~TXMPFiles</b> () throw ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="36abe01988d4ca3939138e871c7b75e7"></a><!-- doxytag: member="TXMPFiles::TXMPFiles" ref="36abe01988d4ca3939138e871c7b75e7" args="(XMP_StringPtr filePath, XMP_FileFormat format=kXMP_UnknownFile, XMP_OptionBits openFlags=0)" -->
-&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#36abe01988d4ca3939138e871c7b75e7">TXMPFiles</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> filePath, XMP_FileFormat format=kXMP_UnknownFile, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> openFlags=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">These alternate constructors call <code>OpenFile</code>. The second form is a trivial overload that calls the first form passing <code>filePath.c_str()</code>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f540b3ea689a6d7381dca4f52132a4ac"></a><!-- doxytag: member="TXMPFiles::TXMPFiles" ref="f540b3ea689a6d7381dca4f52132a4ac" args="(const tStringObj &amp;filePath, XMP_FileFormat format=kXMP_UnknownFile, XMP_OptionBits openFlags=0)" -->
-&nbsp;</td><td class="memItemRight" valign="bottom"><b>TXMPFiles</b> (const tStringObj &amp;filePath, XMP_FileFormat format=kXMP_UnknownFile, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> openFlags=0)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cf343fb6771b482ca72d467233a6f920"></a><!-- doxytag: member="TXMPFiles::TXMPFiles" ref="cf343fb6771b482ca72d467233a6f920" args="(const TXMPFiles&lt; tStringObj &gt; &amp;original)" -->
-&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#cf343fb6771b482ca72d467233a6f920">TXMPFiles</a> (const <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt; &amp;original)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The copy constructor and assignment operator increment an internal reference count, they do not perform a deep copy. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3f1483fcc92860460d3772216dfaef81"></a><!-- doxytag: member="TXMPFiles::operator=" ref="3f1483fcc92860460d3772216dfaef81" args="(const TXMPFiles&lt; tStringObj &gt; &amp;rhs)" -->
-void&nbsp;</td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt; &amp;rhs)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d986c7b2e2d82eaef6cf6a33e9d09b65"></a><!-- doxytag: member="TXMPFiles::TXMPFiles" ref="d986c7b2e2d82eaef6cf6a33e9d09b65" args="(XMPFilesRef xmpFilesObj)" -->
-&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#d986c7b2e2d82eaef6cf6a33e9d09b65">TXMPFiles</a> (XMPFilesRef xmpFilesObj)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The "ref" constructor and <code>GetInternalRef</code> serve the same purpose as their analogs in SXMPMeta, safely passing <code>SXMPFiles</code> references across DLL boundaries where the clients might have used different string types when instantiating <code><a class="el" href="classTXMPFiles.html">TXMPFiles</a></code>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="311fc36fdf7270fe05b1c531cdbbd009"></a><!-- doxytag: member="TXMPFiles::GetInternalRef" ref="311fc36fdf7270fe05b1c531cdbbd009" args="()" -->
-XMPFilesRef&nbsp;</td><td class="memItemRight" valign="bottom"><b>GetInternalRef</b> ()</td></tr>
-
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td colspan="2"><div class="groupHeader">OpenFile, CloseFile, and related file-oriented operations</div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb">OpenFile</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> filePath, XMP_FileFormat format=kXMP_UnknownFile, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> openFlags=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Open a file for metadata access. <a href="#fcd21cfe5d6f13c648c5541e161919cb"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927">CloseFile</a> (<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> closeFlags=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Close an opened file. <a href="#eca89170c7aa3e2d56e30bff04dd7927"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#f9931d081cb19f98c81e41786030765b">GetFileInfo</a> (tStringObj *filePath=0, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *openFlags=0, XMP_FileFormat *format=0, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *handlerFlags=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get basic information about an opened file. <a href="#f9931d081cb19f98c81e41786030765b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#7b86c130fdbd54b5ac158ec3fee93777">SetAbortProc</a> (XMP_AbortProc abortProc, void *abortArg)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set the callback function used to check for a user signaled abort. <a href="#7b86c130fdbd54b5ac158ec3fee93777"></a><br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Metadata Access Functions</div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3">GetXMP</a> (SXMPMeta *xmpObj=0, tStringObj *xmpPacket=0, XMP_PacketInfo *packetInfo=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Obtain the XMP. <a href="#42ca0bbc5ac66a8de1710e03a7ff17b3"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#4ea1eda39f803322e10b2a554ef8ab06">GetThumbnail</a> (XMP_ThumbnailInfo *tnailInfo)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Obtain the native thumbnail. <a href="#4ea1eda39f803322e10b2a554ef8ab06"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a">PutXMP</a> (const SXMPMeta &amp;xmpObj)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Update the XMP. <a href="#d3f7babdc07c7de0d0cd9a3362b4710a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6">CanPutXMP</a> (const SXMPMeta &amp;xmpObj)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Determine if the XMP can be updated. <a href="#29a11a1539d6300da3fb4c7e9ea02bb6"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Initialization and termination</div></td></tr>
-<tr><td colspan="2"><div class="groupText"><code>SXMPFiles</code> must be initialized before use and may be terminated when done. <br><br></div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6e521c034728b59ab55213a9d8203d1e"></a><!-- doxytag: member="TXMPFiles::GetVersionInfo" ref="6e521c034728b59ab55213a9d8203d1e" args="(XMP_VersionInfo *versionInfo)" -->
-static void&nbsp;</td><td class="memItemRight" valign="bottom"><b>GetVersionInfo</b> (XMP_VersionInfo *versionInfo)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0874bbbf41c9490abfb613bfe297327d"></a><!-- doxytag: member="TXMPFiles::Initialize" ref="0874bbbf41c9490abfb613bfe297327d" args="()" -->
-static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#0874bbbf41c9490abfb613bfe297327d">Initialize</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>Initialize</code> must be called before using <code>SXMPFiles</code>. It returns a Boolean success/failure value. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="794e1830a84a6328eaa1995ba5aa6874"></a><!-- doxytag: member="TXMPFiles::Initialize" ref="794e1830a84a6328eaa1995ba5aa6874" args="(XMP_OptionBits options)" -->
-static bool&nbsp;</td><td class="memItemRight" valign="bottom"><b>Initialize</b> (<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e8de80c252b60b332dc4bc524139fd8"></a><!-- doxytag: member="TXMPFiles::Terminate" ref="1e8de80c252b60b332dc4bc524139fd8" args="()" -->
-static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#1e8de80c252b60b332dc4bc524139fd8">Terminate</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>Terminate</code> may be called when done using <code>SXMPFiles</code>. It deallocates global data structures created by <code>Initialize</code>. <br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Static Functions</div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPFiles.html#6ac78e3c7286ca8dcb41eaa007aa00e8">GetFormatInfo</a> (XMP_FileFormat format, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *handlerFlags=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Determine the supported features for a given file format. <a href="#6ac78e3c7286ca8dcb41eaa007aa00e8"></a><br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template&lt;class tStringObj&gt;<br>
- class TXMPFiles&lt; tStringObj &gt;</h3>
-
-API for access to the "main" metadata in a file.
-<p>
-<code><a class="el" href="classTXMPFiles.html">TXMPFiles</a></code> provides the API for the Adobe XMP Toolkit's File Handler component. This provides convenient access to the main, or document level, XMP for a file. The general model is to open a file, read and write the metadata, then close the file. While open, portions of the file might be maintained in RAM data structures. Memory usage can vary considerably depending on file format and access options. The file may be opened for read-only or read-write access, with typical exclusion for both modes.<p>
-Errors result in the throw of an <code>XMPError</code> exception.<p>
-The template is instantiated with a string object class. This allows a clean implementation that provides two major benefits: output string storage is fully owned by the client and access is fully thread safe. The template parameter, class <code>tStringObj</code>, is described in the XMP.hpp umbrella header.<p>
-To use <a class="el" href="classTXMPFiles.html">TXMPFiles</a> define TXMP_STRING_TYPE and XMP_INCLUDE_XMPFILES, then include the XMP.hpp umbrella header: <div class="fragment"><pre class="fragment"><span class="preprocessor"> #define TXMP_STRING_TYPE std::string</span>
-<span class="preprocessor"></span><span class="preprocessor"> #define XMP_INCLUDE_XMPFILES 1</span>
-<span class="preprocessor"> #include "XMP.hpp"</span>
-</pre></div>
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="6ac78e3c7286ca8dcb41eaa007aa00e8"></a><!-- doxytag: member="TXMPFiles::GetFormatInfo" ref="6ac78e3c7286ca8dcb41eaa007aa00e8" args="(XMP_FileFormat format, XMP_OptionBits *handlerFlags=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::GetFormatInfo </td>
- <td>(</td>
- <td class="paramtype">XMP_FileFormat&nbsp;</td>
- <td class="paramname"> <em>format</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
- <td class="paramname"> <em>handlerFlags</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Determine the supported features for a given file format.
-<p>
-The supported features can vary quite a bit among file formats, depending on both the general capabilities of the format and the implementation of the handler for that format.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>format</em>&nbsp;</td><td>The format whose support flags are desired.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>handlerFlags</em>&nbsp;</td><td>A set of option bits showing the support for this format:</td></tr>
- </table>
-</dl>
-<ul>
-<li>kXMPFiles_CanInjectXMP - Can inject first-time XMP into an existing file. </li>
-<li>kXMPFiles_CanExpand - Can expand XMP or other metadata in an existing file. </li>
-<li>kXMPFiles_CanRewrite - Can copy one file to another, writing new metadata. </li>
-<li>kXMPFiles_CanReconcile - Supports reconciliation between XMP and other forms. </li>
-<li>kXMPFiles_AllowsOnlyXMP - Allows access to just the XMP, ignoring other forms. </li>
-<li>kXMPFiles_ReturnsRawPacket - File handler returns raw XMP packet information and string. </li>
-<li>kXMPFiles_ReturnsTNail - File handler returns native thumbnail information.</li>
-</ul>
-The kXMPFiles_AllowsOnlyXMP flag is only meaningful if kXMPFiles_CanReconcile is set.<p>
-If kXMPFiles_ReturnsRawPacket is set, the returned packet information might have an offset of -1 to indicate an unknown offset. While all file handlers should be able to return the raw packet, some might not know the offset of the packet within the file. This is typical in cases where external libraries are used. These cases might not even allow return of the raw packet.<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the format has explicit "smart" support. Returns false if the format is handled by the default packet scanning plus heuristics. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="fcd21cfe5d6f13c648c5541e161919cb"></a><!-- doxytag: member="TXMPFiles::OpenFile" ref="fcd21cfe5d6f13c648c5541e161919cb" args="(XMP_StringPtr filePath, XMP_FileFormat format=kXMP_UnknownFile, XMP_OptionBits openFlags=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::OpenFile </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>filePath</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">XMP_FileFormat&nbsp;</td>
- <td class="paramname"> <em>format</em> = <code>kXMP_UnknownFile</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>openFlags</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Open a file for metadata access.
-<p>
-Opens a file for the requested forms of metadata access. Opening the file at a minimum causes the raw XMP packet to be read from the file. If the file handler supports legacy metadata reconciliation then legacy metadata will also be read, unless kXMPFiles_OpenOnlyXMP is passed. If the file handler supports native thumbnails and kXMPFiles_OpenCacheTNail is passed then the native thumbnail will also be cached.<p>
-If the file is opened for read-only access (passing kXMPFiles_OpenForRead), then the disk file itself will be closed after reading the data from it. The XMPFiles object will not be "closed" though, it is still necessary to call CloseFile when finished using it. Other methods (GetXMP, etc.) can only be used between the OpenFile and CloseFile calls. The XMPFiles destructor will not call CloseFile, any pending updates will be lost.<p>
-If the file is opened for update (passing kXMPFiles_OpenForUpdate), then the disk file remains open until CloseFile is called. The disk file is only updated once, when Close file is called, no matter how many calls are made to PutXMP.<p>
-Ideally the XMP is not parsed and legacy reconciliation is not performed until GetXMP is called. This is not guaranteed though, specific file handlers might do earlier parsing of the XMP. This delayed parsing and the early disk file close for read-only access are optimizations to help clients implementing file browsers. They can access the file briefly and possibly display a thumbnail, then postpone more expensive XMP processing until later.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>filePath</em>&nbsp;</td><td>The UTF-8 path for the file, appropriate for the local OS. Overloads are declared to pass the path as either a "const char *" or a string object.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>format</em>&nbsp;</td><td>The format of the file. If the format is unknown pass <code>kXMP_UnknownFile</code> and the format will be determined from the file content. The first handler to check will be guessed from the file's extension. Passing any other format value is generally just a hint about what file handler to try first (instead of the one based on the extension). If the kXMPFiles_OpenStrictly is set, then any format other than kXMP_UnknownFile requires that the file actually be that format, an exception is thrown if not.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>openFlags</em>&nbsp;</td><td>A set of option bits describing the desired access. By default (zero) the file is opened for read-only access and the format handler decides on the level of reconciliation that will be performed. By default a best effort will be made to locate the correct XMP and to reconcile XMP with other forms (if reconciliation is done). The option <code>kXMPFiles_OpenStrictly</code> may be used to force more strict rules, resulting is exceptions for errors. The definition of strictness is specific to each handler, there may be no difference.</td></tr>
- </table>
-</dl>
-The defined openFlag bits are:<p>
-<ul>
-<li>kXMPFiles_OpenForRead - Open for read-only access. </li>
-<li>kXMPFiles_OpenForUpdate - Open for reading and writing. </li>
-<li>kXMPFiles_OpenOnlyXMP - Only the XMP is wanted, no reconciliation. </li>
-<li>kXMPFiles_OpenCacheTNail - Cache thumbnail if possible, GetThumbnail will be called. </li>
-<li>kXMPFiles_OpenStrictly - Be strict about locating XMP and reconciling with other forms. </li>
-<li>kXMPFiles_OpenUseSmartHandler - Require the use of a smart handler. </li>
-<li>kXMPFiles_OpenUsePacketScanning - Force packet scanning, don't use a smart handler.</li>
-</ul>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the file is succesfully opened and attached to a file handler. Returns false for "anticipated" problems, e.g. passing kXMPFiles_OpenUseSmartHandler but not having an appropriate smart handler. Throws an exception for serious problems. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="eca89170c7aa3e2d56e30bff04dd7927"></a><!-- doxytag: member="TXMPFiles::CloseFile" ref="eca89170c7aa3e2d56e30bff04dd7927" args="(XMP_OptionBits closeFlags=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::CloseFile </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>closeFlags</em> = <code>0</code> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Close an opened file.
-<p>
-Performs any necessary output to the file and closes it. Files that are opened for update are written to only when closing.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>closeFlags</em>&nbsp;</td><td>A set of bit flags for optional closing actions.</td></tr>
- </table>
-</dl>
-The defined closeFlags bits are:<p>
-<ul>
-<li>kXMPFiles_UpdateSafely - Write into a temporary file then swap for crash safety. </li>
-</ul>
-
-</div>
-</div><p>
-<a class="anchor" name="f9931d081cb19f98c81e41786030765b"></a><!-- doxytag: member="TXMPFiles::GetFileInfo" ref="f9931d081cb19f98c81e41786030765b" args="(tStringObj *filePath=0, XMP_OptionBits *openFlags=0, XMP_FileFormat *format=0, XMP_OptionBits *handlerFlags=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::GetFileInfo </td>
- <td>(</td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>filePath</em> = <code>0</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
- <td class="paramname"> <em>openFlags</em> = <code>0</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">XMP_FileFormat *&nbsp;</td>
- <td class="paramname"> <em>format</em> = <code>0</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
- <td class="paramname"> <em>handlerFlags</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Get basic information about an opened file.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>filePath</em>&nbsp;</td><td>If not null, returns the path passed to OpenFile.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>openFlags</em>&nbsp;</td><td>If not null, returns the flags passed to OpenFile.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>format</em>&nbsp;</td><td>If not null, returns the format of the file.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>handlerFlags</em>&nbsp;</td><td>If not null, returns the handler's capability flags.</td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if a file is opened, false otherwise. This notion of "open" really means that OpenFile has been called but CloseFile has not. The actual disk file might be closed in the host file system sense, as explained for OpenFile. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="7b86c130fdbd54b5ac158ec3fee93777"></a><!-- doxytag: member="TXMPFiles::SetAbortProc" ref="7b86c130fdbd54b5ac158ec3fee93777" args="(XMP_AbortProc abortProc, void *abortArg)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::SetAbortProc </td>
- <td>(</td>
- <td class="paramtype">XMP_AbortProc&nbsp;</td>
- <td class="paramname"> <em>abortProc</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">void *&nbsp;</td>
- <td class="paramname"> <em>abortArg</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Set the callback function used to check for a user signaled abort.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>abortProc</em>&nbsp;</td><td>The callback function used to check for a user signaled abort. It will be called periodically to allow an abort of time consuming operations. The abort results in an exception being thrown. The callback function should return true to signal an abort.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>abortArg</em>&nbsp;</td><td>An argument passed to the callback function. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="42ca0bbc5ac66a8de1710e03a7ff17b3"></a><!-- doxytag: member="TXMPFiles::GetXMP" ref="42ca0bbc5ac66a8de1710e03a7ff17b3" args="(SXMPMeta *xmpObj=0, tStringObj *xmpPacket=0, XMP_PacketInfo *packetInfo=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::GetXMP </td>
- <td>(</td>
- <td class="paramtype">SXMPMeta *&nbsp;</td>
- <td class="paramname"> <em>xmpObj</em> = <code>0</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>xmpPacket</em> = <code>0</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">XMP_PacketInfo *&nbsp;</td>
- <td class="paramname"> <em>packetInfo</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Obtain the XMP.
-<p>
-<code>GetXMP</code> is used to obtain the parsed XMP, and/or the raw XMP packet, and/or information about the raw XMP packet. If all parameters are null it simply tells if XMP is present or not. The options provided when the file was opened determine if reconciliation is done with other forms of metadata.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>xmpObj</em>&nbsp;</td><td>If not null, returns the parsed XMP.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>xmpPacket</em>&nbsp;</td><td>If not null, returns the raw XMP packet as stored in the file. The encoding of the packet is given in the packetInfo. The string will be empty if the low level file handler does not provide the raw packet.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>packetInfo</em>&nbsp;</td><td>If not null, returns the location and form of the raw XMP in the file. The charForm and writeable flag reflect the raw XMP in the file. The parsed XMP property values are always UTF-8. The writeable flag is taken from the packet trailer, it is only relevant for "format ignorant" writing.</td></tr>
- </table>
-</dl>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>The packetInfo struct always reflects the state of the XMP in the file. The offset, length, and character form will not change as a result of calling <code>PutXMP</code> unless the file is also written.<p>
-Some file handlers might not return location or contents of the raw packet string. Check the <code>kXMPFiles_ReturnsRawPacket</code> bit returned by GetFormatInfo if you depend on this. If the low level file handler does not provide the raw packet location then the offset and length will both be 0, the charForm will be UTF-8, and the writeable flag will be false.</dd></dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the file has XMP, false otherwise. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="4ea1eda39f803322e10b2a554ef8ab06"></a><!-- doxytag: member="TXMPFiles::GetThumbnail" ref="4ea1eda39f803322e10b2a554ef8ab06" args="(XMP_ThumbnailInfo *tnailInfo)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::GetThumbnail </td>
- <td>(</td>
- <td class="paramtype">XMP_ThumbnailInfo *&nbsp;</td>
- <td class="paramname"> <em>tnailInfo</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Obtain the native thumbnail.
-<p>
-<code>GetThumbnail</code> is used to obtain native thumbnail information, if the associated file handler supports that and the thumbnail was cached by OpenFile. This requires that kXMPFiles_OpenCacheTNail be passed to OpenFile. The tnailInfo output pointer can be null, in which case GetThumbnail will simply tell if a recognized native thumbnail is present.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>tnailInfo</em>&nbsp;</td><td>If not null, returns information about a recognized native thumbnail, and some related information about the primary image if appropriate.</td></tr>
- </table>
-</dl>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>The returned thumbnail information can be incomplete. What gets returned can depend on the file format, the file handler's capabilities, and the specific file content.</dd></dl>
-<ul>
-<li>The fullHeight, fullWIdth, and fullOrientation fields are only meaningful for image files. They are not meaningful for multi-page files such as PDF or InDesign, for dynamic audio or video files, etc. The fields will be zero if not meaningful or not determined.</li>
-</ul>
-<ul>
-<li>The tnailImage and tnailSize fields might be zero even if a "recognized" thumbnail is present. Being recognized means only that the handler has determined that the file does contain a native thumbnail. The thumbnail data might be of a format that the file handler cannot (or does not) return a single contiguous block of thumbnail data. A possible case of this is a TIFF uncompressed thumbnail, the handler might not have logic to gather the various disjoint pieces of the thumbnail from the overall TIFF stream.</li>
-</ul>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if a recognized native thumbnail is presentand the thumbnail was cached by OpenFile. This requires that kXMPFiles_OpenCacheTNail be passed to OpenFile. Note that GetThumbnail can return true but still not return an actual thumbnail image, see the above note. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="d3f7babdc07c7de0d0cd9a3362b4710a"></a><!-- doxytag: member="TXMPFiles::PutXMP" ref="d3f7babdc07c7de0d0cd9a3362b4710a" args="(const SXMPMeta &amp;xmpObj)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::PutXMP </td>
- <td>(</td>
- <td class="paramtype">const SXMPMeta &amp;&nbsp;</td>
- <td class="paramname"> <em>xmpObj</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Update the XMP.
-<p>
-<code>PutXMP</code> supplies new XMP for the file. However, the file is not actully written until closed. The options provided when the file was opened determine if reconciliation is done with other forms of metadata. Overloads are provided to pass the XMP as an XMP object, a string object, or a "const char *" plus length.
-</div>
-</div><p>
-<a class="anchor" name="29a11a1539d6300da3fb4c7e9ea02bb6"></a><!-- doxytag: member="TXMPFiles::CanPutXMP" ref="29a11a1539d6300da3fb4c7e9ea02bb6" args="(const SXMPMeta &amp;xmpObj)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPFiles.html">TXMPFiles</a>&lt; tStringObj &gt;::CanPutXMP </td>
- <td>(</td>
- <td class="paramtype">const SXMPMeta &amp;&nbsp;</td>
- <td class="paramname"> <em>xmpObj</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Determine if the XMP can be updated.
-<p>
-<code>CanPutXMP</code> determines if the XMP can (probably) be updated. The provided XMP is only used to obtain the length of the serialized packet. The new XMP is not kept, calling this will not cause the file to be written when closed. Overloads are provided to pass the XMP as an XMP object, a string object, or a "const char *" plus length. This is implemented roughly as:<p>
-<div class="fragment"><pre class="fragment"> <span class="keywordtype">bool</span> <a class="code" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6">CanPutXMP</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> xmpPacket )
- {
- XMP_FileFormat format;
- this-&gt;<a class="code" href="classTXMPFiles.html#f9931d081cb19f98c81e41786030765b">GetFileInfo</a> ( 0, &amp;format, 0 );
-
- <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> formatFlags;
- <a class="code" href="classTXMPFiles.html#6ac78e3c7286ca8dcb41eaa007aa00e8">GetFormatInfo</a> ( format, &amp;formatFlags );
-
- <span class="keywordflow">if</span> ( (formatFlags &amp; kXMPFiles_CanInjectXMP) &amp;&amp; (formatFlags &amp; kXMPFiles_CanExpand) ) <span class="keywordflow">return</span> <span class="keyword">true</span>;
-
- XMP_PacketInfo packetInfo;
- <span class="keywordtype">bool</span> hasXMP = this-&gt;<a class="code" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3">GetXMP</a> ( 0, 0, &amp;packetInfo );
-
- <span class="keywordflow">if</span> ( ! hasXMP ) {
- <span class="keywordflow">if</span> ( formatFlags &amp; kXMPFiles_CanInjectXMP ) <span class="keywordflow">return</span> <span class="keyword">true</span>;
- } <span class="keywordflow">else</span> {
- <span class="keywordflow">if</span> ( (formatFlags &amp; kXMPFiles_CanExpand) ||
- (packetInfo.length &gt;= strlen(xmpPacket)) ) <span class="keywordflow">return</span> <span class="keyword">true</span>;
- }
-
- <span class="keywordflow">return</span> <span class="keyword">false</span>;
-
- }
-</pre></div>
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="TXMPFiles_8hpp-source.html">TXMPFiles.hpp</a></ul>
-<hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:58 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/classTXMPIterator-members.html b/docs/XMPToolkit/classTXMPIterator-members.html
deleted file mode 100644
index 6f822f8..0000000
--- a/docs/XMPToolkit/classTXMPIterator-members.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul></div>
-<h1>TXMPIterator&lt; tStringObj &gt; Member List</h1>This is the complete list of members for <a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="classTXMPIterator.html#124a1dd1ab3ff0d236e4d4b967dafcd9">Next</a>(tStringObj *schemaNS=0, tStringObj *propPath=0, tStringObj *propValue=0, XMP_OptionBits *options=0)</td><td><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPIterator.html#d767d731320d3f4c997c6ce9f7f8fa63">operator=</a>(const TXMPIterator&lt; tStringObj &gt; &amp;rhs)</td><td><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPIterator.html#30b4d78974b347e4fcd275f1f65a61b2">Skip</a>(XMP_OptionBits options)</td><td><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPIterator.html#88e855c18b2b15f7b8a5ccf3b9398352">TXMPIterator</a>(const TXMPIterator&lt; tStringObj &gt; &amp;original)</td><td><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPIterator.html#5c1bd03e776a91cbb6fd02991fe08e1b">TXMPIterator</a>(const TXMPMeta&lt; tStringObj &gt; &amp;xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options=0)</td><td><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPIterator.html#6b2b7a3d6359aec216adf32bdf7fb140">TXMPIterator</a>(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options)</td><td><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classTXMPIterator.html#911554533e8a3f09ab8870bd54462196">~TXMPIterator</a>()</td><td><a class="el" href="classTXMPIterator.html">TXMPIterator&lt; tStringObj &gt;</a></td><td><code> [virtual]</code></td></tr>
-</table><hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:58 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/classTXMPIterator.html b/docs/XMPToolkit/classTXMPIterator.html
deleted file mode 100644
index 195b213..0000000
--- a/docs/XMPToolkit/classTXMPIterator.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: TXMPIterator&lt; tStringObj &gt; Class Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul></div>
-<h1>TXMPIterator&lt; tStringObj &gt; Class Template Reference</h1><!-- doxytag: class="TXMPIterator" -->Template class for the XMP Toolkit iteration services.
-<a href="#_details">More...</a>
-<p>
-<code>#include &lt;<a class="el" href="TXMPIterator_8hpp-source.html">TXMPIterator.hpp</a>&gt;</code>
-<p>
-<a href="classTXMPIterator-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html#d767d731320d3f4c997c6ce9f7f8fa63">operator=</a> (const <a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt; &amp;rhs)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Assignment operator, assigns the internal ref and increments the ref count. <a href="#d767d731320d3f4c997c6ce9f7f8fa63"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html#88e855c18b2b15f7b8a5ccf3b9398352">TXMPIterator</a> (const <a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt; &amp;original)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Copy constructor, creates a client object refering to the same internal object. <a href="#88e855c18b2b15f7b8a5ccf3b9398352"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html#5c1bd03e776a91cbb6fd02991fe08e1b">TXMPIterator</a> (const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;xmpObj, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Construct an iterator for the properties within an XMP object. <a href="#5c1bd03e776a91cbb6fd02991fe08e1b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html#6b2b7a3d6359aec216adf32bdf7fb140">TXMPIterator</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Construct an iterator for the global tables of the XMP toolkit. <a href="#6b2b7a3d6359aec216adf32bdf7fb140"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="911554533e8a3f09ab8870bd54462196"></a><!-- doxytag: member="TXMPIterator::~TXMPIterator" ref="911554533e8a3f09ab8870bd54462196" args="()" -->
-virtual&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html#911554533e8a3f09ab8870bd54462196">~TXMPIterator</a> () throw ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Destructor, typical virtual destructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html#124a1dd1ab3ff0d236e4d4b967dafcd9">Next</a> (tStringObj *schemaNS=0, tStringObj *propPath=0, tStringObj *propValue=0, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Visit the next node in the iteration. <a href="#124a1dd1ab3ff0d236e4d4b967dafcd9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPIterator.html#30b4d78974b347e4fcd275f1f65a61b2">Skip</a> (<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Skip some portion of the remaining iterations. <a href="#30b4d78974b347e4fcd275f1f65a61b2"></a><br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template&lt;class tStringObj&gt;<br>
- class TXMPIterator&lt; tStringObj &gt;</h3>
-
-Template class for the XMP Toolkit iteration services.
-<p>
-This template class provides iteration services for the XMP Toolkit. It should be instantiated with a string class such as <code>std::string</code>. Please read the general usage notes for information on the overall architecture of the XMP API.<p>
-<code><a class="el" href="classTXMPIterator.html">TXMPIterator</a></code> provides a uniform means to iterate over several XMP data structures, including the schema and properties within an XMP object plus global tables such as registered namespaces. The template wraps a string class around the raw XMP API, so that output strings are automatically copied and access is fully thread safe. String objects are only necessary for output strings. Input string are literals and passed as typical C <code>const char *</code>.<p>
-The template parameter, class <code>TtStringObj</code>, is described in the XMP.hpp umbrella header.<p>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>Only XMP object iteration is implemented at this time. There are no table iterators yet.</dd></dl>
-Iteration over the schema and properties within an XMP object is the most important and complex use of <code>TTXMPIterator</code>. It is helpful to have a thorough understanding of the XMP data tree. One way to learn this is to create some complex XMP and examine the output of <code><a class="el" href="classTXMPMeta.html#976c1eb889f44080f76628805712b618">TXMPMeta::DumpObject</a></code>. This is also described in the XMP Specification, in the XMP Data Model chapter.<p>
-The top of the XMP data tree is a single root node. This does not explicitly appear in the dump and is never visited by an iterator (that is, it is never returned from <code><a class="el" href="classTXMPIterator.html#124a1dd1ab3ff0d236e4d4b967dafcd9">TXMPIterator::Next</a></code>). Beneath the root are schema nodes. These are just collectors for top level properties in the same namespace. They are created and destroyed implicitly. Beneath the schema nodes are the property nodes. The nodes below a property node depend on its type (simple, struct, or array) and whether it has qualifiers.<p>
-A <code><a class="el" href="classTXMPIterator.html">TXMPIterator</a></code> constructor defines a starting point for the iteration and options that control how it proceeds. By default the iteration starts at the root and visits all nodes beneath it in a depth first manner. The root node is not visited, the first visited node is a schema node. You can provide a schema name or property path to select a different starting node. By default this visits the named root node first then all nodes beneath it in a depth first manner.<p>
-The <code><a class="el" href="classTXMPIterator.html#124a1dd1ab3ff0d236e4d4b967dafcd9">TXMPIterator::Next</a></code> method delivers the schema URI, path, and option flags for the node being visited. If the node is simple it also delivers the value. Qualifiers for this node are visited next. The fields of a struct or items of an array are visited after the qualifiers of the parent.<p>
-The options to control the iteration are:<p>
-<ul>
-<li><code>kXMP_IterJustChildren</code> - Visit just the immediate children of the root. Skip the root itself and all nodes below the immediate children. This omits the qualifiers of the immediate children, the qualifier nodes being below what they qualify.</li>
-</ul>
-<ul>
-<li><code>kXMP_IterJustLeafNodes</code> - Visit just the leaf property nodes and their qualifiers.</li>
-</ul>
-<ul>
-<li><code>kXMP_IterJustLeafName</code> - Return just the leaf component of the node names. The default is to return the full path name.</li>
-</ul>
-<ul>
-<li><code>kXMP_IterIncludeAliases</code> - Include aliases as part of the iteration. Since aliases are not actual nodes the default iteration does not visit them.</li>
-</ul>
-<ul>
-<li><code>kXMP_IterOmitQualifiers</code> - Do not visit the qualifiers of a node. </li>
-</ul>
-
-<p>
-<hr><h2>Constructor &amp; Destructor Documentation</h2>
-<a class="anchor" name="88e855c18b2b15f7b8a5ccf3b9398352"></a><!-- doxytag: member="TXMPIterator::TXMPIterator" ref="88e855c18b2b15f7b8a5ccf3b9398352" args="(const TXMPIterator&lt; tStringObj &gt; &amp;original)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPIterator.html">TXMPIterator</a> </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
- <td class="paramname"> <em>original</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Copy constructor, creates a client object refering to the same internal object.
-<p>
-The copy constructor creates a new client iterator that refers to the same underlying iterator.
-</div>
-</div><p>
-<a class="anchor" name="5c1bd03e776a91cbb6fd02991fe08e1b"></a><!-- doxytag: member="TXMPIterator::TXMPIterator" ref="5c1bd03e776a91cbb6fd02991fe08e1b" args="(const TXMPMeta&lt; tStringObj &gt; &amp;xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPIterator.html">TXMPIterator</a> </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
- <td class="paramname"> <em>xmpObj</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Construct an iterator for the properties within an XMP object.
-<p>
-Construct an iterator for the properties within an XMP object. The general operation of an XMP object iterator was described above. Overloaded forms are provided to iterate the entire data tree, properties within a specific schema, or a subtree rooted at a specific node.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>xmpObj</em>&nbsp;</td><td>The XMP object over which to iterate.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>Optional schema namespace URI to restrict the iteration. Omitted (visit all schema) by passing 0 or "".</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>Optional property name to restrict the iteration. May be an arbitrary path expression. Omitted (visit all properties) by passing 0 or "". If not null/empty a schema URI must also be provided.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the iteration.</td></tr>
- </table>
-</dl>
-The available option flags are:<p>
-<ul>
-<li><code>kXMP_IterJustChildren</code> - Just visit the immediate children of the root, default is subtree. </li>
-<li><code>kXMP_IterJustLeafNodes</code> - Just visit the leaf nodes, default visits all nodes. </li>
-<li><code>kXMP_IterJustLeafName</code> - Return just the leaf part of the path, default is the full path. </li>
-<li><code>kXMP_IterOmitQualifiers</code> - Omit all qualifiers. </li>
-</ul>
-
-</div>
-</div><p>
-<a class="anchor" name="6b2b7a3d6359aec216adf32bdf7fb140"></a><!-- doxytag: member="TXMPIterator::TXMPIterator" ref="6b2b7a3d6359aec216adf32bdf7fb140" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPIterator.html">TXMPIterator</a> </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Construct an iterator for the global tables of the XMP toolkit.
-<p>
-<dl class="note" compact><dt><b>Note:</b></dt><dd><b>Not yet implemented.</b> File a bug if you need this. </dd></dl>
-
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="d767d731320d3f4c997c6ce9f7f8fa63"></a><!-- doxytag: member="TXMPIterator::operator=" ref="d767d731320d3f4c997c6ce9f7f8fa63" args="(const TXMPIterator&lt; tStringObj &gt; &amp;rhs)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt;::operator= </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
- <td class="paramname"> <em>rhs</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Assignment operator, assigns the internal ref and increments the ref count.
-<p>
-The assignment operator assigns the internal ref from the rhs object and increments the reference count on the underlying internal XMP iterator.
-</div>
-</div><p>
-<a class="anchor" name="124a1dd1ab3ff0d236e4d4b967dafcd9"></a><!-- doxytag: member="TXMPIterator::Next" ref="124a1dd1ab3ff0d236e4d4b967dafcd9" args="(tStringObj *schemaNS=0, tStringObj *propPath=0, tStringObj *propValue=0, XMP_OptionBits *options=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt;::Next </td>
- <td>(</td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em> = <code>0</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>propPath</em> = <code>0</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>propValue</em> = <code>0</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Visit the next node in the iteration.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if there was another node to visit, false if the iteration is done.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>A pointer to the string that is assigned the schema namespace URI of the current property. May be null if the value is not wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propPath</em>&nbsp;</td><td>A pointer to the string that is assigned the XPath name of the current property. May be null if the value is not wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>A pointer to the string that is assigned the value of the current property. May be null if the value is not wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>A pointer to the XMP_OptionBits variable that is assigned the flags describing the current property. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="30b4d78974b347e4fcd275f1f65a61b2"></a><!-- doxytag: member="TXMPIterator::Skip" ref="30b4d78974b347e4fcd275f1f65a61b2" args="(XMP_OptionBits options)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPIterator.html">TXMPIterator</a>&lt; tStringObj &gt;::Skip </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Skip some portion of the remaining iterations.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the iteration.</td></tr>
- </table>
-</dl>
-The available option flags are:<p>
-<ul>
-<li><code>kXMP_IterSkipSubtree</code> - Skip the subtree below the current node. </li>
-<li><code>kXMP_IterSkipSiblings</code> - Skip the subtree below and remaining siblings of the current node. </li>
-</ul>
-
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="TXMPIterator_8hpp-source.html">TXMPIterator.hpp</a></ul>
-<hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:58 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/classTXMPMeta.html b/docs/XMPToolkit/classTXMPMeta.html
deleted file mode 100644
index 3207227..0000000
--- a/docs/XMPToolkit/classTXMPMeta.html
+++ /dev/null
@@ -1,2781 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: TXMPMeta&lt; tStringObj &gt; Class Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul></div>
-<h1>TXMPMeta&lt; tStringObj &gt; Class Template Reference</h1><!-- doxytag: class="TXMPMeta" -->Template class for the XMP Toolkit core services.
-<a href="#_details">More...</a>
-<p>
-<code>#include &lt;<a class="el" href="TXMPMeta_8hpp-source.html">TXMPMeta.hpp</a>&gt;</code>
-<p>
-<a href="classTXMPMeta-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Constructors and destructor</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#7729cbce91956632289b88d85fdc65ae">TXMPMeta</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Default constructor, creates an empty object. <a href="#7729cbce91956632289b88d85fdc65ae"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#21a4d06fc2e77b28991bb900f0f48e50">TXMPMeta</a> (const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;original)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Copy constructor, creates a client object refering to the same internal object. <a href="#21a4d06fc2e77b28991bb900f0f48e50"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#4d5a601c9b77f6f6ab5f14e658de58ef">operator=</a> (const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;rhs)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Assignment operator, assigns the internal ref and increments the ref count. <a href="#4d5a601c9b77f6f6ab5f14e658de58ef"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#cbe8f556a5b32542c44fa9de9648ad41">TXMPMeta</a> (<a class="el" href="XMP__Const_8h.html#5912613564f80e17eb10acef9236f70a">XMPMetaRef</a> xmpRef)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Reconstruct an XMP object from an internal ref. <a href="#cbe8f556a5b32542c44fa9de9648ad41"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#05199e2a4bc61db7aed207759e899bc2">TXMPMeta</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> buffer, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> xmpSize)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Construct an object and parse one buffer of RDF into it. <a href="#05199e2a4bc61db7aed207759e899bc2"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bab5013870cd47eb0d9d701653735a02"></a><!-- doxytag: member="TXMPMeta::~TXMPMeta" ref="bab5013870cd47eb0d9d701653735a02" args="()" -->
-virtual&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#bab5013870cd47eb0d9d701653735a02">~TXMPMeta</a> () throw ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Destructor, typical virtual destructor. <br></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Functions for getting property values</div></td></tr>
-<tr><td colspan="2"><div class="groupText">The property value "getters" all take a property specification, The first two parameters are always the top level namespace URI (the "schema" namespace) and the basic name of the property being referenced. See the introductory discussion of path expression usage for more information.<p>
-All of the functions return a Boolean result telling if the property exists, and if it does they also return option flags describing the property. If the property exists and has a value, the string value is also returned. The string is Unicode in UTF-8 encoding. Arrays and the non-leaf levels of structs do not have values. The possible option flags that describe properties are:<p>
-<ul>
-<li><code>kXMP_PropValueIsURI</code> - The property value is a URI. It is serialized to RDF using the <code>rdf:resource</code> attribute. Not mandatory for URIs, but considered RDF-savvy.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropHasQualifiers</code> - The property has qualifiers. These could be an <code>xml:lang</code> attribute, an <code>rdf:type</code> property, or a general qualifier. See the introductory discussion of qualified properties for more information.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropIsQualifier</code> - This property is a qualifier for some other property. Note that if the qualifier itself has a structured value, this flag is only set for the top node of the qualifier's subtree. Qualifiers may have arbitrary structure, and may even have qualifiers.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropHasLang</code> - This property has an <code>xml:lang</code> qualifier.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropHasType</code> - This property has an <code>rdf:type</code> qualifier.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropValueIsStruct</code> - This property contains nested fields (models a C struct).</li>
-</ul>
-<ul>
-<li><code>kXMP_PropValueIsArray</code> - This property is an array. By itself (no ...ArrayIs... flags), this indicates a general unordered array. It is serialized using an <code>rdf:Bag</code> container.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropArrayIsOrdered</code> - This property is an ordered array. Appears in conjunction with <code>kXMP_PropValueIsArray</code>. It is serialized using an <code>rdf:Seq</code> container.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropArrayIsAlternate</code> - This property is an alternative array. Appears in conjunction with <code>kXMP_PropValueIsArray</code>. It is serialized using an <code>rdf:Alt</code> container.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropArrayIsAltText</code> - This property is an alt-text array. Appears in conjunction with <code>kXMP_PropArrayIsAlternate</code>. It is serialized using an <code>rdf:Alt</code> container. Each array element is a simple property with an <code>xml:lang</code> attribute.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropIsAlias</code> - The given property name is an alias. This is only returned by <code>GetProperty</code> and then only if the property name is simple, not an path expression.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropHasAliases</code> - The given property name has aliases. This is only returned by <code>GetProperty</code> and then only if the property name is simple, not an path expression.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropIsStable</code> - The value of this property is not related to the document content.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropIsDerived</code> - The value of this property is derived from the document content.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropIsInternal</code> - The value of this property is "owned" by the application, it should not generally be editable in a UI. </li>
-</ul>
-<br><br></div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c">GetProperty</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, tStringObj *propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>GetProperty</code> is the simplest property getter, mainly for top level simple properties or after using the path composition functions in <code><a class="el" href="classTXMPUtils.html">TXMPUtils</a></code>. <a href="#06a3241c7fa5df87f61dff02fca23a0c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#c64a4251d157937f69b73f2ffac4f7cc">GetArrayItem</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex, tStringObj *itemValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>GetArrayItem</code> provides access to items within an array. The index is passed as an integer, you need not worry about the path string syntax for array items, convert a loop index to a string, etc. <a href="#c64a4251d157937f69b73f2ffac4f7cc"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#e99d2bc414d5cd68851147aef6710d4a">GetStructField</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName, tStringObj *fieldValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>GetStructField</code> provides access to fields within a nested structure. The namespace for the field is passed as a URI, you need not worry about the path string syntax. <a href="#e99d2bc414d5cd68851147aef6710d4a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#2cc58d8316043b035643e7c21633bc13">GetQualifier</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName, tStringObj *qualValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>GetQualifier</code> provides access to a qualifier attached to a property. The namespace for the qualifier is passed as a URI, you need not worry about the path string syntax. In many regards qualifiers are like struct fields. See the introductory discussion of qualified properties for more information. <a href="#2cc58d8316043b035643e7c21633bc13"></a><br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Functions for setting property values</div></td></tr>
-<tr><td colspan="2"><div class="groupText">The property value "setters" all take a property specification, their differences are in the form of this. The first two parameters are always the top level namespace URI (the "schema" namespace) and the basic name of the property being referenced. See the introductory discussion of path expression usage for more information.<p>
-All of the functions take a string value for the property and option flags describing the property. The value must be Unicode in UTF-8 encoding. Arrays and non-leaf levels of structs do not have values. Empty arrays and structs may be created using appropriate option flags. All levels of structs that is assigned implicitly are created if necessary. <code>AppendArayItem</code> implicitly creates the named array if necessary.<p>
-The canonical form of these functions take the value as an <code>XMP_StringPtr</code>, a pointer to a null terminated string. (<code>XMP_StringPtr</code> is a typedef for <code>const char *</code>.) They also have overloaded forms that take a string object. These are implemented in the template instantiation as a call to the canonical form, using <code>value.c_str()</code> to obtain the <code>XMP_StringPtr</code>.<p>
-The possible option flags are:<p>
-<ul>
-<li><code>kXMP_PropValueIsURI</code> - The property value is a URI. It is serialized to RDF using the <code>rdf:resource</code> attribute. Not mandatory for URIs, but considered RDF-savvy.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropValueIsStruct</code> - This property contains nested fields (models a C struct). Not necessary, may be used to create an empty struct. A struct is implicitly created when first field is set.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropValueIsArray</code> - This property is an array. By itself (no ...ArrayIs... flags), this indicates a general unordered array. It is serialized using an <code>rdf:Bag</code> container.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropArrayIsOrdered</code> - This property is an ordered array. Implies <code>kXMP_PropValueIsArray</code>, may be used together. It is serialized using an <code>rdf:Seq</code> container.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropArrayIsAlternate</code> - This property is an alternative array. Implies <code>kXMP_PropArrayIsOrdered</code>, may be used together. It is serialized using an <code>rdf:Alt</code> container.</li>
-</ul>
-<ul>
-<li><code>kXMP_PropArrayIsAltText</code> - This property is an alt-text array. Implies <code>kXMP_PropArrayIsAlternate</code>, may be used together. It is serialized using an <code>rdf:Alt</code> container. Each array element must be a simple property with an <code>xml:lang</code> attribute. </li>
-</ul>
-<br><br></div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#1dfd6a08ebfd1a6364b3a7b6584bcc28">SetProperty</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>SetProperty</code> is the simplest property setter, mainly for top level simple properties or after using the path composition functions in <code><a class="el" href="classTXMPUtils.html">TXMPUtils</a></code>. <a href="#1dfd6a08ebfd1a6364b3a7b6584bcc28"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cc50625611f6aad405aa47197b6d0055"></a><!-- doxytag: member="TXMPMeta::SetProperty" ref="cc50625611f6aad405aa47197b6d0055" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, const tStringObj &amp;propValue, XMP_OptionBits options=0)" -->
-void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#cc50625611f6aad405aa47197b6d0055">SetProperty</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, const tStringObj &amp;propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of <code>SetProperty</code> is a simple overload in the template that calls the above form passing <code>propValue.c_str()</code>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#1570eb89d613b4a94ca572e4644168cc">SetArrayItem</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> itemValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>SetArrayItem</code> provides access to items within an array. The index is passed as an integer, you need not worry about the path string syntax for array items, convert a loop index to a string, etc. The array passed to <code>SetArrayItem</code> must already exist. See also <code>AppendArrayItem</code>. <a href="#1570eb89d613b4a94ca572e4644168cc"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15720ee8e732232fa25989870cf99846"></a><!-- doxytag: member="TXMPMeta::SetArrayItem" ref="15720ee8e732232fa25989870cf99846" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, const tStringObj &amp;itemValue, XMP_OptionBits options=0)" -->
-void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#15720ee8e732232fa25989870cf99846">SetArrayItem</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex, const tStringObj &amp;itemValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of <code>SetArrayItem</code> is a simple overload in the template that calls the above form passing <code>itemValue.c_str()</code>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#00d7314dc970ad390499ce9db27d314a">AppendArrayItem</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> arrayOptions, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> itemValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> itemOptions=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>AppendArrayItem</code> simplifies construction of an array by not requiring that you pre-create an empty array. The array that is assigned is created automatically if it does not yet exist. Each call to <code>AppendArrayItem</code> appends an item to the array. The corresponding parameters have the same use as <code>SetArrayItem</code>. The <code>arrayOptions</code> parameter is used to specify what kind of array. If the array exists, it must have the specified form. <a href="#00d7314dc970ad390499ce9db27d314a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f768a8cb35cabff1cf4187aa6a88dd3"></a><!-- doxytag: member="TXMPMeta::AppendArrayItem" ref="4f768a8cb35cabff1cf4187aa6a88dd3" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits arrayOptions, const tStringObj &amp;itemValue, XMP_OptionBits itemOptions=0)" -->
-void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#4f768a8cb35cabff1cf4187aa6a88dd3">AppendArrayItem</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> arrayOptions, const tStringObj &amp;itemValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> itemOptions=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of <code>AppendArrayItem</code> is a simple overload in the template that calls the above form passing <code>itemValue.c_str()</code>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#0e44c30e7527064909e5f7035d53c4f5">SetStructField</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>SetStructField</code> provides access to fields within a nested structure. The namespace for the field is passed as a URI, you need not worry about the path string syntax. <a href="#0e44c30e7527064909e5f7035d53c4f5"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="77d4a1bf7831f39073af9ea1544ebefa"></a><!-- doxytag: member="TXMPMeta::SetStructField" ref="77d4a1bf7831f39073af9ea1544ebefa" args="(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, const tStringObj &amp;fieldValue, XMP_OptionBits options=0)" -->
-void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#77d4a1bf7831f39073af9ea1544ebefa">SetStructField</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName, const tStringObj &amp;fieldValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of <code>SetStructField</code> is a simple overload in the template that calls the above form passing <code>fieldValue.c_str()</code>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#c2e798da5f9d94e486382a41e73fcea3">SetQualifier</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>SetQualifier</code> provides access to a qualifier attached to a property. The namespace for the qualifier is passed as a URI, you need not worry about the path string syntax. In many regards qualifiers are like struct fields. See the introductory discussion of qualified properties for more information. <a href="#c2e798da5f9d94e486382a41e73fcea3"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c395e094cab251a0593d508594b21521"></a><!-- doxytag: member="TXMPMeta::SetQualifier" ref="c395e094cab251a0593d508594b21521" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, const tStringObj &amp;qualValue, XMP_OptionBits options=0)" -->
-void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#c395e094cab251a0593d508594b21521">SetQualifier</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName, const tStringObj &amp;qualValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of <code>SetQualifier</code> is a simple overload in the template that calls the above form passing <code>qualValue.c_str()</code>. <br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Functions for deleting and detecting properties.</div></td></tr>
-<tr><td colspan="2"><div class="groupText">These should be obvious from the descriptions of the getters and setters. <br><br></div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#c8b555ba99904fa49bb4851a60cc3844">DeleteProperty</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>DeleteProperty</code> deletes the given XMP subtree rooted at the given property. It is not an error if the property does not exist. <a href="#c8b555ba99904fa49bb4851a60cc3844"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#bc1211f47225b5973a170ff952743264">DeleteArrayItem</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>DeleteArrayItem</code> deletes the given XMP subtree rooted at the given array item. It is not an error if the array item does not exist. <a href="#bc1211f47225b5973a170ff952743264"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#bc258e027780a15be65a88fcfd4e1fd4">DeleteStructField</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>DeleteStructField</code> deletes the given XMP subtree rooted at the given struct field. It is not an error if the field does not exist. <a href="#bc258e027780a15be65a88fcfd4e1fd4"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#8ce15f7de7fd3b258f07158ab5fa88be">DeleteQualifier</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>DeleteQualifier</code> deletes the given XMP subtree rooted at the given qualifier. It is not an error if the qualifier does not exist. <a href="#8ce15f7de7fd3b258f07158ab5fa88be"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#f22b116d71ecbbebea016ec5337e7066">DoesPropertyExist</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>DoesPropertyExist</code> tells if the property exists. <a href="#f22b116d71ecbbebea016ec5337e7066"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#492465c588d6d4cb8e30f94790e66f58">DoesArrayItemExist</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>DoesArrayItemExist</code> tells if the array item exists. <a href="#492465c588d6d4cb8e30f94790e66f58"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#9261b80d62e77a10ff1a89843bfa10a5">DoesStructFieldExist</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>DoesStructFieldExist</code> tells if the struct field exists. <a href="#9261b80d62e77a10ff1a89843bfa10a5"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#81347a92becd387a14f4d47c582f129a">DoesQualifierExist</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>DoesQualifierExist</code> tells if the qualifier exists. <a href="#81347a92becd387a14f4d47c582f129a"></a><br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Functions for accessing localized text (alt-text) properties.</div></td></tr>
-<tr><td colspan="2"><div class="groupText">These functions provide convenient support for localized text properties, including a number of special and obscure aspects. Localized text properties are stored in alt-text arrays. They allow multiple concurrent localizations of a property value, for example a document title or copyright in several languages.<p>
-The most important aspect of these functions is that they select an appropriate array item based on one or two RFC 3066 language tags. One of these languages, the "specific" language, is preferred and selected if there is an exact match. For many languages it is also possible to define a "generic" language that may be used if there is no specific language match. The generic language must be a valid RFC 3066 primary subtag, or the empty string.<p>
-For example, a specific language of "en-US" should be used in the US, and a specific language of "en-UK" should be used in England. It is also appropriate to use "en" as the generic language in each case. If a US document goes to England, the "en-US" title is selected by using the "en" generic language and the "en-UK" specific language.<p>
-It is considered poor practice, but allowed, to pass a specific language that is just an RFC 3066 primary tag. For example "en" is not a good specific language, it should only be used as a generic language. Passing "i" or "x" as the generic language is also considered poor practice but allowed.<p>
-Advice from the W3C about the use of RFC 3066 language tags can be found at: <ul>
-<li><a href="http://www.w3.org/International/articles/language-tags/">http://www.w3.org/International/articles/language-tags/</a></li>
-</ul>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>RFC 3066 language tags must be treated in a case insensitive manner. The XMP toolkit does this by normalizing their capitalization:</dd></dl>
-<ul>
-<li>The primary subtag is lower case, the suggested practice of ISO 639. </li>
-<li>All 2 letter secondary subtags are upper case, the suggested practice of ISO 3166. </li>
-<li>All other subtags are lower case.</li>
-</ul>
-The XMP specification defines an artificial language, "x-default", that is used to explicitly denote a default item in an alt-text array. The XMP toolkit normalizes alt-text arrays such that the x-default item is the first item. The <code>SetLocalizedText</code> function has several special features related to the x-default item, see its description for details.<p>
-The selection of the array item is the same for <code>GetLocalizedText</code> and <code>SetLocalizedText:</code> <p>
-<ul>
-<li>Look for an exact match with the specific language. </li>
-<li>If a generic language is given, look for a partial match. </li>
-<li>Look for an x-default item. </li>
-<li>Choose the first item.</li>
-</ul>
-A partial match with the generic language is where the start of the item's language matches the generic string and the next character is '-'. An exact match is also recognized as a degenerate case.<p>
-It is fine to pass x-default as the specific language. In this case, selection of an x-default item is an exact match by the first rule, not a selection by the 3rd rule. The last 2 rules are fallbacks used when the specific and generic languages fail to produce a match. <br><br></div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#eefe49bbf669770d769f4fe0ea566bd0">GetLocalizedText</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> altTextName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> genericLang, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> specificLang, tStringObj *actualLang, tStringObj *itemValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>GetLocalizedText</code> returns information about a selected item in an alt-text array. The array item is selected according to the rules given above. <a href="#eefe49bbf669770d769f4fe0ea566bd0"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19">SetLocalizedText</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> altTextName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> genericLang, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> specificLang, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> itemValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>SetLocalizedText</code> modifies the value of a selected item in an alt-text array. Creates an appropriate array item if necessary, and handles special cases for the x-default item. <a href="#f9531b949a462f5663b1f3fd99464c19"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="81273a152fb7b19e99c62ee39bf723f2"></a><!-- doxytag: member="TXMPMeta::SetLocalizedText" ref="81273a152fb7b19e99c62ee39bf723f2" args="(XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, const tStringObj &amp;itemValue, XMP_OptionBits options=0)" -->
-void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#81273a152fb7b19e99c62ee39bf723f2">SetLocalizedText</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> altTextName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> genericLang, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> specificLang, const tStringObj &amp;itemValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of <code>SetLocalizedText</code> is a simple overload in the template that calls the above form passing <code>itemValue.c_str()</code>. <br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Functions accessing properties as binary values.</div></td></tr>
-<tr><td colspan="2"><div class="groupText">These are very similar to <code>GetProperty</code> and <code>SetProperty</code> above, but the value is returned or provided in binary form instead of as a UTF-8 string. The path composition functions in <code><a class="el" href="classTXMPUtils.html">TXMPUtils</a></code> may be used to compose an path expression for fields in nested structures, items in arrays, or qualifiers. <br><br></div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#dcf8a1959a8bd42641a42cbd4d64a5b7">GetProperty_Bool</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, bool *propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>GetProperty_Bool</code> returns the value of a Boolean property as a C++ bool. <a href="#dcf8a1959a8bd42641a42cbd4d64a5b7"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#3b6ba486c02607b544917091c43b05cc">GetProperty_Int</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, long *propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>GetProperty_Int</code> returns the value of an integer property as a C long integer. <a href="#3b6ba486c02607b544917091c43b05cc"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#d1a6629b0466981b67d31c9dc3840ea7">GetProperty_Int64</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, long long *propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>GetProperty_Int64</code> returns the value of an integer property as a C long long integer. <a href="#d1a6629b0466981b67d31c9dc3840ea7"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#7708c31c9af3e740b27a4893dcd9aa47">GetProperty_Float</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, double *propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>GetProperty_Float</code> returns the value of a flaoting point property as a C double float. <a href="#7708c31c9af3e740b27a4893dcd9aa47"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#2f561295e73047ee90765558d29bd650">GetProperty_Date</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *options) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>GetProperty_Date</code> returns the value of a date/time property as an <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> struct. <a href="#2f561295e73047ee90765558d29bd650"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#9521e3838272ec501ffdb60ff3eb482f">SetProperty_Bool</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, bool propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>SetProperty_Bool</code> sets the value of a Boolean property from a C++ bool. <a href="#9521e3838272ec501ffdb60ff3eb482f"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#b8ae94130d9a05c1b9a3ee25588b6421">SetProperty_Int</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, long propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>SetProperty_Int</code> sets the value of an integer property from a C long integer. <a href="#b8ae94130d9a05c1b9a3ee25588b6421"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#df919aff205e934e4c8250a067f7b377">SetProperty_Int64</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, long long propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>SetProperty_Int64</code> sets the value of an integer property from a C long long integer. <a href="#df919aff205e934e4c8250a067f7b377"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#3b0f2f6bae57931ea96775f03608c0ed">SetProperty_Float</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, double propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>SetProperty_Float</code> sets the value of a floating point property from a C double float. <a href="#3b0f2f6bae57931ea96775f03608c0ed"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#eee10669445f77139d5634199ff01079">SetProperty_Date</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, const <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> &amp;propValue, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>SetProperty_Date</code> sets the value of a date/time property from an <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> struct. <a href="#eee10669445f77139d5634199ff01079"></a><br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Misceallaneous functions.</div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4d35b44f1f017a27772ee902a3dacf04"></a><!-- doxytag: member="TXMPMeta::GetInternalRef" ref="4d35b44f1f017a27772ee902a3dacf04" args="() const" -->
-<a class="el" href="XMP__Const_8h.html#5912613564f80e17eb10acef9236f70a">XMPMetaRef</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#4d35b44f1f017a27772ee902a3dacf04">GetInternalRef</a> () const</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">GetInternalRef Returns an internal reference that may be safely passed across DLL boundaries and reconstructed. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b0d179ed95487d4fd4f2680c1fbe0d40"></a><!-- doxytag: member="TXMPMeta::GetObjectName" ref="b0d179ed95487d4fd4f2680c1fbe0d40" args="(tStringObj *name) const " -->
-void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#b0d179ed95487d4fd4f2680c1fbe0d40">GetObjectName</a> (tStringObj *name) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">GetObjectName --TBD--. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cf1935be8e4849976dfc02325424960a"></a><!-- doxytag: member="TXMPMeta::SetObjectName" ref="cf1935be8e4849976dfc02325424960a" args="(XMP_StringPtr name)" -->
-void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#cf1935be8e4849976dfc02325424960a">SetObjectName</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> name)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">SetObjectName --TBD--. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fd059cc7cd9f906e12dab04e380e495c"></a><!-- doxytag: member="TXMPMeta::SetObjectName" ref="fd059cc7cd9f906e12dab04e380e495c" args="(tStringObj name)" -->
-void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#fd059cc7cd9f906e12dab04e380e495c">SetObjectName</a> (tStringObj name)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">SetObjectName --TBD--. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="39aeaf9eb83cfc1c5455807b95f055f9"></a><!-- doxytag: member="TXMPMeta::GetObjectOptions" ref="39aeaf9eb83cfc1c5455807b95f055f9" args="() const" -->
-<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#39aeaf9eb83cfc1c5455807b95f055f9">GetObjectOptions</a> () const</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">GetObjectOptions --TBD--. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#92055b3ae18dfd5e5491108f59318f17">SetObjectOptions</a> (<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">SetObjectOptions --TBD--. <a href="#92055b3ae18dfd5e5491108f59318f17"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#6ca653436995bbb76315efe7934afd4c">Clone</a> (<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>Clone</code> creates a deep clone of the XMP object. <a href="#6ca653436995bbb76315efe7934afd4c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b79aae864b3ce190d0699252f48e0acc"></a><!-- doxytag: member="TXMPMeta::CountArrayItems" ref="b79aae864b3ce190d0699252f48e0acc" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName) const " -->
-<a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#b79aae864b3ce190d0699252f48e0acc">CountArrayItems</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">CountArrayItems --TBD--. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="976c1eb889f44080f76628805712b618"></a><!-- doxytag: member="TXMPMeta::DumpObject" ref="976c1eb889f44080f76628805712b618" args="(XMP_TextOutputProc outProc, void *refCon) const " -->
-<a class="el" href="XMP__Const_8h.html#91efdc0a7fbe6e1d42ca34e6ce589b98">XMP_Status</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#976c1eb889f44080f76628805712b618">DumpObject</a> (<a class="el" href="XMP__Const_8h.html#36eab570ab85ff8fb5789661692d13c2">XMP_TextOutputProc</a> outProc, void *refCon) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>DumpObject</code> dumps the content of an XMP object. <br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Functions for parsing and serializing.</div></td></tr>
-<tr><td colspan="2"><div class="groupText">These functions support parsing serialized RDF into an XMP object, and serailizing an XMP object into RDF. The input for parsing may be any valid Unicode encoding. ISO Latin-1 is also recognized, but its use is strongly discouraged. Serialization is always as UTF-8. <br><br></div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26">ParseFromBuffer</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> buffer, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> bufferSize, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>ParseFromBuffer</code> parses RDF from a series of input buffers. The buffers may be any length. The buffer boundaries need not respect XML tokens or even Unicode characters. <a href="#7b383f5b357fff040cdbde82f4f43f26"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49">SerializeToBuffer</a> (tStringObj *rdfString, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> padding, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> newline, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> indent=&quot;&quot;, <a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> baseIndent=0) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>SerializeToBuffer</code> serializes an XMP object into a string as RDF. <a href="#2774a6f15ae22f0002201b58c46bfb49"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="34143727d979b47a2f2209367aec9a1c"></a><!-- doxytag: member="TXMPMeta::SerializeToBuffer" ref="34143727d979b47a2f2209367aec9a1c" args="(tStringObj *rdfString, XMP_OptionBits options=0, XMP_StringLen padding=0) const" -->
-void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#34143727d979b47a2f2209367aec9a1c">SerializeToBuffer</a> (tStringObj *rdfString, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> padding=0) const</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of <code>SerializeToBuffer</code> is a simple overload in the template that calls the above form passing default values for the <code>newline</code>, <code>indent</code>, and <code>baseIndent</code> parameters. <br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Initialization and termination</div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5415cfc01a9cb8786939246571a23a9d"></a><!-- doxytag: member="TXMPMeta::GetVersionInfo" ref="5415cfc01a9cb8786939246571a23a9d" args="(XMP_VersionInfo *info)" -->
-static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#5415cfc01a9cb8786939246571a23a9d">GetVersionInfo</a> (XMP_VersionInfo *info)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Obtain version information. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#bfddf1df0e01ab33d5636a80edc973ca">Initialize</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Initialize the XMP Toolkit. <a href="#bfddf1df0e01ab33d5636a80edc973ca"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6c30fae26173167958b6f0da95a53865"></a><!-- doxytag: member="TXMPMeta::Terminate" ref="6c30fae26173167958b6f0da95a53865" args="()" -->
-static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#6c30fae26173167958b6f0da95a53865">Terminate</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Terminate the XMP Toolkit. <br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Global option flags</div></td></tr>
-<tr><td colspan="2"><div class="groupText">The global option flags affect the overall behavior of the XMP Toolkit. The available options are declared in <code><a class="el" href="XMP__Const_8h.html">XMP_Const.h</a></code>. <b>(There are none at present.)</b> <br><br></div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="12b2435ba039c62a164951948c016eb4"></a><!-- doxytag: member="TXMPMeta::GetGlobalOptions" ref="12b2435ba039c62a164951948c016eb4" args="()" -->
-static <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#12b2435ba039c62a164951948c016eb4">GetGlobalOptions</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">GetGlobalOptions returns the set of global option flags. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#e7bb38d9b3857b08106630a386b47332">SetGlobalOptions</a> (<a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>SetGlobalOptions</code> updates the set of global option flags. The entire set is replaced with the new values. If only one flag is to be modified, use <code>GetGlobalOptions</code> to obtain the current set, modify the desired flag, then use <code>SetGlobalOptions</code>. <a href="#e7bb38d9b3857b08106630a386b47332"></a><br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Internal data structure dump utilities</div></td></tr>
-<tr><td colspan="2"><div class="groupText">These are debugging utilities that dump internal data structures. The output callback is described in <code><a class="el" href="XMP__Const_8h.html">XMP_Const.h</a></code>. <br><br></div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="44250140a710c0b7c5cc0881e387d004"></a><!-- doxytag: member="TXMPMeta::DumpNamespaces" ref="44250140a710c0b7c5cc0881e387d004" args="(XMP_TextOutputProc outProc, void *refCon)" -->
-static <a class="el" href="XMP__Const_8h.html#91efdc0a7fbe6e1d42ca34e6ce589b98">XMP_Status</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#44250140a710c0b7c5cc0881e387d004">DumpNamespaces</a> (<a class="el" href="XMP__Const_8h.html#36eab570ab85ff8fb5789661692d13c2">XMP_TextOutputProc</a> outProc, void *refCon)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>DumpNamespaces</code> dumps the list of registered namespace URIs and prefixes. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="afb027f200b85467298d237a0c23949b"></a><!-- doxytag: member="TXMPMeta::DumpAliases" ref="afb027f200b85467298d237a0c23949b" args="(XMP_TextOutputProc outProc, void *refCon)" -->
-static <a class="el" href="XMP__Const_8h.html#91efdc0a7fbe6e1d42ca34e6ce589b98">XMP_Status</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#afb027f200b85467298d237a0c23949b">DumpAliases</a> (<a class="el" href="XMP__Const_8h.html#36eab570ab85ff8fb5789661692d13c2">XMP_TextOutputProc</a> outProc, void *refCon)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><code>DumpAliases</code> dumps the list of registered aliases and corresponding actuals. <br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Namespace Functions</div></td></tr>
-<tr><td colspan="2"><div class="groupText">Namespaces must be registered before use in namespace URI parameters or path expressions. Within the XMP Toolkit the registered namespace URIs and prefixes must be unique. Additional namespaces encountered when parsing RDF are automatically registered.<p>
-The namespace URI should always end in an XML name separator such as '/' or '#'. This is because some forms of RDF shorthand catenate a namespace URI with an element name to form a new URI. <br><br></div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#4c69d31a37ff24c85679229c479aa1ac">RegisterNamespace</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> namespaceURI, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> suggestedPrefix, tStringObj *registeredPrefix)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Register a namespace URI with a suggested prefix. <a href="#4c69d31a37ff24c85679229c479aa1ac"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#f28589472d8c0397db6cef868f2b8c97">GetNamespacePrefix</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> namespaceURI, tStringObj *namespacePrefix)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Obtain the prefix for a registered namespace URI. <a href="#f28589472d8c0397db6cef868f2b8c97"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#a20c84e7549d0a3252fa29a1e83a757a">GetNamespaceURI</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> namespacePrefix, tStringObj *namespaceURI)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Obtain the URI for a registered namespace prefix. <a href="#a20c84e7549d0a3252fa29a1e83a757a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#3f989597e95db929676273cacd4ea09a">DeleteNamespace</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> namespaceURI)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Delete a namespace from the registry. <a href="#3f989597e95db929676273cacd4ea09a"></a><br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Alias Functions</div></td></tr>
-<tr><td colspan="2"><div class="groupText">Aliases in XMP serve the same purpose as Windows file shortcuts, Macintosh file aliases, or UNIX file symbolic links. The aliases are simply multiple names for the same property. One distinction of XMP aliases is that they are ordered, there is an alias name pointing to an actual name. The primary significance of the actual name is that it is the preferred name for output, generally the most widely recognized name.<p>
-The names that can be aliased in XMP are restricted. The alias must be a top level property name, not a field within a structure or an element within an array. The actual may be a top level property name, the first element within a top level array, or the default element in an alt-text array. This does not mean the alias can only be a simple property. It is OK to alias a top level structure or array to an identical top level structure or array, or to the first item of an array of structures. <br><br></div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#b9463c7459125ca0038db2e586c5e4df">RegisterAlias</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasProp, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> actualNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> actualProp, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> arrayForm=kXMP_NoOptions)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Associates an alias name with an actual name. <a href="#b9463c7459125ca0038db2e586c5e4df"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#c4b9c75202f2b961ad92f10a9e504e9a">ResolveAlias</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasProp, tStringObj *actualNS, tStringObj *actualProp, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *arrayForm)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Determines if a name is an alias, and what it is aliased to. <a href="#c4b9c75202f2b961ad92f10a9e504e9a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#af64964e983235247ef65c86a42a4675">DeleteAlias</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> aliasProp)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Delete an alias. <a href="#af64964e983235247ef65c86a42a4675"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPMeta.html#b77cf73fa0cc63d845f113b3d1c83602">RegisterStandardAliases</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Registers all of the built-in aliases for a standard namespace. <a href="#b77cf73fa0cc63d845f113b3d1c83602"></a><br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template&lt;class tStringObj&gt;<br>
- class TXMPMeta&lt; tStringObj &gt;</h3>
-
-Template class for the XMP Toolkit core services.
-<p>
-<code><a class="el" href="classTXMPMeta.html">TXMPMeta</a></code> is the template class providing the core services of the XMP Toolkit. It should be instantiated with a string class such as std::string. Please read the general toolkit usage notes for information about the overall architecture of the XMP API.<p>
-This template wraps a string object class around the raw XMP API. This provides two significant benefits, output strings are automatically copied and access is fully thread safe. The umbrella header, <code>XMP.hpp</code>, provides an <code>SXMPMeta</code> typedef for the instantiated template. String objects are only necessary for output strings. Input string are literals and passed as typical C <code>const char *</code>.<p>
-The template parameter, class <code>TtStringObj</code>, is described in the XMP.hpp umbrella header.<p>
-<b>Be aware that the <code><a class="el" href="classTXMPMeta.html">TXMPMeta</a></code> class is a normal C++ template, it is instantiated and local to each client executable. As are the other TXMP* classes. Different clients might not even use the same string type to instantiate <code><a class="el" href="classTXMPMeta.html">TXMPMeta</a></code>.</b><p>
-Because of this you should not pass <code>SXMPMeta</code> objects, or pointers to <code>SXMPMeta</code> objects, across DLL boundaries. There is a safe internal reference that you can pass, then construct a local object on the callee side. This construction does not create a cloned XMP tree, it is the same underlying XMP object safely wrapped in each client's <code>SXMPMeta</code> object.<p>
-Use GetInternalRef and the associated constructor like this: <div class="fragment"><pre class="fragment"> --- The callee's header contains:
- CalleeMethod ( <a class="code" href="XMP__Const_8h.html#5912613564f80e17eb10acef9236f70a">XMPMetaRef</a> xmpRef );
-
- --- The caller's code contains:
- SXMPMeta callerXMP;
- CalleeMethod ( callerXMP.GetInternalRef() );
-
- --- The callee's code contains:
- SXMPMeta calleeXMP ( xmpRef );
-</pre></div>
-<p>
-<hr><h2>Constructor &amp; Destructor Documentation</h2>
-<a class="anchor" name="7729cbce91956632289b88d85fdc65ae"></a><!-- doxytag: member="TXMPMeta::TXMPMeta" ref="7729cbce91956632289b88d85fdc65ae" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPMeta.html">TXMPMeta</a> </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Default constructor, creates an empty object.
-<p>
-The default constructor creates a new empty <code><a class="el" href="classTXMPMeta.html">TXMPMeta</a></code> object.
-</div>
-</div><p>
-<a class="anchor" name="21a4d06fc2e77b28991bb900f0f48e50"></a><!-- doxytag: member="TXMPMeta::TXMPMeta" ref="21a4d06fc2e77b28991bb900f0f48e50" args="(const TXMPMeta&lt; tStringObj &gt; &amp;original)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPMeta.html">TXMPMeta</a> </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
- <td class="paramname"> <em>original</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Copy constructor, creates a client object refering to the same internal object.
-<p>
-The copy constructor creates a new <code><a class="el" href="classTXMPMeta.html">TXMPMeta</a></code> object that refers to the same internal XMP object.
-</div>
-</div><p>
-<a class="anchor" name="cbe8f556a5b32542c44fa9de9648ad41"></a><!-- doxytag: member="TXMPMeta::TXMPMeta" ref="cbe8f556a5b32542c44fa9de9648ad41" args="(XMPMetaRef xmpRef)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPMeta.html">TXMPMeta</a> </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#5912613564f80e17eb10acef9236f70a">XMPMetaRef</a>&nbsp;</td>
- <td class="paramname"> <em>xmpRef</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Reconstruct an XMP object from an internal ref.
-<p>
-This constructor creates a new <code><a class="el" href="classTXMPMeta.html">TXMPMeta</a></code> object that refers to the underlying <code>xmpRef</code>, which was obtained from some other XMP object by the <code>GetInternalRef</code> method. This is used to safely pass XMP objects across DLL boundaries.
-</div>
-</div><p>
-<a class="anchor" name="05199e2a4bc61db7aed207759e899bc2"></a><!-- doxytag: member="TXMPMeta::TXMPMeta" ref="05199e2a4bc61db7aed207759e899bc2" args="(XMP_StringPtr buffer, XMP_StringLen xmpSize)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::<a class="el" href="classTXMPMeta.html">TXMPMeta</a> </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>buffer</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a>&nbsp;</td>
- <td class="paramname"> <em>xmpSize</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Construct an object and parse one buffer of RDF into it.
-<p>
-This constructor creates a new <code><a class="el" href="classTXMPMeta.html">TXMPMeta</a></code> object and populates it with metadata from a buffer containing serialized RDF. This buffer must be a complete RDF parse stream. Pass (0,0) to construct an empty <code><a class="el" href="classTXMPMeta.html">TXMPMeta</a></code> object. The result of an actual parse is identical to creating an empty object then calling <code><a class="el" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26">TXMPMeta::ParseFromBuffer</a></code>. The RDF must be complete. If you need to parse with multiple buffers, create an empty object and use <code><a class="el" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26">TXMPMeta::ParseFromBuffer</a></code>.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>buffer</em>&nbsp;</td><td>A pointer to the buffer of RDF to be parsed. May be null if the length is 0.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>xmpSize</em>&nbsp;</td><td>The length in bytes of the buffer. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="bfddf1df0e01ab33d5636a80edc973ca"></a><!-- doxytag: member="TXMPMeta::Initialize" ref="bfddf1df0e01ab33d5636a80edc973ca" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::Initialize </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Initialize the XMP Toolkit.
-<p>
-The XMP Toolkit may be explicitly initialized before use. The allocate/delete parameters must be either both null (0), or both non-null.
-</div>
-</div><p>
-<a class="anchor" name="4d5a601c9b77f6f6ab5f14e658de58ef"></a><!-- doxytag: member="TXMPMeta::operator=" ref="4d5a601c9b77f6f6ab5f14e658de58ef" args="(const TXMPMeta&lt; tStringObj &gt; &amp;rhs)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::operator= </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
- <td class="paramname"> <em>rhs</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Assignment operator, assigns the internal ref and increments the ref count.
-<p>
-The assignment operator assigns the internal ref from the rhs object and increments the reference count on the underlying internal XMP object.
-</div>
-</div><p>
-<a class="anchor" name="e7bb38d9b3857b08106630a386b47332"></a><!-- doxytag: member="TXMPMeta::SetGlobalOptions" ref="e7bb38d9b3857b08106630a386b47332" args="(XMP_OptionBits options)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetGlobalOptions </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>SetGlobalOptions</code> updates the set of global option flags. The entire set is replaced with the new values. If only one flag is to be modified, use <code>GetGlobalOptions</code> to obtain the current set, modify the desired flag, then use <code>SetGlobalOptions</code>.
-<p>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>There are no options to set yet. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="4c69d31a37ff24c85679229c479aa1ac"></a><!-- doxytag: member="TXMPMeta::RegisterNamespace" ref="4c69d31a37ff24c85679229c479aa1ac" args="(XMP_StringPtr namespaceURI, XMP_StringPtr suggestedPrefix, tStringObj *registeredPrefix)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::RegisterNamespace </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>namespaceURI</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>suggestedPrefix</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>registeredPrefix</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Register a namespace URI with a suggested prefix.
-<p>
-It is not an error if the URI is already registered, no matter what the prefix is. If the URI is not registered but the suggested prefix is in use, a unique prefix is created from the suggested one. The actual registeed prefix is always returned. The function result tells if the registered prefix is the suggested one.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>namespaceURI</em>&nbsp;</td><td>The URI for the namespace. Must be a valid XML URI.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>suggestedPrefix</em>&nbsp;</td><td>The suggested prefix to be used if the URI is not yet registered. Must be a valid XML name.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>registeredPrefix</em>&nbsp;</td><td>Returns the prefix actually registered for this URI.</td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the registered prefix matches the suggested prefix.</dd></dl>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>No checking is presently done on either the URI or the prefix. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="f28589472d8c0397db6cef868f2b8c97"></a><!-- doxytag: member="TXMPMeta::GetNamespacePrefix" ref="f28589472d8c0397db6cef868f2b8c97" args="(XMP_StringPtr namespaceURI, tStringObj *namespacePrefix)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetNamespacePrefix </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>namespaceURI</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>namespacePrefix</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Obtain the prefix for a registered namespace URI.
-<p>
-It is not an error if the namespace URI is not registered. The output <code>namespacePrefix</code> string is not modified if the namespace URI is not registered.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>namespaceURI</em>&nbsp;</td><td>The URI for the namespace. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>namespacePrefix</em>&nbsp;</td><td>Returns the prefix registered for this URI, with a terminating ':'.</td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the namespace URI is registered. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="a20c84e7549d0a3252fa29a1e83a757a"></a><!-- doxytag: member="TXMPMeta::GetNamespaceURI" ref="a20c84e7549d0a3252fa29a1e83a757a" args="(XMP_StringPtr namespacePrefix, tStringObj *namespaceURI)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetNamespaceURI </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>namespacePrefix</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>namespaceURI</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Obtain the URI for a registered namespace prefix.
-<p>
-It is not an error if the namespace prefix is not registered. The output <code>namespaceURI</code> string is not modified if the namespace prefix is not registered.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>namespacePrefix</em>&nbsp;</td><td>The prefix for the namespace. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>namespaceURI</em>&nbsp;</td><td>Returns the URI registered for this prefix.</td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the namespace prefix is registered. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="3f989597e95db929676273cacd4ea09a"></a><!-- doxytag: member="TXMPMeta::DeleteNamespace" ref="3f989597e95db929676273cacd4ea09a" args="(XMP_StringPtr namespaceURI)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DeleteNamespace </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>namespaceURI</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Delete a namespace from the registry.
-<p>
-Does nothing if the URI is not registered, or if the <code>namespaceURI</code> parameter is null or the empty string.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>namespaceURI</em>&nbsp;</td><td>The URI for the namespace.</td></tr>
- </table>
-</dl>
-<dl class="note" compact><dt><b>Note:</b></dt><dd><b>Not yet implemented.</b> </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="b9463c7459125ca0038db2e586c5e4df"></a><!-- doxytag: member="TXMPMeta::RegisterAlias" ref="b9463c7459125ca0038db2e586c5e4df" args="(XMP_StringPtr aliasNS, XMP_StringPtr aliasProp, XMP_StringPtr actualNS, XMP_StringPtr actualProp, XMP_OptionBits arrayForm=kXMP_NoOptions)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::RegisterAlias </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>aliasNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>aliasProp</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>actualNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>actualProp</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>arrayForm</em> = <code>kXMP_NoOptions</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Associates an alias name with an actual name.
-<p>
-Define a alias mapping from one namespace/property to another. Both property names must be simple names. An alias can be a direct mapping, where the alias and actual have the same data type. It is also possible to map a simple alias to an item in an array. This can either be to the first item in the array, or to the 'x-default' item in an alt-text array. Multiple alias names may map to the same actual, as long as the forms match. It is a no-op to reregister an alias in an identical fashion.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>aliasNS</em>&nbsp;</td><td>The namespace URI for the alias. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>aliasProp</em>&nbsp;</td><td>The name of the alias. Must be a simple name, not null or the empty string and not a general path expression.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>actualNS</em>&nbsp;</td><td>The namespace URI for the actual. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>actualProp</em>&nbsp;</td><td>The name of the actual. Must be a simple name, not null or the empty string and not a general path expression.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>arrayForm</em>&nbsp;</td><td>Provides the array form for simple aliases to an array item. This is needed to know what kind of array to create if set for the first time via the simple alias. Pass <code>kXMP_NoOptions</code>, the default value, for all direct aliases regardless of whether the actual data type is an array or not.</td></tr>
- </table>
-</dl>
-Constants for the arrayForm parameter:<p>
-<ul>
-<li><code>kXMP_NoOptions</code> - This is a direct mapping. The actual data type does not matter. </li>
-<li><code>kXMP_PropValueIsArray</code> - The actual is an unordered array, the alias is to the first element of the array. </li>
-<li><code>kXMP_PropArrayIsOrdered</code> - The actual is an ordered array, the alias is to the first element of the array. </li>
-<li><code>kXMP_PropArrayIsAlternate</code> - The actual is an alternate array, the alias is to the first element of the array. </li>
-<li><code>kXMP_PropArrayIsAltText</code> - The actual is an alternate text array, the alias is to the 'x-default' element of the array. </li>
-</ul>
-
-</div>
-</div><p>
-<a class="anchor" name="c4b9c75202f2b961ad92f10a9e504e9a"></a><!-- doxytag: member="TXMPMeta::ResolveAlias" ref="c4b9c75202f2b961ad92f10a9e504e9a" args="(XMP_StringPtr aliasNS, XMP_StringPtr aliasProp, tStringObj *actualNS, tStringObj *actualProp, XMP_OptionBits *arrayForm)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::ResolveAlias </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>aliasNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>aliasProp</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>actualNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>actualProp</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
- <td class="paramname"> <em>arrayForm</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Determines if a name is an alias, and what it is aliased to.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>aliasNS</em>&nbsp;</td><td>The namespace URI for the alias. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>aliasProp</em>&nbsp;</td><td>The name of the alias. May be an arbitrary path expression path, must not null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>actualNS</em>&nbsp;</td><td>Untouched if <code>aliasNS:aliasProp</code> is not an alias. Otherwise returns the namespace URI for the actual. May be null if the namespace URI is not wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>actualProp</em>&nbsp;</td><td>Untouched if <code>aliasNS:aliasProp</code> is not an alias. Otherwise returns the path of the actual. May be null if the actual's path is not wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>arrayForm</em>&nbsp;</td><td>Untouched if <code>aliasNS:aliasProp</code> is not an alias. Otherwise returns the form of the actual. This is 0 (<code>kXMP_NoOptions</code>) if the alias and actual forms match, otherwise it is the options passed to <code><a class="el" href="classTXMPMeta.html#b9463c7459125ca0038db2e586c5e4df">TXMPMeta::RegisterAlias</a></code>. May be null if the actual's form is not wanted.</td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the input is an alias.</dd></dl>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>The client output strings are not written until return, so a call like the following may be used to "reduce" a path to the base form: <div class="fragment"><pre class="fragment"> isAlias = SXMPMeta::ResolveAlias ( ns.c_str(), path.c_str(), &amp;ns, &amp;path, 0 );
-</pre></div> </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="af64964e983235247ef65c86a42a4675"></a><!-- doxytag: member="TXMPMeta::DeleteAlias" ref="af64964e983235247ef65c86a42a4675" args="(XMP_StringPtr aliasNS, XMP_StringPtr aliasProp)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DeleteAlias </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>aliasNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>aliasProp</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Delete an alias.
-<p>
-This only deletes the registration of the alias, it does not delete the actual property. It does delete any view of the property through the alias name. It is OK to attempt to delete an alias that does not exist, that is if the alias name is not registered as an alias.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>aliasNS</em>&nbsp;</td><td>The namespace URI for the alias. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>aliasProp</em>&nbsp;</td><td>The name of the alias. Must be a simple name, not null or the empty string and not a general path expression. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="b77cf73fa0cc63d845f113b3d1c83602"></a><!-- doxytag: member="TXMPMeta::RegisterStandardAliases" ref="b77cf73fa0cc63d845f113b3d1c83602" args="(XMP_StringPtr schemaNS)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::RegisterStandardAliases </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Registers all of the built-in aliases for a standard namespace.
-<p>
-The built-in aliases are documented in the XMP Specification. This registers the aliases in the given namespace, that is the aliases from this namespace to actuals in other namespaces.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the aliases. Must not be null or the empty string. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="06a3241c7fa5df87f61dff02fca23a0c"></a><!-- doxytag: member="TXMPMeta::GetProperty" ref="06a3241c7fa5df87f61dff02fca23a0c" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, tStringObj *propValue, XMP_OptionBits *options) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetProperty </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>propValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
- <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>GetProperty</code> is the simplest property getter, mainly for top level simple properties or after using the path composition functions in <code><a class="el" href="classTXMPUtils.html">TXMPUtils</a></code>.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the property exists.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property. May be null or the empty string if the first component of the propName path contains a namespace prefix. The URI must be for a registered namespace.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. May be a general path expression, must not be null or the empty string. Using a namespace prefix on the first component is optional. If present without a <code>schemaNS</code> value then the prefix specifies the namespace. The prefix must be for a registered namespace. If both a <code>schemaNS</code> URI and <code>propName</code> prefix are present, they must be corresponding parts of a registered namespace.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>A pointer to the string that is assigned the value of the property, if the property has a value. Arrays and non-leaf levels of structs do not have values. May be null if the value is not wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>A pointer to the <code>XMP_OptionBits</code> variable that is assigned option flags describing the property. May be null if the flags are not wanted. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="c64a4251d157937f69b73f2ffac4f7cc"></a><!-- doxytag: member="TXMPMeta::GetArrayItem" ref="c64a4251d157937f69b73f2ffac4f7cc" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, tStringObj *itemValue, XMP_OptionBits *options) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetArrayItem </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>arrayName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>&nbsp;</td>
- <td class="paramname"> <em>itemIndex</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>itemValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
- <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>GetArrayItem</code> provides access to items within an array. The index is passed as an integer, you need not worry about the path string syntax for array items, convert a loop index to a string, etc.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the array item exists.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the array. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. May be a general path expression, must not be null or the empty string. Has the same namespace prefix usage as <code>propName</code> in <code>GeProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>itemIndex</em>&nbsp;</td><td>The index of the desired item. Arrays in XMP are indexed from 1. The constant <code>kXMP_ArrayLastItem</code> always refers to the last existing array item.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>itemValue</em>&nbsp;</td><td>A pointer to the string that is assigned the value of the array item, if the array item has a value. Arrays and non-leaf levels of structs do not have values. May be null if the value is not wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>A pointer to the <code>XMP_OptionBits</code> variable that is assigned option flags describing the array item. May be null if the flags are not wanted. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="e99d2bc414d5cd68851147aef6710d4a"></a><!-- doxytag: member="TXMPMeta::GetStructField" ref="e99d2bc414d5cd68851147aef6710d4a" args="(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, tStringObj *fieldValue, XMP_OptionBits *options) const" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetStructField </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>structName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>fieldNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>fieldName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>fieldValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
- <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>GetStructField</code> provides access to fields within a nested structure. The namespace for the field is passed as a URI, you need not worry about the path string syntax.
-<p>
-The names of fields should be XML qualified names, that is within an XML namespace. The path syntax for a qualified name uses the namespace prefix. This is unreliable since the prefix is never guaranteed. The URI is the formal name, the prefix is just a local shorthand in a given sequence of XML text.<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the field exists.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the struct. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>structName</em>&nbsp;</td><td>The name of the struct. May be a general path expression, must not be null or the empty string. Has the same namespace prefix usage as <code>propName</code> in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fieldNS</em>&nbsp;</td><td>The namespace URI for the field. Has the same URI and prefix usage as the <code>schemaNS</code> parameter.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fieldName</em>&nbsp;</td><td>The name of the field. Must be a single XML name, must not be null or the empty string. Has the same namespace prefix usage as the <code>structName</code> parameter.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fieldValue</em>&nbsp;</td><td>A pointer to the string that is assigned the value of the field, if the field has a value. Arrays and non-leaf levels of structs do not have values. May be null if the value is not wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>A pointer to the <code>XMP_OptionBits</code> variable that is assigned option flags describing the field. May be null if the flags are not wanted. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="2cc58d8316043b035643e7c21633bc13"></a><!-- doxytag: member="TXMPMeta::GetQualifier" ref="2cc58d8316043b035643e7c21633bc13" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, tStringObj *qualValue, XMP_OptionBits *options) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetQualifier </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>qualNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>qualName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>qualValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
- <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>GetQualifier</code> provides access to a qualifier attached to a property. The namespace for the qualifier is passed as a URI, you need not worry about the path string syntax. In many regards qualifiers are like struct fields. See the introductory discussion of qualified properties for more information.
-<p>
-The names of qualifiers should be XML qualified names, that is within an XML namespace. The path syntax for a qualified name uses the namespace prefix. This is unreliable since the prefix is never guaranteed. The URI is the formal name, the prefix is just a local shorthand in a given sequence of XML text.<p>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>Qualifiers are only supported for simple leaf properties at this time.</dd></dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the qualifier exists.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the struct. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property to which the qualifier is attached. May be a general path expression, must not be null or the empty string. Has the same namespace prefix usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>qualNS</em>&nbsp;</td><td>The namespace URI for the qualifier. Has the same URI and prefix usage as the <code>schemaNS</code> parameter.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>qualName</em>&nbsp;</td><td>The name of the qualifier. Must be a single XML name, must not be null or the empty string. Has the same namespace prefix usage as the <code>propName</code> parameter.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>qualValue</em>&nbsp;</td><td>A pointer to the string that is assigned the value of the qualifier, if the qualifier has a value. Arrays and non-leaf levels of structs do not have values. May be null if the value is not wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>A pointer to the <code>XMP_OptionBits</code> variable that is assigned option flags describing the qualifier. May be null if the flags are not wanted. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="1dfd6a08ebfd1a6364b3a7b6584bcc28"></a><!-- doxytag: member="TXMPMeta::SetProperty" ref="1dfd6a08ebfd1a6364b3a7b6584bcc28" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr propValue, XMP_OptionBits options=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetProperty </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>SetProperty</code> is the simplest property setter, mainly for top level simple properties or after using the path composition functions in <code><a class="el" href="classTXMPUtils.html">TXMPUtils</a></code>.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>A pointer to the null terminated UTF-8 string that is the value of the property, if the property has a value. Arrays and non-leaf levels of structs do not have values. Must be null if the value is not relevant.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the property. See the earlier description. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="1570eb89d613b4a94ca572e4644168cc"></a><!-- doxytag: member="TXMPMeta::SetArrayItem" ref="1570eb89d613b4a94ca572e4644168cc" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, XMP_StringPtr itemValue, XMP_OptionBits options=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetArrayItem </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>arrayName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>&nbsp;</td>
- <td class="paramname"> <em>itemIndex</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>itemValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>SetArrayItem</code> provides access to items within an array. The index is passed as an integer, you need not worry about the path string syntax for array items, convert a loop index to a string, etc. The array passed to <code>SetArrayItem</code> must already exist. See also <code>AppendArrayItem</code>.
-<p>
-In normal usage the selected array item is modified. A new item is automatically appended if the index is the array size plus 1. A new item may be inserted before or after any item by using one of the following option flags:<p>
-<ul>
-<li><code>kXMP_InsertBeforeItem</code> - Insert a new array item before the selected one. </li>
-<li><code>kXMP_InsertAfterItem</code> - Insert a new array item after the selected one.</li>
-</ul>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the array. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. May be a general path expression, must not be null or the empty string. Has the same namespace prefix usage as <code>propName</code> in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>itemIndex</em>&nbsp;</td><td>The index of the desired item. Arrays in XMP are indexed from 1. The constant <code>kXMP_ArrayLastItem</code> always refers to the last existing array item.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>itemValue</em>&nbsp;</td><td>A pointer to the null terminated UTF-8 string that is the value of the array item, if the array item has a value. Has the same usage as <code>propValue</code> in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the item. See the earlier description. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="00d7314dc970ad390499ce9db27d314a"></a><!-- doxytag: member="TXMPMeta::AppendArrayItem" ref="00d7314dc970ad390499ce9db27d314a" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits arrayOptions, XMP_StringPtr itemValue, XMP_OptionBits itemOptions=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::AppendArrayItem </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>arrayName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>arrayOptions</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>itemValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>itemOptions</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>AppendArrayItem</code> simplifies construction of an array by not requiring that you pre-create an empty array. The array that is assigned is created automatically if it does not yet exist. Each call to <code>AppendArrayItem</code> appends an item to the array. The corresponding parameters have the same use as <code>SetArrayItem</code>. The <code>arrayOptions</code> parameter is used to specify what kind of array. If the array exists, it must have the specified form.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the array. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. May be a general path expression, must not be null or the empty string. Has the same namespace prefix usage as <code>propPath</code> in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>arrayOptions</em>&nbsp;</td><td>Option flags describing the array form. The only valid bits are those that are part of <code>kXMP_PropArrayFormMask:</code> <code>kXMP_PropValueIsArray</code>, <code>kXMP_PropArrayIsOrdered</code>, <code>kXMP_PropArrayIsAlternate</code>, or <code>kXMP_PropArrayIsAltText</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>itemValue</em>&nbsp;</td><td>A pointer to the null terminated UTF-8 string that is the value of the array item, if the array item has a value. Has the same usage as <code>propValue</code> in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>itemOptions</em>&nbsp;</td><td>Option flags describing the item. See the earlier description. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="0e44c30e7527064909e5f7035d53c4f5"></a><!-- doxytag: member="TXMPMeta::SetStructField" ref="0e44c30e7527064909e5f7035d53c4f5" args="(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, XMP_OptionBits options=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetStructField </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>structName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>fieldNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>fieldName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>fieldValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>SetStructField</code> provides access to fields within a nested structure. The namespace for the field is passed as a URI, you need not worry about the path string syntax.
-<p>
-The names of fields should be XML qualified names, that is within an XML namespace. The path syntax for a qualified name uses the namespace prefix, which is unreliable because the prefix is never guaranteed. The URI is the formal name, the prefix is just a local shorthand in a given sequence of XML text.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the struct. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>structName</em>&nbsp;</td><td>The name of the struct. May be a general path expression, must not be null or the empty string. Has the same namespace prefix usage as <code>propName</code> in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fieldNS</em>&nbsp;</td><td>The namespace URI for the field. Has the same URI and prefix usage as the <code>schemaNS</code> parameter.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fieldName</em>&nbsp;</td><td>The name of the field. Must be a single XML name, must not be null or the empty string. Has the same namespace prefix usage as the <code>structName</code> parameter.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fieldValue</em>&nbsp;</td><td>A pointer to the null terminated UTF-8 string that is the value of the field, if the field has a value. Has the same usage as <code>propValue</code> in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the field. See the earlier description. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="c2e798da5f9d94e486382a41e73fcea3"></a><!-- doxytag: member="TXMPMeta::SetQualifier" ref="c2e798da5f9d94e486382a41e73fcea3" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, XMP_StringPtr qualValue, XMP_OptionBits options=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetQualifier </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>qualNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>qualName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>qualValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>SetQualifier</code> provides access to a qualifier attached to a property. The namespace for the qualifier is passed as a URI, you need not worry about the path string syntax. In many regards qualifiers are like struct fields. See the introductory discussion of qualified properties for more information.
-<p>
-The names of qualifiers should be XML qualified names, that is within an XML namespace. The path syntax for a qualified name uses the namespace prefix, which is unreliable because the prefix is never guaranteed. The URI is the formal name, the prefix is just a local shorthand in a given sequence of XML text.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the struct. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property to which the qualifier is attached. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>qualNS</em>&nbsp;</td><td>The namespace URI for the qualifier. Has the same URI and prefix usage as the <code>schemaNS</code> parameter.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>qualName</em>&nbsp;</td><td>The name of the qualifier. Must be a single XML name, must not be null or the empty string. Has the same namespace prefix usage as the <code>propName</code> parameter.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>qualValue</em>&nbsp;</td><td>A pointer to the null terminated UTF-8 string that is the value of the qualifier, if the qualifier has a value. Has the same usage as <code>propValue</code> in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the qualifier. See the earlier description. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="c8b555ba99904fa49bb4851a60cc3844"></a><!-- doxytag: member="TXMPMeta::DeleteProperty" ref="c8b555ba99904fa49bb4851a60cc3844" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DeleteProperty </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>DeleteProperty</code> deletes the given XMP subtree rooted at the given property. It is not an error if the property does not exist.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Has the same usage as in <code>GetProperty</code>. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="bc1211f47225b5973a170ff952743264"></a><!-- doxytag: member="TXMPMeta::DeleteArrayItem" ref="bc1211f47225b5973a170ff952743264" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DeleteArrayItem </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>arrayName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>&nbsp;</td>
- <td class="paramname"> <em>itemIndex</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>DeleteArrayItem</code> deletes the given XMP subtree rooted at the given array item. It is not an error if the array item does not exist.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the array. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. May be a general path expression, must not be null or the empty string. Has the same namespace prefix usage as <code>propName</code> in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>itemIndex</em>&nbsp;</td><td>The index of the desired item. Arrays in XMP are indexed from 1. The constant <code>kXMP_ArrayLastItem</code> always refers to the last existing array item. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="bc258e027780a15be65a88fcfd4e1fd4"></a><!-- doxytag: member="TXMPMeta::DeleteStructField" ref="bc258e027780a15be65a88fcfd4e1fd4" args="(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DeleteStructField </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>structName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>fieldNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>fieldName</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>DeleteStructField</code> deletes the given XMP subtree rooted at the given struct field. It is not an error if the field does not exist.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the struct. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>structName</em>&nbsp;</td><td>The name of the struct. May be a general path expression, must not be null or the empty string. Has the same namespace prefix usage as <code>propName</code> in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fieldNS</em>&nbsp;</td><td>The namespace URI for the field. Has the same URI and prefix usage as the <code>schemaNS</code> parameter.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fieldName</em>&nbsp;</td><td>The name of the field. Must be a single XML name, must not be null or the empty string. Has the same namespace prefix usage as the <code>structName</code> parameter. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="8ce15f7de7fd3b258f07158ab5fa88be"></a><!-- doxytag: member="TXMPMeta::DeleteQualifier" ref="8ce15f7de7fd3b258f07158ab5fa88be" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DeleteQualifier </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>qualNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>qualName</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>DeleteQualifier</code> deletes the given XMP subtree rooted at the given qualifier. It is not an error if the qualifier does not exist.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the struct. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property to which the qualifier is attached. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>qualNS</em>&nbsp;</td><td>The namespace URI for the qualifier. Has the same URI and prefix usage as the <code>schemaNS</code> parameter.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>qualName</em>&nbsp;</td><td>The name of the qualifier. Must be a single XML name, must not be null or the empty string. Has the same namespace prefix usage as the <code>propName</code> parameter. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="f22b116d71ecbbebea016ec5337e7066"></a><!-- doxytag: member="TXMPMeta::DoesPropertyExist" ref="f22b116d71ecbbebea016ec5337e7066" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DoesPropertyExist </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>DoesPropertyExist</code> tells if the property exists.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the property exists.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Has the same usage as in <code>GetProperty</code>. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="492465c588d6d4cb8e30f94790e66f58"></a><!-- doxytag: member="TXMPMeta::DoesArrayItemExist" ref="492465c588d6d4cb8e30f94790e66f58" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DoesArrayItemExist </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>arrayName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>&nbsp;</td>
- <td class="paramname"> <em>itemIndex</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>DoesArrayItemExist</code> tells if the array item exists.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the array item exists.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the array. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. May be a general path expression, must not be null or the empty string. Has the same namespace prefix usage as <code>propName</code> in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>itemIndex</em>&nbsp;</td><td>The index of the desired item. Arrays in XMP are indexed from 1. The constant <code>kXMP_ArrayLastItem</code> always refers to the last existing array item. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="9261b80d62e77a10ff1a89843bfa10a5"></a><!-- doxytag: member="TXMPMeta::DoesStructFieldExist" ref="9261b80d62e77a10ff1a89843bfa10a5" args="(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DoesStructFieldExist </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>structName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>fieldNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>fieldName</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>DoesStructFieldExist</code> tells if the struct field exists.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the field exists.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the struct. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>structName</em>&nbsp;</td><td>The name of the struct. May be a general path expression, must not be null or the empty string. Has the same namespace prefix usage as <code>propName</code> in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fieldNS</em>&nbsp;</td><td>The namespace URI for the field. Has the same URI and prefix usage as the <code>schemaNS</code> parameter.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fieldName</em>&nbsp;</td><td>The name of the field. Must be a single XML name, must not be null or the empty string. Has the same namespace prefix usage as the <code>structName</code> parameter. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="81347a92becd387a14f4d47c582f129a"></a><!-- doxytag: member="TXMPMeta::DoesQualifierExist" ref="81347a92becd387a14f4d47c582f129a" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::DoesQualifierExist </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>qualNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>qualName</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>DoesQualifierExist</code> tells if the qualifier exists.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the qualifier exists.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the struct. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property to which the qualifier is attached. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>qualNS</em>&nbsp;</td><td>The namespace URI for the qualifier. Has the same URI and prefix usage as the <code>schemaNS</code> parameter.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>qualName</em>&nbsp;</td><td>The name of the qualifier. Must be a single XML name, must not be null or the empty string. Has the same namespace prefix usage as the <code>propName</code> parameter. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="eefe49bbf669770d769f4fe0ea566bd0"></a><!-- doxytag: member="TXMPMeta::GetLocalizedText" ref="eefe49bbf669770d769f4fe0ea566bd0" args="(XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, tStringObj *actualLang, tStringObj *itemValue, XMP_OptionBits *options) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetLocalizedText </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>altTextName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>genericLang</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>specificLang</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>actualLang</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>itemValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
- <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>GetLocalizedText</code> returns information about a selected item in an alt-text array. The array item is selected according to the rules given above.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if an appropriate array item exists.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the alt-text array. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>altTextName</em>&nbsp;</td><td>The name of the alt-text array. May be a general path expression, must not be null or the empty string. Has the same namespace prefix usage as <code>propName</code> in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>genericLang</em>&nbsp;</td><td>The name of the generic language as an RFC 3066 primary subtag. May be null or the empty string if no generic language is wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>specificLang</em>&nbsp;</td><td>The name of the specific language as an RFC 3066 tag. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>actualLang</em>&nbsp;</td><td>A pointer to the string that is assigned the language of the selected array item, if an appropriate array item is found. May be null if the language is not wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>itemValue</em>&nbsp;</td><td>A pointer to the string that is assigned the value of the array item, if an appropriate array item is found. May be null if the value is not wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>A pointer to the <code>XMP_OptionBits</code> variable that is assigned option flags describing the array item. May be null if the flags are not wanted. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="f9531b949a462f5663b1f3fd99464c19"></a><!-- doxytag: member="TXMPMeta::SetLocalizedText" ref="f9531b949a462f5663b1f3fd99464c19" args="(XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, XMP_StringPtr itemValue, XMP_OptionBits options=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetLocalizedText </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>altTextName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>genericLang</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>specificLang</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>itemValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>SetLocalizedText</code> modifies the value of a selected item in an alt-text array. Creates an appropriate array item if necessary, and handles special cases for the x-default item.
-<p>
-If the selected item is from a match with the specific language, the value of that item is modified. If the existing value of that item matches the existing value of the x-default item, the x-default item is also modified. If the array only has 1 existing item (which is not x-default), an x-default item is added with the given value.<p>
-If the selected item is from a match with the generic language and there are no other generic matches, the value of that item is modified. If the existing value of that item matches the existing value of the x-default item, the x-default item is also modified. If the array only has 1 existing item (which is not x-default), an x-default item is added with the given value.<p>
-If the selected item is from a partial match with the generic language and there are other partial matches, a new item is created for the specific language. The x-default item is not modified.<p>
-If the selected item is from the last 2 rules then a new item is created for the specific language. If the array only had an x-default item, the x-default item is also modified. If the array was empty, items are created for the specific language and x-default.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the alt-text array. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>altTextName</em>&nbsp;</td><td>The name of the alt-text array. May be a general path expression, must not be null or the empty string. Has the same namespace prefix usage as <code>propName</code> in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>genericLang</em>&nbsp;</td><td>The name of the generic language as an RFC 3066 primary subtag. May be null or the empty string if no generic language is wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>specificLang</em>&nbsp;</td><td>The name of the specific language as an RFC 3066 tag. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>itemValue</em>&nbsp;</td><td>A pointer to the null terminated UTF-8 string that is the new value for the appropriate array item.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags, none are defined at present. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="dcf8a1959a8bd42641a42cbd4d64a5b7"></a><!-- doxytag: member="TXMPMeta::GetProperty_Bool" ref="dcf8a1959a8bd42641a42cbd4d64a5b7" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, bool *propValue, XMP_OptionBits *options) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetProperty_Bool </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">bool *&nbsp;</td>
- <td class="paramname"> <em>propValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
- <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>GetProperty_Bool</code> returns the value of a Boolean property as a C++ bool.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the property exists.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>A pointer to the bool variable that is assigned the value of the property. May be null if the value is not wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>A pointer to the <code>XMP_OptionBits</code> variable that is assigned option flags describing the property. May be null if the flags are not wanted. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="3b6ba486c02607b544917091c43b05cc"></a><!-- doxytag: member="TXMPMeta::GetProperty_Int" ref="3b6ba486c02607b544917091c43b05cc" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, long *propValue, XMP_OptionBits *options) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetProperty_Int </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">long *&nbsp;</td>
- <td class="paramname"> <em>propValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
- <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>GetProperty_Int</code> returns the value of an integer property as a C long integer.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the property exists.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>A pointer to the long integer variable that is assigned the value of the property. May be null if the value is not wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>A pointer to the <code>XMP_OptionBits</code> variable that is assigned option flags describing the property. May be null if the flags are not wanted. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="d1a6629b0466981b67d31c9dc3840ea7"></a><!-- doxytag: member="TXMPMeta::GetProperty_Int64" ref="d1a6629b0466981b67d31c9dc3840ea7" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, long long *propValue, XMP_OptionBits *options) const" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetProperty_Int64 </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">long long *&nbsp;</td>
- <td class="paramname"> <em>propValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
- <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>GetProperty_Int64</code> returns the value of an integer property as a C long long integer.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the property exists.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>A pointer to the long long integer variable that is assigned the value of the property. May be null if the value is not wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>A pointer to the <code>XMP_OptionBits</code> variable that is assigned option flags describing the property. May be null if the flags are not wanted. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="7708c31c9af3e740b27a4893dcd9aa47"></a><!-- doxytag: member="TXMPMeta::GetProperty_Float" ref="7708c31c9af3e740b27a4893dcd9aa47" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, double *propValue, XMP_OptionBits *options) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetProperty_Float </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">double *&nbsp;</td>
- <td class="paramname"> <em>propValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
- <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>GetProperty_Float</code> returns the value of a flaoting point property as a C double float.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the property exists.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>A pointer to the double float variable that is assigned the value of the property. May be null if the value is not wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>A pointer to the <code>XMP_OptionBits</code> variable that is assigned option flags describing the property. May be null if the flags are not wanted. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="2f561295e73047ee90765558d29bd650"></a><!-- doxytag: member="TXMPMeta::GetProperty_Date" ref="2f561295e73047ee90765558d29bd650" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_DateTime *propValue, XMP_OptionBits *options) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::GetProperty_Date </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *&nbsp;</td>
- <td class="paramname"> <em>propValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> *&nbsp;</td>
- <td class="paramname"> <em>options</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>GetProperty_Date</code> returns the value of a date/time property as an <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> struct.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>Returns true if the property exists.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>A pointer to the <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> variable that is assigned the value of the property. May be null if the value is not wanted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>A pointer to the <code>XMP_OptionBits</code> variable that is assigned option flags describing the property. May be null if the flags are not wanted. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="9521e3838272ec501ffdb60ff3eb482f"></a><!-- doxytag: member="TXMPMeta::SetProperty_Bool" ref="9521e3838272ec501ffdb60ff3eb482f" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, bool propValue, XMP_OptionBits options=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetProperty_Bool </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">bool&nbsp;</td>
- <td class="paramname"> <em>propValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>SetProperty_Bool</code> sets the value of a Boolean property from a C++ bool.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>The bool value to be assigned to the property.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>A pointer to the <code>XMP_OptionBits</code> variable that is assigned option flags describing the property. May be null if the flags are not wanted. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="b8ae94130d9a05c1b9a3ee25588b6421"></a><!-- doxytag: member="TXMPMeta::SetProperty_Int" ref="b8ae94130d9a05c1b9a3ee25588b6421" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, long propValue, XMP_OptionBits options=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetProperty_Int </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">long&nbsp;</td>
- <td class="paramname"> <em>propValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>SetProperty_Int</code> sets the value of an integer property from a C long integer.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>The long integer value to be assigned to the property.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the property. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="df919aff205e934e4c8250a067f7b377"></a><!-- doxytag: member="TXMPMeta::SetProperty_Int64" ref="df919aff205e934e4c8250a067f7b377" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, long long propValue, XMP_OptionBits options=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetProperty_Int64 </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">long long&nbsp;</td>
- <td class="paramname"> <em>propValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>SetProperty_Int64</code> sets the value of an integer property from a C long long integer.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>The long long integer value to be assigned to the property.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the property. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="3b0f2f6bae57931ea96775f03608c0ed"></a><!-- doxytag: member="TXMPMeta::SetProperty_Float" ref="3b0f2f6bae57931ea96775f03608c0ed" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, double propValue, XMP_OptionBits options=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetProperty_Float </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">double&nbsp;</td>
- <td class="paramname"> <em>propValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>SetProperty_Float</code> sets the value of a floating point property from a C double float.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>The double float value to be assigned to the property.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the property. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="eee10669445f77139d5634199ff01079"></a><!-- doxytag: member="TXMPMeta::SetProperty_Date" ref="eee10669445f77139d5634199ff01079" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, const XMP_DateTime &amp;propValue, XMP_OptionBits options=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetProperty_Date </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> &amp;&nbsp;</td>
- <td class="paramname"> <em>propValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>SetProperty_Date</code> sets the value of a date/time property from an <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> struct.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property. Has the same usage as in <code>GetProperty</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propValue</em>&nbsp;</td><td>The <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> value to be assigned to the property.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags describing the property. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="92055b3ae18dfd5e5491108f59318f17"></a><!-- doxytag: member="TXMPMeta::SetObjectOptions" ref="92055b3ae18dfd5e5491108f59318f17" args="(XMP_OptionBits options)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SetObjectOptions </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-SetObjectOptions --TBD--.
-<p>
-<dl class="note" compact><dt><b>Note:</b></dt><dd><b>Not yet implemented.</b> File a bug if you need this. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="6ca653436995bbb76315efe7934afd4c"></a><!-- doxytag: member="TXMPMeta::Clone" ref="6ca653436995bbb76315efe7934afd4c" args="(XMP_OptionBits options=0) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="classTXMPMeta.html">TXMPMeta</a> <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::Clone </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>Clone</code> creates a deep clone of the XMP object.
-<p>
-This function creates a deep clone of the XMP object. Assignment and copy constructors do not, they just increment a reference count. Note that <code>Clone</code> returns an object, not a pointer. This is easy to misuse:<p>
-<div class="fragment"><pre class="fragment"> SXMPMeta * clone1 = &amp;sourceXMP.Clone(); <span class="comment">// ! This does not work!</span>
- SXMPMeta * clone2 = <span class="keyword">new</span> SXMPMeta ( sourceXMP.Clone() ); <span class="comment">// This works.</span>
- SXMPMeta clone3 ( sourceXMP.Clone ); <span class="comment">// This works also. (Not a pointer.)</span>
-</pre></div><p>
-In the code above, the assignment to <code>clone1</code> creates a temporary object, initializes it with the clone, assigns the address of the temporary to <code>clone1</code>, then deletes the temporary. The <code>clone3</code> example also works, you do not have to use an explicit pointer. This is good for local usage, you don't have to worry about memory leaks.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags, not are defined at present.</td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>An XMP object cloned from the original. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="7b383f5b357fff040cdbde82f4f43f26"></a><!-- doxytag: member="TXMPMeta::ParseFromBuffer" ref="7b383f5b357fff040cdbde82f4f43f26" args="(XMP_StringPtr buffer, XMP_StringLen bufferSize, XMP_OptionBits options=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::ParseFromBuffer </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>buffer</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a>&nbsp;</td>
- <td class="paramname"> <em>bufferSize</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>ParseFromBuffer</code> parses RDF from a series of input buffers. The buffers may be any length. The buffer boundaries need not respect XML tokens or even Unicode characters.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>buffer</em>&nbsp;</td><td>A pointer to a buffer of input. May be null if <code>bufferSize</code> is 0.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>bufferSize</em>&nbsp;</td><td>The length of this buffer in bytes. Zero is a valid value. Termination of an input loop is convenient by passing <code>kXMP_ParseMoreBuffers</code> for all real input, then having a final call with a zero length and <code>kXMP_NoOptions</code>.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Options controlling the parsing.</td></tr>
- </table>
-</dl>
-The available options are:<p>
-<ul>
-<li><code>kXMP_ParseMoreBuffers</code> - This is not the last buffer of input, more calls follow. </li>
-<li><code>kXMP_RequireXMPMeta</code> - The x:xmpmeta XML element is required around <code>rdf:RDF</code>. </li>
-<li><code>kXMP_StrictAliasing</code> - Do not reconcile alias differences, throw an exception.</li>
-</ul>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>The <code>kXMP_StrictAliasing</code> option is not yet implemented. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="2774a6f15ae22f0002201b58c46bfb49"></a><!-- doxytag: member="TXMPMeta::SerializeToBuffer" ref="2774a6f15ae22f0002201b58c46bfb49" args="(tStringObj *rdfString, XMP_OptionBits options, XMP_StringLen padding, XMP_StringPtr newline, XMP_StringPtr indent=&quot;&quot;, XMP_Index baseIndent=0) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt;::SerializeToBuffer </td>
- <td>(</td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>rdfString</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a>&nbsp;</td>
- <td class="paramname"> <em>padding</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>newline</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>indent</em> = <code>&quot;&quot;</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>&nbsp;</td>
- <td class="paramname"> <em>baseIndent</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<code>SerializeToBuffer</code> serializes an XMP object into a string as RDF.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>rdfString</em>&nbsp;</td><td>A pointer to the string to receive the serialized RDF. Must not be null.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the serialization.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>padding</em>&nbsp;</td><td>The amount of padding to be added if a writeable XML packet is created. If zero is passed (the default) an appropriate amount of padding is computed.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>newline</em>&nbsp;</td><td>The string to be used as a line terminator. If empty it defaults to linefeed, U+000A, the standard XML newline.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>indent</em>&nbsp;</td><td>The string to be used for each level of indentation in the serialized RDF. If empty it defaults to two ASCII spaces, U+0020.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>baseIndent</em>&nbsp;</td><td>The number of levels of indentation to be used for the outermost XML element in the serialized RDF. This is convenient when embedding the RDF in other text.</td></tr>
- </table>
-</dl>
-The available option flags are:<p>
-<ul>
-<li><code>kXMP_OmitPacketWrapper</code> - Do not include an XML packet wrapper. </li>
-<li><code>kXMP_ReadOnlyPacket</code> - Create a read-only XML packet wapper. </li>
-<li><code>kXMP_UseCompactFormat</code> - Use a highly compact RDF syntax and layout. </li>
-<li><code>kXMP_WriteAliasComments</code> - Include XML comments for aliases. </li>
-<li><code>kXMP_IncludeThumbnailPad</code> - Include typical space for a JPEG thumbnail in the padding if no <code>xmp:Thumbnails</code> property is present. </li>
-<li><code>kXMP_ExactPacketLength</code> - The padding parameter provides the overall packet length. The actual amount of padding is computed. An exception is thrown if the packet exceeds this length with no padding.</li>
-</ul>
-The specified options must be logically consistent, an exception is thrown if not. You cannot specify both <code>kXMP_OmitPacketWrapper</code> along with <code>kXMP_ReadOnlyPacket</code>, <code>kXMP_IncludeThumbnailPad</code>, or <code>kXMP_ExactPacketLength</code>.<p>
-In addition, one of the following encoding options may be included:<p>
-<ul>
-<li><code>kXMP_EncodeUTF8</code> - Encode as UTF-8, the default. </li>
-<li><code>kXMP_EncodeUTF16Big</code> - Encode as big-endian UTF-16. </li>
-<li><code>kXMP_EncodeUTF16Little</code> - Encode as little-endian UTF-16. </li>
-<li><code>kXMP_EncodeUTF32Big</code> - Encode as big-endian UTF-32. </li>
-<li><code>kXMP_EncodeUTF32Little</code> - Encode as little-endian UTF-32. </li>
-</ul>
-
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="TXMPMeta_8hpp-source.html">TXMPMeta.hpp</a></ul>
-<hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:59 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/classTXMPUtils.html b/docs/XMPToolkit/classTXMPUtils.html
deleted file mode 100644
index 2d2eb21..0000000
--- a/docs/XMPToolkit/classTXMPUtils.html
+++ /dev/null
@@ -1,1540 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: TXMPUtils&lt; tStringObj &gt; Class Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul></div>
-<h1>TXMPUtils&lt; tStringObj &gt; Class Template Reference</h1><!-- doxytag: class="TXMPUtils" -->Template class for the XMP Toolkit utility services.
-<a href="#_details">More...</a>
-<p>
-<code>#include &lt;<a class="el" href="TXMPUtils_8hpp-source.html">TXMPUtils.hpp</a>&gt;</code>
-<p>
-<a href="classTXMPUtils-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Path composition functions</div></td></tr>
-<tr><td colspan="2"><div class="groupText">These functions provide support for composing path expressions to deeply nested properties. The functions in <code><a class="el" href="classTXMPMeta.html">TXMPMeta</a></code> such as <code>GetProperty</code>, <code>GetArrayItem</code>, and <code>GetStructField</code> provide easy access to top level simple properties, items in top level arrays, and fields of top level structs. They do not provide convenient access to more complex things like fields several levels deep in a complex struct, or fields within an array of structs, or items of an array that is a field of a struct. These functions can also be used to compose paths to top level array items or struct fields so that you can use the binary accessors like <code>GetProperty_Int</code>.<p>
-You can use these functions is to compose a complete path expression, or all but the last component. Suppose you have a property that is an array of integers within a struct. You can access one of the array items like this:<p>
-<div class="fragment"><pre class="fragment">
- /// SXMPUtils::ComposeStructFieldPath ( schemaNS, "Struct", fieldNS, "Array", &amp;path );
- /// SXMPUtils::ComposeArrayItemPath ( schemaNS, path, index, &amp;path );
- /// exists = xmpObj.GetProperty_Int ( schemaNS, path, &amp;value, &amp;options );
- /// </pre></div><p>
-You could also use this code if you want the string form of the integer:<p>
-<div class="fragment"><pre class="fragment">
- /// SXMPUtils::ComposeStructFieldPath ( schemaNS, "Struct", fieldNS, "Array", &amp;path );
- /// xmpObj.GetArrayItem ( schemaNS, path, index, &amp;value, &amp;options );
- /// </pre></div><p>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>It might look confusing that the <code>schemaNS</code> is passed in all of the calls above. This is because the XMP toolkit keeps the top level "schema" namespace separate from the rest of the path expression. </dd></dl>
-<br><br></div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#47fa195aa2e1457aa1f74f7e1ed06da6">ComposeArrayItemPath</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a> itemIndex, tStringObj *fullPath)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compose the path expression for an item in an array. <a href="#47fa195aa2e1457aa1f74f7e1ed06da6"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#706eb85b8401b8682a01348f7e25ee3d">ComposeStructFieldPath</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> structName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName, tStringObj *fullPath)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compose the path expression for a field in a struct. <a href="#706eb85b8401b8682a01348f7e25ee3d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#40ae0ce2065fcb71725e37137884e172">ComposeQualifierPath</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> qualName, tStringObj *fullPath)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compose the path expression for a qualifier. <a href="#40ae0ce2065fcb71725e37137884e172"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#e4989e5c199a2a4287ee3ae89b872e69">ComposeLangSelector</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> langName, tStringObj *fullPath)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compose the path expression to select an alternate item by language. <a href="#e4989e5c199a2a4287ee3ae89b872e69"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7882bbc2e412ff476c2d97d98808d91c"></a><!-- doxytag: member="TXMPUtils::ComposeLangSelector" ref="7882bbc2e412ff476c2d97d98808d91c" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, const tStringObj &amp;langName, tStringObj *fullPath)" -->
-static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#7882bbc2e412ff476c2d97d98808d91c">ComposeLangSelector</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, const tStringObj &amp;langName, tStringObj *fullPath)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of <code>ComposeLangSelector</code> is a simple overload in the template that calls the above form passing <code>langName.c_str()</code>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#458f8e8729e2334fe54ca8f691a9db23">ComposeFieldSelector</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldValue, tStringObj *fullPath)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compose the path expression to select an alternate item by a field's value. <a href="#458f8e8729e2334fe54ca8f691a9db23"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d2d2361b8a4d0709ec9e3bd837265cba"></a><!-- doxytag: member="TXMPUtils::ComposeFieldSelector" ref="d2d2361b8a4d0709ec9e3bd837265cba" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, const tStringObj &amp;fieldValue, tStringObj *fullPath)" -->
-static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#d2d2361b8a4d0709ec9e3bd837265cba">ComposeFieldSelector</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> fieldName, const tStringObj &amp;fieldValue, tStringObj *fullPath)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of ComposeFieldSelector is a simple overload in the template that calls the above form passing <code>fieldValue.c_str()</code>. <br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Binary-String conversion functions</div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#509691eb270988de6a770c9c8304ab6b">ConvertFromBool</a> (bool binValue, tStringObj *strValue)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Convert from Boolean to string. <a href="#509691eb270988de6a770c9c8304ab6b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#eec45b4d1a26717290105c9f4e8b4235">ConvertFromInt</a> (long binValue, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> format, tStringObj *strValue)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Convert from integer to string. <a href="#eec45b4d1a26717290105c9f4e8b4235"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#e67ef3931836432b7e574832f0610ed0">ConvertFromFloat</a> (double binValue, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> format, tStringObj *strValue)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Convert from floating point to string. <a href="#e67ef3931836432b7e574832f0610ed0"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#6146a522a3974b4088d6e8241e9cd223">ConvertFromDate</a> (const <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> &amp;binValue, tStringObj *strValue)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Convert from date/time to string. <a href="#6146a522a3974b4088d6e8241e9cd223"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#aaaaadb23f4089daa795f50cba4f405c">ConvertToBool</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> strValue)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Convert from string to Boolean. <a href="#aaaaadb23f4089daa795f50cba4f405c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="84f2a7b3960a17315032915674e21960"></a><!-- doxytag: member="TXMPUtils::ConvertToBool" ref="84f2a7b3960a17315032915674e21960" args="(const tStringObj &amp;strValue)" -->
-static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#84f2a7b3960a17315032915674e21960">ConvertToBool</a> (const tStringObj &amp;strValue)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of <code>ConvertToBool</code> is a simple overload in the template that calls the above form passing <code>strValue.c_str()</code>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static long&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#dfd9d1c522377d5db4ad667a7973ba00">ConvertToInt</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> strValue)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Convert from string to integer. <a href="#dfd9d1c522377d5db4ad667a7973ba00"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="47d93f9cb4acd9d7ec6b450100209bec"></a><!-- doxytag: member="TXMPUtils::ConvertToInt" ref="47d93f9cb4acd9d7ec6b450100209bec" args="(const tStringObj &amp;strValue)" -->
-static long&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#47d93f9cb4acd9d7ec6b450100209bec">ConvertToInt</a> (const tStringObj &amp;strValue)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of <code>ConvertToInt</code> is a simple overload in the template that calls the above form passing <code>strValue.c_str()</code>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static long long&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#be5d2dcc03c5442202203bba5ca7b172">ConvertToInt64</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> strValue)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Convert from string to 64 bit integer. <a href="#be5d2dcc03c5442202203bba5ca7b172"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="711cae0cb1b673ff5e208b4ae458d120"></a><!-- doxytag: member="TXMPUtils::ConvertToInt64" ref="711cae0cb1b673ff5e208b4ae458d120" args="(const tStringObj &amp;strValue)" -->
-static long long&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#711cae0cb1b673ff5e208b4ae458d120">ConvertToInt64</a> (const tStringObj &amp;strValue)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of ConvertToInt64 is a simple overload in the template that calls the above form passing <code>strValue.c_str()</code>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static double&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#8a507b006286460814e0486c622d828c">ConvertToFloat</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> strValue)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Convert from string to floating point. <a href="#8a507b006286460814e0486c622d828c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="abd4e479d2708a9ea3135cd441faa7ea"></a><!-- doxytag: member="TXMPUtils::ConvertToFloat" ref="abd4e479d2708a9ea3135cd441faa7ea" args="(const tStringObj &amp;strValue)" -->
-static double&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#abd4e479d2708a9ea3135cd441faa7ea">ConvertToFloat</a> (const tStringObj &amp;strValue)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of <code>ConvertToFloat</code> is a simple overload in the template that calls the above form passing <code>strValue.c_str()</code>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#60d33e6ce30286028acca47b2b6e7a0b">ConvertToDate</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> strValue, <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *binValue)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Convert from string to date/time. <a href="#60d33e6ce30286028acca47b2b6e7a0b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="265559d1b4b78e34a460e935c11177d7"></a><!-- doxytag: member="TXMPUtils::ConvertToDate" ref="265559d1b4b78e34a460e935c11177d7" args="(const tStringObj &amp;strValue, XMP_DateTime *binValue)" -->
-static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#265559d1b4b78e34a460e935c11177d7">ConvertToDate</a> (const tStringObj &amp;strValue, <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *binValue)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of <code>ConvertToDate</code> is a simple overload in the template that calls the above form passing s<code>strValue.c_str()</code>. <br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Date/Time functions</div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#c83f0b963ea64d7eee0b481e15a8439c">CurrentDateTime</a> (<a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *time)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Obtain the current date and time. <a href="#c83f0b963ea64d7eee0b481e15a8439c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#96bcc45febac55f6c49951815b7de2ef">SetTimeZone</a> (<a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *time)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set the local time zone. <a href="#96bcc45febac55f6c49951815b7de2ef"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#bbd4d691c83287ea2fc6b1e33e5858b8">ConvertToUTCTime</a> (<a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *time)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Make sure a time is UTC. <a href="#bbd4d691c83287ea2fc6b1e33e5858b8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#61852aaba494c8fbad5a6c0c4caf21f5">ConvertToLocalTime</a> (<a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *time)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Make sure a time is local. <a href="#61852aaba494c8fbad5a6c0c4caf21f5"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#9fc7f1771032f59f9020aeda4f91991d">CompareDateTime</a> (const <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> &amp;left, const <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> &amp;right)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compare the order of two date/time values. <a href="#9fc7f1771032f59f9020aeda4f91991d"></a><br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">Base 64 Encoding and Decoding</div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#ef3b23bbc152480f699e269620ecad4a">EncodeToBase64</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> rawStr, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> rawLen, tStringObj *encodedStr)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Convert from raw data to Base64 encoded string. <a href="#ef3b23bbc152480f699e269620ecad4a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="39d5de77b29441a30f2f879755b8e7d8"></a><!-- doxytag: member="TXMPUtils::EncodeToBase64" ref="39d5de77b29441a30f2f879755b8e7d8" args="(const tStringObj &amp;rawStr, tStringObj *encodedStr)" -->
-static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#39d5de77b29441a30f2f879755b8e7d8">EncodeToBase64</a> (const tStringObj &amp;rawStr, tStringObj *encodedStr)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of <code>EncodeToBase64</code> is a simple overload in the template that calls the above form passing <code>rawStr.c_str()</code>, and <code>rawStr.size()</code>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#e5bdd91c0c3ee9262dc0a8b9f591b921">DecodeFromBase64</a> (<a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> encodedStr, <a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> encodedLen, tStringObj *rawStr)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Decode from Base64 encoded string to raw data. <a href="#e5bdd91c0c3ee9262dc0a8b9f591b921"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e61e273065b10517ca127d5a553a8dc"></a><!-- doxytag: member="TXMPUtils::DecodeFromBase64" ref="1e61e273065b10517ca127d5a553a8dc" args="(const tStringObj &amp;encodedStr, tStringObj *rawStr)" -->
-static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#1e61e273065b10517ca127d5a553a8dc">DecodeFromBase64</a> (const tStringObj &amp;encodedStr, tStringObj *rawStr)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of <code>DecodeFromBase64</code> is a simple overload in the template that calls the above form passing <code>encodedStr.c_str()</code>, and <code>encodedStr.size()</code>. <br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">JPEG file handling</div></td></tr>
-<tr><td colspan="2"><div class="groupText">These functions support the partitioning of XMP in JPEG files into standard and extended portions in order to work around the 64KB size limit of JPEG marker segments. <br><br></div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#6001b4ff54c60fdf0c40e6b78a5c457a">PackageForJPEG</a> (const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;xmpObj, tStringObj *standardXMP, tStringObj *extendedXMP, tStringObj *extendedDigest)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Create XMP serializations appropriate for a JPEG file. The standard XMP in a JPEG file is limited to about 65500 bytes. <code>PackageForJPEG</code> attempts to fit the serialization within that limit. If necessary it will partition the XMP into 2 serializations. <a href="#6001b4ff54c60fdf0c40e6b78a5c457a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#6187cd5fef0eccecac6805d4114dcd2e">MergeFromJPEG</a> (<a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *fullXMP, const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;extendedXMP)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Put the extended XMP properties back into the full XMP. <a href="#6187cd5fef0eccecac6805d4114dcd2e"></a><br></td></tr>
-<tr><td colspan="2"><div class="groupHeader">UI helper functions</div></td></tr>
-<tr><td colspan="2"><div class="groupText">These functions are mainly of interest in implementing a user interface for editing XMP. <br><br></div></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#d7e1aa7928252fb88a24fb5c3aef22ba">CatenateArrayItems</a> (const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;xmpObj, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> separator, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> quotes, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options, tStringObj *catedStr)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Create a single edit string from an array of strings. <a href="#d7e1aa7928252fb88a24fb5c3aef22ba"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#66c5ddee47aa36ed906353f94ca18d2e">SeparateArrayItems</a> (<a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *xmpObj, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> catedStr)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Separate a single edit string into an array of strings. <a href="#66c5ddee47aa36ed906353f94ca18d2e"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1bb2ed614886ff67863744ec56041c43"></a><!-- doxytag: member="TXMPUtils::SeparateArrayItems" ref="1bb2ed614886ff67863744ec56041c43" args="(TXMPMeta&lt; tStringObj &gt; *xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits options, const tStringObj &amp;catedStr)" -->
-static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#1bb2ed614886ff67863744ec56041c43">SeparateArrayItems</a> (<a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *xmpObj, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> arrayName, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options, const tStringObj &amp;catedStr)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This form of <code>SeparateArrayItems</code> is a simple overload in the template that calls the aboveform passing <code>catedStr.c_str()</code>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#40c645803530662e08d042b4b7c6190d">RemoveProperties</a> (<a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *xmpObj, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS=0, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName=0, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Remove multiple properties from an XMP object. <a href="#40c645803530662e08d042b4b7c6190d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#4795244ffcbda927800f789b0e40c262">AppendProperties</a> (const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;source, <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *dest, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Append properties from one XMP object to another. <a href="#4795244ffcbda927800f789b0e40c262"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTXMPUtils.html#a17838f062e5414bc0929f67ac94a3aa">DuplicateSubtree</a> (const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;source, <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *dest, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> sourceNS, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> sourceRoot, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> destNS=0, <a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> destRoot=0, <a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options=0)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Replicate a subtree from one XMP object into another, possibly at a different location. <a href="#a17838f062e5414bc0929f67ac94a3aa"></a><br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template&lt;class tStringObj&gt;<br>
- class TXMPUtils&lt; tStringObj &gt;</h3>
-
-Template class for the XMP Toolkit utility services.
-<p>
-<code><a class="el" href="classTXMPUtils.html">TXMPUtils</a></code> is the template class providing utility services for the XMP Toolkit. It should be instantiated with a string class such as <code>std::string</code>. Please read the general toolkit usage notes for information about the overall architecture of the XMP API.<p>
-This is a class for C++ scoping purposes only. It has only static functions, you cannot create an object. These are all functions that layer cleanly on top of the core XMP toolkit. The template wraps a string class around the raw XMP API, so that output strings are automatically copied and access is fully thread safe. String objects are only necessary for output strings. Input strings are literals and passed as typical C <code>const char *</code>.<p>
-The template parameter, class <code>TtStringObj</code>, is described in the XMP.hpp umbrella header.
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="47fa195aa2e1457aa1f74f7e1ed06da6"></a><!-- doxytag: member="TXMPUtils::ComposeArrayItemPath" ref="47fa195aa2e1457aa1f74f7e1ed06da6" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, tStringObj *fullPath)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ComposeArrayItemPath </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>arrayName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#00e9d9a76c144421105a4c2742203315">XMP_Index</a>&nbsp;</td>
- <td class="paramname"> <em>itemIndex</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>fullPath</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Compose the path expression for an item in an array.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the array. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. May be a general path expression, must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>itemIndex</em>&nbsp;</td><td>The index of the desired item. Arrays in XMP are indexed from 1. The constant <code>kXMP_ArrayLastItem</code> always refers to the last existing array item.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fullPath</em>&nbsp;</td><td>A pointer to the string that will be assigned the composed path. This will be of the form <code>ns:arrayName[i]</code>, where "ns" is the prefix for <code>schemaNS</code> and "i" is the decimal representation of <code>itemIndex</code>. If the value of <code>itemIndex</code> is <code>kXMP_ArrayLastItem</code>, the path is <code>ns:arrayName[last()]</code>. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="706eb85b8401b8682a01348f7e25ee3d"></a><!-- doxytag: member="TXMPUtils::ComposeStructFieldPath" ref="706eb85b8401b8682a01348f7e25ee3d" args="(XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, tStringObj *fullPath)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ComposeStructFieldPath </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>structName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>fieldNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>fieldName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>fullPath</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Compose the path expression for a field in a struct.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the struct. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>structName</em>&nbsp;</td><td>The name of the struct. May be a general path expression, must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fieldNS</em>&nbsp;</td><td>The namespace URI for the field. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fieldName</em>&nbsp;</td><td>The name of the field. Must be a simple XML name, must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fullPath</em>&nbsp;</td><td>A pointer to the string that will be assigned the composed path. This will be of the form <code>ns:structName/fNS:fieldName</code>, where "ns" is the prefix for <code>schemaNS</code> and "fNS" is the prefix for <code>fieldNS</code>. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="40ae0ce2065fcb71725e37137884e172"></a><!-- doxytag: member="TXMPUtils::ComposeQualifierPath" ref="40ae0ce2065fcb71725e37137884e172" args="(XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, tStringObj *fullPath)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ComposeQualifierPath </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>qualNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>qualName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>fullPath</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Compose the path expression for a qualifier.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the property to which the qualifier is attached. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>The name of the property to which the qualifier is attached. May be a general path expression, must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>qualNS</em>&nbsp;</td><td>The namespace URI for the qualifier. May be null or the empty string if the qualifier is in the XML empty namespace.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>qualName</em>&nbsp;</td><td>The name of the qualifier. Must be a simple XML name, must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fullPath</em>&nbsp;</td><td>A pointer to the string that will be assigned the composed path. This will be of the form <code>ns:propName/?qNS:qualName</code>, where "ns" is the prefix for <code>schemaNS</code> and "qNS" is the prefix for <code>qualNS</code>. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="e4989e5c199a2a4287ee3ae89b872e69"></a><!-- doxytag: member="TXMPUtils::ComposeLangSelector" ref="e4989e5c199a2a4287ee3ae89b872e69" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr langName, tStringObj *fullPath)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ComposeLangSelector </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>arrayName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>langName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>fullPath</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Compose the path expression to select an alternate item by language.
-<p>
-The path syntax allows two forms of "content addressing" that may be used to select an item in an array of alternatives. The form used in <code>ComposeLangSelector</code> lets you select an item in an alt-text array based on the value of its <code>xml:lang</code> qualifier. The other form of content addressing is shown in <code>ComposeFieldSelector</code>.<p>
-<dl class="note" compact><dt><b>Note:</b></dt><dd><code>ComposeLangSelector</code> does not supplant <code>SetLocalizedText</code> or <code>GetLocalizedText</code>. They should generally be used, as they provide extra logic to choose the appropriate language and maintain consistency with the 'x-default' value. <code>ComposeLangSelector</code> gives you an path expression that is explicitly and only for the language given in the <code>langName</code> parameter.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the array. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. May be a general path expression, must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>langName</em>&nbsp;</td><td>The RFC 3066 code for the desired language.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fullPath</em>&nbsp;</td><td>A pointer to the string that will be assigned the composed path. This will be of the form <code>ns:arrayName[@xml:lang='langName']</code>, where "ns" is the prefix for <code>schemaNS</code>. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="458f8e8729e2334fe54ca8f691a9db23"></a><!-- doxytag: member="TXMPUtils::ComposeFieldSelector" ref="458f8e8729e2334fe54ca8f691a9db23" args="(XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, tStringObj *fullPath)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ComposeFieldSelector </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>arrayName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>fieldNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>fieldName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>fieldValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>fullPath</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Compose the path expression to select an alternate item by a field's value.
-<p>
-The path syntax allows two forms of "content addressing" that may be used to select an item in an array of alternatives. The form used in <code>ComposeFieldSelector</code> lets you select an item in an array of structs based on the value of one of the fields in the structs. The other form of content addressing is shown in <code>ComposeLangSelector</code>.<p>
-For example, consider a simple struct that has two fields, the name of a city and the URI of an FTP site in that city. Use this to create an array of download alternatives. You can show the user a popup built from the values of the city fields. You can then get the corresponding URI as follows:<p>
-<div class="fragment"><pre class="fragment">
- /// ComposeFieldSelector ( schemaNS, "Downloads", fieldNS, "City", chosenCity, &amp;path );
- /// exists = GetStructField ( schemaNS, path, fieldNS, "URI", &amp;uri );
- /// </pre></div><p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The namespace URI for the array. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. May be a general path expression, must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fieldNS</em>&nbsp;</td><td>The namespace URI for the field used as the selector. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fieldName</em>&nbsp;</td><td>The name of the field used as the selector. Must be a simple XML name, must not be null or the empty string. It must be the name of a field that is itself simple.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fieldValue</em>&nbsp;</td><td>The desired value of the field.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>fullPath</em>&nbsp;</td><td>A pointer to the string that will be assigned the composed path. This will be of the form <code>ns:arrayName[fNS:fieldName='fieldValue']</code>, where "ns" is the prefix for <code>schemaNS</code> and "fNS" is the prefix for <code>fieldNS</code>. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="509691eb270988de6a770c9c8304ab6b"></a><!-- doxytag: member="TXMPUtils::ConvertFromBool" ref="509691eb270988de6a770c9c8304ab6b" args="(bool binValue, tStringObj *strValue)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertFromBool </td>
- <td>(</td>
- <td class="paramtype">bool&nbsp;</td>
- <td class="paramname"> <em>binValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>strValue</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Convert from Boolean to string.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>binValue</em>&nbsp;</td><td>The Boolean value to be converted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The string representation of the Boolean. The values used are given by the macros <code>kXMP_TrueStr</code> and <code>kXMP_FalseStr</code> found in <code><a class="el" href="XMP__Const_8h.html">XMP_Const.h</a></code>. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="eec45b4d1a26717290105c9f4e8b4235"></a><!-- doxytag: member="TXMPUtils::ConvertFromInt" ref="eec45b4d1a26717290105c9f4e8b4235" args="(long binValue, XMP_StringPtr format, tStringObj *strValue)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertFromInt </td>
- <td>(</td>
- <td class="paramtype">long&nbsp;</td>
- <td class="paramname"> <em>binValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>format</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>strValue</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Convert from integer to string.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>binValue</em>&nbsp;</td><td>The integer value to be converted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>format</em>&nbsp;</td><td>Optional C sprintf format for the conversion. Defaults to "%d".</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The string representation of the integer. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="e67ef3931836432b7e574832f0610ed0"></a><!-- doxytag: member="TXMPUtils::ConvertFromFloat" ref="e67ef3931836432b7e574832f0610ed0" args="(double binValue, XMP_StringPtr format, tStringObj *strValue)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertFromFloat </td>
- <td>(</td>
- <td class="paramtype">double&nbsp;</td>
- <td class="paramname"> <em>binValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>format</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>strValue</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Convert from floating point to string.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>binValue</em>&nbsp;</td><td>The floating point value to be converted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>format</em>&nbsp;</td><td>Optional C sprintf format for the conversion. Defaults to "%f".</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The string representation of the floating point value. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="6146a522a3974b4088d6e8241e9cd223"></a><!-- doxytag: member="TXMPUtils::ConvertFromDate" ref="6146a522a3974b4088d6e8241e9cd223" args="(const XMP_DateTime &amp;binValue, tStringObj *strValue)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertFromDate </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> &amp;&nbsp;</td>
- <td class="paramname"> <em>binValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>strValue</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Convert from date/time to string.
-<p>
-Format a date according to the ISO 8601 profile in <a href="http://www.w3.org/TR/NOTE-datetime:">http://www.w3.org/TR/NOTE-datetime:</a> YYYY YYYY-MM YYYY-MM-DD YYYY-MM-DDThh:mmTZD YYYY-MM-DDThh:mm:ssTZD YYYY-MM-DDThh:mm:ss.sTZD<p>
-YYYY = four-digit year MM = two-digit month (01=January, etc.) DD = two-digit day of month (01 through 31) hh = two digits of hour (00 through 23) mm = two digits of minute (00 through 59) ss = two digits of second (00 through 59) s = one or more digits representing a decimal fraction of a second TZD = time zone designator (Z or +hh:mm or -hh:mm)<p>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>ISO 8601 does not seem to allow years less than 1000 or greater than 9999. We allow any year, even negative ones. The year is formatted as "%.4d".<p>
-As a compatibility "tactic" (OK, a hack), so-called time-only input is allowed where the year, month, and day are all zero. This is output as "0000-00-00...".</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>binValue</em>&nbsp;</td><td>The <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> value to be converted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The ISO 8601 string representation of the date/time. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="aaaaadb23f4089daa795f50cba4f405c"></a><!-- doxytag: member="TXMPUtils::ConvertToBool" ref="aaaaadb23f4089daa795f50cba4f405c" args="(XMP_StringPtr strValue)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static bool <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToBool </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>strValue</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Convert from string to Boolean.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The string representation of the Boolean.</td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>The appropriate C++ bool value for the string. The preferred strings are <code>kXMP_TrueStr</code> and <code>kXMP_FalseStr</code>. If these do not match, a case insensitive comparison is tried, then simply 't' or 'f', and finally non-zero and zero integer representations. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="dfd9d1c522377d5db4ad667a7973ba00"></a><!-- doxytag: member="TXMPUtils::ConvertToInt" ref="dfd9d1c522377d5db4ad667a7973ba00" args="(XMP_StringPtr strValue)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static long <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToInt </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>strValue</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Convert from string to integer.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The string representation of the integer.</td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>The integer value as a C long. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="be5d2dcc03c5442202203bba5ca7b172"></a><!-- doxytag: member="TXMPUtils::ConvertToInt64" ref="be5d2dcc03c5442202203bba5ca7b172" args="(XMP_StringPtr strValue)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static long long <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToInt64 </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>strValue</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Convert from string to 64 bit integer.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The string representation of the integer.</td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>The integer value as a C long long. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="8a507b006286460814e0486c622d828c"></a><!-- doxytag: member="TXMPUtils::ConvertToFloat" ref="8a507b006286460814e0486c622d828c" args="(XMP_StringPtr strValue)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static double <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToFloat </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>strValue</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Convert from string to floating point.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The string representation of the floating point value.</td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>The floating point value. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="60d33e6ce30286028acca47b2b6e7a0b"></a><!-- doxytag: member="TXMPUtils::ConvertToDate" ref="60d33e6ce30286028acca47b2b6e7a0b" args="(XMP_StringPtr strValue, XMP_DateTime *binValue)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToDate </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>strValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *&nbsp;</td>
- <td class="paramname"> <em>binValue</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Convert from string to date/time.
-<p>
-Parse a date according to the ISO 8601 profile in <a href="http://www.w3.org/TR/NOTE-datetime:">http://www.w3.org/TR/NOTE-datetime:</a> YYYY YYYY-MM YYYY-MM-DD YYYY-MM-DDThh:mmTZD YYYY-MM-DDThh:mm:ssTZD YYYY-MM-DDThh:mm:ss.sTZD<p>
-YYYY = four-digit year MM = two-digit month (01=January, etc.) DD = two-digit day of month (01 through 31) hh = two digits of hour (00 through 23) mm = two digits of minute (00 through 59) ss = two digits of second (00 through 59) s = one or more digits representing a decimal fraction of a second TZD = time zone designator (Z or +hh:mm or -hh:mm)<p>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>ISO 8601 does not seem to allow years less than 1000 or greater than 9999. We allow any year, even negative ones. The year is assumed to be formatted as "%.4d".<p>
-As compatibility "tactics" (OK, hacks), a missing date portion or missing TZD are tolerated. A missing date value may begin with "Thh:" or "hh:"; the year, month, and day are all set to zero in the <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> value. A missing TZD is assumed to be UTC.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>strValue</em>&nbsp;</td><td>The ISO 8601 string representation of the date/time.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>binValue</em>&nbsp;</td><td>A pointer to the <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> variable to be assigned the date/time components. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="c83f0b963ea64d7eee0b481e15a8439c"></a><!-- doxytag: member="TXMPUtils::CurrentDateTime" ref="c83f0b963ea64d7eee0b481e15a8439c" args="(XMP_DateTime *time)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::CurrentDateTime </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *&nbsp;</td>
- <td class="paramname"> <em>time</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Obtain the current date and time.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>time</em>&nbsp;</td><td>A pointer to the <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> variable to be assigned the current date and time. The returned time is UTC, properly adjusted for the local time zone. The resolution of the time is not guaranteed to be finer than seconds. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="96bcc45febac55f6c49951815b7de2ef"></a><!-- doxytag: member="TXMPUtils::SetTimeZone" ref="96bcc45febac55f6c49951815b7de2ef" args="(XMP_DateTime *time)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::SetTimeZone </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *&nbsp;</td>
- <td class="paramname"> <em>time</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Set the local time zone.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>time</em>&nbsp;</td><td>A pointer to the <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> variable containing the value to be modified. Any existing time zone value is replaced, the other date/time fields are not adjusted in any way. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="bbd4d691c83287ea2fc6b1e33e5858b8"></a><!-- doxytag: member="TXMPUtils::ConvertToUTCTime" ref="bbd4d691c83287ea2fc6b1e33e5858b8" args="(XMP_DateTime *time)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToUTCTime </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *&nbsp;</td>
- <td class="paramname"> <em>time</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Make sure a time is UTC.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>time</em>&nbsp;</td><td>A pointer to the <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> variable containing the time to be modified. If the time zone is not UTC, the time is adjusted and the time zone set to be UTC. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="61852aaba494c8fbad5a6c0c4caf21f5"></a><!-- doxytag: member="TXMPUtils::ConvertToLocalTime" ref="61852aaba494c8fbad5a6c0c4caf21f5" args="(XMP_DateTime *time)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::ConvertToLocalTime </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> *&nbsp;</td>
- <td class="paramname"> <em>time</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Make sure a time is local.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>time</em>&nbsp;</td><td>A pointer to the <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> variable containing the time to be modified. If the time zone is not the local zone, the time is adjusted and the time zone set to be local. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="9fc7f1771032f59f9020aeda4f91991d"></a><!-- doxytag: member="TXMPUtils::CompareDateTime" ref="9fc7f1771032f59f9020aeda4f91991d" args="(const XMP_DateTime &amp;left, const XMP_DateTime &amp;right)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static int <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::CompareDateTime </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> &amp;&nbsp;</td>
- <td class="paramname"> <em>left</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a> &amp;&nbsp;</td>
- <td class="paramname"> <em>right</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Compare the order of two date/time values.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>left</em>&nbsp;</td><td>The "lefthand" date/time.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>right</em>&nbsp;</td><td>The "righthand" date/time.</td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd><ul>
-<li>-1 if left is before right </li>
-<li>0 if left matches right </li>
-<li>+1 if left is after right </li>
-</ul>
-</dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="ef3b23bbc152480f699e269620ecad4a"></a><!-- doxytag: member="TXMPUtils::EncodeToBase64" ref="ef3b23bbc152480f699e269620ecad4a" args="(XMP_StringPtr rawStr, XMP_StringLen rawLen, tStringObj *encodedStr)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::EncodeToBase64 </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>rawStr</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a>&nbsp;</td>
- <td class="paramname"> <em>rawLen</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>encodedStr</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Convert from raw data to Base64 encoded string.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>rawStr</em>&nbsp;</td><td>The pointer to raw data to be converted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>rawLen</em>&nbsp;</td><td>The length of raw data to be converted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>encodedStr</em>&nbsp;</td><td>The XMP object to contain the encoded string. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="e5bdd91c0c3ee9262dc0a8b9f591b921"></a><!-- doxytag: member="TXMPUtils::DecodeFromBase64" ref="e5bdd91c0c3ee9262dc0a8b9f591b921" args="(XMP_StringPtr encodedStr, XMP_StringLen encodedLen, tStringObj *rawStr)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::DecodeFromBase64 </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>encodedStr</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a>&nbsp;</td>
- <td class="paramname"> <em>encodedLen</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>rawStr</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Decode from Base64 encoded string to raw data.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>encodedStr</em>&nbsp;</td><td>The pointer to encoded data to be converted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>encodedLen</em>&nbsp;</td><td>The length of encoded datavto be converted.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>rawStr</em>&nbsp;</td><td>The XMP object to contain the decoded string. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="6001b4ff54c60fdf0c40e6b78a5c457a"></a><!-- doxytag: member="TXMPUtils::PackageForJPEG" ref="6001b4ff54c60fdf0c40e6b78a5c457a" args="(const TXMPMeta&lt; tStringObj &gt; &amp;xmpObj, tStringObj *standardXMP, tStringObj *extendedXMP, tStringObj *extendedDigest)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::PackageForJPEG </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
- <td class="paramname"> <em>xmpObj</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>standardXMP</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>extendedXMP</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>extendedDigest</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Create XMP serializations appropriate for a JPEG file. The standard XMP in a JPEG file is limited to about 65500 bytes. <code>PackageForJPEG</code> attempts to fit the serialization within that limit. If necessary it will partition the XMP into 2 serializations.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>xmpObj</em>&nbsp;</td><td>The XMP for the JPEG file.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>standardXMP</em>&nbsp;</td><td>The full standard XMP packet.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>extendedXMP</em>&nbsp;</td><td>The serialized extended XMP, empty if not needed.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>extendedDigest</em>&nbsp;</td><td>An MD5 digest of the serialized extended XMP, empty if not needed. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="6187cd5fef0eccecac6805d4114dcd2e"></a><!-- doxytag: member="TXMPUtils::MergeFromJPEG" ref="6187cd5fef0eccecac6805d4114dcd2e" args="(TXMPMeta&lt; tStringObj &gt; *fullXMP, const TXMPMeta&lt; tStringObj &gt; &amp;extendedXMP)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::MergeFromJPEG </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *&nbsp;</td>
- <td class="paramname"> <em>fullXMP</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
- <td class="paramname"> <em>extendedXMP</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Put the extended XMP properties back into the full XMP.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>fullXMP</em>&nbsp;</td><td>The full XMP, presumed to be initialized from the standard XMP packet.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>extendedXMP</em>&nbsp;</td><td>The properties that were partitioned into the extended XMP. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="d7e1aa7928252fb88a24fb5c3aef22ba"></a><!-- doxytag: member="TXMPUtils::CatenateArrayItems" ref="d7e1aa7928252fb88a24fb5c3aef22ba" args="(const TXMPMeta&lt; tStringObj &gt; &amp;xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr separator, XMP_StringPtr quotes, XMP_OptionBits options, tStringObj *catedStr)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::CatenateArrayItems </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
- <td class="paramname"> <em>xmpObj</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>arrayName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>separator</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>quotes</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">tStringObj *&nbsp;</td>
- <td class="paramname"> <em>catedStr</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Create a single edit string from an array of strings.
-<p>
-TBD - needs more description<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>xmpObj</em>&nbsp;</td><td>The XMP object containing the array to be catenated.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The schema namespace URI for the array. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. May be a general path expression, must not be null or the empty string. Each item in the array must be a simple string value.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>separator</em>&nbsp;</td><td>The string to be used to separate the items in the catenated string. Defaults to "; ", ASCII semicolon and space (U+003B, U+0020).</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>quotes</em>&nbsp;</td><td>The characters to be used as quotes around array items that contain a separator. Defaults to '"', ASCII quote (U+0022).</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the catenation.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>catedStr</em>&nbsp;</td><td>A pointer to the string to be assigned the catenated array items. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="66c5ddee47aa36ed906353f94ca18d2e"></a><!-- doxytag: member="TXMPUtils::SeparateArrayItems" ref="66c5ddee47aa36ed906353f94ca18d2e" args="(TXMPMeta&lt; tStringObj &gt; *xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits options, XMP_StringPtr catedStr)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::SeparateArrayItems </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *&nbsp;</td>
- <td class="paramname"> <em>xmpObj</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>arrayName</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>catedStr</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Separate a single edit string into an array of strings.
-<p>
-TBD - needs more description<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>xmpObj</em>&nbsp;</td><td>The XMP object containing the array to be updated.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>The schema namespace URI for the array. Must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>arrayName</em>&nbsp;</td><td>The name of the array. May be a general path expression, must not be null or the empty string. Each item in the array must be a simple string value.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the separation.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>catedStr</em>&nbsp;</td><td>The string to be separated into the array items. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="40c645803530662e08d042b4b7c6190d"></a><!-- doxytag: member="TXMPUtils::RemoveProperties" ref="40c645803530662e08d042b4b7c6190d" args="(TXMPMeta&lt; tStringObj &gt; *xmpObj, XMP_StringPtr schemaNS=0, XMP_StringPtr propName=0, XMP_OptionBits options=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::RemoveProperties </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *&nbsp;</td>
- <td class="paramname"> <em>xmpObj</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>schemaNS</em> = <code>0</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>propName</em> = <code>0</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Remove multiple properties from an XMP object.
-<p>
-<code>RemoveProperties</code> was created to support the File Info dialog's Delete button, and has been been generalized somewhat from those specific needs. It operates in one of three main modes depending on the schemaNS and propName parameters:<p>
-<ul>
-<li>Non-empty <code>schemaNS</code> and <code>propName</code> - The named property is removed if it is an external property, or if the <code>kXMPUtil_DoAllProperties</code> option is passed. It does not matter whether the named property is an actual property or an alias.</li>
-</ul>
-<ul>
-<li>Non-empty <code>schemaNS</code> and empty <code>propName</code> - The all external properties in the named schema are removed. Internal properties are also removed if the <code>kXMPUtil_DoAllProperties</code> option is passed. In addition, aliases from the named schema will be removed if the <code>kXMPUtil_IncludeAliases</code> option is passed.</li>
-</ul>
-<ul>
-<li>Empty <code>schemaNS</code> and empty <code>propName</code> - All external properties in all schema are removed. Internal properties are also removed if the <code>kXMPUtil_DoAllProperties</code> option is passed. Aliases are implicitly handled because the associated actuals are.</li>
-</ul>
-It is an error to pass and empty schemaNS and non-empty propName.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>xmpObj</em>&nbsp;</td><td>The XMP object containing the properties to be removed.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>schemaNS</em>&nbsp;</td><td>Optional schema namespace URI for the properties to be removed.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>propName</em>&nbsp;</td><td>Optional path expression for the property to be removed.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the deletion. The defined flags are: <ul>
-<li><code>kXMPUtil_DoAllProperties</code> - Do internal properties in addition to external properties. </li>
-<li><code>kXMPUtil_IncludeAliases</code> - Include aliases in the "named schema" case above. </li>
-</ul>
-</td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="4795244ffcbda927800f789b0e40c262"></a><!-- doxytag: member="TXMPUtils::AppendProperties" ref="4795244ffcbda927800f789b0e40c262" args="(const TXMPMeta&lt; tStringObj &gt; &amp;source, TXMPMeta&lt; tStringObj &gt; *dest, XMP_OptionBits options=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::AppendProperties </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
- <td class="paramname"> <em>source</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *&nbsp;</td>
- <td class="paramname"> <em>dest</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Append properties from one XMP object to another.
-<p>
-<code>AppendProperties</code> was created to support the File Info dialog's Append button, and has been been generalized somewhat from those specific needs. It appends information from one XMP object (<code>source</code>) to another (<code>dest</code>). The default operation is to append only external properties that do not already exist in the destination. The kXMPUtil_DoAllProperties option can be used to operate on all properties, external and internal. The kXMPUtil_ReplaceOldValues option can be used to replace the values of existing properties. The notion of external versus internal applies only to top level properties. The keep-or-replace-old notion applies within structs and arrays as described below.<p>
-If kXMPUtil_ReplaceOldValues is passed then the processing is restricted to the top level properties. The processed properties from the source (according to kXMPUtil_DoAllProperties) are propagated to the destination, replacing any existing values. Properties in the destination that are not in the source are left alone.<p>
-If kXMPUtil_ReplaceOldValues is not passed then the processing is more complicated. Top level properties are added to the destination if they do not already exist. If they do exist but differ in form (simple/struct/array) then the destination is left alone. If the forms match, simple properties are left unchanged while structs and arrays are merged.<p>
-If kXMPUtil_DeleteEmptyValues is passed then an empty value in the source XMP causes the corresponding Dest XMP property to be deleted. The default is to treat empty values the same as non-empty values. An empty value is any of a simple empty string, an array with no items, or a struct with no fields. Qualifiers are ignored.<p>
-The detailed behavior is defined by the following pseudo-code: <div class="fragment"><pre class="fragment">
- /// AppendProperties ( sourceXMP, destXMP, options ):
- /// doAll = options &amp; kXMPUtil_DoAllProperties
- /// replaceOld = options &amp; kXMPUtil_ReplaceOldValues
- /// deleteEmpty = options &amp; kXMPUtil_DeleteEmptyValues
- /// for all source schema (top level namespaces):
- /// for all top level properties in sourceSchema:
- /// if doAll or prop is external:
- /// AppendSubtree ( sourceNode, destSchema, replaceOld, deleteEmpty )
- ///
- /// AppendSubtree ( sourceNode, destParent, replaceOld, deleteEmpty ):
- /// if deleteEmpty and source value is empty:
- /// delete the corresponding child from destParent
- /// else if sourceNode not in destParent (by name):
- /// copy sourceNode's subtree to destParent
- /// else if replaceOld:
- /// delete subtree from destParent
- /// copy sourceNode's subtree to destParent
- /// else:
- /// // Already exists in dest and not replacing, merge structs and arrays
- /// if sourceNode and destNode forms differ:
- /// return, leave the destNode alone
- /// else if form is a struct:
- /// for each field in sourceNode:
- /// AppendSubtree ( sourceNode.field, destNode, replaceOld )
- /// else if form is an alt-text array:
- /// copy new items by xml:lang value into the destination
- /// else if form is an array:
- /// copy new items by value into the destination, ignoring order and duplicates
- /// </pre></div><p>
-<dl class="note" compact><dt><b>Note:</b></dt><dd><code>AppendProperties</code> can be expensive if replaceOld is not passed and the XMP contains large arrays. The array item checking described above is n-squared. Each source item is checked to see if it already exists in the destination, without regard to order or duplicates. Simple items are compared by value and xml:lang qualifier, other qualifiers are ignored. Structs are recursively compared by field names, without regard to field order. Arrays are compared by recursively comparing all items.</dd></dl>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>source</em>&nbsp;</td><td>The source XMP object.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>dest</em>&nbsp;</td><td>The destination XMP object.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the copying. <ul>
-<li><code>kXMPUtil_DoAllProperties</code> - Do internal properties in addition to external properties. </li>
-<li><code>kXMPUtil_ReplaceOldValues</code> - Replace the values of existing properties. </li>
-<li><code>kXMPUtil_DeleteEmptyValues</code> - Delete properties if the new value is empty. </li>
-</ul>
-</td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="a17838f062e5414bc0929f67ac94a3aa"></a><!-- doxytag: member="TXMPUtils::DuplicateSubtree" ref="a17838f062e5414bc0929f67ac94a3aa" args="(const TXMPMeta&lt; tStringObj &gt; &amp;source, TXMPMeta&lt; tStringObj &gt; *dest, XMP_StringPtr sourceNS, XMP_StringPtr sourceRoot, XMP_StringPtr destNS=0, XMP_StringPtr destRoot=0, XMP_OptionBits options=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template&lt;class tStringObj&gt; </div>
- <table class="memname">
- <tr>
- <td class="memname">static void <a class="el" href="classTXMPUtils.html">TXMPUtils</a>&lt; tStringObj &gt;::DuplicateSubtree </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; &amp;&nbsp;</td>
- <td class="paramname"> <em>source</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="classTXMPMeta.html">TXMPMeta</a>&lt; tStringObj &gt; *&nbsp;</td>
- <td class="paramname"> <em>dest</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>sourceNS</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>sourceRoot</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>destNS</em> = <code>0</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a>&nbsp;</td>
- <td class="paramname"> <em>destRoot</em> = <code>0</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a>&nbsp;</td>
- <td class="paramname"> <em>options</em> = <code>0</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Replicate a subtree from one XMP object into another, possibly at a different location.
-<p>
-TBD - needs more description<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em>source</em>&nbsp;</td><td>The source XMP object.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>dest</em>&nbsp;</td><td>The destination XMP object.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>sourceNS</em>&nbsp;</td><td>The schema namespace URI for the source subtree.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>sourceRoot</em>&nbsp;</td><td>The root location for the source subtree. May be a general path expression, must not be null or the empty string.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>destNS</em>&nbsp;</td><td>The schema namespace URI for the destination. Defaults to the source namespace.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>destRoot</em>&nbsp;</td><td>The root location for the destination. May be a general path expression. Defaults to the source location.</td></tr>
- <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>Option flags to control the separation. </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="TXMPUtils_8hpp-source.html">TXMPUtils.hpp</a></ul>
-<hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:59 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/files.html b/docs/XMPToolkit/files.html
deleted file mode 100644
index 98ad7cf..0000000
--- a/docs/XMPToolkit/files.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: File Index</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>Adobe XMP Toolkit File List</h1>Here is a list of all documented files with brief descriptions:<table>
- <tr><td class="indexkey"><a class="el" href="TXMPFiles_8hpp.html">TXMPFiles.hpp</a> <a href="TXMPFiles_8hpp-source.html">[code]</a></td><td class="indexvalue">API for access to the "main" metadata in a file </td></tr>
- <tr><td class="indexkey"><a class="el" href="TXMPFiles_8incl__cpp.html">TXMPFiles.incl_cpp</a></td><td class="indexvalue">The implementation of the <a class="el" href="classTXMPFiles.html">TXMPFiles</a> template class </td></tr>
- <tr><td class="indexkey"><a class="el" href="TXMPIterator_8hpp.html">TXMPIterator.hpp</a> <a href="TXMPIterator_8hpp-source.html">[code]</a></td><td class="indexvalue">Template class for the XMP Toolkit iteration services </td></tr>
- <tr><td class="indexkey"><a class="el" href="TXMPIterator_8incl__cpp.html">TXMPIterator.incl_cpp</a></td><td class="indexvalue">The implementation of the <a class="el" href="classTXMPIterator.html">TXMPIterator</a> template class </td></tr>
- <tr><td class="indexkey"><a class="el" href="TXMPMeta_8hpp.html">TXMPMeta.hpp</a> <a href="TXMPMeta_8hpp-source.html">[code]</a></td><td class="indexvalue">Template class for the XMP Toolkit core services </td></tr>
- <tr><td class="indexkey"><a class="el" href="TXMPMeta_8incl__cpp.html">TXMPMeta.incl_cpp</a></td><td class="indexvalue">The implementation of the <a class="el" href="classTXMPMeta.html">TXMPMeta</a> template class </td></tr>
- <tr><td class="indexkey"><a class="el" href="TXMPUtils_8hpp.html">TXMPUtils.hpp</a> <a href="TXMPUtils_8hpp-source.html">[code]</a></td><td class="indexvalue">Template class for the XMP Toolkit utility services </td></tr>
- <tr><td class="indexkey"><a class="el" href="TXMPUtils_8incl__cpp.html">TXMPUtils.incl_cpp</a></td><td class="indexvalue">The implementation of the <a class="el" href="classTXMPUtils.html">TXMPUtils</a> template class </td></tr>
- <tr><td class="indexkey"><a class="el" href="XMP_8incl__cpp.html">XMP.incl_cpp</a></td><td class="indexvalue">Overall client glue file for the XMP toolkit </td></tr>
- <tr><td class="indexkey"><a class="el" href="XMP__Const_8h.html">XMP_Const.h</a> <a href="XMP__Const_8h-source.html">[code]</a></td><td class="indexvalue">Common C/C++ types and constants for the XMP toolkit </td></tr>
-</table>
-<hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:59 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/functions_func.html b/docs/XMPToolkit/functions_func.html
deleted file mode 100644
index 8ae4376..0000000
--- a/docs/XMPToolkit/functions_func.html
+++ /dev/null
@@ -1,281 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: Class Members - Functions</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li id="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="functions.html"><span>All</span></a></li>
- <li id="current"><a href="functions_func.html"><span>Functions</span></a></li>
- </ul>
-</div>
-<div class="tabs">
- <ul>
- <li><a href="#index_a"><span>a</span></a></li>
- <li><a href="#index_c"><span>c</span></a></li>
- <li><a href="#index_d"><span>d</span></a></li>
- <li><a href="#index_e"><span>e</span></a></li>
- <li><a href="#index_g"><span>g</span></a></li>
- <li><a href="#index_i"><span>i</span></a></li>
- <li><a href="#index_m"><span>m</span></a></li>
- <li><a href="#index_n"><span>n</span></a></li>
- <li><a href="#index_o"><span>o</span></a></li>
- <li><a href="#index_p"><span>p</span></a></li>
- <li><a href="#index_r"><span>r</span></a></li>
- <li><a href="#index_s"><span>s</span></a></li>
- <li><a href="#index_t"><span>t</span></a></li>
- <li><a href="#index_~"><span>~</span></a></li>
- </ul>
-</div>
-
-<p>
-&nbsp;
-<p>
-<h3><a class="anchor" name="index_a">- a -</a></h3><ul>
-<li>AppendArrayItem()
-: <a class="el" href="classTXMPMeta.html#00d7314dc970ad390499ce9db27d314a">TXMPMeta&lt; tStringObj &gt;</a>
-<li>AppendProperties()
-: <a class="el" href="classTXMPUtils.html#4795244ffcbda927800f789b0e40c262">TXMPUtils&lt; tStringObj &gt;</a>
-</ul>
-<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
-<li>CanPutXMP()
-: <a class="el" href="classTXMPFiles.html#29a11a1539d6300da3fb4c7e9ea02bb6">TXMPFiles&lt; tStringObj &gt;</a>
-<li>CatenateArrayItems()
-: <a class="el" href="classTXMPUtils.html#d7e1aa7928252fb88a24fb5c3aef22ba">TXMPUtils&lt; tStringObj &gt;</a>
-<li>Clone()
-: <a class="el" href="classTXMPMeta.html#6ca653436995bbb76315efe7934afd4c">TXMPMeta&lt; tStringObj &gt;</a>
-<li>CloseFile()
-: <a class="el" href="classTXMPFiles.html#eca89170c7aa3e2d56e30bff04dd7927">TXMPFiles&lt; tStringObj &gt;</a>
-<li>CompareDateTime()
-: <a class="el" href="classTXMPUtils.html#9fc7f1771032f59f9020aeda4f91991d">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ComposeArrayItemPath()
-: <a class="el" href="classTXMPUtils.html#47fa195aa2e1457aa1f74f7e1ed06da6">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ComposeFieldSelector()
-: <a class="el" href="classTXMPUtils.html#458f8e8729e2334fe54ca8f691a9db23">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ComposeLangSelector()
-: <a class="el" href="classTXMPUtils.html#e4989e5c199a2a4287ee3ae89b872e69">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ComposeQualifierPath()
-: <a class="el" href="classTXMPUtils.html#40ae0ce2065fcb71725e37137884e172">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ComposeStructFieldPath()
-: <a class="el" href="classTXMPUtils.html#706eb85b8401b8682a01348f7e25ee3d">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ConvertFromBool()
-: <a class="el" href="classTXMPUtils.html#509691eb270988de6a770c9c8304ab6b">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ConvertFromDate()
-: <a class="el" href="classTXMPUtils.html#6146a522a3974b4088d6e8241e9cd223">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ConvertFromFloat()
-: <a class="el" href="classTXMPUtils.html#e67ef3931836432b7e574832f0610ed0">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ConvertFromInt()
-: <a class="el" href="classTXMPUtils.html#eec45b4d1a26717290105c9f4e8b4235">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ConvertToBool()
-: <a class="el" href="classTXMPUtils.html#aaaaadb23f4089daa795f50cba4f405c">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ConvertToDate()
-: <a class="el" href="classTXMPUtils.html#60d33e6ce30286028acca47b2b6e7a0b">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ConvertToFloat()
-: <a class="el" href="classTXMPUtils.html#abd4e479d2708a9ea3135cd441faa7ea">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ConvertToInt()
-: <a class="el" href="classTXMPUtils.html#dfd9d1c522377d5db4ad667a7973ba00">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ConvertToInt64()
-: <a class="el" href="classTXMPUtils.html#be5d2dcc03c5442202203bba5ca7b172">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ConvertToLocalTime()
-: <a class="el" href="classTXMPUtils.html#61852aaba494c8fbad5a6c0c4caf21f5">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ConvertToUTCTime()
-: <a class="el" href="classTXMPUtils.html#bbd4d691c83287ea2fc6b1e33e5858b8">TXMPUtils&lt; tStringObj &gt;</a>
-<li>CountArrayItems()
-: <a class="el" href="classTXMPMeta.html#b79aae864b3ce190d0699252f48e0acc">TXMPMeta&lt; tStringObj &gt;</a>
-<li>CurrentDateTime()
-: <a class="el" href="classTXMPUtils.html#c83f0b963ea64d7eee0b481e15a8439c">TXMPUtils&lt; tStringObj &gt;</a>
-</ul>
-<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
-<li>DecodeFromBase64()
-: <a class="el" href="classTXMPUtils.html#e5bdd91c0c3ee9262dc0a8b9f591b921">TXMPUtils&lt; tStringObj &gt;</a>
-<li>DeleteAlias()
-: <a class="el" href="classTXMPMeta.html#af64964e983235247ef65c86a42a4675">TXMPMeta&lt; tStringObj &gt;</a>
-<li>DeleteArrayItem()
-: <a class="el" href="classTXMPMeta.html#bc1211f47225b5973a170ff952743264">TXMPMeta&lt; tStringObj &gt;</a>
-<li>DeleteNamespace()
-: <a class="el" href="classTXMPMeta.html#3f989597e95db929676273cacd4ea09a">TXMPMeta&lt; tStringObj &gt;</a>
-<li>DeleteProperty()
-: <a class="el" href="classTXMPMeta.html#c8b555ba99904fa49bb4851a60cc3844">TXMPMeta&lt; tStringObj &gt;</a>
-<li>DeleteQualifier()
-: <a class="el" href="classTXMPMeta.html#8ce15f7de7fd3b258f07158ab5fa88be">TXMPMeta&lt; tStringObj &gt;</a>
-<li>DeleteStructField()
-: <a class="el" href="classTXMPMeta.html#bc258e027780a15be65a88fcfd4e1fd4">TXMPMeta&lt; tStringObj &gt;</a>
-<li>DoesArrayItemExist()
-: <a class="el" href="classTXMPMeta.html#492465c588d6d4cb8e30f94790e66f58">TXMPMeta&lt; tStringObj &gt;</a>
-<li>DoesPropertyExist()
-: <a class="el" href="classTXMPMeta.html#f22b116d71ecbbebea016ec5337e7066">TXMPMeta&lt; tStringObj &gt;</a>
-<li>DoesQualifierExist()
-: <a class="el" href="classTXMPMeta.html#81347a92becd387a14f4d47c582f129a">TXMPMeta&lt; tStringObj &gt;</a>
-<li>DoesStructFieldExist()
-: <a class="el" href="classTXMPMeta.html#9261b80d62e77a10ff1a89843bfa10a5">TXMPMeta&lt; tStringObj &gt;</a>
-<li>DumpAliases()
-: <a class="el" href="classTXMPMeta.html#afb027f200b85467298d237a0c23949b">TXMPMeta&lt; tStringObj &gt;</a>
-<li>DumpNamespaces()
-: <a class="el" href="classTXMPMeta.html#44250140a710c0b7c5cc0881e387d004">TXMPMeta&lt; tStringObj &gt;</a>
-<li>DumpObject()
-: <a class="el" href="classTXMPMeta.html#976c1eb889f44080f76628805712b618">TXMPMeta&lt; tStringObj &gt;</a>
-<li>DuplicateSubtree()
-: <a class="el" href="classTXMPUtils.html#a17838f062e5414bc0929f67ac94a3aa">TXMPUtils&lt; tStringObj &gt;</a>
-</ul>
-<h3><a class="anchor" name="index_e">- e -</a></h3><ul>
-<li>EncodeToBase64()
-: <a class="el" href="classTXMPUtils.html#ef3b23bbc152480f699e269620ecad4a">TXMPUtils&lt; tStringObj &gt;</a>
-</ul>
-<h3><a class="anchor" name="index_g">- g -</a></h3><ul>
-<li>GetArrayItem()
-: <a class="el" href="classTXMPMeta.html#c64a4251d157937f69b73f2ffac4f7cc">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetFileInfo()
-: <a class="el" href="classTXMPFiles.html#f9931d081cb19f98c81e41786030765b">TXMPFiles&lt; tStringObj &gt;</a>
-<li>GetFormatInfo()
-: <a class="el" href="classTXMPFiles.html#6ac78e3c7286ca8dcb41eaa007aa00e8">TXMPFiles&lt; tStringObj &gt;</a>
-<li>GetGlobalOptions()
-: <a class="el" href="classTXMPMeta.html#12b2435ba039c62a164951948c016eb4">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetInternalRef()
-: <a class="el" href="classTXMPMeta.html#4d35b44f1f017a27772ee902a3dacf04">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetLocalizedText()
-: <a class="el" href="classTXMPMeta.html#eefe49bbf669770d769f4fe0ea566bd0">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetNamespacePrefix()
-: <a class="el" href="classTXMPMeta.html#f28589472d8c0397db6cef868f2b8c97">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetNamespaceURI()
-: <a class="el" href="classTXMPMeta.html#a20c84e7549d0a3252fa29a1e83a757a">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetObjectName()
-: <a class="el" href="classTXMPMeta.html#b0d179ed95487d4fd4f2680c1fbe0d40">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetObjectOptions()
-: <a class="el" href="classTXMPMeta.html#39aeaf9eb83cfc1c5455807b95f055f9">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetProperty()
-: <a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetProperty_Bool()
-: <a class="el" href="classTXMPMeta.html#dcf8a1959a8bd42641a42cbd4d64a5b7">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetProperty_Date()
-: <a class="el" href="classTXMPMeta.html#2f561295e73047ee90765558d29bd650">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetProperty_Float()
-: <a class="el" href="classTXMPMeta.html#7708c31c9af3e740b27a4893dcd9aa47">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetProperty_Int()
-: <a class="el" href="classTXMPMeta.html#3b6ba486c02607b544917091c43b05cc">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetProperty_Int64()
-: <a class="el" href="classTXMPMeta.html#d1a6629b0466981b67d31c9dc3840ea7">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetQualifier()
-: <a class="el" href="classTXMPMeta.html#2cc58d8316043b035643e7c21633bc13">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetStructField()
-: <a class="el" href="classTXMPMeta.html#e99d2bc414d5cd68851147aef6710d4a">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetThumbnail()
-: <a class="el" href="classTXMPFiles.html#4ea1eda39f803322e10b2a554ef8ab06">TXMPFiles&lt; tStringObj &gt;</a>
-<li>GetVersionInfo()
-: <a class="el" href="classTXMPMeta.html#5415cfc01a9cb8786939246571a23a9d">TXMPMeta&lt; tStringObj &gt;</a>
-<li>GetXMP()
-: <a class="el" href="classTXMPFiles.html#42ca0bbc5ac66a8de1710e03a7ff17b3">TXMPFiles&lt; tStringObj &gt;</a>
-</ul>
-<h3><a class="anchor" name="index_i">- i -</a></h3><ul>
-<li>Initialize()
-: <a class="el" href="classTXMPFiles.html#0874bbbf41c9490abfb613bfe297327d">TXMPFiles&lt; tStringObj &gt;</a>
-, <a class="el" href="classTXMPMeta.html#bfddf1df0e01ab33d5636a80edc973ca">TXMPMeta&lt; tStringObj &gt;</a>
-</ul>
-<h3><a class="anchor" name="index_m">- m -</a></h3><ul>
-<li>MergeFromJPEG()
-: <a class="el" href="classTXMPUtils.html#6187cd5fef0eccecac6805d4114dcd2e">TXMPUtils&lt; tStringObj &gt;</a>
-</ul>
-<h3><a class="anchor" name="index_n">- n -</a></h3><ul>
-<li>Next()
-: <a class="el" href="classTXMPIterator.html#124a1dd1ab3ff0d236e4d4b967dafcd9">TXMPIterator&lt; tStringObj &gt;</a>
-</ul>
-<h3><a class="anchor" name="index_o">- o -</a></h3><ul>
-<li>OpenFile()
-: <a class="el" href="classTXMPFiles.html#fcd21cfe5d6f13c648c5541e161919cb">TXMPFiles&lt; tStringObj &gt;</a>
-<li>operator=()
-: <a class="el" href="classTXMPMeta.html#4d5a601c9b77f6f6ab5f14e658de58ef">TXMPMeta&lt; tStringObj &gt;</a>
-, <a class="el" href="classTXMPIterator.html#d767d731320d3f4c997c6ce9f7f8fa63">TXMPIterator&lt; tStringObj &gt;</a>
-</ul>
-<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
-<li>PackageForJPEG()
-: <a class="el" href="classTXMPUtils.html#6001b4ff54c60fdf0c40e6b78a5c457a">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ParseFromBuffer()
-: <a class="el" href="classTXMPMeta.html#7b383f5b357fff040cdbde82f4f43f26">TXMPMeta&lt; tStringObj &gt;</a>
-<li>PutXMP()
-: <a class="el" href="classTXMPFiles.html#d3f7babdc07c7de0d0cd9a3362b4710a">TXMPFiles&lt; tStringObj &gt;</a>
-</ul>
-<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
-<li>RegisterAlias()
-: <a class="el" href="classTXMPMeta.html#b9463c7459125ca0038db2e586c5e4df">TXMPMeta&lt; tStringObj &gt;</a>
-<li>RegisterNamespace()
-: <a class="el" href="classTXMPMeta.html#4c69d31a37ff24c85679229c479aa1ac">TXMPMeta&lt; tStringObj &gt;</a>
-<li>RegisterStandardAliases()
-: <a class="el" href="classTXMPMeta.html#b77cf73fa0cc63d845f113b3d1c83602">TXMPMeta&lt; tStringObj &gt;</a>
-<li>RemoveProperties()
-: <a class="el" href="classTXMPUtils.html#40c645803530662e08d042b4b7c6190d">TXMPUtils&lt; tStringObj &gt;</a>
-<li>ResolveAlias()
-: <a class="el" href="classTXMPMeta.html#c4b9c75202f2b961ad92f10a9e504e9a">TXMPMeta&lt; tStringObj &gt;</a>
-</ul>
-<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
-<li>SeparateArrayItems()
-: <a class="el" href="classTXMPUtils.html#66c5ddee47aa36ed906353f94ca18d2e">TXMPUtils&lt; tStringObj &gt;</a>
-<li>SerializeToBuffer()
-: <a class="el" href="classTXMPMeta.html#34143727d979b47a2f2209367aec9a1c">TXMPMeta&lt; tStringObj &gt;</a>
-<li>SetAbortProc()
-: <a class="el" href="classTXMPFiles.html#7b86c130fdbd54b5ac158ec3fee93777">TXMPFiles&lt; tStringObj &gt;</a>
-<li>SetArrayItem()
-: <a class="el" href="classTXMPMeta.html#1570eb89d613b4a94ca572e4644168cc">TXMPMeta&lt; tStringObj &gt;</a>
-<li>SetGlobalOptions()
-: <a class="el" href="classTXMPMeta.html#e7bb38d9b3857b08106630a386b47332">TXMPMeta&lt; tStringObj &gt;</a>
-<li>SetLocalizedText()
-: <a class="el" href="classTXMPMeta.html#f9531b949a462f5663b1f3fd99464c19">TXMPMeta&lt; tStringObj &gt;</a>
-<li>SetObjectName()
-: <a class="el" href="classTXMPMeta.html#fd059cc7cd9f906e12dab04e380e495c">TXMPMeta&lt; tStringObj &gt;</a>
-<li>SetObjectOptions()
-: <a class="el" href="classTXMPMeta.html#92055b3ae18dfd5e5491108f59318f17">TXMPMeta&lt; tStringObj &gt;</a>
-<li>SetProperty()
-: <a class="el" href="classTXMPMeta.html#1dfd6a08ebfd1a6364b3a7b6584bcc28">TXMPMeta&lt; tStringObj &gt;</a>
-<li>SetProperty_Bool()
-: <a class="el" href="classTXMPMeta.html#9521e3838272ec501ffdb60ff3eb482f">TXMPMeta&lt; tStringObj &gt;</a>
-<li>SetProperty_Date()
-: <a class="el" href="classTXMPMeta.html#eee10669445f77139d5634199ff01079">TXMPMeta&lt; tStringObj &gt;</a>
-<li>SetProperty_Float()
-: <a class="el" href="classTXMPMeta.html#3b0f2f6bae57931ea96775f03608c0ed">TXMPMeta&lt; tStringObj &gt;</a>
-<li>SetProperty_Int()
-: <a class="el" href="classTXMPMeta.html#b8ae94130d9a05c1b9a3ee25588b6421">TXMPMeta&lt; tStringObj &gt;</a>
-<li>SetProperty_Int64()
-: <a class="el" href="classTXMPMeta.html#df919aff205e934e4c8250a067f7b377">TXMPMeta&lt; tStringObj &gt;</a>
-<li>SetQualifier()
-: <a class="el" href="classTXMPMeta.html#c395e094cab251a0593d508594b21521">TXMPMeta&lt; tStringObj &gt;</a>
-<li>SetStructField()
-: <a class="el" href="classTXMPMeta.html#0e44c30e7527064909e5f7035d53c4f5">TXMPMeta&lt; tStringObj &gt;</a>
-<li>SetTimeZone()
-: <a class="el" href="classTXMPUtils.html#96bcc45febac55f6c49951815b7de2ef">TXMPUtils&lt; tStringObj &gt;</a>
-<li>Skip()
-: <a class="el" href="classTXMPIterator.html#30b4d78974b347e4fcd275f1f65a61b2">TXMPIterator&lt; tStringObj &gt;</a>
-</ul>
-<h3><a class="anchor" name="index_t">- t -</a></h3><ul>
-<li>Terminate()
-: <a class="el" href="classTXMPFiles.html#1e8de80c252b60b332dc4bc524139fd8">TXMPFiles&lt; tStringObj &gt;</a>
-, <a class="el" href="classTXMPMeta.html#6c30fae26173167958b6f0da95a53865">TXMPMeta&lt; tStringObj &gt;</a>
-<li>TXMPFiles()
-: <a class="el" href="classTXMPFiles.html#14f01e38454178578fd25fff6024fd54">TXMPFiles&lt; tStringObj &gt;</a>
-<li>TXMPIterator()
-: <a class="el" href="classTXMPIterator.html#6b2b7a3d6359aec216adf32bdf7fb140">TXMPIterator&lt; tStringObj &gt;</a>
-<li>TXMPMeta()
-: <a class="el" href="classTXMPMeta.html#21a4d06fc2e77b28991bb900f0f48e50">TXMPMeta&lt; tStringObj &gt;</a>
-</ul>
-<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
-<li>~TXMPIterator()
-: <a class="el" href="classTXMPIterator.html#911554533e8a3f09ab8870bd54462196">TXMPIterator&lt; tStringObj &gt;</a>
-<li>~TXMPMeta()
-: <a class="el" href="classTXMPMeta.html#bab5013870cd47eb0d9d701653735a02">TXMPMeta&lt; tStringObj &gt;</a>
-</ul>
-<hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:58 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/graph_legend.dot b/docs/XMPToolkit/graph_legend.dot
deleted file mode 100644
index 4a1a09c..0000000
--- a/docs/XMPToolkit/graph_legend.dot
+++ /dev/null
@@ -1,22 +0,0 @@
-digraph G
-{
- edge [fontname="FreeSans.ttf",fontsize=10,labelfontname="FreeSans.ttf",labelfontsize=10];
- node [fontname="FreeSans.ttf",fontsize=10,shape=record];
- Node9 [shape="box",label="Inherited",fontsize=10,height=0.2,width=0.4,fontname="FreeSans.ttf",fillcolor="grey75",style="filled" fontcolor="black"];
- Node10 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans.ttf"];
- Node10 [shape="box",label="PublicBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans.ttf",color="black",URL="$classPublicBase.html"];
- Node11 -> Node10 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans.ttf"];
- Node11 [shape="box",label="Truncated",fontsize=10,height=0.2,width=0.4,fontname="FreeSans.ttf",color="red",URL="$classTruncated.html"];
- Node13 -> Node9 [dir=back,color="darkgreen",fontsize=10,style="solid",fontname="FreeSans.ttf"];
- Node13 [shape="box",label="ProtectedBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans.ttf",color="black",URL="$classProtectedBase.html"];
- Node14 -> Node9 [dir=back,color="firebrick4",fontsize=10,style="solid",fontname="FreeSans.ttf"];
- Node14 [shape="box",label="PrivateBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans.ttf",color="black",URL="$classPrivateBase.html"];
- Node15 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans.ttf"];
- Node15 [shape="box",label="Undocumented",fontsize=10,height=0.2,width=0.4,fontname="FreeSans.ttf",color="grey75"];
- Node16 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans.ttf"];
- Node16 [shape="box",label="Templ< int >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans.ttf",color="black",URL="$classTempl.html"];
- Node17 -> Node16 [dir=back,color="orange",fontsize=10,style="dashed",label="< int >",fontname="FreeSans.ttf"];
- Node17 [shape="box",label="Templ< T >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans.ttf",color="black",URL="$classTempl.html"];
- Node18 -> Node9 [dir=back,color="darkorchid3",fontsize=10,style="dashed",label="m_usedClass",fontname="FreeSans.ttf"];
- Node18 [shape="box",label="Used",fontsize=10,height=0.2,width=0.4,fontname="FreeSans.ttf",color="black",URL="$classUsed.html"];
-}
diff --git a/docs/XMPToolkit/graph_legend.png b/docs/XMPToolkit/graph_legend.png
deleted file mode 100644
index 9b96937..0000000
--- a/docs/XMPToolkit/graph_legend.png
+++ /dev/null
Binary files differ
diff --git a/docs/XMPToolkit/group__Transition.html b/docs/XMPToolkit/group__Transition.html
deleted file mode 100644
index 398d5b7..0000000
--- a/docs/XMPToolkit/group__Transition.html
+++ /dev/null
@@ -1,259 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: XMP API Transition Guide</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>XMP API Transition Guide</h1><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-</table>
-This is a guide for XMP clients making the transition from the original C++ API to the revamped C++ API. The reader is assumed to be familiar with the old API, at least as far as used in the software being ported. The guide is presented as a series of old-to-new examples of typical usage. Reading the new API overview might provide background and motivation, but should not be necessary.<p>
-The new API is totally different in detail, the names of all include files, functions, types, and constants have changed. Many of the changes though are fairly cosmetic and trivial to port. In most other cases the new API should be more convenient to use. The iteration/enumeration functions are the only ones with significant visible semantic change.<p>
-This guide does not describe all of the old XMP functions, only those which have some non-trivial aspect for porting. If something is not described here, look at the old and new function signatures. They should be similar enough to make the transition obvious.<p>
-This is particularly true for the old UtilityXAP functions, they all have obvious mappings. Some of the UtilityXAP functions have been moved to <a class="el" href="classTXMPMeta.html">TXMPMeta</a>, mainly the binary get/set functions (UtilityXAP::GetBoolean has become <a class="el" href="classTXMPMeta.html#dcf8a1959a8bd42641a42cbd4d64a5b7">TXMPMeta::GetProperty_Bool</a>). Low value functions like UtilityXAP::AnalyzeStep or UtilityXAP::FilterPropPath have been removed.<p>
-<b>Classes</b><p>
-The client API is defined by 3 C++ template classes: <a class="el" href="classTXMPMeta.html">TXMPMeta</a>, <a class="el" href="classTXMPIterator.html">TXMPIterator</a>, and <a class="el" href="classTXMPUtils.html">TXMPUtils</a>. These correspond to the old MetaXAP, XAPPaths, and UtilityXAP classes. The templates are instantiated with a string class which is used for the return of UTF-8 strings. The XMP headers will declare instantiated classes with the names SXMPMeta, SXMPIterator, and SXMPUtils.<p>
-The associated string class must provide these member functions, identical to those of std::string: <div class="fragment"><pre class="fragment"> assign ( <span class="keyword">const</span> <span class="keywordtype">char</span> * str, size_t len )
- <span class="keyword">const</span> <span class="keywordtype">char</span> * c_str()
- size_t size()
-</pre></div><p>
-The result of assign does not matter, it is only used in a "void" manner.<p>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>All of the code examples below assume the templates are instantiated using std::string.</dd></dl>
-<b>Headers</b><p>
-Clients should only include XMP.hpp to access XMP, and <a class="el" href="XMP_8incl__cpp.html">XMP.incl_cpp</a> to compile the template instantiations and client-side glue. The template string class is specified by defining TXMP_STRING_TYPE before the #include of either. A simple example is: <div class="fragment"><pre class="fragment"><span class="preprocessor"> #define TXMP_STRING_TYPE std::string</span>
-<span class="preprocessor"></span><span class="preprocessor"> #include "XMP.hpp"</span>
-<span class="preprocessor"> #include "<a class="code" href="XMP_8incl__cpp.html">XMP.incl_cpp</a>"</span>
-</pre></div><p>
-<b>Basic Property Access</b><p>
-The old functions MetaXAP::get and MetaXAP::set are replaced by <a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c">TXMPMeta::GetProperty</a> and <a class="el" href="classTXMPMeta.html#1dfd6a08ebfd1a6364b3a7b6584bcc28">TXMPMeta::SetProperty</a>. The basic mapping for these is very simple.<p>
-The old way to set a simple property: <div class="fragment"><pre class="fragment"> meta.set ( XAP_NS_XAP, <span class="stringliteral">"CreatorTool"</span>, <span class="stringliteral">"Adobe Illustrator"</span> );
-</pre></div><p>
-The new way to set a simple property: <div class="fragment"><pre class="fragment"> meta.SetProperty ( <a class="code" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">kXMP_NS_XMP</a>, <span class="stringliteral">"CreatorTool"</span>, <span class="stringliteral">"Adobe Illustrator"</span> );
-</pre></div><p>
-The old way to get a simple property: <div class="fragment"><pre class="fragment"> <span class="keywordtype">bool</span> found;
- std::string value;
- XAPFeatures features;
-
- found = meta.get ( XAP_NS_XAP, <span class="stringliteral">"CreatorTool"</span>, value, features );
-</pre></div><p>
-The new way to get a simple property: <div class="fragment"><pre class="fragment"> <span class="keywordtype">bool</span> found;
- std::string value;
- <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options;
-
- found = meta.GetProperty ( <a class="code" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">kXMP_NS_XMP</a>, <span class="stringliteral">"CreatorTool"</span>, &amp;value, &amp;options );
-</pre></div><p>
-As before, you can pass XPath expressions for the second parameter to access elements of arrays or fields of structs. But there are new routines to make that easier. In addition, the new API allows you to eliminate the annoying '/*' for array items, reducing "Array/*[1]" to "Array[1]".<p>
-The options parameter returns considerably more information than the old features parameter. See the enum constants in <a class="el" href="XMP__Const_8h.html">XMP_Const.h</a> for details.<p>
-<b>Accessing Array Items</b><p>
-There are now special get/set functions for array items that take the index as an integer. This relieves you of the burden of formatting a path expression with the index as a decimal string. The examples below for the first element generalizes to any index in the obvious ways.<p>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>The old get/set functions could only be used for existing array items. The new forms can be used to insert or append new items. See also the section on <b>Creating Array Items</b>.</dd></dl>
-The old way to access the first element of an array: <div class="fragment"><pre class="fragment"> meta.set ( XAP_NS_XAP, <span class="stringliteral">"Authors/*[1]"</span>, <span class="stringliteral">"Frank Zappa"</span> );
- found = meta.get ( XAP_NS_XAP, <span class="stringliteral">"Authors/*[1]"</span>, value, features );
-</pre></div><p>
-The new way to access the first element of an array: <div class="fragment"><pre class="fragment"> meta.SetArrayItem ( <a class="code" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">kXMP_NS_XMP</a>, <span class="stringliteral">"Authors"</span>, 1, <span class="stringliteral">"Frank Zappa"</span> );
- meta.GetArrayItem ( <a class="code" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">kXMP_NS_XMP</a>, <span class="stringliteral">"Authors"</span>, 1, &amp;value, &amp;options );
-</pre></div><p>
-The old way to access the last element of an array: <div class="fragment"><pre class="fragment"> meta.set ( XAP_NS_XAP, <span class="stringliteral">"Authors/*[last()]"</span>, <span class="stringliteral">"Frank Zappa"</span> );
- found = meta.get ( XAP_NS_XAP, <span class="stringliteral">"Authors/*[last()]"</span>, value, features );
-</pre></div><p>
-The new way to access the last element of an array: <div class="fragment"><pre class="fragment"> meta.SetArrayItem ( <a class="code" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">kXMP_NS_XMP</a>, <span class="stringliteral">"Authors"</span>, kXMP_ArrayLastItem, <span class="stringliteral">"Frank Zappa"</span> );
- meta.GetArrayItem ( <a class="code" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">kXMP_NS_XMP</a>, <span class="stringliteral">"Authors"</span>, kXMP_ArrayLastItem, &amp;value, &amp;options );
-</pre></div><p>
-<b>Creating Array Items</b><p>
-The old API had rather cumbersome createFirstItem and append functions to use when adding an item to an array. The new API has a more convenient AppendArrayItem function.<p>
-The old way to create an array item, appending to the end: <div class="fragment"><pre class="fragment"> size_t count;
-
- <span class="keywordflow">try</span> {
- count = meta.count ( XAP_NS_XAP, <span class="stringliteral">"Authors/*"</span> );
- } <span class="keywordflow">catch</span> ( ... ) {
- count = 0
- }
-
- <span class="keywordflow">if</span> ( count == 0 ) {
- meta.createFirstItem ( XAP_NS_XAP, <span class="stringliteral">"Authors"</span>, <span class="stringliteral">"Frank Zappa"</span>, xap_seq );
- } <span class="keywordflow">else</span> {
- meta.append ( XAP_NS_XAP, <span class="stringliteral">"Authors/*[last()]"</span>, <span class="stringliteral">"Frank Zappa"</span> )
- }
-</pre></div><p>
-The new way to create an array item, appending to the end: <div class="fragment"><pre class="fragment"> meta.AppendArrayItem ( <a class="code" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">kXMP_NS_XMP</a>, <span class="stringliteral">"Authors"</span>, kXMP_PropArrayIsOrdered, <span class="stringliteral">"Frank Zappa"</span> );
-</pre></div><p>
-Here's how to see if an array exists or how big it is: <div class="fragment"><pre class="fragment"> <span class="keywordtype">bool</span> exists = meta.DoesPropertyExist ( <a class="code" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">kXMP_NS_XMP</a>, <span class="stringliteral">"Authors"</span> );
- size_t count = meta.CountArrayItems ( <a class="code" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">kXMP_NS_XMP</a>, <span class="stringliteral">"Authors"</span> );
-</pre></div> There are also DoesArrayItemExist and DoesStructFieldExist functions.<p>
-<b>Accessing Struct Fields</b><p>
-In the old API you accessed a field in a struct by writing an XPath expression of the general form "Struct/ns:Field". This has the subtle drawback that you must use the namespace prefix in the XPath expression. But prefixes are not guaranteed! The new API has functions that take the namespace URI.<p>
-The old way to access a field in a struct: <div class="fragment"><pre class="fragment"> meta.set ( XAP_NS_XAP_T_PG, <span class="stringliteral">"MaxPageSize/stDim:unit"</span>, <span class="stringliteral">"inch"</span> );
- found = meta.get ( XAP_NS_XAP_T_PG, <span class="stringliteral">"MaxPageSize/stDim:unit"</span>, value, features );
-</pre></div><p>
-The new way to access a field in a struct: <div class="fragment"><pre class="fragment"> meta.SetStructField ( XAP_NS_XAP_T_PG, <span class="stringliteral">"MaxPageSize"</span>, kXMP_NS_ST_Dim, <span class="stringliteral">"unit"</span> <span class="stringliteral">"inch"</span> );
- found = meta.GetStructField ( XAP_NS_XAP_T_PG, <span class="stringliteral">"MaxPageSize"</span>, kXMP_NS_ST_Dim, <span class="stringliteral">"unit"</span>, &amp;value, &amp;options );
-</pre></div><p>
-<b>Accessing Composite Data Structures</b><p>
-The old API forced you to write full XPath expressions for composite data structures with arrays or structs nested inside each other. This forced you to know the XPath syntax, and suffer the risks of using namespace prefixes for struct fields. The new API has path composition functions in XMPUtils to avoid both of these problems. You can compose the entire path then call Get/SetProperty, or compose all but the last portion then use Get/SetArrayItem or Get/SetStructField.<p>
-The examples here only show ComposeArrayItemPath, ComposeStructFieldPath is an obvious analog.<p>
-The old way to access a struct field within an array item: <div class="fragment"><pre class="fragment"> found = meta.get ( XAP_NS_XAP, <span class="stringliteral">"Thumbnails/*[1]/xapGImg:format"</span>, value, features );
-</pre></div><p>
-The new way to access a struct field within an array item: <div class="fragment"><pre class="fragment"> std::string itemPath;
-
- XMPUtils::ComposeArrayItemPath ( <a class="code" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">kXMP_NS_XMP</a>, <span class="stringliteral">"Thumbnails"</span>, 1, &amp;itemPath );
- found = meta.GetStructField ( <a class="code" href="XMP__Const_8h.html#030875c9dc0861c9251a3374ca14a376">kXMP_NS_XMP</a>, itemPath.c_str(),
- kXMP_NS_XMP_G_IMG, <span class="stringliteral">"format"</span>, &amp;value, &amp;options );
-</pre></div><p>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>As in the old API, the outermost, or "schema", namespace is the first parameter to all functions that manipulate properties. Even if the second parameter is a complex path expression.</dd></dl>
-<b>Parsing and Serializing</b><p>
-The new API has the same construct-and-parse capability as the old API. This parses one buffer that must be a complete collection of XMP. Parsing multiple buffers where you do the I/O is similar to before, differing mainly in a reversal of the "I'm done" signal.<p>
-The old way to read and parse: <div class="fragment"><pre class="fragment"> MetaXAP meta;
- <span class="keywordtype">char</span> buffer [...];
- size_t length;
-
- <span class="keywordflow">while</span> ( <span class="keyword">true</span> ) {
- -- read into buffer, setting length
- <span class="keywordflow">if</span> ( length != 0 ) <span class="keywordflow">break</span>;
- meta.parse ( buffer, length );
- }
- meta.parse ( buffer, 0, <span class="keyword">true</span> );
-</pre></div><p>
-The new way to read and parse: <div class="fragment"><pre class="fragment"> SXMPMeta meta ( 0, 0 );
- <span class="keywordtype">char</span> buffer [...];
- size_t length;
-
- <span class="keywordflow">while</span> ( <span class="keyword">true</span> ) {
- -- read into buffer, setting length
- <span class="keywordflow">if</span> ( length != 0 ) <span class="keywordflow">break</span>;
- meta.ParseFromBuffer ( buffer, length, kXMP_ParseMoreBuffers );
- }
- meta.ParseFromBuffer ( buffer, 0 );
-</pre></div><p>
-Serialization in the old API was a multi-step process. You used MetaXAP::serialize to generate a hidden serialization, then used MetaXAP::extractSerialization to extract that, then used UtilityXAP::CreateXMLPacket to get the XMP packet wrapping. The New API combines all of this into <a class="el" href="classTXMPMeta.html#2774a6f15ae22f0002201b58c46bfb49">TXMPMeta::SerializeToBuffer</a>.<p>
-The old way to write a serialized packet: <div class="fragment"><pre class="fragment"> size_t rdfLength = meta.serialize();
- std::string header, trailer;
- <span class="keywordtype">char</span> buffer [...];
-
- UtilityXAP::CreateXMLPacket ( <span class="stringliteral">""</span>, <span class="keyword">true</span>, 4096, <span class="stringliteral">"\n"</span>, header, trailer );
- -- write the header string
- <span class="keywordflow">while</span> ( rdfLength &gt; <span class="keyword">sizeof</span>(buffer) ) {
- meta.extractSerialization ( buffer, <span class="keyword">sizeof</span>(buffer) );
- -- write <span class="keyword">this</span> buffer
- rdfLength -= <span class="keyword">sizeof</span>(buffer);
- }
- meta.extractSerialization ( buffer, rdfLength );
- -- write <span class="keyword">this</span> buffer (only rdfLength bytes)
- -- write the trailer string
-</pre></div><p>
-The new way to write a serialized packet: <div class="fragment"><pre class="fragment"> std::string packet;
-
- meta.SerializeToBuffer ( &amp;packet );
- -- write the packet string
-</pre></div><p>
-<b>Iteration</b><p>
-The functions to iterate over the XMP data tree have not changed a lot at first glance, but the way they operate has changed considerably.<p>
-The old API essentially offered two ways to do an iteration: <ul>
-<li>One call to generate a list of all leaf nodes </li>
-<li>Program your own full traversal, recursively one level at a time</li>
-</ul>
-The new API performs a typical depth first traversal, visiting every node by default, with options to omit certain classes of nodes. Instead of mapping old patterns to new, it might make more sense to just use the new API and understand what it will return. It will also help to review the XMP data model, first documented in the November 2003 version of the XMP Specification. Pay attention to the option bits returned during iteration, they tell you what kind of node you're visiting.<p>
-Simple, default iteration code in the new API: <div class="fragment"><pre class="fragment"> std::string str1, str2, str3;
- <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> options;
-
- SXMPIterator iter ( meta );
- <span class="keywordflow">while</span> ( iter.Next ( &amp;str1, &amp;str2, &amp;str3, &amp;options ) ) {
- fprintf ( log, <span class="stringliteral">" %s %s = \"%s\", 0x%X\n"</span>,
- str1.c_str(), str2.c_str(), str3.c_str(), options );
- }
-</pre></div><p>
-For this RDF input: <div class="fragment"><pre class="fragment"> &lt;rdf:RDF xmlns:rdf='http:<span class="comment">//www.w3.org/1999/02/22-rdf-syntax-ns#'&gt;</span>
- &lt;rdf:Description rdf:about='' xmlns:ns1='ns:test1/' xmlns:ns2='ns:test2/'&gt;
-
- &lt;ns1:SimpleProp1&gt;Simple1 value&lt;/ns1:SimpleProp1&gt;
- &lt;ns1:SimpleProp2 xml:lang='x-<span class="keywordflow">default</span>'&gt;Simple2 value&lt;/ns1:SimpleProp2&gt;
-
- &lt;ns1:ArrayProp1&gt;
- &lt;rdf:Bag&gt;
- &lt;rdf:li&gt;Item1.1 value&lt;/rdf:li&gt;
- &lt;rdf:li&gt;Item1.2 value&lt;/rdf:li&gt;
- &lt;/rdf:Bag&gt;
- &lt;/ns1:ArrayProp1&gt;
-
- &lt;ns1:ArrayProp2&gt;
- &lt;rdf:Alt&gt;
- &lt;rdf:li xml:lang='x-one'&gt;Item2.1 value&lt;/rdf:li&gt;
- &lt;rdf:li xml:lang='x-two'&gt;Item2.2 value&lt;/rdf:li&gt;
- &lt;/rdf:Alt&gt;
- &lt;/ns1:ArrayProp2&gt;
-
- &lt;ns1:StructProp rdf:parseType='Resource'&gt;
- &lt;ns2:Field1&gt;Field1 value&lt;/ns2:Field1&gt;
- &lt;ns2:Field2&gt;Field2 value&lt;/ns2:Field2&gt;
- &lt;/ns1:StructProp&gt;
-
- &lt;ns1:QualProp1 rdf:parseType='Resource'&gt;
- &lt;rdf:value&gt;Prop value&lt;/rdf:value&gt;
- &lt;ns2:Qual&gt;Qual value&lt;/ns2:Qual&gt;
- &lt;/ns1:QualProp1&gt;
-
- &lt;ns1:QualProp2 rdf:parseType='Resource'&gt;
- &lt;rdf:value xml:lang='x-<span class="keywordflow">default</span>'&gt;Prop value&lt;/rdf:value&gt;
- &lt;ns2:Qual&gt;Qual value&lt;/ns2:Qual&gt;
- &lt;/ns1:QualProp2&gt;
-
- &lt;ns1:NestedStructProp rdf:parseType='Resource'&gt;
- &lt;ns2:Outer rdf:parseType='Resource'&gt;
- &lt;ns2:Middle rdf:parseType='Resource'&gt;
- &lt;ns2:Inner rdf:parseType='Resource'&gt;
- &lt;ns2:Field1&gt;Field1 value&lt;/ns2:Field1&gt;
- &lt;ns2:Field2&gt;Field2 value&lt;/ns2:Field2&gt;
- &lt;/ns2:Inner&gt;
- &lt;/ns2:Middle&gt;
- &lt;/ns2:Outer&gt;
- &lt;/ns1:NestedStructProp&gt;
-
- &lt;/rdf:Description&gt;
- &lt;/rdf:RDF&gt;
-</pre></div><p>
-The iteration shown above would print (spacing added by hand for legibility): <div class="fragment"><pre class="fragment"> ns:test1/ = <span class="stringliteral">""</span>, 0x80000000
-
- ns:test1/ SimpleProp1 = <span class="stringliteral">"Simple1 value"</span>, 0x0
-
- ns:test1/ SimpleProp2 = <span class="stringliteral">"Simple2 value"</span>, 0x50
- ns:test1/ SimpleProp2/?xml:lang = <span class="stringliteral">"x-default"</span>, 0x20
-
- ns:test1/ ArrayProp1 = <span class="stringliteral">""</span>, 0x200
- ns:test1/ ArrayProp1[1] = <span class="stringliteral">"Item1.1 value"</span>, 0x0
- ns:test1/ ArrayProp1[2] = <span class="stringliteral">"Item1.2 value"</span>, 0x0
-
- ns:test1/ ArrayProp2 = <span class="stringliteral">""</span>, 0xE00
- ns:test1/ ArrayProp2[1] = <span class="stringliteral">"Item2.1 value"</span>, 0x50
- ns:test1/ ArrayProp2[1]/?xml:lang = <span class="stringliteral">"x-one"</span>, 0x20
- ns:test1/ ArrayProp2[2] = <span class="stringliteral">"Item2.2 value"</span>, 0x50
- ns:test1/ ArrayProp2[2]/?xml:lang = <span class="stringliteral">"x-two"</span>, 0x20
-
- ns:test1/ StructProp = <span class="stringliteral">""</span>, 0x100
- ns:test1/ StructProp/ns2:Field1 = <span class="stringliteral">"Field1 value"</span>, 0x0
- ns:test1/ StructProp/ns2:Field2 = <span class="stringliteral">"Field2 value"</span>, 0x0
-
- ns:test1/ QualProp1 = <span class="stringliteral">"Prop value"</span>, 0x10
- ns:test1/ QualProp1/?ns2:Qual = <span class="stringliteral">"Qual value"</span>, 0x20
-
- ns:test1/ QualProp2 = <span class="stringliteral">"Prop value"</span>, 0x50
- ns:test1/ QualProp2/?xml:lang = <span class="stringliteral">"x-default"</span>, 0x20
- ns:test1/ QualProp2/?ns2:Qual = <span class="stringliteral">"Qual value"</span>, 0x20
-
- ns:test1/ NestedStructProp = <span class="stringliteral">""</span>, 0x100
- ns:test1/ NestedStructProp/ns2:Outer = <span class="stringliteral">""</span>, 0x100
- ns:test1/ NestedStructProp/ns2:Outer/ns2:Middle = <span class="stringliteral">""</span>, 0x100
- ns:test1/ NestedStructProp/ns2:Outer/ns2:Middle/ns2:Inner = <span class="stringliteral">""</span>, 0x100
- ns:test1/ NestedStructProp/ns2:Outer/ns2:Middle/ns2:Inner/ns2:Field1 = <span class="stringliteral">"Field1 value"</span>, 0x0
- ns:test1/ NestedStructProp/ns2:Outer/ns2:Middle/ns2:Inner/ns2:Field2 = <span class="stringliteral">"Field2 value"</span>, 0x0
-</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:58 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/index.html b/docs/XMPToolkit/index.html
deleted file mode 100644
index 492a6ce..0000000
--- a/docs/XMPToolkit/index.html
+++ /dev/null
@@ -1,112 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: Overview XMP Toolkit Overview</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li id="current"><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>Overview XMP Toolkit Overview</h1>
-<p>
-<h2><a class="anchor" name="intro-sec">
-This XMP Toolkit Release</a></h2>
-This release provides the following features: <ul>
-<li>Improved, simpler API. If you need to port code from a previous version, see the <a class="el" href="group__Transition.html">XMP API Transition Guide</a> (under Modules). </li>
-<li>Updates to make the code compatible with Adobe Acrobat 7 and Adobe Creative Suite 2. </li>
-<li>Improved performance, in some cases significantly improved. </li>
-<li>Code cleanup that makes the source more readable and easier to maintain. </li>
-<li>Single source with UNIX-style newlines; this version works in all operating systems </li>
-<li>Improved namespace handling. </li>
-<li>Numerous bug fixes.</li>
-</ul>
-<h2><a class="anchor" name="first-sec">
-General Overview of the XMP API and Internal Architecture.</a></h2>
-The client view of the XMP API is provided through three C++ class templates: <ul>
-<li><code><a class="el" href="classTXMPMeta.html">TXMPMeta</a></code> provides the fundamental methods for manipulating XMP metadata. </li>
-<li><code><a class="el" href="classTXMPIterator.html">TXMPIterator</a></code> provides methods to iterate over existing XMP metadata. </li>
-<li><code><a class="el" href="classTXMPUtils.html">TXMPUtils</a></code> provides additional utilities layered on top of <code><a class="el" href="classTXMPMeta.html">TXMPMeta</a></code>. Use a string class to instantiate the templates; you can use <code>std::string</code>. The string class is a template parameter, which simplifies its use for clients that have an existing string model different from <code>std::string</code>.</li>
-</ul>
-Developers should understand the XMP data model before working with the XMP Toolkit. The data model is documented in chapter 2 of the XMP Specification. The XMPCoverage sample provides an in-depth illustration of the use of the XMP Toolkit.<p>
-<dl class="note" compact><dt><b>Note:</b></dt><dd>Earlier versions of the Adobe XMP Toolkit had a different API and implementation. See the <a class="el" href="group__Transition.html">XMP API Transition Guide</a> page for information about adapting to the new API.</dd></dl>
-The XMP Toolkit is implemented in three layers, which isolate the return of string values, synchronization for multi-threaded use, and exception propagation. While the SDK as provided from Adobe builds a static library, this layering can easily be adapted to build a DLL. <ul>
-<li>The top layer is the implementation of the client template classes. This layer is for copying string results and releasing the threading lock if necessary. </li>
-<li>The middle layer consists of the three classes <code>WXMPMeta</code>, <code>WXMPIterator</code>, and <code>WXMPUtils</code>. They provide wrappers between the top client layer and the actual implementation. The middle layer is responsible for acquiring the threading lock, basic parameter checking, catching propagated exceptions, and releasing the threading lock when appropriate. </li>
-<li>The inner layer is the actual implementation, contained in the three classes <code>XMPMeta</code>, <code>XMPIterator</code>, and <code>XMPUtils</code>.</li>
-</ul>
-<h2><a class="anchor" name="second-sec">
-Use of the XMP API</a></h2>
-Client code obtains access to the XMP API by including a single header, XMP.hpp. You should read the template header files, <a class="el" href="TXMPMeta_8hpp.html">TXMPMeta.hpp</a>, and so on, for detailed information, but do not #include them. You should also read <a class="el" href="XMP__Const_8h.html">XMP_Const.h</a> for detailed information about types and constants for namespace URIs and option flags. The client templates are instantiated by including <a class="el" href="XMP_8incl__cpp.html">XMP.incl_cpp</a> in exactly one source file. The macro <code>TXMP_STRING_TYPE</code> must be defined first to provide the string class.<p>
-The string class used to instantiate the templates must have the following member functions, which match those of <code>std::string:</code> <div class="fragment"><pre class="fragment"> assign ( <span class="keyword">const</span> <span class="keywordtype">char</span> * str, size_t len )
- size_t size() const
- const <span class="keywordtype">char</span> * c_str() const
-</pre></div> The result type of <code>assign</code> does not matter, it is always ignored.<p>
-Use of the XMP Toolkit is reasonably straightforward once you understand the XMP data model. Some tips to keep in mind:<p>
-<ul>
-<li>All strings passed as parameters must be UTF-8. </li>
-<li>All strings returned will be UTF-8. </li>
-<li>Register private namespaces before use. </li>
-<li>Don't depend on specific namespace prefixes. Don't hardwire the prefixes for struct fields, use functions like <code>Get/SetStructField</code> or <code>ComposeStructFieldPath</code>. </li>
-<li>Use the path composition functions for complex paths with nested structs or arrays. </li>
-<li>Use <code>Get/SetLocalizedText</code> when dealing with language alternative (alt-text) arrays.</li>
-</ul>
-<h3><a class="anchor" name="callchain">
-Implementation Call Chain</a></h3>
-The implementation of <code>GetProperty</code> provides a good illustration of the toolkit layering. The declaration below for <code><a class="el" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c">TXMPMeta::GetProperty</a></code> is simplified by hardwiring <code>std::string</code>. The <code>XMP_StringPtr</code> type is simply <code>const char *</code>.<p>
-<div class="fragment"><pre class="fragment"> <span class="keywordtype">bool</span> <a class="code" href="classTXMPMeta.html#06a3241c7fa5df87f61dff02fca23a0c">TXMPMeta::GetProperty</a> ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
- <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
- std::string * propValue,
- <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * options )<span class="keyword"> const</span>
-<span class="keyword"> </span>{
- <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> resultPtr = 0;
- <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> resultLen = 0;
-
- <span class="keywordtype">bool</span> found = this-&gt;xmpObj.GetProperty ( schemaNS, propName,
- &amp;resultPtr, &amp;resultLen, options );
-
- <span class="keywordflow">if</span> ( found ) {
- <span class="keywordflow">if</span> ( propValue != 0 ) propValue-&gt;assign ( resultPtr, resultLen );
- this-&gt;xmpObj.UnlockObject ( kXMP_NoOptions );
- }
- <span class="keywordflow">return</span> found;
-
- }
-</pre></div><p>
-The template object contains a data member pointer to the underlying <code>WXMPMeta</code> object. This is used to dispatch the call to the middle layer. The actual implementation of the XMP toolkit returns string values as a pointer and length, the pointer references private internal storage of the toolkit. The client code copies the string value to the client's string object. This minimizes the amount of string copying, and should the XMP toolkit be built as a DLL ensures that any memory allocation for the client's value is done on the client side. The call to <code>WXMPMeta::UnlockObject</code> is explained below.<p>
-<div class="fragment"><pre class="fragment"> <span class="keywordtype">bool</span> WXMPMeta::GetProperty ( <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> schemaNS,
- <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> propName,
- <a class="code" href="XMP__Const_8h.html#d439e3ceeb4590d310f6125aa12c6df6">XMP_StringPtr</a> * propValue,
- <a class="code" href="XMP__Const_8h.html#9f7dcc184f901c713274edfdac5bcc9a">XMP_StringLen</a> * valueSize,
- <a class="code" href="XMP__Const_8h.html#eb865118433be92d88e5f49ed11487c8">XMP_OptionBits</a> * options )<span class="keyword"> const</span>
-<span class="keyword"> </span>{
- XMP_Bool found;
- XMP_ENTER_WRAPPER ( <span class="stringliteral">"WXMPMeta::GetProperty"</span> )
-
- if ( (schemaNS == 0) || (*schemaNS == 0) ) {
- XMP_Throw ( <span class="stringliteral">"Empty schema namespace URI"</span>, kXMPErr_BadSchema );
- }
- <span class="keywordflow">if</span> ( (propName == 0) || (*propName == 0) ) {
- XMP_Throw ( <span class="stringliteral">"Empty property name"</span>, kXMPErr_BadXPath );
- }
-
- <span class="keywordflow">if</span> ( propValue == 0 ) propValue = &amp;voidStringPtr;
- <span class="keywordflow">if</span> ( valueSize == 0 ) valueSize = &amp;voidStringLen;
- <span class="keywordflow">if</span> ( options == 0 ) options = &amp;voidOptionBits;
-
- <span class="keyword">const</span> XMPMeta &amp; meta = WtoXMPMeta_Ref ( *<span class="keyword">this</span> );
- found = meta.GetProperty ( schemaNS, propName, propValue, valueSize, options );
-
- XMP_EXIT_WRAPPER_KEEP_LOCK ( found )
- return found;
- }
-</pre></div><p>
-The entry and exit macros in the <code>WXMPMeta</code> layer acquire the threading lock on entry and usually release it on exit. The lock is kept on exit whenever a string value is returned. Since a pointer to internal data is returned, the threading lock can't be released until after the template code in the client copies the string. The entry and exit macros also prevent uncontrolled exception propagation from the lower layer back to the client. This is not critical for use of the XMP Toolkit as a static library. But it is generally not safe to propagate C++ exceptions across DLL boundaries. <hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:57 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/modules.html b/docs/XMPToolkit/modules.html
deleted file mode 100644
index 8054bd0..0000000
--- a/docs/XMPToolkit/modules.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: Module Index</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li id="current"><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<h1>Adobe XMP Toolkit Modules</h1>Here is a list of all modules:<ul>
-<li><a class="el" href="group__Transition.html">XMP API Transition Guide</a>
-</ul>
-<hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:58 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/structXMP__DateTime-members.html b/docs/XMPToolkit/structXMP__DateTime-members.html
deleted file mode 100644
index b12b74d..0000000
--- a/docs/XMPToolkit/structXMP__DateTime-members.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul></div>
-<h1>XMP_DateTime Member List</h1>This is the complete list of members for <a class="el" href="structXMP__DateTime.html">XMP_DateTime</a>, including all inherited members.<p><table>
-</table><hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:59 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/docs/XMPToolkit/structXMP__DateTime.html b/docs/XMPToolkit/structXMP__DateTime.html
deleted file mode 100644
index 4ff3fb3..0000000
--- a/docs/XMPToolkit/structXMP__DateTime.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Adobe XMP Toolkit: XMP_DateTime Struct Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.1 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul></div>
-<h1>XMP_DateTime Struct Reference</h1><!-- doxytag: class="XMP_DateTime" -->The expanded type for a date and time. Dates and time in the serialized XMP are ISO 8601 strings. The <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> struct allows easy conversion with other formats.
-<a href="#_details">More...</a>
-<p>
-<code>#include &lt;<a class="el" href="XMP__Const_8h-source.html">XMP_Const.h</a>&gt;</code>
-<p>
-<a href="structXMP__DateTime-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-The expanded type for a date and time. Dates and time in the serialized XMP are ISO 8601 strings. The <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> struct allows easy conversion with other formats.
-<p>
-All of the fields are 32 bit, even though most could be 8 bit. This avoids overflow when doing carries for arithmetic or normalization. All fields have signed values for the same reasons.<p>
-The fields of the <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> struct are:<p>
-<ul>
-<li>year- The year, can be negative. </li>
-<li>month - The month in the range 1..12. </li>
-<li>day - The day of the month in the range 1..31. </li>
-<li>hour - The hour in the range 0..23. </li>
-<li>minute - The minute in the range 0..59. </li>
-<li>second - The second in the range 0..59. </li>
-<li>tzSign - The "sign" of the time zone, 0 means UTC, -1 is west, +1 is east. </li>
-<li>tzHour - The time zone hour in the range 0..23. </li>
-<li>tzMinute - The time zone minute in the range 0..59. </li>
-<li>nanoSecond - Nanoseconds within a second, often left as zero.</li>
-</ul>
-Constants for the <code>tzSign</code> are:<p>
-<ul>
-<li><code>kXMP_TimeIsUTC</code> - The time is UTC. </li>
-<li><code>kXMP_TimeWestOfUTC</code> - The time zone is west of UTC, behind in time. </li>
-<li><code>kXMP_TimeEastOfUTC</code> - The time zone is east of UTC, ahead in time.</li>
-</ul>
-DateTime values are occasionally used in cases with only a date or only a time component. A date without a time has zeros in the <code><a class="el" href="structXMP__DateTime.html">XMP_DateTime</a></code> struct for all time fields. A time without a date has zeros for all date fields (year, month, and day).
-<p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="XMP__Const_8h-source.html">XMP_Const.h</a></ul>
-<hr size="1"><address style="align: right;"><small>Generated on Thu May 3 14:54:59 2007 for Adobe XMP Toolkit by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
-</body>
-</html>
diff --git a/java/XMPCore/docs/allclasses-frame.html b/java/XMPCore/docs/allclasses-frame.html
index e9f6291..ec35886 100644
--- a/java/XMPCore/docs/allclasses-frame.html
+++ b/java/XMPCore/docs/allclasses-frame.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
All Classes
</TITLE>
diff --git a/java/XMPCore/docs/allclasses-noframe.html b/java/XMPCore/docs/allclasses-noframe.html
index 9fedde7..097e729 100644
--- a/java/XMPCore/docs/allclasses-noframe.html
+++ b/java/XMPCore/docs/allclasses-noframe.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
All Classes
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/XMPConst.html b/java/XMPCore/docs/com/adobe/xmp/XMPConst.html
index 690c54e..618cde1 100644
--- a/java/XMPCore/docs/com/adobe/xmp/XMPConst.html
+++ b/java/XMPCore/docs/com/adobe/xmp/XMPConst.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:49 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
XMPConst
</TITLE>
@@ -164,6 +164,14 @@ Common constants for the XMP Toolkit.
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>static&nbsp;java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../com/adobe/xmp/XMPConst.html#NS_CREATOR_ATOM">NS_CREATOR_ATOM</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static&nbsp;java.lang.String</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../com/adobe/xmp/XMPConst.html#NS_DC">NS_DC</A></B></CODE>
<BR>
@@ -428,6 +436,22 @@ Common constants for the XMP Toolkit.
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>static&nbsp;java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../com/adobe/xmp/XMPConst.html#TAG_XAPMETA">TAG_XAPMETA</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMP meta tag version old</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static&nbsp;java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../com/adobe/xmp/XMPConst.html#TAG_XMPMETA">TAG_XMPMETA</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMP meta tag version new</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static&nbsp;java.lang.String</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../com/adobe/xmp/XMPConst.html#TRUESTR">TRUESTR</A></B></CODE>
<BR>
@@ -545,6 +569,14 @@ Common constants for the XMP Toolkit.
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xml:lang qualfifier</TD>
</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static&nbsp;java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../com/adobe/xmp/XMPConst.html#XMP_PI">XMP_PI</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Processing Instruction (PI) for xmp packet</TD>
+</TR>
</TABLE>
&nbsp;
<P>
@@ -891,6 +923,16 @@ static final java.lang.String <B>NS_ADOBESTOCKPHOTO</B></PRE>
</DL>
<HR>
+<A NAME="NS_CREATOR_ATOM"><!-- --></A><H3>
+NS_CREATOR_ATOM</H3>
+<PRE>
+static final java.lang.String <B>NS_CREATOR_ATOM</B></PRE>
+<DL>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#com.adobe.xmp.XMPConst.NS_CREATOR_ATOM">Constant Field Values</A></DL>
+</DL>
+<HR>
+
<A NAME="NS_ASF"><!-- --></A><H3>
NS_ASF</H3>
<PRE>
@@ -931,6 +973,18 @@ static final java.lang.String <B>NS_TRANSIENT</B></PRE>
</DL>
<HR>
+<A NAME="NS_DC_DEPRECATED"><!-- --></A><H3>
+NS_DC_DEPRECATED</H3>
+<PRE>
+static final java.lang.String <B>NS_DC_DEPRECATED</B></PRE>
+<DL>
+<DD>legaciy dublin core NS, will be converted to NS_DC
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#com.adobe.xmp.XMPConst.NS_DC_DEPRECATED">Constant Field Values</A></DL>
+</DL>
+<HR>
+
<A NAME="TYPE_IDENTIFIERQUAL"><!-- --></A><H3>
TYPE_IDENTIFIERQUAL</H3>
<PRE>
@@ -1151,15 +1205,39 @@ static final java.lang.String <B>RDF_TYPE</B></PRE>
</DL>
<HR>
-<A NAME="NS_DC_DEPRECATED"><!-- --></A><H3>
-NS_DC_DEPRECATED</H3>
+<A NAME="XMP_PI"><!-- --></A><H3>
+XMP_PI</H3>
<PRE>
-static final java.lang.String <B>NS_DC_DEPRECATED</B></PRE>
+static final java.lang.String <B>XMP_PI</B></PRE>
<DL>
-<DD>legaciy dublin core NS, will be converted to NS_DC
+<DD>Processing Instruction (PI) for xmp packet
<P>
<DL>
-<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#com.adobe.xmp.XMPConst.NS_DC_DEPRECATED">Constant Field Values</A></DL>
+<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#com.adobe.xmp.XMPConst.XMP_PI">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="TAG_XMPMETA"><!-- --></A><H3>
+TAG_XMPMETA</H3>
+<PRE>
+static final java.lang.String <B>TAG_XMPMETA</B></PRE>
+<DL>
+<DD>XMP meta tag version new
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#com.adobe.xmp.XMPConst.TAG_XMPMETA">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="TAG_XAPMETA"><!-- --></A><H3>
+TAG_XAPMETA</H3>
+<PRE>
+static final java.lang.String <B>TAG_XAPMETA</B></PRE>
+<DL>
+<DD>XMP meta tag version old
+<P>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#com.adobe.xmp.XMPConst.TAG_XAPMETA">Constant Field Values</A></DL>
</DL>
<!-- ========= END OF CLASS DATA ========= -->
<HR>
diff --git a/java/XMPCore/docs/com/adobe/xmp/XMPDateTime.html b/java/XMPCore/docs/com/adobe/xmp/XMPDateTime.html
index 8c89d97..98a8949 100644
--- a/java/XMPCore/docs/com/adobe/xmp/XMPDateTime.html
+++ b/java/XMPCore/docs/com/adobe/xmp/XMPDateTime.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:49 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
XMPDateTime
</TITLE>
@@ -540,7 +540,9 @@ java.util.Calendar <B>getCalendar</B>()</PRE>
</DD>
<DD><DL>
-<DT><B>Returns:</B><DD>Returns a calendar (only with milli second precision).</DL>
+<DT><B>Returns:</B><DD>Returns a <code>Calendar</code> (only with milli second precision). <br>
+ <em>Note:</em> the dates before Oct 15th 1585 (which normally fall into validity of
+ the Julian calendar) are also rendered internally as Gregorian dates.</DL>
</DD>
</DL>
<HR>
diff --git a/java/XMPCore/docs/com/adobe/xmp/XMPDateTimeFactory.html b/java/XMPCore/docs/com/adobe/xmp/XMPDateTimeFactory.html
index ba3b8ee..235e148 100644
--- a/java/XMPCore/docs/com/adobe/xmp/XMPDateTimeFactory.html
+++ b/java/XMPCore/docs/com/adobe/xmp/XMPDateTimeFactory.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:49 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
XMPDateTimeFactory
</TITLE>
@@ -233,7 +233,8 @@ public static <A HREF="../../../com/adobe/xmp/XMPDateTime.html" title="interface
<DD>Creates an <code>XMPDateTime</code>-object from initial values.
<P>
<DD><DL>
-<DT><B>Parameters:</B><DD><CODE>year</CODE> - years<DD><CODE>month</CODE> - months<DD><CODE>day</CODE> - days<DD><CODE>hour</CODE> - hours<DD><CODE>minute</CODE> - minutes<DD><CODE>second</CODE> - seconds<DD><CODE>nanoSecond</CODE> - nanoseconds
+<DT><B>Parameters:</B><DD><CODE>year</CODE> - years<DD><CODE>month</CODE> - months from 1 to 12<br>
+ <em>Note:</em> Remember that the month in <CODE>Calendar</CODE> is defined from 0 to 11.<DD><CODE>day</CODE> - days<DD><CODE>hour</CODE> - hours<DD><CODE>minute</CODE> - minutes<DD><CODE>second</CODE> - seconds<DD><CODE>nanoSecond</CODE> - nanoseconds
<DT><B>Returns:</B><DD>Returns an <code>XMPDateTime</code>-object.</DL>
</DD>
</DL>
diff --git a/java/XMPCore/docs/com/adobe/xmp/XMPError.html b/java/XMPCore/docs/com/adobe/xmp/XMPError.html
index 9cabd0d..bbaa859 100644
--- a/java/XMPCore/docs/com/adobe/xmp/XMPError.html
+++ b/java/XMPCore/docs/com/adobe/xmp/XMPError.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:49 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
XMPError
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/XMPException.html b/java/XMPCore/docs/com/adobe/xmp/XMPException.html
index d2c4f13..e540322 100644
--- a/java/XMPCore/docs/com/adobe/xmp/XMPException.html
+++ b/java/XMPCore/docs/com/adobe/xmp/XMPException.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:49 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
XMPException
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/XMPIterator.html b/java/XMPCore/docs/com/adobe/xmp/XMPIterator.html
index 8231e93..66fd9cb 100644
--- a/java/XMPCore/docs/com/adobe/xmp/XMPIterator.html
+++ b/java/XMPCore/docs/com/adobe/xmp/XMPIterator.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:49 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
XMPIterator
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/XMPMeta.html b/java/XMPCore/docs/com/adobe/xmp/XMPMeta.html
index 4c800af..e69ff24 100644
--- a/java/XMPCore/docs/com/adobe/xmp/XMPMeta.html
+++ b/java/XMPCore/docs/com/adobe/xmp/XMPMeta.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:49 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
XMPMeta
</TITLE>
@@ -281,6 +281,14 @@ This class represents the set of XMP metadata as a DOM representation. It has me
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../com/adobe/xmp/XMPMeta.html#getPacketHeader()">getPacketHeader</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;<A HREF="../../../com/adobe/xmp/properties/XMPProperty.html" title="interface in com.adobe.xmp.properties">XMPProperty</A></CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../com/adobe/xmp/XMPMeta.html#getProperty(java.lang.String, java.lang.String)">getProperty</A></B>(java.lang.String&nbsp;schemaNS,
java.lang.String&nbsp;propName)</CODE>
@@ -2179,6 +2187,25 @@ void <B>setObjectName</B>(java.lang.String&nbsp;name)</PRE>
</DL>
<HR>
+<A NAME="getPacketHeader()"><!-- --></A><H3>
+getPacketHeader</H3>
+<PRE>
+java.lang.String <B>getPacketHeader</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+
+<DT><B>Returns:</B><DD>Returns the unparsed content of the &lt;?xpacket&gt; processing instruction.
+ This contains normally the attribute-like elements 'begin="&lt;BOM&gt;"
+ id="W5M0MpCehiHzreSzNTczkc9d"' and possibly the deprecated elements 'bytes="1234"' or
+ 'encoding="XXX"'. If the parsed packet has not been wrapped into an xpacket,
+ <code>null</code> is returned.</DL>
+</DD>
+</DL>
+<HR>
+
<A NAME="clone()"><!-- --></A><H3>
clone</H3>
<PRE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/XMPMetaFactory.html b/java/XMPCore/docs/com/adobe/xmp/XMPMetaFactory.html
index 6dbe0aa..c4f1d83 100644
--- a/java/XMPCore/docs/com/adobe/xmp/XMPMetaFactory.html
+++ b/java/XMPCore/docs/com/adobe/xmp/XMPMetaFactory.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
XMPMetaFactory
</TITLE>
@@ -498,7 +498,8 @@ getVersionInfo</H3>
<PRE>
public static <A HREF="../../../com/adobe/xmp/XMPVersionInfo.html" title="interface in com.adobe.xmp">XMPVersionInfo</A> <B>getVersionInfo</B>()</PRE>
<DL>
-<DD>Obtain version information.
+<DD>Obtain version information. The XMPVersionInfo singleton is created the first time
+ its requested.
<P>
<DD><DL>
diff --git a/java/XMPCore/docs/com/adobe/xmp/XMPPathFactory.html b/java/XMPCore/docs/com/adobe/xmp/XMPPathFactory.html
index b58ed92..f812be6 100644
--- a/java/XMPCore/docs/com/adobe/xmp/XMPPathFactory.html
+++ b/java/XMPCore/docs/com/adobe/xmp/XMPPathFactory.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
XMPPathFactory
</TITLE>
@@ -232,7 +232,8 @@ Utility services for the metadata object. It has only public static functions, y
composeArrayItemPath</H3>
<PRE>
public static java.lang.String <B>composeArrayItemPath</B>(java.lang.String&nbsp;arrayName,
- int&nbsp;itemIndex)</PRE>
+ int&nbsp;itemIndex)
+ throws <A HREF="../../../com/adobe/xmp/XMPException.html" title="class in com.adobe.xmp">XMPException</A></PRE>
<DL>
<DD>Compose the path expression for an item in an array.
<P>
@@ -242,7 +243,9 @@ public static java.lang.String <B>composeArrayItemPath</B>(java.lang.String&nbsp
0 and below means last array item and renders as <code>[last()]</code>.
<DT><B>Returns:</B><DD>Returns the composed path basing on fullPath. This will be of the form
<tt>ns:arrayName[i]</tt>, where &quot;ns&quot; is the prefix for schemaNS and
- &quot;i&quot; is the decimal representation of itemIndex.</DL>
+ &quot;i&quot; is the decimal representation of itemIndex.
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="../../../com/adobe/xmp/XMPException.html" title="class in com.adobe.xmp">XMPException</A></CODE> - Throws exeption if index zero is used.</DL>
</DD>
</DL>
<HR>
diff --git a/java/XMPCore/docs/com/adobe/xmp/XMPSchemaRegistry.html b/java/XMPCore/docs/com/adobe/xmp/XMPSchemaRegistry.html
index 3b4d4b3..0f101d2 100644
--- a/java/XMPCore/docs/com/adobe/xmp/XMPSchemaRegistry.html
+++ b/java/XMPCore/docs/com/adobe/xmp/XMPSchemaRegistry.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
XMPSchemaRegistry
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/XMPUtils.html b/java/XMPCore/docs/com/adobe/xmp/XMPUtils.html
index 2a4ed42..75177dc 100644
--- a/java/XMPCore/docs/com/adobe/xmp/XMPUtils.html
+++ b/java/XMPCore/docs/com/adobe/xmp/XMPUtils.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
XMPUtils
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/XMPVersionInfo.html b/java/XMPCore/docs/com/adobe/xmp/XMPVersionInfo.html
index 06f3ae0..d28bb62 100644
--- a/java/XMPCore/docs/com/adobe/xmp/XMPVersionInfo.html
+++ b/java/XMPCore/docs/com/adobe/xmp/XMPVersionInfo.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
XMPVersionInfo
</TITLE>
@@ -94,7 +94,7 @@ Interface XMPVersionInfo</H2>
</PRE>
<P>
-XMP Toolkit Version Information
+XMP Toolkit Version Information.
<p>
Version information for the XMP toolkit is stored in the jar-library and available through a
runtime call, <A HREF="../../../com/adobe/xmp/XMPMetaFactory.html#getVersionInfo()"><CODE>XMPMetaFactory.getVersionInfo()</CODE></A>, addition static version numbers are
@@ -216,26 +216,26 @@ int <B>getMicro</B>()</PRE>
</DL>
<HR>
-<A NAME="isDebug()"><!-- --></A><H3>
-isDebug</H3>
+<A NAME="getBuild()"><!-- --></A><H3>
+getBuild</H3>
<PRE>
-boolean <B>isDebug</B>()</PRE>
+int <B>getBuild</B>()</PRE>
<DL>
<DD><DL>
-<DT><B>Returns:</B><DD>Returns true if this is a debug build.</DL>
+<DT><B>Returns:</B><DD>Returns a rolling build number, monotonically increasing in a release.</DL>
</DD>
</DL>
<HR>
-<A NAME="getBuild()"><!-- --></A><H3>
-getBuild</H3>
+<A NAME="isDebug()"><!-- --></A><H3>
+isDebug</H3>
<PRE>
-int <B>getBuild</B>()</PRE>
+boolean <B>isDebug</B>()</PRE>
<DL>
<DD><DL>
-<DT><B>Returns:</B><DD>Returns a rolling build number, monotonically increasing in a release.</DL>
+<DT><B>Returns:</B><DD>Returns true if this is a debug build.</DL>
</DD>
</DL>
<HR>
diff --git a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPConst.html b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPConst.html
index c51a66f..3abdaa6 100644
--- a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPConst.html
+++ b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPConst.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Interface com.adobe.xmp.XMPConst
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPDateTime.html b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPDateTime.html
index 0356533..75afdeb 100644
--- a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPDateTime.html
+++ b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPDateTime.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Interface com.adobe.xmp.XMPDateTime
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPDateTimeFactory.html b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPDateTimeFactory.html
index 44b66db..977e21f 100644
--- a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPDateTimeFactory.html
+++ b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPDateTimeFactory.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Class com.adobe.xmp.XMPDateTimeFactory
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPError.html b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPError.html
index ee642e6..aa020ce 100644
--- a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPError.html
+++ b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPError.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Interface com.adobe.xmp.XMPError
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPException.html b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPException.html
index a75d4c5..47db833 100644
--- a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPException.html
+++ b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPException.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Class com.adobe.xmp.XMPException
</TITLE>
@@ -171,6 +171,15 @@ Uses of <A HREF="../../../../com/adobe/xmp/XMPException.html" title="class in co
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>static&nbsp;java.lang.String</CODE></FONT></TD>
+<TD><CODE><B>XMPPathFactory.</B><B><A HREF="../../../../com/adobe/xmp/XMPPathFactory.html#composeArrayItemPath(java.lang.String, int)">composeArrayItemPath</A></B>(java.lang.String&nbsp;arrayName,
+ int&nbsp;itemIndex)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Compose the path expression for an item in an array.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static&nbsp;java.lang.String</CODE></FONT></TD>
<TD><CODE><B>XMPPathFactory.</B><B><A HREF="../../../../com/adobe/xmp/XMPPathFactory.html#composeFieldSelector(java.lang.String, java.lang.String, java.lang.String, java.lang.String)">composeFieldSelector</A></B>(java.lang.String&nbsp;arrayName,
java.lang.String&nbsp;fieldNS,
java.lang.String&nbsp;fieldName,
diff --git a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPIterator.html b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPIterator.html
index 4571da1..362c556 100644
--- a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPIterator.html
+++ b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPIterator.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Interface com.adobe.xmp.XMPIterator
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPMeta.html b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPMeta.html
index 558b38c..67175bf 100644
--- a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPMeta.html
+++ b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPMeta.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Interface com.adobe.xmp.XMPMeta
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPMetaFactory.html b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPMetaFactory.html
index f0e76be..910e1bd 100644
--- a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPMetaFactory.html
+++ b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPMetaFactory.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Class com.adobe.xmp.XMPMetaFactory
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPPathFactory.html b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPPathFactory.html
index 4e3f415..766b467 100644
--- a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPPathFactory.html
+++ b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPPathFactory.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Class com.adobe.xmp.XMPPathFactory
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPSchemaRegistry.html b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPSchemaRegistry.html
index 58898f2..6378e1f 100644
--- a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPSchemaRegistry.html
+++ b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPSchemaRegistry.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Interface com.adobe.xmp.XMPSchemaRegistry
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPUtils.html b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPUtils.html
index 6e9177c..fca1b5b 100644
--- a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPUtils.html
+++ b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPUtils.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Class com.adobe.xmp.XMPUtils
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPVersionInfo.html b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPVersionInfo.html
index 33feddb..f3e83cb 100644
--- a/java/XMPCore/docs/com/adobe/xmp/class-use/XMPVersionInfo.html
+++ b/java/XMPCore/docs/com/adobe/xmp/class-use/XMPVersionInfo.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Interface com.adobe.xmp.XMPVersionInfo
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/options/AliasOptions.html b/java/XMPCore/docs/com/adobe/xmp/options/AliasOptions.html
index 183234e..aa01280 100644
--- a/java/XMPCore/docs/com/adobe/xmp/options/AliasOptions.html
+++ b/java/XMPCore/docs/com/adobe/xmp/options/AliasOptions.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
AliasOptions
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/options/IteratorOptions.html b/java/XMPCore/docs/com/adobe/xmp/options/IteratorOptions.html
index 50d8bef..0441609 100644
--- a/java/XMPCore/docs/com/adobe/xmp/options/IteratorOptions.html
+++ b/java/XMPCore/docs/com/adobe/xmp/options/IteratorOptions.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
IteratorOptions
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/options/Options.html b/java/XMPCore/docs/com/adobe/xmp/options/Options.html
index ea766eb..13ae814 100644
--- a/java/XMPCore/docs/com/adobe/xmp/options/Options.html
+++ b/java/XMPCore/docs/com/adobe/xmp/options/Options.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
Options
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/options/ParseOptions.html b/java/XMPCore/docs/com/adobe/xmp/options/ParseOptions.html
index 62e59bb..1b6bc98 100644
--- a/java/XMPCore/docs/com/adobe/xmp/options/ParseOptions.html
+++ b/java/XMPCore/docs/com/adobe/xmp/options/ParseOptions.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
ParseOptions
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/options/PropertyOptions.html b/java/XMPCore/docs/com/adobe/xmp/options/PropertyOptions.html
index 0f0e7e3..6b6a391 100644
--- a/java/XMPCore/docs/com/adobe/xmp/options/PropertyOptions.html
+++ b/java/XMPCore/docs/com/adobe/xmp/options/PropertyOptions.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:09 CEST 2008 -->
<TITLE>
PropertyOptions
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/options/SerializeOptions.html b/java/XMPCore/docs/com/adobe/xmp/options/SerializeOptions.html
index 917ef57..78c6dcc 100644
--- a/java/XMPCore/docs/com/adobe/xmp/options/SerializeOptions.html
+++ b/java/XMPCore/docs/com/adobe/xmp/options/SerializeOptions.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
SerializeOptions
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/options/class-use/AliasOptions.html b/java/XMPCore/docs/com/adobe/xmp/options/class-use/AliasOptions.html
index cad6a5f..152ffc9 100644
--- a/java/XMPCore/docs/com/adobe/xmp/options/class-use/AliasOptions.html
+++ b/java/XMPCore/docs/com/adobe/xmp/options/class-use/AliasOptions.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Class com.adobe.xmp.options.AliasOptions
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/options/class-use/IteratorOptions.html b/java/XMPCore/docs/com/adobe/xmp/options/class-use/IteratorOptions.html
index 02a4726..7ad3c81 100644
--- a/java/XMPCore/docs/com/adobe/xmp/options/class-use/IteratorOptions.html
+++ b/java/XMPCore/docs/com/adobe/xmp/options/class-use/IteratorOptions.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Class com.adobe.xmp.options.IteratorOptions
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/options/class-use/Options.html b/java/XMPCore/docs/com/adobe/xmp/options/class-use/Options.html
index 57eac1b..014b6d6 100644
--- a/java/XMPCore/docs/com/adobe/xmp/options/class-use/Options.html
+++ b/java/XMPCore/docs/com/adobe/xmp/options/class-use/Options.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Class com.adobe.xmp.options.Options
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/options/class-use/ParseOptions.html b/java/XMPCore/docs/com/adobe/xmp/options/class-use/ParseOptions.html
index 272e344..d6988f9 100644
--- a/java/XMPCore/docs/com/adobe/xmp/options/class-use/ParseOptions.html
+++ b/java/XMPCore/docs/com/adobe/xmp/options/class-use/ParseOptions.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Class com.adobe.xmp.options.ParseOptions
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/options/class-use/PropertyOptions.html b/java/XMPCore/docs/com/adobe/xmp/options/class-use/PropertyOptions.html
index a527b0b..f40c00a 100644
--- a/java/XMPCore/docs/com/adobe/xmp/options/class-use/PropertyOptions.html
+++ b/java/XMPCore/docs/com/adobe/xmp/options/class-use/PropertyOptions.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Class com.adobe.xmp.options.PropertyOptions
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/options/class-use/SerializeOptions.html b/java/XMPCore/docs/com/adobe/xmp/options/class-use/SerializeOptions.html
index 057c96e..ac92c49 100644
--- a/java/XMPCore/docs/com/adobe/xmp/options/class-use/SerializeOptions.html
+++ b/java/XMPCore/docs/com/adobe/xmp/options/class-use/SerializeOptions.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Class com.adobe.xmp.options.SerializeOptions
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/options/package-frame.html b/java/XMPCore/docs/com/adobe/xmp/options/package-frame.html
index b9239df..63c08a1 100644
--- a/java/XMPCore/docs/com/adobe/xmp/options/package-frame.html
+++ b/java/XMPCore/docs/com/adobe/xmp/options/package-frame.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
com.adobe.xmp.options
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/options/package-summary.html b/java/XMPCore/docs/com/adobe/xmp/options/package-summary.html
index 42e51e2..b3e9682 100644
--- a/java/XMPCore/docs/com/adobe/xmp/options/package-summary.html
+++ b/java/XMPCore/docs/com/adobe/xmp/options/package-summary.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
com.adobe.xmp.options
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/options/package-tree.html b/java/XMPCore/docs/com/adobe/xmp/options/package-tree.html
index 79322e0..2d69cec 100644
--- a/java/XMPCore/docs/com/adobe/xmp/options/package-tree.html
+++ b/java/XMPCore/docs/com/adobe/xmp/options/package-tree.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
com.adobe.xmp.options Class Hierarchy
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/options/package-use.html b/java/XMPCore/docs/com/adobe/xmp/options/package-use.html
index 5736c28..8179171 100644
--- a/java/XMPCore/docs/com/adobe/xmp/options/package-use.html
+++ b/java/XMPCore/docs/com/adobe/xmp/options/package-use.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Package com.adobe.xmp.options
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/package-frame.html b/java/XMPCore/docs/com/adobe/xmp/package-frame.html
index 763422a..11e5951 100644
--- a/java/XMPCore/docs/com/adobe/xmp/package-frame.html
+++ b/java/XMPCore/docs/com/adobe/xmp/package-frame.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
com.adobe.xmp
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/package-summary.html b/java/XMPCore/docs/com/adobe/xmp/package-summary.html
index dff25be..d768e2f 100644
--- a/java/XMPCore/docs/com/adobe/xmp/package-summary.html
+++ b/java/XMPCore/docs/com/adobe/xmp/package-summary.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
com.adobe.xmp
</TITLE>
@@ -119,11 +119,7 @@ Package containing the xmpcore interface.
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD WIDTH="15%"><B><A HREF="../../../com/adobe/xmp/XMPVersionInfo.html" title="interface in com.adobe.xmp">XMPVersionInfo</A></B></TD>
-<TD>XMP Toolkit Version Information
-
- Version information for the XMP toolkit is stored in the jar-library and available through a
- runtime call, <A HREF="../../../com/adobe/xmp/XMPMetaFactory.html#getVersionInfo()"><CODE>XMPMetaFactory.getVersionInfo()</CODE></A>, addition static version numbers are
- defined in "version.properties".</TD>
+<TD>XMP Toolkit Version Information.</TD>
</TR>
</TABLE>
&nbsp;
diff --git a/java/XMPCore/docs/com/adobe/xmp/package-tree.html b/java/XMPCore/docs/com/adobe/xmp/package-tree.html
index c425633..e3f75f7 100644
--- a/java/XMPCore/docs/com/adobe/xmp/package-tree.html
+++ b/java/XMPCore/docs/com/adobe/xmp/package-tree.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
com.adobe.xmp Class Hierarchy
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/package-use.html b/java/XMPCore/docs/com/adobe/xmp/package-use.html
index 9671779..cbaead9 100644
--- a/java/XMPCore/docs/com/adobe/xmp/package-use.html
+++ b/java/XMPCore/docs/com/adobe/xmp/package-use.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Package com.adobe.xmp
</TITLE>
@@ -138,11 +138,7 @@ Classes in <A HREF="../../../com/adobe/xmp/package-summary.html">com.adobe.xmp</
<TD><B><A HREF="../../../com/adobe/xmp/class-use/XMPVersionInfo.html#com.adobe.xmp"><B>XMPVersionInfo</B></A></B>
<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMP Toolkit Version Information
-
- Version information for the XMP toolkit is stored in the jar-library and available through a
- runtime call, <A HREF="../../../com/adobe/xmp/XMPMetaFactory.html#getVersionInfo()"><CODE>XMPMetaFactory.getVersionInfo()</CODE></A>, addition static version numbers are
- defined in "version.properties".</TD>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMP Toolkit Version Information.</TD>
</TR>
</TABLE>
&nbsp;
diff --git a/java/XMPCore/docs/com/adobe/xmp/properties/XMPAliasInfo.html b/java/XMPCore/docs/com/adobe/xmp/properties/XMPAliasInfo.html
index ea3ec06..57632ef 100644
--- a/java/XMPCore/docs/com/adobe/xmp/properties/XMPAliasInfo.html
+++ b/java/XMPCore/docs/com/adobe/xmp/properties/XMPAliasInfo.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
XMPAliasInfo
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/properties/XMPProperty.html b/java/XMPCore/docs/com/adobe/xmp/properties/XMPProperty.html
index 0303d0e..21af6c5 100644
--- a/java/XMPCore/docs/com/adobe/xmp/properties/XMPProperty.html
+++ b/java/XMPCore/docs/com/adobe/xmp/properties/XMPProperty.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
XMPProperty
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/properties/XMPPropertyInfo.html b/java/XMPCore/docs/com/adobe/xmp/properties/XMPPropertyInfo.html
index 53122a4..c3f883d 100644
--- a/java/XMPCore/docs/com/adobe/xmp/properties/XMPPropertyInfo.html
+++ b/java/XMPCore/docs/com/adobe/xmp/properties/XMPPropertyInfo.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
XMPPropertyInfo
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/properties/class-use/XMPAliasInfo.html b/java/XMPCore/docs/com/adobe/xmp/properties/class-use/XMPAliasInfo.html
index 0659608..2534a86 100644
--- a/java/XMPCore/docs/com/adobe/xmp/properties/class-use/XMPAliasInfo.html
+++ b/java/XMPCore/docs/com/adobe/xmp/properties/class-use/XMPAliasInfo.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Interface com.adobe.xmp.properties.XMPAliasInfo
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/properties/class-use/XMPProperty.html b/java/XMPCore/docs/com/adobe/xmp/properties/class-use/XMPProperty.html
index ab6457b..88ccc04 100644
--- a/java/XMPCore/docs/com/adobe/xmp/properties/class-use/XMPProperty.html
+++ b/java/XMPCore/docs/com/adobe/xmp/properties/class-use/XMPProperty.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Interface com.adobe.xmp.properties.XMPProperty
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/properties/class-use/XMPPropertyInfo.html b/java/XMPCore/docs/com/adobe/xmp/properties/class-use/XMPPropertyInfo.html
index 7825f47..668a7ee 100644
--- a/java/XMPCore/docs/com/adobe/xmp/properties/class-use/XMPPropertyInfo.html
+++ b/java/XMPCore/docs/com/adobe/xmp/properties/class-use/XMPPropertyInfo.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Interface com.adobe.xmp.properties.XMPPropertyInfo
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/properties/package-frame.html b/java/XMPCore/docs/com/adobe/xmp/properties/package-frame.html
index 27a414d..4152b06 100644
--- a/java/XMPCore/docs/com/adobe/xmp/properties/package-frame.html
+++ b/java/XMPCore/docs/com/adobe/xmp/properties/package-frame.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
com.adobe.xmp.properties
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/properties/package-summary.html b/java/XMPCore/docs/com/adobe/xmp/properties/package-summary.html
index a7c55e6..6a94883 100644
--- a/java/XMPCore/docs/com/adobe/xmp/properties/package-summary.html
+++ b/java/XMPCore/docs/com/adobe/xmp/properties/package-summary.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
com.adobe.xmp.properties
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/properties/package-tree.html b/java/XMPCore/docs/com/adobe/xmp/properties/package-tree.html
index 570ce2b..2644f66 100644
--- a/java/XMPCore/docs/com/adobe/xmp/properties/package-tree.html
+++ b/java/XMPCore/docs/com/adobe/xmp/properties/package-tree.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
com.adobe.xmp.properties Class Hierarchy
</TITLE>
diff --git a/java/XMPCore/docs/com/adobe/xmp/properties/package-use.html b/java/XMPCore/docs/com/adobe/xmp/properties/package-use.html
index a732f18..dabd25e 100644
--- a/java/XMPCore/docs/com/adobe/xmp/properties/package-use.html
+++ b/java/XMPCore/docs/com/adobe/xmp/properties/package-use.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Uses of Package com.adobe.xmp.properties
</TITLE>
diff --git a/java/XMPCore/docs/constant-values.html b/java/XMPCore/docs/constant-values.html
index 3976259..bdd3dd8 100644
--- a/java/XMPCore/docs/constant-values.html
+++ b/java/XMPCore/docs/constant-values.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Constant Field Values
</TITLE>
@@ -135,6 +135,12 @@ com.adobe.*</FONT></TH>
<TD ALIGN="right"><CODE>"http://ns.adobe.com/camera-raw-settings/1.0/"</CODE></TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.adobe.xmp.XMPConst.NS_CREATOR_ATOM"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public&nbsp;static&nbsp;final&nbsp;java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/adobe/xmp/XMPConst.html#NS_CREATOR_ATOM">NS_CREATOR_ATOM</A></CODE></TD>
+<TD ALIGN="right"><CODE>"http://ns.adobe.com/creatorAtom/1.0/"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
<A NAME="com.adobe.xmp.XMPConst.NS_DC"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
<CODE>public&nbsp;static&nbsp;final&nbsp;java.lang.String</CODE></FONT></TD>
<TD ALIGN="left"><CODE><A HREF="com/adobe/xmp/XMPConst.html#NS_DC">NS_DC</A></CODE></TD>
@@ -333,6 +339,18 @@ com.adobe.*</FONT></TH>
<TD ALIGN="right"><CODE>"rdf:type"</CODE></TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.adobe.xmp.XMPConst.TAG_XAPMETA"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public&nbsp;static&nbsp;final&nbsp;java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/adobe/xmp/XMPConst.html#TAG_XAPMETA">TAG_XAPMETA</A></CODE></TD>
+<TD ALIGN="right"><CODE>"xapmeta"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.adobe.xmp.XMPConst.TAG_XMPMETA"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public&nbsp;static&nbsp;final&nbsp;java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/adobe/xmp/XMPConst.html#TAG_XMPMETA">TAG_XMPMETA</A></CODE></TD>
+<TD ALIGN="right"><CODE>"xmpmeta"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
<A NAME="com.adobe.xmp.XMPConst.TRUESTR"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
<CODE>public&nbsp;static&nbsp;final&nbsp;java.lang.String</CODE></FONT></TD>
<TD ALIGN="left"><CODE><A HREF="com/adobe/xmp/XMPConst.html#TRUESTR">TRUESTR</A></CODE></TD>
@@ -422,6 +440,12 @@ com.adobe.*</FONT></TH>
<TD ALIGN="left"><CODE><A HREF="com/adobe/xmp/XMPConst.html#XML_LANG">XML_LANG</A></CODE></TD>
<TD ALIGN="right"><CODE>"xml:lang"</CODE></TD>
</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="com.adobe.xmp.XMPConst.XMP_PI"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public&nbsp;static&nbsp;final&nbsp;java.lang.String</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="com/adobe/xmp/XMPConst.html#XMP_PI">XMP_PI</A></CODE></TD>
+<TD ALIGN="right"><CODE>"xpacket"</CODE></TD>
+</TR>
</FONT></TD>
</TR>
</TABLE>
diff --git a/java/XMPCore/docs/deprecated-list.html b/java/XMPCore/docs/deprecated-list.html
index 6ad197c..ea13c8d 100644
--- a/java/XMPCore/docs/deprecated-list.html
+++ b/java/XMPCore/docs/deprecated-list.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Deprecated List
</TITLE>
diff --git a/java/XMPCore/docs/help-doc.html b/java/XMPCore/docs/help-doc.html
index 525fe95..fcc8505 100644
--- a/java/XMPCore/docs/help-doc.html
+++ b/java/XMPCore/docs/help-doc.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
API Help
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-1.html b/java/XMPCore/docs/index-files/index-1.html
index a050b61..525f147 100644
--- a/java/XMPCore/docs/index-files/index-1.html
+++ b/java/XMPCore/docs/index-files/index-1.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
A-Index
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-10.html b/java/XMPCore/docs/index-files/index-10.html
index 408ce86..de09c8e 100644
--- a/java/XMPCore/docs/index-files/index-10.html
+++ b/java/XMPCore/docs/index-files/index-10.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
J-Index
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-11.html b/java/XMPCore/docs/index-files/index-11.html
index e09de58..9fdf498 100644
--- a/java/XMPCore/docs/index-files/index-11.html
+++ b/java/XMPCore/docs/index-files/index-11.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
M-Index
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-12.html b/java/XMPCore/docs/index-files/index-12.html
index d67566f..0cb26b5 100644
--- a/java/XMPCore/docs/index-files/index-12.html
+++ b/java/XMPCore/docs/index-files/index-12.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
N-Index
</TITLE>
@@ -90,6 +90,9 @@ Static variable in interface com.adobe.xmp.<A HREF="../com/adobe/xmp/XMPConst.ht
<DT><A HREF="../com/adobe/xmp/XMPConst.html#NS_CAMERARAW"><B>NS_CAMERARAW</B></A> -
Static variable in interface com.adobe.xmp.<A HREF="../com/adobe/xmp/XMPConst.html" title="interface in com.adobe.xmp">XMPConst</A>
<DD>&nbsp;
+<DT><A HREF="../com/adobe/xmp/XMPConst.html#NS_CREATOR_ATOM"><B>NS_CREATOR_ATOM</B></A> -
+Static variable in interface com.adobe.xmp.<A HREF="../com/adobe/xmp/XMPConst.html" title="interface in com.adobe.xmp">XMPConst</A>
+<DD>&nbsp;
<DT><A HREF="../com/adobe/xmp/XMPConst.html#NS_DC"><B>NS_DC</B></A> -
Static variable in interface com.adobe.xmp.<A HREF="../com/adobe/xmp/XMPConst.html" title="interface in com.adobe.xmp">XMPConst</A>
<DD>The XML namespace for the Dublin Core schema.
diff --git a/java/XMPCore/docs/index-files/index-13.html b/java/XMPCore/docs/index-files/index-13.html
index 039c075..ca1ad46 100644
--- a/java/XMPCore/docs/index-files/index-13.html
+++ b/java/XMPCore/docs/index-files/index-13.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
O-Index
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-14.html b/java/XMPCore/docs/index-files/index-14.html
index 968c0b7..2ff260b 100644
--- a/java/XMPCore/docs/index-files/index-14.html
+++ b/java/XMPCore/docs/index-files/index-14.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
P-Index
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-15.html b/java/XMPCore/docs/index-files/index-15.html
index 32d306c..49d2f08 100644
--- a/java/XMPCore/docs/index-files/index-15.html
+++ b/java/XMPCore/docs/index-files/index-15.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Q-Index
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-16.html b/java/XMPCore/docs/index-files/index-16.html
index dc8a074..e03097a 100644
--- a/java/XMPCore/docs/index-files/index-16.html
+++ b/java/XMPCore/docs/index-files/index-16.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
R-Index
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-17.html b/java/XMPCore/docs/index-files/index-17.html
index f0f15ce..b520a9c 100644
--- a/java/XMPCore/docs/index-files/index-17.html
+++ b/java/XMPCore/docs/index-files/index-17.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
S-Index
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-18.html b/java/XMPCore/docs/index-files/index-18.html
index b0906d2..9492236 100644
--- a/java/XMPCore/docs/index-files/index-18.html
+++ b/java/XMPCore/docs/index-files/index-18.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
T-Index
</TITLE>
@@ -78,6 +78,12 @@ function windowTitle()
<A NAME="_T_"><!-- --></A><H2>
<B>T</B></H2>
<DL>
+<DT><A HREF="../com/adobe/xmp/XMPConst.html#TAG_XAPMETA"><B>TAG_XAPMETA</B></A> -
+Static variable in interface com.adobe.xmp.<A HREF="../com/adobe/xmp/XMPConst.html" title="interface in com.adobe.xmp">XMPConst</A>
+<DD>XMP meta tag version old
+<DT><A HREF="../com/adobe/xmp/XMPConst.html#TAG_XMPMETA"><B>TAG_XMPMETA</B></A> -
+Static variable in interface com.adobe.xmp.<A HREF="../com/adobe/xmp/XMPConst.html" title="interface in com.adobe.xmp">XMPConst</A>
+<DD>XMP meta tag version new
<DT><A HREF="../com/adobe/xmp/options/AliasOptions.html#toPropertyOptions()"><B>toPropertyOptions()</B></A> -
Method in class com.adobe.xmp.options.<A HREF="../com/adobe/xmp/options/AliasOptions.html" title="class in com.adobe.xmp.options">AliasOptions</A>
<DD>&nbsp;
diff --git a/java/XMPCore/docs/index-files/index-19.html b/java/XMPCore/docs/index-files/index-19.html
index 879076a..44f727b 100644
--- a/java/XMPCore/docs/index-files/index-19.html
+++ b/java/XMPCore/docs/index-files/index-19.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
U-Index
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-2.html b/java/XMPCore/docs/index-files/index-2.html
index eec918a..b574651 100644
--- a/java/XMPCore/docs/index-files/index-2.html
+++ b/java/XMPCore/docs/index-files/index-2.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
B-Index
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-20.html b/java/XMPCore/docs/index-files/index-20.html
index a6f9950..b02b2ff 100644
--- a/java/XMPCore/docs/index-files/index-20.html
+++ b/java/XMPCore/docs/index-files/index-20.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
W-Index
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-21.html b/java/XMPCore/docs/index-files/index-21.html
index 36b9865..36d7f79 100644
--- a/java/XMPCore/docs/index-files/index-21.html
+++ b/java/XMPCore/docs/index-files/index-21.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
X-Index
</TITLE>
@@ -84,6 +84,9 @@ Static variable in interface com.adobe.xmp.<A HREF="../com/adobe/xmp/XMPConst.ht
<DT><A HREF="../com/adobe/xmp/XMPConst.html#XML_LANG"><B>XML_LANG</B></A> -
Static variable in interface com.adobe.xmp.<A HREF="../com/adobe/xmp/XMPConst.html" title="interface in com.adobe.xmp">XMPConst</A>
<DD>xml:lang qualfifier
+<DT><A HREF="../com/adobe/xmp/XMPConst.html#XMP_PI"><B>XMP_PI</B></A> -
+Static variable in interface com.adobe.xmp.<A HREF="../com/adobe/xmp/XMPConst.html" title="interface in com.adobe.xmp">XMPConst</A>
+<DD>Processing Instruction (PI) for xmp packet
<DT><A HREF="../com/adobe/xmp/properties/XMPAliasInfo.html" title="interface in com.adobe.xmp.properties"><B>XMPAliasInfo</B></A> - Interface in <A HREF="../com/adobe/xmp/properties/package-summary.html">com.adobe.xmp.properties</A><DD>This interface is used to return info about an alias.<DT><A HREF="../com/adobe/xmp/XMPConst.html" title="interface in com.adobe.xmp"><B>XMPConst</B></A> - Interface in <A HREF="../com/adobe/xmp/package-summary.html">com.adobe.xmp</A><DD>Common constants for the XMP Toolkit.<DT><A HREF="../com/adobe/xmp/XMPDateTime.html" title="interface in com.adobe.xmp"><B>XMPDateTime</B></A> - Interface in <A HREF="../com/adobe/xmp/package-summary.html">com.adobe.xmp</A><DD>The <code>XMPDateTime</code>-class represents a point in time up to a resolution of nano
seconds.<DT><A HREF="../com/adobe/xmp/XMPDateTimeFactory.html" title="class in com.adobe.xmp"><B>XMPDateTimeFactory</B></A> - Class in <A HREF="../com/adobe/xmp/package-summary.html">com.adobe.xmp</A><DD>A factory to create <code>XMPDateTime</code>-instances from a <code>Calendar</code> or an
ISO 8601 string or for the current time.<DT><A HREF="../com/adobe/xmp/XMPError.html" title="interface in com.adobe.xmp"><B>XMPError</B></A> - Interface in <A HREF="../com/adobe/xmp/package-summary.html">com.adobe.xmp</A><DD>&nbsp;<DT><A HREF="../com/adobe/xmp/XMPException.html" title="class in com.adobe.xmp"><B>XMPException</B></A> - Exception in <A HREF="../com/adobe/xmp/package-summary.html">com.adobe.xmp</A><DD>This exception wraps all errors that occur in the XMP Toolkit.<DT><A HREF="../com/adobe/xmp/XMPException.html#XMPException(java.lang.String, int)"><B>XMPException(String, int)</B></A> -
@@ -93,11 +96,7 @@ Constructor for exception com.adobe.xmp.<A HREF="../com/adobe/xmp/XMPException.h
Constructor for exception com.adobe.xmp.<A HREF="../com/adobe/xmp/XMPException.html" title="class in com.adobe.xmp">XMPException</A>
<DD>Constructs an exception with a message, an error code and a <code>Throwable</code>
<DT><A HREF="../com/adobe/xmp/XMPIterator.html" title="interface in com.adobe.xmp"><B>XMPIterator</B></A> - Interface in <A HREF="../com/adobe/xmp/package-summary.html">com.adobe.xmp</A><DD>Interface for the <code>XMPMeta</code> iteration services.<DT><A HREF="../com/adobe/xmp/XMPMeta.html" title="interface in com.adobe.xmp"><B>XMPMeta</B></A> - Interface in <A HREF="../com/adobe/xmp/package-summary.html">com.adobe.xmp</A><DD>This class represents the set of XMP metadata as a DOM representation.<DT><A HREF="../com/adobe/xmp/XMPMetaFactory.html" title="class in com.adobe.xmp"><B>XMPMetaFactory</B></A> - Class in <A HREF="../com/adobe/xmp/package-summary.html">com.adobe.xmp</A><DD>Creates <code>XMPMeta</code>-instances from an <code>InputStream</code><DT><A HREF="../com/adobe/xmp/XMPPathFactory.html" title="class in com.adobe.xmp"><B>XMPPathFactory</B></A> - Class in <A HREF="../com/adobe/xmp/package-summary.html">com.adobe.xmp</A><DD>Utility services for the metadata object.<DT><A HREF="../com/adobe/xmp/properties/XMPProperty.html" title="interface in com.adobe.xmp.properties"><B>XMPProperty</B></A> - Interface in <A HREF="../com/adobe/xmp/properties/package-summary.html">com.adobe.xmp.properties</A><DD>This interface is used to return a text property together with its and options.<DT><A HREF="../com/adobe/xmp/properties/XMPPropertyInfo.html" title="interface in com.adobe.xmp.properties"><B>XMPPropertyInfo</B></A> - Interface in <A HREF="../com/adobe/xmp/properties/package-summary.html">com.adobe.xmp.properties</A><DD>This interface is used to return a property together with its path and namespace.<DT><A HREF="../com/adobe/xmp/XMPSchemaRegistry.html" title="interface in com.adobe.xmp"><B>XMPSchemaRegistry</B></A> - Interface in <A HREF="../com/adobe/xmp/package-summary.html">com.adobe.xmp</A><DD>The schema registry keeps track of all namespaces and aliases used in the XMP
- metadata.<DT><A HREF="../com/adobe/xmp/XMPUtils.html" title="class in com.adobe.xmp"><B>XMPUtils</B></A> - Class in <A HREF="../com/adobe/xmp/package-summary.html">com.adobe.xmp</A><DD>Utility methods for XMP.<DT><A HREF="../com/adobe/xmp/XMPVersionInfo.html" title="interface in com.adobe.xmp"><B>XMPVersionInfo</B></A> - Interface in <A HREF="../com/adobe/xmp/package-summary.html">com.adobe.xmp</A><DD>XMP Toolkit Version Information
-
- Version information for the XMP toolkit is stored in the jar-library and available through a
- runtime call, <A HREF="../com/adobe/xmp/XMPMetaFactory.html#getVersionInfo()"><CODE>XMPMetaFactory.getVersionInfo()</CODE></A>, addition static version numbers are
- defined in "version.properties".</DL>
+ metadata.<DT><A HREF="../com/adobe/xmp/XMPUtils.html" title="class in com.adobe.xmp"><B>XMPUtils</B></A> - Class in <A HREF="../com/adobe/xmp/package-summary.html">com.adobe.xmp</A><DD>Utility methods for XMP.<DT><A HREF="../com/adobe/xmp/XMPVersionInfo.html" title="interface in com.adobe.xmp"><B>XMPVersionInfo</B></A> - Interface in <A HREF="../com/adobe/xmp/package-summary.html">com.adobe.xmp</A><DD>XMP Toolkit Version Information.</DL>
<HR>
diff --git a/java/XMPCore/docs/index-files/index-3.html b/java/XMPCore/docs/index-files/index-3.html
index 786b84e..364a44f 100644
--- a/java/XMPCore/docs/index-files/index-3.html
+++ b/java/XMPCore/docs/index-files/index-3.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
C-Index
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-4.html b/java/XMPCore/docs/index-files/index-4.html
index 026a681..25fdc9d 100644
--- a/java/XMPCore/docs/index-files/index-4.html
+++ b/java/XMPCore/docs/index-files/index-4.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
D-Index
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-5.html b/java/XMPCore/docs/index-files/index-5.html
index e1ef8f8..30af996 100644
--- a/java/XMPCore/docs/index-files/index-5.html
+++ b/java/XMPCore/docs/index-files/index-5.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
E-Index
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-6.html b/java/XMPCore/docs/index-files/index-6.html
index 6c64702..e374003 100644
--- a/java/XMPCore/docs/index-files/index-6.html
+++ b/java/XMPCore/docs/index-files/index-6.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
F-Index
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-7.html b/java/XMPCore/docs/index-files/index-7.html
index ef1e513..0c2e759 100644
--- a/java/XMPCore/docs/index-files/index-7.html
+++ b/java/XMPCore/docs/index-files/index-7.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
G-Index
</TITLE>
@@ -212,6 +212,9 @@ Method in interface com.adobe.xmp.properties.<A HREF="../com/adobe/xmp/propertie
<DT><A HREF="../com/adobe/xmp/options/Options.html#getOptionsString()"><B>getOptionsString()</B></A> -
Method in class com.adobe.xmp.options.<A HREF="../com/adobe/xmp/options/Options.html" title="class in com.adobe.xmp.options">Options</A>
<DD>Creates a human readable string from the set options.
+<DT><A HREF="../com/adobe/xmp/XMPMeta.html#getPacketHeader()"><B>getPacketHeader()</B></A> -
+Method in interface com.adobe.xmp.<A HREF="../com/adobe/xmp/XMPMeta.html" title="interface in com.adobe.xmp">XMPMeta</A>
+<DD>&nbsp;
<DT><A HREF="../com/adobe/xmp/options/SerializeOptions.html#getPadding()"><B>getPadding()</B></A> -
Method in class com.adobe.xmp.options.<A HREF="../com/adobe/xmp/options/SerializeOptions.html" title="class in com.adobe.xmp.options">SerializeOptions</A>
<DD>&nbsp;
diff --git a/java/XMPCore/docs/index-files/index-8.html b/java/XMPCore/docs/index-files/index-8.html
index 8fec0b9..c174d55 100644
--- a/java/XMPCore/docs/index-files/index-8.html
+++ b/java/XMPCore/docs/index-files/index-8.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
H-Index
</TITLE>
diff --git a/java/XMPCore/docs/index-files/index-9.html b/java/XMPCore/docs/index-files/index-9.html
index e23855f..b503313 100644
--- a/java/XMPCore/docs/index-files/index-9.html
+++ b/java/XMPCore/docs/index-files/index-9.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
I-Index
</TITLE>
diff --git a/java/XMPCore/docs/index.html b/java/XMPCore/docs/index.html
index 3693809..0582cbb 100644
--- a/java/XMPCore/docs/index.html
+++ b/java/XMPCore/docs/index.html
@@ -2,14 +2,16 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc on Thu May 03 14:54:51 CEST 2007-->
+<!-- Generated by javadoc on Mon Oct 06 15:19:10 CEST 2008-->
<TITLE>
Generated Documentation (Untitled)
</TITLE>
<SCRIPT type="text/javascript">
targetPage = "" + window.location.search;
if (targetPage != "" && targetPage != "undefined")
- targetPage = targetPage.substring(1);
+ targetPage = targetPage.substring(1);
+ if (targetPage.indexOf(":") != -1)
+ targetPage = "undefined";
function loadFrames() {
if (targetPage != "" && targetPage != "undefined")
top.classFrame.location = top.targetPage;
diff --git a/java/XMPCore/docs/overview-frame.html b/java/XMPCore/docs/overview-frame.html
index a40f541..9a28b94 100644
--- a/java/XMPCore/docs/overview-frame.html
+++ b/java/XMPCore/docs/overview-frame.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Overview
</TITLE>
diff --git a/java/XMPCore/docs/overview-summary.html b/java/XMPCore/docs/overview-summary.html
index 2938859..d492f2b 100644
--- a/java/XMPCore/docs/overview-summary.html
+++ b/java/XMPCore/docs/overview-summary.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Overview
</TITLE>
diff --git a/java/XMPCore/docs/overview-tree.html b/java/XMPCore/docs/overview-tree.html
index 75afc85..d288bb7 100644
--- a/java/XMPCore/docs/overview-tree.html
+++ b/java/XMPCore/docs/overview-tree.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:51 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Class Hierarchy
</TITLE>
diff --git a/java/XMPCore/docs/package-list b/java/XMPCore/docs/package-list
deleted file mode 100644
index bbeec25..0000000
--- a/java/XMPCore/docs/package-list
+++ /dev/null
@@ -1,3 +0,0 @@
-com.adobe.xmp
-com.adobe.xmp.options
-com.adobe.xmp.properties
diff --git a/java/XMPCore/docs/serialized-form.html b/java/XMPCore/docs/serialized-form.html
index 720f3e2..5aaa55c 100644
--- a/java/XMPCore/docs/serialized-form.html
+++ b/java/XMPCore/docs/serialized-form.html
@@ -2,7 +2,7 @@
<!--NewPage-->
<HTML>
<HEAD>
-<!-- Generated by javadoc (build 1.5.0_07) on Thu May 03 14:54:50 CEST 2007 -->
+<!-- Generated by javadoc (build 1.5.0_13) on Mon Oct 06 15:19:10 CEST 2008 -->
<TITLE>
Serialized Form
</TITLE>
diff --git a/java/XMPCore/src/com/adobe/xmp/XMPConst.java b/java/XMPCore/src/com/adobe/xmp/XMPConst.java
index 8180633..3f741f3 100644
--- a/java/XMPCore/src/com/adobe/xmp/XMPConst.java
+++ b/java/XMPCore/src/com/adobe/xmp/XMPConst.java
@@ -88,6 +88,8 @@ public interface XMPConst
/** */
String NS_ADOBESTOCKPHOTO = "http://ns.adobe.com/StockPhoto/1.0/";
/** */
+ String NS_CREATOR_ATOM = "http://ns.adobe.com/creatorAtom/1.0/";
+ /** */
String NS_ASF = "http://ns.adobe.com/asf/1.0/";
/** */
String NS_WAV = "http://ns.adobe.com/xmp/wav/1.0/";
@@ -99,6 +101,8 @@ public interface XMPConst
String NS_DM = "http://ns.adobe.com/xmp/1.0/DynamicMedia/";
/** */
String NS_TRANSIENT = "http://ns.adobe.com/xmp/transient/1.0/";
+ /** legaciy dublin core NS, will be converted to NS_DC */
+ String NS_DC_DEPRECATED = "http://purl.org/dc/1.1/";
// XML namespace constants for qualifiers and structured property fields.
@@ -154,6 +158,10 @@ public interface XMPConst
/** rdf:type qualfifier */
String RDF_TYPE = "rdf:type";
- /** legaciy dublin core NS, will be converted to NS_DC */
- String NS_DC_DEPRECATED = "http://purl.org/dc/1.1/";
+ /** Processing Instruction (PI) for xmp packet */
+ String XMP_PI = "xpacket";
+ /** XMP meta tag version new */
+ String TAG_XMPMETA = "xmpmeta";
+ /** XMP meta tag version old */
+ String TAG_XAPMETA = "xapmeta";
} \ No newline at end of file
diff --git a/java/XMPCore/src/com/adobe/xmp/XMPDateTime.java b/java/XMPCore/src/com/adobe/xmp/XMPDateTime.java
index ae3a0fc..918adcf 100644
--- a/java/XMPCore/src/com/adobe/xmp/XMPDateTime.java
+++ b/java/XMPCore/src/com/adobe/xmp/XMPDateTime.java
@@ -88,7 +88,11 @@ public interface XMPDateTime extends Comparable
/** @param tz a time zone to set */
void setTimeZone(TimeZone tz);
- /** @return Returns a calendar (only with milli second precision). */
+ /**
+ * @return Returns a <code>Calendar</code> (only with milli second precision). <br>
+ * <em>Note:</em> the dates before Oct 15th 1585 (which normally fall into validity of
+ * the Julian calendar) are also rendered internally as Gregorian dates.
+ */
Calendar getCalendar();
/**
diff --git a/java/XMPCore/src/com/adobe/xmp/XMPDateTimeFactory.java b/java/XMPCore/src/com/adobe/xmp/XMPDateTimeFactory.java
index 05b6f0f..9eebc4b 100644
--- a/java/XMPCore/src/com/adobe/xmp/XMPDateTimeFactory.java
+++ b/java/XMPCore/src/com/adobe/xmp/XMPDateTimeFactory.java
@@ -10,6 +10,7 @@
package com.adobe.xmp;
import java.util.Calendar;
+import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
@@ -24,6 +25,11 @@ import com.adobe.xmp.impl.XMPDateTimeImpl;
*/
public final class XMPDateTimeFactory
{
+ /** The UTC TimeZone */
+ private static final TimeZone UTC = TimeZone.getTimeZone("UTC");
+
+
+
/** Private constructor */
private XMPDateTimeFactory()
{
@@ -46,7 +52,8 @@ public final class XMPDateTimeFactory
/**
* Creates an <code>XMPDateTime</code>-object from initial values.
* @param year years
- * @param month months
+ * @param month months from 1 to 12<br>
+ * <em>Note:</em> Remember that the month in {@link Calendar} is defined from 0 to 11.
* @param day days
* @param hour hours
* @param minute minutes
@@ -120,8 +127,10 @@ public final class XMPDateTimeFactory
*/
public static XMPDateTime convertToUTCTime(XMPDateTime dateTime)
{
- Calendar cal = dateTime.getCalendar();
- cal.setTimeZone(TimeZone.getTimeZone("UTC"));
+ long timeInMillis = dateTime.getCalendar().getTimeInMillis();
+ GregorianCalendar cal = new GregorianCalendar(UTC);
+ cal.setGregorianChange(new Date(Long.MIN_VALUE));
+ cal.setTimeInMillis(timeInMillis);
return new XMPDateTimeImpl(cal);
}
@@ -135,8 +144,10 @@ public final class XMPDateTimeFactory
*/
public static XMPDateTime convertToLocalTime(XMPDateTime dateTime)
{
- Calendar cal = dateTime.getCalendar();
- cal.setTimeZone(TimeZone.getDefault());
+ long timeInMillis = dateTime.getCalendar().getTimeInMillis();
+ // has automatically local timezone
+ GregorianCalendar cal = new GregorianCalendar();
+ cal.setTimeInMillis(timeInMillis);
return new XMPDateTimeImpl(cal);
}
} \ No newline at end of file
diff --git a/java/XMPCore/src/com/adobe/xmp/XMPMeta.java b/java/XMPCore/src/com/adobe/xmp/XMPMeta.java
index 085915f..1d40688 100644
--- a/java/XMPCore/src/com/adobe/xmp/XMPMeta.java
+++ b/java/XMPCore/src/com/adobe/xmp/XMPMeta.java
@@ -1121,6 +1121,16 @@ public interface XMPMeta extends Cloneable
*/
void setObjectName(String name);
+
+ /**
+ * @return Returns the unparsed content of the &lt;?xpacket&gt; processing instruction.
+ * This contains normally the attribute-like elements 'begin="&lt;BOM&gt;"
+ * id="W5M0MpCehiHzreSzNTczkc9d"' and possibly the deprecated elements 'bytes="1234"' or
+ * 'encoding="XXX"'. If the parsed packet has not been wrapped into an xpacket,
+ * <code>null</code> is returned.
+ */
+ String getPacketHeader();
+
/**
* Clones the complete metadata tree.
diff --git a/java/XMPCore/src/com/adobe/xmp/XMPMetaFactory.java b/java/XMPCore/src/com/adobe/xmp/XMPMetaFactory.java
index 4b218ec..4a3cf7a 100644
--- a/java/XMPCore/src/com/adobe/xmp/XMPMetaFactory.java
+++ b/java/XMPCore/src/com/adobe/xmp/XMPMetaFactory.java
@@ -250,11 +250,12 @@ public final class XMPMetaFactory
/**
- * Obtain version information.
+ * Obtain version information. The XMPVersionInfo singleton is created the first time
+ * its requested.
*
* @return Returns the version information.
*/
- public static XMPVersionInfo getVersionInfo()
+ public static synchronized XMPVersionInfo getVersionInfo()
{
if (versionInfo == null)
{
diff --git a/java/XMPCore/src/com/adobe/xmp/XMPPathFactory.java b/java/XMPCore/src/com/adobe/xmp/XMPPathFactory.java
index e8fa6d2..50067a3 100644
--- a/java/XMPCore/src/com/adobe/xmp/XMPPathFactory.java
+++ b/java/XMPCore/src/com/adobe/xmp/XMPPathFactory.java
@@ -78,17 +78,22 @@ public final class XMPPathFactory
* @return Returns the composed path basing on fullPath. This will be of the form
* <tt>ns:arrayName[i]</tt>, where &quot;ns&quot; is the prefix for schemaNS and
* &quot;i&quot; is the decimal representation of itemIndex.
+ * @throws XMPException Throws exeption if index zero is used.
*/
- public static String composeArrayItemPath(String arrayName, int itemIndex)
+ public static String composeArrayItemPath(String arrayName, int itemIndex) throws XMPException
{
if (itemIndex > 0)
{
return arrayName + '[' + itemIndex + ']';
}
- else
+ else if (itemIndex == XMPConst.ARRAY_LAST_ITEM)
{
return arrayName + "[last()]";
}
+ else
+ {
+ throw new XMPException("Array index must be larger than zero", XMPError.BADINDEX);
+ }
}
diff --git a/java/XMPCore/src/com/adobe/xmp/XMPVersionInfo.java b/java/XMPCore/src/com/adobe/xmp/XMPVersionInfo.java
index ac8fa32..ff7b0c7 100644
--- a/java/XMPCore/src/com/adobe/xmp/XMPVersionInfo.java
+++ b/java/XMPCore/src/com/adobe/xmp/XMPVersionInfo.java
@@ -10,7 +10,7 @@
package com.adobe.xmp;
/**
- * XMP Toolkit Version Information
+ * XMP Toolkit Version Information.
* <p>
* Version information for the XMP toolkit is stored in the jar-library and available through a
* runtime call, {@link XMPMetaFactory#getVersionInfo()}, addition static version numbers are
@@ -32,14 +32,14 @@ public interface XMPVersionInfo
int getMicro();
- /** @return Returns true if this is a debug build. */
- boolean isDebug();
-
-
/** @return Returns a rolling build number, monotonically increasing in a release. */
int getBuild();
+ /** @return Returns true if this is a debug build. */
+ boolean isDebug();
+
+
/** @return Returns a comprehensive version information string. */
String getMessage();
} \ No newline at end of file
diff --git a/java/XMPCore/src/com/adobe/xmp/impl/ISO8601Converter.java b/java/XMPCore/src/com/adobe/xmp/impl/ISO8601Converter.java
index 2d1939d..71fc7df 100644
--- a/java/XMPCore/src/com/adobe/xmp/impl/ISO8601Converter.java
+++ b/java/XMPCore/src/com/adobe/xmp/impl/ISO8601Converter.java
@@ -355,14 +355,16 @@ public final class ISO8601Converter
// time zone
if (dateTime.getTimeZone() != null)
{
- if (dateTime.getTimeZone().getRawOffset() == 0)
+ // used to calculate the time zone offset incl. Daylight Savings
+ long timeInMillis = dateTime.getCalendar().getTimeInMillis();
+ int offset = dateTime.getTimeZone().getOffset(timeInMillis);
+ if (offset == 0)
{
// UTC
buffer.append('Z');
}
else
{
- int offset = dateTime.getTimeZone().getRawOffset();
int thours = offset / 3600000;
int tminutes = Math.abs(offset % 3600000 / 60000);
df.applyPattern("+00;-00");
diff --git a/java/XMPCore/src/com/adobe/xmp/impl/ParseRDF.java b/java/XMPCore/src/com/adobe/xmp/impl/ParseRDF.java
index 1368a01..93e3ef0 100644
--- a/java/XMPCore/src/com/adobe/xmp/impl/ParseRDF.java
+++ b/java/XMPCore/src/com/adobe/xmp/impl/ParseRDF.java
@@ -577,7 +577,6 @@ public class ParseRDF implements XMPError, XMPConst
}
found = true;
- break;
}
else if (found)
{
diff --git a/java/XMPCore/src/com/adobe/xmp/impl/Utils.java b/java/XMPCore/src/com/adobe/xmp/impl/Utils.java
index 009dbe7..1f4088b 100644
--- a/java/XMPCore/src/com/adobe/xmp/impl/Utils.java
+++ b/java/XMPCore/src/com/adobe/xmp/impl/Utils.java
@@ -171,9 +171,9 @@ public class Utils implements XMPConst
}
else if (NS_XMP.equals(schema))
{
- if ("xap:BaseURL".equals(prop) || "xap:CreatorTool".equals(prop)
- || "xap:Format".equals(prop) || "xap:Locale".equals(prop)
- || "xap:MetadataDate".equals(prop) || "xap:ModifyDate".equals(prop))
+ if ("xmp:BaseURL".equals(prop) || "xmp:CreatorTool".equals(prop)
+ || "xmp:Format".equals(prop) || "xmp:Locale".equals(prop)
+ || "xmp:MetadataDate".equals(prop) || "xmp:ModifyDate".equals(prop))
{
isInternal = true;
}
diff --git a/java/XMPCore/src/com/adobe/xmp/impl/XMPDateTimeImpl.java b/java/XMPCore/src/com/adobe/xmp/impl/XMPDateTimeImpl.java
index e0d0573..ededcd4 100644
--- a/java/XMPCore/src/com/adobe/xmp/impl/XMPDateTimeImpl.java
+++ b/java/XMPCore/src/com/adobe/xmp/impl/XMPDateTimeImpl.java
@@ -10,7 +10,9 @@
package com.adobe.xmp.impl;
import java.util.Calendar;
+import java.util.Date;
import java.util.GregorianCalendar;
+import java.util.Locale;
import java.util.TimeZone;
import com.adobe.xmp.XMPDateTime;
@@ -63,14 +65,48 @@ public class XMPDateTimeImpl implements XMPDateTime
*/
public XMPDateTimeImpl(Calendar calendar)
{
- year = calendar.get(Calendar.YEAR);
- month = calendar.get(Calendar.MONTH) + 1; // cal is from 0..12
- day = calendar.get(Calendar.DAY_OF_MONTH);
- hour = calendar.get(Calendar.HOUR_OF_DAY);
- minute = calendar.get(Calendar.MINUTE);
- second = calendar.get(Calendar.SECOND);
- nanoSeconds = calendar.get(Calendar.MILLISECOND) * 1000000;
- timeZone = calendar.getTimeZone();
+ // extract the date and timezone from the calendar provided
+ Date date = calendar.getTime();
+ TimeZone zone = calendar.getTimeZone();
+
+ // put that date into a calendar the pretty much represents ISO8601
+ // I use US because it is close to the "locale" for the ISO8601 spec
+ GregorianCalendar intCalendar =
+ (GregorianCalendar) Calendar.getInstance(Locale.US);
+ intCalendar.setGregorianChange(new Date(Long.MIN_VALUE));
+ intCalendar.setTimeZone(zone);
+ intCalendar.setTime(date);
+
+ this.year = intCalendar.get(Calendar.YEAR);
+ this.month = intCalendar.get(Calendar.MONTH) + 1; // cal is from 0..12
+ this.day = intCalendar.get(Calendar.DAY_OF_MONTH);
+ this.hour = intCalendar.get(Calendar.HOUR_OF_DAY);
+ this.minute = intCalendar.get(Calendar.MINUTE);
+ this.second = intCalendar.get(Calendar.SECOND);
+ this.nanoSeconds = intCalendar.get(Calendar.MILLISECOND) * 1000000;
+ this.timeZone = intCalendar.getTimeZone();
+ }
+
+
+ /**
+ * Creates an <code>XMPDateTime</code>-instance from
+ * a <code>Date</code> and a <code>TimeZone</code>.
+ *
+ * @param date a date describing an absolute point in time
+ * @param timeZone a TimeZone how to interpret the date
+ */
+ public XMPDateTimeImpl(Date date, TimeZone timeZone)
+ {
+ GregorianCalendar calendar = new GregorianCalendar(timeZone);
+ calendar.setTime(date);
+ this.year = calendar.get(Calendar.YEAR);
+ this.month = calendar.get(Calendar.MONTH) + 1; // cal is from 0..12
+ this.day = calendar.get(Calendar.DAY_OF_MONTH);
+ this.hour = calendar.get(Calendar.HOUR_OF_DAY);
+ this.minute = calendar.get(Calendar.MINUTE);
+ this.second = calendar.get(Calendar.SECOND);
+ this.nanoSeconds = calendar.get(Calendar.MILLISECOND) * 1000000;
+ this.timeZone = timeZone;
}
@@ -277,9 +313,16 @@ public class XMPDateTimeImpl implements XMPDateTime
*/
public Calendar getCalendar()
{
- Calendar calendar = new GregorianCalendar(year, month - 1, day, hour, minute, second);
- calendar.set(Calendar.MILLISECOND, nanoSeconds / 1000000);
+ GregorianCalendar calendar = (GregorianCalendar) Calendar.getInstance(Locale.US);
+ calendar.setGregorianChange(new Date(Long.MIN_VALUE));
calendar.setTimeZone(timeZone);
+ calendar.set(Calendar.YEAR, year);
+ calendar.set(Calendar.MONTH, month - 1);
+ calendar.set(Calendar.DAY_OF_MONTH, day);
+ calendar.set(Calendar.HOUR_OF_DAY, hour);
+ calendar.set(Calendar.MINUTE, minute);
+ calendar.set(Calendar.SECOND, second);
+ calendar.set(Calendar.MILLISECOND, nanoSeconds / 1000000);
return calendar;
}
diff --git a/java/XMPCore/src/com/adobe/xmp/impl/XMPMetaImpl.java b/java/XMPCore/src/com/adobe/xmp/impl/XMPMetaImpl.java
index 251154d..5f14e74 100644
--- a/java/XMPCore/src/com/adobe/xmp/impl/XMPMetaImpl.java
+++ b/java/XMPCore/src/com/adobe/xmp/impl/XMPMetaImpl.java
@@ -53,7 +53,9 @@ public class XMPMetaImpl implements XMPMeta, XMPConst
/** root of the metadata tree */
private XMPNode tree;
-
+ /** the xpacket processing instructions content */
+ private String packetHeader = null;
+
/**
* Constructor for an empty metadata object.
@@ -1195,7 +1197,7 @@ public class XMPMetaImpl implements XMPMeta, XMPConst
return tree.getName() != null ? tree.getName() : "";
}
-
+
/**
* @see XMPMeta#setObjectName(String)
*/
@@ -1204,7 +1206,26 @@ public class XMPMetaImpl implements XMPMeta, XMPConst
tree.setName(name);
}
+
+ /**
+ * @see XMPMeta#getPacketHeader()
+ */
+ public String getPacketHeader()
+ {
+ return packetHeader;
+ }
+
+ /**
+ * Sets the packetHeader attributes, only used by the parser.
+ * @param packetHeader the processing instruction content
+ */
+ public void setPacketHeader(String packetHeader)
+ {
+ this.packetHeader = packetHeader;
+ }
+
+
/**
* Performs a deep clone of the XMPMeta-object
*
diff --git a/java/XMPCore/src/com/adobe/xmp/impl/XMPMetaParser.java b/java/XMPCore/src/com/adobe/xmp/impl/XMPMetaParser.java
index 35d929e..a09f8cf 100644
--- a/java/XMPCore/src/com/adobe/xmp/impl/XMPMetaParser.java
+++ b/java/XMPCore/src/com/adobe/xmp/impl/XMPMetaParser.java
@@ -23,6 +23,7 @@ import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
+import org.w3c.dom.ProcessingInstruction;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
@@ -76,11 +77,13 @@ public class XMPMetaParser
Document document = parseXml(input, options);
boolean xmpmetaRequired = options.getRequireXMPMeta();
- Object[] result = findRootNode(document, xmpmetaRequired);
+ Object[] result = new Object[3];
+ result = findRootNode(document, xmpmetaRequired, result);
if (result != null && result[1] == XMP_RDF)
{
XMPMetaImpl xmp = ParseRDF.parse((Node) result[0]);
+ xmp.setPacketHeader((String) result[2]);
return XMPNormalizer.process(xmp, options);
}
else
@@ -294,9 +297,18 @@ public class XMPMetaParser
* @param root the root of the xml document
* @param xmpmetaRequired flag if the xmpmeta-tag is still required, might be set
* initially to <code>true</code>, if the parse option "REQUIRE_XMP_META" is set
- * @return Returns the rdf:RDF-node or <code>null</code>.
+ * @param result The result array that is filled during the recursive process.
+ * @return Returns an array that contains the result or <code>null</code>.
+ * The array contains:
+ * <ol>
+ * <li>the rdf:RDF-node
+ * <li>an object that is either XMP_RDF or XMP_PLAIN
+ * <li>a flag that is true if a <?xpacket..> processing instruction has been found
+ * <li>the body text of the xpacket-instruction.
+ * </ol>
+ *
*/
- private static Object[] findRootNode(Node root, boolean xmpmetaRequired)
+ private static Object[] findRootNode(Node root, boolean xmpmetaRequired, Object[] result)
{
// Look among this parent's content for x:xapmeta or x:xmpmeta.
// The recursion for x:xmpmeta is broader than the strictly defined choice,
@@ -305,32 +317,49 @@ public class XMPMetaParser
for (int i = 0; i < children.getLength(); i++)
{
root = children.item(i);
- if (Node.TEXT_NODE != root.getNodeType() &&
+ if (Node.PROCESSING_INSTRUCTION_NODE == root.getNodeType() &&
+ ((ProcessingInstruction) root).getTarget() == XMPConst.XMP_PI)
+ {
+ // Store the processing instructions content
+ if (result != null)
+ {
+ result[2] = ((ProcessingInstruction) root).getData();
+ }
+ }
+ else if (Node.TEXT_NODE != root.getNodeType() &&
Node.PROCESSING_INSTRUCTION_NODE != root.getNodeType())
{
String rootNS = root.getNamespaceURI();
String rootLocal = root.getLocalName();
if (
- ("xmpmeta".equals(rootLocal) || "xapmeta".equals(rootLocal)) &&
+ (
+ XMPConst.TAG_XMPMETA.equals(rootLocal) ||
+ XMPConst.TAG_XAPMETA.equals(rootLocal)
+ ) &&
XMPConst.NS_X.equals(rootNS)
)
{
// by not passing the RequireXMPMeta-option, the rdf-Node will be valid
- return findRootNode(root, false);
+ return findRootNode(root, false, result);
}
else if (!xmpmetaRequired &&
"RDF".equals(rootLocal) &&
XMPConst.NS_RDF.equals(rootNS))
{
- return new Object[] {root, XMP_RDF};
+ if (result != null)
+ {
+ result[0] = root;
+ result[1] = XMP_RDF;
+ }
+ return result;
}
else
{
// continue searching
- Object[] result = findRootNode(root, xmpmetaRequired);
- if (result != null)
+ Object[] newResult = findRootNode(root, xmpmetaRequired, result);
+ if (newResult != null)
{
- return result;
+ return newResult;
}
else
{
diff --git a/java/XMPCore/src/com/adobe/xmp/impl/XMPNodeUtils.java b/java/XMPCore/src/com/adobe/xmp/impl/XMPNodeUtils.java
index 283db03..1bb5eda 100644
--- a/java/XMPCore/src/com/adobe/xmp/impl/XMPNodeUtils.java
+++ b/java/XMPCore/src/com/adobe/xmp/impl/XMPNodeUtils.java
@@ -9,7 +9,7 @@
package com.adobe.xmp.impl;
-import java.util.Calendar;
+import java.util.GregorianCalendar;
import java.util.Iterator;
import com.adobe.xmp.XMPConst;
@@ -416,9 +416,9 @@ public class XMPNodeUtils implements XMPConst
{
strValue = XMPUtils.convertFromDate((XMPDateTime) value);
}
- else if (value instanceof Calendar)
+ else if (value instanceof GregorianCalendar)
{
- XMPDateTime dt = XMPDateTimeFactory.createFromCalendar((Calendar) value);
+ XMPDateTime dt = XMPDateTimeFactory.createFromCalendar((GregorianCalendar) value);
strValue = XMPUtils.convertFromDate(dt);
}
else if (value instanceof byte[])
@@ -578,20 +578,14 @@ public class XMPNodeUtils implements XMPConst
throw new XMPException("Array index not digits.", XMPError.BADXPATH);
}
- if (index == arrayNode.getChildrenLength() + 1 && createNodes)
+ if (createNodes && index == arrayNode.getChildrenLength() + 1)
{
// Append a new last + 1 node.
XMPNode newItem = new XMPNode(ARRAY_ITEM_NAME, null);
newItem.setImplicit(true);
arrayNode.addChild(newItem);
}
-
- // Don't throw here for a too large index. setProperty() will throw,
- // getProperty() will not.
- if (index > arrayNode.getChildrenLength())
- {
- index = -1;
- }
+
return index;
}
diff --git a/java/XMPCore/src/com/adobe/xmp/impl/XMPNormalizer.java b/java/XMPCore/src/com/adobe/xmp/impl/XMPNormalizer.java
index b812324..043bc0a 100644
--- a/java/XMPCore/src/com/adobe/xmp/impl/XMPNormalizer.java
+++ b/java/XMPCore/src/com/adobe/xmp/impl/XMPNormalizer.java
@@ -162,7 +162,7 @@ public class XMPNormalizer
}
else if (XMPConst.NS_XMP_RIGHTS.equals(currSchema.getName()))
{
- XMPNode arrayNode = XMPNodeUtils.findChildNode(currSchema, "xapRights:UsageTerms",
+ XMPNode arrayNode = XMPNodeUtils.findChildNode(currSchema, "xmpRights:UsageTerms",
false);
if (arrayNode != null)
{
@@ -477,7 +477,6 @@ public class XMPNormalizer
cal.set(Calendar.MONTH, binOtherDate.getMonth());
cal.set(Calendar.DAY_OF_MONTH, binOtherDate.getDay());
binGPSStamp = new XMPDateTimeImpl(cal);
-
gpsDateTime.setValue(XMPUtils.convertFromDate (binGPSStamp));
}
catch (XMPException e)
diff --git a/java/XMPCore/src/com/adobe/xmp/impl/XMPSchemaRegistryImpl.java b/java/XMPCore/src/com/adobe/xmp/impl/XMPSchemaRegistryImpl.java
index c6135ca..926bedf 100644
--- a/java/XMPCore/src/com/adobe/xmp/impl/XMPSchemaRegistryImpl.java
+++ b/java/XMPCore/src/com/adobe/xmp/impl/XMPSchemaRegistryImpl.java
@@ -193,10 +193,10 @@ public final class XMPSchemaRegistryImpl implements XMPSchemaRegistry, XMPConst
registerNamespace(NS_X, "x");
registerNamespace(NS_IX, "iX");
- registerNamespace(NS_XMP, "xap");
- registerNamespace(NS_XMP_RIGHTS, "xapRights");
- registerNamespace(NS_XMP_MM, "xapMM");
- registerNamespace(NS_XMP_BJ, "xapBJ");
+ registerNamespace(NS_XMP, "xmp");
+ registerNamespace(NS_XMP_RIGHTS, "xmpRights");
+ registerNamespace(NS_XMP_MM, "xmpMM");
+ registerNamespace(NS_XMP_BJ, "xmpBJ");
registerNamespace(NS_XMP_NOTE, "xmpNote");
registerNamespace(NS_PDF, "pdf");
@@ -218,6 +218,7 @@ public final class XMPSchemaRegistryImpl implements XMPSchemaRegistry, XMPConst
registerNamespace(NS_JP2K, "jp2k");
registerNamespace(NS_CAMERARAW, "crs");
registerNamespace(NS_ADOBESTOCKPHOTO, "bmsp");
+ registerNamespace(NS_CREATOR_ATOM, "creatorAtom");
registerNamespace(NS_ASF, "asf");
registerNamespace(NS_WAV, "wav");
@@ -226,10 +227,10 @@ public final class XMPSchemaRegistryImpl implements XMPSchemaRegistry, XMPConst
registerNamespace(NS_TRANSIENT, "xmpx");
// register Adobe standard type namespaces
- registerNamespace(TYPE_TEXT, "xapT");
- registerNamespace(TYPE_PAGEDFILE, "xapTPg");
- registerNamespace(TYPE_GRAPHICS, "xapG");
- registerNamespace(TYPE_IMAGE, "xapGImg");
+ registerNamespace(TYPE_TEXT, "xmpT");
+ registerNamespace(TYPE_PAGEDFILE, "xmpTPg");
+ registerNamespace(TYPE_GRAPHICS, "xmpG");
+ registerNamespace(TYPE_IMAGE, "xmpGImg");
registerNamespace(TYPE_FONT, "stFNT");
registerNamespace(TYPE_DIMENSIONS, "stDim");
registerNamespace(TYPE_RESOURCEEVENT, "stEvt");
diff --git a/java/XMPCore/src/com/adobe/xmp/impl/XMPUtilsImpl.java b/java/XMPCore/src/com/adobe/xmp/impl/XMPUtilsImpl.java
index 4af9564..d9b86cd 100644
--- a/java/XMPCore/src/com/adobe/xmp/impl/XMPUtilsImpl.java
+++ b/java/XMPCore/src/com/adobe/xmp/impl/XMPUtilsImpl.java
@@ -172,7 +172,10 @@ public class XMPUtilsImpl implements XMPConst
{
ParameterAsserts.assertSchemaNS(schemaNS);
ParameterAsserts.assertArrayName(arrayName);
- ParameterAsserts.assertNotNull(catedStr);
+ if (catedStr == null)
+ {
+ throw new XMPException("Parameter must not be null", XMPError.BADPARAM);
+ }
ParameterAsserts.assertImplementation(xmp);
XMPMetaImpl xmpImpl = (XMPMetaImpl) xmp;
diff --git a/java/XMPCore/src/com/adobe/xmp/version.properties b/java/XMPCore/src/com/adobe/xmp/version.properties
index 0bc14bc..65ae814 100644
--- a/java/XMPCore/src/com/adobe/xmp/version.properties
+++ b/java/XMPCore/src/com/adobe/xmp/version.properties
@@ -7,9 +7,9 @@
# of the Adobe license agreement accompanying it.
# ==================================================================================================
-implementation.version Adobe XMP Core 4.1.1
+implementation.version Adobe XMP Core 4.4.0
implementation.version.major 4
-implementation.version.minor 1
-implementation.version.micro 1
+implementation.version.minor 4
+implementation.version.micro 0
implementation.version.engbuild 0
implementation.version.debug true \ No newline at end of file
diff --git a/java/XMPCoreCoverage/src/samples/XMPCoreCoverage.java b/java/XMPCoreCoverage/src/samples/XMPCoreCoverage.java
index 1f43833..6638076 100644
--- a/java/XMPCoreCoverage/src/samples/XMPCoreCoverage.java
+++ b/java/XMPCoreCoverage/src/samples/XMPCoreCoverage.java
@@ -14,7 +14,6 @@ import java.io.FileOutputStream;
import java.io.PrintStream;
import java.net.URI;
import java.net.URL;
-import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
@@ -46,7 +45,6 @@ import com.adobe.xmp.properties.XMPPropertyInfo;
* It covers most of the functionality of XMPCore,
* but does not provide any meaningful workflow.
*
- * @author smakswit
* @since 11.02.2007
*/
public class XMPCoreCoverage implements XMPCoreCoverageConst
@@ -958,7 +956,7 @@ public class XMPCoreCoverage implements XMPCoreCoverageConst
XMPDateTime date1 = XMPDateTimeFactory.create(2000, 1, 31, 12, 34, 56, -1);
date1.setTimeZone(TimeZone.getTimeZone("PST"));
XMPDateTime date2 = XMPDateTimeFactory.create(0, 0, 0, 0, 0, 0, 0);
- Calendar cal = new GregorianCalendar(2007, 1, 28);
+ GregorianCalendar cal = new GregorianCalendar(2007, 1, 28);
XMPDateTime date3 = XMPDateTimeFactory.createFromCalendar(cal);
XMPDateTime currentDateTime = XMPDateTimeFactory.getCurrentDateTime();
@@ -1070,4 +1068,4 @@ public class XMPCoreCoverage implements XMPCoreCoverageConst
{
println("");
}
-} \ No newline at end of file
+}
diff --git a/java/XMPCoreCoverage/src/samples/XMPCoreCoverageConst.java b/java/XMPCoreCoverage/src/samples/XMPCoreCoverageConst.java
index 2ae2169..e0d46cf 100644
--- a/java/XMPCoreCoverage/src/samples/XMPCoreCoverageConst.java
+++ b/java/XMPCoreCoverage/src/samples/XMPCoreCoverageConst.java
@@ -13,7 +13,6 @@ package samples;
/**
* Constants for the XMPCoreCoverage example.
*
- * @author smakswit
* @since 21.02.2007
*/
public interface XMPCoreCoverageConst
diff --git a/java/readme.txt b/java/readme.txt
index 6c7dca0..3bd3ed7 100644
--- a/java/readme.txt
+++ b/java/readme.txt
@@ -1,39 +1,42 @@
-Adobe XMP Toolkit for Java Version 4.1.1
-========================================
-
-It contains the XMPCore part of the toolkit and NOT XMPFiles.
-To get more information about the "Extensible Metadata Platform" (XMP),
-please visit the XMP product page on the Adobe website (http://www.adobe.com/xmp).
-
-This readme.txt covers the setup of the XMPCore and the example project
-for the Eclipse Java IDE 3.0 and above and Java SDK 1.4.2 and above.
-
-
-Setup the projects in Eclipse 3.2 and above:
-
-1. Start Eclipse with an empty workspace
-2. In the menu select File --> Import...
- --> Existing Projects into Workspace --> Next
-3. Select "Select root directory" and browse for this directory (XMP-SDK/java)
-4. Press <Finish>
-
-
-Setup the projects in Eclipse 3.0.x:
-
-1. Start Eclipse with an empty workspace
-2. In the menu select File --> New --> Project --> Java Project
-3. Enter Project Name "XMPCore"
-4. Select "Create project at external location" and select the folder "XMPCore"
- which you find as sibling of this readme.txt file.
-5. Press <Finish>
-6. To install the example please repeat steps 2. to 5. replacing "XMPCore" by "XMPCoreCoverage"
-
-
-To build debug and release libraries of XMPCore, run the ANT script "build.xml"
-that is contained in the XMPCore project.
-
-Note: If you use Java 1.4.2, please ensure that the class file compliance is set to 1.4
-(default is 1.2). Otherwise the assert statements do not compile.
-To change this setting, open the Preferences dialog and select --> Java --> Compiler:
-Uncheck "Use default compliance settings" and set "Generated .class files compatibility"
-and "Source compatibility" both to 1.4. \ No newline at end of file
+Adobe XMP Toolkit for Java Version 4.4.0
+========================================
+
+For information about the Extensible Metadata Platform (XMP),
+visit the XMP product page on the Adobe website: http://www.adobe.com/xmp.
+
+The Java API contains only the XMPCore part of the XMP Toolkit;
+it does NOT contain the XMPFiles component.
+
+This file contains instructions for installing the XMPCore Java library
+and example project for the Eclipse Java IDE 3.0 and higher,
+and Java SDK 1.4.2 to 1.5. The Java SDK 1.6 is not currently supported.
+
+
+To set up the projects in Eclipse 3.2 and higher:
+
+1. Start Eclipse with an empty workspace
+2. Choose File > Import.
+3. In the Wizard, choose Existing Projects into Workspace > Next
+3. Click "Select root directory" and browse for the folder XMP-Toolkit-SDK-4.4.0/java
+4. Click Finish.
+
+
+To set up the projects in Eclipse 3.0.x:
+
+1. Start Eclipse with an empty workspace
+2. Choose File > New > Project > Java Project
+3. Enter the Project Name "XMPCore"
+4. Click "Create project at external location" and select the folder "XMPCore"
+ (in the folder that contains this readme.txt file).
+5. Click Finish.
+6. To install the example, repeat steps 2 to 5, replacing "XMPCore" with "XMPCoreCoverage"
+
+
+To build debug and release libraries of XMPCore, run the ANT script "build.xml"
+that is contained in the XMPCore project.
+
+Note: If you use Java 1.4.2, make sure that the class file compliance is set to 1.4.
+Otherwise, the assert statements do not compile. To change this setting:
+1. Open the Preferences dialog and select Java > Compiler.
+2. Uncheck "Use default compliance settings"
+3. Set both "Generated .class files compatibility" and "Source compatibility" to 1.4.
diff --git a/public/include/TXMPFiles.hpp b/public/include/TXMPFiles.hpp
index 499dfb9..00c0b7d 100644
--- a/public/include/TXMPFiles.hpp
+++ b/public/include/TXMPFiles.hpp
@@ -14,393 +14,610 @@
// of the Adobe license agreement accompanying it.
// =================================================================================================
-// ================================================================================================
+// =================================================================================================
/// \file TXMPFiles.hpp
-/// \brief API for access to the "main" metadata in a file.
+/// \brief API for access to the main (document-level) metadata in a file_.
///
-/// \c TXMPFiles provides the API for the Adobe XMP Toolkit's File Handler component. This provides
-/// convenient access to the main, or document level, XMP for a file. The File Handler supports file
-/// I/O, the XMP Toolkit Core supports manipulation of the XMP properties. The File Handler is
-/// intended to eventually have smart, efficient support for all file formats for which the means to
-/// embed XMP is defined in the XMP Specification. Where possible this support will allow injection
-/// of XMP where none currently exists, expansion of XMP without regard to existing padding, and
-/// reconciliation of the XMP and other legacy forms of metadata.
+/// The Adobe XMP Toolkit's file handling component, XMPFiles, is a front end to a set of
+/// format-specific file handlers that support file I/O for XMP. The file handlers implement smart,
+/// efficient support for those file formats for which the means to embed XMP is defined in the XMP
+/// Specification. Where possible, this support allows:
+/// \li Injection of XMP where none currently exists
+/// \li Expansion of XMP without regard to existing padding
+/// \li Reconciliation of the XMP and other legacy forms of metadata.
///
-///\c TXMPFiles is designed for use by clients interested in the metadata and not in the primary file
-/// content. The Adobe Bridge application is a typical example. \c TXMPFiles is not intended to be
-/// particulary appropriate for files authored by an application. I.e. those files for which the
+/// \c TXMPFiles is designed for use by clients interested in the metadata and not in the primary
+/// file content; the Adobe Bridge application is a typical example. \c TXMPFiles is not intended to
+/// be appropriate for files authored by an application; that is, those files for which the
/// application has explicit knowledge of the file format.
-// ================================================================================================
+// =================================================================================================
+
-// ================================================================================================
+// =================================================================================================
/// \class TXMPFiles TXMPFiles.hpp
-/// \brief API for access to the "main" metadata in a file.
+/// \brief API for access to the main (document-level) metadata in a file.
+///
+/// \c TXMPFiles is a template class that provides the API for the Adobe XMP Toolkit's XMPFiles
+/// component. This provides convenient access to the main, or document level, XMP for a file. Use
+/// it to obtain metadata from a file, which you can then manipulate with the XMP Core component
+/// (the classes \c TXMPMeta, \c TXMPUtils, and \c TXMPIterator); and to write new or changed
+/// metadata back out to a file.
///
-/// \c TXMPFiles provides the API for the Adobe XMP Toolkit's File Handler component. This provides
-/// convenient access to the main, or document level, XMP for a file. The general model is to open
-/// a file, read and write the metadata, then close the file. While open, portions of the file
-/// might be maintained in RAM data structures. Memory usage can vary considerably depending on
-/// file format and access options. The file may be opened for read-only or read-write access, with
-/// typical exclusion for both modes.
+/// The functions allow you to open a file, read and write the metadata, then close the file.
+/// While open, portions of the file might be maintained in RAM data structures. Memory
+/// usage can vary considerably depending onfile format and access options.
///
-/// Errors result in the throw of an \c XMPError exception.
+/// A file can be opened for read-only or read-write access, with typical exclusion for both
+/// modes. Errors result in the throw of an \c XMPError exception.
///
-/// The template is instantiated with a string object class. This allows a clean implementation
-/// that provides two major benefits: output string storage is fully owned by the client and access
-/// is fully thread safe. The template parameter, class \c tStringObj, is described in the XMP.hpp
-/// umbrella header.
+/// \c TXMPFiles is the template class. It must be instantiated with a string class such as
+/// \c std::string. Read the Toolkit Overview for information about the overall architecture of the XMP
+/// API, and the documentation for \c XMP.hpp for specific instantiation instructions.
///
-/// To use TXMPFiles define TXMP_STRING_TYPE and XMP_INCLUDE_XMPFILES, then include the XMP.hpp
-/// umbrella header:
-/// \code
-/// #define TXMP_STRING_TYPE std::string
-/// #define XMP_INCLUDE_XMPFILES 1
-/// #include "XMP.hpp"
-/// \endcode
-// ================================================================================================
+/// Access these functions through the concrete class, \c SXMPFiles.
+// =================================================================================================
+
template <class tStringObj>
class TXMPFiles {
public:
-
- // ============================================================================================
+
+ // =============================================================================================
/// \name Initialization and termination
/// @{
- /// \c SXMPFiles must be initialized before use and may be terminated when done.
+ ///
+ /// A \c TXMPFiles object must be initialized before use and can be terminated when done.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetVersionInfo() retrieves version information for the XMPFiles component.
+ ///
+ /// Can be called before \c #Initialize(). This function is static; make the call directly from
+ /// the concrete class (\c SXMPFiles).
+ ///
+ /// @param versionInfo [out] A buffer in which to return the version information.
static void GetVersionInfo ( XMP_VersionInfo * versionInfo );
- /// \brief \c Initialize must be called before using \c SXMPFiles. It returns a Boolean
- /// success/failure value.
-
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Initializes the XMPFiles library; must be called before creating an \c SXMPFiles object.
+ ///
+ /// The main action is to activate the available smart file handlers. Must be called before
+ /// using any methods except \c GetVersionInfo().
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPFiles).
+ ///
+ /// @return True on success.
+
static bool Initialize();
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Initializes the XMPFiles library; must be called before creating an \c SXMPFiles object.
+ ///
+ /// This overload of TXMPFiles::Initialize() accepts option bits to customize the initialization
+ /// actions. At this time only one option is defined, \c kXMPFiles_NoQuickTimeInit. This option
+ /// prevents calling the QuickTime initialization on Windows, which can be slow. The MOV file
+ /// handler on Windows uses Apple's QuickTime SDK for the actual file I/O.
+ ///
+ /// The main action is to activate the available smart file handlers. Must be called before
+ /// using any methods except \c GetVersionInfo().
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPFiles).
+ ///
+ /// @param options Option flags to control the initialization actions.
+ ///
+ /// @return True on success.
+
static bool Initialize ( XMP_OptionBits options );
- /// \brief \c Terminate may be called when done using \c SXMPFiles. It deallocates global data
- /// structures created by \c Initialize.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Terminates use of the XMPFiles library.
+ ///
+ /// Optional. Deallocates global data structures created by intialization. Its main action is to
+ /// deallocate heap-allocated global storage, for the benefit of client leak checkers.
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPFiles).
static void Terminate();
/// @}
- // ============================================================================================
+ // =============================================================================================
/// \name Constructors and destructor
/// @{
+ ///
/// The default constructor initializes an object that is associated with no file. The alternate
- /// constructors call OpenFile. The destructor automatically calls CloseFile if necessary.
-
- /// \brief The default constructor initializes an object that is associated with no file.
-
+ /// constructors call \c OpenFile().
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Default constructor initializes an object that is associated with no file.
+
TXMPFiles();
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Destructor; typical virtual destructor.
+ ///
+ /// The destructor does not call \c CloseFile(); pending updates are lost when the destructor is run.
+ ///
+ /// @see \c OpenFile(), \c CloseFile()
+
virtual ~TXMPFiles() throw();
- /// \brief These alternate constructors call \c OpenFile. The second form is a trivial overload
- /// that calls the first form passing \c filePath.c_str().
-
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Alternate constructor associates the new \c XMPFiles object with a specific file.
+ ///
+ /// Calls \c OpenFile() to open the specified file after performing a default construct.
+ ///
+ /// @param filePath The path for the file, specified as a nul-terminated UTF-8 string.
+ ///
+ /// @param format A format hint for the file, if known.
+ ///
+ /// @param openFlags Options for how the file is to be opened (for read or read/write, for
+ /// example). Use a logical OR of these bit-flag constants:
+ ///
+ /// \li \c #kXMPFiles_OpenForRead
+ /// \li \c #kXMPFiles_OpenForUpdate
+ /// \li \c #kXMPFiles_OpenOnlyXMP
+ /// \li \c #kXMPFiles_OpenCacheTNail
+ /// \li \c #kXMPFiles_OpenStrictly
+ /// \li \c #kXMPFiles_OpenUseSmartHandler
+ /// \li \c #kXMPFiles_OpenUsePacketScanning
+ /// \li \c #kXMPFiles_OpenLimitedScanning
+ /// \li \c #kXMPFiles_OpenInBackground
+ ///
+ /// @return The new \c TXMPFiles object.
+
TXMPFiles ( XMP_StringPtr filePath,
XMP_FileFormat format = kXMP_UnknownFile,
XMP_OptionBits openFlags = 0 );
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Alternate constructor associates the new \c XMPFiles object with a specific file,
+ /// using a string object.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object
+ /// for the file path. It is otherwise identical; see details in the canonical form.
+
TXMPFiles ( const tStringObj & filePath,
XMP_FileFormat format = kXMP_UnknownFile,
XMP_OptionBits openFlags = 0 );
- /// \brief The copy constructor and assignment operator increment an internal reference count,
- /// they do not perform a deep copy.
-
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Copy constructor
+ ///
+ /// Increments an internal reference count but does not perform a deep copy.
+ ///
+ /// @param original The existing \c TXMPFiles object to copy.
+ ///
+ /// @return The new \c TXMPFiles object.
+
TXMPFiles ( const TXMPFiles<tStringObj> & original );
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Assignment operator
+ ///
+ /// Increments an internal reference count but does not perform a deep copy.
+ ///
+ /// @param rhs The existing \c TXMPFiles object.
+
void operator= ( const TXMPFiles<tStringObj> & rhs );
- /// \brief The "ref" constructor and \c GetInternalRef serve the same purpose as their analogs
- /// in SXMPMeta, safely passing \c SXMPFiles references across DLL boundaries where the clients
- /// might have used different string types when instantiating \c TXMPFiles.
-
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Reconstructs a \c TXMPFiles object from an internal reference.
+ ///
+ /// This constructor creates a new \c TXMPFiles object that refers to the underlying reference
+ /// object of an existing \c TXMPFiles object. Use to safely pass \c SXMPFiles references across
+ /// DLL boundaries.
+ ///
+ /// @param xmpFilesObj The underlying reference object, obtained from some other XMP object
+ /// with \c TXMPFiles::GetInternalRef().
+ ///
+ /// @return The new object.
+
TXMPFiles ( XMPFilesRef xmpFilesObj );
-
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief GetInternalRef() retrieves an internal reference that can be safely passed across DLL
+ /// boundaries and reconstructed.
+ ///
+ /// Use with the reconstruction constructor to safely pass \c SXMPFiles references across DLL
+ /// boundaries where the clients might have used different string types when instantiating
+ /// \c TXMPFiles.
+ ///
+ /// @return The internal reference.
+ ///
+ /// @see \c TXMPMeta::GetInternalRef() for usage.
+
XMPFilesRef GetInternalRef();
/// @}
-
- // ============================================================================================
- /// \name Static Functions
+
+ // =============================================================================================
+ /// \name File handler information
/// @{
-
- // --------------------------------------------------------------------------------------------
- /// \brief Determine the supported features for a given file format.
///
- /// The supported features can vary quite a bit among file formats, depending on both the
- /// general capabilities of the format and the implementation of the handler for that format.
+ /// Call this static function from the concrete class, \c SXMPFiles, to obtain information about
+ /// the file handlers for the XMPFiles component.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief GetFormatInfo() reports what features are supported for a specific file format.
+ ///
+ /// The file handlers for different file formats vary considerably in what features they
+ /// support. Support depends on both the general capabilities of the format and the
+ /// implementation of the handler for that format.
///
- /// \param format The format whose support flags are desired.
+ ///This function is static; make the call directly from the concrete class (\c SXMPFiles).
///
- /// \param handlerFlags A set of option bits showing the support for this format:
+ /// @param format The file format whose support flags are desired.
///
- /// \li kXMPFiles_CanInjectXMP - Can inject first-time XMP into an existing file.
- /// \li kXMPFiles_CanExpand - Can expand XMP or other metadata in an existing file.
- /// \li kXMPFiles_CanRewrite - Can copy one file to another, writing new metadata.
- /// \li kXMPFiles_CanReconcile - Supports reconciliation between XMP and other forms.
- /// \li kXMPFiles_AllowsOnlyXMP - Allows access to just the XMP, ignoring other forms.
- /// \li kXMPFiles_ReturnsRawPacket - File handler returns raw XMP packet information and string.
- /// \li kXMPFiles_ReturnsTNail - File handler returns native thumbnail information.
+ /// @param handlerFlags [out] A buffer in which to return a logical OR of option bit flags.
+ /// The following constants are defined:
///
- /// The kXMPFiles_AllowsOnlyXMP flag is only meaningful if kXMPFiles_CanReconcile is set.
+ /// \li \c #kXMPFiles_CanInjectXMP - Can inject first-time XMP into an existing file.
+ /// \li \c #kXMPFiles_CanExpand - Can expand XMP or other metadata in an existing file.
+ /// \li \c #kXMPFiles_CanRewrite - Can copy one file to another, writing new metadata (as in SaveAs)
+ /// \li \c #kXMPFiles_CanReconcile - Supports reconciliation between XMP and other forms.
+ /// \li \c #kXMPFiles_AllowsOnlyXMP - Allows access to just the XMP, ignoring other forms.
+ /// This is only meaningful if \c #kXMPFiles_CanReconcile is set.
+ /// \li \c #kXMPFiles_ReturnsTNail - File handler returns native thumbnail information.
+ /// \li \c #kXMPFiles_ReturnsRawPacket - File handler returns raw XMP packet information and string.
///
- /// If kXMPFiles_ReturnsRawPacket is set, the returned packet information might have an offset
- /// of -1 to indicate an unknown offset. While all file handlers should be able to return the
- /// raw packet, some might not know the offset of the packet within the file. This is typical
- /// in cases where external libraries are used. These cases might not even allow return of the
- /// raw packet.
+ /// Even if \c #kXMPFiles_ReturnsRawPacket is set, the returned packet information might have an
+ /// offset of -1 to indicate an unknown offset. While all file handlers should be able to return
+ /// the raw packet, some might not know the offset of the packet within the file. This is
+ /// typical in cases where external libraries are used. These cases might not even allow return
+ /// of the raw packet.
///
- /// \result Returns true if the format has explicit "smart" support. Returns false if the format
- /// is handled by the default packet scanning plus heuristics.
-
+ /// @return True if the format has explicit "smart" support, false if the format is handled by
+ /// the default packet scanning plus heuristics. */
+
+
static bool GetFormatInfo ( XMP_FileFormat format,
XMP_OptionBits * handlerFlags = 0 );
/// @}
-
- // ============================================================================================
- /// \name OpenFile, CloseFile, and related file-oriented operations
+
+ // =============================================================================================
+ /// \name File operations
/// @{
-
- // --------------------------------------------------------------------------------------------
- /// \brief Open a file for metadata access.
+ ///
+ /// These functions allow you to open, close, and query files.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CheckFileFormat() tries to determine the format of a file.
+ ///
+ /// \c CheckFileFormat tries to determine the format of a file, returning an XMP_FileFormat value.
+ /// It uses the same logic as \c OpenFile will use to select a smart handler.
+ ///
+ /// @param filePath The path for the file, appropriate for the local operating system. Passed as
+ /// a nul-terminated UTF-8 string. The path is the same as would be passed to \c OpenFile.
+ ///
+ /// @return The file's format if a smart handler would be selected, otherwise \c kXMP_UnknownFile.
+
+ static XMP_FileFormat CheckFileFormat ( XMP_StringPtr filePath );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CheckPackageFormat() tries to determine the format of a "package" folder.
+ ///
+ /// \c CheckPackageFormat tries to determine the format of a "package" given the name of the top
+ /// level folder, returning an XMP_FileFormat value. Examples of recognized packages include the
+ /// video formats P2, XDCAM, or Sony HDV. These packages contain collections of "clips", stored
+ /// as multiple files in specific subfolders.
+ ///
+ /// @param folderPath The path for the top level folder, appropriate for the local operating
+ /// system. Passed as a nul-terminated UTF-8 string. The path is not the same as would be passed
+ /// to \c OpenFile. For example the path passed to \c CheckPackageFormat might be ".../MyMovie",
+ /// while the path passed to \c OpenFile would be ".../MyMovie/SomeClip".
+ ///
+ /// @return The package's format if a smart handler would be selected, otherwise \c kXMP_UnknownFile.
+
+ static XMP_FileFormat CheckPackageFormat ( XMP_StringPtr folderPath );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c OpenFile() opens a file for metadata access.
///
/// Opens a file for the requested forms of metadata access. Opening the file at a minimum
/// causes the raw XMP packet to be read from the file. If the file handler supports legacy
- /// metadata reconciliation then legacy metadata will also be read, unless kXMPFiles_OpenOnlyXMP
- /// is passed. If the file handler supports native thumbnails and kXMPFiles_OpenCacheTNail is
- /// passed then the native thumbnail will also be cached.
- ///
- /// If the file is opened for read-only access (passing kXMPFiles_OpenForRead), then the disk
- /// file itself will be closed after reading the data from it. The XMPFiles object will not be
- /// "closed" though, it is still necessary to call CloseFile when finished using it. Other
- /// methods (GetXMP, etc.) can only be used between the OpenFile and CloseFile calls. The XMPFiles
- /// destructor will not call CloseFile, any pending updates will be lost.
- ///
- /// If the file is opened for update (passing kXMPFiles_OpenForUpdate), then the disk file remains
- /// open until CloseFile is called. The disk file is only updated once, when Close file is called,
- /// no matter how many calls are made to PutXMP.
- ///
- /// Ideally the XMP is not parsed and legacy reconciliation is not performed until GetXMP is
- /// called. This is not guaranteed though, specific file handlers might do earlier parsing of
- /// the XMP. This delayed parsing and the early disk file close for read-only access are
- /// optimizations to help clients implementing file browsers. They can access the file briefly
+ /// metadata reconciliation then legacy metadata is also read, unless \c #kXMPFiles_OpenOnlyXMP
+ /// is passed. If the file handler supports native thumbnails and \c #kXMPFiles_OpenCacheTNail
+ /// is passed, the native thumbnail is cached.
+ ///
+ /// If the file is opened for read-only access (passing \c #kXMPFiles_OpenForRead), the disk
+ /// file is closed immediately after reading the data from it; the \c XMPFiles object, however,
+ /// remains in the open state. You must call \c CloseFile() when finished using it. Other
+ /// methods, such as \c GetXMP(), can only be used between the \c OpenFile() and \c CloseFile()
+ /// calls. The \c XMPFiles destructor does not call \c CloseFile(); if you call it without
+ /// closing, any pending updates are lost.
+ ///
+ /// If the file is opened for update (passing \c #kXMPFiles_OpenForUpdate), the disk file
+ /// remains open until \c CloseFile() is called. The disk file is only updated once, when
+ /// \c CloseFile() is called, regardless of how many calls are made to \c PutXMP().
+ ///
+ /// Typically, the XMP is not parsed and legacy reconciliation is not performed until \c GetXMP()
+ /// is called, but this is not guaranteed. Specific file handlers might do earlier parsing of
+ /// the XMP. Delayed parsing and early disk file close for read-only access are optimizations
+ /// to help clients implementing file browsers, so that they can access the file briefly
/// and possibly display a thumbnail, then postpone more expensive XMP processing until later.
///
- /// \param filePath The UTF-8 path for the file, appropriate for the local OS. Overloads are
- /// declared to pass the path as either a "const char *" or a string object.
- ///
- /// \param format The format of the file. If the format is unknown pass \c kXMP_UnknownFile and
- /// the format will be determined from the file content. The first handler to check will be
- /// guessed from the file's extension. Passing any other format value is generally just a hint
- /// about what file handler to try first (instead of the one based on the extension). If the
- /// kXMPFiles_OpenStrictly is set, then any format other than kXMP_UnknownFile requires that the
- /// file actually be that format, an exception is thrown if not.
- ///
- /// \param openFlags A set of option bits describing the desired access. By default (zero) the
- /// file is opened for read-only access and the format handler decides on the level of
- /// reconciliation that will be performed. By default a best effort will be made to locate the
- /// correct XMP and to reconcile XMP with other forms (if reconciliation is done). The option
- /// \c kXMPFiles_OpenStrictly may be used to force more strict rules, resulting is exceptions for
- /// errors. The definition of strictness is specific to each handler, there may be no difference.
- ///
- /// The defined openFlag bits are:
- ///
- /// \li kXMPFiles_OpenForRead - Open for read-only access.
- /// \li kXMPFiles_OpenForUpdate - Open for reading and writing.
- /// \li kXMPFiles_OpenOnlyXMP - Only the XMP is wanted, no reconciliation.
- /// \li kXMPFiles_OpenCacheTNail - Cache thumbnail if possible, GetThumbnail will be called.
- /// \li kXMPFiles_OpenStrictly - Be strict about locating XMP and reconciling with other forms.
- /// \li kXMPFiles_OpenUseSmartHandler - Require the use of a smart handler.
- /// \li kXMPFiles_OpenUsePacketScanning - Force packet scanning, don't use a smart handler.
- ///
- /// \result Returns true if the file is succesfully opened and attached to a file handler.
- /// Returns false for "anticipated" problems, e.g. passing kXMPFiles_OpenUseSmartHandler but not
- /// having an appropriate smart handler. Throws an exception for serious problems.
+ /// @param filePath The path for the file, appropriate for the local operating system. Passed as
+ /// a nul-terminated UTF-8 string.
+ ///
+ /// @param format The format of the file. If the format is unknown (\c #kXMP_UnknownFile) the
+ /// format is determined from the file content. The first handler to check is guessed from the
+ /// file's extension. Passing a specific format value is generally just a hint about what file
+ /// handler to try first (instead of the one based on the extension). If
+ /// \c #kXMPFiles_OpenStrictly is set, then any format other than \c #kXMP_UnknownFile requires
+ /// that the file actually be that format; otherwise an exception is thrown.
+ ///
+ /// @param openFlags A set of option flags that describe the desired access. By default (zero)
+ /// the file is opened for read-only access and the format handler decides on the level of
+ /// reconciliation that will be performed. A logical OR of these bit-flag constants:
+ ///
+ /// \li \c #kXMPFiles_OpenForRead - Open for read-only access.
+ /// \li \c #kXMPFiles_OpenForUpdate - Open for reading and writing.
+ /// \li \c #kXMPFiles_OpenOnlyXMP - Only the XMP is wanted, no reconciliation.
+ /// \li \c #kXMPFiles_OpenCacheTNail - Cache thumbnail if possible, GetThumbnail will be called.
+ /// \li \c #kXMPFiles_OpenStrictly - Be strict about locating XMP and reconciling with other
+ /// forms. By default, a best effort is made to locate the correct XMP and to reconcile XMP
+ /// with other forms (if reconciliation is done). This option forces stricter rules, resulting
+ /// in exceptions for errors. The definition of strictness is specific to each handler, there
+ /// might be no difference.
+ /// \li \c #kXMPFiles_OpenUseSmartHandler - Require the use of a smart handler.
+ /// \li \c #kXMPFiles_OpenUsePacketScanning - Force packet scanning, do not use a smart handler.
+ ///
+ /// @return True if the file is succesfully opened and attached to a file handler. False for
+ /// anticipated problems, such as passing \c #kXMPFiles_OpenUseSmartHandler but not having an
+ /// appropriate smart handler. Throws an exception for serious problems.
+
bool OpenFile ( XMP_StringPtr filePath,
XMP_FileFormat format = kXMP_UnknownFile,
XMP_OptionBits openFlags = 0 );
-
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c OpenFile() opens a file for metadata access, using a string object
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object
+ /// for the file path. It is otherwise identical; see details in the canonical form.
+
bool OpenFile ( const tStringObj & filePath,
XMP_FileFormat format = kXMP_UnknownFile,
XMP_OptionBits openFlags = 0 );
- // --------------------------------------------------------------------------------------------
- /// \brief Close an opened file.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief CloseFile() explicitly closes an opened file.
///
/// Performs any necessary output to the file and closes it. Files that are opened for update
/// are written to only when closing.
///
- /// \param closeFlags A set of bit flags for optional closing actions.
+ /// If the file is opened for read-only access (passing \c #kXMPFiles_OpenForRead), the disk
+ /// file is closed immediately after reading the data from it; the \c XMPFiles object, however,
+ /// remains in the open state. You must call \c CloseFile() when finished using it. Other
+ /// methods, such as \c GetXMP(), can only be used between the \c OpenFile() and \c CloseFile()
+ /// calls. The \c XMPFiles destructor does not call \c CloseFile(); if you call it without closing,
+ /// any pending updates are lost.
///
- /// The defined closeFlags bits are:
+ /// If the file is opened for update (passing \c #kXMPFiles_OpenForUpdate), the disk file remains
+ /// open until \c CloseFile() is called. The disk file is only updated once, when \c CloseFile()
+ /// is called, regardless of how many calls are made to \c PutXMP().
///
- /// \li kXMPFiles_UpdateSafely - Write into a temporary file then swap for crash safety.
-
- void CloseFile ( XMP_OptionBits closeFlags = 0 );
-
- // --------------------------------------------------------------------------------------------
- /// \brief Get basic information about an opened file.
+ /// @param closeFlags Option flags for optional closing actions. This bit-flag constant is
+ /// defined:
///
- /// \param filePath If not null, returns the path passed to OpenFile.
+ /// \li \c #kXMPFiles_UpdateSafely - Write into a temporary file then swap for crash safety.
+
+ void CloseFile ( XMP_OptionBits closeFlags = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetFileInfo() retrieves basic information about an opened file.
///
- /// \param openFlags If not null, returns the flags passed to OpenFile.
+ /// @param filePath [out] A buffer in which to return the path passed to \c OpenFile(). Can be
+ /// null if value is not wanted.
///
- /// \param format If not null, returns the format of the file.
+ /// @param openFlags [out] A buffer in which to return the option flags passed to
+ /// \c OpenFile(). Can be null if value is not wanted.
///
- /// \param handlerFlags If not null, returns the handler's capability flags.
+ /// @param format [out] A buffer in which to return the file format. Can be null if value is not
+ /// wanted.
+ /// @param handlerFlags [out] A buffer in which to return the handler's capability flags. Can
+ /// be null if value is not wanted.
///
- /// \result Returns true if a file is opened, false otherwise. This notion of "open" really means
- /// that OpenFile has been called but CloseFile has not. The actual disk file might be closed in
- /// the host file system sense, as explained for OpenFile.
-
+ /// @return True if the file object is in the open state; that is, \c OpenFile() has been called
+ /// but \c CloseFile() has not. False otherwise. Even if the file object is open, the actual
+ /// disk file might be closed in the host file-system sense; see \c OpenFile().
+
bool GetFileInfo ( tStringObj * filePath = 0,
XMP_OptionBits * openFlags = 0,
XMP_FileFormat * format = 0,
XMP_OptionBits * handlerFlags = 0 );
-
- // --------------------------------------------------------------------------------------------
- /// \brief Set the callback function used to check for a user signaled abort.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetAbortProc() registers a callback function used to check for a user-signaled abort.
///
- /// \param abortProc The callback function used to check for a user signaled abort. It will be
- /// called periodically to allow an abort of time consuming operations. The abort results in an
- /// exception being thrown. The callback function should return true to signal an abort.
+ /// The specified procedure is called periodically to allow a user to cancel time-consuming
+ /// operations. The callback function should return true to signal an abort, which results in an
+ /// exception being thrown.
///
- /// \param abortArg An argument passed to the callback function.
+ /// @param abortProc The callback function.
+ ///
+ /// @param abortArg A pointer to caller-defined data to pass to the callback function.
void SetAbortProc ( XMP_AbortProc abortProc,
void * abortArg );
/// @}
-
- // ============================================================================================
- /// \name Metadata Access Functions
+
+ // =============================================================================================
+ /// \name Accessing metadata
/// @{
-
- // --------------------------------------------------------------------------------------------
- /// \brief Obtain the XMP.
- ///
- /// \c GetXMP is used to obtain the parsed XMP, and/or the raw XMP packet, and/or information
- /// about the raw XMP packet. If all parameters are null it simply tells if XMP is present or
- /// not. The options provided when the file was opened determine if reconciliation is done with
- /// other forms of metadata.
- ///
- /// \param xmpObj If not null, returns the parsed XMP.
- ///
- /// \param xmpPacket If not null, returns the raw XMP packet as stored in the file. The encoding
- /// of the packet is given in the packetInfo. The string will be empty if the low level file
- /// handler does not provide the raw packet.
- ///
- /// \param packetInfo If not null, returns the location and form of the raw XMP in the file. The
- /// charForm and writeable flag reflect the raw XMP in the file. The parsed XMP property values
- /// are always UTF-8. The writeable flag is taken from the packet trailer, it is only relevant
- /// for "format ignorant" writing.
- ///
- /// \note The packetInfo struct always reflects the state of the XMP in the file. The offset,
- /// length, and character form will not change as a result of calling \c PutXMP unless the file
- /// is also written.
///
- /// \note Some file handlers might not return location or contents of the raw packet string.
- /// Check the \c kXMPFiles_ReturnsRawPacket bit returned by GetFormatInfo if you depend on this.
- /// If the low level file handler does not provide the raw packet location then the offset and
- /// length will both be 0, the charForm will be UTF-8, and the writeable flag will be false.
- ///
- /// \result Returns true if the file has XMP, false otherwise.
-
+ /// These functions allow you to retrieve XMP metadata from open files, so that you can use the
+ /// \c TXMPMeta API to manipulate it. The \c PutXMP() functions update the XMP packet in memory.
+ /// Changed XMP is not actually written out to the file until the file is closed.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetXMP() retrieves the XMP metadata from an open file.
+ ///
+ /// The function reports whether XMP is present in the file; you can choose to retrieve any or
+ /// all of the parsed XMP, the raw XMP packet,or information about the raw XMP packet. The
+ /// options provided when the file was opened determine if reconciliation is done with other
+ /// forms of metadata.
+ ///
+ /// @param xmpObj [out] An XMP object in which to return the parsed XMP metadata. Can be null.
+ ///
+ /// @param xmpPacket [out] An string object in which to return the raw XMP packet as stored in
+ /// the file. Can be null. The encoding of the packet is given in the \c packetInfo. Returns an
+ /// empty string if the low level file handler does not provide the raw packet.
+ ///
+ /// @param packetInfo [out] An string object in which to return the location and form of the raw
+ /// XMP in the file. \c #XMP_PacketInfo::charForm and \c #XMP_PacketInfo::writeable reflect the
+ /// raw XMP in the file. The parsed XMP property values are always UTF-8. The writeable flag is
+ /// taken from the packet trailer; it applies only to "format ignorant" writing. The
+ /// \c #XMP_PacketInfo structure always reflects the state of the XMP in the file. The offset,
+ /// length, and character form do not change as a result of calling \c PutXMP() unless the file
+ /// is also written. Some file handlers might not return location or contents of the raw packet
+ /// string. To determine whether one does, check the \c #kXMPFiles_ReturnsRawPacket bit returned
+ /// by \c GetFormatInfo(). If the low-level file handler does not provide the raw packet
+ /// location, \c #XMP_PacketInfo::offset and \c #XMP_PacketInfo::length are both 0,
+ /// \c #XMP_PacketInfo::charForm is UTF-8, and \c #XMP_PacketInfo::writeable is false.
+ ///
+ /// @return True if the file has XMP, false otherwise.
+
bool GetXMP ( SXMPMeta * xmpObj = 0,
tStringObj * xmpPacket = 0,
XMP_PacketInfo * packetInfo = 0 );
-
- // --------------------------------------------------------------------------------------------
- /// \brief Obtain the native thumbnail.
- ///
- /// \c GetThumbnail is used to obtain native thumbnail information, if the associated file
- /// handler supports that and the thumbnail was cached by OpenFile. This requires that
- /// kXMPFiles_OpenCacheTNail be passed to OpenFile. The tnailInfo output pointer can be null,
- /// in which case GetThumbnail will simply tell if a recognized native thumbnail is present.
- ///
- /// \param tnailInfo If not null, returns information about a recognized native thumbnail, and
- /// some related information about the primary image if appropriate.
- ///
- /// \note The returned thumbnail information can be incomplete. What gets returned can depend on
- /// the file format, the file handler's capabilities, and the specific file content.
- ///
- /// \li The fullHeight, fullWIdth, and fullOrientation fields are only meaningful for image files.
- /// They are not meaningful for multi-page files such as PDF or InDesign, for dynamic audio or
- /// video files, etc. The fields will be zero if not meaningful or not determined.
- ///
- /// \li The tnailImage and tnailSize fields might be zero even if a "recognized" thumbnail is
- /// present. Being recognized means only that the handler has determined that the file does
- /// contain a native thumbnail. The thumbnail data might be of a format that the file handler
- /// cannot (or does not) return a single contiguous block of thumbnail data. A possible case of
- /// this is a TIFF uncompressed thumbnail, the handler might not have logic to gather the various
- /// disjoint pieces of the thumbnail from the overall TIFF stream.
- ///
- /// \result Returns true if a recognized native thumbnail is presentand the thumbnail was
- /// cached by OpenFile. This requires that kXMPFiles_OpenCacheTNail be passed to OpenFile. Note
- /// that GetThumbnail can return true but still not return an actual thumbnail image, see the
- /// above note.
-
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetThumbnail() retrieves the native thumbnail from an open file.
+ ///
+ /// Use this function to obtain native thumbnail information, if the associated file handler
+ /// supports that and the thumbnail was cached by the call to \c OpenFile(); that is, the
+ /// \c #kXMPFiles_OpenCacheTNail option flag was set. The return value reports whether a thumbnail
+ /// is present in the file.
+ ///
+ /// The returned thumbnail information can be incomplete, depending on the file format, the file
+ /// handler's capabilities, and the specific file content.
+ ///
+ /// \li The \c #XMP_ThumbnailInfo::fullWidth, \c fullHeight, and \c fullOrientation fields are
+ /// only meaningful for image files. They are not meaningful for multi-page files such as PDF
+ /// or InDesign, for dynamic audio or video files, and so on. The field values are zero if not
+ /// meaningful or not determined.
+ /// \li The \c #XMP_ThumbnailInfo::tnailImage and \c #XMP_ThumbnailInfo::tnailSize fields
+ /// might be zero even if a recognized thumbnail is present.
+ ///
+ /// Being recognized means only that the handler has determined that the file does contain a
+ /// native thumbnail. The thumbnail data might be of a format that the file handler cannot
+ /// return as a single contiguous block of thumbnail data. For example, for a TIFF uncompressed
+ /// thumbnail, the handler might not have logic to gather the various disjoint pieces of the
+ /// thumbnail from the overall TIFF stream.
+ ///
+ /// @param tnailInfo [out] Optional. A buffer in which to return information about a recognized
+ /// native thumbnail, and related information about the primary image if appropriate. Can be
+ /// null if the information is not desired.
+ ///
+ /// @return True if a recognized native thumbnail is present and the thumbnail was cached by the
+ /// call to \c OpenFile(); that is, the \c #kXMPFiles_OpenCacheTNail option flag was set. Can
+ /// return true even if the function cannot retrieve the actual thumbnail image.
+
bool GetThumbnail ( XMP_ThumbnailInfo * tnailInfo );
-
- // --------------------------------------------------------------------------------------------
- /// \brief Update the XMP.
- ///
- /// \c PutXMP supplies new XMP for the file. However, the file is not actully written until
- /// closed. The options provided when the file was opened determine if reconciliation is done
- /// with other forms of metadata. Overloads are provided to pass the XMP as an XMP
- /// object, a string object, or a "const char *" plus length.
-
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c PutXMP() updates the XMP metadata in this object without writing out the file.
+ ///
+ /// This function supplies new XMP for the file. However, the disk file is not written until the
+ /// object is closed with \c CloseFile(). The options provided when the file was opened
+ /// determine if reconciliation is done with other forms of metadata.
+ ///
+ /// @param xmpObj The new metadata as an XMP object.
+
void PutXMP ( const SXMPMeta & xmpObj );
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c PutXMP() updates the XMP metadata in this object without writing out the file,
+ /// using a string object for input.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass the metadata as a string object
+ /// instead of an XMP object. It is otherwise identical; see details in the canonical form.
+ ///
+ /// @param xmpPacket The new metadata as a string object containing a complete XMP packet.
+
void PutXMP ( const tStringObj & xmpPacket );
-
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c PutXMP() updates the XMP metadata in this object without writing out the file,
+ /// using a string object and optional length.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass the metadata as a string object
+ /// instead of an XMP object. It is otherwise identical; see details in the canonical form.
+ ///
+ /// @param xmpPacket The new metadata as a <tt>const char *</tt> string containing an XMP packet.
+ ///
+ /// @param xmpLength Optional. The number of bytes in the string. If not supplied, the string is
+ /// assumed to be nul-terminated.
+
void PutXMP ( XMP_StringPtr xmpPacket,
XMP_StringLen xmpLength = kXMP_UseNullTermination );
-
- // --------------------------------------------------------------------------------------------
- /// \brief Determine if the XMP can be updated.
- ///
- /// \c CanPutXMP determines if the XMP can (probably) be updated. The provided XMP is only used
- /// to obtain the length of the serialized packet. The new XMP is not kept, calling this will
- /// not cause the file to be written when closed. Overloads are provided to pass the XMP as an
- /// XMP object, a string object, or a "const char *" plus length. This is implemented roughly
- /// as:
- ///
- /// \code
- /// bool CanPutXMP ( XMP_StringPtr xmpPacket )
- /// {
- /// XMP_FileFormat format;
- /// this->GetFileInfo ( 0, &format, 0 );
- ///
- /// XMP_OptionBits formatFlags;
- /// GetFormatInfo ( format, &formatFlags );
- ///
- /// if ( (formatFlags & kXMPFiles_CanInjectXMP) && (formatFlags & kXMPFiles_CanExpand) ) return true;
- ///
- /// XMP_PacketInfo packetInfo;
- /// bool hasXMP = this->GetXMP ( 0, 0, &packetInfo );
- ///
- /// if ( ! hasXMP ) {
- /// if ( formatFlags & kXMPFiles_CanInjectXMP ) return true;
- /// } else {
- /// if ( (formatFlags & kXMPFiles_CanExpand) ||
- /// (packetInfo.length >= strlen(xmpPacket)) ) return true;
- /// }
- ///
- /// return false;
- ///
- /// }
- /// \endcode
-
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CanPutXMP() reports whether this file can be updated with a specific XMP packet.
+ ///
+ /// Use to determine if the file can probably be updated with a given set of XMP metadata. This
+ /// depends on the size of the packet, the options with which the file was opened, and the
+ /// capabilities of the handler for the file format. The function obtains the length of the
+ /// serialized packet for the provided XMP, but does not keep it or modify it, and does not
+ /// cause the file to be written when closed. This is implemented roughly as follows:
+ ///
+ /// <pre>
+ /// bool CanPutXMP ( XMP_StringPtr xmpPacket )
+ /// {
+ /// XMP_FileFormat format;
+ /// this->GetFileInfo ( 0, &format, 0 );
+ ///
+ /// XMP_OptionBits formatFlags;
+ /// GetFormatInfo ( format, &formatFlags );
+ ///
+ /// if ( (formatFlags & kXMPFiles_CanInjectXMP) && (formatFlags & kXMPFiles_CanExpand) ) return true;
+ ///
+ /// XMP_PacketInfo packetInfo;
+ /// bool hasXMP = this->GetXMP ( 0, 0, &packetInfo );
+ ///
+ /// if ( ! hasXMP ) {
+ /// if ( formatFlags & kXMPFiles_CanInjectXMP ) return true;
+ /// } else {
+ /// if ( (formatFlags & kXMPFiles_CanExpand) ||
+ /// (packetInfo.length >= strlen(xmpPacket)) ) return true;
+ /// }
+ /// return false;
+ /// }
+ /// </pre>
+ ///
+ /// @param xmpObj The proposed new metadata as an XMP object.
+
bool CanPutXMP ( const SXMPMeta & xmpObj );
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CanPutXMP() reports whether this file can be updated with a specific XMP packet,
+ /// passed in a string object.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass the metadata as a string object
+ /// instead of an XMP object. It is otherwise identical; see details in the canonical form.
+ ///
+ /// @param xmpPacket The proposed new metadata as a string object containing an XMP packet.
+
bool CanPutXMP ( const tStringObj & xmpPacket );
-
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CanPutXMP() reports whether this file can be updated with a specific XMP packet,
+ /// passed in a string object.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass the metadata as a string object
+ /// instead of an XMP object. It is otherwise identical; see details in the canonical form.
+ ///
+ /// @param xmpPacket The proposed new metadata as a <tt>const char *</tt> string containing an XMP packet.
+ ///
+ /// @param xmpLength Optional. The number of bytes in the string. If not supplied, the string
+ /// is assumed to be nul-terminated.
+
bool CanPutXMP ( XMP_StringPtr xmpPacket,
XMP_StringLen xmpLength = kXMP_UseNullTermination );
diff --git a/public/include/TXMPIterator.hpp b/public/include/TXMPIterator.hpp
index 26bb141..c347cf0 100644
--- a/public/include/TXMPIterator.hpp
+++ b/public/include/TXMPIterator.hpp
@@ -14,183 +14,213 @@
// of the Adobe license agreement accompanying it.
// =================================================================================================
-// ================================================================================================
+// =================================================================================================
/// \file TXMPIterator.hpp
-/// \brief Template class for the XMP Toolkit iteration services.
+/// \brief API for access to the XMP Toolkit iteration services.
///
-/// This template class provides iteration services for the XMP Toolkit. It should be instantiated
-/// with a string class such as <tt>std::string</tt>. Please read the general usage notes for
-/// information on the overall architecture of the XMP API.
-// ================================================================================================
+/// \c TXMPIterator is the template class providing iteration services for the XMP Toolkit. It must
+/// be instantiated with a string class such as \c std::string. See the instructions in XMP.hpp, and
+/// the Overview for a discussion of the overall architecture of the XMP API.
+// =================================================================================================
-// ================================================================================================
+// =================================================================================================
/// \class TXMPIterator TXMPIterator.hpp
-/// \brief Template class for the XMP Toolkit iteration services.
+/// @brief API for access to the XMP Toolkit iteration services.
///
-/// This template class provides iteration services for the XMP Toolkit. It should be instantiated
-/// with a string class such as <tt>std::string</tt>. Please read the general usage notes for
-/// information on the overall architecture of the XMP API.
+/// \c TXMPIterator provides a uniform means to iterate over the schema and properties within an XMP
+/// object. \c TXMPIterator is a template class which must be instantiated with a string class such
+/// as \c std::string. See the instructions in XMP.hpp, and the Overview for a discussion of the
+/// overall architecture of the XMP API. Access these functions through the concrete class,
+/// \c SXMPIterator.
///
-/// \c TXMPIterator provides a uniform means to iterate over several XMP data structures, including
-/// the schema and properties within an XMP object plus global tables such as registered
-/// namespaces. The template wraps a string class around the raw XMP API, so that output strings
-/// are automatically copied and access is fully thread safe. String objects are only necessary
-/// for output strings. Input string are literals and passed as typical C <tt>const char *</tt>.
+/// @note Only XMP object iteration is currently available. Future development may include iteration
+/// over global tables, such as registered namespaces.
///
-/// The template parameter, class \c TtStringObj, is described in the XMP.hpp umbrella header.
+/// To understand how iteration works, you should have a thorough understanding of the XMP data
+/// tree, as described in the XMP Specification Part 1. You might also find it helpful to create
+/// some complex XMP and examine the output of \c TXMPMeta::DumpObject().
///
-/// \note Only XMP object iteration is implemented at this time. There are no table iterators yet.
+/// \li The top of the XMP data tree is a single root node. This does not explicitly appear in the
+/// dump and is never visited by an iterator; that is, it is never returned from
+/// \c TXMPIterator::Next().
///
-/// Iteration over the schema and properties within an XMP object is the most important and complex
-/// use of \c TTXMPIterator. It is helpful to have a thorough understanding of the XMP data tree.
-/// One way to learn this is to create some complex XMP and examine the output of
-/// <tt>TXMPMeta::DumpObject</tt>. This is also described in the XMP Specification, in the XMP Data
-/// Model chapter.
+/// \li Beneath the root are schema nodes; these collect the top-level properties in the same
+/// namespace. They are created and destroyed implicitly.
///
-/// The top of the XMP data tree is a single root node. This does not explicitly appear in the dump
-/// and is never visited by an iterator (that is, it is never returned from
-/// <tt>TXMPIterator::Next</tt>). Beneath the root are schema nodes. These are just collectors for
-/// top level properties in the same namespace. They are created and destroyed implicitly. Beneath
-/// the schema nodes are the property nodes. The nodes below a property node depend on its type
-/// (simple, struct, or array) and whether it has qualifiers.
+/// \li Beneath the schema nodes are the property nodes. The nodes below a property node depend on
+/// its type (simple, struct, or array) and whether it has qualifiers.
///
-/// A \c TXMPIterator constructor defines a starting point for the iteration and options that control
-/// how it proceeds. By default the iteration starts at the root and visits all nodes beneath it in
-/// a depth first manner. The root node is not visited, the first visited node is a schema node. You
-/// can provide a schema name or property path to select a different starting node. By default this
-/// visits the named root node first then all nodes beneath it in a depth first manner.
+/// A \c TXMPIterator constructor defines a starting point for the iteration, and options that
+/// control how it proceeds. By default, iteration starts at the root and visits all nodes beneath
+/// it in a depth-first manner. The root node iteself is not visited; the first visited node is a
+/// schema node. You can provide a schema name or property path to select a different starting node.
+/// By default, this visits the named root node first then all nodes beneath it in a depth-first
+/// manner.
///
-/// The <tt>TXMPIterator::Next</tt> method delivers the schema URI, path, and option flags for the
-/// node being visited. If the node is simple it also delivers the value. Qualifiers for this node
+/// The function \c TXMPIterator::Next() delivers the schema URI, path, and option flags for the
+/// node being visited. If the node is simple, it also delivers the value. Qualifiers for this node
/// are visited next. The fields of a struct or items of an array are visited after the qualifiers
/// of the parent.
///
-/// The options to control the iteration are:
-///
-/// \li \c kXMP_IterJustChildren - Visit just the immediate children of the root. Skip the root
-/// itself and all nodes below the immediate children. This omits the qualifiers of the immediate
-/// children, the qualifier nodes being below what they qualify.
-///
-/// \li \c kXMP_IterJustLeafNodes - Visit just the leaf property nodes and their qualifiers.
-///
-/// \li \c kXMP_IterJustLeafName - Return just the leaf component of the node names. The default is
-/// to return the full path name.
-///
-/// \li \c kXMP_IterIncludeAliases - Include aliases as part of the iteration. Since aliases are not
-/// actual nodes the default iteration does not visit them.
-///
-/// \li \c kXMP_IterOmitQualifiers - Do not visit the qualifiers of a node.
-///
-// ================================================================================================
+/// You can specify options when contructing the iteration object to control how the iteration is
+/// performed.
+///
+/// \li \c #kXMP_IterJustChildren - Visit just the immediate children of the root. Skip the root
+/// itself and all nodes below the immediate children. This omits the qualifiers of the immediate
+/// children, the qualifier nodes being below what they qualify.
+/// \li \c #kXMP_IterJustLeafNodes - Visit just the leaf property nodes and their qualifiers.
+/// \li \c #kXMP_IterJustLeafName - Return just the leaf component of the node names. The default
+/// is to return the full path name.
+/// \li \c #kXMP_IterIncludeAliases - Include aliases as part of the iteration. Since aliases are
+/// not actual nodes the default iteration does not visit them.
+/// \li \c #kXMP_IterOmitQualifiers - Do not visit the qualifiers of a node.
+// =================================================================================================
#include "client-glue/WXMPIterator.hpp"
-template <class tStringObj>
-class TXMPIterator {
+template <class tStringObj> class TXMPIterator {
public:
- // --------------------------------------------------------------------------------------------
- /// \brief Assignment operator, assigns the internal ref and increments the ref count.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Assignment operator, assigns the internal ref and increments the ref count.
+ ///
+ /// Assigns the internal reference from an existing object and increments the reference count on
+ /// the underlying internal XMP iterator.
///
- /// The assignment operator assigns the internal ref from the rhs object and increments the
- /// reference count on the underlying internal XMP iterator.
+ /// @param rhs An existing iteration object.
void operator= ( const TXMPIterator<tStringObj> & rhs );
- // --------------------------------------------------------------------------------------------
- /// \brief Copy constructor, creates a client object refering to the same internal object.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Copy constructor, creates a client object refering to the same internal object.
///
- /// The copy constructor creates a new client iterator that refers to the same underlying iterator.
+ /// Creates a new client iterator that refers to the same underlying iterator as an existing object.
+ ///
+ /// @param original An existing iteration object to copy.
TXMPIterator ( const TXMPIterator<tStringObj> & original );
- // --------------------------------------------------------------------------------------------
- /// \brief Construct an iterator for the properties within an XMP object.
- ///
- /// Construct an iterator for the properties within an XMP object. The general operation of an
- /// XMP object iterator was described above. Overloaded forms are provided to iterate the entire
- /// data tree, properties within a specific schema, or a subtree rooted at a specific node.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Constructs an iterator for properties within a schema in an XMP object.
///
- /// \param xmpObj The XMP object over which to iterate.
+ /// See the class description for the general operation of an XMP object iterator.
+ /// Overloaded forms are provided to iterate the entire data tree,
+ /// a subtree rooted at a specific node, or properties within a specific schema.
///
- /// \param schemaNS Optional schema namespace URI to restrict the iteration. Omitted (visit all
- /// schema) by passing 0 or "".
+ /// @param xmpObj The XMP object over which to iterate.
///
- /// \param propName Optional property name to restrict the iteration. May be an arbitrary path
- /// expression. Omitted (visit all properties) by passing 0 or "". If not null/empty a schema
- /// URI must also be provided.
+ /// @param schemaNS Optional schema namespace URI to restrict the iteration. To visit all of the
+ /// schema, pass 0 or the empty string "".
///
- /// \param options Option flags to control the iteration.
+ /// @param propName Optional property name to restrict the iteration. May be an arbitrary path
+ /// expression. If provided, a schema URI must also be provided. To visit all properties, pass 0
+ /// or the empty string "".
///
- /// The available option flags are:
+ /// @param options Option flags to control the iteration. A logical OR of these bit flag constants:
+ /// \li \c #kXMP_IterJustChildren - Visit only the immediate children of the root; default visits subtrees.
+ /// \li \c #kXMP_IterJustLeafNodes - Visit only the leaf nodes; default visits all nodes.
+ /// \li \c #kXMP_IterJustLeafName - Return just the leaf part of the path; default returns the full path.
+ /// \li \c #kXMP_IterOmitQualifiers - Omit all qualifiers.
///
- /// \li \c kXMP_IterJustChildren - Just visit the immediate children of the root, default is subtree.
- /// \li \c kXMP_IterJustLeafNodes - Just visit the leaf nodes, default visits all nodes.
- /// \li \c kXMP_IterJustLeafName - Return just the leaf part of the path, default is the full path.
- /// \li \c kXMP_IterOmitQualifiers - Omit all qualifiers.
+ /// @return The new TXMPIterator object.
TXMPIterator ( const TXMPMeta<tStringObj> & xmpObj,
XMP_StringPtr schemaNS,
XMP_StringPtr propName,
XMP_OptionBits options = 0 );
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Constructs an iterator for a subtree of properties within an XMP object.
+ ///
+ /// See the class description for the general operation of an XMP object iterator. Overloaded
+ /// forms are provided to iterate the entire data tree, a subtree rooted at a specific node, or
+ /// properties within a specific schema.
+ ///
+ /// @param xmpObj The XMP object over which to iterate.
+ ///
+ /// @param schemaNS Optional schema namespace URI to restrict the iteration. To visit all of the
+ /// schema, pass 0 or the empty string "".
+ ///
+ /// @param options Option flags to control the iteration. A logical OR of these bit flag constants:
+ /// \li \c #kXMP_IterJustChildren - Visit only the immediate children of the root; default visits subtrees.
+ /// \li \c #kXMP_IterJustLeafNodes - Visit only the leaf nodes; default visits all nodes.
+ /// \li \c #kXMP_IterJustLeafName - Return just the leaf part of the path; default returns the full path.
+ /// \li \c #kXMP_IterOmitQualifiers - Omit all qualifiers.
+ ///
+ /// @return The new TXMPIterator object.
+
TXMPIterator ( const TXMPMeta<tStringObj> & xmpObj,
XMP_StringPtr schemaNS,
XMP_OptionBits options = 0 );
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Constructs an iterator for the entire data tree within an XMP object.
+ ///
+ /// See the class description for the general operation of an XMP object iterator. Overloaded
+ /// forms are provided to iterate the entire data tree, a subtree rooted at a specific node, or
+ /// properties within a specific schema.
+ ///
+ /// @param xmpObj The XMP object over which to iterate.
+ ///
+ /// @param options Option flags to control the iteration. A logical OR of these bit flag constants:
+ /// \li \c #kXMP_IterJustChildren - Visit only the immediate children of the root; default visits subtrees.
+ /// \li \c #kXMP_IterJustLeafNodes - Visit only the leaf nodes; default visits all nodes.
+ /// \li \c #kXMP_IterJustLeafName - Return just the leaf part of the path; default returns the full path.
+ /// \li \c #kXMP_IterOmitQualifiers - Omit all qualifiers.
+ ///
+ /// @return The new \c TXMPIterator object.
+
TXMPIterator ( const TXMPMeta<tStringObj> & xmpObj,
XMP_OptionBits options = 0 );
- // --------------------------------------------------------------------------------------------
- /// \brief Construct an iterator for the global tables of the XMP toolkit.
- ///
- /// \note <b>Not yet implemented.</b> File a bug if you need this.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Constructs an iterator for the global tables of the XMP toolkit. Not implemented.
TXMPIterator ( XMP_StringPtr schemaNS,
XMP_StringPtr propName,
XMP_OptionBits options );
- // --------------------------------------------------------------------------------------------
- /// \brief Destructor, typical virtual destructor.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Destructor, typical virtual destructor.
virtual ~TXMPIterator() throw();
- // --------------------------------------------------------------------------------------------
- /// \brief Visit the next node in the iteration.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c Next() visits the next node in the iteration.
///
- /// \result Returns true if there was another node to visit, false if the iteration is done.
+ /// Proceeds to the next node according to the options specified on creation of this object, and
+ /// delivers the schema URI, path, and option flags for the node being visited. If the node is
+ /// simple, it also delivers the value.
///
- /// \param schemaNS A pointer to the string that is assigned the schema namespace URI of
- /// the current property. May be null if the value is not wanted.
+ /// @param schemaNS [out] A string object in which to return the assigned the schema namespace
+ /// URI of the current property. Can be null if the value is not wanted.
///
- /// \param propPath A pointer to the string that is assigned the XPath name of the current
- /// property. May be null if the value is not wanted.
+ /// @param propPath [out] A string object in which to return the XPath name of the current
+ /// property. Can be null if the value is not wanted.
///
- /// \param propValue A pointer to the string that is assigned the value of the current
- /// property. May be null if the value is not wanted.
+ /// @param propValue [out] A string object in which to return the value of the current
+ /// property. Can be null if the value is not wanted.
///
- /// \param options A pointer to the XMP_OptionBits variable that is assigned the flags
- /// describing the current property.
+ /// @param options [out] A buffer in which to return the flags describing the current property,
+ /// which are a logical OR of \c #XMP_OptionBits bit-flag constants.
+ ///
+ /// @return True if there was another node to visit, false if the iteration is complete.
- bool
- Next ( tStringObj * schemaNS = 0,
- tStringObj * propPath = 0,
- tStringObj * propValue = 0,
- XMP_OptionBits * options = 0 );
+ bool Next ( tStringObj * schemaNS = 0,
+ tStringObj * propPath = 0,
+ tStringObj * propValue = 0,
+ XMP_OptionBits * options = 0 );
- // --------------------------------------------------------------------------------------------
- /// \brief Skip some portion of the remaining iterations.
- ///
- /// \param options Option flags to control the iteration.
- ///
- /// The available option flags are:
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c Skip() skips some portion of the remaining iterations.
///
- /// \li \c kXMP_IterSkipSubtree - Skip the subtree below the current node.
- /// \li \c kXMP_IterSkipSiblings - Skip the subtree below and remaining siblings of the current node.
+ /// @param options Option flags to control the iteration, a logical OR of these bit-flag
+ /// constants:
+ /// \li \c #kXMP_IterSkipSubtree - Skip the subtree below the current node.
+ /// \li \c #kXMP_IterSkipSiblings - Skip the subtree below and remaining siblings of the current node.
- void
- Skip ( XMP_OptionBits options );
+ void Skip ( XMP_OptionBits options );
private:
diff --git a/public/include/TXMPMeta.hpp b/public/include/TXMPMeta.hpp
index ef1a5fc..209548c 100644
--- a/public/include/TXMPMeta.hpp
+++ b/public/include/TXMPMeta.hpp
@@ -7,68 +7,46 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
// of the Adobe license agreement accompanying it.
// =================================================================================================
-// ================================================================================================
+// =================================================================================================
/// \file TXMPMeta.hpp
-/// \brief Template class for the XMP Toolkit core services.
+/// \brief API for access to the XMP Toolkit core services.
+///
+/// \c TXMPMeta is the template class providing the core services of the XMP Toolkit. It must be
+/// instantiated with a string class such as \c std::string. Read the Toolkit Overview for
+/// information about the overall architecture of the XMP API, and the documentation for \c XMP.hpp
+/// for specific instantiation instructions.
///
-/// TXMPMeta is the template class providing the core services of the XMP Toolkit. It should be
-/// instantiated with a string class such as <tt>std::string</tt>. Please read the general toolkit
-/// usage notes for information about the overall architecture of the XMP API.
-// ================================================================================================
+/// Access these functions through the concrete class, \c SXMPMeta.
+// =================================================================================================
-// ================================================================================================
+// =================================================================================================
/// \class TXMPMeta TXMPMeta.hpp
-/// \brief Template class for the XMP Toolkit core services.
+/// \brief API for access to the XMP Toolkit core services.
///
/// \c TXMPMeta is the template class providing the core services of the XMP Toolkit. It should be
-/// instantiated with a string class such as std::string. Please read the general toolkit usage notes
-/// for information about the overall architecture of the XMP API.
-///
-/// This template wraps a string object class around the raw XMP API. This provides two significant
-/// benefits, output strings are automatically copied and access is fully thread safe. The
-/// umbrella header, \c XMP.hpp, provides an \c SXMPMeta typedef for the instantiated template. String
-/// objects are only necessary for output strings. Input string are literals and passed as typical
-/// C <tt>const char *</tt>.
-///
-/// The template parameter, class \c TtStringObj, is described in the XMP.hpp umbrella header.
-///
-/// <b>Be aware that the \c TXMPMeta class is a normal C++ template, it is instantiated and local to
-/// each client executable. As are the other TXMP* classes. Different clients might not even use the
-/// same string type to instantiate \c TXMPMeta.</b>
-///
-/// Because of this you should not pass \c SXMPMeta objects, or pointers to \c SXMPMeta objects,
-/// across DLL boundaries. There is a safe internal reference that you can pass, then construct a
-/// local object on the callee side. This construction does not create a cloned XMP tree, it is the
-/// same underlying XMP object safely wrapped in each client's \c SXMPMeta object.
+/// instantiated with a string class such as \c std::string. Read the Toolkit Overview for
+/// information about the overall architecture of the XMP API, and the documentation for \c XMP.hpp
+/// for specific instantiation instructions.
///
-/// Use GetInternalRef and the associated constructor like this:
-/// \code
-/// --- The callee's header contains:
-/// CalleeMethod ( XMPMetaRef xmpRef );
+/// Access these functions through the concrete class, \c SXMPMeta.
///
-/// --- The caller's code contains:
-/// SXMPMeta callerXMP;
-/// CalleeMethod ( callerXMP.GetInternalRef() );
-///
-/// --- The callee's code contains:
-/// SXMPMeta calleeXMP ( xmpRef );
-/// \endcode
-// ================================================================================================
+/// You can create \c TXMPMeta objects (also called XMP objects) from metadata that you construct,
+/// or that you obtain from files using the XMP Toolkit's XMPFiles component; see \c TXMPFiles.hpp.
+// =================================================================================================
template <class tStringObj> class TXMPIterator;
template <class tStringObj> class TXMPUtils;
// -------------------------------------------------------------------------------------------------
-template <class tStringObj>
-class TXMPMeta {
+template <class tStringObj> class TXMPMeta {
public:
@@ -76,29 +54,46 @@ public:
// Initialization and termination
// ==============================
- // --------------------------------------------------------------------------------------------
+ // ---------------------------------------------------------------------------------------------
/// \name Initialization and termination
+ ///
/// @{
- // --------------------------------------------------------------------------------------------
- /// \brief Obtain version information.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetVersionInfo() retrieves runtime version information.
+ ///
+ /// The header \c XMPVersion.hpp defines a static version number for the XMP Toolkit, which
+ /// describes the version of the API used at client compile time. It is not necessarily the same
+ /// as the runtime version. Do not base runtime decisions on the static version alone; you can,
+ /// however, compare the runtime and static versions.
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta). The
+ /// function can be called before calling \c TXMPMeta::Initialize().
+ ///
+ /// @param info [out] A buffer in which to return the version information.
- static void
- GetVersionInfo ( XMP_VersionInfo * info );
+ static void GetVersionInfo ( XMP_VersionInfo * info );
- // --------------------------------------------------------------------------------------------
- /// \brief Initialize the XMP Toolkit.
- ///
- /// The XMP Toolkit may be explicitly initialized before use. The allocate/delete parameters must
- /// be either both null (0), or both non-null.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c Initialize() explicitly initializes the XMP Toolkit before use. */
- static bool
- Initialize();
- // --------------------------------------------------------------------------------------------
- /// \brief Terminate the XMP Toolkit.
+ /// Initializes the XMP Toolkit.
+ ///
+ /// Call this function before making any other calls to the \c TXMPMeta functions, except
+ /// \c TXMPMeta::GetVersionInfo().
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
+ ///
+ /// @return True on success. */
+ static bool Initialize();
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c Terminate() explicitly terminates usage of the XMP Toolkit.
+ ///
+ /// Frees structures created on initialization.
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
- static void
- Terminate();
+ static void Terminate();
/// @}
@@ -106,61 +101,74 @@ public:
// Constuctors and destructor
// =========================
- // --------------------------------------------------------------------------------------------
+ // ---------------------------------------------------------------------------------------------
/// \name Constructors and destructor
/// @{
- // --------------------------------------------------------------------------------------------
- /// \brief Default constructor, creates an empty object.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Default constructor, creates an empty object.
///
/// The default constructor creates a new empty \c TXMPMeta object.
-
+ ///
+ /// @return The new object. */
TXMPMeta();
- // --------------------------------------------------------------------------------------------
- /// \brief Copy constructor, creates a client object refering to the same internal object.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Copy constructor, creates a client object refering to the same internal object.
+ ///
+ /// The copy constructor creates a new \c TXMPMeta object that refers to the same internal XMP
+ /// object. as an existing \c TXMPMeta object.
///
- /// The copy constructor creates a new \c TXMPMeta object that refers to the same internal XMP object.
+ /// @param original The object to copy.
+ ///
+ /// @return The new object. */
TXMPMeta ( const TXMPMeta<tStringObj> & original );
- // --------------------------------------------------------------------------------------------
- /// \brief Assignment operator, assigns the internal ref and increments the ref count.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Assignment operator, assigns the internal reference and increments the reference count.
///
/// The assignment operator assigns the internal ref from the rhs object and increments the
/// reference count on the underlying internal XMP object.
void operator= ( const TXMPMeta<tStringObj> & rhs );
- // --------------------------------------------------------------------------------------------
- /// \brief Reconstruct an XMP object from an internal ref.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Reconstructs an XMP object from an internal reference.
+ ///
+ /// This constructor creates a new \c TXMPMeta object that refers to the underlying reference object
+ /// of an existing \c TXMPMeta object. Use to safely pass XMP objects across DLL boundaries.
///
- /// This constructor creates a new \c TXMPMeta object that refers to the underlying \c xmpRef,
- /// which was obtained from some other XMP object by the \c GetInternalRef method. This is used
- /// to safely pass XMP objects across DLL boundaries.
+ /// @param xmpRef The underlying reference object, obtained from some other XMP object with
+ /// \c TXMPMeta::GetInternalRef().
+ ///
+ /// @return The new object.
TXMPMeta ( XMPMetaRef xmpRef );
- // --------------------------------------------------------------------------------------------
- /// \brief Construct an object and parse one buffer of RDF into it.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Constructs an object and parse one buffer of RDF into it.
///
/// This constructor creates a new \c TXMPMeta object and populates it with metadata from a
- /// buffer containing serialized RDF. This buffer must be a complete RDF parse stream. Pass
- /// (0,0) to construct an empty \c TXMPMeta object. The result of an actual parse is identical
- /// to creating an empty object then calling <tt>TXMPMeta::ParseFromBuffer</tt>. The RDF must be
- /// complete. If you need to parse with multiple buffers, create an empty object and use
- /// \c TXMPMeta::ParseFromBuffer.
+ /// buffer containing serialized RDF. This buffer must be a complete RDF parse stream.
+ ///
+ /// The result of passing serialized data to this function is identical to creating an empty
+ /// object then calling \c TXMPMeta::ParseFromBuffer(). To use the constructor, however, the RDF
+ /// must be complete. If you need to parse data from multiple buffers, create an empty object
+ /// and use \c TXMPMeta::ParseFromBuffer().
///
- /// \param buffer A pointer to the buffer of RDF to be parsed. May be null if the length is 0.
+ /// @param buffer A pointer to the buffer of RDF to be parsed. Can be null if the length is 0;
+ /// in this case, the function creates an empty object.
///
- /// \param xmpSize The length in bytes of the buffer.
+ /// @param xmpSize The length in bytes of the buffer.
+ ///
+ /// @return The new object.
TXMPMeta ( XMP_StringPtr buffer,
XMP_StringLen xmpSize );
- // --------------------------------------------------------------------------------------------
- /// \brief Destructor, typical virtual destructor.
-
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Destructor, typical virtual destructor. */
virtual ~TXMPMeta() throw();
/// @}
@@ -169,51 +177,87 @@ public:
// Global state functions
// ======================
- // --------------------------------------------------------------------------------------------
+ // ---------------------------------------------------------------------------------------------
/// \name Global option flags
/// @{
- /// The global option flags affect the overall behavior of the XMP Toolkit. The available options
- /// are declared in <tt>XMP_Const.h</tt>. <b>(There are none at present.)</b>
+ /// Global option flags affect the overall behavior of the XMP Toolkit. The available options
+ /// will be declared in \c XMP_Const.h. There are none in this version of the Toolkit.
- /// \brief GetGlobalOptions returns the set of global option flags.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetGlobalOptions() retrieves the set of global option flags. There are none in
+ /// this version of the Toolkit.
+ ///
+ /// This function is static; you can make the call from the class without instantiating it.
+ ///
+ /// @return A logical OR of global option bit-flag constants.
- static XMP_OptionBits
- GetGlobalOptions();
+ static XMP_OptionBits GetGlobalOptions();
- /// \brief \c SetGlobalOptions updates the set of global option flags. The entire set is
- /// replaced with the new values. If only one flag is to be modified, use \c GetGlobalOptions
- /// to obtain the current set, modify the desired flag, then use \c SetGlobalOptions.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetGlobalOptions() updates the set of global option flags. There are none in this
+ /// version of the Toolkit.
+ ///
+ /// The entire set is replaced with the new values. If only one flag is to be modified, use
+ /// \c TXMPMeta::GetGlobalOptions() to obtain the current set, modify the desired flag, then use
+ /// this function to reset the value.
///
- /// \note There are no options to set yet.
+ /// This function is static; you can make the call from the class without instantiating it.
+ ///
+ /// @param options A logical OR of global option bit-flag constants.
- static void
- SetGlobalOptions ( XMP_OptionBits options );
+ static void SetGlobalOptions ( XMP_OptionBits options );
/// @}
- // --------------------------------------------------------------------------------------------
+ // ---------------------------------------------------------------------------------------------
/// \name Internal data structure dump utilities
/// @{
- /// These are debugging utilities that dump internal data structures. The output callback is
- /// described in <tt>XMP_Const.h</tt>.
+ ///
+ /// These are debugging utilities that dump internal data structures, to be handled by
+ /// client-defined callback described in \c XMP_Const.h.
+ ///
+ /// @see Member function \c TXMPMeta::DumpObject()
- /// \brief \c DumpNamespaces dumps the list of registered namespace URIs and prefixes.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DumpNamespaces() sends the list of registered namespace URIs and prefixes to a handler.
+ ///
+ /// For debugging. Invokes a client-defined callback for each line of output.
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
+ ///
+ /// @param outProc The client-defined procedure to handle each line of output.
+ ///
+ /// @param clientData A pointer to client-defined data to pass to the handler.
+ ///
+ /// @return A success-fail status value, returned from the handler. Zero is success, failure
+ /// values are client-defined.
- static XMP_Status
- DumpNamespaces ( XMP_TextOutputProc outProc,
- void * refCon );
+ static XMP_Status DumpNamespaces ( XMP_TextOutputProc outProc,
+ void * clientData );
- /// \brief \c DumpAliases dumps the list of registered aliases and corresponding actuals.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DumpAliases() sends the list of registered aliases and corresponding actuals to a handler.
+ ///
+ /// For debugging. Invokes a client-defined callback for each line of output.
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
+ ///
+ /// @param outProc The client-defined procedure to handle each line of output.
+ ///
+ /// @param clientData A pointer to client-defined data to pass to the handler.
+ ///
+ /// @return A success-fail status value, returned from the handler. Zero is success, failure
+ /// values are client-defined.
- static XMP_Status
- DumpAliases ( XMP_TextOutputProc outProc,
- void * refCon );
+ static XMP_Status DumpAliases ( XMP_TextOutputProc outProc,
+ void * clientData );
/// @}
- // --------------------------------------------------------------------------------------------
+ // ---------------------------------------------------------------------------------------------
/// \name Namespace Functions
/// @{
+ ///
/// Namespaces must be registered before use in namespace URI parameters or path expressions.
/// Within the XMP Toolkit the registered namespace URIs and prefixes must be unique. Additional
/// namespaces encountered when parsing RDF are automatically registered.
@@ -222,197 +266,204 @@ public:
/// because some forms of RDF shorthand catenate a namespace URI with an element name to form a
/// new URI.
- // --------------------------------------------------------------------------------------------
- /// \brief Register a namespace URI with a suggested prefix.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c RegisterNamespace() registers a namespace URI with a suggested prefix.
///
- /// It is not an error if the URI is already registered, no matter what the prefix is. If the
- /// URI is not registered but the suggested prefix is in use, a unique prefix is created from
- /// the suggested one. The actual registeed prefix is always returned. The function result
- /// tells if the registered prefix is the suggested one.
+ /// If the URI is not registered but the suggested prefix is in use, a unique prefix is created
+ /// from the suggested one. The actual registered prefix is returned. The function result tells
+ /// if the registered prefix is the suggested one. It is not an error if the URI is already
+ /// registered, regardless of the prefix.
///
- /// \param namespaceURI The URI for the namespace. Must be a valid XML URI.
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
///
- /// \param suggestedPrefix The suggested prefix to be used if the URI is not yet registered.
+ /// @param namespaceURI The URI for the namespace. Must be a valid XML URI.
+ ///
+ /// @param suggestedPrefix The suggested prefix to be used if the URI is not yet registered.
/// Must be a valid XML name.
///
- /// \param registeredPrefix Returns the prefix actually registered for this URI.
+ /// @param registeredPrefix [out] A string object in which to return the prefix actually
+ /// registered for this URI.
///
- /// \result Returns true if the registered prefix matches the suggested prefix.
+ /// @return True if the registered prefix matches the suggested prefix.
///
- /// \note No checking is presently done on either the URI or the prefix.
+ /// @note No checking is done on either the URI or the prefix. */
- static bool
- RegisterNamespace ( XMP_StringPtr namespaceURI,
- XMP_StringPtr suggestedPrefix,
- tStringObj * registeredPrefix );
+ static bool RegisterNamespace ( XMP_StringPtr namespaceURI,
+ XMP_StringPtr suggestedPrefix,
+ tStringObj * registeredPrefix );
- // --------------------------------------------------------------------------------------------
- /// \brief Obtain the prefix for a registered namespace URI.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetNamespacePrefix() obtains the prefix for a registered namespace URI, and
+ /// reports whether the URI is registered.
///
- /// It is not an error if the namespace URI is not registered. The output \c namespacePrefix
- /// string is not modified if the namespace URI is not registered.
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
///
- /// \param namespaceURI The URI for the namespace. Must not be null or the empty string.
+ /// @param namespaceURI The URI for the namespace. Must not be null or the empty string. It is
+ /// not an error if the namespace URI is not registered.
///
- /// \param namespacePrefix Returns the prefix registered for this URI, with a terminating ':'.
+ /// @param namespacePrefix [out] A string object in which to return the prefix registered for
+ /// this URI, with a terminating colon character, ':'. If the namespace is not registered, this
+ /// string is not modified.
///
- /// \result Returns true if the namespace URI is registered.
+ /// @return True if the namespace URI is registered.
- static bool
- GetNamespacePrefix ( XMP_StringPtr namespaceURI,
- tStringObj * namespacePrefix );
+ static bool GetNamespacePrefix ( XMP_StringPtr namespaceURI,
+ tStringObj * namespacePrefix );
- // --------------------------------------------------------------------------------------------
- /// \brief Obtain the URI for a registered namespace prefix.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetNamespaceURI() obtains the URI for a registered namespace prefix, and reports
+ /// whether the prefix is registered.
///
- /// It is not an error if the namespace prefix is not registered. The output \c namespaceURI
- /// string is not modified if the namespace prefix is not registered.
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
///
- /// \param namespacePrefix The prefix for the namespace. Must not be null or the empty string.
+ /// @param namespacePrefix The prefix for the namespace. Must not be null or the empty string.
+ /// It is not an error if the namespace prefix is not registered.
///
- /// \param namespaceURI Returns the URI registered for this prefix.
+ /// @param namespaceURI [out] A string object in which to return the URI registered for this
+ /// prefix. If the prefix is not registered, this string is not modified.
///
- /// \result Returns true if the namespace prefix is registered.
+ /// @return True if the namespace prefix is registered.
- static bool
- GetNamespaceURI ( XMP_StringPtr namespacePrefix,
- tStringObj * namespaceURI );
+ static bool GetNamespaceURI ( XMP_StringPtr namespacePrefix,
+ tStringObj * namespaceURI );
- // --------------------------------------------------------------------------------------------
- /// \brief Delete a namespace from the registry.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Not implemented.
///
- /// Does nothing if the URI is not registered, or if the \c namespaceURI parameter is null or the
- /// empty string.
+ /// Deletes a namespace from the registry. Does nothing if the URI is not registered, or if the
+ /// parameter is null or the empty string.
///
- /// \param namespaceURI The URI for the namespace.
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
///
- /// \note <b>Not yet implemented.</b>
+ /// @param namespaceURI The URI for the namespace.
- static void
- DeleteNamespace ( XMP_StringPtr namespaceURI );
+ static void DeleteNamespace ( XMP_StringPtr namespaceURI );
/// @}
- // --------------------------------------------------------------------------------------------
- /// \name Alias Functions
+ // ---------------------------------------------------------------------------------------------
+ /// \name Alias functions
/// @{
- /// Aliases in XMP serve the same purpose as Windows file shortcuts, Macintosh file aliases, or
- /// UNIX file symbolic links. The aliases are simply multiple names for the same property. One
- /// distinction of XMP aliases is that they are ordered, there is an alias name pointing to an
- /// actual name. The primary significance of the actual name is that it is the preferred name
- /// for output, generally the most widely recognized name.
- ///
- /// The names that can be aliased in XMP are restricted. The alias must be a top level property
- /// name, not a field within a structure or an element within an array. The actual may be a top
- /// level property name, the first element within a top level array, or the default element in
- /// an alt-text array. This does not mean the alias can only be a simple property. It is OK to
- /// alias a top level structure or array to an identical top level structure or array, or to the
- /// first item of an array of structures.
-
- // --------------------------------------------------------------------------------------------
- /// \brief Associates an alias name with an actual name.
- ///
- /// Define a alias mapping from one namespace/property to another. Both property names must be
+ ///
+ /// Aliases in XMP serve the same purpose as Windows file shortcuts, Mac OS file aliases, or
+ /// UNIX file symbolic links. The aliases are multiple names for the same property. One
+ /// distinction of XMP aliases is that they are ordered. An alias name points to an actual name;
+ /// the primary significance of the actual name is that it is the preferred name for output,
+ /// generally the most widely recognized name.
+ ///
+ /// XMP restricts the names that can be aliased. The alias must be a top-level property name,
+ /// not a field within a structure or an element within an array. The actual can be a top-level
+ /// property name, the first element within a top-level array, or the default element in an
+ /// alt-text array. This does not mean the alias can only be a simple property; you can alias a
+ /// top-level structure or array to an identical top-level structure or array, or to the first
+ /// item of an array of structures.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c RegisterAlias() associates an alias name with an actual name.
+ ///
+ /// Defines an alias mapping from one namespace/property to another. Both property names must be
/// simple names. An alias can be a direct mapping, where the alias and actual have the same
/// data type. It is also possible to map a simple alias to an item in an array. This can either
/// be to the first item in the array, or to the 'x-default' item in an alt-text array. Multiple
- /// alias names may map to the same actual, as long as the forms match. It is a no-op to
+ /// alias names can map to the same actual, as long as the forms match. It is a no-op to
/// reregister an alias in an identical fashion.
///
- /// \param aliasNS The namespace URI for the alias. Must not be null or the empty string.
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
+ ///
+ /// @param aliasNS The namespace URI for the alias. Must not be null or the empty string.
///
- /// \param aliasProp The name of the alias. Must be a simple name, not null or the empty string
+ /// @param aliasProp The name of the alias. Must be a simple name, not null or the empty string
/// and not a general path expression.
///
- /// \param actualNS The namespace URI for the actual. Must not be null or the empty string.
+ /// @param actualNS The namespace URI for the actual. Must not be null or the empty string.
///
- /// \param actualProp The name of the actual. Must be a simple name, not null or the empty string
+ /// @param actualProp The name of the actual. Must be a simple name, not null or the empty string
/// and not a general path expression.
///
- /// \param arrayForm Provides the array form for simple aliases to an array item. This is needed
+ /// @param arrayForm Provides the array form for simple aliases to an array item. This is needed
/// to know what kind of array to create if set for the first time via the simple alias. Pass
- /// \c kXMP_NoOptions, the default value, for all direct aliases regardless of whether the actual
- /// data type is an array or not.
- ///
- /// Constants for the arrayForm parameter:
- ///
- /// \li \c kXMP_NoOptions - This is a direct mapping. The actual data type does not matter.
- /// \li \c kXMP_PropValueIsArray - The actual is an unordered array, the alias is to the first
- /// element of the array.
- /// \li \c kXMP_PropArrayIsOrdered - The actual is an ordered array, the alias is to the first
- /// element of the array.
- /// \li \c kXMP_PropArrayIsAlternate - The actual is an alternate array, the alias is to the first
- /// element of the array.
- /// \li \c kXMP_PropArrayIsAltText - The actual is an alternate text array, the alias is to the
- /// 'x-default' element of the array.
-
- static void
- RegisterAlias ( XMP_StringPtr aliasNS,
- XMP_StringPtr aliasProp,
- XMP_StringPtr actualNS,
- XMP_StringPtr actualProp,
- XMP_OptionBits arrayForm = kXMP_NoOptions );
-
- // --------------------------------------------------------------------------------------------
- /// \brief Determines if a name is an alias, and what it is aliased to.
- ///
- /// \param aliasNS The namespace URI for the alias. Must not be null or the empty string.
- ///
- /// \param aliasProp The name of the alias. May be an arbitrary path expression path, must not
+ /// \c #kXMP_NoOptions, the default value, for all direct aliases regardless of whether the actual
+ /// data type is an array or not. One of these constants:
+ ///
+ /// \li \c #kXMP_NoOptions - This is a direct mapping. The actual data type does not matter.
+ /// \li \c #kXMP_PropValueIsArray - The actual is an unordered array, the alias is to the
+ /// first element of the array.
+ /// \li \c #kXMP_PropArrayIsOrdered - The actual is an ordered array, the alias is to the
+ /// first element of the array.
+ /// \li \c #kXMP_PropArrayIsAlternate - The actual is an alternate array, the alias is to the
+ /// first element of the array.
+ /// \li \c #kXMP_PropArrayIsAltText - The actual is an alternate text array, the alias is to
+ /// the 'x-default' element of the array. */
+
+ static void RegisterAlias ( XMP_StringPtr aliasNS,
+ XMP_StringPtr aliasProp,
+ XMP_StringPtr actualNS,
+ XMP_StringPtr actualProp,
+ XMP_OptionBits arrayForm = kXMP_NoOptions );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ResolveAlias() reports whether a name is an alias, and what it is aliased to.
+ ///
+ /// Output strings are not written until return, so you can use this to
+ /// "reduce" a path to the base form as follows:
+ /// <pre>
+ /// isAlias = SXMPMeta::ResolveAlias ( ns.c_str(), path.c_str(), &ns, &path, 0 );
+ /// </pre>
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
+ ///
+ /// @param aliasNS The namespace URI for the alias. Must not be null or the empty string.
+ ///
+ /// @param aliasProp The name of the alias. Can be an arbitrary path expression path, must not
/// null or the empty string.
///
- /// \param actualNS Untouched if <tt>aliasNS:aliasProp</tt> is not an alias. Otherwise returns
- /// the namespace URI for the actual. May be null if the namespace URI is not wanted.
+ /// @param actualNS [out] A string object in which to return the namespace URI for the actual.
+ /// Not modified if the given name is not an alias. Can be null if the namespace URI is not wanted.
///
- /// \param actualProp Untouched if <tt>aliasNS:aliasProp</tt> is not an alias. Otherwise
- /// returns the path of the actual. May be null if the actual's path is not wanted.
+ /// @param actualProp [out] A string object in which to return the path of the actual.
+ /// Not modified if the given name is not an alias. Can be null if the actual's path is not wanted.
///
- /// \param arrayForm Untouched if <tt>aliasNS:aliasProp</tt> is not an alias. Otherwise returns
- /// the form of the actual. This is 0 (\c kXMP_NoOptions) if the alias and actual forms match,
- /// otherwise it is the options passed to <tt>TXMPMeta::RegisterAlias</tt>. May be null if the
- /// actual's form is not wanted.
+ /// @param arrayForm [out] A string object in which to return the array form of the actual. This
+ /// is 0 (\c #kXMP_NoOptions) if the alias and actual forms match, otherwise it is the options
+ /// passed to \c TXMPMeta::RegisterAlias(). Not modified if the given name is not an alias. Can
+ /// be null if the actual's array form is not wanted.
///
- /// \result Returns true if the input is an alias.
- ///
- /// \note The client output strings are not written until return, so a call like the following
- /// may be used to "reduce" a path to the base form:
- /// \code
- /// isAlias = SXMPMeta::ResolveAlias ( ns.c_str(), path.c_str(), &ns, &path, 0 );
- /// \endcode
+ /// @return True if the provided name is an alias.
- static bool
- ResolveAlias ( XMP_StringPtr aliasNS,
- XMP_StringPtr aliasProp,
- tStringObj * actualNS,
- tStringObj * actualProp,
- XMP_OptionBits * arrayForm );
+ static bool ResolveAlias ( XMP_StringPtr aliasNS,
+ XMP_StringPtr aliasProp,
+ tStringObj * actualNS,
+ tStringObj * actualProp,
+ XMP_OptionBits * arrayForm );
- // --------------------------------------------------------------------------------------------
- /// \brief Delete an alias.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DeleteAlias() deletes an alias.
///
- /// This only deletes the registration of the alias, it does not delete the actual property. It
- /// does delete any view of the property through the alias name. It is OK to attempt to delete
- /// an alias that does not exist, that is if the alias name is not registered as an alias.
+ /// This deletes only the registration of the alias, it does not delete the actual property.
+ /// It deletes any view of the property through the alias name.
///
- /// \param aliasNS The namespace URI for the alias. Must not be null or the empty string.
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
///
- /// \param aliasProp The name of the alias. Must be a simple name, not null or the empty string
- /// and not a general path expression.
+ /// @param aliasNS The namespace URI for the alias. Must not be null or the empty string.
+ ///
+ /// @param aliasProp The name of the alias. Must be a simple name, not null or the empty string
+ /// and not a general path expression. It is not an error to provide
+ /// a name that has not been registered as an alias.
- static void
- DeleteAlias ( XMP_StringPtr aliasNS,
- XMP_StringPtr aliasProp );
+ static void DeleteAlias ( XMP_StringPtr aliasNS,
+ XMP_StringPtr aliasProp );
- // --------------------------------------------------------------------------------------------
- /// \brief Registers all of the built-in aliases for a standard namespace.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c RegisterStandardAliases() registers all of the built-in aliases for a standard namespace.
+ ///
+ /// The built-in aliases are documented in the XMP Specification. This function registers the
+ /// aliases in the given namespace; that is, it creates the aliases from this namespace to
+ /// actuals in other namespaces.
///
- /// The built-in aliases are documented in the XMP Specification. This registers the aliases in
- /// the given namespace, that is the aliases from this namespace to actuals in other namespaces.
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
///
- /// \param schemaNS The namespace URI for the aliases. Must not be null or the empty string.
+ /// @param schemaNS The namespace URI for the aliases. Must not be null or the empty string.
- static void
- RegisterStandardAliases ( XMP_StringPtr schemaNS );
+ static void RegisterStandardAliases ( XMP_StringPtr schemaNS );
/// @}
@@ -422,1164 +473,1327 @@ public:
// *** Should add discussion of schemaNS and propName prefix usage.
- // --------------------------------------------------------------------------------------------
- /// \name Functions for getting property values
+ // ---------------------------------------------------------------------------------------------
+ /// \name Accessing property values
/// @{
- /// The property value "getters" all take a property specification, The first two parameters
- /// are always the top level namespace URI (the "schema" namespace) and the basic name of the
- /// property being referenced. See the introductory discussion of path expression usage for
- /// more information.
///
- /// All of the functions return a Boolean result telling if the property exists, and if it does
- /// they also return option flags describing the property. If the property exists and has a
- /// value, the string value is also returned. The string is Unicode in UTF-8 encoding. Arrays
- /// and the non-leaf levels of structs do not have values. The possible option flags that
- /// describe properties are:
+ /// The property value accessors all take a property specification; the top level namespace URI
+ /// (the "schema" namespace) and the basic name of the property being referenced. See the
+ /// introductory discussion of path expression usage for more information.
+ ///
+ /// The accessor functions return true if the specified property exists. If it does, output
+ /// parameters return the value (if any) and option flags describing the property. The option
+ /// bit-flag constants that describe properties are \c kXMP_PropXx and
+ /// \c kXMP_ArrayIsXx. See \c #kXMP_PropValueIsURI and following, and macros \c #XMP_PropIsSimple
+ /// and following in \c XMP_Const.h. If the property exists and has a value, it is returned as a
+ /// Unicode string in UTF-8 encoding. Arrays and the non-leaf levels of structs do not have
+ /// values.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetProperty() reports whether a property exists, and retrieves its value.
+ ///
+ /// This is the simplest property accessor. Use this to retrieve the values of top-level simple
+ /// properties, or after using the path composition functions in \c TXMPUtils.
+ ///
+ /// When specifying a namespace and path (in this and all other accessors):
+ /// \li If a namespace URI is specified, it must be for a registered namespace.
+ /// \li If the namespace is specified only by a prefix in the property name path,
+ /// it must be a registered prefix.
+ /// \li If both a URI and path prefix are present, they must be corresponding
+ /// parts of a registered namespace.
+ ///
+ /// @param schemaNS The namespace URI for the property. The URI must be for a registered
+ /// namespace. Can be null or the empty string if the first component of the \c propName path
+ /// contains a namespace prefix.
+ ///
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string. The first component can be a namespace prefix; if present without a
+ /// \c schemaNS value, the prefix specifies the namespace. The prefix must be for a registered
+ /// namespace, and if a namespace URI is specified, must match the registered prefix for that
+ /// namespace.
///
- /// \li \c kXMP_PropValueIsURI - The property value is a URI. It is serialized to RDF using the
- /// <tt>rdf:resource</tt> attribute. Not mandatory for URIs, but considered RDF-savvy.
+ /// @param propValue [out] A string object in which to return the value of the property, if the
+ /// property exists and has a value. Arrays and non-leaf levels of structs do not have values.
+ /// Can be null if the value is not wanted.
///
- /// \li \c kXMP_PropHasQualifiers - The property has qualifiers. These could be an
- /// <tt>xml:lang</tt> attribute, an <tt>rdf:type</tt> property, or a general qualifier. See the
- /// introductory discussion of qualified properties for more information.
+ /// @param options A buffer in which to return option flags describing the property. Can be null
+ /// if the flags are not wanted.
///
- /// \li \c kXMP_PropIsQualifier - This property is a qualifier for some other property. Note
- /// that if the qualifier itself has a structured value, this flag is only set for the top node
- /// of the qualifier's subtree. Qualifiers may have arbitrary structure, and may even have
- /// qualifiers.
+ /// @return True if the property exists.
+
+ bool GetProperty ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ tStringObj * propValue,
+ XMP_OptionBits * options ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetArrayItem() provides access to items within an array.
+ ///
+ /// Reports whether the item exists; if it does, and if it has a value, the function retrieves
+ /// the value. Items are accessed by an integer index, where the first item has index 1.
+ ///
+ /// @param schemaNS The namespace URI for the array; see \c GetProperty().
///
- /// \li \c kXMP_PropHasLang - This property has an <tt>xml:lang</tt> qualifier.
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \li \c kXMP_PropHasType - This property has an <tt>rdf:type</tt> qualifier.
+ /// @param itemIndex The 1-based index of the desired item. Use the macro \c #kXMP_ArrayLastItem
+ /// to specify the last existing array item.
///
- /// \li \c kXMP_PropValueIsStruct - This property contains nested fields (models a C struct).
+ /// @param itemValue [out] A string object in which to return the value of the array item, if it
+ /// has a value. Arrays and non-leaf levels of structs do not have values. Can be null if the
+ /// value is not wanted.
///
- /// \li \c kXMP_PropValueIsArray - This property is an array. By itself (no ...ArrayIs... flags),
- /// this indicates a general unordered array. It is serialized using an <tt>rdf:Bag</tt> container.
+ /// @param options [out] A buffer in which to return the option flags describing the array item.
+ /// Can be null if the flags are not wanted.
///
- /// \li \c kXMP_PropArrayIsOrdered - This property is an ordered array. Appears in conjunction
- /// with \c kXMP_PropValueIsArray. It is serialized using an <tt>rdf:Seq</tt> container.
+ /// @return True if the array item exists.
+
+ bool GetArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ tStringObj * itemValue,
+ XMP_OptionBits * options ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetStructField() provides access to fields within a nested structure.
///
- /// \li \c kXMP_PropArrayIsAlternate - This property is an alternative array. Appears in
- /// conjunction with \c kXMP_PropValueIsArray. It is serialized using an <tt>rdf:Alt</tt> container.
+ /// Reports whether the field exists; if it does, and if it has a value, the function retrieves
+ /// the value.
///
- /// \li \c kXMP_PropArrayIsAltText - This property is an alt-text array. Appears in conjunction
- /// with \c kXMP_PropArrayIsAlternate. It is serialized using an <tt>rdf:Alt</tt> container. Each
- /// array element is a simple property with an <tt>xml:lang</tt> attribute.
+ /// @param schemaNS The namespace URI for the struct; see \c GetProperty().
///
- /// \li \c kXMP_PropIsAlias - The given property name is an alias. This is only returned by
- /// \c GetProperty and then only if the property name is simple, not an path expression.
+ /// @param structName The name of the struct. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \li \c kXMP_PropHasAliases - The given property name has aliases. This is only returned by
- /// \c GetProperty and then only if the property name is simple, not an path expression.
+ /// @param fieldNS The namespace URI for the field. Same URI and prefix usage as the \c schemaNS
+ /// and \c structName parameters.
///
- /// \li \c kXMP_PropIsStable - The value of this property is not related to the document
- /// content.
+ /// @param fieldName The name of the field. Must be a single XML name, must not be null or the
+ /// empty string. Same URI and prefix usage as the \c schemaNS and \c structName parameters.
///
- /// \li \c kXMP_PropIsDerived - The value of this property is derived from the document
- /// content.
+ /// @param fieldValue [out] A string object in which to return the value of the field, if the
+ /// field has a value. Arrays and non-leaf levels of structs do not have values. Can be null if
+ /// the value is not wanted.
///
- /// \li \c kXMP_PropIsInternal - The value of this property is "owned" by the application, it
- /// should not generally be editable in a UI.
+ /// @param options [out] A buffer in which to return the option flags describing the field. Can
+ /// be null if the flags are not wanted.
+ ///
+ /// @return True if the field exists.
+
+ bool GetStructField ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ tStringObj * fieldValue,
+ XMP_OptionBits * options ) const;
- // --------------------------------------------------------------------------------------------
- /// \brief \c GetProperty is the simplest property getter, mainly for top level simple
- /// properties or after using the path composition functions in \c TXMPUtils.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetQualifier() provides access to a qualifier attached to a property.
///
- /// \result Returns true if the property exists.
+ /// @note In this version of the Toolkit, qualifiers are supported only for simple leaf properties.
///
- /// \param schemaNS The namespace URI for the property. May be null or the empty string if the
- /// first component of the propName path contains a namespace prefix. The URI must be for a
- /// registered namespace.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param propName The name of the property. May be a general path expression, must not be
- /// null or the empty string. Using a namespace prefix on the first component is optional. If
- /// present without a \c schemaNS value then the prefix specifies the namespace. The prefix
- /// must be for a registered namespace. If both a \c schemaNS URI and \c propName prefix are
- /// present, they must be corresponding parts of a registered namespace.
+ /// @param propName The name of the property to which the qualifier is attached. Can be a
+ /// general path expression, must not be null or the empty string; see \c GetProperty() for
+ /// namespace prefix usage.
///
- /// \param propValue A pointer to the string that is assigned the value of the property, if
- /// the property has a value. Arrays and non-leaf levels of structs do not have values. May be
- /// null if the value is not wanted.
+ /// @param qualNS The namespace URI for the qualifier. Same URI and prefix usage as the
+ /// \c schemaNS and \c propName parameters.
///
- /// \param options A pointer to the \c XMP_OptionBits variable that is assigned option flags
- /// describing the property. May be null if the flags are not wanted.
+ /// @param qualName The name of the qualifier. Must be a single XML name, must not be null or
+ /// the empty string. Same URI and prefix usage as the \c schemaNS and \c propName parameters.
+ ///
+ /// @param qualValue [out] A string object in which to return the value of the qualifier, if the
+ /// qualifier has a value. Arrays and non-leaf levels of structs do not have values. Can be null
+ /// if the value is not wanted.
+ ///
+ /// @param options [out] A buffer in which to return the option flags describing the qualifier.
+ /// Can be null if the flags are not wanted.
+ ///
+ /// @return True if the qualifier exists.
+
+ bool GetQualifier ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ tStringObj * qualValue,
+ XMP_OptionBits * options ) const;
- bool
- GetProperty ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- tStringObj * propValue,
- XMP_OptionBits * options ) const;
+ /// @}
+
+ // =============================================================================================
- // --------------------------------------------------------------------------------------------
- /// \brief \c GetArrayItem provides access to items within an array. The index is passed as an
- /// integer, you need not worry about the path string syntax for array items, convert a loop
- /// index to a string, etc.
+ // ---------------------------------------------------------------------------------------------
+ /// \name Creating properties and setting their values
+ /// @{
+ ///
+ /// These functions all take a property specification; the top level namespace URI (the "schema"
+ /// namespace) and the basic name of the property being referenced. See the introductory
+ /// discussion of path expression usage for more information.
+ ///
+ /// All of the functions take a UTF-8 encoded Unicode string for the property value. Arrays and
+ /// non-leaf levels of structs do not have values. The value can be passed as an
+ /// \c #XMP_StringPtr (a pointer to a null-terminated string), or as a string object
+ /// (\c tStringObj).
+
+ /// Each function takes an options flag that describes the property. You can use these functions
+ /// to create empty arrays and structs by setting appropriate option flags. When you assign a
+ /// value, all levels of a struct that are implicit in the assignment are created if necessary.
+ /// \c TXMPMeta::AppendArrayItem() implicitly creates the named array if necessary.
///
- /// \result Returns true if the array item exists.
+ /// The allowed option bit-flags include:
+ /// \li \c #kXMP_PropValueIsStruct - Can be used to create an empty struct.
+ /// A struct is implicitly created when the first field is set.
+ /// \li \c #kXMP_PropValueIsArray - By default, a general unordered array (bag).
+ /// \li \c #kXMP_PropArrayIsOrdered - An ordered array.
+ /// \li \c #kXMP_PropArrayIsAlternate - An alternative array.
+ /// \li \c #kXMP_PropArrayIsAltText - An alt-text array. Each array element must
+ /// be a simple property with an \c xml:lang attribute.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetProperty() creates or sets a property value.
///
- /// \param schemaNS The namespace URI for the array. Has the same usage as in \c GetProperty.
+ /// This is the simplest property setter. Use it for top-level simple properties, or after using
+ /// the path composition functions in \c TXMPUtils.
///
- /// \param arrayName The name of the array. May be a general path expression, must not be null
- /// or the empty string. Has the same namespace prefix usage as \c propName in \c GeProperty.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param itemIndex The index of the desired item. Arrays in XMP are indexed from 1. The constant
- /// \c kXMP_ArrayLastItem always refers to the last existing array item.
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param itemValue A pointer to the string that is assigned the value of the array item, if
- /// the array item has a value. Arrays and non-leaf levels of structs do not have values. May be
- /// null if the value is not wanted.
+ /// @param propValue The new value, a pointer to a null terminated UTF-8 string. Must be null
+ /// for arrays and non-leaf levels of structs that do not have values.
///
- /// \param options A pointer to the \c XMP_OptionBits variable that is assigned option flags
- /// describing the array item. May be null if the flags are not wanted.
+ /// @param options Option flags describing the property; a logical OR of allowed bit-flag
+ /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property
+ /// that already exists.
+
+ void SetProperty ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr propValue,
+ XMP_OptionBits options = 0 );
- bool
- GetArrayItem ( XMP_StringPtr schemaNS,
- XMP_StringPtr arrayName,
- XMP_Index itemIndex,
- tStringObj * itemValue,
- XMP_OptionBits * options ) const;
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetProperty() creates or sets a property value using a string object.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object
+ /// for the item value. It is otherwise identical; see details in the canonical form.
- // --------------------------------------------------------------------------------------------
- /// \brief \c GetStructField provides access to fields within a nested structure. The namespace
- /// for the field is passed as a URI, you need not worry about the path string syntax.
+ void SetProperty ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ const tStringObj & propValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetArrayItem() creates or sets the value of an item within an array.
///
- /// The names of fields should be XML qualified names, that is within an XML namespace. The path
- /// syntax for a qualified name uses the namespace prefix. This is unreliable since the prefix
- /// is never guaranteed. The URI is the formal name, the prefix is just a local shorthand in a
- /// given sequence of XML text.
+ /// Items are accessed by an integer index, where the first item has index 1. This function
+ /// creates the item if necessary, but the array itself must already exist Use
+ /// \c AppendArrayItem() to create arrays. A new item is automatically appended if the index is the
+ /// array size plus 1. To insert a new item before or after an existing item, use option flags.
///
- /// \result Returns true if the field exists.
+ /// Use \c TXMPUtils::ComposeArrayItemPath() to create a complex path.
///
- /// \param schemaNS The namespace URI for the struct. Has the same usage as in \c GetProperty.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param structName The name of the struct. May be a general path expression, must not be null
- /// or the empty string. Has the same namespace prefix usage as \c propName in \c GetProperty.
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param fieldNS The namespace URI for the field. Has the same URI and prefix usage as the
- /// \c schemaNS parameter.
+ /// @param itemIndex The 1-based index of the desired item. Use the macro \c #kXMP_ArrayLastItem
+ /// to specify the last existing array item.
///
- /// \param fieldName The name of the field. Must be a single XML name, must not be null or the
- /// empty string. Has the same namespace prefix usage as the \c structName parameter.
+ /// @param itemValue The new item value, a null-terminated UTF-8 string, if the array item has a
+ /// value.
///
- /// \param fieldValue A pointer to the string that is assigned the value of the field, if
- /// the field has a value. Arrays and non-leaf levels of structs do not have values. May be
- /// null if the value is not wanted.
+ /// @param options Option flags describing the array type and insertion location for a new item;
+ /// a logical OR of allowed bit-flag constants. The type, if specified, must match the existing
+ /// array type, \c #kXMP_PropArrayIsOrdered, \c #kXMP_PropArrayIsAlternate, or
+ /// \c #kXMP_PropArrayIsAltText. Default (0 or \c #kXMP_NoOptions) matches the existing array type.
///
- /// \param options A pointer to the \c XMP_OptionBits variable that is assigned option flags
- /// describing the field. May be null if the flags are not wanted.
+ /// To insert a new item before or after the specified index, set flag \c #kXMP_InsertBeforeItem
+ /// or \c #kXMP_InsertAfterItem.
- bool
- GetStructField ( XMP_StringPtr schemaNS,
- XMP_StringPtr structName,
- XMP_StringPtr fieldNS,
- XMP_StringPtr fieldName,
- tStringObj * fieldValue,
- XMP_OptionBits * options ) const;
+ void SetArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ XMP_StringPtr itemValue,
+ XMP_OptionBits options = 0 );
- // --------------------------------------------------------------------------------------------
- /// \brief \c GetQualifier provides access to a qualifier attached to a property. The namespace
- /// for the qualifier is passed as a URI, you need not worry about the path string syntax. In
- /// many regards qualifiers are like struct fields. See the introductory discussion of
- /// qualified properties for more information.
- ///
- /// The names of qualifiers should be XML qualified names, that is within an XML namespace. The
- /// path syntax for a qualified name uses the namespace prefix. This is unreliable since the
- /// prefix is never guaranteed. The URI is the formal name, the prefix is just a local shorthand
- /// in a given sequence of XML text.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetArrayItem() creates or sets the value of an item within an array using a string object.
///
- /// \note Qualifiers are only supported for simple leaf properties at this time.
+ /// Overloads the basic form of the function, allowing you to pass a string object in which to
+ /// return the item value. It is otherwise identical; see details in the canonical form.
+
+ void SetArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ const tStringObj & itemValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c AppendArrayItem() adds an item to an array, creating the array if necessary.
///
- /// \result Returns true if the qualifier exists.
+ /// This function simplifies construction of an array by not requiring that you pre-create an
+ /// empty array. The array that is assigned is created automatically if it does not yet exist.
+ /// If the array exists, it must have the form specified by the options. Each call appends a new
+ /// item to the array.
///
- /// \param schemaNS The namespace URI for the struct. Has the same usage as in \c GetProperty.
+ /// Use \c TXMPUtils::ComposeArrayItemPath() to create a complex path.
///
- /// \param propName The name of the property to which the qualifier is attached. May be a general
- /// path expression, must not be null or the empty string. Has the same namespace prefix usage
- /// as in \c GetProperty.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param qualNS The namespace URI for the qualifier. Has the same URI and prefix usage as the
- /// \c schemaNS parameter.
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param qualName The name of the qualifier. Must be a single XML name, must not be null or the
- /// empty string. Has the same namespace prefix usage as the \c propName parameter.
+ /// @param arrayOptions Option flags describing the array type to create; a logical OR of
+ /// allowed bit-flag constants, \c #kXMP_PropArrayIsOrdered, \c #kXMP_PropArrayIsAlternate, or
+ /// \c #kXMP_PropArrayIsAltText. If the array exists, must match the existing array type or be
+ /// null (0 or \c #kXMP_NoOptions).
///
- /// \param qualValue A pointer to the string that is assigned the value of the qualifier, if
- /// the qualifier has a value. Arrays and non-leaf levels of structs do not have values. May be
- /// null if the value is not wanted.
+ /// @param itemValue The new item value, a null-terminated UTF-8 string, if the array item has a
+ /// value.
///
- /// \param options A pointer to the \c XMP_OptionBits variable that is assigned option flags
- /// describing the qualifier. May be null if the flags are not wanted.
+ /// @param itemOptions Option flags describing the item type to create; one of the bit-flag
+ /// constants \c #kXMP_PropValueIsArray or \c #kXMP_PropValueIsStruct to create a complex array
+ /// item.
- bool
- GetQualifier ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- XMP_StringPtr qualNS,
- XMP_StringPtr qualName,
- tStringObj * qualValue,
- XMP_OptionBits * options ) const;
+ void AppendArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_OptionBits arrayOptions,
+ XMP_StringPtr itemValue,
+ XMP_OptionBits itemOptions = 0 );
- /// @}
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c AppendArrayItem() adds an item to an array using a string object value, creating
+ /// the array if necessary.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object in which to
+ /// return the item value. It is otherwise identical; see details in the canonical form.
- // =============================================================================================
+ void AppendArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_OptionBits arrayOptions,
+ const tStringObj & itemValue,
+ XMP_OptionBits itemOptions = 0 );
- // --------------------------------------------------------------------------------------------
- /// \name Functions for setting property values
- /// @{
- /// The property value "setters" all take a property specification, their differences are in
- /// the form of this. The first two parameters are always the top level namespace URI (the
- /// "schema" namespace) and the basic name of the property being referenced. See the
- /// introductory discussion of path expression usage for more information.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetStructField() creates or sets the value of a field within a nested structure.
///
- /// All of the functions take a string value for the property and option flags describing the
- /// property. The value must be Unicode in UTF-8 encoding. Arrays and non-leaf levels of
- /// structs do not have values. Empty arrays and structs may be created using appropriate
- /// option flags. All levels of structs that is assigned implicitly are created if necessary.
- /// \c AppendArayItem implicitly creates the named array if necessary.
+ /// Use this to set a value within an existing structure, create a new field within an existing
+ /// structure, or create an empty structure of any depth. If you set a field in a structure that
+ /// does not exist, the structure is automatically created.
///
- /// The canonical form of these functions take the value as an \c XMP_StringPtr, a pointer to a
- /// null terminated string. (\c XMP_StringPtr is a typedef for <tt>const char *</tt>.) They
- /// also have overloaded forms that take a string object. These are implemented in the template
- /// instantiation as a call to the canonical form, using <tt>value.c_str()</tt> to obtain the
- /// \c XMP_StringPtr.
+ /// Use \c TXMPUtils::ComposeStructFieldPath() to create a complex path.
///
- /// The possible option flags are:
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \li \c kXMP_PropValueIsURI - The property value is a URI. It is serialized to RDF using the
- /// <tt>rdf:resource</tt> attribute. Not mandatory for URIs, but considered RDF-savvy.
- ///
- /// \li \c kXMP_PropValueIsStruct - This property contains nested fields (models a C struct).
- /// Not necessary, may be used to create an empty struct. A struct is implicitly created when
- /// first field is set.
+ /// @param structName The name of the struct. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \li \c kXMP_PropValueIsArray - This property is an array. By itself (no ...ArrayIs...
- /// flags), this indicates a general unordered array. It is serialized using an
- /// <tt>rdf:Bag</tt> container.
+ /// @param fieldNS The namespace URI for the field. Same namespace and prefix usage as
+ /// \c GetProperty().
///
- /// \li \c kXMP_PropArrayIsOrdered - This property is an ordered array. Implies \c
- /// kXMP_PropValueIsArray, may be used together. It is serialized using an <tt>rdf:Seq</tt>
- /// container.
+ /// @param fieldName The name of the field. Must be a single XML name, must not be null or the
+ /// empty string. Same namespace and prefix usage as \c GetProperty().
///
- /// \li \c kXMP_PropArrayIsAlternate - This property is an alternative array. Implies \c
- /// kXMP_PropArrayIsOrdered, may be used together. It is serialized using an <tt>rdf:Alt</tt>
- /// container.
+ /// @param fieldValue The new value, a null-terminated UTF-8 string, if the field has a value.
+ /// Null to create a new, empty struct or empty field in an existing struct.
///
- /// \li \c kXMP_PropArrayIsAltText - This property is an alt-text array. Implies \c
- /// kXMP_PropArrayIsAlternate, may be used together. It is serialized using an <tt>rdf:Alt</tt>
- /// container. Each array element must be a simple property with an <tt>xml:lang</tt> attribute.
+ /// @param options Option flags describing the property, in which the bit-flag
+ /// \c #kXMP_PropValueIsStruct must be set to create a struct.
+
+ void SetStructField ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ XMP_StringPtr fieldValue,
+ XMP_OptionBits options = 0 );
- // --------------------------------------------------------------------------------------------
- /// \brief \c SetProperty is the simplest property setter, mainly for top level simple
- /// properties or after using the path composition functions in \c TXMPUtils.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetStructField() creates or sets the value of a field within a nested structure,
+ /// using a string object.
///
- /// \param schemaNS The namespace URI for the property. Has the same usage as in \c GetProperty.
- ///
- /// \param propName The name of the property. Has the same usage as in \c GetProperty.
+ /// Overloads the basic form of the function, allowing you to pass a string object in which to
+ /// return the field value. It is otherwise identical; see details in the canonical form.
+
+ void SetStructField ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ const tStringObj & fieldValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetQualifier() creates or sets a qualifier attached to a property.
///
- /// \param propValue A pointer to the null terminated UTF-8 string that is the value of the
- /// property, if the property has a value. Arrays and non-leaf levels of structs do not have
- /// values. Must be null if the value is not relevant.
- ///
- /// \param options Option flags describing the property. See the earlier description.
-
- void
- SetProperty ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- XMP_StringPtr propValue,
- XMP_OptionBits options = 0 );
-
- // --------------------------------------------------------------------------------------------
- /// \brief This form of \c SetProperty is a simple overload in the template that calls the above
- /// form passing <tt>propValue.c_str()</tt>.
-
- void
- SetProperty ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- const tStringObj & propValue,
- XMP_OptionBits options = 0 );
-
- // --------------------------------------------------------------------------------------------
- /// \brief \c SetArrayItem provides access to items within an array. The index is passed as an
- /// integer, you need not worry about the path string syntax for array items, convert a loop
- /// index to a string, etc. The array passed to \c SetArrayItem must already exist. See also
- /// \c AppendArrayItem.
+ /// Use this to set a value for an existing qualifier, or create a new qualifier. <<how do
+ /// options work? macro vs bit-flag? interaction w/XMP_PropHasQualifier?>> Use
+ /// \c TXMPUtils::ComposeQualifierPath() to create a complex path.
///
- /// In normal usage the selected array item is modified. A new item is automatically
- /// appended if the index is the array size plus 1. A new item may be inserted before or after
- /// any item by using one of the following option flags:
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \li \c kXMP_InsertBeforeItem - Insert a new array item before the selected one.
- /// \li \c kXMP_InsertAfterItem - Insert a new array item after the selected one.
+ /// @param propName The name of the property to which the qualifier is attached. Can be a
+ /// general path expression, must not be null or the empty string; see \c GetProperty() for
+ /// namespace prefix usage.
///
- /// \param schemaNS The namespace URI for the array. Has the same usage as in \c GetProperty.
+ /// @param qualNS The namespace URI for the qualifier. Same namespace and prefix usage as
+ /// \c GetProperty().
///
- /// \param arrayName The name of the array. May be a general path expression, must not be null
- /// or the empty string. Has the same namespace prefix usage as \c propName in \c GetProperty.
- ///
- /// \param itemIndex The index of the desired item. Arrays in XMP are indexed from 1. The
- /// constant \c kXMP_ArrayLastItem always refers to the last existing array item.
- ///
- /// \param itemValue A pointer to the null terminated UTF-8 string that is the value of the array
- /// item, if the array item has a value. Has the same usage as \c propValue in \c GetProperty.
- ///
- /// \param options Option flags describing the item. See the earlier description.
-
- void
- SetArrayItem ( XMP_StringPtr schemaNS,
- XMP_StringPtr arrayName,
- XMP_Index itemIndex,
- XMP_StringPtr itemValue,
- XMP_OptionBits options = 0 );
-
- // --------------------------------------------------------------------------------------------
- /// \brief This form of \c SetArrayItem is a simple overload in the template that calls the above
- /// form passing <tt>itemValue.c_str()</tt>.
-
- void
- SetArrayItem ( XMP_StringPtr schemaNS,
- XMP_StringPtr arrayName,
- XMP_Index itemIndex,
- const tStringObj & itemValue,
- XMP_OptionBits options = 0 );
-
- // --------------------------------------------------------------------------------------------
- /// \brief \c AppendArrayItem simplifies construction of an array by not requiring that you
- /// pre-create an empty array. The array that is assigned is created automatically if it does
- /// not yet exist. Each call to \c AppendArrayItem appends an item to the array. The
- /// corresponding parameters have the same use as \c SetArrayItem. The \c arrayOptions
- /// parameter is used to specify what kind of array. If the array exists, it must have the
- /// specified form.
- ///
- /// \param schemaNS The namespace URI for the array. Has the same usage as in \c GetProperty.
+ /// @param qualName The name of the qualifier. Must be a single XML name, must not be null or
+ /// the empty string. Same namespace and prefix usage as \c GetProperty().
///
- /// \param arrayName The name of the array. May be a general path expression, must not be null
- /// or the empty string. Has the same namespace prefix usage as \c propPath in \c GetProperty.
+ /// @param qualValue The new value, a null-terminated UTF-8 string, if the qualifier has a
+ /// value. Null to create a new, empty qualifier.
///
- /// \param arrayOptions Option flags describing the array form. The only valid bits are those
- /// that are part of \c kXMP_PropArrayFormMask: \c kXMP_PropValueIsArray, \c
- /// kXMP_PropArrayIsOrdered, \c kXMP_PropArrayIsAlternate, or \c kXMP_PropArrayIsAltText.
+ /// @param options Option flags describing the <<qualified property? qualifier?>>, a logical OR
+ /// of property-type bit-flag constants. Use the macro \c #XMP_PropIsQualifier to create a
+ /// qualifier. <<??>>
+
+ void SetQualifier ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ XMP_StringPtr qualValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetQualifier() creates or sets a qualifier attached to a property using a string object.
///
- /// \param itemValue A pointer to the null terminated UTF-8 string that is the value of the
- /// array item, if the array item has a value. Has the same usage as \c propValue in \c
- /// GetProperty.
- ///
- /// \param itemOptions Option flags describing the item. See the earlier description.
-
- void
- AppendArrayItem ( XMP_StringPtr schemaNS,
- XMP_StringPtr arrayName,
- XMP_OptionBits arrayOptions,
- XMP_StringPtr itemValue,
- XMP_OptionBits itemOptions = 0 );
-
- // --------------------------------------------------------------------------------------------
- /// \brief This form of \c AppendArrayItem is a simple overload in the template that calls the
- /// above form passing <tt>itemValue.c_str()</tt>.
-
- void
- AppendArrayItem ( XMP_StringPtr schemaNS,
- XMP_StringPtr arrayName,
- XMP_OptionBits arrayOptions,
- const tStringObj & itemValue,
- XMP_OptionBits itemOptions = 0 );
-
- // --------------------------------------------------------------------------------------------
- /// \brief \c SetStructField provides access to fields within a nested structure. The namespace
- /// for the field is passed as a URI, you need not worry about the path string syntax.
- ///
- /// The names of fields should be XML qualified names, that is within an XML namespace. The
- /// path syntax for a qualified name uses the namespace prefix, which is unreliable because
- /// the prefix is never guaranteed. The URI is the formal name, the prefix is just a local
- /// shorthand in a given sequence of XML text.
- ///
- /// \param schemaNS The namespace URI for the struct. Has the same usage as in \c GetProperty.
- ///
- /// \param structName The name of the struct. May be a general path expression, must not be
- /// null or the empty string. Has the same namespace prefix usage as \c propName in \c
- /// GetProperty.
- ///
- /// \param fieldNS The namespace URI for the field. Has the same URI and prefix usage as the \c
- /// schemaNS parameter.
- ///
- /// \param fieldName The name of the field. Must be a single XML name, must not be null or the
- /// empty string. Has the same namespace prefix usage as the \c structName parameter.
- ///
- /// \param fieldValue A pointer to the null terminated UTF-8 string that is the value of the
- /// field, if the field has a value. Has the same usage as \c propValue in \c GetProperty.
- ///
- /// \param options Option flags describing the field. See the earlier description.
-
- void
- SetStructField ( XMP_StringPtr schemaNS,
- XMP_StringPtr structName,
- XMP_StringPtr fieldNS,
- XMP_StringPtr fieldName,
- XMP_StringPtr fieldValue,
- XMP_OptionBits options = 0 );
-
- // --------------------------------------------------------------------------------------------
- /// \brief This form of \c SetStructField is a simple overload in the template that calls the
- /// above form passing <tt>fieldValue.c_str()</tt>.
-
- void
- SetStructField ( XMP_StringPtr schemaNS,
- XMP_StringPtr structName,
- XMP_StringPtr fieldNS,
- XMP_StringPtr fieldName,
- const tStringObj & fieldValue,
- XMP_OptionBits options = 0 );
-
- // --------------------------------------------------------------------------------------------
- /// \brief \c SetQualifier provides access to a qualifier attached to a property. The namespace
- /// for the qualifier is passed as a URI, you need not worry about the path string syntax. In
- /// many regards qualifiers are like struct fields. See the introductory discussion of
- /// qualified properties for more information.
- ///
- /// The names of qualifiers should be XML qualified names, that is within an XML namespace. The
- /// path syntax for a qualified name uses the namespace prefix, which is unreliable because
- /// the prefix is never guaranteed. The URI is the formal name, the prefix is just a local
- /// shorthand in a given sequence of XML text.
- ///
- /// \param schemaNS The namespace URI for the struct. Has the same usage as in \c GetProperty.
- ///
- /// \param propName The name of the property to which the qualifier is attached. Has the same
- /// usage as in \c GetProperty.
- ///
- /// \param qualNS The namespace URI for the qualifier. Has the same URI and prefix usage as the
- /// \c schemaNS parameter.
- ///
- /// \param qualName The name of the qualifier. Must be a single XML name, must not be null or
- /// the empty string. Has the same namespace prefix usage as the \c propName parameter.
- ///
- /// \param qualValue A pointer to the null terminated UTF-8 string that is the value of the
- /// qualifier, if the qualifier has a value. Has the same usage as \c propValue in \c
- /// GetProperty.
- ///
- /// \param options Option flags describing the qualifier. See the earlier description.
-
- void
- SetQualifier ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- XMP_StringPtr qualNS,
- XMP_StringPtr qualName,
- XMP_StringPtr qualValue,
- XMP_OptionBits options = 0 );
-
- // --------------------------------------------------------------------------------------------
- /// \brief This form of \c SetQualifier is a simple overload in the template that calls the above
- /// form passing <tt>qualValue.c_str()</tt>.
-
- void
- SetQualifier ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- XMP_StringPtr qualNS,
- XMP_StringPtr qualName,
- const tStringObj & qualValue,
- XMP_OptionBits options = 0 );
+ /// Overloads the basic form of the function, allowing you to pass a string object
+ /// for the qualifier value. It is otherwise identical; see details in the canonical form.
+
+ void SetQualifier ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ const tStringObj & qualValue,
+ XMP_OptionBits options = 0 );
/// @}
// =============================================================================================
- // --------------------------------------------------------------------------------------------
- /// \name Functions for deleting and detecting properties.
+ // ---------------------------------------------------------------------------------------------
+ /// \name Detecting and deleting properties.
/// @{
- /// These should be obvious from the descriptions of the getters and setters.
+ ///
+ /// The namespace URI and prefix usage for property specifiers in these functions is the same as
+ /// for \c TXMPMeta::GetProperty().
- // --------------------------------------------------------------------------------------------
- /// \brief \c DeleteProperty deletes the given XMP subtree rooted at the given property. It is
- /// not an error if the property does not exist.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DeleteProperty() deletes an XMP subtree rooted at a given property.
///
- /// \param schemaNS The namespace URI for the property. Has the same usage as in \c GetProperty.
+ /// It is not an error if the property does not exist.
///
- /// \param propName The name of the property. Has the same usage as in \c GetProperty.
+ /// @param schemaNS The namespace URI for the property; see \c GetProperty().
+ ///
+ /// @param propName The name of the property; see \c GetProperty().
- void
- DeleteProperty ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName );
+ void DeleteProperty ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName );
- // --------------------------------------------------------------------------------------------
- /// \brief \c DeleteArrayItem deletes the given XMP subtree rooted at the given array item. It
- /// is not an error if the array item does not exist.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DeleteArrayItem() deletes an XMP subtree rooted at a given array item.
+ ///
+ /// It is not an error if the array item does not exist. Use
+ /// \c TXMPUtils::ComposeArrayItemPath() to create a complex path.
///
- /// \param schemaNS The namespace URI for the array. Has the same usage as in \c GetProperty.
+ /// @param schemaNS The namespace URI for the array; see \c GetProperty().
///
- /// \param arrayName The name of the array. May be a general path expression, must not be null
- /// or the empty string. Has the same namespace prefix usage as \c propName in \c GetProperty.
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param itemIndex The index of the desired item. Arrays in XMP are indexed from 1. The
- /// constant \c kXMP_ArrayLastItem always refers to the last existing array item.
+ /// @param itemIndex The 1-based index of the desired item. Use the macro \c #kXMP_ArrayLastItem
+ /// to specify the last existing array item.
- void
- DeleteArrayItem ( XMP_StringPtr schemaNS,
- XMP_StringPtr arrayName,
- XMP_Index itemIndex );
+ void DeleteArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex );
- // --------------------------------------------------------------------------------------------
- /// \brief \c DeleteStructField deletes the given XMP subtree rooted at the given struct field.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DeleteStructField() deletes an XMP subtree rooted at a given struct field.
+ ///
/// It is not an error if the field does not exist.
///
- /// \param schemaNS The namespace URI for the struct. Has the same usage as in \c GetProperty.
+ /// @param schemaNS The namespace URI for the struct; see \c GetProperty().
///
- /// \param structName The name of the struct. May be a general path expression, must not be null
- /// or the empty string. Has the same namespace prefix usage as \c propName in \c GetProperty.
+ /// @param structName The name of the struct. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param fieldNS The namespace URI for the field. Has the same URI and prefix usage as the
- /// \c schemaNS parameter.
+ /// @param fieldNS The namespace URI for the field. Same namespace and prefix usage as
+ /// \c GetProperty().
///
- /// \param fieldName The name of the field. Must be a single XML name, must not be null or the
- /// empty string. Has the same namespace prefix usage as the \c structName parameter.
+ /// @param fieldName The name of the field. Must be a single XML name, must not be null or the
+ /// empty string. Same namespace and prefix usage as \c GetProperty().
- void
- DeleteStructField ( XMP_StringPtr schemaNS,
- XMP_StringPtr structName,
- XMP_StringPtr fieldNS,
- XMP_StringPtr fieldName );
+ void DeleteStructField ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName );
- // --------------------------------------------------------------------------------------------
- /// \brief \c DeleteQualifier deletes the given XMP subtree rooted at the given qualifier. It
- /// is not an error if the qualifier does not exist.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DeleteQualifier() deletes an XMP subtree rooted at a given qualifier.
+ ///
+ /// It is not an error if the qualifier does not exist.
///
- /// \param schemaNS The namespace URI for the struct. Has the same usage as in \c GetProperty.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param propName The name of the property to which the qualifier is attached. Has the same
- /// usage as in \c GetProperty.
+ /// @param propName The name of the property to which the qualifier is attached. Can be a
+ /// general path expression, must not be null or the empty string; see \c GetProperty() for
+ /// namespace prefix usage.
///
- /// \param qualNS The namespace URI for the qualifier. Has the same URI and prefix usage as the
- /// \c schemaNS parameter.
+ /// @param qualNS The namespace URI for the qualifier. Same namespace and prefix usage as
+ /// \c GetProperty().
///
- /// \param qualName The name of the qualifier. Must be a single XML name, must not be null or the
- /// empty string. Has the same namespace prefix usage as the \c propName parameter.
+ /// @param qualName The name of the qualifier. Must be a single XML name, must not be null or
+ /// the empty string. Same namespace and prefix usage as \c GetProperty().
- void
- DeleteQualifier ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- XMP_StringPtr qualNS,
- XMP_StringPtr qualName );
+ void DeleteQualifier ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName );
- // --------------------------------------------------------------------------------------------
- /// \brief \c DoesPropertyExist tells if the property exists.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DoesPropertyExist() reports whether a property currently exists.
///
- /// \result Returns true if the property exists.
+ /// @param schemaNS The namespace URI for the property; see \c GetProperty().
///
- /// \param schemaNS The namespace URI for the property. Has the same usage as in \c GetProperty.
+ /// @param propName The name of the property; see \c GetProperty().
///
- /// \param propName The name of the property. Has the same usage as in \c GetProperty.
+ /// @return True if the property exists.
- bool
- DoesPropertyExist ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName ) const;
+ bool DoesPropertyExist ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName ) const;
- // --------------------------------------------------------------------------------------------
- /// \brief \c DoesArrayItemExist tells if the array item exists.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DoesArrayItemExist() reports whether an array item currently exists.
///
- /// \result Returns true if the array item exists.
+ /// Use \c TXMPUtils::ComposeArrayItemPath() to create a complex path.
///
- /// \param schemaNS The namespace URI for the array. Has the same usage as in \c GetProperty.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param arrayName The name of the array. May be a general path expression, must not be null
- /// or the empty string. Has the same namespace prefix usage as \c propName in \c GetProperty.
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param itemIndex The index of the desired item. Arrays in XMP are indexed from 1. The
- /// constant \c kXMP_ArrayLastItem always refers to the last existing array item.
+ /// @param itemIndex The 1-based index of the desired item. Use the macro \c #kXMP_ArrayLastItem
+ /// to specify the last existing array item.
+ ///
+ /// @return True if the array item exists.
- bool
- DoesArrayItemExist ( XMP_StringPtr schemaNS,
- XMP_StringPtr arrayName,
- XMP_Index itemIndex ) const;
+ bool DoesArrayItemExist ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex ) const;
- // --------------------------------------------------------------------------------------------
- /// \brief \c DoesStructFieldExist tells if the struct field exists.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DoesStructFieldExist() reports whether a struct field currently exists.
+ ///
+ /// Use \c TXMPUtils::ComposeStructFieldPath() to create a complex path.
///
- /// \result Returns true if the field exists.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param schemaNS The namespace URI for the struct. Has the same usage as in \c GetProperty.
+ /// @param structName The name of the struct. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param structName The name of the struct. May be a general path expression, must not be null
- /// or the empty string. Has the same namespace prefix usage as \c propName in \c GetProperty.
+ /// @param fieldNS The namespace URI for the field. Same namespace and prefix usage as
+ /// \c GetProperty().
///
- /// \param fieldNS The namespace URI for the field. Has the same URI and prefix usage as the
- /// \c schemaNS parameter.
+ /// @param fieldName The name of the field. Must be a single XML name, must not be null or the
+ /// empty string. Same namespace and prefix usage as \c GetProperty().
///
- /// \param fieldName The name of the field. Must be a single XML name, must not be null or the
- /// empty string. Has the same namespace prefix usage as the \c structName parameter.
+ /// @return True if the field exists.
- bool
- DoesStructFieldExist ( XMP_StringPtr schemaNS,
- XMP_StringPtr structName,
- XMP_StringPtr fieldNS,
- XMP_StringPtr fieldName ) const;
+ bool DoesStructFieldExist ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName ) const;
- // --------------------------------------------------------------------------------------------
- /// \brief \c DoesQualifierExist tells if the qualifier exists.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DoesQualifierExist() reports whether a qualifier currently exists.
///
- /// \result Returns true if the qualifier exists.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param schemaNS The namespace URI for the struct. Has the same usage as in \c GetProperty.
+ /// @param propName The name of the property to which the qualifier is attached. Can be a
+ /// general path expression, must not be null or the empty string; see \c GetProperty() for
+ /// namespace prefix usage.
///
- /// \param propName The name of the property to which the qualifier is attached. Has the same
- /// usage as in \c GetProperty.
+ /// @param qualNS The namespace URI for the qualifier. Same namespace and prefix usage as
+ /// \c GetProperty().
///
- /// \param qualNS The namespace URI for the qualifier. Has the same URI and prefix usage as the
- /// \c schemaNS parameter.
+ /// @param qualName The name of the qualifier. Must be a single XML name, must not be null or
+ /// the empty string. Same namespace and prefix usage as \c GetProperty().
///
- /// \param qualName The name of the qualifier. Must be a single XML name, must not be null or the
- /// empty string. Has the same namespace prefix usage as the \c propName parameter.
+ /// @return True if the qualifier exists.
- bool
- DoesQualifierExist ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- XMP_StringPtr qualNS,
- XMP_StringPtr qualName ) const;
+ bool DoesQualifierExist ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName ) const;
/// @}
// =============================================================================================
// Specialized Get and Set functions
- // =================================
+ // =============================================================================================
- // --------------------------------------------------------------------------------------------
- /// \name Functions for accessing localized text (alt-text) properties.
+ // ---------------------------------------------------------------------------------------------
+ /// \name Accessing properties as binary values.
/// @{
- /// These functions provide convenient support for localized text properties, including a number
- /// of special and obscure aspects. Localized text properties are stored in alt-text arrays.
- /// They allow multiple concurrent localizations of a property value, for example a document
- /// title or copyright in several languages.
- ///
- /// The most important aspect of these functions is that they select an appropriate array item
- /// based on one or two RFC 3066 language tags. One of these languages, the "specific" language,
- /// is preferred and selected if there is an exact match. For many languages it is also possible
- /// to define a "generic" language that may be used if there is no specific language match. The
- /// generic language must be a valid RFC 3066 primary subtag, or the empty string.
- ///
- /// For example, a specific language of "en-US" should be used in the US, and a specific language
- /// of "en-UK" should be used in England. It is also appropriate to use "en" as the generic
- /// language in each case. If a US document goes to England, the "en-US" title is selected
- /// by using the "en" generic language and the "en-UK" specific language.
- ///
- /// It is considered poor practice, but allowed, to pass a specific language that is just an
- /// RFC 3066 primary tag. For example "en" is not a good specific language, it should only be
- /// used as a generic language. Passing "i" or "x" as the generic language is also considered
- /// poor practice but allowed.
- ///
- /// Advice from the W3C about the use of RFC 3066 language tags can be found at:
- /// \li http://www.w3.org/International/articles/language-tags/
///
- /// \note RFC 3066 language tags must be treated in a case insensitive manner. The XMP toolkit
- /// does this by normalizing their capitalization:
+ /// These are very similar to \c TXMPMeta::GetProperty() and \c TXMPMeta::SetProperty(), except
+ /// that the value is returned or provided in binary form instead of as a UTF-8 string.
+ /// \c TXMPUtils provides functions for converting between binary and string values.
+ /// Use the path composition functions in \c TXMPUtils to compose complex path expressions
+ /// for fields or items in nested structures or arrays, or for qualifiers.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetProperty_Bool() retrieves the value of a Boolean property as a C++ bool.
///
- /// \li The primary subtag is lower case, the suggested practice of ISO 639.
- /// \li All 2 letter secondary subtags are upper case, the suggested practice of ISO 3166.
- /// \li All other subtags are lower case.
+ /// Reports whether a property exists, and retrieves its binary value and property type information.
///
- /// The XMP specification defines an artificial language, "x-default", that is used to
- /// explicitly denote a default item in an alt-text array. The XMP toolkit normalizes alt-text
- /// arrays such that the x-default item is the first item. The \c SetLocalizedText function has
- /// several special features related to the x-default item, see its description for details.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// The selection of the array item is the same for \c GetLocalizedText and \c SetLocalizedText:
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \li Look for an exact match with the specific language.
- /// \li If a generic language is given, look for a partial match.
- /// \li Look for an x-default item.
- /// \li Choose the first item.
+ /// @param propValue [out] A buffer in which to return the binary value. Can be null if the
+ /// value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have
+ /// values.
///
- /// A partial match with the generic language is where the start of the item's language matches
- /// the generic string and the next character is '-'. An exact match is also recognized as a
- /// degenerate case.
+ /// @param options [out] A buffer in which to return the option flags describing the property, a
+ /// logical OR of allowed bit-flag constants; see \c #kXMP_PropValueIsStruct and following. Can
+ /// be null if flags are not wanted.
///
- /// It is fine to pass x-default as the specific language. In this case, selection of an x-default
- /// item is an exact match by the first rule, not a selection by the 3rd rule. The last 2 rules
- /// are fallbacks used when the specific and generic languages fail to produce a match.
+ /// @return True if the property exists.
- // --------------------------------------------------------------------------------------------
- /// \brief \c GetLocalizedText returns information about a selected item in an alt-text array.
- /// The array item is selected according to the rules given above.
- ///
- /// \result Returns true if an appropriate array item exists.
- ///
- /// \param schemaNS The namespace URI for the alt-text array. Has the same usage as in \c
- /// GetProperty.
+ bool GetProperty_Bool ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ bool * propValue,
+ XMP_OptionBits * options ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetProperty_Int() retrieves the value of an integer property as a C long integer.
///
- /// \param altTextName The name of the alt-text array. May be a general path expression, must
- /// not be null or the empty string. Has the same namespace prefix usage as \c propName in \c
- /// GetProperty.
+ /// Reports whether a property exists, and retrieves its binary value and property type information.
///
- /// \param genericLang The name of the generic language as an RFC 3066 primary subtag. May be
- /// null or the empty string if no generic language is wanted.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param specificLang The name of the specific language as an RFC 3066 tag. Must not be null
- /// or the empty string.
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param actualLang A pointer to the string that is assigned the language of the selected
- /// array item, if an appropriate array item is found. May be null if the language is not
- /// wanted.
+ /// @param propValue [out] A buffer in which to return the binary value. Can be null if the
+ /// value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have
+ /// values.
///
- /// \param itemValue A pointer to the string that is assigned the value of the array item, if
- /// an appropriate array item is found. May be null if the value is not wanted.
+ /// @param options [out] A buffer in which to return the option flags describing the property, a
+ /// logical OR of allowed bit-flag constants; see \c #kXMP_PropValueIsStruct and following. Can
+ /// be null if flags are not wanted.
///
- /// \param options A pointer to the \c XMP_OptionBits variable that is assigned option flags
- /// describing the array item. May be null if the flags are not wanted.
+ /// @return True if the property exists.
- bool
- GetLocalizedText ( XMP_StringPtr schemaNS,
- XMP_StringPtr altTextName,
- XMP_StringPtr genericLang,
- XMP_StringPtr specificLang,
- tStringObj * actualLang,
- tStringObj * itemValue,
- XMP_OptionBits * options ) const;
+ bool GetProperty_Int ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ long * propValue,
+ XMP_OptionBits * options ) const;
- // --------------------------------------------------------------------------------------------
- /// \brief \c SetLocalizedText modifies the value of a selected item in an alt-text array.
- /// Creates an appropriate array item if necessary, and handles special cases for the x-default
- /// item.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetProperty_Int64() retrieves the value of an integer property as a C long long integer.
///
- /// If the selected item is from a match with the specific language, the value of that item is
- /// modified. If the existing value of that item matches the existing value of the x-default
- /// item, the x-default item is also modified. If the array only has 1 existing item (which is
- /// not x-default), an x-default item is added with the given value.
+ /// Reports whether a property exists, and retrieves its binary value and property type information.
///
- /// If the selected item is from a match with the generic language and there are no other
- /// generic matches, the value of that item is modified. If the existing value of that item
- /// matches the existing value of the x-default item, the x-default item is also modified. If
- /// the array only has 1 existing item (which is not x-default), an x-default item is added
- /// with the given value.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// If the selected item is from a partial match with the generic language and there are other
- /// partial matches, a new item is created for the specific language. The x-default item is not
- /// modified.
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// If the selected item is from the last 2 rules then a new item is created for the specific
- /// language. If the array only had an x-default item, the x-default item is also modified. If
- /// the array was empty, items are created for the specific language and x-default.
+ /// @param propValue [out] A buffer in which to return the binary value. Can be null if the
+ /// value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have
+ /// values.
///
- /// \param schemaNS The namespace URI for the alt-text array. Has the same usage as in \c
- /// GetProperty.
+ /// @param options [out] A buffer in which to return the option flags describing the property, a
+ /// logical OR of allowed bit-flag constants; see \c #kXMP_PropValueIsStruct and following. Can
+ /// be null if flags are not wanted.
///
- /// \param altTextName The name of the alt-text array. May be a general path expression, must
- /// not be null or the empty string. Has the same namespace prefix usage as \c propName in \c
- /// GetProperty.
+ /// @return True if the property exists.
+
+ bool GetProperty_Int64 ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ long long * propValue,
+ XMP_OptionBits * options ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetProperty_Float() retrieves the value of a floating-point property as a C double float.
///
- /// \param genericLang The name of the generic language as an RFC 3066 primary subtag. May be
- /// null or the empty string if no generic language is wanted.
+ /// Reports whether a property exists, and retrieves its binary value and property type information.
///
- /// \param specificLang The name of the specific language as an RFC 3066 tag. Must not be null
- /// or the empty string.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param itemValue A pointer to the null terminated UTF-8 string that is the new value for
- /// the appropriate array item.
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param options Option flags, none are defined at present.
-
- void
- SetLocalizedText ( XMP_StringPtr schemaNS,
- XMP_StringPtr altTextName,
- XMP_StringPtr genericLang,
- XMP_StringPtr specificLang,
- XMP_StringPtr itemValue,
- XMP_OptionBits options = 0 );
-
- // --------------------------------------------------------------------------------------------
- /// \brief This form of \c SetLocalizedText is a simple overload in the template that calls the
- /// above form passing <tt>itemValue.c_str()</tt>.
-
- void
- SetLocalizedText ( XMP_StringPtr schemaNS,
- XMP_StringPtr altTextName,
- XMP_StringPtr genericLang,
- XMP_StringPtr specificLang,
- const tStringObj & itemValue,
- XMP_OptionBits options = 0 );
-
- /// @}
-
- // =============================================================================================
+ /// @param propValue [out] A buffer in which to return the binary value. Can be null if the
+ /// value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have
+ /// values.
+ ///
+ /// @param options [out] A buffer in which to return the option flags describing the property, a
+ /// logical OR of allowed bit-flag constants; see \c #kXMP_PropValueIsStruct and following. Can
+ /// be null if flags are not wanted.
+ ///
+ /// @return True if the property exists.
- // --------------------------------------------------------------------------------------------
- /// \name Functions accessing properties as binary values.
- /// @{
- /// These are very similar to \c GetProperty and \c SetProperty above, but the value is
- /// returned or
- /// provided in binary form instead of as a UTF-8 string. The path composition functions in
- /// \c TXMPUtils may be used to compose an path expression for fields in nested structures, items
- /// in arrays, or qualifiers.
+ bool GetProperty_Float ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ double * propValue,
+ XMP_OptionBits * options ) const;
- // --------------------------------------------------------------------------------------------
- /// \brief \c GetProperty_Bool returns the value of a Boolean property as a C++ bool.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetProperty_Date() retrieves the value of a date-time property as an \c #XMP_DateTime structure.
///
- /// \result Returns true if the property exists.
+ /// Reports whether a property exists, and retrieves its binary value and property type information.
///
- /// \param schemaNS The namespace URI for the property. Has the same usage as in \c GetProperty.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param propName The name of the property. Has the same usage as in \c GetProperty.
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param propValue A pointer to the bool variable that is assigned the value of the property.
- /// May be null if the value is not wanted.
+ /// @param propValue [out] A buffer in which to return the binary value. Can be null if the
+ /// value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have
+ /// values.
///
- /// \param options A pointer to the \c XMP_OptionBits variable that is assigned option flags
- /// describing the property. May be null if the flags are not wanted.
+ /// @param options [out] A buffer in which to return the option flags describing the property, a
+ /// logical OR of allowed bit-flag constants; see \c #kXMP_PropValueIsStruct and following. Can
+ /// be null if flags are not wanted.
+ ///
+ /// @return True if the property exists.
- bool
- GetProperty_Bool ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- bool * propValue,
- XMP_OptionBits * options ) const;
+ bool GetProperty_Date ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_DateTime * propValue,
+ XMP_OptionBits * options ) const;
- // --------------------------------------------------------------------------------------------
- /// \brief \c GetProperty_Int returns the value of an integer property as a C long integer.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetProperty_Bool() sets the value of a Boolean property using a C++ bool.
///
- /// \result Returns true if the property exists.
+ /// Sets a property with a binary value, creating it if necessary.
///
- /// \param schemaNS The namespace URI for the property. Has the same usage as in \c GetProperty.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param propName The name of the property. Has the same usage as in \c GetProperty.
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param propValue A pointer to the long integer variable that is assigned the value of
- /// the property. May be null if the value is not wanted.
+ /// @param propValue The new binary value. Can be null if creating the property. Must be null
+ /// for arrays and non-leaf levels of structs that do not have values.
///
- /// \param options A pointer to the \c XMP_OptionBits variable that is assigned option flags
- /// describing the property. May be null if the flags are not wanted.
+ /// @param options Option flags describing the property; a logical OR of allowed bit-flag
+ /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property
+ /// that already exists.
- bool
- GetProperty_Int ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- long * propValue,
- XMP_OptionBits * options ) const;
+ void SetProperty_Bool ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ bool propValue,
+ XMP_OptionBits options = 0 );
- // --------------------------------------------------------------------------------------------
- /// \brief \c GetProperty_Int64 returns the value of an integer property as a C long long integer.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetProperty_Int() sets the value of an integer property using a C long integer.
///
- /// \result Returns true if the property exists.
+ /// Sets a property with a binary value, creating it if necessary.
///
- /// \param schemaNS The namespace URI for the property. Has the same usage as in \c GetProperty.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param propName The name of the property. Has the same usage as in \c GetProperty.
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param propValue A pointer to the long long integer variable that is assigned the value of
- /// the property. May be null if the value is not wanted.
+ /// @param propValue The new binary value. Can be null if creating the property. Must be null
+ /// for arrays and non-leaf levels of structs that do not have values.
///
- /// \param options A pointer to the \c XMP_OptionBits variable that is assigned option flags
- /// describing the property. May be null if the flags are not wanted.
+ /// @param options Option flags describing the property; a logical OR of allowed bit-flag
+ /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property
+ /// that already exists.
- bool
- GetProperty_Int64 ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- long long * propValue,
- XMP_OptionBits * options ) const;
+ void SetProperty_Int ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ long propValue,
+ XMP_OptionBits options = 0 );
- // --------------------------------------------------------------------------------------------
- /// \brief \c GetProperty_Float returns the value of a flaoting point property as a C double float.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetProperty_Int64() sets the value of an integer property using a C long long integer.
///
- /// \result Returns true if the property exists.
+ /// Sets a property with a binary value, creating it if necessary.
///
- /// \param schemaNS The namespace URI for the property. Has the same usage as in \c GetProperty.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param propName The name of the property. Has the same usage as in \c GetProperty.
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param propValue A pointer to the double float variable that is assigned the value of
- /// the property. May be null if the value is not wanted.
+ /// @param propValue The new binary value. Can be null if creating the property. Must be null
+ /// for arrays and non-leaf levels of structs that do not have values.
///
- /// \param options A pointer to the \c XMP_OptionBits variable that is assigned option flags
- /// describing the property. May be null if the flags are not wanted.
+ /// @param options Option flags describing the property; a logical OR of allowed bit-flag
+ /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property
+ /// that already exists.
- bool
- GetProperty_Float ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- double * propValue,
- XMP_OptionBits * options ) const;
+ void SetProperty_Int64 ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ long long propValue,
+ XMP_OptionBits options = 0 );
- // --------------------------------------------------------------------------------------------
- /// \brief \c GetProperty_Date returns the value of a date/time property as an \c XMP_DateTime struct.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetProperty_Float() sets the value of a floating-point property using a C double float.
///
- /// \result Returns true if the property exists.
+ /// Sets a property with a binary value, creating it if necessary.
///
- /// \param schemaNS The namespace URI for the property. Has the same usage as in \c GetProperty.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param propName The name of the property. Has the same usage as in \c GetProperty.
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param propValue A pointer to the \c XMP_DateTime variable that is assigned the value of
- /// the property. May be null if the value is not wanted.
+ /// @param propValue The new binary value. Can be null if creating the property. Must be null
+ /// for arrays and non-leaf levels of structs that do not have values.
///
- /// \param options A pointer to the \c XMP_OptionBits variable that is assigned option flags
- /// describing the property. May be null if the flags are not wanted.
+ /// @param options Option flags describing the property; a logical OR of allowed bit-flag
+ /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property
+ /// that already exists.
- bool
- GetProperty_Date ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- XMP_DateTime * propValue,
- XMP_OptionBits * options ) const;
+ void SetProperty_Float ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ double propValue,
+ XMP_OptionBits options = 0 );
- // --------------------------------------------------------------------------------------------
- /// \brief \c SetProperty_Bool sets the value of a Boolean property from a C++ bool.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetProperty_Date() sets the value of a date/time property using an \c #XMP_DateTime structure.
+ ///
+ /// Sets a property with a binary value, creating it if necessary.
///
- /// \param schemaNS The namespace URI for the property. Has the same usage as in \c GetProperty.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param propName The name of the property. Has the same usage as in \c GetProperty.
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param propValue The bool value to be assigned to the property.
+ /// @param propValue The new binary value. Can be null if creating the property. Must be null
+ /// for arrays and non-leaf levels of structs that do not have values.
///
- /// \param options A pointer to the \c XMP_OptionBits variable that is assigned option flags
- /// describing the property. May be null if the flags are not wanted.
+ /// @param options Option flags describing the property; a logical OR of allowed bit-flag
+ /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property
+ /// that already exists.
- void
- SetProperty_Bool ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- bool propValue,
- XMP_OptionBits options = 0 );
+ void SetProperty_Date ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ const XMP_DateTime & propValue,
+ XMP_OptionBits options = 0 );
- // --------------------------------------------------------------------------------------------
- /// \brief \c SetProperty_Int sets the value of an integer property from a C long integer.
+ /// @}
+ // =============================================================================================
+ /// \name Accessing localized text (alt-text) properties.
+ /// @{
///
- /// \param schemaNS The namespace URI for the property. Has the same usage as in \c GetProperty.
+ /// Localized text properties are stored in alt-text arrays. They allow multiple concurrent
+ /// localizations of a property value, for example a document title or copyright in several
+ /// languages.
///
- /// \param propName The name of the property. Has the same usage as in \c GetProperty.
+ /// These functions provide convenient support for localized text properties, including a
+ /// number of special and obscure aspects. The most important aspect of these functions is that
+ /// they select an appropriate array item based on one or two RFC 3066 language tags. One of
+ /// these languages, the "specific" language, is preferred and selected if there is an exact
+ /// match. For many languages it is also possible to define a "generic" language that can be
+ /// used if there is no specific language match. The generic language must be a valid RFC 3066
+ /// primary subtag, or the empty string.
///
- /// \param propValue The long integer value to be assigned to the property.
+ /// For example, a specific language of "en-US" should be used in the US, and a specific
+ /// language of "en-UK" should be used in England. It is also appropriate to use "en" as the
+ /// generic language in each case. If a US document goes to England, the "en-US" title is
+ /// selected by using the "en" generic language and the "en-UK" specific language.
///
- /// \param options Option flags describing the property.
-
- void
- SetProperty_Int ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- long propValue,
- XMP_OptionBits options = 0 );
+ /// It is considered poor practice, but allowed, to pass a specific language that is just an
+ /// RFC 3066 primary tag. For example "en" is not a good specific language, it should only be
+ /// used as a generic language. Passing "i" or "x" as the generic language is also considered
+ /// poor practice but allowed.
+ ///
+ /// Advice from the W3C about the use of RFC 3066 language tags can be found at:
+ /// \li http://www.w3.org/International/articles/language-tags/
+ ///
+ /// \note RFC 3066 language tags must be treated in a case insensitive manner. The XMP toolkit
+ /// does this by normalizing their capitalization:
+ /// \li The primary subtag is lower case, the suggested practice of ISO 639.
+ /// \li All 2 letter secondary subtags are upper case, the suggested practice of ISO 3166.
+ /// \li All other subtags are lower case.
+ ///
+ /// The XMP specification defines an artificial language, "x-default", that is used to
+ /// explicitly denote a default item in an alt-text array. The XMP toolkit normalizes alt-text
+ /// arrays such that the x-default item is the first item. The \c SetLocalizedText() function
+ /// has several special features related to the x-default item, see its description for details.
- // --------------------------------------------------------------------------------------------
- /// \brief \c SetProperty_Int64 sets the value of an integer property from a C long long integer.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetLocalizedText() retrieves information about a selected item in an alt-text array.
+ ///
+ /// The array item is selected according to these rules:
+ /// \li Look for an exact match with the specific language.
+ /// \li If a generic language is given, look for a partial match.
+ /// \li Look for an x-default item.
+ /// \li Choose the first item.
+ ///
+ /// A partial match with the generic language is where the start of the item's language matches
+ /// the generic string and the next character is '-'. An exact match is also recognized as a
+ /// degenerate case.
+ ///
+ /// You can pass "x-default" as the specific language. In this case, selection of an
+ /// \c x-default item is an exact match by the first rule, not a selection by the 3rd rule. The
+ /// last 2 rules are fallbacks used when the specific and generic languages fail to produce a
+ /// match.
///
- /// \param schemaNS The namespace URI for the property. Has the same usage as in \c GetProperty.
+ /// The return value reports whether a match was successfully made.
///
- /// \param propName The name of the property. Has the same usage as in \c GetProperty.
+ /// @param schemaNS The namespace URI for the alt-text array; see \c GetProperty().
///
- /// \param propValue The long long integer value to be assigned to the property.
+ /// @param altTextName The name of the alt-text array. Can be a general path expression, must
+ /// not be null or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param options Option flags describing the property.
+ /// @param genericLang The name of the generic language as an RFC 3066 primary subtag. Can be
+ /// null or the empty string if no generic language is wanted.
+ ///
+ /// @param specificLang The name of the specific language as an RFC 3066 tag, or "x-default".
+ /// Must not be null or the empty string.
+ ///
+ /// @param actualLang [out] A string object in which to return the language of the selected
+ /// array item, if an appropriate array item is found. Can be null if the language is not wanted.
+ ///
+ /// @param itemValue [out] A string object in which to return the value of the array item, if an
+ /// appropriate array item is found. Can be null if the value is not wanted.
+ ///
+ /// @param options A buffer in which to return the option flags that describe the array item, if
+ /// an appropriate array item is found. Can be null if the flags are not wanted.
+ ///
+ /// @return True if an appropriate array item exists.
- void
- SetProperty_Int64 ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- long long propValue,
- XMP_OptionBits options = 0 );
+ bool GetLocalizedText ( XMP_StringPtr schemaNS,
+ XMP_StringPtr altTextName,
+ XMP_StringPtr genericLang,
+ XMP_StringPtr specificLang,
+ tStringObj * actualLang,
+ tStringObj * itemValue,
+ XMP_OptionBits * options ) const;
- // --------------------------------------------------------------------------------------------
- /// \brief \c SetProperty_Float sets the value of a floating point property from a C double float.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetLocalizedText() modifies the value of a selected item in an alt-text array.
+ ///
+ /// Creates an appropriate array item if necessary, and handles special cases for the x-default
+ /// item.
+ ///
+ /// The array item is selected according to these rules:
+ /// \li Look for an exact match with the specific language.
+ /// \li If a generic language is given, look for a partial match.
+ /// \li Look for an x-default item.
+ /// \li Choose the first item.
+ ///
+ /// A partial match with the generic language is where the start of the item's language matches
+ /// the generic string and the next character is '-'. An exact match is also recognized as a
+ /// degenerate case.
+ ///
+ /// You can pass "x-default" as the specific language. In this case, selection of an
+ /// \c x-default item is an exact match by the first rule, not a selection by the 3rd rule. The
+ /// last 2 rules are fallbacks used when the specific and generic languages fail to produce a
+ /// match.
+ ///
+ /// Item values are modified according to these rules:
+ ///
+ /// \li If the selected item is from a match with the specific language, the value of that
+ /// item is modified. If the existing value of that item matches the existing value of the
+ /// x-default item, the x-default item is also modified. If the array only has 1 existing item
+ /// (which is not x-default), an x-default item is added with the given value.
+ ///
+ /// \li If the selected item is from a match with the generic language and there are no other
+ /// generic matches, the value of that item is modified. If the existing value of that item
+ /// matches the existing value of the x-default item, the x-default item is also modified. If
+ /// the array only has 1 existing item (which is not x-default), an x-default item is added
+ /// with the given value.
+ ///
+ /// \li If the selected item is from a partial match with the generic language and there are
+ /// other partial matches, a new item is created for the specific language. The x-default item
+ /// is not modified.
+ ///
+ /// \li If the selected item is from the last 2 rules then a new item is created for the
+ /// specific language. If the array only had an x-default item, the x-default item is also
+ /// modified. If the array was empty, items are created for the specific language and
+ /// x-default.
+ ///
+ /// @param schemaNS The namespace URI for the alt-text array; see \c GetProperty().
+ ///
+ /// @param altTextName The name of the alt-text array. Can be a general path expression, must
+ /// not be null or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param schemaNS The namespace URI for the property. Has the same usage as in \c GetProperty.
+ /// @param genericLang The name of the generic language as an RFC 3066 primary subtag. Can be
+ /// null or the empty string if no generic language is wanted.
///
- /// \param propName The name of the property. Has the same usage as in \c GetProperty.
+ /// @param specificLang The name of the specific language as an RFC 3066 tag, or "x-default".
+ /// Must not be null or the empty string.
///
- /// \param propValue The double float value to be assigned to the property.
+ /// @param itemValue The new value for the matching array item, specified as a null-terminated
+ /// UTF-8 string.
///
- /// \param options Option flags describing the property.
+ /// @param options Option flags, none currently defined.
- void
- SetProperty_Float ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- double propValue,
- XMP_OptionBits options = 0 );
+ void SetLocalizedText ( XMP_StringPtr schemaNS,
+ XMP_StringPtr altTextName,
+ XMP_StringPtr genericLang,
+ XMP_StringPtr specificLang,
+ XMP_StringPtr itemValue,
+ XMP_OptionBits options = 0 );
- // --------------------------------------------------------------------------------------------
- /// \brief \c SetProperty_Date sets the value of a date/time property from an \c XMP_DateTime struct.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetLocalizedText() modifies the value of a selected item in an alt-text array using
+ /// a string object.
+ ///
+ /// Creates an appropriate array item if necessary, and handles special cases for the x-default
+ /// item.
+ ///
+ /// The array item is selected according to these rules:
+ /// \li Look for an exact match with the specific language.
+ /// \li If a generic language is given, look for a partial match.
+ /// \li Look for an x-default item.
+ /// \li Choose the first item.
+ ///
+ /// A partial match with the generic language is where the start of the item's language matches
+ /// the generic string and the next character is '-'. An exact match is also recognized as a
+ /// degenerate case.
+ ///
+ /// You can pass "x-default" as the specific language. In this case, selection of an \c x-default
+ /// item is an exact match by the first rule, not a selection by the 3rd rule. The last 2 rules
+ /// are fallbacks used when the specific and generic languages fail to produce a match.
+ ///
+ /// Item values are modified according to these rules:
+ ///
+ /// \li If the selected item is from a match with the specific language, the value of that
+ /// item is modified. If the existing value of that item matches the existing value of the
+ /// x-default item, the x-default item is also modified. If the array only has 1 existing item
+ /// (which is not x-default), an x-default item is added with the given value.
+ ///
+ /// \li If the selected item is from a match with the generic language and there are no other
+ /// generic matches, the value of that item is modified. If the existing value of that item
+ /// matches the existing value of the x-default item, the x-default item is also modified. If
+ /// the array only has 1 existing item (which is not x-default), an x-default item is added
+ /// with the given value.
///
- /// \param schemaNS The namespace URI for the property. Has the same usage as in \c GetProperty.
+ /// \li If the selected item is from a partial match with the generic language and there are
+ /// other partial matches, a new item is created for the specific language. The x-default item
+ /// is not modified.
///
- /// \param propName The name of the property. Has the same usage as in \c GetProperty.
+ /// \li If the selected item is from the last 2 rules then a new item is created for the
+ /// specific language. If the array only had an x-default item, the x-default item is also
+ /// modified. If the array was empty, items are created for the specific language and
+ /// x-default.
///
- /// \param propValue The \c XMP_DateTime value to be assigned to the property.
+ /// @param schemaNS The namespace URI for the alt-text array; see \c GetProperty().
///
- /// \param options Option flags describing the property.
+ /// @param altTextName The name of the alt-text array. Can be a general path expression, must
+ /// not be null or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param genericLang The name of the generic language as an RFC 3066 primary subtag. Can be
+ /// null or the empty string if no generic language is wanted.
+ ///
+ /// @param specificLang The name of the specific language as an RFC 3066 tag, or "x-default".
+ /// Must not be null or the empty string.
+ ///
+ /// @param itemValue The new value for the matching array item, specified as a string object.
+ ///
+ /// @param options Option flags, none currently defined.
- void
- SetProperty_Date ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- const XMP_DateTime & propValue,
- XMP_OptionBits options = 0 );
+ void SetLocalizedText ( XMP_StringPtr schemaNS,
+ XMP_StringPtr altTextName,
+ XMP_StringPtr genericLang,
+ XMP_StringPtr specificLang,
+ const tStringObj & itemValue,
+ XMP_OptionBits options = 0 );
/// @}
- // =============================================================================================
- // Miscellaneous Member Functions
- // ==============================
-
- // --------------------------------------------------------------------------------------------
- /// \name Misceallaneous functions.
+ // =============================================================================================
+ /// \name Creating and reading serialized RDF.
/// @{
+ ///
+ /// The metadata contained in an XMP object must be serialized as RDF for storage in an XMP
+ /// packet and output to a file. Similarly, metadata in the form of serialized RDF (such as
+ /// metadata read from a file using \c TXMPFiles) must be parsed into an XMP object for
+ /// manipulation with the XMP Toolkit.
+ ///
+ /// These functions support parsing serialized RDF into an XMP object, and serializing an XMP
+ /// object into RDF. The input for parsing can be any valid Unicode encoding. ISO Latin-1 is
+ /// also recognized, but its use is strongly discouraged. Serialization is always as UTF-8.
- // --------------------------------------------------------------------------------------------
- /// \brief GetInternalRef Returns an internal reference that may be safely passed across DLL
- /// boundaries and reconstructed.
-
- XMPMetaRef
- GetInternalRef() const;
-
- // --------------------------------------------------------------------------------------------
- /// \brief GetObjectName --TBD--
-
- void
- GetObjectName ( tStringObj * name ) const;
-
- // --------------------------------------------------------------------------------------------
- /// \brief SetObjectName --TBD--
-
- void
- SetObjectName ( XMP_StringPtr name );
-
- // --------------------------------------------------------------------------------------------
- /// \brief SetObjectName --TBD--
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ParseFromBuffer() parses RDF from a series of input buffers into this XMP object.
+ ///
+ /// Use this to convert metadata from serialized RDF form (as, for example, read from an XMP
+ /// packet embedded in a file) into an XMP object that you can manipulate with the XMP Toolkit.
+ /// If this XMP object is empty and the input buffer contains a complete XMP packet, this is the
+ /// same as creating a new XMP object from that buffer with the constructor.
+ ///
+ /// You can use this function to combine multiple buffers into a single metadata tree. To
+ /// terminate an input loop conveniently, pass the option \c #kXMP_ParseMoreBuffers for all
+ /// real input, then make a final call with a zero length and \c #kXMP_NoOptions. The buffers
+ /// can be any length. The buffer boundaries need not respect XML tokens or even Unicode
+ /// characters.
+ ///
+ /// @param buffer A pointer to a buffer of input. Can be null if \c bufferSize is 0.
+ ///
+ /// @param bufferSize The length of the input buffer in bytes. Zero is a valid value.
+ ///
+ /// @param options An options flag that controls how the parse operation is performed. A logical
+ /// OR of these bit-flag constants:
+ /// \li \c #kXMP_ParseMoreBuffers - This is not the last buffer of input, more calls follow.
+ /// \li \c #kXMP_RequireXMPMeta - The \c x:xmpmeta XML element is required around \c rdf:RDF.
+ ///
+ /// @see \c TXMPFiles::GetXMP()
+
+ void ParseFromBuffer ( XMP_StringPtr buffer,
+ XMP_StringLen bufferSize,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SerializeToBuffer() serializes metadata in this XMP object into a string as RDF.
+ ///
+ /// Use this to prepare metadata for storage as an XMP packet embedded in a file. See \c TXMPFiles::PutXMP().
+ ///
+ /// @param rdfString [out] A string object in which to return the serialized RDF. Must not be null.
+ ///
+ /// @param options An options flag that controls how the serialization operation is performed.
+ /// The specified options must be logically consistent; an exception is thrown if they are not.
+ /// A logical OR of these bit-flag constants:
+ /// \li \c kXMP_OmitPacketWrapper - Do not include an XML packet wrapper. This cannot be
+ /// specified together with \c #kXMP_ReadOnlyPacket, \c #kXMP_IncludeThumbnailPad, or
+ /// \c #kXMP_ExactPacketLength.
+ /// \li \c kXMP_ReadOnlyPacket - Create a read-only XML packet wapper. Cannot be specified
+ /// together with \c kXMP_OmitPacketWrapper.
+ /// \li \c kXMP_UseCompactFormat - Use a highly compact RDF syntax and layout.
+ /// \li \c kXMP_WriteAliasComments - Include XML comments for aliases.
+ /// \li \c kXMP_IncludeThumbnailPad - Include typical space for a JPEG thumbnail in the
+ /// padding if no \c xmp:Thumbnails property is present. Cannot be specified together with
+ /// \c kXMP_OmitPacketWrapper.
+ /// \li \c kXMP_ExactPacketLength - The padding parameter provides the overall packet length.
+ /// The actual amount of padding is computed. An exception is thrown if the packet exceeds
+ /// this length with no padding. Cannot be specified together with
+ /// \c kXMP_OmitPacketWrapper.
+ ///
+ /// In addition to the above options, you can include one of the following encoding options:
+ /// \li \c #kXMP_EncodeUTF8 - Encode as UTF-8, the default.
+ /// \li \c #kXMP_EncodeUTF16Big - Encode as big-endian UTF-16.
+ /// \li \c #kXMP_EncodeUTF16Little - Encode as little-endian UTF-16.
+ /// \li \c #kXMP_EncodeUTF32Big - Encode as big-endian UTF-32.
+ /// \li \c #kXMP_EncodeUTF32Little - Encode as little-endian UTF-32.
+ ///
+ /// @param padding The amount of padding to be added if a writeable XML packet is created. If
+ /// zero (the default) an appropriate amount of padding is computed.
+ ///
+ /// @param newline The string to be used as a line terminator. If empty, defaults to linefeed,
+ /// U+000A, the standard XML newline.
+ ///
+ /// @param indent The string to be used for each level of indentation in the serialized RDF. If
+ /// empty, defaults to two ASCII spaces, U+0020.
+ ///
+ /// @param baseIndent The number of levels of indentation to be used for the outermost XML
+ /// element in the serialized RDF. This is convenient when embedding the RDF in other text.
- void
- SetObjectName ( tStringObj name );
+ void SerializeToBuffer ( tStringObj * rdfString,
+ XMP_OptionBits options,
+ XMP_StringLen padding,
+ XMP_StringPtr newline,
+ XMP_StringPtr indent = "",
+ XMP_Index baseIndent = 0 ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SerializeToBuffer() serializes metadata in this XMP object into a string as RDF.
+ ///
+ /// This simpler form of the function uses default values for the \c newline, \c indent, and
+ /// \c baseIndent parameters.
+ ///
+ /// @param rdfString [out] A string object in which to return the serialized RDF. Must not be null.
+ ///
+ /// @param options An options flag that controls how the serialization operation is performed.
+ /// The specified options must be logically consistent; an exception is thrown if they are not.
+ /// A logical OR of these bit-flag constants:
+ /// \li \c kXMP_OmitPacketWrapper - Do not include an XML packet wrapper. This cannot be
+ /// specified together with \c #kXMP_ReadOnlyPacket, \c #kXMP_IncludeThumbnailPad, or
+ /// \c #kXMP_ExactPacketLength.
+ /// \li \c kXMP_ReadOnlyPacket - Create a read-only XML packet wapper. Cannot be specified
+ /// together with \c kXMP_OmitPacketWrapper.
+ /// \li \c kXMP_UseCompactFormat - Use a highly compact RDF syntax and layout.
+ /// \li \c kXMP_WriteAliasComments - Include XML comments for aliases.
+ /// \li \c kXMP_IncludeThumbnailPad - Include typical space for a JPEG thumbnail in the
+ /// padding if no \c xmp:Thumbnails property is present. Cannot be specified together with
+ /// \c kXMP_OmitPacketWrapper.
+ /// \li \c kXMP_ExactPacketLength - The padding parameter provides the overall packet length.
+ /// The actual amount of padding is computed. An exception is thrown if the packet exceeds
+ /// this length with no padding. Cannot be specified together with
+ /// \c kXMP_OmitPacketWrapper.
+ ///
+ /// In addition to the above options, you can include one of the following encoding options:
+ /// \li \c #kXMP_EncodeUTF8 - Encode as UTF-8, the default.
+ /// \li \c #kXMP_EncodeUTF16Big - Encode as big-endian UTF-16.
+ /// \li \c #kXMP_EncodeUTF16Little - Encode as little-endian UTF-16.
+ /// \li \c #kXMP_EncodeUTF32Big - Encode as big-endian UTF-32.
+ /// \li \c #kXMP_EncodeUTF32Little - Encode as little-endian UTF-32.
+ ///
+ /// @param padding The amount of padding to be added if a writeable XML packet is created.
+ /// If zero (the default) an appropriate amount of padding is computed.
+
+ void SerializeToBuffer ( tStringObj * rdfString,
+ XMP_OptionBits options = 0,
+ XMP_StringLen padding = 0 ) const;
- // --------------------------------------------------------------------------------------------
- /// \brief GetObjectOptions --TBD--
+ /// @}
+ // =============================================================================================
+ // Miscellaneous Member Functions
+ // ==============================
- XMP_OptionBits
- GetObjectOptions() const;
+ // ---------------------------------------------------------------------------------------------
+ /// \name Helper functions.
+ /// @{
- // --------------------------------------------------------------------------------------------
- /// \brief SetObjectOptions --TBD--
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Retrieves an internal reference that can be safely passed across DLL boundaries and
+ /// reconstructed.
///
- /// \note <b>Not yet implemented.</b> File a bug if you need this.
-
- void
- SetObjectOptions ( XMP_OptionBits options );
-
- // --------------------------------------------------------------------------------------------
- /// \brief \c Clone creates a deep clone of the XMP object.
+ /// The \c TXMPMeta class is a normal C++ template, it is instantiated and local to each client
+ /// executable, as are the other \c TXMP* classes. Different clients might not use the same
+ /// string type to instantiate \c TXMPMeta.
///
- /// This function creates a deep clone of the XMP object. Assignment and copy constructors do
- /// not, they just increment a reference count. Note that \c Clone returns an object, not a
- /// pointer. This is easy to misuse:
+ /// Because of this you should not pass \c SXMPMeta objects, or pointers to \c SXMPMeta objects,
+ /// across DLL boundaries. Use this function to obtain a safe internal reference that you can
+ /// pass, then construct a local object on the callee side. This construction does not create a
+ /// cloned XMP tree, it is the same underlying XMP object safely wrapped in each client's
+ /// \c SXMPMeta object.
///
- /// \code
- /// SXMPMeta * clone1 = &sourceXMP.Clone(); // ! This does not work!
- /// SXMPMeta * clone2 = new SXMPMeta ( sourceXMP.Clone() ); // This works.
- /// SXMPMeta clone3 ( sourceXMP.Clone ); // This works also. (Not a pointer.)
- /// \endcode
+ /// Use this function and the associated constructor like this:
+ /// \li The callee's header contains:
+ /// <pre>
+ /// CalleeMethod ( XMPMetaRef xmpRef );
+ /// </pre>
///
- /// In the code above, the assignment to \c clone1 creates a temporary object, initializes it
- /// with the clone, assigns the address of the temporary to \c clone1, then deletes the
- /// temporary. The \c clone3 example also works, you do not have to use an explicit pointer.
- /// This is good for local usage, you don't have to worry about memory leaks.
+ /// \li The caller's code contains:
+ /// <pre>
+ /// SXMPMeta callerXMP;
+ /// CalleeMethod ( callerXMP.GetInternalRef() );
+ /// </pre>
///
- /// \param options Option flags, not are defined at present.
+ /// \li The callee's code contains:
+ /// <pre>
+ /// SXMPMeta calleeXMP ( xmpRef );
+ /// </pre>
///
- /// \result An XMP object cloned from the original.
+ /// @return The reference object.
- TXMPMeta
- Clone ( XMP_OptionBits options = 0 ) const;
+ XMPMetaRef GetInternalRef() const;
- // --------------------------------------------------------------------------------------------
- /// \brief CountArrayItems --TBD--
-
- XMP_Index
- CountArrayItems ( XMP_StringPtr schemaNS,
- XMP_StringPtr arrayName ) const;
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetObjectName() retrieves the client-assigned name of this XMP object.
+ ///
+ /// Assign this name with \c SetObjectName().
+ ///
+ /// @param name [out] A string object in which to return the name.
- // --------------------------------------------------------------------------------------------
- /// \brief \c DumpObject dumps the content of an XMP object.
+ void GetObjectName ( tStringObj * name ) const;
- XMP_Status
- DumpObject ( XMP_TextOutputProc outProc,
- void * refCon ) const;
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetObjectName() assigns a name to this XMP object.
+ ///
+ /// Retrieve this client-assigned name with \c GetObjectName().
+ ///
+ /// @param name The name as a null-terminated UTF-8 string.
- /// @}
+ void SetObjectName ( XMP_StringPtr name );
- // =============================================================================================
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetObjectName() assigns a name to this XMP object.
+ ///
+ /// Retrieve this client-assigned name with \c GetObjectName().
+ ///
+ /// @param name The name as a string object.
- // --------------------------------------------------------------------------------------------
- /// \name Functions for parsing and serializing.
- /// @{
- /// These functions support parsing serialized RDF into an XMP object, and serailizing an XMP
- /// object into RDF. The input for parsing may be any valid Unicode encoding. ISO Latin-1 is
- /// also recognized, but its use is strongly discouraged. Serialization is always as UTF-8.
+ void SetObjectName ( tStringObj name );
- // --------------------------------------------------------------------------------------------
- /// \brief \c ParseFromBuffer parses RDF from a series of input buffers. The buffers may be any
- /// length. The buffer boundaries need not respect XML tokens or even Unicode characters.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c Sort() sorts the data model tree of an XMP object.
///
- /// \param buffer A pointer to a buffer of input. May be null if \c bufferSize is 0.
+ /// Use this function to sort the data model of an XMP object into a canonical order. This can
+ /// be convenient when comparing data models, (e.g. by text comparison of DumpObject output).
+ ///
+ /// At the top level the namespaces are sorted by their prefixes. Within a namespace, the top
+ /// level properties are sorted by name. Within a struct, the fields are sorted by their
+ /// qualified name, i.e. their XML prefix:local form. Unordered arrays of simple items are
+ /// sorted by value. Language Alternative arrays are sorted by the xml:lang qualifiers, with
+ /// the "x-default" item placed first.
+
+ void Sort();
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c Erase() restores the object to a "just constructed" state.
+
+ void Erase();
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c Clone() creates a deep copy of an XMP object.
///
- /// \param bufferSize The length of this buffer in bytes. Zero is a valid value. Termination of
- /// an input loop is convenient by passing \c kXMP_ParseMoreBuffers for all real input, then
- /// having a final call with a zero length and \c kXMP_NoOptions.
+ /// Use this function to copy an entire XMP metadata tree. Assignment and copy constructors only
+ /// increment a reference count, they do not do a deep copy. This function returns an object,
+ /// not a pointer. The following shows correct usage:
///
- /// \param options Options controlling the parsing.
+ /// <pre>
+ /// SXMPMeta * clone1 = new SXMPMeta ( sourceXMP.Clone() ); // This works.
+ /// SXMPMeta clone2 ( sourceXMP.Clone ); // This works also. (Not a pointer.)
+ /// </pre>
+ /// The \c clone2 example does not use an explicit pointer.
+ /// This is good for local usage, protecting against memory leaks.
///
- /// The available options are:
+ /// This is an example of incorrect usage:
+ /// <pre>
+ /// SXMPMeta * clone3 = &sourceXMP.Clone(); // ! This does not work!
+ /// </pre>
+ /// The assignment to \c clone3 creates a temporary object, initializes it with the clone,
+ /// assigns the address of the temporary to \c clone3, then deletes the temporary.
///
- /// \li \c kXMP_ParseMoreBuffers - This is not the last buffer of input, more calls follow.
- /// \li \c kXMP_RequireXMPMeta - The x:xmpmeta XML element is required around <tt>rdf:RDF</tt>.
- /// \li \c kXMP_StrictAliasing - Do not reconcile alias differences, throw an exception.
+ /// @param options Option flags, not currently defined..
///
- /// \note The \c kXMP_StrictAliasing option is not yet implemented.
+ /// @return An XMP object cloned from the original.
- void
- ParseFromBuffer ( XMP_StringPtr buffer,
- XMP_StringLen bufferSize,
- XMP_OptionBits options = 0 );
+ TXMPMeta Clone ( XMP_OptionBits options = 0 ) const;
- // --------------------------------------------------------------------------------------------
- /// \brief \c SerializeToBuffer serializes an XMP object into a string as RDF.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CountArrayItems() reports the number of items currently defined in an array.
///
- /// \param rdfString A pointer to the string to receive the serialized RDF. Must not be null.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param options Option flags to control the serialization.
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param padding The amount of padding to be added if a writeable XML packet is created. If
- /// zero is passed (the default) an appropriate amount of padding is computed.
+ /// @return The number of items.
+
+ XMP_Index CountArrayItems ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DumpObject() outputs the content of an XMP object to a callback handler for debugging.
///
- /// \param newline The string to be used as a line terminator. If empty it defaults to
- /// linefeed, U+000A, the standard XML newline.
+ /// Invokes a client-defined callback for each line of output.
///
- /// \param indent The string to be used for each level of indentation in the serialized RDF. If
- /// empty it defaults to two ASCII spaces, U+0020.
+ /// @param outProc The client-defined procedure to handle each line of output.
///
- /// \param baseIndent The number of levels of indentation to be used for the outermost XML
- /// element in the serialized RDF. This is convenient when embedding the RDF in other text.
+ /// @param clientData A pointer to client-defined data to pass to the handler.
+ ///
+ /// @return A success-fail status value, returned from the handler. Zero is success, failure
+ /// values are client-defined.
///
- /// The available option flags are:
- ///
- /// \li \c kXMP_OmitPacketWrapper - Do not include an XML packet wrapper.
- /// \li \c kXMP_ReadOnlyPacket - Create a read-only XML packet wapper.
- /// \li \c kXMP_UseCompactFormat - Use a highly compact RDF syntax and layout.
- /// \li \c kXMP_WriteAliasComments - Include XML comments for aliases.
- /// \li \c kXMP_IncludeThumbnailPad - Include typical space for a JPEG thumbnail in the padding
- /// if no <tt>xmp:Thumbnails</tt> property is present.
- /// \li \c kXMP_ExactPacketLength - The padding parameter provides the overall packet length.
- /// The actual amount of padding is computed. An exception is thrown if the packet exceeds this
- /// length with no padding.
- ///
- /// The specified options must be logically consistent, an exception is thrown if not. You
- /// cannot specify both \c kXMP_OmitPacketWrapper along with \c kXMP_ReadOnlyPacket, \c
- /// kXMP_IncludeThumbnailPad, or \c kXMP_ExactPacketLength.
- ///
- /// In addition, one of the following encoding options may be included:
- ///
- /// \li \c kXMP_EncodeUTF8 - Encode as UTF-8, the default.
- /// \li \c kXMP_EncodeUTF16Big - Encode as big-endian UTF-16.
- /// \li \c kXMP_EncodeUTF16Little - Encode as little-endian UTF-16.
- /// \li \c kXMP_EncodeUTF32Big - Encode as big-endian UTF-32.
- /// \li \c kXMP_EncodeUTF32Little - Encode as little-endian UTF-32.
-
- void
- SerializeToBuffer ( tStringObj * rdfString,
- XMP_OptionBits options,
- XMP_StringLen padding,
- XMP_StringPtr newline,
- XMP_StringPtr indent = "",
- XMP_Index baseIndent = 0 ) const;
-
- // --------------------------------------------------------------------------------------------
- /// \brief This form of \c SerializeToBuffer is a simple overload in the template that calls the
- /// above form passing default values for the \c newline, \c indent, and \c baseIndent
- /// parameters.
-
- void
- SerializeToBuffer ( tStringObj * rdfString,
- XMP_OptionBits options = 0,
- XMP_StringLen padding = 0 ) const;
+ /// @see Static functions \c DumpNamespaces() and \c DumpAliases()
+
+ XMP_Status DumpObject ( XMP_TextOutputProc outProc,
+ void * clientData ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Not implemented
+ XMP_OptionBits GetObjectOptions() const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// \brief Not implemented
+ void SetObjectOptions ( XMP_OptionBits options );
/// @}
diff --git a/public/include/TXMPUtils.hpp b/public/include/TXMPUtils.hpp
index 95cdc9c..4c69edd 100644
--- a/public/include/TXMPUtils.hpp
+++ b/public/include/TXMPUtils.hpp
@@ -7,41 +7,46 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
// of the Adobe license agreement accompanying it.
// =================================================================================================
-// ================================================================================================
+// =================================================================================================
/// \file TXMPUtils.hpp
-/// \brief Template class for the XMP Toolkit utility services.
+/// \brief API for access to the XMP Toolkit utility services.
///
-/// \c TXMPUtils is the template class providing utility services for the XMP Toolkit. It should be
-/// instantiated with a string class such as <tt>std::string</tt>. Please read the general toolkit
-/// usage notes for information about the overall architecture of the XMP API.
-// ================================================================================================
+/// \c TXMPUtils is the template class providing utility services for the XMP Toolkit. It must be
+/// instantiated with a string class such as \c std::string. See the instructions in XMP.hpp, and
+/// the Overview for a discussion of the overall architecture of the XMP API.
+// =================================================================================================
-// ================================================================================================
+// =================================================================================================
/// \class TXMPUtils TXMPUtils.hpp
-/// \brief Template class for the XMP Toolkit utility services.
+/// @brief API for access to the XMP Toolkit utility services.
///
-/// \c TXMPUtils is the template class providing utility services for the XMP Toolkit. It should be
-/// instantiated with a string class such as <tt>std::string</tt>. Please read the general toolkit
-/// usage notes for information about the overall architecture of the XMP API.
+/// \c TXMPUtils is a template class which must be instantiated with a string class such as
+/// \c std::string. See the instructions in XMP.hpp, and the Overview for a discussion of the overall
+/// architecture of the XMP API.
///
-/// This is a class for C++ scoping purposes only. It has only static functions, you cannot create
-/// an object. These are all functions that layer cleanly on top of the core XMP toolkit. The
-/// template wraps a string class around the raw XMP API, so that output strings are automatically
-/// copied and access is fully thread safe. String objects are only necessary for output strings.
-/// Input strings are literals and passed as typical C <tt>const char *</tt>.
+/// This class defines helper functions that support the basic metadata manipulation provided by
+/// \c TXMPMeta. All of the functions are static; that is, you call them directly from the concrete
+/// class (\c SXMPUtils), which is never itself instantiated.
///
-/// The template parameter, class \c TtStringObj, is described in the XMP.hpp umbrella header.
-// ================================================================================================
+/// General categories of utilities include:
+///
+/// \li Composing complex path expressions, which you can then pass to the property access
+/// functions in \c TXMPMeta
+/// \li Converting between binary and string forms of property values
+/// \li Manipulating date/time values
+/// \li Encoding and decoding base-64 strings
+/// \li JPEG file handling
+/// \li Editing aids for creating a user interface for the XMP Toolkit
+// =================================================================================================
-template <class tStringObj>
-class TXMPUtils {
+template <class tStringObj> class TXMPUtils {
public:
@@ -49,795 +54,910 @@ public:
// No constructors or destructor declared or needed
// ================================================
- // =============================================================================================
- // =============================================================================================
-
// ============================================================================================
- /// \name Path composition functions
+ /// \name Path composition
/// @{
+ ///
/// These functions provide support for composing path expressions to deeply nested properties.
- /// The functions in \c TXMPMeta such as \c GetProperty, \c GetArrayItem, and \c GetStructField
- /// provide easy access to top level simple properties, items in top level arrays, and fields
- /// of top level structs. They do not provide convenient access to more complex things like
- /// fields several levels deep in a complex struct, or fields within an array of structs, or
- /// items of an array that is a field of a struct. These functions can also be used to compose
- /// paths to top level array items or struct fields so that you can use the binary accessors
- /// like \c GetProperty_Int.
+ /// The functions in \c TXMPMeta such as \c TXMPMeta::GetProperty(),
+ /// \c TXMPMeta::GetArrayItem(), and \c TXMPMeta::GetStructField() provide easy access to top level
+ /// simple properties, items in top level arrays, and fields of top level structs. They are
+ /// not as convenient for more complex things, such as fields several levels deep in a complex
+ /// struct, or fields within an array of structs, or items of an array that is a field of a
+ /// struct. You can use these utility functions to compose these paths, which you can then pass
+ /// to the property access functions. You can also compose paths to top-level array items or
+ /// struct fields so that you can use the binary accessors such as
+ /// \c TXMPMeta::GetProperty_Int().
///
/// You can use these functions is to compose a complete path expression, or all but the last
- /// component. Suppose you have a property that is an array of integers within a struct. You can
- /// access one of the array items like this:
+ /// component. For example, suppose you have a property that is an array of integers within a
+ /// struct. You can access one of the array items like this:
///
- /// \verbatim
- /// SXMPUtils::ComposeStructFieldPath ( schemaNS, "Struct", fieldNS, "Array", &path );
- /// SXMPUtils::ComposeArrayItemPath ( schemaNS, path, index, &path );
- /// exists = xmpObj.GetProperty_Int ( schemaNS, path, &value, &options );
- /// \endverbatim
+ /// <pre>
+ /// SXMPUtils::ComposeStructFieldPath ( schemaNS, "Struct", fieldNS, "Array", &path );
+ /// SXMPUtils::ComposeArrayItemPath ( schemaNS, path, index, &path );
+ /// exists = xmpObj.GetProperty_Int ( schemaNS, path, &value, &options );
+ /// </pre>
///
/// You could also use this code if you want the string form of the integer:
///
- /// \verbatim
- /// SXMPUtils::ComposeStructFieldPath ( schemaNS, "Struct", fieldNS, "Array", &path );
- /// xmpObj.GetArrayItem ( schemaNS, path, index, &value, &options );
- /// \endverbatim
+ /// <pre>
+ /// SXMPUtils::ComposeStructFieldPath ( schemaNS, "Struct", fieldNS, "Array", &path );
+ /// xmpObj.GetArrayItem ( schemaNS, path, index, &value, &options );
+ /// </pre>
///
/// \note It might look confusing that the \c schemaNS is passed in all of the calls above. This
- /// is because the XMP toolkit keeps the top level "schema" namespace separate from the rest
- /// of the path expression.
+ /// is because the XMP Toolkit keeps the top-level "schema" namespace separate from the rest of
+ /// the path expression.
- // --------------------------------------------------------------------------------------------
- /// \brief Compose the path expression for an item in an array.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ComposeArrayItemPath() composes the path expression for an item in an array.
///
- /// \param schemaNS The namespace URI for the array. Must not be null or the empty string.
+ /// The returned string is in the form <tt>ns:arrayName[i]</tt>, where "ns" is the prefix for
+ /// the specified namespace, and "i" is the decimal representation of specified item index.
+ /// If the last item was specified, the path is <tt>ns:arrayName[last()]</tt>.
///
- /// \param arrayName The name of the array. May be a general path expression, must not be null
- /// or the empty string.
+ /// @param schemaNS The namespace URI for the array; see \c GetProperty().
+ ///
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param itemIndex The index of the desired item. Arrays in XMP are indexed from 1. The
- /// constant \c kXMP_ArrayLastItem always refers to the last existing array item.
+ /// @param itemIndex The 1-based index of the desired item. Use the macro
+ /// \c #kXMP_ArrayLastItem to specify the last existing array item.
///
- /// \param fullPath A pointer to the string that will be assigned the composed path. This will
- /// be of the form <tt>ns:arrayName[i]</tt>, where "ns" is the prefix for \c schemaNS and "i"
- /// is the decimal representation of \c itemIndex. If the value of \c itemIndex is
- /// \c kXMP_ArrayLastItem, the path is <tt>ns:arrayName[last()]</tt>.
+ /// @param fullPath [out] A string in which to return the composed path.
- static void
- ComposeArrayItemPath ( XMP_StringPtr schemaNS,
- XMP_StringPtr arrayName,
- XMP_Index itemIndex,
- tStringObj * fullPath );
+ static void ComposeArrayItemPath ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ tStringObj * fullPath );
- // --------------------------------------------------------------------------------------------
- /// \brief Compose the path expression for a field in a struct.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ComposeStructFieldPath() composes the path expression for a field in a struct.
///
- /// \param schemaNS The namespace URI for the struct. Must not be null or the empty string.
+ /// The returned string is in the form <tt>ns:structName/fNS:fieldName</tt>, where "ns" is the
+ /// prefix for the schema namespace, and "fNS" is the prefix for field namespace.
///
- /// \param structName The name of the struct. May be a general path expression, must not be null
- /// or the empty string.
+ /// @param schemaNS The namespace URI for the struct; see \c GetProperty().
///
- /// \param fieldNS The namespace URI for the field. Must not be null or the empty string.
+ /// @param structName The name of the struct. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param fieldName The name of the field. Must be a simple XML name, must not be null or the
- /// empty string.
+ /// @param fieldNS The namespace URI for the field. Same URI and prefix usage as the
+ /// \c schemaNS and \c structName parameters.
///
- /// \param fullPath A pointer to the string that will be assigned the composed path. This will
- /// be of the form <tt>ns:structName/fNS:fieldName</tt>, where "ns" is the prefix for
- /// \c schemaNS and "fNS" is the prefix for \c fieldNS.
+ /// @param fieldName The name of the field. Must be a single XML name, must not be null or the
+ /// empty string. Same URI and prefix usage as the \c schemaNS and \c structName parameters.
+ ///
+ /// @param fullPath [out] A string in which to return the composed path.
- static void
- ComposeStructFieldPath ( XMP_StringPtr schemaNS,
- XMP_StringPtr structName,
- XMP_StringPtr fieldNS,
- XMP_StringPtr fieldName,
- tStringObj * fullPath );
+ static void ComposeStructFieldPath ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ tStringObj * fullPath );
- // --------------------------------------------------------------------------------------------
- /// \brief Compose the path expression for a qualifier.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ComposeQualifierPath() composes the path expression for a qualifier.
+ ///
+ /// The returned string is in the form <tt>ns:propName/?qNS:qualName</tt>, where "ns" is the
+ /// prefix for the schema namespace, and "qNS" is the prefix for the qualifier namespace.
///
- /// \param schemaNS The namespace URI for the property to which the qualifier is attached. Must
- /// not be null or the empty string.
+ /// @param schemaNS The namespace URI; see \c GetProperty().
///
- /// \param propName The name of the property to which the qualifier is attached. May be a general
- /// path expression, must not be null or the empty string.
+ /// @param propName The name of the property to which the qualifier is attached. Can be a
+ /// general path expression, must not be null or the empty string; see \c GetProperty() for
+ /// namespace prefix usage.
///
- /// \param qualNS The namespace URI for the qualifier. May be null or the empty string if the
- /// qualifier is in the XML empty namespace.
+ /// @param qualNS The namespace URI for the qualifier. Same URI and prefix usage as the
+ /// \c schemaNS and \c propName parameters.
///
- /// \param qualName The name of the qualifier. Must be a simple XML name, must not be null or the
- /// empty string.
+ /// @param qualName The name of the qualifier. Must be a single XML name, must not be null or the
+ /// empty string. Same URI and prefix usage as the \c schemaNS and \c propName parameters.
///
- /// \param fullPath A pointer to the string that will be assigned the composed path. This will
- /// be of the form <tt>ns:propName/?qNS:qualName</tt>, where "ns" is the prefix for \c schemaNS
- /// and "qNS" is the prefix for \c qualNS.
+ /// @param fullPath [out] A string in which to return the composed path.
- static void
- ComposeQualifierPath ( XMP_StringPtr schemaNS,
- XMP_StringPtr propName,
- XMP_StringPtr qualNS,
- XMP_StringPtr qualName,
- tStringObj * fullPath );
+ static void ComposeQualifierPath ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ tStringObj * fullPath );
- // --------------------------------------------------------------------------------------------
- /// \brief Compose the path expression to select an alternate item by language.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ComposeLangSelector() composes the path expression to select an alternate item by language.
///
- /// The path syntax allows two forms of "content addressing" that may be used to select an item
- /// in an array of alternatives. The form used in \c ComposeLangSelector lets you select an
- /// item in an alt-text array based on the value of its <tt>xml:lang</tt> qualifier. The other
- /// form of content addressing is shown in \c ComposeFieldSelector.
+ /// Path syntax allows two forms of "content addressing" to select an item in an array of
+ /// alternatives. The form used in this function lets you select an item in an alt-text array
+ /// based on the value of its \c xml:lang qualifier. The other form of content addressing is
+ /// shown in \c ComposeFieldSelector().
///
- /// \note \c ComposeLangSelector does not supplant \c SetLocalizedText or \c GetLocalizedText.
- /// They should generally be used, as they provide extra logic to choose the appropriate
- /// language and maintain consistency with the 'x-default' value. \c ComposeLangSelector gives
- /// you an path expression that is explicitly and only for the language given in the
- /// \c langName parameter.
+ /// The returned string is in the form <tt>ns:arrayName[\@xml:lang='langName']</tt>, where
+ /// "ns" is the prefix for the schema namespace
///
- /// \param schemaNS The namespace URI for the array. Must not be null or the empty string.
+ /// This function provides a path expression that is explicitly and only for a specific
+ /// language. In most cases, \c TXMPMeta::SetLocalizedText() and \c TXMPMeta::GetLocalizedText()
+ /// are preferred, because they provide extra logic to choose the appropriate language and
+ /// maintain consistency with the 'x-default' value.
///
- /// \param arrayName The name of the array. May be a general path expression, must not be null
- /// or the empty string.
+ /// @param schemaNS The namespace URI for the array; see \c GetProperty().
///
- /// \param langName The RFC 3066 code for the desired language.
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param fullPath A pointer to the string that will be assigned the composed path. This will
- /// be of the form <tt>ns:arrayName[\@xml:lang='langName']</tt>,
- /// where "ns" is the prefix for \c schemaNS.
+ /// @param langName The RFC 3066 code for the desired language, as a null-terminated UTF-8 string.
+ ///
+ /// @param fullPath [out] A string in which to return the composed path.
- static void
- ComposeLangSelector ( XMP_StringPtr schemaNS,
- XMP_StringPtr arrayName,
- XMP_StringPtr langName,
- tStringObj * fullPath );
+ static void ComposeLangSelector ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_StringPtr langName,
+ tStringObj * fullPath );
- // --------------------------------------------------------------------------------------------
- /// \brief This form of \c ComposeLangSelector is a simple overload in the template that calls
- /// the above form passing <tt>langName.c_str()</tt>.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ComposeLangSelector() composes a path expression to select an alternate item by language.
+ ///
+ /// Path syntax allows two forms of "content addressing" to select an item in an array of
+ /// alternatives. The form used in this function lets you select an item in an alt-text array
+ /// based on the value of its \c xml:lang qualifier. The other form of content addressing is
+ /// shown in \c ComposeFieldSelector().
+ ///
+ /// The returned string is in the form <tt>ns:arrayName[\@xml:lang='langName']</tt>, where
+ /// "ns" is the prefix for the schema namespace
+ ///
+ /// This function provides a path expression that is explicitly and only for a specific
+ /// language. In most cases, \c TXMPMeta::SetLocalizedText() and \c TXMPMeta::GetLocalizedText()
+ /// are preferred, because they provide extra logic to choose the appropriate language and
+ /// maintain consistency with the 'x-default' value.
+ ///
+ /// @param schemaNS The namespace URI for the array; see \c GetProperty().
+ ///
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param langName The RFC 3066 code for the desired language, as a string object.
+ ///
+ /// @param fullPath [out] A string in which to return the composed path.
- static void
- ComposeLangSelector ( XMP_StringPtr schemaNS,
- XMP_StringPtr arrayName,
- const tStringObj & langName,
- tStringObj * fullPath );
+ static void ComposeLangSelector ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ const tStringObj & langName,
+ tStringObj * fullPath );
- // --------------------------------------------------------------------------------------------
- /// \brief Compose the path expression to select an alternate item by a field's value.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ComposeFieldSelector() composes a path expression to select an alternate item by a field's value.
///
- /// The path syntax allows two forms of "content addressing" that may be used to select an item
- /// in an array of alternatives. The form used in \c ComposeFieldSelector lets you select an
- /// item in an array of structs based on the value of one of the fields in the structs. The
- /// other form of content addressing is shown in \c ComposeLangSelector.
+ /// Path syntax allows two forms of "content addressing" to select an item in an array of
+ /// alternatives. The form used in this function lets you select an item in an array of structs
+ /// based on the value of one of the fields in the structs. The other form of content addressing
+ /// is shown in \c ComposeLangSelector().
///
- /// For example, consider a simple struct that has two fields, the name of a city and the URI
- /// of an FTP site in that city. Use this to create an array of download alternatives. You can
- /// show the user a popup built from the values of the city fields. You can then get the
- /// corresponding URI as follows:
+ /// For example, consider a simple struct that has two fields, the name of a city and the URI of
+ /// an FTP site in that city. Use this to create an array of download alternatives. You can show
+ /// the user a popup built from the values of the city fields, then get the corresponding URI as
+ /// follows:
+ /// <pre>
+ /// ComposeFieldSelector ( schemaNS, "Downloads", fieldNS, "City", chosenCity, &path );
+ /// exists = GetStructField ( schemaNS, path, fieldNS, "URI", &uri );
+ /// </pre>
///
- /// \verbatim
- /// ComposeFieldSelector ( schemaNS, "Downloads", fieldNS, "City", chosenCity, &path );
- /// exists = GetStructField ( schemaNS, path, fieldNS, "URI", &uri );
- /// \endverbatim
+ /// The returned string is in the form <tt>ns:arrayName[fNS:fieldName='fieldValue']</tt>, where
+ /// "ns" is the prefix for the schema namespace and "fNS" is the prefix for the field namespace.
///
- /// \param schemaNS The namespace URI for the array. Must not be null or the empty string.
+ /// @param schemaNS The namespace URI for the array; see \c GetProperty().
///
- /// \param arrayName The name of the array. May be a general path expression, must not be null
- /// or the empty string.
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
///
- /// \param fieldNS The namespace URI for the field used as the selector. Must not be null or the
- /// empty string.
+ /// @param fieldNS The namespace URI for the field used as the selector. Same URI and prefix
+ /// usage as the \c schemaNS and \c arrayName parameters.
///
- /// \param fieldName The name of the field used as the selector. Must be a simple XML name, must
+ /// @param fieldName The name of the field used as the selector. Must be a single XML name, must
/// not be null or the empty string. It must be the name of a field that is itself simple.
///
- /// \param fieldValue The desired value of the field.
+ /// @param fieldValue The desired value of the field, specified as a null-terminated UTF-8 string.
///
- /// \param fullPath A pointer to the string that will be assigned the composed path. This will
- /// be of the form <tt>ns:arrayName[fNS:fieldName='fieldValue']</tt>, where "ns" is the prefix
- /// for \c schemaNS and "fNS" is the prefix for \c fieldNS.
+ /// @param fullPath [out] A string in which to return the composed path.
- static void
- ComposeFieldSelector ( XMP_StringPtr schemaNS,
- XMP_StringPtr arrayName,
- XMP_StringPtr fieldNS,
- XMP_StringPtr fieldName,
- XMP_StringPtr fieldValue,
- tStringObj * fullPath );
+ static void ComposeFieldSelector ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ XMP_StringPtr fieldValue,
+ tStringObj * fullPath );
- // --------------------------------------------------------------------------------------------
- /// \brief This form of ComposeFieldSelector is a simple overload in the template that calls the
- /// above form passing <tt>fieldValue.c_str()</tt>.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ComposeFieldSelector() composes a path expression to select an alternate item by a field's value.
+ ///
+ /// Path syntax allows two forms of "content addressing" to select an item in an array of
+ /// alternatives. The form used in this function lets you select an item in an array of structs
+ /// based on the value of one of the fields in the structs. The other form of content addressing
+ /// is shown in \c ComposeLangSelector().
+ ///
+ /// For example, consider a simple struct that has two fields, the name of a city and the URI of
+ /// an FTP site in that city. Use this to create an array of download alternatives. You can show
+ /// the user a popup built from the values of the city fields, then get the corresponding URI as
+ /// follows:
+ /// <pre>
+ /// ComposeFieldSelector ( schemaNS, "Downloads", fieldNS, "City", chosenCity, &path );
+ /// exists = GetStructField ( schemaNS, path, fieldNS, "URI", &uri );
+ /// </pre>
+ ///
+ /// The returned string is in the form <tt>ns:arrayName[fNS:fieldName='fieldValue']</tt>, where
+ /// "ns" is the prefix for the schema namespace and "fNS" is the prefix for the field namespace.
+ ///
+ /// @param schemaNS The namespace URI for the array; see \c GetProperty().
+ ///
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param fieldNS The namespace URI for the field used as the selector. Same URI and prefix
+ /// usage as the \c schemaNS and \c arrayName parameters.
+ ///
+ /// @param fieldName The name of the field used as the selector. Must be a single XML name, must
+ /// not be null or the empty string. It must be the name of a field that is itself simple.
+ ///
+ /// @param fieldValue The desired value of the field, specified as a string object.
+ ///
+ /// @param fullPath [out] A string in which to return the composed path.
- static void
- ComposeFieldSelector ( XMP_StringPtr schemaNS,
- XMP_StringPtr arrayName,
- XMP_StringPtr fieldNS,
- XMP_StringPtr fieldName,
- const tStringObj & fieldValue,
- tStringObj * fullPath );
+ static void ComposeFieldSelector ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ const tStringObj & fieldValue,
+ tStringObj * fullPath );
/// @}
// =============================================================================================
- // =============================================================================================
-
- // ============================================================================================
- /// \name Binary-String conversion functions
+ /// \name Conversion between binary types and strings
/// @{
+ ///
+ /// The main accessors in \c TXMPMeta set and retrieve property values as strings. additional
+ /// functions, such as \c TXMPMeta::SetPropertyInt(), set and retrieve property values as
+ /// explicit binary data types. Use these functions to convert between binary and string
+ /// values.
+ ///
+ /// Strings can be specified as null-terminated UTF-8 (\c #XMP_StringPtr), or as string
+ /// objects (\c tStringObj) of the type declared when instantiating the XMP classes; see
+ /// \c XMP.hpp. Alternate forms of each conversion function allow either type of string.
- // --------------------------------------------------------------------------------------------
- /// \brief Convert from Boolean to string.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertFromBool() converts a Boolean value to a string.
///
- /// \param binValue The Boolean value to be converted.
+ /// The string values of Booleans are returned by the macros \c #kXMP_TrueStr and
+ /// \c #kXMP_FalseStr in \c XMP_Const.h.
///
- /// \param strValue The string representation of the Boolean. The values used are given by the
- /// macros \c kXMP_TrueStr and \c kXMP_FalseStr found in \c XMP_Const.h.
+ /// @param binValue The Boolean value to be converted.
+ ///
+ /// @param strValue [out] A buffer in which to return the string representation of the value.
- static void
- ConvertFromBool ( bool binValue,
- tStringObj * strValue );
+ static void ConvertFromBool ( bool binValue,
+ tStringObj * strValue );
- // --------------------------------------------------------------------------------------------
- /// \brief Convert from integer to string.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertFromInt() converts a 32-bit integer value to a string.
///
- /// \param binValue The integer value to be converted.
+ /// @param binValue The integer value to be converted.
///
- /// \param format Optional C sprintf format for the conversion. Defaults to "%d".
+ /// @param format Optional. A C \c sprintf format for the conversion. Default is "%d".
///
- /// \param strValue The string representation of the integer.
+ /// @param strValue [out] A buffer in which to return the string representation of the value.
- static void
- ConvertFromInt ( long binValue,
- XMP_StringPtr format,
- tStringObj * strValue );
+ static void ConvertFromInt ( long binValue,
+ XMP_StringPtr format,
+ tStringObj * strValue );
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertFromInt64() converts a 64-bit integer value to a string.
+ ///
+ /// @param binValue The integer value to be converted.
+ ///
+ /// @param format Optional. A C \c sprintf format for the conversion. Default is "%d".
+ ///
+ /// @param strValue [out] A buffer in which to return the string representation of the value.
- static void
- ConvertFromInt64 ( long long binValue,
- XMP_StringPtr format,
- tStringObj * strValue );
+ static void ConvertFromInt64 ( long long binValue,
+ XMP_StringPtr format,
+ tStringObj * strValue );
- // --------------------------------------------------------------------------------------------
- /// \brief Convert from floating point to string.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertFromFloat() converts a floating-point value to a string.
///
- /// \param binValue The floating point value to be converted.
+ /// @param binValue The floating-point value to be converted.
///
- /// \param format Optional C sprintf format for the conversion. Defaults to "%f".
+ /// @param format Optional. A C \c sprintf format for the conversion. Default is "%d".
///
- /// \param strValue The string representation of the floating point value.
+ /// @param strValue [out] A buffer in which to return the string representation of the value.
- static void
- ConvertFromFloat ( double binValue,
- XMP_StringPtr format,
- tStringObj * strValue );
+ static void ConvertFromFloat ( double binValue,
+ XMP_StringPtr format,
+ tStringObj * strValue );
- // --------------------------------------------------------------------------------------------
- /// \brief Convert from date/time to string.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertFromDate() converts a date/time value to a string.
///
- /// Format a date according to the ISO 8601 profile in http://www.w3.org/TR/NOTE-datetime:
- /// YYYY
- /// YYYY-MM
- /// YYYY-MM-DD
- /// YYYY-MM-DDThh:mmTZD
- /// YYYY-MM-DDThh:mm:ssTZD
- /// YYYY-MM-DDThh:mm:ss.sTZD
+ /// Formats a date according to the ISO 8601 profile in http://www.w3.org/TR/NOTE-datetime:
+ /// <pre>
+ /// YYYY
+ /// YYYY-MM
+ /// YYYY-MM-DD
+ /// YYYY-MM-DDThh:mmTZD
+ /// YYYY-MM-DDThh:mm:ssTZD
+ /// YYYY-MM-DDThh:mm:ss.sTZD
+ /// </pre>
///
- /// YYYY = four-digit year
- /// MM = two-digit month (01=January, etc.)
- /// DD = two-digit day of month (01 through 31)
- /// hh = two digits of hour (00 through 23)
- /// mm = two digits of minute (00 through 59)
- /// ss = two digits of second (00 through 59)
- /// s = one or more digits representing a decimal fraction of a second
- /// TZD = time zone designator (Z or +hh:mm or -hh:mm)
+ /// \c YYYY = four-digit year, formatted as "%.4d" <br>
+ /// \c MM = two-digit month (01=January) <br>
+ /// \c DD = two-digit day of month (01 through 31) <br>
+ /// \c hh = two digits of hour (00 through 23) <br>
+ /// \c mm = two digits of minute (00 through 59) <br>
+ /// \c ss = two digits of second (00 through 59) <br>
+ /// \c s = one or more digits representing a decimal fraction of a second <br>
+ /// \c TZD = time zone designator (Z or +hh:mm or -hh:mm)
///
- /// \note ISO 8601 does not seem to allow years less than 1000 or greater than 9999. We allow
- /// any year, even negative ones. The year is formatted as "%.4d".
+ /// Time-only input is allowed where the year, month, and day are all zero. This is output as
+ /// "0000-00-00...".
///
- /// \note As a compatibility "tactic" (OK, a hack), so-called time-only input is allowed where
- /// the year, month, and day are all zero. This is output as "0000-00-00...".
+ /// @note ISO 8601 does not allow years less than 1000 or greater than 9999. This API allows
+ /// any year, even negative ones.
///
- /// \param binValue The \c XMP_DateTime value to be converted.
+ /// @param binValue The date/time value to be converted.
///
- /// \param strValue The ISO 8601 string representation of the date/time.
+ /// @param strValue [out] A buffer in which to return the ISO 8601 string representation of the date/time.
- static void
- ConvertFromDate ( const XMP_DateTime & binValue,
- tStringObj * strValue );
+ static void ConvertFromDate ( const XMP_DateTime & binValue,
+ tStringObj * strValue );
- // --------------------------------------------------------------------------------------------
- /// \brief Convert from string to Boolean.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToBool() converts a string to a Boolean value.
+ ///
+ /// The preferred strings are those returned by the macros \c #kXMP_TrueStr and \c #kXMP_FalseStr.
+ /// If these do not match, the function does a case insensitive comparison, then simply 't' or 'f',
+ /// and finally non-zero and zero integer representations.
///
- /// \param strValue The string representation of the Boolean.
+ /// @param strValue The string representation of the value, specified as a null-terminated UTF-8 string.
///
- /// \result The appropriate C++ bool value for the string. The preferred strings are
- /// \c kXMP_TrueStr and \c kXMP_FalseStr. If these do not match, a case insensitive comparison is
- /// tried, then simply 't' or 'f', and finally non-zero and zero integer representations.
+ /// @return The appropriate C++ bool value for the string.
- static bool
- ConvertToBool ( XMP_StringPtr strValue );
+ static bool ConvertToBool ( XMP_StringPtr strValue );
- // --------------------------------------------------------------------------------------------
- /// \brief This form of \c ConvertToBool is a simple overload in the template that calls the
- /// above form passing <tt>strValue.c_str()</tt>.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToBool() converts a string to a Boolean value.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object,
+ /// rather than a <tt>const * char</tt>. It is otherwise identical; see details in the canonical form.
+ ///
+ /// @param strValue The string representation of the value, specified as a string object.
+ ///
+ /// @return The appropriate C++ bool value for the string.
- static bool
- ConvertToBool ( const tStringObj & strValue );
+ static bool ConvertToBool ( const tStringObj & strValue );
- // --------------------------------------------------------------------------------------------
- /// \brief Convert from string to integer.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToInt() converts a string to a 32-bit integer value.
///
- /// \param strValue The string representation of the integer.
+ /// @param strValue The string representation of the value, specified as a null-terminated UTF-8 string.
///
- /// \result The integer value as a C long.
+ /// @return The 32-bit integer value.
- static long
- ConvertToInt ( XMP_StringPtr strValue );
+ static long ConvertToInt ( XMP_StringPtr strValue );
- // --------------------------------------------------------------------------------------------
- /// \brief This form of \c ConvertToInt is a simple overload in the template that calls the above
- /// form passing <tt>strValue.c_str()</tt>.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToInt() converts a string to a 32-bit integer value.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object,
+ /// rather than a <tt>const * char</tt>. It is otherwise identical.
+ ///
+ /// @param strValue The string representation of the value, specified as a string object.
+ ///
+ /// @return The 32-bit integer value.
- static long
- ConvertToInt ( const tStringObj & strValue );
+ static long ConvertToInt ( const tStringObj & strValue );
- // --------------------------------------------------------------------------------------------
- /// \brief Convert from string to 64 bit integer.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToInt64() converts a string to a 64-bit integer value.
///
- /// \param strValue The string representation of the integer.
+ /// @param strValue The string representation of the value, specified as a null-terminated UTF-8 string.
///
- /// \result The integer value as a C long long.
+ /// @return The 64-bit integer value.
- static long long
- ConvertToInt64 ( XMP_StringPtr strValue );
+ static long long ConvertToInt64 ( XMP_StringPtr strValue );
- // --------------------------------------------------------------------------------------------
- /// \brief This form of ConvertToInt64 is a simple overload in the template that calls the above
- /// form passing <tt>strValue.c_str()</tt>.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToInt64() converts a string to a 64-bit integer value.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object,
+ /// rather than a <tt>const * char</tt>. It is otherwise identical.
+ ///
+ /// @param strValue The string representation of the value, specified as a string object.
+ ///
+ /// @return The 64-bit integer value.
- static long long
- ConvertToInt64 ( const tStringObj & strValue );
+ static long long ConvertToInt64 ( const tStringObj & strValue );
- // --------------------------------------------------------------------------------------------
- /// \brief Convert from string to floating point.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToFloat() converts a string to a floating-point value.
///
- /// \param strValue The string representation of the floating point value.
+ /// @param strValue The string representation of the value, specified as a null-terminated UTF-8 string.
///
- /// \result The floating point value.
+ /// @return The floating-point value.
- static double
- ConvertToFloat ( XMP_StringPtr strValue );
+ static double ConvertToFloat ( XMP_StringPtr strValue );
- // --------------------------------------------------------------------------------------------
- /// \brief This form of \c ConvertToFloat is a simple overload in the template that calls the
- /// above form passing <tt>strValue.c_str()</tt>.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToFloat() converts a string to a floating-point value.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object,
+ /// rather than a <tt>const * char</tt>. It is otherwise identical.
+ ///
+ /// @param strValue The string representation of the value, specified as a string object.
+ ///
+ /// @return The floating-point value.
- static double
- ConvertToFloat ( const tStringObj & strValue );
+ static double ConvertToFloat ( const tStringObj & strValue );
- // --------------------------------------------------------------------------------------------
- /// \brief Convert from string to date/time.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToDate() converts a string to a date/time value.
///
- /// Parse a date according to the ISO 8601 profile in http://www.w3.org/TR/NOTE-datetime:
- /// YYYY
- /// YYYY-MM
- /// YYYY-MM-DD
- /// YYYY-MM-DDThh:mmTZD
- /// YYYY-MM-DDThh:mm:ssTZD
- /// YYYY-MM-DDThh:mm:ss.sTZD
+ /// Parses a date according to the ISO 8601 profile in http://www.w3.org/TR/NOTE-datetime:
+ /// <pre>
+ /// YYYY
+ /// YYYY-MM
+ /// YYYY-MM-DD
+ /// YYYY-MM-DDThh:mmTZD
+ /// YYYY-MM-DDThh:mm:ssTZD
+ /// YYYY-MM-DDThh:mm:ss.sTZD
+ /// </pre>
///
- /// YYYY = four-digit year
- /// MM = two-digit month (01=January, etc.)
- /// DD = two-digit day of month (01 through 31)
- /// hh = two digits of hour (00 through 23)
- /// mm = two digits of minute (00 through 59)
- /// ss = two digits of second (00 through 59)
- /// s = one or more digits representing a decimal fraction of a second
- /// TZD = time zone designator (Z or +hh:mm or -hh:mm)
+ /// \c YYYY = four-digit year, formatted as "%.4d" <br>
+ /// \c MM = two-digit month (01=January) <br>
+ /// \c DD = two-digit day of month (01 through 31) <br>
+ /// \c hh = two digits of hour (00 through 23) <br>
+ /// \c mm = two digits of minute (00 through 59) <br>
+ /// \c ss = two digits of second (00 through 59) <br>
+ /// \c s = one or more digits representing a decimal fraction of a second <br>
+ /// \c TZD = time zone designator (Z or +hh:mm or -hh:mm)
///
- /// \note ISO 8601 does not seem to allow years less than 1000 or greater than 9999. We allow
- /// any year, even negative ones. The year is assumed to be formatted as "%.4d".
+ /// A missing date portion or missing TZD are tolerated. A missing date value can begin with
+ /// "Thh:" or "hh:"; the year, month, and day are all set to zero in the \c #XMP_DateTime value.
+ /// A missing TZD is assumed to be UTC.
///
- /// \note As compatibility "tactics" (OK, hacks), a missing date portion or missing TZD are
- /// tolerated. A missing date value may begin with "Thh:" or "hh:"; the year, month, and day are
- /// all set to zero in the XMP_DateTime value. A missing TZD is assumed to be UTC.
+ /// @note ISO 8601 does not allow years less than 1000 or greater than 9999. This API allows
+ /// any year, even negative ones.
///
- /// \param strValue The ISO 8601 string representation of the date/time.
+ /// @param strValue The ISO 8601 string representation of the date/time, specified as a
+ /// null-terminated UTF-8 string.
///
- /// \param binValue A pointer to the \c XMP_DateTime variable to be assigned the date/time components.
+ /// @param binValue [out] A buffer in which to return the binary date/time value.
- static void
- ConvertToDate ( XMP_StringPtr strValue,
- XMP_DateTime * binValue );
+ static void ConvertToDate ( XMP_StringPtr strValue,
+ XMP_DateTime * binValue );
- // --------------------------------------------------------------------------------------------
- /// \brief This form of \c ConvertToDate is a simple overload in the template that calls the above
- /// form passing s<tt>strValue.c_str()</tt>.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToDate() converts a string to a date/time value.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object,
+ /// rather than a <tt>const * char</tt>. It is otherwise identical.
+ /// See details for the canonical form.
+ ///
+ ///
+ /// @param strValue The ISO 8601 string representation of the date/time, specified as a string
+ /// object.
+ ///
+ /// @param binValue [out] A buffer in which to return the binary date/time value.
- static void
- ConvertToDate ( const tStringObj & strValue,
- XMP_DateTime * binValue );
+ static void ConvertToDate ( const tStringObj & strValue,
+ XMP_DateTime * binValue );
/// @}
// =============================================================================================
- // =============================================================================================
-
- // ============================================================================================
- /// \name Date/Time functions
+ /// \name Date-time manipulation
/// @{
+ ///
+ /// In addition to the type-conversion functions that convert between strings and binary
+ /// date-time values, these functions create, manipulate, and compare date-time values.
- // --------------------------------------------------------------------------------------------
- /// \brief Obtain the current date and time.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CurrentDateTime() obtains the current date and time.
+ ///
+ /// Creates and returns a binary \c #XMP_DateTime value. The returned time is UTC, properly
+ /// adjusted for the local time zone. The resolution of the time is not guaranteed to be finer
+ /// than seconds.
///
- /// \param time A pointer to the \c XMP_DateTime variable to be assigned the current date
- /// and time. The returned time is UTC, properly adjusted for the local time zone. The
- /// resolution of the time is not guaranteed to be finer than seconds.
+ /// @param time [out] A buffer in which to return the date/time value.
- static void
- CurrentDateTime ( XMP_DateTime * time );
+ static void CurrentDateTime ( XMP_DateTime * time );
- // --------------------------------------------------------------------------------------------
- /// \brief Set the local time zone.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetTimeZone() sets the time zone in a date/time value to the local time zone.
+ ///
+ /// Any existing time zone value is replaced. The other date/time fields are not adjusted in any way.
///
- /// \param time A pointer to the \c XMP_DateTime variable containing the value to be modified. Any
- /// existing time zone value is replaced, the other date/time fields are not adjusted in any way.
+ /// @param time A pointer to the date-time value, which is modified in place.
- static void
- SetTimeZone ( XMP_DateTime * time );
+ static void SetTimeZone ( XMP_DateTime * time );
- // --------------------------------------------------------------------------------------------
- /// \brief Make sure a time is UTC.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToUTCTime() ensures that a time is UTC.
///
- /// \param time A pointer to the \c XMP_DateTime variable containing the time to be modified. If
- /// the time zone is not UTC, the time is adjusted and the time zone set to be UTC.
+ /// If the time zone is not UTC, the time is adjusted and the time zone set to be UTC. If the
+ /// time zone is already UTC, the value is not modified.
+ ///
+ /// @param time A pointer to the date-time value, which is modified in place.
- static void
- ConvertToUTCTime ( XMP_DateTime * time );
+ static void ConvertToUTCTime ( XMP_DateTime * time );
- // --------------------------------------------------------------------------------------------
- /// \brief Make sure a time is local.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToLocalTime() ensures that a time is local.
+ ///
+ /// If the time zone is not the local zone, the time is adjusted and the time zone set to be local.
+ /// If the time zone is already the local zone, the value is not modified.
///
- /// \param time A pointer to the \c XMP_DateTime variable containing the time to be modified. If
- /// the time zone is not the local zone, the time is adjusted and the time zone set to be local.
+ /// @param time A pointer to the date-time value, which is modified in place.
- static void
- ConvertToLocalTime ( XMP_DateTime * time );
+ static void ConvertToLocalTime ( XMP_DateTime * time );
- // --------------------------------------------------------------------------------------------
- /// \brief Compare the order of two date/time values.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CompareDateTime() compares the order of two date/time values.
///
- /// \param left The "lefthand" date/time.
+ /// @param left The left-side date/time value.
///
- /// \param right The "righthand" date/time.
+ /// @param right The right-side date/time value.
///
- /// \result
- /// \li -1 if left is before right
- /// \li 0 if left matches right
- /// \li +1 if left is after right
+ /// @return An integer indicating the order:
+ /// \li -1 if left is earlier than right
+ /// \li 0 if left matches right
+ /// \li +1 if left is later than right
- static int
- CompareDateTime ( const XMP_DateTime & left,
- const XMP_DateTime & right );
+ static int CompareDateTime ( const XMP_DateTime & left,
+ const XMP_DateTime & right );
/// @}
// =============================================================================================
- // =============================================================================================
-
- // ============================================================================================
- /// \name Base 64 Encoding and Decoding
+ /// \name Base64 encoding and decoding
/// @{
+ ///
+ /// These functions convert between raw data values and Base64-encoded strings.
- // --------------------------------------------------------------------------------------------
- /// \brief Convert from raw data to Base64 encoded string.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c EncodeToBase64() converts a raw data value to a Base64-encoded string.
///
- /// \param rawStr The pointer to raw data to be converted.
+ /// @param rawStr An \c #XMP_StringPtr (char *) string containing the raw data to be converted.
///
- /// \param rawLen The length of raw data to be converted.
+ /// @param rawLen The number of characters of raw data to be converted.
///
- /// \param encodedStr The XMP object to contain the encoded string.
+ /// @param encodedStr [out] A string object in which to return the encoded string.
- static void
- EncodeToBase64 ( XMP_StringPtr rawStr,
- XMP_StringLen rawLen,
- tStringObj * encodedStr );
+ static void EncodeToBase64 ( XMP_StringPtr rawStr,
+ XMP_StringLen rawLen,
+ tStringObj * encodedStr );
- // --------------------------------------------------------------------------------------------
- /// \brief This form of \c EncodeToBase64 is a simple overload in the template that calls the
- /// above form passing <tt>rawStr.c_str()</tt>, and <tt>rawStr.size()</tt>.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c EncodeToBase64() converts a raw data value passed in a string object to a Base64-encoded string.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object as input.
+ /// It is otherwise identical.
+ ///
+ /// @param rawStr A string object containing the raw data to be converted.
+ ///
+ /// @param encodedStr [out] A string object in which to return the encoded string.
- static void
- EncodeToBase64 ( const tStringObj & rawStr,
- tStringObj * encodedStr );
+ static void EncodeToBase64 ( const tStringObj & rawStr,
+ tStringObj * encodedStr );
- // --------------------------------------------------------------------------------------------
- /// \brief Decode from Base64 encoded string to raw data.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DecodeFromBase64() Decodes a Base64-encoded string to raw data.
///
- /// \param encodedStr The pointer to encoded data to be converted.
+ /// @param encodedStr An \c #XMP_StringPtr (char *) string containing the encoded data to be converted.
///
- /// \param encodedLen The length of encoded datavto be converted.
+ /// @param encodedLen The number of characters of raw data to be converted.
///
- /// \param rawStr The XMP object to contain the decoded string.
+ /// @param rawStr [out] A string object in which to return the decoded data.
- static void
- DecodeFromBase64 ( XMP_StringPtr encodedStr,
- XMP_StringLen encodedLen,
- tStringObj * rawStr );
+ static void DecodeFromBase64 ( XMP_StringPtr encodedStr,
+ XMP_StringLen encodedLen,
+ tStringObj * rawStr );
- // --------------------------------------------------------------------------------------------
- /// \brief This form of \c DecodeFromBase64 is a simple overload in the template that calls the
- /// above form passing <tt>encodedStr.c_str()</tt>, and <tt>encodedStr.size()</tt>.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DecodeFromBase64() Decodes a Base64-encoded string, passed as a string object, to raw data.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object as input.
+ /// It is otherwise identical.
+ ///
+ /// @param encodedStr An string object containing the encoded data to be converted.
+ ///
+ /// @param rawStr [out] A string object in which to return the decoded data.
- static void
- DecodeFromBase64 ( const tStringObj & encodedStr,
- tStringObj * rawStr );
+ static void DecodeFromBase64 ( const tStringObj & encodedStr,
+ tStringObj * rawStr );
/// @}
// =============================================================================================
// =============================================================================================
-
- // ============================================================================================
/// \name JPEG file handling
/// @{
- /// These functions support the partitioning of XMP in JPEG files into standard and extended
+ ///
+ /// These functions support the partitioning of XMP in JPEG files into standard and extended
/// portions in order to work around the 64KB size limit of JPEG marker segments.
+ ///
+ /// @note (Doc note) Add detail about how to write out and read back extended data
- // --------------------------------------------------------------------------------------------
- /// \brief Create XMP serializations appropriate for a JPEG file. The standard XMP in a JPEG
- /// file is limited to about 65500 bytes. \c PackageForJPEG attempts to fit the serialization
- /// within that limit. If necessary it will partition the XMP into 2 serializations.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c PackageForJPEG() creates XMP serializations appropriate for a JPEG file.
///
- /// \param xmpObj The XMP for the JPEG file.
+ /// The standard XMP in a JPEG file is limited to 64K bytes. This function serializes the XMP
+ /// metadata in an XMP object into a string of RDF (see \c TXMPMeta::SerializeToBuffer()). If
+ /// the data does not fit into the 64K byte limit, it creates a second packet string with the
+ /// extended data.
///
- /// \param standardXMP The full standard XMP packet.
+ /// @param xmpObj The XMP object containing the metadata.
///
- /// \param extendedXMP The serialized extended XMP, empty if not needed.
+ /// @param standardXMP [out] A string object in which to return the full standard XMP packet.
///
- /// \param extendedDigest An MD5 digest of the serialized extended XMP, empty if not needed.
+ /// @param extendedXMP [out] A string object in which to return the serialized extended XMP,
+ /// empty if not needed.
+ ///
+ /// @param extendedDigest [out] A string object in which to return an MD5 digest of the serialized
+ /// extended XMP, empty if not needed.
+ ///
+ /// @see \c MergeFromJPEG()
- static void
- PackageForJPEG ( const TXMPMeta<tStringObj> & xmpObj,
- tStringObj * standardXMP,
- tStringObj * extendedXMP,
- tStringObj * extendedDigest );
+ static void PackageForJPEG ( const TXMPMeta<tStringObj> & xmpObj,
+ tStringObj * standardXMP,
+ tStringObj * extendedXMP,
+ tStringObj * extendedDigest );
- // --------------------------------------------------------------------------------------------
- /// \brief Put the extended XMP properties back into the full XMP.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c MergeFromJPEG() merges standard and extended XMP retrieved from a JPEG file.
+ ///
+ /// When an extended partition stores properties that do not fit into the JPEG file limitation
+ /// of 64K bytes, this function integrates those properties back into the same XMP object with
+ /// those from the standard XMP packet.
///
- /// \param fullXMP The full XMP, presumed to be initialized from the standard XMP packet.
+ /// @param fullXMP [in, out] An XMP object which the caller has initialized from the standard
+ /// XMP packet in a JPEG file. The extended XMP is added to this object.
///
- /// \param extendedXMP The properties that were partitioned into the extended XMP.
+ /// @param extendedXMP An XMP object which the caller has initialized from the extended XMP
+ /// packet in a JPEG file.
+ ///
+ /// @see \c PackageForJPEG()
- static void
- MergeFromJPEG ( TXMPMeta<tStringObj> * fullXMP,
- const TXMPMeta<tStringObj> & extendedXMP );
+ static void MergeFromJPEG ( TXMPMeta<tStringObj> * fullXMP,
+ const TXMPMeta<tStringObj> & extendedXMP );
/// @}
// =============================================================================================
- // =============================================================================================
-
- // ============================================================================================
- /// \name UI helper functions
+ /// \name Editing utilities
/// @{
- /// These functions are mainly of interest in implementing a user interface for editing XMP.
+ ///
+ /// These functions are useful in implementing a user interface for editing XMP. They
+ /// convert sets of property values to and from displayable and manipulable strings, and perform
+ /// operations on sets of metadata, such as those available from the File Info dialog box.
- // --------------------------------------------------------------------------------------------
- /// \brief Create a single edit string from an array of strings.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CatenateArrayItems() creates a single edit string from a set of array item values.
///
- /// TBD - needs more description
+ /// Collects the values of all items in an array into a single string, using a specified
+ /// separation string. Each item in the specified array must be a simple string value.
///
- /// \param xmpObj The XMP object containing the array to be catenated.
+ /// @param xmpObj The XMP object containing the array to be catenated.
///
- /// \param schemaNS The schema namespace URI for the array. Must not be null or the empty string.
+ /// @param schemaNS The schema namespace URI for the array. Must not be null or the empty string.
///
- /// \param arrayName The name of the array. May be a general path expression, must not be null
- /// or the empty string. Each item in the array must be a simple string value.
+ /// @param arrayName The name of the array. May be a general path expression, must not be null
+ /// or the empty string.
///
- /// \param separator The string to be used to separate the items in the catenated string.
+ /// @param separator The string with which to separate the items in the catenated string.
/// Defaults to "; ", ASCII semicolon and space (U+003B, U+0020).
///
- /// \param quotes The characters to be used as quotes around array items that contain a separator.
- /// Defaults to '"', ASCII quote (U+0022).
+ /// @param quotes The character or characters to use as quotes around array items that contain a
+ /// separator. Defaults to the double-quote character ("), ASCII quote (U+0022).
+ ///
+ /// @param options Option flags to control the catenation. <<what options?>>
///
- /// \param options Option flags to control the catenation.
+ /// @param catedStr [out] A string object in which to return the catenated array items.
///
- /// \param catedStr A pointer to the string to be assigned the catenated array items.
+ /// @see \c SeparateArrayItems()
- static void
- CatenateArrayItems ( const TXMPMeta<tStringObj> & xmpObj,
- XMP_StringPtr schemaNS,
- XMP_StringPtr arrayName,
- XMP_StringPtr separator,
- XMP_StringPtr quotes,
- XMP_OptionBits options,
- tStringObj * catedStr );
+ static void CatenateArrayItems ( const TXMPMeta<tStringObj> & xmpObj,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_StringPtr separator,
+ XMP_StringPtr quotes,
+ XMP_OptionBits options,
+ tStringObj * catedStr );
- // --------------------------------------------------------------------------------------------
- /// \brief Separate a single edit string into an array of strings.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SeparateArrayItems() updates an array from a concatenated edit string of values.
///
- /// TBD - needs more description
+ /// This reverses the action of \c CatenateArrayItems(), separating out individual array items
+ /// from the edit string and updating the array with the new values. Each item in the array must
+ /// be a simple string value.
///
- /// \param xmpObj The XMP object containing the array to be updated.
+ /// @param xmpObj The XMP object containing the array to be updated.
///
- /// \param schemaNS The schema namespace URI for the array. Must not be null or the empty string.
+ /// @param schemaNS The schema namespace URI for the array. Must not be null or the empty string.
///
- /// \param arrayName The name of the array. May be a general path expression, must not be null
- /// or the empty string. Each item in the array must be a simple string value.
+ /// @param arrayName The name of the array. May be a general path expression, must not be null
+ /// or the empty string.
///
- /// \param options Option flags to control the separation.
+ /// @param options Option flags to control the separation. <<what options?>>
///
- /// \param catedStr The string to be separated into the array items.
+ /// @param catedStr The concatenated array items, as created by \c CatenateArrayItems(),
+ /// specified as a null-terminated UTF-8 string.
- static void
- SeparateArrayItems ( TXMPMeta<tStringObj> * xmpObj,
- XMP_StringPtr schemaNS,
- XMP_StringPtr arrayName,
- XMP_OptionBits options,
- XMP_StringPtr catedStr );
+ static void SeparateArrayItems ( TXMPMeta<tStringObj> * xmpObj,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_OptionBits options,
+ XMP_StringPtr catedStr );
- // --------------------------------------------------------------------------------------------
- /// \brief This form of \c SeparateArrayItems is a simple overload in the template that calls
- /// the aboveform passing <tt>catedStr.c_str()</tt>.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SeparateArrayItems() updates an array from a concatenated edit string of values.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object in which
+ /// to return the concatenated string. It is otherwise identical; see details for the canonical form.
+ ///
- static void
- SeparateArrayItems ( TXMPMeta<tStringObj> * xmpObj,
- XMP_StringPtr schemaNS,
- XMP_StringPtr arrayName,
- XMP_OptionBits options,
- const tStringObj & catedStr );
+ static void SeparateArrayItems ( TXMPMeta<tStringObj> * xmpObj,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_OptionBits options,
+ const tStringObj & catedStr );
- // --------------------------------------------------------------------------------------------
- /// \brief Remove multiple properties from an XMP object.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c RemoveProperties() removes multiple properties from an XMP object.
///
- /// \c RemoveProperties was created to support the File Info dialog's Delete button, and has
- /// been been generalized somewhat from those specific needs. It operates in one of three main
- /// modes depending on the schemaNS and propName parameters:
+ /// The operation depends on how the namespace and property are specified:
///
- /// \li Non-empty \c schemaNS and \c propName - The named property is removed if it is an
- /// external property, or if the \c kXMPUtil_DoAllProperties option is passed. It does not
- /// matter whether the named property is an actual property or an alias.
+ /// \li Non-empty \c schemaNS and \c propName - The named property is removed if it is an
+ /// external property, or if the \c #kXMPUtil_DoAllProperties option flag is set. It does not
+ /// matter whether the named property is an actual property or an alias.
///
- /// \li Non-empty \c schemaNS and empty \c propName - The all external properties in the named
- /// schema are removed. Internal properties are also removed if the \c kXMPUtil_DoAllProperties
- /// option is passed. In addition, aliases from the named schema will be removed if the \c
- /// kXMPUtil_IncludeAliases option is passed.
+ /// \li Non-empty \c schemaNS and empty \c propName - All external properties in the named
+ /// schema are removed. Internal properties are also removed if the
+ /// \c #kXMPUtil_DoAllProperties option flag is set. In addition, aliases from the named schema
+ /// are removed if the \c #kXMPUtil_IncludeAliases option flag is set.
///
- /// \li Empty \c schemaNS and empty \c propName - All external properties in all schema are
- /// removed. Internal properties are also removed if the \c kXMPUtil_DoAllProperties option is
- /// passed. Aliases are implicitly handled because the associated actuals are.
+ /// \li Empty \c schemaNS and empty \c propName - All external properties in all schemas are
+ /// removed. Internal properties are also removed if the \c #kXMPUtil_DoAllProperties option
+ /// flag is set. Aliases are handled implicitly, because the associated actuals are removed or
+ /// not.
///
- /// It is an error to pass and empty schemaNS and non-empty propName.
+ /// \li It is an error to pass an empty \c schemaNS and non-empty \c propName.
///
- /// \param xmpObj The XMP object containing the properties to be removed.
+ /// @param xmpObj The XMP object containing the properties to be removed.
///
- /// \param schemaNS Optional schema namespace URI for the properties to be removed.
+ /// @param schemaNS Optional schema namespace URI for the properties to be removed.
///
- /// \param propName Optional path expression for the property to be removed.
+ /// @param propName Optional path expression for the property to be removed.
///
- /// \param options Option flags to control the deletion. The defined flags are:
- /// \li \c kXMPUtil_DoAllProperties - Do internal properties in addition to external properties.
- /// \li \c kXMPUtil_IncludeAliases - Include aliases in the "named schema" case above.
+ /// @param options Option flags to control the deletion operation. A logical OR of these
+ /// bit-flag constants:
+ /// \li \c #kXMPUtil_DoAllProperties - Delete internal properties in addition to external properties.
+ /// \li \c #kXMPUtil_IncludeAliases - Include aliases if the schema is explicitly specified.
- static void
- RemoveProperties ( TXMPMeta<tStringObj> * xmpObj,
- XMP_StringPtr schemaNS = 0,
- XMP_StringPtr propName = 0,
- XMP_OptionBits options = 0 );
+ static void RemoveProperties ( TXMPMeta<tStringObj> * xmpObj,
+ XMP_StringPtr schemaNS = 0,
+ XMP_StringPtr propName = 0,
+ XMP_OptionBits options = 0 );
- // --------------------------------------------------------------------------------------------
- /// \brief Append properties from one XMP object to another.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c AppendProperties() adds or moves properties from one XMP object to another.
///
- /// \c AppendProperties was created to support the File Info dialog's Append button, and has
- /// been been generalized somewhat from those specific needs. It appends information from one
- /// XMP object (\c source) to another (\c dest). The default operation is to append only external
- /// properties that do not already exist in the destination. The kXMPUtil_DoAllProperties option
- /// can be used to operate on all properties, external and internal. The kXMPUtil_ReplaceOldValues
- /// option can be used to replace the values of existing properties. The notion of external
- /// versus internal applies only to top level properties. The keep-or-replace-old notion applies
- /// within structs and arrays as described below.
+ /// The default operation is to append only external properties that do not already exist in the
+ /// destination. Option flags allow you to add internal properties, and to merge values of
+ /// properties that exist in both the source and destination.
///
- /// If kXMPUtil_ReplaceOldValues is passed then the processing is restricted to the top level
- /// properties. The processed properties from the source (according to kXMPUtil_DoAllProperties)
- /// are propagated to the destination, replacing any existing values. Properties in the destination
- /// that are not in the source are left alone.
+ /// \li \c #kXMPUtil_DoAllProperties: Operate on all top-level properties, external and
+ /// internal. You can use this flag together with \c #kXMPUtil_ReplaceOldValues to replace the
+ /// values of existing top-level properties.
///
- /// If kXMPUtil_ReplaceOldValues is not passed then the processing is more complicated. Top level
- /// properties are added to the destination if they do not already exist. If they do exist but
- /// differ in form (simple/struct/array) then the destination is left alone. If the forms match,
- /// simple properties are left unchanged while structs and arrays are merged.
+ /// \li \c #kXMPUtil_ReplaceOldValues: Propogate all top-level properties from the source to
+ /// the destination, replacing any existing values. The values of properties in the
+ /// destination that are not in the source are not modified.<br>
+ /// The keep-or-replace-old notion also applies within structs and arrays. Top-level
+ /// properties are added to the destination if they do not already exist. If they do exist but
+ /// differ in form (simple/struct/array) then the destination is not modified. If the forms
+ /// match, simple properties are left unchanged, while structs and arrays are merged.<br>
+ /// Do not use this option when the processing is more complicated. <<than what??>>
///
- /// If kXMPUtil_DeleteEmptyValues is passed then an empty value in the source XMP causes the
- /// corresponding Dest XMP property to be deleted. The default is to treat empty values the same
- /// as non-empty values. An empty value is any of a simple empty string, an array with no items,
- /// or a struct with no fields. Qualifiers are ignored.
+ /// \li \c #kXMPUtil_DeleteEmptyValues: An empty value in the source XMP causes the
+ /// corresponding destination property to be deleted. By default, empty values are treated in
+ /// the same way as non-empty values. An empty value is a simple empty string, an array with
+ /// no items,or a struct with no fields. Qualifiers are ignored.
///
/// The detailed behavior is defined by the following pseudo-code:
- /// \verbatim
- /// AppendProperties ( sourceXMP, destXMP, options ):
- /// doAll = options & kXMPUtil_DoAllProperties
- /// replaceOld = options & kXMPUtil_ReplaceOldValues
- /// deleteEmpty = options & kXMPUtil_DeleteEmptyValues
- /// for all source schema (top level namespaces):
- /// for all top level properties in sourceSchema:
- /// if doAll or prop is external:
- /// AppendSubtree ( sourceNode, destSchema, replaceOld, deleteEmpty )
- ///
- /// AppendSubtree ( sourceNode, destParent, replaceOld, deleteEmpty ):
- /// if deleteEmpty and source value is empty:
- /// delete the corresponding child from destParent
- /// else if sourceNode not in destParent (by name):
- /// copy sourceNode's subtree to destParent
- /// else if replaceOld:
- /// delete subtree from destParent
- /// copy sourceNode's subtree to destParent
- /// else:
- /// // Already exists in dest and not replacing, merge structs and arrays
- /// if sourceNode and destNode forms differ:
- /// return, leave the destNode alone
- /// else if form is a struct:
- /// for each field in sourceNode:
- /// AppendSubtree ( sourceNode.field, destNode, replaceOld )
- /// else if form is an alt-text array:
- /// copy new items by xml:lang value into the destination
- /// else if form is an array:
- /// copy new items by value into the destination, ignoring order and duplicates
- /// \endverbatim
- ///
- /// \note \c AppendProperties can be expensive if replaceOld is not passed and the XMP contains
- /// large arrays. The array item checking described above is n-squared. Each source item is
- /// checked to see if it already exists in the destination, without regard to order or duplicates.
- /// Simple items are compared by value and xml:lang qualifier, other qualifiers are ignored.
- /// Structs are recursively compared by field names, without regard to field order. Arrays are
- /// compared by recursively comparing all items.
- ///
- /// \param source The source XMP object.
- ///
- /// \param dest The destination XMP object.
- ///
- /// \param options Option flags to control the copying.
- /// \li \c kXMPUtil_DoAllProperties - Do internal properties in addition to external properties.
- /// \li \c kXMPUtil_ReplaceOldValues - Replace the values of existing properties.
- /// \li \c kXMPUtil_DeleteEmptyValues - Delete properties if the new value is empty.
-
- static void
- AppendProperties ( const TXMPMeta<tStringObj> & source,
- TXMPMeta<tStringObj> * dest,
- XMP_OptionBits options = 0 );
-
- // --------------------------------------------------------------------------------------------
- /// \brief Replicate a subtree from one XMP object into another, possibly at a different location.
- ///
- /// TBD - needs more description
- ///
- /// \param source The source XMP object.
- ///
- /// \param dest The destination XMP object.
- ///
- /// \param sourceNS The schema namespace URI for the source subtree.
- ///
- /// \param sourceRoot The root location for the source subtree. May be a general path expression,
+ ///
+ /// <pre>
+ /// AppendProperties ( sourceXMP, destXMP, options ):
+ /// doAll = options & kXMPUtil_DoAllProperties
+ /// replaceOld = options & kXMPUtil_ReplaceOldValues
+ /// deleteEmpty = options & kXMPUtil_DeleteEmptyValues
+ /// for all source schema (top level namespaces):
+ /// for all top level properties in sourceSchema:
+ /// if doAll or prop is external:
+ /// AppendSubtree ( sourceNode, destSchema, replaceOld, deleteEmpty )
+ ///
+ /// AppendSubtree ( sourceNode, destParent, replaceOld, deleteEmpty ):
+ /// if deleteEmpty and source value is empty:
+ /// delete the corresponding child from destParent
+ /// else if sourceNode not in destParent (by name):
+ /// copy sourceNode's subtree to destParent
+ /// else if replaceOld:
+ /// delete subtree from destParent
+ /// copy sourceNode's subtree to destParent
+ /// else: // (Already exists in dest and not replacing, merge structs and arrays)
+ /// if sourceNode and destNode forms differ:
+ /// return, leave the destNode alone
+ /// else if form is a struct:
+ /// for each field in sourceNode:
+ /// AppendSubtree ( sourceNode.field, destNode, replaceOld )
+ /// else if form is an alt-text array:
+ /// copy new items by xml:lang value into the destination
+ /// else if form is an array:
+ /// copy new items by value into the destination, ignoring order and duplicates
+ /// </pre>
+ ///
+ /// Array item checking is n-squared; this can be time-intensive if the replace-old options is
+ /// not specified. Each source item is checked to see if it already exists in the destination,
+ /// without regard to order or duplicates. Simple items are compared by value and \c xml:lang
+ /// qualifier; other qualifiers are ignored. Structs are recursively compared by field names,
+ /// without regard to field order. Arrays are compared by recursively comparing all items.
+ ///
+ /// @param source The source XMP object.
+ ///
+ /// @param dest The destination XMP object.
+ ///
+ /// @param options Option flags to control the copying. A logical OR of these bit-flag constants:
+ /// \li \c kXMPUtil_DoAllProperties - Operate on internal properties in addition to external properties.
+ /// \li \c kXMPUtil_ReplaceOldValues - Replace the values of existing properties.
+ /// \li \c kXMPUtil_DeleteEmptyValues - Delete properties if the new value is empty.
+
+ static void AppendProperties ( const TXMPMeta<tStringObj> & source,
+ TXMPMeta<tStringObj> * dest,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DuplicateSubtree() replicates a subtree from one XMP object into another.
+ ///
+ /// The destination can be a different namespace and root location in the same object, or the
+ /// same or a different location in another XMP object.
+ ///
+ /// @param source The source XMP object.
+ ///
+ /// @param dest The destination XMP object.
+ ///
+ /// @param sourceNS The schema namespace URI for the source subtree.
+ ///
+ /// @param sourceRoot The root location for the source subtree. Can be a general path expression,
/// must not be null or the empty string.
///
- /// \param destNS The schema namespace URI for the destination. Defaults to the source namespace.
+ /// @param destNS The schema namespace URI for the destination. Defaults to the source namespace.
///
- /// \param destRoot The root location for the destination. May be a general path expression.
+ /// @param destRoot The root location for the destination. Can be a general path expression.
/// Defaults to the source location.
///
- /// \param options Option flags to control the separation.
-
- static void
- DuplicateSubtree ( const TXMPMeta<tStringObj> & source,
- TXMPMeta<tStringObj> * dest,
- XMP_StringPtr sourceNS,
- XMP_StringPtr sourceRoot,
- XMP_StringPtr destNS = 0,
- XMP_StringPtr destRoot = 0,
- XMP_OptionBits options = 0 );
+ /// @param options Option flags to control the operation. <<options?>>
+ static void DuplicateSubtree ( const TXMPMeta<tStringObj> & source,
+ TXMPMeta<tStringObj> * dest,
+ XMP_StringPtr sourceNS,
+ XMP_StringPtr sourceRoot,
+ XMP_StringPtr destNS = 0,
+ XMP_StringPtr destRoot = 0,
+ XMP_OptionBits options = 0 );
/// @}
// =============================================================================================
+ // =============================================================================================
+
}; // class TXMPUtils
// =================================================================================================
diff --git a/public/include/XMP.hpp b/public/include/XMP.hpp
index 2ceb936..62e230d 100644
--- a/public/include/XMP.hpp
+++ b/public/include/XMP.hpp
@@ -11,16 +11,16 @@
// ================================================================================================
/// \file XMP.hpp
-/// \brief Overall header file for the XMP toolkit.
+/// \brief Overall header file for the XMP Toolkit
///
-/// This is an overall header file, the only one that C++ clients should #include. The full client
-/// API is in the \c TXMPMeta.hpp, \c TXMPIterator.hpp, \c TXMPUtils.hpp headers. Read these for
-/// information, but do not #include them directly. The \c TXMP... classes are C++ template classes
-/// that must be instantiated with a string class such as <tt>std::string<\tt>. The string class is
-/// used to return text strings for property values, serialized XMP, etc.
+/// This is an overall header file, the only one that C++ clients should include.
///
-/// Clients must also compile <tt>XMP.incl_cpp<\tt> to ensure that all client-side glue code is
-/// generated. This should be done by #including it in exactly one client source file.
+/// The full client API is in the \c TXMPMeta.hpp, \c TXMPIterator.hpp, \c TXMPUtils.hpp headers.
+/// Read these for information, but do not include them directly. The \c TXMP... classes are C++
+/// template classes that must be instantiated with a string class such as \c std::string. The
+/// string class is used to return text strings for property values, serialized XMP, and so on.
+/// Clients must also compile \c XMP.incl_cpp to ensure that all client-side glue code is generated.
+/// This should be done by including it in exactly one client source file.
///
/// There are two C preprocessor macros that simplify use of the templates:
///
@@ -29,24 +29,27 @@
///
/// \li \c TXMP_EXPAND_INLINE - Define this as 1 if you want to have the template functions expanded
/// inline in your code. Leave it undefined, or defined as 0, to use out-of-line instantiations of
-/// the template functions. Compiling <tt>XMP.incl_cpp<\tt> generates explicit out-of-line
+/// the template functions. Compiling \c XMP.incl_cpp generates explicit out-of-line
/// instantiations if \c TXMP_EXPAND_INLINE is off.
///
-/// The template parameter, class \c tStringObj, must have the following member functions (which match
-/// those for <tt>std::string<\tt>):
-/// \code
+/// The template parameter, class \c tStringObj, must have the following member functions (which
+/// match those for \c std::string):
+///
+/// <pre>
/// tStringObj& assign ( const char * str, size_t len )
/// size_t size() const
/// const char * c_str() const
-/// \endcode
+/// </pre>
+///
/// The string class must be suitable for at least UTF-8. This is the encoding used for all general
/// values, and is the default encoding for serialized XMP. The string type must also be suitable
/// for UTF-16 or UTF-32 if those serialization encodings are used. This mainly means tolerating
-/// embedded 0 bytes, which std::string does.
+/// embedded 0 bytes, which \c std::string does.
// ================================================================================================
+/// /c XMP_Environment.h must be the first included header.
+#include "XMP_Environment.h"
-#include "XMP_Environment.h" // ! This must be the first include!
#include "XMP_Version.h"
#include "XMP_Const.h"
@@ -65,11 +68,9 @@
#include "TXMPMeta.hpp"
#include "TXMPIterator.hpp"
#include "TXMPUtils.hpp"
-
typedef class TXMPMeta <TXMP_STRING_TYPE> SXMPMeta; // For client convenience.
typedef class TXMPIterator <TXMP_STRING_TYPE> SXMPIterator;
typedef class TXMPUtils <TXMP_STRING_TYPE> SXMPUtils;
-
#if TXMP_EXPAND_INLINE
#error "TXMP_EXPAND_INLINE is not working at present. Please don't use it."
#include "client-glue/TXMPMeta.incl_cpp"
@@ -92,7 +93,6 @@
#pragma warning ( pop )
#endif
-
// =================================================================================================
#endif // __XMP_hpp__
diff --git a/public/include/XMP.incl_cpp b/public/include/XMP.incl_cpp
index 19b4b5f..79655be 100644
--- a/public/include/XMP.incl_cpp
+++ b/public/include/XMP.incl_cpp
@@ -50,11 +50,9 @@
#include "client-glue/TXMPMeta.incl_cpp"
#include "client-glue/TXMPIterator.incl_cpp"
#include "client-glue/TXMPUtils.incl_cpp"
-
template class TXMPMeta <TXMP_STRING_TYPE>;
template class TXMPIterator <TXMP_STRING_TYPE>;
template class TXMPUtils <TXMP_STRING_TYPE>;
-
#if XMP_INCLUDE_XMPFILES
#include "client-glue/TXMPFiles.incl_cpp"
template class TXMPFiles <TXMP_STRING_TYPE>;
diff --git a/public/include/XMP_Const.h b/public/include/XMP_Const.h
index 57605bd..0316188 100644
--- a/public/include/XMP_Const.h
+++ b/public/include/XMP_Const.h
@@ -1,25 +1,19 @@
#ifndef __XMP_Const_h__
#define __XMP_Const_h__ 1
-/* --------------------------------------------------------------------------------------------- */
-/* ** IMPORTANT ** This file must be usable by strict ANSI C compilers. No "//" comments, etc. */
-/* --------------------------------------------------------------------------------------------- */
-
-/*
// =================================================================================================
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
// of the Adobe license agreement accompanying it.
// =================================================================================================
-*/
#include "XMP_Environment.h"
#include <stddef.h>
-#if XMP_MacBuild /* ! No stdint.h on Windows and some UNIXes. */
+#if XMP_MacBuild // ! No stdint.h on Windows and some UNIXes.
#include <stdint.h>
#endif
@@ -27,20 +21,18 @@
extern "C" {
#endif
+// =================================================================================================
+/// \file XMP_Const.h
+/// \brief Common C/C++ types and constants for the XMP toolkit.
+// =================================================================================================
-/** ================================================================================================
- * \file XMP_Const.h
- * \brief Common C/C++ types and constants for the XMP toolkit.
- */
-
-
-/* ============================================================================================== */
-/* Basic types and constants */
-/* ========================= */
+// =================================================================================================
+// Basic types and constants
+// =========================
-/* The XMP_... types are used on the off chance that the ..._t types present a problem. In that */
-/* case only the declarations of the XMP_... types needs to change, not all of the uses. These */
-/* types are used where fixed sizes are required in order to have a known ABI for a DLL build. */
+// The XMP_... types are used on the off chance that the ..._t types present a problem. In that
+// case only the declarations of the XMP_... types needs to change, not all of the uses. These
+// types are used where fixed sizes are required in order to have a known ABI for a DLL build.
#if XMP_MacBuild
@@ -70,205 +62,183 @@ extern "C" {
typedef XMP_Uns8 XMP_Bool;
-/* Typedefs to preserve old, unfortunate spellings: */
-
-#if 0 /* *** Enable after internal compiles work. */
-typedef XMP_Int8 XMPInt8;
-typedef XMP_Int16 XMPInt16;
-typedef XMP_Int32 XMPInt32;
-typedef XMP_Int64 XMPInt64;
-typedef XMP_Uns8 XMPUns8;
-typedef XMP_Uns16 XMPUns16;
-typedef XMP_Uns32 XMPUns32;
-typedef XMP_Uns64 XMPUns64;
-typedef XMP_Bool XMPBool;
-#endif
-
-/**
- * \typedef XMPMetaRef
- * \brief An "ABI safe" pointer to the internal part of an XMP object.
- *
- * \c XMPMetaRef is an "ABI safe" pointer to the internal part of an XMP object. It should be used
- * for passing an XMP object across client DLL boundaries. See the discussion in <tt>TXMPMeta.hpp</tt>.
- */
-
+/// An "ABI safe" pointer to the internal part of an XMP object. Use to pass an XMP object across
+/// client DLL boundaries. See \c TXMPMeta::GetInternalRef().
typedef struct __XMPMeta__ * XMPMetaRef;
+
+/// An "ABI safe" pointer to the internal part of an XMP iteration object. Use to pass an XMP
+/// iteration object across client DLL boundaries. See \c TXMPIterator.
typedef struct __XMPIterator__ * XMPIteratorRef;
+
+/// An "ABI safe" pointer to the internal part of an XMP document operations object. Use to pass an
+/// XMP document operations object across client DLL boundaries. See \c TXMPDocOps.
+typedef struct __XMPDocOps__ * XMPDocOpsRef;
+
+/// An "ABI safe" pointer to the internal part of an XMP file-handling object. Use to pass an XMP
+/// file-handling object across client DLL boundaries. See \c TXMPFiles.
typedef struct __XMPFiles__ * XMPFilesRef;
-/* ============================================================================================== */
-
-/**
- * \name General scalar types and constants
- * @{
- */
-
-/**
- * \typedef XMP_StringPtr
- * \brief The type for input string parameters. A <tt>const char *</tt>, a null-terminated UTF-8 string.
- *
- */
-
-/**
- * \typedef XMP_StringLen
- * \brief The type for string length parameters. A 32-bit unsigned integer, as big as will be
- * practically needed.
- */
-
-/**
- * \typedef XMP_Index
- * \brief The type for offsets and indices. A 32-bit signed integer. It is signed because that
- * often makes loop termination tests safer.
- */
-
-/**
- * \typedef XMP_OptionBits
- * \brief The type for a collection of 32 flag bits. Individual flags are defined as enum value
- * bit masks. A number of macros provide common set or set operations, e.g. \c XMP_PropIsSimple.
- * For other tests use an expression like "options & kXMP_<theOption>". When passing multiple
- * option flags use the bitwise-or operator. '|', not the arithmatic plus, '+'.
- */
-
-typedef const char * XMP_StringPtr; /* Points to a null terminated UTF-8 string. */
+// =================================================================================================
+
+/// \name General scalar types and constants
+/// @{
+
+/// \typedef XMP_StringPtr
+/// \brief The type for input string parameters. A <tt>const char *</tt>, a null-terminated UTF-8
+/// string.
+
+/// \typedef XMP_StringLen
+/// \brief The type for string length parameters. A 32-bit unsigned integer, as big as will be
+/// practically needed.
+
+/// \typedef XMP_Index
+/// \brief The type for offsets and indices. A 32-bit signed integer. It is signed to allow -1 for
+/// loop termination.
+
+/// \typedef XMP_OptionBits
+/// \brief The type for a collection of 32 flag bits. Individual flags are defined as enum value bit
+/// masks; see \c #kXMP_PropValueIsURI and following. A number of macros provide common set or set
+/// operations, such as \c XMP_PropIsSimple. For other tests use an expression like <code>options &
+/// kXMP_<theOption></code>. When passing multiple option flags use the bitwise-OR operator. '|',
+/// not the arithmatic plus, '+'.
+
+typedef const char * XMP_StringPtr; // Points to a null terminated UTF-8 string.
typedef XMP_Uns32 XMP_StringLen;
-typedef XMP_Int32 XMP_Index; /* Signed, sometimes -1 is handy. */
-typedef XMP_Uns32 XMP_OptionBits; /* Used as 32 individual bits. */
-
-/**
- * \def kXMP_TrueStr
- * \brief The canonical true string value for Booleans in serialized XMP. Code that converts
- * from the string to a bool should be case insensitive, and even allow "1".
- */
-
-/**
- * \def kXMP_FalseStr
- * \brief The canonical false string value for Booleans in serialized XMP. Code that converts
- * from the string to a bool should be case insensitive, and even allow "0".
- */
-
-#define kXMP_TrueStr "True" /* Serialized XMP spellings, not for the type bool. */
+typedef XMP_Int32 XMP_Index; // Signed, sometimes -1 is handy.
+typedef XMP_Uns32 XMP_OptionBits; // Used as 32 individual bits.
+
+/// \def kXMP_TrueStr
+/// \brief The canonical true string value for Booleans in serialized XMP.
+///
+/// Code that converts from string to bool should be case insensitive, and also allow "1".
+
+/// \def kXMP_FalseStr
+/// \brief The canonical false string value for Booleans in serialized XMP.
+///
+/// Code that converts from string to bool should be case insensitive, and also allow "0".
+
+#define kXMP_TrueStr "True" // Serialized XMP spellings, not for the type bool.
#define kXMP_FalseStr "False"
-/**
- * @}
- */
-
-/* ============================================================================================== */
-
-/**
- * \struct XMP_DateTime
- * \brief The expanded type for a date and time. Dates and time in the serialized XMP are ISO 8601
- * strings. The \c XMP_DateTime struct allows easy conversion with other formats.
- *
- * All of the fields are 32 bit, even though most could be 8 bit. This avoids overflow when doing
- * carries for arithmetic or normalization. All fields have signed values for the same reasons.
- *
- * The fields of the \c XMP_DateTime struct are:
- *
- * \li year- The year, can be negative.
- * \li month - The month in the range 1..12.
- * \li day - The day of the month in the range 1..31.
- * \li hour - The hour in the range 0..23.
- * \li minute - The minute in the range 0..59.
- * \li second - The second in the range 0..59.
- * \li tzSign - The "sign" of the time zone, 0 means UTC, -1 is west, +1 is east.
- * \li tzHour - The time zone hour in the range 0..23.
- * \li tzMinute - The time zone minute in the range 0..59.
- * \li nanoSecond - Nanoseconds within a second, often left as zero.
- *
- * Constants for the \c tzSign are:
- *
- * \li \c kXMP_TimeIsUTC - The time is UTC.
- * \li \c kXMP_TimeWestOfUTC - The time zone is west of UTC, behind in time.
- * \li \c kXMP_TimeEastOfUTC - The time zone is east of UTC, ahead in time.
- *
- * DateTime values are occasionally used in cases with only a date or only a time component. A date
- * without a time has zeros in the \c XMP_DateTime struct for all time fields. A time without a date
- * has zeros for all date fields (year, month, and day).
- */
+/// Type for yes/no/maybe answers. The values are picked to allow Boolean-like usage. The yes and
+/// values are true (non-zero), the no value is false (zero).
+enum {
+ /// The part or parts have definitely changed.
+ kXMPTS_Yes = 1,
+ /// The part or parts have definitely not changed.
+ kXMPTS_No = 0,
+ /// The part or parts might, or might not, have changed.
+ kXMPTS_Maybe = -1
+};
+typedef XMP_Int8 XMP_TriState;
+
+/// @}
+
+// =================================================================================================
+
+/// \struct XMP_DateTime
+/// \brief The expanded type for a date and time.
+///
+/// Dates and time in the serialized XMP are ISO 8601 strings. The \c XMP_DateTime struct allows
+/// easy conversion with other formats.
+///
+/// All of the fields are 32 bit, even though most could be 8 bit. This avoids overflow when doing
+/// carries for arithmetic or normalization. All fields have signed values for the same reasons.
+///
+/// Date-time values are occasionally used with only a date or only a time component. A date without
+/// a time has zeros in the \c XMP_DateTime struct for all time fields. A time without a date has
+/// zeros for all date fields (year, month, and day).
+///
+/// \c TXMPUtils provides utility functions for manipulating date-time values.
+///
+/// @see \c TXMPUtils::ConvertToDate(), \c TXMPUtils::ConvertFromDate(),
+/// \c TXMPUtils::CompareDateTime(), \c TXMPUtils::ConvertToLocalTime(),
+/// \c TXMPUtils::ConvertToUTCTime(), \c TXMPUtils::CurrentDateTime(),
+/// \c TXMPUtils::SetTimeZone()
struct XMP_DateTime {
+
+ /// The year, can be negative.
XMP_Int32 year;
- XMP_Int32 month; /* 1..12 */
- XMP_Int32 day; /* 1..31 */
- XMP_Int32 hour; /* 0..23 */
- XMP_Int32 minute; /* 0..59 */
- XMP_Int32 second; /* 0..59 */
- XMP_Int32 tzSign; /* -1..+1, 0 means UTC, -1 is west, +1 is east. */
- XMP_Int32 tzHour; /* 0..23 */
- XMP_Int32 tzMinute; /* 0..59 */
+
+ /// The month in the range 1..12.
+ XMP_Int32 month;
+
+ /// The day of the month in the range 1..31.
+ XMP_Int32 day;
+
+ /// The hour in the range 0..23.
+ XMP_Int32 hour;
+
+ /// The minute in the range 0..59.
+ XMP_Int32 minute;
+
+ /// The second in the range 0..59.
+ XMP_Int32 second;
+
+ /// The "sign" of the time zone, \c #kXMP_TimeIsUTC (0) means UTC, \c #kXMP_TimeWestOfUTC (-1)
+ /// is west, \c #kXMP_TimeEastOfUTC (+1) is east.
+ XMP_Int32 tzSign;
+
+ /// The time zone hour in the range 0..23.
+ XMP_Int32 tzHour;
+
+ /// The time zone minute in the range 0..59.
+ XMP_Int32 tzMinute;
+
+ /// Nanoseconds within a second, often left as zero.
XMP_Int32 nanoSecond;
+
};
-enum { /* Values used for tzSign field. */
+/// Constant values for \c XMP_DateTime::tzSign field.
+enum {
+ /// Time zone is west of UTC.
kXMP_TimeWestOfUTC = -1,
+ /// UTC time.
kXMP_TimeIsUTC = 0,
+ /// Time zone is east of UTC.
kXMP_TimeEastOfUTC = +1
};
-
-/* ============================================================================================== */
-/* Standard namespace URI constants */
-/* ================================ */
-
-/**
- * \name XML namespace constants for standard XMP schema.
- * @{
- */
-
-/**
- * \def kXMP_NS_XMP
- * \brief The XML namespace for the XMP "basic" schema.
- */
-
-/**
- * \def kXMP_NS_XMP_Rights
- * \brief The XML namespace for the XMP copyright schema.
- */
-
-/**
- * \def kXMP_NS_XMP_MM
- * \brief The XML namespace for the XMP digital asset management schema.
- */
-
-/**
- * \def kXMP_NS_XMP_BJ
- * \brief The XML namespace for the job management schema.
- */
-
-/**
- * \def kXMP_NS_XMP_T
- * \brief The XML namespace for the XMP text document schema.
- */
-
-/**
- * \def kXMP_NS_XMP_T_PG
- * \brief The XML namespace for the XMP paged document schema.
- */
-
-/**
- * \def kXMP_NS_PDF
- * \brief The XML namespace for the PDF schema.
- */
-
-/**
- * \def kXMP_NS_Photoshop
- * \brief The XML namespace for the Photoshop custom schema.
- */
-
-/**
- * \def kXMP_NS_EXIF
- * \brief The XML namespace for Adobe's EXIF schema.
- */
-
-/**
- * \def kXMP_NS_TIFF
- * \brief The XML namespace for Adobe's TIFF schema.
- */
-
-/**
- * @}
- */
+// =================================================================================================
+// Standard namespace URI constants
+// ================================
+
+/// \name XML namespace constants for standard XMP schema.
+/// @{
+///
+/// \def kXMP_NS_XMP
+/// \brief The XML namespace for the XMP "basic" schema.
+///
+/// \def kXMP_NS_XMP_Rights
+/// \brief The XML namespace for the XMP copyright schema.
+///
+/// \def kXMP_NS_XMP_MM
+/// \brief The XML namespace for the XMP digital asset management schema.
+///
+/// \def kXMP_NS_XMP_BJ
+/// \brief The XML namespace for the job management schema.
+///
+/// \def kXMP_NS_XMP_T
+/// \brief The XML namespace for the XMP text document schema.
+///
+/// \def kXMP_NS_XMP_T_PG
+/// \brief The XML namespace for the XMP paged document schema.
+///
+/// \def kXMP_NS_PDF
+/// \brief The XML namespace for the PDF schema.
+///
+/// \def kXMP_NS_Photoshop
+/// \brief The XML namespace for the Photoshop custom schema.
+///
+/// \def kXMP_NS_EXIF
+/// \brief The XML namespace for Adobe's EXIF schema.
+///
+/// \def kXMP_NS_TIFF
+/// \brief The XML namespace for Adobe's TIFF schema.
+///
+/// @}
#define kXMP_NS_XMP "http://ns.adobe.com/xap/1.0/"
@@ -294,50 +264,33 @@ enum { /* Values used for tzSign field. */
#define kXMP_NS_XMP_Note "http://ns.adobe.com/xmp/note/"
#define kXMP_NS_AdobeStockPhoto "http://ns.adobe.com/StockPhoto/1.0/"
-
-/**
- * \name XML namespace constants for qualifiers and structured property fields.
- * @{
- */
-
-/**
- * \def kXMP_NS_XMP_IdentifierQual
- * \brief The XML namespace for qualifiers of the xmp:Identifier property.
- */
-
-/**
- * \def kXMP_NS_XMP_Dimensions
- * \brief The XML namespace for fields of the Dimensions type.
- */
-
-/**
- * \def kXMP_NS_XMP_Image
- * \brief The XML namespace for fields of a graphical image. Used for the Thumbnail type.
- */
-
-/**
- * \def kXMP_NS_XMP_ResourceEvent
- * \brief The XML namespace for fields of the ResourceEvent type.
- */
-
-/**
- * \def kXMP_NS_XMP_ResourceRef
- * \brief The XML namespace for fields of the ResourceRef type.
- */
-
-/**
- * \def kXMP_NS_XMP_ST_Version
- * \brief The XML namespace for fields of the Version type.
- */
-
-/**
- * \def kXMP_NS_XMP_ST_Job
- * \brief The XML namespace for fields of the JobRef type.
- */
-
-/**
- * @}
- */
+#define kXMP_NS_CreatorAtom "http://ns.adobe.com/creatorAtom/1.0/"
+
+/// \name XML namespace constants for qualifiers and structured property fields.
+/// @{
+///
+/// \def kXMP_NS_XMP_IdentifierQual
+/// \brief The XML namespace for qualifiers of the xmp:Identifier property.
+///
+/// \def kXMP_NS_XMP_Dimensions
+/// \brief The XML namespace for fields of the Dimensions type.
+///
+/// \def kXMP_NS_XMP_Image
+/// \brief The XML namespace for fields of a graphical image. Used for the Thumbnail type.
+///
+/// \def kXMP_NS_XMP_ResourceEvent
+/// \brief The XML namespace for fields of the ResourceEvent type.
+///
+/// \def kXMP_NS_XMP_ResourceRef
+/// \brief The XML namespace for fields of the ResourceRef type.
+///
+/// \def kXMP_NS_XMP_ST_Version
+/// \brief The XML namespace for fields of the Version type.
+///
+/// \def kXMP_NS_XMP_ST_Job
+/// \brief The XML namespace for fields of the JobRef type.
+///
+/// @}
#define kXMP_NS_XMP_IdentifierQual "http://ns.adobe.com/xmp/Identifier/qual/1.0/"
#define kXMP_NS_XMP_Dimensions "http://ns.adobe.com/xap/1.0/sType/Dimensions#"
@@ -352,43 +305,33 @@ enum { /* Values used for tzSign field. */
#define kXMP_NS_XMP_ST_Job "http://ns.adobe.com/xap/1.0/sType/Job#"
#define kXMP_NS_XMP_ManifestItem "http://ns.adobe.com/xap/1.0/sType/ManifestItem#"
-/* Deprecated constant names */
+// Deprecated XML namespace constants
#define kXMP_NS_XMP_T "http://ns.adobe.com/xap/1.0/t/"
#define kXMP_NS_XMP_T_PG "http://ns.adobe.com/xap/1.0/t/pg/"
#define kXMP_NS_XMP_G_IMG "http://ns.adobe.com/xap/1.0/g/img/"
-/**
- * \name XML namespace constants from outside Adobe.
- * @{
- */
-
-/**
- * \def kXMP_NS_DC
- * \brief The XML namespace for the Dublin Core schema.
- */
-
-/**
- * \def kXMP_NS_IPTCCore
- * \brief The XML namespace for the IPTC Core schema.
- */
-
-/**
- * \def kXMP_NS_RDF
- * \brief The XML namespace for RDF.
- */
-
-/**
- * \def kXMP_NS_XML
- * \brief The XML namespace for XML.
- */
-
-/**
- * @}
- */
-
-#define kXMP_NS_DC "http://purl.org/dc/elements/1.1/"
-
-#define kXMP_NS_IPTCCore "http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"
+/// \name XML namespace constants from outside Adobe.
+/// @{
+///
+/// \def kXMP_NS_DC
+/// \brief The XML namespace for the Dublin Core schema.
+///
+/// \def kXMP_NS_IPTCCore
+/// \brief The XML namespace for the IPTC Core schema.
+///
+/// \def kXMP_NS_RDF
+/// \brief The XML namespace for RDF.
+///
+/// \def kXMP_NS_XML
+/// \brief The XML namespace for XML.
+///
+/// @}
+
+#define kXMP_NS_DC "http://purl.org/dc/elements/1.1/"
+
+#define kXMP_NS_IPTCCore "http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"
+
+#define kXMP_NS_DICOM "http://ns.adobe.com/DICOM/"
#define kXMP_NS_PDFA_Schema "http://www.aiim.org/pdfa/ns/schema#"
#define kXMP_NS_PDFA_Property "http://www.aiim.org/pdfa/ns/property#"
@@ -400,28 +343,127 @@ enum { /* Values used for tzSign field. */
#define kXMP_NS_PDFX "http://ns.adobe.com/pdfx/1.3/"
#define kXMP_NS_PDFX_ID "http://www.npes.org/pdfx/ns/id/"
-#define kXMP_NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-#define kXMP_NS_XML "http://www.w3.org/XML/1998/namespace"
-
+#define kXMP_NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+#define kXMP_NS_XML "http://www.w3.org/XML/1998/namespace"
-/* ============================================================================================== */
-/* Enums and macros used for option bits */
-/* ===================================== */
+// =================================================================================================
+// Enums and macros used for option bits
+// =====================================
+
+/// \name Macros for standard option selections.
+/// @{
+///
+/// \def kXMP_ArrayLastItem
+/// \brief Options macro accesses last array item.
+///
+/// \def kXMP_UseNullTermination
+/// \brief Options macro sets string style.
+///
+/// \def kXMP_NoOptions
+/// \brief Options macro clears all property-type bits.
+///
+/// @}
#define kXMP_ArrayLastItem ((XMP_Index)(-1L))
#define kXMP_UseNullTermination ((XMP_StringLen)(~0UL))
-
#define kXMP_NoOptions ((XMP_OptionBits)0UL)
+/// \name Macros for setting and testing general option bits.
+/// @{
+///
+/// \def XMP_SetOption
+/// \brief Macro sets an option flag bit.
+/// \param var A variable storing an options flag.
+/// \param opt The bit-flag constant to set.
+///
+/// \def XMP_ClearOption
+/// \brief Macro clears an option flag bit.
+/// \param var A variable storing an options flag.
+/// \param opt The bit-flag constant to clear.
+///
+/// \def XMP_TestOption
+/// \brief Macro reports whether an option flag bit is set.
+/// \param var A variable storing an options flag.
+/// \param opt The bit-flag constant to test.
+/// \return True if the bit is set.
+///
+/// \def XMP_OptionIsSet
+/// \brief Macro reports whether an option flag bit is set.
+/// \param var A variable storing an options flag.
+/// \param opt The bit-flag constant to test.
+/// \return True if the bit is set.
+///
+/// \def XMP_OptionIsClear
+/// \brief Macro reports whether an option flag bit is clear.
+/// \param var A variable storing an options flag.
+/// \param opt The bit-flag constant to test.
+/// \return True if the bit is clear.
+///
+/// @}
+
#define XMP_SetOption(var,opt) var |= (opt)
#define XMP_ClearOption(var,opt) var &= ~(opt)
#define XMP_TestOption(var,opt) (((var) & (opt)) != 0)
#define XMP_OptionIsSet(var,opt) (((var) & (opt)) != 0)
#define XMP_OptionIsClear(var,opt) (((var) & (opt)) == 0)
+/// \name Macros for setting and testing specific option bits.
+/// @{
+///
+/// \def XMP_PropIsSimple
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_PropIsStruct
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_PropIsArray
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_ArrayIsUnordered
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_ArrayIsOrdered
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_ArrayIsAlternate
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_ArrayIsAltText
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_PropHasQualifiers
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_PropIsQualifier
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_PropHasLang
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_NodeIsSchema
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_PropIsAlias
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// @}
+
#define XMP_PropIsSimple(opt) (((opt) & kXMP_PropCompositeMask) == 0)
#define XMP_PropIsStruct(opt) (((opt) & kXMP_PropValueIsStruct) != 0)
#define XMP_PropIsArray(opt) (((opt) & kXMP_PropValueIsArray) != 0)
+
#define XMP_ArrayIsUnordered(opt) (((opt) & kXMP_PropArrayIsOrdered) == 0)
#define XMP_ArrayIsOrdered(opt) (((opt) & kXMP_PropArrayIsOrdered) != 0)
#define XMP_ArrayIsAlternate(opt) (((opt) & kXMP_PropArrayIsAlternate) != 0)
@@ -434,480 +476,855 @@ enum { /* Values used for tzSign field. */
#define XMP_NodeIsSchema(opt) (((opt) & kXMP_SchemaNode) != 0)
#define XMP_PropIsAlias(opt) (((opt) & kXMP_PropIsAlias) != 0)
-/* ---------------------------------------------------------------------------------------------- */
-
-enum { /* Option bits returned from the TXMPMeta::GetXyz functions. */
-
- /* Options relating to the XML string form of the property value. */
- kXMP_PropValueIsURI = 0x00000002UL, /* The value is a URI, use rdf:resource attribute. DISCOURAGED */
-
- /* Options relating to qualifiers attached to a property. */
- kXMP_PropHasQualifiers = 0x00000010UL, /* The property has qualifiers, includes rdf:type and xml:lang. */
- kXMP_PropIsQualifier = 0x00000020UL, /* This is a qualifier, includes rdf:type and xml:lang. */
- kXMP_PropHasLang = 0x00000040UL, /* Implies kXMP_PropHasQualifiers, property has xml:lang. */
- kXMP_PropHasType = 0x00000080UL, /* Implies kXMP_PropHasQualifiers, property has rdf:type. */
-
- /* Options relating to the data structure form. */
- kXMP_PropValueIsStruct = 0x00000100UL, /* The value is a structure with nested fields. */
- kXMP_PropValueIsArray = 0x00000200UL, /* The value is an array (RDF alt/bag/seq). */
- kXMP_PropArrayIsUnordered = kXMP_PropValueIsArray, /* The item order does not matter. */
- kXMP_PropArrayIsOrdered = 0x00000400UL, /* Implies kXMP_PropValueIsArray, item order matters. */
- kXMP_PropArrayIsAlternate = 0x00000800UL, /* Implies kXMP_PropArrayIsOrdered, items are alternates. */
-
- /* Additional struct and array options. */
- kXMP_PropArrayIsAltText = 0x00001000UL, /* Implies kXMP_PropArrayIsAlternate, items are localized text. */
- /* kXMP_InsertBeforeItem = 0x00004000UL, ! Used by SetXyz functions. */
- /* kXMP_InsertAfterItem = 0x00008000UL, ! Used by SetXyz functions. */
-
- /* Other miscellaneous options. */
- kXMP_PropIsAlias = 0x00010000UL, /* This property is an alias name for another property. */
- kXMP_PropHasAliases = 0x00020000UL, /* This property is the base value for a set of aliases. */
- kXMP_PropIsInternal = 0x00040000UL, /* This property is an "internal" property, owned by applications. */
- kXMP_PropIsStable = 0x00100000UL, /* This property is not derived from the document content. */
- kXMP_PropIsDerived = 0x00200000UL, /* This property is derived from the document content. */
- /* kXMPUtil_AllowCommas = 0x10000000UL, ! Used by TXMPUtils::CatenateArrayItems and ::SeparateArrayItems. */
- /* kXMP_DeleteExisting = 0x20000000UL, ! Used by TXMPMeta::SetXyz functions to delete any pre-existing property. */
- /* kXMP_SchemaNode = 0x80000000UL, ! Returned by iterators - #define to avoid warnings */
-
- /* Masks that are multiple flags. */
+// -------------------------------------------------------------------------------------------------
+
+/// Option bit flags for the \c TXMPMeta property accessor functions.
+enum {
+
+ /// The XML string form of the property value is a URI, use rdf:resource attribute. DISCOURAGED
+ kXMP_PropValueIsURI = 0x00000002UL,
+
+ // ------------------------------------------------------
+ // Options relating to qualifiers attached to a property.
+
+ /// The property has qualifiers, includes \c rdf:type and \c xml:lang.
+ kXMP_PropHasQualifiers = 0x00000010UL,
+
+ /// This is a qualifier for some other property, includes \c rdf:type and \c xml:lang.
+ /// Qualifiers can have arbitrary structure, and can themselves have qualifiers. If the
+ /// qualifier itself has a structured value, this flag is only set for the top node of the
+ /// qualifier's subtree.
+ kXMP_PropIsQualifier = 0x00000020UL,
+
+ /// Implies \c #kXMP_PropHasQualifiers, property has \c xml:lang.
+ kXMP_PropHasLang = 0x00000040UL,
+
+ /// Implies \c #kXMP_PropHasQualifiers, property has \c rdf:type.
+ kXMP_PropHasType = 0x00000080UL,
+
+ // --------------------------------------------
+ // Options relating to the data structure form.
+
+ /// The value is a structure with nested fields.
+ kXMP_PropValueIsStruct = 0x00000100UL,
+
+ /// The value is an array (RDF alt/bag/seq). The "ArrayIs..." flags identify specific types
+ /// of array; default is a general unordered array, serialized using an \c rdf:Bag container.
+ kXMP_PropValueIsArray = 0x00000200UL,
+
+ /// The item order does not matter.
+ kXMP_PropArrayIsUnordered = kXMP_PropValueIsArray,
+
+ /// Implies \c #kXMP_PropValueIsArray, item order matters. It is serialized using an \c rdf:Seq container.
+ kXMP_PropArrayIsOrdered = 0x00000400UL,
+
+ /// Implies \c #kXMP_PropArrayIsOrdered, items are alternates. It is serialized using an \c rdf:Alt container.
+ kXMP_PropArrayIsAlternate = 0x00000800UL,
+
+ // ------------------------------------
+ // Additional struct and array options.
+
+ /// Implies \c #kXMP_PropArrayIsAlternate, items are localized text. Each array element is a
+ /// simple property with an \c xml:lang attribute.
+ kXMP_PropArrayIsAltText = 0x00001000UL,
+
+ // kXMP_InsertBeforeItem = 0x00004000UL, ! Used by SetXyz functions.
+ // kXMP_InsertAfterItem = 0x00008000UL, ! Used by SetXyz functions.
+
+ // ----------------------------
+ // Other miscellaneous options.
+
+ /// This property is an alias name for another property. This is only returned by
+ /// \c TXMPMeta::GetProperty() and then only if the property name is simple, not an path expression.
+ kXMP_PropIsAlias = 0x00010000UL,
+
+ /// This property is the base value (actual) for a set of aliases.This is only returned by
+ /// \c TXMPMeta::GetProperty() and then only if the property name is simple, not an path expression.
+ kXMP_PropHasAliases = 0x00020000UL,
+
+ /// The value of this property is "owned" by the application, and should not generally be editable in a UI.
+ kXMP_PropIsInternal = 0x00040000UL,
+
+ /// The value of this property is not derived from the document content.
+ kXMP_PropIsStable = 0x00100000UL,
+
+ /// The value of this property is derived from the document content.
+ kXMP_PropIsDerived = 0x00200000UL,
+
+ // kXMPUtil_AllowCommas = 0x10000000UL, ! Used by TXMPUtils::CatenateArrayItems and ::SeparateArrayItems.
+ // kXMP_DeleteExisting = 0x20000000UL, ! Used by TXMPMeta::SetXyz functions to delete any pre-existing property.
+ // kXMP_SchemaNode = 0x80000000UL, ! Returned by iterators - #define to avoid warnings
+
+ // ------------------------------
+ // Masks that are multiple flags.
+
+ /// Property type bit-flag mask for all array types
kXMP_PropArrayFormMask = kXMP_PropValueIsArray | kXMP_PropArrayIsOrdered | kXMP_PropArrayIsAlternate | kXMP_PropArrayIsAltText,
- kXMP_PropCompositeMask = kXMP_PropValueIsStruct | kXMP_PropArrayFormMask, /* Is it simple or composite (array or struct)? */
- kXMP_ImplReservedMask = 0x70000000L /* Reserved for transient use by the implementation. */
+
+ /// Property type bit-flag mask for composite types (array and struct)
+ kXMP_PropCompositeMask = kXMP_PropValueIsStruct | kXMP_PropArrayFormMask,
+
+ /// Mask for bits that are reserved for transient use by the implementation.
+ kXMP_ImplReservedMask = 0x70000000L
+
};
#define kXMP_SchemaNode ((XMP_OptionBits)0x80000000UL)
-enum { /* Option bits for the TXMPMeta::SetXyz functions. */
+/// Option bit flags for the \c TXMPMeta property setting functions. These option bits are shared
+/// with the accessor functions:
+/// \li \c #kXMP_PropValueIsURI
+/// \li \c #kXMP_PropValueIsStruct
+/// \li \c #kXMP_PropValueIsArray
+/// \li \c #kXMP_PropArrayIsOrdered
+/// \li \c #kXMP_PropArrayIsAlternate
+/// \li \c #kXMP_PropArrayIsAltText
+enum {
- /* Options shared with GetXyz functions. */
- /*
- kXMP_PropValueIsURI = 0x00000002UL, DISCOURAGED
- kXMP_PropValueIsStruct = 0x00000100UL,
- kXMP_PropValueIsArray = 0x00000200UL,
- kXMP_PropArrayIsOrdered = 0x00000400UL,
- kXMP_PropArrayIsAlternate = 0x00000800UL,
- kXMP_PropArrayIsAltText = 0x00001000UL,
- kXMP_PropValueIsCompact = 0x00002000UL, RESERVED
- */
+ /// Option for array item location: Insert a new item before the given index.
+ kXMP_InsertBeforeItem = 0x00004000UL,
- /* Options for array item location. */
- kXMP_InsertBeforeItem = 0x00004000UL, /* Insert a new item before the given index. */
- kXMP_InsertAfterItem = 0x00008000UL, /* Insert a new item after the given index. */
+ /// Option for array item location: Insert a new item after the given index.
+ kXMP_InsertAfterItem = 0x00008000UL,
- /* Miscellaneous options */
- kXMP_DeleteExisting = 0x20000000UL, /* Delete any pre-existing property. */
+ /// Delete any pre-existing property.
+ kXMP_DeleteExisting = 0x20000000UL,
- /* Masks that are multiple flags. */
+ /// Bit-flag mask for property-value option bits
kXMP_PropValueOptionsMask = kXMP_PropValueIsURI,
+
+ /// Bit-flag mask for array-item location bits
kXMP_PropArrayLocationMask = kXMP_InsertBeforeItem | kXMP_InsertAfterItem
};
-/* ---------------------------------------------------------------------------------------------- */
+// -------------------------------------------------------------------------------------------------
+
+/// Option bit flags for \c TXMPMeta::ParseFromBuffer().
+enum {
+
+ /// Require a surrounding \c x:xmpmeta element.
+ kXMP_RequireXMPMeta = 0x0001UL,
+
+ /// This is the not last input buffer for this parse stream.
+ kXMP_ParseMoreBuffers = 0x0002UL,
+
+ /// Do not reconcile alias differences, throw an exception.
+ kXMP_StrictAliasing = 0x0004UL
-enum { /* Options for TXMPMeta::ParseFromBuffer. */
- kXMP_RequireXMPMeta = 0x0001UL, /* Require a surrounding x:xmpmeta element. */
- kXMP_ParseMoreBuffers = 0x0002UL, /* This is the not last input buffer for this parse stream. */
- kXMP_StrictAliasing = 0x0004UL /* Do not reconcile alias differences, throw an exception. */
};
-enum { /* Options for TXMPMeta::SerializeToBuffer. */
+/// Option bit flags for \c TXMPMeta::SerializeToBuffer().
+enum {
+
+ // *** Option to remove empty struct/array, or leaf with empty value?
+
+ /// Omit the XML packet wrapper.
+ kXMP_OmitPacketWrapper = 0x0010UL,
+
+ /// Default is a writeable packet.
+ kXMP_ReadOnlyPacket = 0x0020UL,
+
+ /// Use a compact form of RDF.
+ kXMP_UseCompactFormat = 0x0040UL,
+
+ /// Include a padding allowance for a thumbnail image.
+ kXMP_IncludeThumbnailPad = 0x0100UL,
- /* *** Option to remove empty struct/array, or leaf with empty value? */
+ /// The padding parameter is the overall packet length.
+ kXMP_ExactPacketLength = 0x0200UL,
- kXMP_OmitPacketWrapper = 0x0010UL, /* Omit the XML packet wrapper. */
- kXMP_ReadOnlyPacket = 0x0020UL, /* Default is a writeable packet. */
- kXMP_UseCompactFormat = 0x0040UL, /* Use a compact form of RDF. */
+ /// Show aliases as XML comments.
+ kXMP_WriteAliasComments = 0x0400UL,
- kXMP_IncludeThumbnailPad = 0x0100UL, /* Include a padding allowance for a thumbnail image. */
- kXMP_ExactPacketLength = 0x0200UL, /* The padding parameter is the overall packet length. */
- kXMP_WriteAliasComments = 0x0400UL, /* Show aliases as XML comments. */
- kXMP_OmitAllFormatting = 0x0800UL, /* Omit all formatting whitespace. */
+ /// Omit all formatting whitespace.
+ kXMP_OmitAllFormatting = 0x0800UL,
+
+ /// Omit the x:xmpmeta element surrounding the rdf:RDF element.
+ kXMP_OmitXMPMetaElement = 0x1000UL,
- _XMP_LittleEndian_Bit = 0x0001UL, /* ! Don't use directly, see the combined values below! */
+ _XMP_LittleEndian_Bit = 0x0001UL, // ! Don't use directly, see the combined values below!
_XMP_UTF16_Bit = 0x0002UL,
_XMP_UTF32_Bit = 0x0004UL,
+ /// Bit-flag mask for encoding-type bits
kXMP_EncodingMask = 0x0007UL,
+
+ /// Use UTF8 encoding
kXMP_EncodeUTF8 = 0UL,
+
+ /// Use UTF16 big-endian encoding
kXMP_EncodeUTF16Big = _XMP_UTF16_Bit,
+
+ /// Use UTF16 little-endian encoding
kXMP_EncodeUTF16Little = _XMP_UTF16_Bit | _XMP_LittleEndian_Bit,
+
+ /// Use UTF32 big-endian encoding
kXMP_EncodeUTF32Big = _XMP_UTF32_Bit,
+
+ /// Use UTF13 little-endian encoding
kXMP_EncodeUTF32Little = _XMP_UTF32_Bit | _XMP_LittleEndian_Bit
};
-/* ---------------------------------------------------------------------------------------------- */
+// -------------------------------------------------------------------------------------------------
-enum { /* Options for TXMPIterator construction. */
+/// Option bit flags for \c TXMPIterator construction.
+enum {
- kXMP_IterClassMask = 0x00FFUL, /* The low 8 bits are an enum of what data structure to iterate. */
- kXMP_IterProperties = 0x0000UL, /* Iterate the property tree of a TXMPMeta object. */
- kXMP_IterAliases = 0x0001UL, /* Iterate the global alias table. */
- kXMP_IterNamespaces = 0x0002UL, /* Iterate the global namespace table. */
- kXMP_IterJustChildren = 0x0100UL, /* Just do the immediate children of the root, default is subtree. */
- kXMP_IterJustLeafNodes = 0x0200UL, /* Just do the leaf nodes, default is all nodes in the subtree. */
- kXMP_IterJustLeafName = 0x0400UL, /* Return just the leaf part of the path, default is the full path. */
- kXMP_IterIncludeAliases = 0x0800UL, /* Include aliases, default is just actual properties. */
+ /// The low 8 bits are an enum of what data structure to iterate.
+ kXMP_IterClassMask = 0x00FFUL,
- kXMP_IterOmitQualifiers = 0x1000UL /* Omit all qualifiers. */
+ /// Iterate the property tree of a TXMPMeta object.
+ kXMP_IterProperties = 0x0000UL,
-};
+ /// Iterate the global alias table.
+ kXMP_IterAliases = 0x0001UL,
-enum { /* Options for TXMPIterator::Skip. */
- kXMP_IterSkipSubtree = 0x0001UL, /* Skip the subtree below the current node. */
- kXMP_IterSkipSiblings = 0x0002UL /* Skip the subtree below and remaining siblings of the current node. */
-};
+ /// Iterate the global namespace table.
+ kXMP_IterNamespaces = 0x0002UL,
-/* ---------------------------------------------------------------------------------------------- */
+ /// Just do the immediate children of the root, default is subtree.
+ kXMP_IterJustChildren = 0x0100UL,
-enum { /* Options for TXMPUtils::CatenateArrayItems and TXMPUtils::SeparateArrayItems. */
+ /// Just do the leaf nodes, default is all nodes in the subtree.
+ kXMP_IterJustLeafNodes = 0x0200UL,
- /* Options shared with GetXyz functions. */
- /*
- kXMP_PropValueIsArray = 0x00000200UL,
- kXMP_PropArrayIsOrdered = 0x00000400UL,
- kXMP_PropArrayIsAlternate = 0x00000800UL,
- kXMP_PropArrayIsAltText = 0x00001000UL,
- */
+ /// Return just the leaf part of the path, default is the full path.
+ kXMP_IterJustLeafName = 0x0400UL,
- kXMPUtil_AllowCommas = 0x10000000UL /* Allow commas in item values, default is separator. */
+ /// Include aliases, default is just actual properties.
+ kXMP_IterIncludeAliases = 0x0800UL,
+
+ /// Omit all qualifiers.
+ kXMP_IterOmitQualifiers = 0x1000UL
};
-enum { /* Options for TXMPUtils::RemoveProperties and TXMPUtils::AppendProperties. */
- kXMPUtil_DoAllProperties = 0x0001UL, /* Do all properties, default is just external properties. */
- kXMPUtil_ReplaceOldValues = 0x0002UL, /* Replace existing values, default is to leave them. */
- kXMPUtil_DeleteEmptyValues = 0x0004UL, /* Delete properties if the new value is empty. */
- kXMPUtil_IncludeAliases = 0x0800UL /* == kXMP_IterIncludeAliases */
+/// Option bit flags for \c TXMPIterator::Skip().
+enum {
+
+ /// Skip the subtree below the current node.
+ kXMP_IterSkipSubtree = 0x0001UL,
+
+ /// Skip the subtree below and remaining siblings of the current node.
+ kXMP_IterSkipSiblings = 0x0002UL
+
};
-/* ============================================================================================== */
-/* Types and Constants for XMP File Handler */
-/* ======================================== */
+// -------------------------------------------------------------------------------------------------
+/// Option bit flags for \c TXMPUtils::CatenateArrayItems() and \c TXMPUtils::SeparateArrayItems().
+/// These option bits are shared with the accessor functions:
+/// \li \c #kXMP_PropValueIsArray,
+/// \li \c #kXMP_PropArrayIsOrdered,
+/// \li \c #kXMP_PropArrayIsAlternate,
+/// \li \c #kXMP_PropArrayIsAltText
+enum {
+
+ /// Allow commas in item values, default is separator.
+ kXMPUtil_AllowCommas = 0x10000000UL
+};
+
+/// Option bit flags for \c TXMPUtils::RemoveProperties() and \c TXMPUtils::AppendProperties().
enum {
- /* Public file formats. Hex used to avoid gcc warnings. */
- /* ! Leave them as big endian. There seems to be no decent way on UNIX to determine the target */
- /* ! endianness at compile time. Forcing it on the client isn't acceptable. */
+ /// Do all properties, default is just external properties.
+ kXMPUtil_DoAllProperties = 0x0001UL,
+
+ /// Replace existing values, default is to leave them.
+ kXMPUtil_ReplaceOldValues = 0x0002UL,
- kXMP_PDFFile = 0x50444620UL, /* 'PDF ' */
- kXMP_PostScriptFile = 0x50532020UL, /* 'PS ', general PostScript following DSC conventions. */
- kXMP_EPSFile = 0x45505320UL, /* 'EPS ', encapsulated PostScript. */
+ /// Delete properties if the new value is empty.
+ kXMPUtil_DeleteEmptyValues = 0x0004UL,
+
+ /// Include aliases, default is just actual properties.
+ kXMPUtil_IncludeAliases = 0x0800UL
+
+};
- kXMP_JPEGFile = 0x4A504547UL, /* 'JPEG' */
- kXMP_JPEG2KFile = 0x4A505820UL, /* 'JPX ', ISO 15444-1 */
- kXMP_TIFFFile = 0x54494646UL, /* 'TIFF' */
- kXMP_GIFFile = 0x47494620UL, /* 'GIF ' */
- kXMP_PNGFile = 0x504E4720UL, /* 'PNG ' */
+// =================================================================================================
+// Types and Constants for XMPFiles
+// ================================
+
+/// File format constants for use with XMPFiles.
+enum {
- kXMP_SWFFile = 0x53574620UL, /* 'SWF ' */
- kXMP_FLAFile = 0x464C4120UL, /* 'FLA ' */
- kXMP_FLVFile = 0x464C5620UL, /* 'FLV ' */
-
- kXMP_MOVFile = 0x4D4F5620UL, /* 'MOV ', Quicktime */
- kXMP_AVIFile = 0x41564920UL, /* 'AVI ' */
- kXMP_CINFile = 0x43494E20UL, /* 'CIN ', Cineon */
- kXMP_WAVFile = 0x57415620UL, /* 'WAV ' */
- kXMP_MP3File = 0x4D503320UL, /* 'MP3 ' */
- kXMP_SESFile = 0x53455320UL, /* 'SES ', Audition session */
- kXMP_CELFile = 0x43454C20UL, /* 'CEL ', Audition loop */
- kXMP_MPEGFile = 0x4D504547UL, /* 'MPEG' */
- kXMP_MPEG2File = 0x4D503220UL, /* 'MP2 ' */
- kXMP_MPEG4File = 0x4D503420UL, /* 'MP4 ', ISO 14494-12 and -14 */
- kXMP_WMAVFile = 0x574D4156UL, /* 'WMAV', Windows Media Audio and Video */
- kXMP_AIFFFile = 0x41494646UL, /* 'AIFF' */
-
- kXMP_HTMLFile = 0x48544D4CUL, /* 'HTML' */
- kXMP_XMLFile = 0x584D4C20UL, /* 'XML ' */
- kXMP_TextFile = 0x74657874UL, /* 'text' */
-
- /* Adobe application file formats. */
-
- kXMP_PhotoshopFile = 0x50534420UL, /* 'PSD ' */
- kXMP_IllustratorFile = 0x41492020UL, /* 'AI ' */
- kXMP_InDesignFile = 0x494E4444UL, /* 'INDD' */
- kXMP_AEProjectFile = 0x41455020UL, /* 'AEP ' */
- kXMP_AEProjTemplateFile = 0x41455420UL, /* 'AET ', After Effects Project Template */
- kXMP_AEFilterPresetFile = 0x46465820UL, /* 'FFX ' */
- kXMP_EncoreProjectFile = 0x4E434F52UL, /* 'NCOR' */
- kXMP_PremiereProjectFile = 0x5052504AUL, /* 'PRPJ' */
- kXMP_PremiereTitleFile = 0x5052544CUL, /* 'PRTL' */
-
- /* Catch all. */
-
- kXMP_UnknownFile = 0x20202020UL /* ' ' */
+ // ! Hex used to avoid gcc warnings. Leave the constants so the text reads big endian. There
+ // ! seems to be no decent way on UNIX to determine the target endianness at compile time.
+ // ! Forcing it on the client isn't acceptable.
+
+ // --------------------
+ // Public file formats.
+
+ /// Public file format constant: 'PDF '
+ kXMP_PDFFile = 0x50444620UL,
+ /// Public file format constant: 'PS ', general PostScript following DSC conventions
+ kXMP_PostScriptFile = 0x50532020UL,
+ /// Public file format constant: 'EPS ', encapsulated PostScript
+ kXMP_EPSFile = 0x45505320UL,
+
+ /// Public file format constant: 'JPEG'
+ kXMP_JPEGFile = 0x4A504547UL,
+ /// Public file format constant: 'JPX ', JPEG 2000, ISO 15444-1
+ kXMP_JPEG2KFile = 0x4A505820UL,
+ /// Public file format constant: 'TIFF'
+ kXMP_TIFFFile = 0x54494646UL,
+ /// Public file format constant: 'GIF '
+ kXMP_GIFFile = 0x47494620UL,
+ /// Public file format constant: 'PNG '
+ kXMP_PNGFile = 0x504E4720UL,
+
+ /// Public file format constant: 'SWF '
+ kXMP_SWFFile = 0x53574620UL,
+ /// Public file format constant: 'FLA '
+ kXMP_FLAFile = 0x464C4120UL,
+ /// Public file format constant: 'FLV '
+ kXMP_FLVFile = 0x464C5620UL,
+
+ /// Public file format constant: 'MOV ', Quicktime
+ kXMP_MOVFile = 0x4D4F5620UL,
+ /// Public file format constant: 'AVI '
+ kXMP_AVIFile = 0x41564920UL,
+ /// Public file format constant: 'CIN ', Cineon
+ kXMP_CINFile = 0x43494E20UL,
+ /// Public file format constant: 'WAV '
+ kXMP_WAVFile = 0x57415620UL,
+ /// Public file format constant: 'MP3 '
+ kXMP_MP3File = 0x4D503320UL,
+ /// Public file format constant: 'SES ', Audition session
+ kXMP_SESFile = 0x53455320UL,
+ /// Public file format constant: 'CEL ', Audition loop
+ kXMP_CELFile = 0x43454C20UL,
+ /// Public file format constant: 'MPEG'
+ kXMP_MPEGFile = 0x4D504547UL,
+ /// Public file format constant: 'MP2 '
+ kXMP_MPEG2File = 0x4D503220UL,
+ /// Public file format constant: 'MP4 ', ISO 14494-12 and -14
+ kXMP_MPEG4File = 0x4D503420UL,
+ /// Public file format constant: 'WMAV', Windows Media Audio and Video
+ kXMP_WMAVFile = 0x574D4156UL,
+ /// Public file format constant: 'AIFF'
+ kXMP_AIFFFile = 0x41494646UL,
+ /// Public file format constant: 'P2 ', a collection not really a single file
+ kXMP_P2File = 0x50322020UL,
+ /// Public file format constant: 'XDCF', a collection not really a single file
+ kXMP_XDCAM_FAMFile = 0x58444346UL,
+ /// Public file format constant: 'XDCS', a collection not really a single file
+ kXMP_XDCAM_SAMFile = 0x58444353UL,
+ /// Public file format constant: 'XDCX', a collection not really a single file
+ kXMP_XDCAM_EXFile = 0x58444358UL,
+ /// Public file format constant: 'AVHD', a collection not really a single file
+ kXMP_AVCHDFile = 0x41564844UL,
+ /// Public file format constant: 'SHDV', a collection not really a single file
+ kXMP_SonyHDVFile = 0x53484456UL,
+
+ /// Public file format constant: 'HTML'
+ kXMP_HTMLFile = 0x48544D4CUL,
+ /// Public file format constant: 'XML '
+ kXMP_XMLFile = 0x584D4C20UL,
+ /// Public file format constant: 'text'
+ kXMP_TextFile = 0x74657874UL,
+
+ // -------------------------------
+ // Adobe application file formats.
+
+ /// Adobe application file format constant: 'PSD '
+ kXMP_PhotoshopFile = 0x50534420UL,
+ /// Adobe application file format constant: 'AI '
+ kXMP_IllustratorFile = 0x41492020UL,
+ /// Adobe application file format constant: 'INDD'
+ kXMP_InDesignFile = 0x494E4444UL,
+ /// Adobe application file format constant: 'AEP '
+ kXMP_AEProjectFile = 0x41455020UL,
+ /// Adobe application file format constant: 'AET ', After Effects Project Template
+ kXMP_AEProjTemplateFile = 0x41455420UL,
+ /// Adobe application file format constant: 'FFX '
+ kXMP_AEFilterPresetFile = 0x46465820UL,
+ /// Adobe application file format constant: 'NCOR'
+ kXMP_EncoreProjectFile = 0x4E434F52UL,
+ /// Adobe application file format constant: 'PRPJ'
+ kXMP_PremiereProjectFile = 0x5052504AUL,
+ /// Adobe application file format constant: 'PRTL'
+ kXMP_PremiereTitleFile = 0x5052544CUL,
+ /// Adobe application file format constant: 'UCF ', Universal Container Format
+ kXMP_UCFFile = 0x55434620UL,
+
+ // -------
+ // Others.
+
+ /// Unknown file format constant: ' '
+ kXMP_UnknownFile = 0x20202020UL
};
+
+/// Type for file format identification constants. See \c #kXMP_PDFFile and following.
typedef XMP_Uns32 XMP_FileFormat;
-/* ---------------------------------------------------------------------------------------------- */
+// -------------------------------------------------------------------------------------------------
+/// Byte-order masks, do not use directly
enum {
kXMP_CharLittleEndianMask = 1,
- kXMP_Char16BitMask = 2, /* Don't use these directly. */
+ kXMP_Char16BitMask = 2,
kXMP_Char32BitMask = 4
};
-enum { /* The values allow easy testing for 16/32 bit and big/little endian. */
+/// Constants to allow easy testing for 16/32 bit and big/little endian.
+enum {
+ /// 8-bit
kXMP_Char8Bit = 0,
+ /// 16-bit big-endian
kXMP_Char16BitBig = kXMP_Char16BitMask,
+ /// 16-bit little-endian
kXMP_Char16BitLittle = kXMP_Char16BitMask | kXMP_CharLittleEndianMask,
+ /// 32-bit big-endian
kXMP_Char32BitBig = kXMP_Char32BitMask,
+ /// 32-bit little-endian
kXMP_Char32BitLittle = kXMP_Char32BitMask | kXMP_CharLittleEndianMask,
- kXMP_CharUnknown = 1 /* ! A bit of a hack, for variable or not-yet-known cases. */
+ /// Variable or not-yet-known cases
+ kXMP_CharUnknown = 1
};
+/// \name Macros to test components of the character form mask
+/// @{
+///
+/// \def XMP_CharFormIs16Bit
+/// \brief Macro reports the encoding of a character.
+/// \param f The character to check.
+///
+/// \def XMP_CharFormIs32Bit
+/// \brief Macro reports the encoding of a character.
+/// \param f The character to check.
+///
+/// \def XMP_CharFormIsBigEndian
+/// \brief Macro reports the byte-order of a character.
+/// \param f The character to check.
+///
+/// \def XMP_CharFormIsLittleEndian
+/// \brief Macro reports the byte-order of a character.
+/// \param f The character to check.
+///
+/// \def XMP_GetCharSize
+/// \brief Macro reports the byte-size of a character.
+/// \param f The character to check.
+///
+/// \def XMP_CharToSerializeForm
+/// \brief Macro converts \c XMP_Uns8 to \c XMP_OptionBits.
+/// \param cf The character to convert.
+///
+/// \def XMP_CharFromSerializeForm
+/// \brief Macro converts \c XMP_OptionBits to \c XMP_Uns8.
+/// \param sf The character to convert.
+///
+/// @}
+
#define XMP_CharFormIs16Bit(f) ( ((int)(f) & kXMP_Char16BitMask) != 0 )
#define XMP_CharFormIs32Bit(f) ( ((int)(f) & kXMP_Char32BitMask) != 0 )
-
#define XMP_CharFormIsBigEndian(f) ( ((int)(f) & kXMP_CharLittleEndianMask) == 0 )
#define XMP_CharFormIsLittleEndian(f) ( ((int)(f) & kXMP_CharLittleEndianMask) != 0 )
-
#define XMP_GetCharSize(f) ( ((int)(f)&6) == 0 ? 1 : (int)(f)&6 )
-
#define XMP_CharToSerializeForm(cf) ( (XMP_OptionBits)(cf) )
#define XMP_CharFromSerializeForm(sf) ( (XMP_Uns8)(sf) )
+/// \def kXMPFiles_UnknownOffset
+/// \brief Constant for an unknown packet offset within a file.
+#define kXMPFiles_UnknownOffset ((XMP_Int64)-1)
+
+/// \def kXMPFiles_UnknownLength
+/// \brief Constant for an unknown packet length within a file.
+#define kXMPFiles_UnknownLength ((XMP_Int32)-1)
+
+/// XMP packet description
struct XMP_PacketInfo {
+
+ /// Packet offset in the file in bytes, -1 if unknown.
XMP_Int64 offset;
+ /// Packet length in the file in bytes, -1 if unknown.
XMP_Int32 length;
- XMP_Int32 padSize; /* Zero if unknown. */
+ /// Packet padding size in bytes, zero if unknown.
+ XMP_Int32 padSize; // Zero if unknown.
+
+ /// Character format using the values \c kXMP_Char8Bit, \c kXMP_Char16BitBig, etc.
XMP_Uns8 charForm;
+ /// True if there is a packet wrapper and the trailer says writeable by dumb packet scanners.
XMP_Bool writeable;
- XMP_Uns8 pad1, pad2;
- #if __cplusplus
- XMP_PacketInfo() : offset(0), length(0), padSize(0), charForm(0), writeable(0), pad1(0), pad2(0) {};
- #endif
+ /// True if there is a packet wrapper, the "<?xpacket...>" XML processing instructions.
+ XMP_Bool hasWrapper;
+
+ /// Padding to make the struct's size be a multiple 4.
+ XMP_Uns8 pad;
+
+ /// Default constructor.
+ XMP_PacketInfo() : offset(kXMPFiles_UnknownOffset), length(kXMPFiles_UnknownLength),
+ padSize(0), charForm(0), writeable(0), hasWrapper(0), pad(0) {};
+
};
-#if ! __cplusplus
- typedef struct XMP_PacketInfo XMP_PacketInfo;
-#endif
-enum { kXMP_PacketInfoVersion = 3 };
-/* ---------------------------------------------------------------------------------------------- */
+/// Version of the XMP_PacketInfo type
+enum {
+ /// Version of the XMP_PacketInfo type
+ kXMP_PacketInfoVersion = 3
+};
+
+// -------------------------------------------------------------------------------------------------
-enum { /* Values for XMP_ThumbnailInfo.tnailFormat. */
- kXMP_UnknownTNail = 0, /* The thumbnail data has an unknown format. */
- kXMP_JPEGTNail = 1, /* The thumbnail data is a JPEG stream, presumably compressed. */
- kXMP_TIFFTNail = 2, /* The thumbnail data is a TIFF stream, presumably uncompressed. */
- kXMP_PShopTNail = 3 /* The thumbnail data is in the format of Photoshop Image Resource 1036. */
+/// Values for \c XMP_ThumbnailInfo::tnailFormat.
+enum {
+ /// The thumbnail data has an unknown format.
+ kXMP_UnknownTNail = 0,
+ /// The thumbnail data is a JPEG stream, presumably compressed.
+ kXMP_JPEGTNail = 1,
+ /// The thumbnail data is a TIFF stream, presumably uncompressed.
+ kXMP_TIFFTNail = 2,
+ /// The thumbnail data is in the format of Photoshop Image Resource 1036.
+ kXMP_PShopTNail = 3
};
+/// Thumbnail descriptor
struct XMP_ThumbnailInfo {
- XMP_FileFormat fileFormat; /* The format of the containing file. */
- XMP_Uns32 fullWidth, fullHeight; /* Full image size in pixels. */
- XMP_Uns32 tnailWidth, tnailHeight; /* Thumbnail image size in pixels. */
- XMP_Uns16 fullOrientation, tnailOrientation; /* Orientation of full image and thumbnail, as defined by Exif for tag 274. */
- const XMP_Uns8 * tnailImage; /* Raw data from the host file, valid for life of the owning XMPFiles object. Do not modify! */
- XMP_Uns32 tnailSize; /* The size in bytes of the tnailImage data. */
- XMP_Uns8 tnailFormat; /* The format of the tnailImage data. */
- XMP_Uns8 pad1, pad2, pad3;
- #if __cplusplus
- XMP_ThumbnailInfo() : fileFormat(kXMP_UnknownFile), fullWidth(0), fullHeight(0),
- tnailWidth(0), tnailHeight(0), fullOrientation(0), tnailOrientation(0),
- tnailImage(0), tnailSize(0), tnailFormat(kXMP_UnknownTNail) {};
- #endif
-};
-#if ! __cplusplus
- typedef struct XMP_ThumbnailInfo XMP_ThumbnailInfo;
-#endif
-enum { kXMP_ThumbnailInfoVersion = 1 };
-/* ---------------------------------------------------------------------------------------------- */
+ /// The format of the containing file.
+ XMP_FileFormat fileFormat;
+ /// Full image size in pixels.
+ XMP_Uns32 fullWidth, fullHeight;
+ /// Thumbnail image size in pixels.
+ XMP_Uns32 tnailWidth, tnailHeight;
+ /// Orientation of full image and thumbnail, as defined by Exif for tag 274.
+
+ XMP_Uns16 fullOrientation, tnailOrientation;
+ /// Raw image data from the host file, valid for life of the owning \c XMPFiles object. Do not modify!
+ const XMP_Uns8 * tnailImage;
+ /// The size in bytes of the thumbnail image data.
+ XMP_Uns32 tnailSize;
+ /// The format of the thumbnail image data.
+ XMP_Uns8 tnailFormat;
+
+ /// Padding to make the struct's size be a multiple 4.
+ XMP_Uns8 pad1, pad2, pad3;
-#define kXMPFiles_UnknownOffset ((XMP_Int64)-1)
-#define kXMPFiles_UnknownLength ((XMP_Int32)-1)
+ /// Default constructor.
+ XMP_ThumbnailInfo() : fileFormat(kXMP_UnknownFile), fullWidth(0), fullHeight(0),
+ tnailWidth(0), tnailHeight(0), fullOrientation(0), tnailOrientation(0),
+ tnailImage(0), tnailSize(0), tnailFormat(kXMP_UnknownTNail) {};
-enum { /* Options for Initialize. */
- kXMPFiles_NoQuickTimeInit = 0x0001 /* Don't initialize QuickTime, the client will. */
};
-enum { /* Options for GetFormatInfo. */
- kXMPFiles_CanInjectXMP = 0x00000001, /* Can inject first-time XMP into an existing file. */
- kXMPFiles_CanExpand = 0x00000002, /* Can expand XMP or other metadata in an existing file. */
- kXMPFiles_CanRewrite = 0x00000004, /* Can copy one file to another, writing new metadata. */
- kXMPFiles_PrefersInPlace = 0x00000008, /* Can expand, but prefers in-place update. */
- kXMPFiles_CanReconcile = 0x00000010, /* Supports reconciliation between XMP and other forms. */
- kXMPFiles_AllowsOnlyXMP = 0x00000020, /* Allows access to just the XMP, ignoring other forms. */
- kXMPFiles_ReturnsRawPacket = 0x00000040, /* File handler returns raw XMP packet information. */
- kXMPFiles_ReturnsTNail = 0x00000080, /* File handler returns native thumbnail. */
- kXMPFiles_HandlerOwnsFile = 0x00000100, /* The file handler does the file open and close. */
- kXMPFiles_AllowsSafeUpdate = 0x00000200, /* The file handler allows crash-safe file updates. */
- kXMPFiles_NeedsReadOnlyPacket = 0x00000400, /* The file format needs the XMP packet to be read-only. */
- kXMPFiles_UsesSidecarXMP = 0x00000800 /* The file handler uses a "sidecar" file for the XMP. */
+/// Version of the XMP_ThumbnailInfo type
+enum {
+ /// Version of the XMP_ThumbnailInfo type
+ kXMP_ThumbnailInfoVersion = 1
};
-enum { /* Options for OpenFile. */
- kXMPFiles_OpenForRead = 0x00000001, /* Open for read-only access. */
- kXMPFiles_OpenForUpdate = 0x00000002, /* Open for reading and writing. */
- kXMPFiles_OpenOnlyXMP = 0x00000004, /* Only the XMP is wanted, allows space/time optimizations. */
- kXMPFiles_OpenCacheTNail = 0x00000008, /* Cache thumbnail if possible, GetThumbnail will be called. */
- kXMPFiles_OpenStrictly = 0x00000010, /* Be strict about locating XMP and reconciling with other forms. */
- kXMPFiles_OpenUseSmartHandler = 0x00000020, /* Require the use of a smart handler. */
- kXMPFiles_OpenUsePacketScanning = 0x00000040, /* Force packet scanning, don't use a smart handler. */
- kXMPFiles_OpenLimitedScanning = 0x00000080, /* Only packet scan files "known" to need scanning. */
- kXMPFiles_OpenInBackground = 0x10000000 /* Set if calling from background thread. */
+// -------------------------------------------------------------------------------------------------
+
+/// Option bit flags for \c TXMPFiles::Initialize().
+enum {
+ /// Do not initialize QuickTime, the client will.
+ kXMPFiles_NoQuickTimeInit = 0x0001
};
-/* A note about kXMPFiles_OpenInBackground. The XMPFiles handler for .mov files currently uses */
-/* QuickTime. On Macintosh, calls to Enter/ExitMovies versus Enter/ExitMoviesOnThread must be made. */
-/* This option is used to signal background use so that the .mov handler can behave appropriately. */
+/// Option bit flags for \c TXMPFiles::GetFormatInfo().
+enum {
+
+ /// Can inject first-time XMP into an existing file.
+ kXMPFiles_CanInjectXMP = 0x00000001,
+
+ /// Can expand XMP or other metadata in an existing file.
+ kXMPFiles_CanExpand = 0x00000002,
+
+ /// Can copy one file to another, writing new metadata.
+ kXMPFiles_CanRewrite = 0x00000004,
+
+ /// Can expand, but prefers in-place update.
+ kXMPFiles_PrefersInPlace = 0x00000008,
+
+ /// Supports reconciliation between XMP and other forms.
+ kXMPFiles_CanReconcile = 0x00000010,
+
+ /// Allows access to just the XMP, ignoring other forms.
+ kXMPFiles_AllowsOnlyXMP = 0x00000020,
+
+ /// File handler returns raw XMP packet information.
+ kXMPFiles_ReturnsRawPacket = 0x00000040,
+
+ /// File handler returns native thumbnail.
+ kXMPFiles_ReturnsTNail = 0x00000080,
+
+ /// The file handler does the file open and close.
+ kXMPFiles_HandlerOwnsFile = 0x00000100,
+
+ /// The file handler allows crash-safe file updates.
+ kXMPFiles_AllowsSafeUpdate = 0x00000200,
+
+ /// The file format needs the XMP packet to be read-only.
+ kXMPFiles_NeedsReadOnlyPacket = 0x00000400,
+
+ /// The file handler uses a "sidecar" file for the XMP.
+ kXMPFiles_UsesSidecarXMP = 0x00000800,
+
+ /// The format is folder oriented, for example the P2 video format.
+ kXMPFiles_FolderBasedFormat = 0x00001000
-enum { /* Options for CloseFile. */
- kXMPFiles_UpdateSafely = 0x0001 /* Write into a temporary file and swap for crash safety. */
};
-/* ============================================================================================== */
-/* Exception codes */
-/* =============== */
-
-/**
- * \name Exception codes.
- * @{
- * XMP tookit errors result in throwing an \c XMP_Error exception. Any exception thrown within the
- * XMP toolkit is caught in the toolkit and rethrown as an \c XMP_Error. The \c XMP_Error struct
- * contains a numeric code and an English explanation. New numeric codes may be added at any time.
- * There are typically many possible explanations for each numeric code. The explanations try to
- * be precise about the specific circumstances causing the error.
- *
- * \note The explanation string is for debugging use only. It must not be shown to users in a
- * final product. It is written for developers not users, and never localized.
- */
-
-#if ! __cplusplus
-
- typedef struct XMP_Error {
- XMP_Int32 id;
- XMP_StringPtr errMsg;
- } XMP_Error;
+/// Option bit flags for \c TXMPFiles::OpenFile().
+enum {
-#else
+ /// Open for read-only access.
+ kXMPFiles_OpenForRead = 0x00000001,
- class XMP_Error {
- public:
- XMP_Error ( XMP_Int32 _id, XMP_StringPtr _errMsg ) : id(_id), errMsg(_errMsg) {};
- inline XMP_Int32 GetID() const { return id; };
- inline XMP_StringPtr GetErrMsg() const { return errMsg; };
- private:
- XMP_Int32 id;
- XMP_StringPtr errMsg;
- };
+ /// Open for reading and writing.
+ kXMPFiles_OpenForUpdate = 0x00000002,
-#endif
+ /// Only the XMP is wanted, allows space/time optimizations.
+ kXMPFiles_OpenOnlyXMP = 0x00000004,
+
+ /// Cache thumbnail if possible, \c TXMPFiles::GetThumbnail() will be called.
+ kXMPFiles_OpenCacheTNail = 0x00000008,
+
+ /// Be strict about locating XMP and reconciling with other forms.
+ kXMPFiles_OpenStrictly = 0x00000010,
+ /// Require the use of a smart handler.
+ kXMPFiles_OpenUseSmartHandler = 0x00000020,
+
+ /// Force packet scanning, do not use a smart handler.
+ kXMPFiles_OpenUsePacketScanning = 0x00000040,
+
+ /// Only packet scan files "known" to need scanning.
+ kXMPFiles_OpenLimitedScanning = 0x00000080,
+
+ /// Attempt to repair a file opened for update, default is to not open (throw an exception).
+ kXMPFiles_OpenRepairFile = 0x00000100,
+
+ /// Set if calling from background thread.
+ kXMPFiles_OpenInBackground = 0x10000000
+
+};
+
+// A note about kXMPFiles_OpenInBackground. The XMPFiles handler for .mov files currently uses
+// QuickTime. On Macintosh, calls to Enter/ExitMovies versus Enter/ExitMoviesOnThread must be made.
+// This option is used to signal background use so that the .mov handler can behave appropriately.
+
+/// Option bit flags for \c TXMPFiles::CloseFile().
enum {
+ /// Write into a temporary file and swap for crash safety.
+ kXMPFiles_UpdateSafely = 0x0001
+};
+
+// =================================================================================================
+// Exception codes
+// ===============
+
+/// \name Errors Exception handling
+/// @{
+///
+/// XMP Tookit errors result in throwing an \c XMP_Error exception. Any exception thrown within the
+/// XMP Toolkit is caught in the toolkit and rethrown as an \c XMP_Error.
+///
+/// The \c XMP_Error class contains a numeric code and an English explanation. New numeric codes may
+/// be added at any time. There are typically many possible explanations for each numeric code. The
+/// explanations try to be precise about the specific circumstances causing the error.
+///
+/// \note The explanation string is for debugging use only. It must not be shown to users in a
+/// final product. It is written for developers not users, and never localized.
+///
+
+/// XMP Toolkit error, associates an error code with a descriptive error string.
+class XMP_Error {
+public:
+
+ /// @brief Constructor for an XMP_Error.
+ ///
+ /// @param _id The numeric code.
+ ///
+ /// @param _errMsg The descriptive string, for debugging use only. It must not be shown to users
+ /// in a final product. It is written for developers, not users, and never localized.
+ XMP_Error ( XMP_Int32 _id, XMP_StringPtr _errMsg ) : id(_id), errMsg(_errMsg) {};
+
+ /// Retrieves the numeric code from an XMP_Error.
+ inline XMP_Int32 GetID() const { return id; };
+
+ /// Retrieves the descriptive string from an XMP_Error.
+ inline XMP_StringPtr GetErrMsg() const { return errMsg; };
+
+private:
+ /// Exception code. See constants \c #kXMPErr_Unknown and following.
+ XMP_Int32 id;
+ /// Descriptive string, for debugging use only. It must not be shown to users in a final
+ /// product. It is written for developers, not users, and never localized.
+ XMP_StringPtr errMsg;
+};
- /* More or less generic error codes. */
+/// Exception code constants
+enum {
+
+ // --------------------
+ // Generic error codes.
+
+ /// Generic unknown error
kXMPErr_Unknown = 0,
+ /// Generic undefined error
kXMPErr_TBD = 1,
+ /// Generic unavailable error
kXMPErr_Unavailable = 2,
+ /// Generic bad object error
kXMPErr_BadObject = 3,
+ /// Generic bad parameter error
kXMPErr_BadParam = 4,
+ /// Generic bad value error
kXMPErr_BadValue = 5,
+ /// Generic assertion failure
kXMPErr_AssertFailure = 6,
+ /// Generic enforcement failure
kXMPErr_EnforceFailure = 7,
+ /// Generic unimplemented error
kXMPErr_Unimplemented = 8,
+ /// Generic internal failure
kXMPErr_InternalFailure = 9,
+ /// Generic deprecated error
kXMPErr_Deprecated = 10,
+ /// Generic external failure
kXMPErr_ExternalFailure = 11,
+ /// Generic user abort error
kXMPErr_UserAbort = 12,
+ /// Generic standard exception
kXMPErr_StdException = 13,
+ /// Generic unknown exception
kXMPErr_UnknownException = 14,
+ /// Generic out-of-memory error
kXMPErr_NoMemory = 15,
- /* More specific parameter error codes. */
+ // ------------------------------------
+ // More specific parameter error codes.
+
+ /// Bad schema parameter
kXMPErr_BadSchema = 101,
+ /// Bad XPath parameter
kXMPErr_BadXPath = 102,
+ /// Bad options parameter
kXMPErr_BadOptions = 103,
+ /// Bad index parameter
kXMPErr_BadIndex = 104,
+ /// Bad iteration position
kXMPErr_BadIterPosition = 105,
+ /// XML parsing error
kXMPErr_BadParse = 106,
+ /// Serialization error
kXMPErr_BadSerialize = 107,
+ /// File format error
kXMPErr_BadFileFormat = 108,
+ /// No file handler found for format
kXMPErr_NoFileHandler = 109,
+ /// Data too large for JPEG file format
kXMPErr_TooLargeForJPEG = 110,
- /* File format and internal structure error codes. */
+ // -----------------------------------------------
+ // File format and internal structure error codes.
+
+ /// XML format error
kXMPErr_BadXML = 201,
+ /// RDF format error
kXMPErr_BadRDF = 202,
+ /// XMP format error
kXMPErr_BadXMP = 203,
+ /// Empty iterator
kXMPErr_EmptyIterator = 204,
+ /// Unicode error
kXMPErr_BadUnicode = 205,
+ /// TIFF format error
kXMPErr_BadTIFF = 206,
+ /// JPEG format error
kXMPErr_BadJPEG = 207,
+ /// PSD format error
kXMPErr_BadPSD = 208,
+ /// PSIR format error
kXMPErr_BadPSIR = 209,
+ /// IPTC format error
kXMPErr_BadIPTC = 210,
+ /// MPEG format error
kXMPErr_BadMPEG = 211
};
-/**
- * @}
- */
-
-
-/* ============================================================================================== */
-/* Client callbacks */
-/* ================ */
-
+/// @}
-/**
- * \name Special purpose callback functions
- * @{
- */
+// =================================================================================================
+// Client callbacks
+// ================
-/**
- * \typedef XMP_Status
- * \brief A signed 32 bit integer used as a status result for the output callback routine.
- * Zero means no error, all other values except -1 are private to the callback. The callback is
- * wrapped to prevent exceptions being thrown across DLL boundaries. Any exceptions thrown out
- * of the callback cause a return status of -1.
- */
+// -------------------------------------------------------------------------------------------------
+/// \name Special purpose callback functions
+/// @{
-/**
- * \typedef XMP_TextOutputProc
- * \brief Direct text output from the XMP toolkit, such as debugging dumps, is done using client
- * supplied callbacks. The callback is invoked one or more times for each line of output. The
- * end of a line is signaled by a '\n' character at the end of the buffer. Formatting newlines
- * are never present in the middle of a buffer, but values of properties might contain any UTF-8
- * characters. A success/fail status is returned by the callback. Any failure result aborts
- * the output.
- */
+/// A signed 32-bit integer used as a status result for the output callback routine,
+/// \c XMP_TextOutputProc. Zero means no error, all other values except -1 are private to the callback.
+/// The callback is wrapped to prevent exceptions being thrown across DLL boundaries. Any exceptions
+/// thrown out of the callback cause a return status of -1.
typedef XMP_Int32 XMP_Status;
+// -------------------------------------------------------------------------------------------------
+/// The signature of a client-defined callback for text output from XMP Toolkit debugging
+/// operations. The callback is invoked one or more times for each line of output. The end of a line
+/// is signaled by a '\\n' character at the end of the buffer. Formatting newlines are never present
+/// in the middle of a buffer, but values of properties might contain any UTF-8 characters.
+///
+/// @param refCon A pointer to client-defined data passed to the TextOutputProc.
+///
+/// @param buffer A string containing one line of output.
+///
+/// @param bufferSize The number of characters in the output buffer.
+///
+/// @return A success/fail status value. Any failure result aborts the output.
+///
+/// @see \c TXMPMeta::DumpObject()
+
typedef XMP_Status (* XMP_TextOutputProc) ( void * refCon,
XMP_StringPtr buffer,
XMP_StringLen bufferSize );
-/**
- * @}
- */
+// -------------------------------------------------------------------------------------------------
+/// The signature of a client-defined callback to check for a user request to abort a time-consuming
+/// operation within XMPFiles.
+///
+/// @param arg A pointer to caller-defined data passed from the registration call.
+///
+/// @return True to abort the current operation, which results in an exception being thrown.
+///
+/// @see \c TXMPFiles::SetAbortProc()
+
+typedef bool (* XMP_AbortProc) ( void * arg ); // Used by .
+/// @}
-/* ============================================================================================== */
-/* Stuff with no better place to be */
-/* ================================ */
+// =================================================================================================
+// Stuff with no better place to be
+// ================================
+/// XMP Toolkit version information
typedef struct XMP_VersionInfo {
- XMP_Uns8 major; /* The primary release number, the "1" in version "1.2.3". */
- XMP_Uns8 minor; /* The secondary release number, the "2" in version "1.2.3". */
- XMP_Uns8 micro; /* The tertiary release number, the "3" in version "1.2.3". */
- XMP_Bool isDebug; /* Really a 0/1 bool value. True if this is a debug build. */
- XMP_Uns32 build; /* A rolling build number, monotonically increasing in a release. */
- XMP_Uns32 flags; /* Individual feature implementation flags. */
- XMP_StringPtr message; /* A comprehensive version information string. */
+ /// The primary release number, the "1" in version "1.2.3".
+ XMP_Uns8 major;
+ /// The secondary release number, the "2" in version "1.2.3".
+ XMP_Uns8 minor;
+ /// The tertiary release number, the "3" in version "1.2.3".
+ XMP_Uns8 micro;
+ /// A 0/1 boolean value, true if this is a debug build.
+ XMP_Bool isDebug;
+ /// A rolling build number, monotonically increasing in a release.
+ XMP_Uns32 build;
+ /// Individual feature implementation flags.
+ XMP_Uns32 flags;
+ /// A comprehensive version information string.
+ XMP_StringPtr message;
} XMP_VersionInfo;
-typedef bool (* XMP_AbortProc) ( void * arg ); /* Used by SXMPFiles::SetAbortProc. */
-
-/* ============================================================================================== */
+// =================================================================================================
#if __cplusplus
-} /* extern "C" */
+} // extern "C"
#endif
-#endif /* __XMP_Const_h__ */
+#endif // __XMP_Const_h__
diff --git a/public/include/XMP_Environment.h b/public/include/XMP_Environment.h
index f25676e..8a77e2c 100644
--- a/public/include/XMP_Environment.h
+++ b/public/include/XMP_Environment.h
@@ -1,11 +1,6 @@
#ifndef __XMP_Environment_h__
#define __XMP_Environment_h__ 1
-/* --------------------------------------------------------------------------------------------- */
-/* ** IMPORTANT ** This file must be usable by strict ANSI C compilers. No "//" comments, etc. */
-/* --------------------------------------------------------------------------------------------- */
-
-/*
// =================================================================================================
// XMP_Environment.h - Build environment flags for the XMP toolkit.
// ================================================================
@@ -14,9 +9,7 @@
// It must be the first #include in any chain since it might affect things in other #includes.
//
// =================================================================================================
-*/
-/*
// =================================================================================================
// Copyright 2002-2007 Adobe Systems Incorporated
// All Rights Reserved.
@@ -24,22 +17,21 @@
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
// of the Adobe license agreement accompanying it.
// =================================================================================================
-*/
-/* ============================================================================================== */
-/* Determine the Platform */
-/* ====================== */
+// =================================================================================================
+// Determine the Platform
+// ======================
-/* One of MAC_ENV, WIN_ENV, or UNIX_ENV must be defined by the client. Since some other code */
-/* requires these to be defined without values, they are only used here to define XMP-specific */
-/* macros with 0 or 1 values. */
+// One of MAC_ENV, WIN_ENV, or UNIX_ENV must be defined by the client. Since some other code
+// requires these to be defined without values, they are only used here to define XMP-specific
+// macros with 0 or 1 values.
-/* ! Tempting though it might be to have a standard macro for big or little endian, there seems */
-/* ! to be no decent way to do that on our own in UNIX. Forcing it on the client isn't acceptable. */
+// ! Tempting though it might be to have a standard macro for big or little endian, there seems to
+// ! be no decent way to do that on our own in UNIX. Forcing it on the client isn't acceptable.
#if defined ( MAC_ENV )
- #if 0 /* ! maybe someday - ! MAC_ENV */
+ #if 0 // ! maybe someday - ! MAC_ENV
#error "MAC_ENV must be defined so that \"#if MAC_ENV\" is true"
#endif
@@ -53,7 +45,7 @@
#elif defined ( WIN_ENV )
- #if 0 /* ! maybe someday - ! WIN_ENV */
+ #if 0 // ! maybe someday - ! WIN_ENV
#error "WIN_ENV must be defined so that \"#if WIN_ENV\" is true"
#endif
@@ -67,7 +59,7 @@
#elif defined ( UNIX_ENV )
- #if 0 /* ! maybe someday - ! UNIX_ENV */
+ #if 0 // ! maybe someday - ! UNIX_ENV
#error "UNIX_ENV must be defined so that \"#if UNIX_ENV\" is true"
#endif
@@ -81,9 +73,9 @@
#endif
-/* ============================================================================================== */
-/* Common Macros */
-/* ============= */
+// =================================================================================================
+// Common Macros
+// =============
#if defined ( DEBUG )
#if defined ( NDEBUG )
@@ -101,21 +93,29 @@
#endif
#if XMP_DebugBuild
- #include <stdio.h> /* The assert macro needs printf. */
+ #include <stdio.h> // The assert macro needs printf.
+#endif
+
+#ifndef XMP_64
+ #if _WIN64
+ #define XMP_64 1
+ #else
+ #define XMP_64 0
+ #endif
#endif
-/* ============================================================================================== */
-/* Macintosh Specific Settings */
-/* =========================== */
+// =================================================================================================
+// Macintosh Specific Settings
+// ===========================
-/* ============================================================================================== */
-/* Windows Specific Settings */
-/* ========================= */
+// =================================================================================================
+// Windows Specific Settings
+// =========================
-/* ============================================================================================== */
-/* UNIX Specific Settings */
-/* ====================== */
+// =================================================================================================
+// UNIX Specific Settings
+// ======================
-/* ============================================================================================== */
+// =================================================================================================
-#endif /* __XMP_Environment_h__ */
+#endif // __XMP_Environment_h__
diff --git a/public/include/XMP_Version.h b/public/include/XMP_Version.h
index ed41d14..0c842d0 100644
--- a/public/include/XMP_Version.h
+++ b/public/include/XMP_Version.h
@@ -7,7 +7,7 @@
/*
// =================================================================================================
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -34,11 +34,11 @@ versions.
/* ============================================================================================= */
#define XMP_API_VERSION_MAJOR 4
-#define XMP_API_VERSION_MINOR 1
-#define XMP_API_VERSION_MICRO 1
+#define XMP_API_VERSION_MINOR 4
+#define XMP_API_VERSION_MICRO 0
-#define XMP_API_VERSION 4.1
-#define XMP_API_VERSION_STRING "4.1.1"
+#define XMP_API_VERSION 4.4
+#define XMP_API_VERSION_STRING "4.4.0"
/* ============================================================================================= */
diff --git a/public/include/client-glue/TXMPFiles.incl_cpp b/public/include/client-glue/TXMPFiles.incl_cpp
index 83867df..ae8a831 100644
--- a/public/include/client-glue/TXMPFiles.incl_cpp
+++ b/public/include/client-glue/TXMPFiles.incl_cpp
@@ -11,7 +11,7 @@
/// \file TXMPFiles.incl_cpp
/// \brief The implementation of the TXMPFiles template class.
-#if WIN_ENV
+#if XMP_WinBuild
#pragma warning ( disable : 4003 ) // not enough actual parameters for macro
#pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning)
#endif
@@ -203,6 +203,24 @@ GetInternalRef()
// -------------------------------------------------------------------------------------------------
+XMP_MethodIntro(TXMPFiles,XMP_FileFormat)::
+CheckFileFormat ( XMP_StringPtr filePath )
+{
+ WrapCheckFormat ( format, zXMPFiles_CheckFileFormat_1 ( filePath ) );
+ return format;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,XMP_FileFormat)::
+CheckPackageFormat ( XMP_StringPtr folderPath )
+{
+ WrapCheckFormat ( format, zXMPFiles_CheckPackageFormat_1 ( folderPath ) );
+ return format;
+}
+
+// -------------------------------------------------------------------------------------------------
+
XMP_MethodIntro(TXMPFiles,bool)::
OpenFile ( XMP_StringPtr filePath,
XMP_FileFormat format /* = kXMP_UnknownFile */,
@@ -314,7 +332,7 @@ PutXMP ( XMP_StringPtr xmpPacket,
XMP_MethodIntro(TXMPFiles,void)::
PutXMP ( const tStringObj & xmpPacket )
{
- this->PutXMP ( xmpPacket.c_str(), xmpPacket.size() );
+ this->PutXMP ( xmpPacket.c_str(), (XMP_StringLen)xmpPacket.size() );
}
// -------------------------------------------------------------------------------------------------
@@ -341,7 +359,7 @@ CanPutXMP ( XMP_StringPtr xmpPacket,
XMP_MethodIntro(TXMPFiles,bool)::
CanPutXMP ( const tStringObj & xmpPacket )
{
- return this->CanPutXMP ( xmpPacket.c_str(), xmpPacket.size() );
+ return this->CanPutXMP ( xmpPacket.c_str(), (XMP_StringLen)xmpPacket.size() );
}
// =================================================================================================
diff --git a/public/include/client-glue/TXMPMeta.incl_cpp b/public/include/client-glue/TXMPMeta.incl_cpp
index 60bd8e7..624198b 100644
--- a/public/include/client-glue/TXMPMeta.incl_cpp
+++ b/public/include/client-glue/TXMPMeta.incl_cpp
@@ -1,6 +1,6 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -37,8 +37,6 @@
#endif
// =================================================================================================
-
-// =================================================================================================
// Local utilities
// ===============
@@ -857,6 +855,22 @@ SetObjectOptions ( XMP_OptionBits options )
// -------------------------------------------------------------------------------------------------
+XMP_MethodIntro(TXMPMeta,void)::
+Sort()
+{
+ WrapCheckVoid ( zXMPMeta_Sort_1() );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+Erase()
+{
+ WrapCheckVoid ( zXMPMeta_Erase_1() );
+}
+
+// -------------------------------------------------------------------------------------------------
+
XMP_MethodIntro(TXMPMeta,TXMPMeta<tStringObj>)::
Clone ( XMP_OptionBits options ) const
{
diff --git a/public/include/client-glue/TXMPUtils.incl_cpp b/public/include/client-glue/TXMPUtils.incl_cpp
index 761ac4e..2ab5745 100644
--- a/public/include/client-glue/TXMPUtils.incl_cpp
+++ b/public/include/client-glue/TXMPUtils.incl_cpp
@@ -1,6 +1,6 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -489,3 +489,5 @@ DuplicateSubtree ( const TXMPMeta<tStringObj> & source,
}
// =================================================================================================
+
+// =================================================================================================
diff --git a/public/include/client-glue/WXMPFiles.hpp b/public/include/client-glue/WXMPFiles.hpp
index 556ad54..cdc510c 100644
--- a/public/include/client-glue/WXMPFiles.hpp
+++ b/public/include/client-glue/WXMPFiles.hpp
@@ -52,6 +52,12 @@ extern "C" {
#define zXMPFiles_GetFormatInfo_1(format,flags) \
WXMPFiles_GetFormatInfo_1 ( format, flags, &wResult )
+#define zXMPFiles_CheckFileFormat_1(filePath) \
+ WXMPFiles_CheckFileFormat_1 ( filePath, &wResult )
+
+#define zXMPFiles_CheckPackageFormat_1(folderPath) \
+ WXMPFiles_CheckPackageFormat_1 ( folderPath, &wResult )
+
#define zXMPFiles_OpenFile_1(filePath,format,openFlags) \
WXMPFiles_OpenFile_1 ( this->xmpFilesRef, filePath, format, openFlags, &wResult )
@@ -100,6 +106,12 @@ extern void WXMPFiles_GetFormatInfo_1 ( XMP_FileFormat format,
XMP_OptionBits * flags, // ! Can be null.
WXMP_Result * result );
+extern void WXMPFiles_CheckFileFormat_1 ( XMP_StringPtr filePath,
+ WXMP_Result * result );
+
+extern void WXMPFiles_CheckPackageFormat_1 ( XMP_StringPtr folderPath,
+ WXMP_Result * result );
+
extern void WXMPFiles_OpenFile_1 ( XMPFilesRef xmpFilesRef,
XMP_StringPtr filePath,
XMP_FileFormat format,
diff --git a/public/include/client-glue/WXMPMeta.hpp b/public/include/client-glue/WXMPMeta.hpp
index 608da15..38eb5db 100644
--- a/public/include/client-glue/WXMPMeta.hpp
+++ b/public/include/client-glue/WXMPMeta.hpp
@@ -2,7 +2,7 @@
#define __WXMPMeta_hpp__ 1
// =================================================================================================
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -162,6 +162,12 @@ extern "C" {
#define zXMPMeta_SetObjectOptions_1(options) \
WXMPMeta_SetObjectOptions_1 ( this->xmpRef, options, &wResult )
+#define zXMPMeta_Sort_1() \
+ WXMPMeta_Sort_1 ( this->xmpRef, &wResult )
+
+#define zXMPMeta_Erase_1() \
+ WXMPMeta_Erase_1 ( this->xmpRef, &wResult )
+
#define zXMPMeta_Clone_1(options) \
WXMPMeta_Clone_1 ( this->xmpRef, options, &wResult )
@@ -565,6 +571,14 @@ WXMPMeta_SetObjectOptions_1 ( XMPMetaRef xmpRef,
WXMP_Result * wResult );
extern void
+WXMPMeta_Sort_1 ( XMPMetaRef xmpRef,
+ WXMP_Result * wResult );
+
+extern void
+WXMPMeta_Erase_1 ( XMPMetaRef xmpRef,
+ WXMP_Result * wResult );
+
+extern void
WXMPMeta_Clone_1 ( XMPMetaRef xmpRef,
XMP_OptionBits options,
WXMP_Result * wResult ) /* const */ ;
diff --git a/public/include/client-glue/WXMPUtils.hpp b/public/include/client-glue/WXMPUtils.hpp
index fa82f7d..55890fc 100644
--- a/public/include/client-glue/WXMPUtils.hpp
+++ b/public/include/client-glue/WXMPUtils.hpp
@@ -2,7 +2,7 @@
#define __WXMPUtils_hpp__ 1
// =================================================================================================
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
diff --git a/public/include/client-glue/WXMP_Common.hpp b/public/include/client-glue/WXMP_Common.hpp
index b21e67e..4d6eaab 100644
--- a/public/include/client-glue/WXMP_Common.hpp
+++ b/public/include/client-glue/WXMP_Common.hpp
@@ -33,12 +33,13 @@ struct WXMP_Result {
extern "C" {
#endif
+#define PropagateException(res) \
+ if ( res.errMessage != 0 ) throw XMP_Error ( res.int32Result, res.errMessage );
+
#ifndef TraceXMPCalls
#define TraceXMPCalls 0
#endif
- #define PropagateException(res) \
- if ( res.errMessage != 0 ) throw XMP_Error ( res.int32Result, res.errMessage );
#if ! TraceXMPCalls
#define InvokeCheck(WCallProto) \
WXMP_Result wResult; \
@@ -73,10 +74,18 @@ extern "C" {
InvokeCheck(WCallProto); \
XMPIteratorRef result = XMPIteratorRef(wResult.ptrResult)
+#define WrapCheckDocOpsRef(result,WCallProto) \
+ InvokeCheck(WCallProto); \
+ XMPDocOpsRef result = XMPDocOpsRef(wResult.ptrResult)
+
#define WrapCheckBool(result,WCallProto) \
InvokeCheck(WCallProto); \
bool result = bool(wResult.int32Result)
+#define WrapCheckTriState(result,WCallProto) \
+ InvokeCheck(WCallProto); \
+ XMP_TriState result = XMP_TriState(wResult.int32Result)
+
#define WrapCheckOptions(result,WCallProto) \
InvokeCheck(WCallProto); \
XMP_OptionBits result = XMP_OptionBits(wResult.int32Result)
@@ -101,6 +110,10 @@ extern "C" {
InvokeCheck(WCallProto); \
double result = wResult.floatResult
+#define WrapCheckFormat(result,WCallProto) \
+ InvokeCheck(WCallProto); \
+ XMP_FileFormat result = wResult.int32Result
+
// =================================================================================================
#if __cplusplus
diff --git a/samples/build/gcc/XMPSamples.mak b/samples/build/gcc3.2/XMPSamples.mak
index e1aaf0f..d4ca09b 100644
--- a/samples/build/gcc/XMPSamples.mak
+++ b/samples/build/gcc3.2/XMPSamples.mak
@@ -1,12 +1,11 @@
-# ==================================================================================================
-# Copyright 2002-2004 Adobe Systems Incorporated
+# ##########################################################################################
+# Copyright 2008 Adobe Systems Incorporated
# All Rights Reserved.
#
-# NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
-# of the Adobe license agreement accompanying it.
-# ==================================================================================================
-
-# ==================================================================================================
+# NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with
+# the terms of the Adobe license agreement accompanying it.
+#
+# ##########################################################################################
# Define internal use variables.
@@ -22,6 +21,11 @@ ifeq "${Sample}" ""
Error += The sample name must be provided
endif
+# case tolerance
+ifeq "${Sample}" "dumpfile"
+ Sample = dumpfile/main
+endif
+
TargetOS = ${OS}
ifeq "${TargetOS}" ""
@@ -78,11 +82,12 @@ BuildRoot = ../..
TargetRoot = ${BuildRoot}/target/${TargetOS}/${TargetStage}
TempRoot = ${BuildRoot}/intermediate/${TargetOS}/${TargetStage}
+# NB: this is SDKRoot to be exakt
XMPRoot = ${BuildRoot}/..
LibXMP = ${XMPRoot}/public/libraries/${TargetOS}/${TargetStage}/libXMPCore${LibSuffix}.a
-# ==================================================================================================
+################################################################################################
CC = gcc
CPP = gcc -x c++
@@ -96,29 +101,42 @@ LDLibs = ${LibXMP} -Xlinker -R -Xlinker .
LDLibs += -lc -lm -lpthread -lstdc++
ifeq "${TargetOS}" "i80386linux"
- CFlags += -mcpu=i686
+ CPPFlags += -D__LITTLE_ENDIAN__=1
LDLibs += -lgcc_eh
endif
ifeq "${TargetOS}" "sparcsolaris"
- CFlags += -mtune=ultrasparc
+ CPPFlags += -mtune=ultrasparc -D__BIG_ENDIAN__=1
endif
ifeq "${TargetStage}" "debug"
- CFlags += -g -O0 -DDEBUG=1 -D_DEBUG=1
+ CPPFlags += -g -O0 -DDEBUG=1 -D_DEBUG=1
endif
ifeq "${TargetStage}" "release"
- CFlags += -O2 -Os -DNDEBUG=1
+ CPPFlags += -O2 -Os -DNDEBUG=1
endif
-# ==================================================================================================
+################################################################################################
vpath %.cpp\
- ${BuildRoot}/source:
+ ${BuildRoot}/source: \
+ ${BuildRoot}/source/common:\
+ ${XMPRoot}/source/common:
Includes = \
- -I${XMPRoot}/public/include
-
-# ==================================================================================================
+ -I${XMPRoot}/public/include \
+ -I${XMPRoot}/samples/source/common \
+ -I${XMPRoot}/source/common
+
+DumfileCommonObj = \
+ ${TempRoot}/QELog.o \
+ ${TempRoot}/QETagTree.o \
+ ${TempRoot}/QEMemLeak.o \
+ ${TempRoot}/QEDumpFile.o \
+ ${TempRoot}/QEBuginese.o \
+ ${TempRoot}/LargeFileAccess.o \
+ ${TempRoot}/QEScanner.o
+
+################################################################################################
${TempRoot}/%.o : %.c
@echo ""
@@ -130,12 +148,19 @@ ${TempRoot}/%.o : %.cpp
@echo "Compiling $<"
${CPP} ${CPPFlags} ${Includes} -c $< -o $@
-${TargetRoot}/% : ${TempRoot}/%.o ${TempRoot}/XMPScanner.o
+ifeq "${Sample}" "dumpfile/main"
+${TargetRoot}/% :${TempRoot}/%.o ${DumfileCommonObj}
@echo ""
+ @echo "Linking ${TargetRoot}/dumpfile"
+ ${LD} ${LDFlags} $< ${DumfileCommonObj} ${LDLibs} -o ${TargetRoot}/dumpfile
+else
+${TargetRoot}/% :${TempRoot}/%.o ${TempRoot}/XMPScanner.o
@echo "Linking $@"
${LD} ${LDFlags} $< ${TempRoot}/XMPScanner.o ${LDLibs} -o $@
+endif
+
-# ==================================================================================================
+################################################################################################
Sample : Sample_ann msg create_dirs ${TargetRoot}/${Sample}
@echo ""
@@ -145,7 +170,6 @@ ifeq "${Error}" ""
@echo ""
@echo Building XMP sample ${Sample} for ${TargetOS} ${TargetStage}
endif
- rm -f ${TargetRoot}/${Sample}
msg :
ifneq "${Error}" ""
@@ -158,11 +182,11 @@ ifneq "${Error}" ""
@echo "# os = i80386linux | sparcsolaris"
@echo "# stage = debug | release"
@echo "#"
- @echo "# The name argument is the "simple name" of the sample, e.g."
- @echo "# XMPCoverage or DumpXMP."
+
+ @echo "# The name argument is the "simple name" of the sample:"
+ @echo "# XMPCoreCoverage, CustomSchema or DumpScannedXMP."
@echo "#"
- @echo "# The os and stage arguments can also be uppercase, OS and STAGE."
- @echo "# If the OS is omitted it will try to default from the OSTYPE and"
+ @echo "# If the os is omitted it will try to default from the OSTYPE and"
@echo "# MACHTYPE environment variables. If the stage is omitted it"
@echo "# defaults to debug."
@echo ""
@@ -171,8 +195,16 @@ endif
create_dirs :
mkdir -p ${TempRoot}
+ mkdir -p ${TempRoot}/dumpfile
mkdir -p ${TargetRoot}
-
+
.PHONY : clean
+
clean : msg
- rm -f ${TempRoot}/* ${TargetRoot}/*
+ # just to be extra safe:
+ ifneq "${TempRoot}" ""
+ ifneq "${TargetRoot}" ""
+ rm -rf ${TempRoot}/*
+ endif
+ endif
+
diff --git a/samples/build/vsnet/DumpMainXMP.vcproj b/samples/build/vsnet/DumpMainXMP.vcproj
deleted file mode 100644
index d8e3afd..0000000
--- a/samples/build/vsnet/DumpMainXMP.vcproj
+++ /dev/null
@@ -1,309 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="DumpMainXMP (static)"
- ProjectGUID="{9C52F46F-E90C-4FE9-83C5-A2C194C91B54}"
- RootNamespace="DumpMainXMP"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../target/windows/debug"
- IntermediateDirectory="../../intermediate/windows/debug"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="0"
- BuildLogFile="$(IntDir)\BuildLog.htm"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\source;..\..\..\public\include\"
- PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
- StringPooling="true"
- MinimalRebuild="false"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- BufferSecurityCheck="true"
- DefaultCharIsUnsigned="true"
- UsePrecompiledHeader="0"
- ObjectFile="../../intermediate/windows/debug/"
- ProgramDataBaseFileName="../../intermediate/windows/debug/"
- XMLDocumentationFileName="$(IntDir)\"
- WarningLevel="3"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib"
- OutputFile="$(OutDir)/DumpMainXMP.exe"
- LinkIncremental="1"
- SuppressStartupBanner="true"
- AdditionalLibraryDirectories="../../../public/libraries/windows/debug/"
- GenerateDebugInformation="true"
- AssemblyDebug="1"
- ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
- GenerateMapFile="true"
- MapFileName="$(TargetDir)$(TargetName).map"
- SubSystem="0"
- OptimizeReferences="0"
- EnableCOMDATFolding="0"
- TargetMachine="0"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../target/windows/release"
- IntermediateDirectory="../../intermediate/windows/release"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="1"
- InlineFunctionExpansion="2"
- FavorSizeOrSpeed="2"
- AdditionalIncludeDirectories="..\..\source;..\..\..\public\include\"
- PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
- StringPooling="true"
- MinimalRebuild="false"
- BasicRuntimeChecks="0"
- SmallerTypeCheck="false"
- RuntimeLibrary="0"
- DefaultCharIsUnsigned="true"
- ForceConformanceInForLoopScope="true"
- UsePrecompiledHeader="0"
- ObjectFile="../../intermediate/windows/release/"
- ProgramDataBaseFileName="../../intermediate/windows/release/"
- WarningLevel="4"
- WarnAsError="true"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="0"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib"
- OutputFile="$(OutDir)/DumpMainXMP.exe"
- LinkIncremental="1"
- SuppressStartupBanner="true"
- AdditionalLibraryDirectories="../../../public/libraries/windows/release/"
- GenerateDebugInformation="false"
- AssemblyDebug="0"
- ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
- GenerateMapFile="true"
- MapFileName="$(TargetDir)$(TargetName).map"
- SubSystem="0"
- OptimizeReferences="0"
- EnableCOMDATFolding="0"
- TargetMachine="0"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\..\source\DumpMainXMP.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath="..\..\..\..\public\include\TXMPFiles.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\TXMPIterator.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\TXMPMeta.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\TXMPUtils.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\XMP.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\XMP.incl_cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\XMP_Const.h"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\XMP_Environment.h"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\XMP_Version.h"
- >
- </File>
- <Filter
- Name="Client Glue"
- >
- <File
- RelativePath="..\..\..\..\public\include\client-glue\TXMPFiles.incl_cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\client-glue\TXMPIterator.incl_cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\client-glue\TXMPMeta.incl_cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\client-glue\TXMPUtils.incl_cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\client-glue\WXMP_Common.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\client-glue\WXMPFiles.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\client-glue\WXMPIterator.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\client-glue\WXMPMeta.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\client-glue\WXMPUtils.hpp"
- >
- </File>
- </Filter>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/samples/build/vsnet/DumpScannedXMP.vcproj b/samples/build/vsnet/DumpScannedXMP.vcproj
deleted file mode 100644
index 9759e2f..0000000
--- a/samples/build/vsnet/DumpScannedXMP.vcproj
+++ /dev/null
@@ -1,230 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="DumpScannedXMP"
- ProjectGUID="{5E467275-083F-4C6E-8645-EC3CCA70E3DE}"
- RootNamespace="DumpScannedXMP"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../target/windows/debug"
- IntermediateDirectory="../../intermediate/windows/debug"
- ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../../public/include/"
- PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1"
- StringPooling="true"
- MinimalRebuild="false"
- BasicRuntimeChecks="1"
- SmallerTypeCheck="true"
- RuntimeLibrary="1"
- DefaultCharIsUnsigned="true"
- ForceConformanceInForLoopScope="true"
- UsePrecompiledHeader="0"
- ObjectFile="../../intermediate/windows/debug/"
- ProgramDataBaseFileName="../../intermediate/windows/debug/"
- WarningLevel="4"
- WarnAsError="false"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="XMPCoreStaticDebug.lib"
- OutputFile="$(OutDir)/DumpScannedXMP.exe"
- LinkIncremental="1"
- SuppressStartupBanner="true"
- AdditionalLibraryDirectories="../../../public/libraries/windows/debug/"
- GenerateDebugInformation="true"
- AssemblyDebug="1"
- ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
- GenerateMapFile="true"
- MapFileName="$(TargetDir)$(TargetName).map"
- SubSystem="0"
- OptimizeReferences="0"
- EnableCOMDATFolding="0"
- TargetMachine="0"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../target/windows/release"
- IntermediateDirectory="../../intermediate/windows/release"
- ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="1"
- InlineFunctionExpansion="2"
- AdditionalIncludeDirectories="../../../public/include/;"
- PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1"
- StringPooling="true"
- MinimalRebuild="false"
- BasicRuntimeChecks="0"
- SmallerTypeCheck="false"
- RuntimeLibrary="0"
- DefaultCharIsUnsigned="true"
- ForceConformanceInForLoopScope="true"
- UsePrecompiledHeader="0"
- ObjectFile="../../intermediate/windows/release/"
- ProgramDataBaseFileName="../../intermediate/windows/release/"
- WarningLevel="4"
- WarnAsError="true"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="0"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="XMPCoreStaticRelease.lib"
- OutputFile="$(OutDir)/DumpScannedXMP.exe"
- LinkIncremental="1"
- SuppressStartupBanner="true"
- AdditionalLibraryDirectories="../../../public/libraries/windows/release/"
- GenerateDebugInformation="false"
- AssemblyDebug="0"
- ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
- GenerateMapFile="true"
- MapFileName="$(TargetDir)$(TargetName).map"
- SubSystem="0"
- OptimizeReferences="0"
- EnableCOMDATFolding="0"
- TargetMachine="0"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\..\source\DumpScannedXMP.cpp"
- >
- </File>
- <File
- RelativePath="..\..\source\XMPScanner.cpp"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/samples/build/vsnet/XMPCoreCoverage.vcproj b/samples/build/vsnet/XMPCoreCoverage.vcproj
deleted file mode 100644
index b794bd3..0000000
--- a/samples/build/vsnet/XMPCoreCoverage.vcproj
+++ /dev/null
@@ -1,226 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="XMPCoreCoverage"
- ProjectGUID="{6E63FCD8-1D1B-41E6-85CB-79EE9E95E89E}"
- RootNamespace="XMPCoreCoverage"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../target/windows/debug"
- IntermediateDirectory="../../intermediate/windows/debug"
- ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../../public/include/"
- PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1"
- StringPooling="true"
- MinimalRebuild="false"
- BasicRuntimeChecks="1"
- SmallerTypeCheck="true"
- RuntimeLibrary="1"
- DefaultCharIsUnsigned="true"
- ForceConformanceInForLoopScope="true"
- UsePrecompiledHeader="0"
- ObjectFile="../../intermediate/windows/debug/"
- ProgramDataBaseFileName="../../intermediate/windows/debug/"
- WarningLevel="4"
- WarnAsError="false"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="XMPCoreStaticDebug.lib"
- OutputFile="$(OutDir)/XMPCoreCoverage.exe"
- LinkIncremental="1"
- SuppressStartupBanner="true"
- AdditionalLibraryDirectories="../../../public/libraries/windows/debug/"
- GenerateDebugInformation="true"
- AssemblyDebug="1"
- ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
- GenerateMapFile="true"
- MapFileName="$(TargetDir)$(TargetName).map"
- SubSystem="0"
- OptimizeReferences="0"
- EnableCOMDATFolding="0"
- TargetMachine="0"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../target/windows/release"
- IntermediateDirectory="../../intermediate/windows/release"
- ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="1"
- InlineFunctionExpansion="2"
- AdditionalIncludeDirectories="../../../public/include/;"
- PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1"
- StringPooling="true"
- MinimalRebuild="false"
- BasicRuntimeChecks="0"
- SmallerTypeCheck="false"
- RuntimeLibrary="0"
- DefaultCharIsUnsigned="true"
- ForceConformanceInForLoopScope="true"
- UsePrecompiledHeader="0"
- ObjectFile="../../intermediate/windows/release/"
- ProgramDataBaseFileName="../../intermediate/windows/release/"
- WarningLevel="4"
- WarnAsError="true"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="0"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="XMPCoreStaticRelease.lib"
- OutputFile="$(OutDir)/XMPCoreCoverage.exe"
- LinkIncremental="1"
- SuppressStartupBanner="true"
- AdditionalLibraryDirectories="../../../public/libraries/windows/release/"
- GenerateDebugInformation="false"
- AssemblyDebug="0"
- ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
- GenerateMapFile="true"
- MapFileName="$(TargetDir)$(TargetName).map"
- SubSystem="0"
- OptimizeReferences="0"
- EnableCOMDATFolding="0"
- TargetMachine="0"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\..\source\XMPCoreCoverage.cpp"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/samples/build/vsnet/XMPFilesCoverage.vcproj b/samples/build/vsnet/XMPFilesCoverage.vcproj
deleted file mode 100644
index 412f4ef..0000000
--- a/samples/build/vsnet/XMPFilesCoverage.vcproj
+++ /dev/null
@@ -1,319 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="XMPFilesCoverage"
- ProjectGUID="{7179F7FA-1A10-4B1C-9E99-8F8B20E51C7C}"
- RootNamespace="XMPFilesCoverage"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../target/windows/debug"
- IntermediateDirectory="../../intermediate/windows/debug"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="0"
- BuildLogFile="$(IntDir)\BuildLog.htm"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\..\public\include\"
- PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1"
- StringPooling="true"
- MinimalRebuild="false"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- BufferSecurityCheck="true"
- DefaultCharIsUnsigned="true"
- UsePrecompiledHeader="0"
- ObjectFile="../../intermediate/windows/debug/"
- ProgramDataBaseFileName="../../intermediate/windows/debug/"
- XMLDocumentationFileName="$(IntDir)\"
- WarningLevel="3"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib"
- OutputFile="$(OutDir)/XMPFilesCoverage.exe"
- LinkIncremental="1"
- SuppressStartupBanner="true"
- AdditionalLibraryDirectories="../../../public/libraries/windows/debug/"
- GenerateDebugInformation="true"
- AssemblyDebug="1"
- ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
- GenerateMapFile="true"
- MapFileName="$(TargetDir)$(TargetName).map"
- SubSystem="0"
- OptimizeReferences="0"
- EnableCOMDATFolding="0"
- TargetMachine="0"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine="xcopy /d /i /y ..\..\BlueSquares\*.* ..\..\target\windows\debug\BlueSquares&#x0D;&#x0A;attrib -R ..\..\target\windows\debug\BlueSquares\*.*&#x0D;&#x0A;"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../target/windows/release"
- IntermediateDirectory="../../intermediate/windows/release"
- ConfigurationType="1"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="1"
- InlineFunctionExpansion="2"
- FavorSizeOrSpeed="2"
- AdditionalIncludeDirectories="..\..\..\public\include\"
- PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1"
- StringPooling="true"
- MinimalRebuild="false"
- BasicRuntimeChecks="0"
- SmallerTypeCheck="false"
- RuntimeLibrary="0"
- DefaultCharIsUnsigned="true"
- ForceConformanceInForLoopScope="true"
- UsePrecompiledHeader="0"
- ObjectFile="../../intermediate/windows/release/"
- ProgramDataBaseFileName="../../intermediate/windows/release/"
- WarningLevel="4"
- WarnAsError="true"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="0"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib"
- OutputFile="$(OutDir)/XMPFilesCoverage.exe"
- LinkIncremental="1"
- SuppressStartupBanner="true"
- AdditionalLibraryDirectories="../../../public/libraries/windows/release/"
- GenerateDebugInformation="false"
- AssemblyDebug="0"
- ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
- GenerateMapFile="true"
- MapFileName="$(TargetDir)$(TargetName).map"
- SubSystem="0"
- OptimizeReferences="0"
- EnableCOMDATFolding="0"
- TargetMachine="0"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine="xcopy /d /i /y ..\..\BlueSquares\*.* ..\..\target\windows\release\BlueSquares&#x0D;&#x0A;attrib -R ..\..\target\windows\release\BlueSquares\*.*&#x0D;&#x0A;"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\..\source\XMPFilesCoverage.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath="..\..\..\..\public\include\TXMPFiles.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\TXMPIterator.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\TXMPMeta.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\TXMPUtils.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\XMP.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\XMP.incl_cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\XMP_Const.h"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\XMP_Environment.h"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\XMP_Version.h"
- >
- </File>
- <Filter
- Name="Client Glue"
- >
- <File
- RelativePath="..\..\..\..\public\include\client-glue\TXMPFiles.incl_cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\client-glue\TXMPIterator.incl_cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\client-glue\TXMPMeta.incl_cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\client-glue\TXMPUtils.incl_cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\client-glue\WXMP_Common.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\client-glue\WXMPFiles.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\client-glue\WXMPIterator.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\client-glue\WXMPMeta.hpp"
- >
- </File>
- <File
- RelativePath="..\..\..\..\public\include\client-glue\WXMPUtils.hpp"
- >
- </File>
- </Filter>
- </Filter>
- <Filter
- Name="Build Files"
- >
- <File
- RelativePath="CopyFiles.bat"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/samples/build/vsnet/XMPSamples.sln b/samples/build/vsnet/XMPSamples.sln
deleted file mode 100644
index a4c318a..0000000
--- a/samples/build/vsnet/XMPSamples.sln
+++ /dev/null
@@ -1,37 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XMPCoreCoverage", "XMPCoreCoverage.vcproj", "{6E63FCD8-1D1B-41E6-85CB-79EE9E95E89E}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DumpScannedXMP", "DumpScannedXMP.vcproj", "{5E467275-083F-4C6E-8645-EC3CCA70E3DE}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XMPFilesCoverage", "XMPFilesCoverage.vcproj", "{7179F7FA-1A10-4B1C-9E99-8F8B20E51C7C}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DumpMainXMP (static)", "DumpMainXMP.vcproj", "{9C52F46F-E90C-4FE9-83C5-A2C194C91B54}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Release|Win32 = Release|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {6E63FCD8-1D1B-41E6-85CB-79EE9E95E89E}.Debug|Win32.ActiveCfg = Debug|Win32
- {6E63FCD8-1D1B-41E6-85CB-79EE9E95E89E}.Debug|Win32.Build.0 = Debug|Win32
- {6E63FCD8-1D1B-41E6-85CB-79EE9E95E89E}.Release|Win32.ActiveCfg = Release|Win32
- {6E63FCD8-1D1B-41E6-85CB-79EE9E95E89E}.Release|Win32.Build.0 = Release|Win32
- {5E467275-083F-4C6E-8645-EC3CCA70E3DE}.Debug|Win32.ActiveCfg = Debug|Win32
- {5E467275-083F-4C6E-8645-EC3CCA70E3DE}.Debug|Win32.Build.0 = Debug|Win32
- {5E467275-083F-4C6E-8645-EC3CCA70E3DE}.Release|Win32.ActiveCfg = Release|Win32
- {5E467275-083F-4C6E-8645-EC3CCA70E3DE}.Release|Win32.Build.0 = Release|Win32
- {7179F7FA-1A10-4B1C-9E99-8F8B20E51C7C}.Debug|Win32.ActiveCfg = Debug|Win32
- {7179F7FA-1A10-4B1C-9E99-8F8B20E51C7C}.Debug|Win32.Build.0 = Debug|Win32
- {7179F7FA-1A10-4B1C-9E99-8F8B20E51C7C}.Release|Win32.ActiveCfg = Release|Win32
- {7179F7FA-1A10-4B1C-9E99-8F8B20E51C7C}.Release|Win32.Build.0 = Release|Win32
- {9C52F46F-E90C-4FE9-83C5-A2C194C91B54}.Debug|Win32.ActiveCfg = Debug|Win32
- {9C52F46F-E90C-4FE9-83C5-A2C194C91B54}.Debug|Win32.Build.0 = Debug|Win32
- {9C52F46F-E90C-4FE9-83C5-A2C194C91B54}.Release|Win32.ActiveCfg = Release|Win32
- {9C52F46F-E90C-4FE9-83C5-A2C194C91B54}.Release|Win32.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/samples/build/vsnet8/CustomSchema.vcproj b/samples/build/vsnet8/CustomSchema.vcproj
new file mode 100755
index 0000000..c0651fa
--- /dev/null
+++ b/samples/build/vsnet8/CustomSchema.vcproj
@@ -0,0 +1,474 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="CustomSchema"
+ ProjectGUID="{90F628F9-A5B0-4E73-8371-B3BF03A414AF}"
+ RootNamespace="CustomSchema"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="..\..\target\windows\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="..\..\target\windows_x64\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="..\..\target\windows\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="..\..\target\windows_x64\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\source\CustomSchema.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\..\public\include\TXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPUtils.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Const.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Environment.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Version.h"
+ >
+ </File>
+ <Filter
+ Name="Client Glue"
+ >
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPFiles.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPIterator.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPMeta.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPUtils.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMP_Common.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPUtils.hpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/samples/build/vsnet8/DumpFile.vcproj b/samples/build/vsnet8/DumpFile.vcproj
new file mode 100755
index 0000000..719ef35
--- /dev/null
+++ b/samples/build/vsnet8/DumpFile.vcproj
@@ -0,0 +1,518 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="DumpFile"
+ ProjectGUID="{E724653D-062D-4191-99BF-6A596DC7ACCC}"
+ RootNamespace="DumpFile"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="..\..\target\windows\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\source\common;..\..\..\public\include;..\..\..\source\common"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib"
+ OutputFile="$(OutDir)\dumpfile.exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="..\..\target\windows_x64\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\source\common;..\..\..\public\include;..\..\..\source\common"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib"
+ OutputFile="$(OutDir)\dumpfile.exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="..\..\target\windows\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\source\common;..\..\..\public\include;..\..\..\source\common"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib"
+ OutputFile="$(OutDir)\dumpfile.exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="..\..\target\windows_x64\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\source\common;..\..\..\public\include;..\..\..\source\common"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib"
+ OutputFile="$(OutDir)\dumpfile.exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\source\dumpfile\main.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\..\public\include\TXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPUtils.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Const.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Environment.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Version.h"
+ >
+ </File>
+ <Filter
+ Name="Client Glue"
+ >
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPFiles.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPIterator.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPMeta.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPUtils.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMP_Common.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPUtils.hpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Common Source"
+ >
+ <File
+ RelativePath="..\..\source\common\DumpFile.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\common\EndianUtils.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\globals.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\common\LargeFileAccess.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\common\LargeFileAccess.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\Log.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\OutputUtils.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\QEScanner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\TagTree.cpp"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/samples/build/vsnet8/DumpMainXMP.vcproj b/samples/build/vsnet8/DumpMainXMP.vcproj
new file mode 100755
index 0000000..4e0e040
--- /dev/null
+++ b/samples/build/vsnet8/DumpMainXMP.vcproj
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="DumpMainXMP"
+ ProjectGUID="{90F628F9-A5B0-4E73-8371-B3B483A415CF}"
+ RootNamespace="DumpMainXMP"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="..\..\target\windows\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib $(NOINHERIT)"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="..\..\target\windows_x64\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="..\..\target\windows\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib $(NOINHERIT)"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="..\..\target\windows_x64\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\source\DumpMainXMP.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\..\public\include\TXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPUtils.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Const.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Environment.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Version.h"
+ >
+ </File>
+ <Filter
+ Name="Client Glue"
+ >
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPFiles.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPIterator.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPMeta.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPUtils.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMP_Common.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPUtils.hpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/samples/build/vsnet8/DumpScannedXMP.vcproj b/samples/build/vsnet8/DumpScannedXMP.vcproj
new file mode 100755
index 0000000..fbd90d8
--- /dev/null
+++ b/samples/build/vsnet8/DumpScannedXMP.vcproj
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="DumpScannedXMP"
+ ProjectGUID="{90F628F9-A5B0-4E73-8471-F2F683C815CF}"
+ RootNamespace="DumpScannedXMP"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="..\..\target\windows\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib $(NOINHERIT)"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="..\..\target\windows_x64\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="..\..\target\windows\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib $(NOINHERIT)"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="..\..\target\windows_x64\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\source\DumpScannedXMP.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\..\public\include\TXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPUtils.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Const.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Environment.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Version.h"
+ >
+ </File>
+ <Filter
+ Name="Client Glue"
+ >
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPFiles.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPIterator.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPMeta.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPUtils.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMP_Common.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPUtils.hpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/samples/build/vsnet8/ModifyingXMP.vcproj b/samples/build/vsnet8/ModifyingXMP.vcproj
new file mode 100755
index 0000000..2d95772
--- /dev/null
+++ b/samples/build/vsnet8/ModifyingXMP.vcproj
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="ModifyingXMP"
+ ProjectGUID="{90F628F9-A5B0-4E73-8371-BAC387452322}"
+ RootNamespace="ModifyingXMP"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="..\..\target\windows\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib $(NOINHERIT)"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="..\..\target\windows_x64\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="..\..\target\windows\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib $(NOINHERIT)"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="..\..\target\windows_x64\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\source\ModifyingXMP.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\..\public\include\TXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPUtils.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Const.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Environment.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Version.h"
+ >
+ </File>
+ <Filter
+ Name="Client Glue"
+ >
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPFiles.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPIterator.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPMeta.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPUtils.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMP_Common.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPUtils.hpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/samples/build/vsnet8/ReadingXMP.vcproj b/samples/build/vsnet8/ReadingXMP.vcproj
new file mode 100755
index 0000000..af15d7f
--- /dev/null
+++ b/samples/build/vsnet8/ReadingXMP.vcproj
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="ReadingXMP"
+ ProjectGUID="{90F628F9-A5B0-4E73-8371-ABD427489422}"
+ RootNamespace="ReadingXMP"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="..\..\target\windows\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib $(NOINHERIT)"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="..\..\target\windows_x64\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="..\..\target\windows\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib $(NOINHERIT)"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="..\..\target\windows_x64\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\source\ReadingXMP.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\..\public\include\TXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPUtils.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Const.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Environment.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Version.h"
+ >
+ </File>
+ <Filter
+ Name="Client Glue"
+ >
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPFiles.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPIterator.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPMeta.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPUtils.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMP_Common.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPUtils.hpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/samples/build/vsnet8/XMP-Toolkit-SDK-Samples.sln b/samples/build/vsnet8/XMP-Toolkit-SDK-Samples.sln
new file mode 100644
index 0000000..b9f5b98
--- /dev/null
+++ b/samples/build/vsnet8/XMP-Toolkit-SDK-Samples.sln
@@ -0,0 +1,115 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CustomSchema", "CustomSchema.vcproj", "{90F628F9-A5B0-4E73-8371-B3BF03A414AF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DumpFile", "DumpFile.vcproj", "{E724653D-062D-4191-99BF-6A596DC7ACCC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DumpMainXMP", "DumpMainXMP.vcproj", "{90F628F9-A5B0-4E73-8371-B3B483A415CF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ModifyingXMP", "ModifyingXMP.vcproj", "{90F628F9-A5B0-4E73-8371-BAC387452322}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DumpScannedXMP", "DumpScannedXMP.vcproj", "{90F628F9-A5B0-4E73-8471-F2F683C815CF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReadingXMP", "ReadingXMP.vcproj", "{90F628F9-A5B0-4E73-8371-ABD427489422}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XMPIterations", "XMPIterations.vcproj", "{90F628F9-A5B0-4E74-8482-ADD423479422}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XMPCoreCoverage", "XMPCoreCoverage.vcproj", "{90F628F9-A5B0-4E74-8562-AD256FFAC0A2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XMPFilesCoverage", "XMPFilesCoverage.vcproj", "{90F628F9-A5B1-4E88-8482-ADD45111AAA2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XMPCommand", "XMPCommand.vcproj", "{90F628F9-A5B1-4E73-8371-B3B6723F112F}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {90F628F9-A5B0-4E73-8371-B3BF03A414AF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {90F628F9-A5B0-4E73-8371-B3BF03A414AF}.Debug|Win32.Build.0 = Debug|Win32
+ {90F628F9-A5B0-4E73-8371-B3BF03A414AF}.Debug|x64.ActiveCfg = Debug|x64
+ {90F628F9-A5B0-4E73-8371-B3BF03A414AF}.Debug|x64.Build.0 = Debug|x64
+ {90F628F9-A5B0-4E73-8371-B3BF03A414AF}.Release|Win32.ActiveCfg = Release|Win32
+ {90F628F9-A5B0-4E73-8371-B3BF03A414AF}.Release|Win32.Build.0 = Release|Win32
+ {90F628F9-A5B0-4E73-8371-B3BF03A414AF}.Release|x64.ActiveCfg = Release|x64
+ {90F628F9-A5B0-4E73-8371-B3BF03A414AF}.Release|x64.Build.0 = Release|x64
+ {E724653D-062D-4191-99BF-6A596DC7ACCC}.Debug|Win32.ActiveCfg = Debug|Win32
+ {E724653D-062D-4191-99BF-6A596DC7ACCC}.Debug|Win32.Build.0 = Debug|Win32
+ {E724653D-062D-4191-99BF-6A596DC7ACCC}.Debug|x64.ActiveCfg = Debug|x64
+ {E724653D-062D-4191-99BF-6A596DC7ACCC}.Debug|x64.Build.0 = Debug|x64
+ {E724653D-062D-4191-99BF-6A596DC7ACCC}.Release|Win32.ActiveCfg = Release|Win32
+ {E724653D-062D-4191-99BF-6A596DC7ACCC}.Release|Win32.Build.0 = Release|Win32
+ {E724653D-062D-4191-99BF-6A596DC7ACCC}.Release|x64.ActiveCfg = Release|x64
+ {E724653D-062D-4191-99BF-6A596DC7ACCC}.Release|x64.Build.0 = Release|x64
+ {90F628F9-A5B0-4E73-8371-B3B483A415CF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {90F628F9-A5B0-4E73-8371-B3B483A415CF}.Debug|Win32.Build.0 = Debug|Win32
+ {90F628F9-A5B0-4E73-8371-B3B483A415CF}.Debug|x64.ActiveCfg = Debug|x64
+ {90F628F9-A5B0-4E73-8371-B3B483A415CF}.Debug|x64.Build.0 = Debug|x64
+ {90F628F9-A5B0-4E73-8371-B3B483A415CF}.Release|Win32.ActiveCfg = Release|Win32
+ {90F628F9-A5B0-4E73-8371-B3B483A415CF}.Release|Win32.Build.0 = Release|Win32
+ {90F628F9-A5B0-4E73-8371-B3B483A415CF}.Release|x64.ActiveCfg = Release|x64
+ {90F628F9-A5B0-4E73-8371-B3B483A415CF}.Release|x64.Build.0 = Release|x64
+ {90F628F9-A5B0-4E73-8371-BAC387452322}.Debug|Win32.ActiveCfg = Debug|Win32
+ {90F628F9-A5B0-4E73-8371-BAC387452322}.Debug|Win32.Build.0 = Debug|Win32
+ {90F628F9-A5B0-4E73-8371-BAC387452322}.Debug|x64.ActiveCfg = Debug|x64
+ {90F628F9-A5B0-4E73-8371-BAC387452322}.Debug|x64.Build.0 = Debug|x64
+ {90F628F9-A5B0-4E73-8371-BAC387452322}.Release|Win32.ActiveCfg = Release|Win32
+ {90F628F9-A5B0-4E73-8371-BAC387452322}.Release|Win32.Build.0 = Release|Win32
+ {90F628F9-A5B0-4E73-8371-BAC387452322}.Release|x64.ActiveCfg = Release|x64
+ {90F628F9-A5B0-4E73-8371-BAC387452322}.Release|x64.Build.0 = Release|x64
+ {90F628F9-A5B0-4E73-8471-F2F683C815CF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {90F628F9-A5B0-4E73-8471-F2F683C815CF}.Debug|Win32.Build.0 = Debug|Win32
+ {90F628F9-A5B0-4E73-8471-F2F683C815CF}.Debug|x64.ActiveCfg = Debug|x64
+ {90F628F9-A5B0-4E73-8471-F2F683C815CF}.Debug|x64.Build.0 = Debug|x64
+ {90F628F9-A5B0-4E73-8471-F2F683C815CF}.Release|Win32.ActiveCfg = Release|Win32
+ {90F628F9-A5B0-4E73-8471-F2F683C815CF}.Release|Win32.Build.0 = Release|Win32
+ {90F628F9-A5B0-4E73-8471-F2F683C815CF}.Release|x64.ActiveCfg = Release|x64
+ {90F628F9-A5B0-4E73-8471-F2F683C815CF}.Release|x64.Build.0 = Release|x64
+ {90F628F9-A5B0-4E73-8371-ABD427489422}.Debug|Win32.ActiveCfg = Debug|Win32
+ {90F628F9-A5B0-4E73-8371-ABD427489422}.Debug|Win32.Build.0 = Debug|Win32
+ {90F628F9-A5B0-4E73-8371-ABD427489422}.Debug|x64.ActiveCfg = Debug|x64
+ {90F628F9-A5B0-4E73-8371-ABD427489422}.Debug|x64.Build.0 = Debug|x64
+ {90F628F9-A5B0-4E73-8371-ABD427489422}.Release|Win32.ActiveCfg = Release|Win32
+ {90F628F9-A5B0-4E73-8371-ABD427489422}.Release|Win32.Build.0 = Release|Win32
+ {90F628F9-A5B0-4E73-8371-ABD427489422}.Release|x64.ActiveCfg = Release|x64
+ {90F628F9-A5B0-4E73-8371-ABD427489422}.Release|x64.Build.0 = Release|x64
+ {90F628F9-A5B0-4E74-8482-ADD423479422}.Debug|Win32.ActiveCfg = Debug|Win32
+ {90F628F9-A5B0-4E74-8482-ADD423479422}.Debug|Win32.Build.0 = Debug|Win32
+ {90F628F9-A5B0-4E74-8482-ADD423479422}.Debug|x64.ActiveCfg = Debug|x64
+ {90F628F9-A5B0-4E74-8482-ADD423479422}.Debug|x64.Build.0 = Debug|x64
+ {90F628F9-A5B0-4E74-8482-ADD423479422}.Release|Win32.ActiveCfg = Release|Win32
+ {90F628F9-A5B0-4E74-8482-ADD423479422}.Release|Win32.Build.0 = Release|Win32
+ {90F628F9-A5B0-4E74-8482-ADD423479422}.Release|x64.ActiveCfg = Release|x64
+ {90F628F9-A5B0-4E74-8482-ADD423479422}.Release|x64.Build.0 = Release|x64
+ {90F628F9-A5B0-4E74-8562-AD256FFAC0A2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {90F628F9-A5B0-4E74-8562-AD256FFAC0A2}.Debug|Win32.Build.0 = Debug|Win32
+ {90F628F9-A5B0-4E74-8562-AD256FFAC0A2}.Debug|x64.ActiveCfg = Debug|x64
+ {90F628F9-A5B0-4E74-8562-AD256FFAC0A2}.Debug|x64.Build.0 = Debug|x64
+ {90F628F9-A5B0-4E74-8562-AD256FFAC0A2}.Release|Win32.ActiveCfg = Release|Win32
+ {90F628F9-A5B0-4E74-8562-AD256FFAC0A2}.Release|Win32.Build.0 = Release|Win32
+ {90F628F9-A5B0-4E74-8562-AD256FFAC0A2}.Release|x64.ActiveCfg = Release|x64
+ {90F628F9-A5B0-4E74-8562-AD256FFAC0A2}.Release|x64.Build.0 = Release|x64
+ {90F628F9-A5B1-4E88-8482-ADD45111AAA2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {90F628F9-A5B1-4E88-8482-ADD45111AAA2}.Debug|Win32.Build.0 = Debug|Win32
+ {90F628F9-A5B1-4E88-8482-ADD45111AAA2}.Debug|x64.ActiveCfg = Debug|x64
+ {90F628F9-A5B1-4E88-8482-ADD45111AAA2}.Debug|x64.Build.0 = Debug|x64
+ {90F628F9-A5B1-4E88-8482-ADD45111AAA2}.Release|Win32.ActiveCfg = Release|Win32
+ {90F628F9-A5B1-4E88-8482-ADD45111AAA2}.Release|Win32.Build.0 = Release|Win32
+ {90F628F9-A5B1-4E88-8482-ADD45111AAA2}.Release|x64.ActiveCfg = Release|x64
+ {90F628F9-A5B1-4E88-8482-ADD45111AAA2}.Release|x64.Build.0 = Release|x64
+ {90F628F9-A5B1-4E73-8371-B3B6723F112F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {90F628F9-A5B1-4E73-8371-B3B6723F112F}.Debug|Win32.Build.0 = Debug|Win32
+ {90F628F9-A5B1-4E73-8371-B3B6723F112F}.Debug|x64.ActiveCfg = Debug|x64
+ {90F628F9-A5B1-4E73-8371-B3B6723F112F}.Debug|x64.Build.0 = Debug|x64
+ {90F628F9-A5B1-4E73-8371-B3B6723F112F}.Release|Win32.ActiveCfg = Release|Win32
+ {90F628F9-A5B1-4E73-8371-B3B6723F112F}.Release|Win32.Build.0 = Release|Win32
+ {90F628F9-A5B1-4E73-8371-B3B6723F112F}.Release|x64.ActiveCfg = Release|x64
+ {90F628F9-A5B1-4E73-8371-B3B6723F112F}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/samples/build/vsnet8/XMPCommand.vcproj b/samples/build/vsnet8/XMPCommand.vcproj
new file mode 100755
index 0000000..b447de5
--- /dev/null
+++ b/samples/build/vsnet8/XMPCommand.vcproj
@@ -0,0 +1,546 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="XMPCommand"
+ ProjectGUID="{90F628F9-A5B1-4E73-8371-B3B6723F112F}"
+ RootNamespace="XMPCommand"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="..\..\target\windows\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include;..\..\source\xmpcommand;..\..\source\common;..\..\..\source\common"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib"
+ OutputFile="$(OutDir)\xmpcommand.exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="..\..\target\windows_x64\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include;..\..\source\xmpcommand;..\..\source\common;..\..\..\source\common"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib"
+ OutputFile="$(OutDir)\xmpcommand.exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="..\..\target\windows\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include;..\..\source\xmpcommand;..\..\source\common;..\..\..\source\common"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib"
+ OutputFile="$(OutDir)\xmpcommand.exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="..\..\target\windows_x64\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include;..\..\source\xmpcommand;..\..\source\common;..\..\..\source\common"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib"
+ OutputFile="$(OutDir)\xmpcommand.exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <Filter
+ Name="xmpcommand"
+ >
+ <File
+ RelativePath="..\..\source\xmpcommand\Actions.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\xmpcommand\Actions.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\xmpcommand\main.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\xmpcommand\PrintUsage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\xmpcommand\PrintUsage.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\source\common\DumpFile.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\DumpFile.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\globals.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\Log.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\Log.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\OutputUtils.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\OutputUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\QEScanner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\QEScanner.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\TagTree.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\common\TagTree.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\..\public\include\TXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPUtils.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Const.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Environment.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Version.h"
+ >
+ </File>
+ <Filter
+ Name="Client Glue"
+ >
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPFiles.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPIterator.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPMeta.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPUtils.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMP_Common.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPUtils.hpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/samples/build/vsnet8/XMPCoreCoverage.vcproj b/samples/build/vsnet8/XMPCoreCoverage.vcproj
new file mode 100755
index 0000000..a0e613d
--- /dev/null
+++ b/samples/build/vsnet8/XMPCoreCoverage.vcproj
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="XMPCoreCoverage"
+ ProjectGUID="{90F628F9-A5B0-4E74-8562-AD256FFAC0A2}"
+ RootNamespace="XMPCoreCoverage"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="..\..\target\windows\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="..\..\target\windows_x64\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="..\..\target\windows\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="..\..\target\windows_x64\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\source\XMPCoreCoverage.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\..\public\include\TXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPUtils.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Const.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Environment.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Version.h"
+ >
+ </File>
+ <Filter
+ Name="Client Glue"
+ >
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPFiles.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPIterator.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPMeta.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPUtils.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMP_Common.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPUtils.hpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/samples/build/vsnet8/XMPFilesCoverage.vcproj b/samples/build/vsnet8/XMPFilesCoverage.vcproj
new file mode 100755
index 0000000..4e082ce
--- /dev/null
+++ b/samples/build/vsnet8/XMPFilesCoverage.vcproj
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="XMPFilesCoverage"
+ ProjectGUID="{90F628F9-A5B1-4E88-8482-ADD45111AAA2}"
+ RootNamespace="XMPFilesCoverage"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="..\..\target\windows\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib $(NOINHERIT)"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="..\..\target\windows_x64\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="..\..\target\windows\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib $(NOINHERIT)"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="..\..\target\windows_x64\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\source\XMPFilesCoverage.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\..\public\include\TXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPUtils.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Const.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Environment.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Version.h"
+ >
+ </File>
+ <Filter
+ Name="Client Glue"
+ >
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPFiles.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPIterator.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPMeta.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPUtils.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMP_Common.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPUtils.hpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/samples/build/vsnet8/XMPIterations.vcproj b/samples/build/vsnet8/XMPIterations.vcproj
new file mode 100755
index 0000000..376af09
--- /dev/null
+++ b/samples/build/vsnet8/XMPIterations.vcproj
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="XMPIterations"
+ ProjectGUID="{90F628F9-A5B0-4E74-8482-ADD423479422}"
+ RootNamespace="XMPIterations"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="..\..\target\windows\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib $(NOINHERIT)"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="..\..\target\windows_x64\debug\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;DEBUG=1;_DEBUG=1;XMP_StaticBuild=1"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticDebug.lib XMPFilesStaticDebug.lib"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\debug"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="..\..\target\windows\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib $(NOINHERIT)"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="../../../public/libraries/windows/release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="..\..\target\windows_x64\release\"
+ IntermediateDirectory="..\..\intermediate\$(ProjectName)\windows_x64\$(ConfigurationName)\"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\..\public\include"
+ PreprocessorDefinitions="WIN32=1;_WINDOWS=1;WIN_ENV=1;NDEBUG=1;XMP_StaticBuild=1"
+ StringPooling="true"
+ MinimalRebuild="false"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="true"
+ DefaultCharIsUnsigned="true"
+ ForceConformanceInForLoopScope="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="XMPCoreStaticRelease.lib XMPFilesStaticRelease.lib"
+ OutputFile="$(OutDir)$(ProjectName).exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\..\public\libraries\windows_x64\release"
+ GenerateDebugInformation="true"
+ AssemblyDebug="0"
+ GenerateMapFile="true"
+ MapFileName=" $(TargetDir)$(TargetName).map"
+ SubSystem="0"
+ OptimizeReferences="0"
+ EnableCOMDATFolding="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\source\XMPIterations.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\..\public\include\TXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\TXMPUtils.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Const.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Environment.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\XMP_Version.h"
+ >
+ </File>
+ <Filter
+ Name="Client Glue"
+ >
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPFiles.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPIterator.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPMeta.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\TXMPUtils.incl_cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMP_Common.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPFiles.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPIterator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPMeta.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\public\include\client-glue\WXMPUtils.hpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/samples/build/xcode/XMPSamples.xcodeproj/project.pbxproj b/samples/build/xcode/XMPSamples.xcodeproj/project.pbxproj
deleted file mode 100644
index 4a94bb0..0000000
--- a/samples/build/xcode/XMPSamples.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,705 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 42;
- objects = {
-
-/* Begin PBXAggregateTarget section */
- DC97291609A3EACA005A68DF /* Build All */ = {
- isa = PBXAggregateTarget;
- buildConfigurationList = DC97292709A3EB4F005A68DF /* Build configuration list for PBXAggregateTarget "Build All" */;
- buildPhases = (
- );
- dependencies = (
- DC97291809A3EAD0005A68DF /* PBXTargetDependency */,
- DC97291E09A3EB06005A68DF /* PBXTargetDependency */,
- DC97292009A3EB0C005A68DF /* PBXTargetDependency */,
- DC97292209A3EB12005A68DF /* PBXTargetDependency */,
- 018882280B7C941400EECA52 /* PBXTargetDependency */,
- 018882260B7C941400EECA52 /* PBXTargetDependency */,
- 018882240B7C941400EECA52 /* PBXTargetDependency */,
- 018882220B7C941400EECA52 /* PBXTargetDependency */,
- );
- name = "Build All";
- productName = "Build All";
- };
-/* End PBXAggregateTarget section */
-
-/* Begin PBXBuildFile section */
- 018881FF0B7C93A300EECA52 /* XMPFilesCoverage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 018881EE0B7C934100EECA52 /* XMPFilesCoverage.cpp */; };
- 018882000B7C93A300EECA52 /* XMPFilesCoverage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 018881EE0B7C934100EECA52 /* XMPFilesCoverage.cpp */; };
- 018882040B7C93AB00EECA52 /* XMPScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC97291309A3E9BF005A68DF /* XMPScanner.cpp */; };
- 0188820D0B7C93AF00EECA52 /* XMPScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC97291309A3E9BF005A68DF /* XMPScanner.cpp */; };
- 018882130B7C93EE00EECA52 /* DumpMainXMP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 018881ED0B7C934100EECA52 /* DumpMainXMP.cpp */; };
- 018882140B7C93EF00EECA52 /* DumpMainXMP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 018881ED0B7C934100EECA52 /* DumpMainXMP.cpp */; };
- DC97291109A3E9B7005A68DF /* DumpScannedXMP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC97291009A3E9B7005A68DF /* DumpScannedXMP.cpp */; };
- DC97291209A3E9B7005A68DF /* DumpScannedXMP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC97291009A3E9B7005A68DF /* DumpScannedXMP.cpp */; };
- DC97291409A3E9BF005A68DF /* XMPScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC97291309A3E9BF005A68DF /* XMPScanner.cpp */; };
- DC97291509A3E9BF005A68DF /* XMPScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC97291309A3E9BF005A68DF /* XMPScanner.cpp */; };
- DCE615430951C75C001247EE /* XMPCoreCoverage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DCF3A64D087F1D9000FEB713 /* XMPCoreCoverage.cpp */; };
- DCED0E5D089E7E6E009B80AF /* XMPCoreCoverage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DCF3A64D087F1D9000FEB713 /* XMPCoreCoverage.cpp */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXContainerItemProxy section */
- 018882210B7C941400EECA52 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 0188820A0B7C93AF00EECA52;
- remoteInfo = "DumpMainXMP Release";
- };
- 018882230B7C941400EECA52 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 018882010B7C93AB00EECA52;
- remoteInfo = "DumpMainXMP Debug";
- };
- 018882250B7C941400EECA52 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 018881F70B7C936A00EECA52;
- remoteInfo = "XMPFilesCoverage Release";
- };
- 018882270B7C941400EECA52 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 018881EF0B7C935100EECA52;
- remoteInfo = "XMPFilesCoverage Debug";
- };
- DC97291709A3EAD0005A68DF /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = DCED0E5B089E7E6E009B80AF;
- remoteInfo = "XMPCoverage Debug";
- };
- DC97291D09A3EB06005A68DF /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = DCE615410951C75C001247EE;
- remoteInfo = "XMPCoverage Release";
- };
- DC97291F09A3EB0C005A68DF /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = DC9728FD09A3E964005A68DF;
- remoteInfo = "DumpXMP Debug";
- };
- DC97292109A3EB12005A68DF /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = DC97290509A3E969005A68DF;
- remoteInfo = "DumpXMP Release";
- };
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXFileReference section */
- 018881ED0B7C934100EECA52 /* DumpMainXMP.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = DumpMainXMP.cpp; sourceTree = "<group>"; };
- 018881EE0B7C934100EECA52 /* XMPFilesCoverage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XMPFilesCoverage.cpp; sourceTree = "<group>"; };
- 018881F50B7C935100EECA52 /* XMPFilesCoverage */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = XMPFilesCoverage; sourceTree = BUILT_PRODUCTS_DIR; };
- 018881FD0B7C936A00EECA52 /* XMPFilesCoverage */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = XMPFilesCoverage; sourceTree = BUILT_PRODUCTS_DIR; };
- 018882080B7C93AB00EECA52 /* DumpMainXMP */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = DumpMainXMP; sourceTree = BUILT_PRODUCTS_DIR; };
- 018882110B7C93AF00EECA52 /* DumpMainXMP */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = DumpMainXMP; sourceTree = BUILT_PRODUCTS_DIR; };
- DC97290309A3E964005A68DF /* DumpScannedXMP */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = DumpScannedXMP; sourceTree = BUILT_PRODUCTS_DIR; };
- DC97290B09A3E969005A68DF /* DumpScannedXMP */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = DumpScannedXMP; sourceTree = BUILT_PRODUCTS_DIR; };
- DC97291009A3E9B7005A68DF /* DumpScannedXMP.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = DumpScannedXMP.cpp; sourceTree = "<group>"; };
- DC97291309A3E9BF005A68DF /* XMPScanner.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XMPScanner.cpp; sourceTree = "<group>"; };
- DCE400B00951CF710040D71F /* XMPSamples-Common.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; path = "XMPSamples-Common.xcconfig"; sourceTree = "<group>"; };
- DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; path = "XMPSamples-Debug.xcconfig"; sourceTree = "<group>"; };
- DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; path = "XMPSamples-Release.xcconfig"; sourceTree = "<group>"; };
- DCE615470951C75C001247EE /* XMPCoreCoverage */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = XMPCoreCoverage; sourceTree = BUILT_PRODUCTS_DIR; };
- DCED0E65089E7E6E009B80AF /* XMPCoreCoverage */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = XMPCoreCoverage; sourceTree = BUILT_PRODUCTS_DIR; };
- DCF3A64D087F1D9000FEB713 /* XMPCoreCoverage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XMPCoreCoverage.cpp; sourceTree = "<group>"; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 018881F20B7C935100EECA52 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 018881FA0B7C936A00EECA52 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 018882050B7C93AB00EECA52 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 0188820E0B7C93AF00EECA52 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DC97290009A3E964005A68DF /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DC97290809A3E969005A68DF /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DCE615440951C75C001247EE /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DCED0E5E089E7E6E009B80AF /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 08FB7794FE84155DC02AAC07 /* XMPCoverage */ = {
- isa = PBXGroup;
- children = (
- 08FB7795FE84155DC02AAC07 /* Source */,
- DCE4006D0951CC850040D71F /* Build Extras */,
- 1AB674ADFE9D54B511CA2CBB /* Products */,
- );
- name = XMPCoverage;
- sourceTree = "<group>";
- };
- 08FB7795FE84155DC02AAC07 /* Source */ = {
- isa = PBXGroup;
- children = (
- 018881ED0B7C934100EECA52 /* DumpMainXMP.cpp */,
- 018881EE0B7C934100EECA52 /* XMPFilesCoverage.cpp */,
- DCF3A64D087F1D9000FEB713 /* XMPCoreCoverage.cpp */,
- DC97291009A3E9B7005A68DF /* DumpScannedXMP.cpp */,
- DC97291309A3E9BF005A68DF /* XMPScanner.cpp */,
- );
- name = Source;
- path = ../../source;
- sourceTree = "<group>";
- };
- 1AB674ADFE9D54B511CA2CBB /* Products */ = {
- isa = PBXGroup;
- children = (
- DCED0E65089E7E6E009B80AF /* XMPCoreCoverage */,
- DCE615470951C75C001247EE /* XMPCoreCoverage */,
- DC97290309A3E964005A68DF /* DumpScannedXMP */,
- DC97290B09A3E969005A68DF /* DumpScannedXMP */,
- 018881F50B7C935100EECA52 /* XMPFilesCoverage */,
- 018881FD0B7C936A00EECA52 /* XMPFilesCoverage */,
- 018882080B7C93AB00EECA52 /* DumpMainXMP */,
- 018882110B7C93AF00EECA52 /* DumpMainXMP */,
- );
- name = Products;
- path = ../..;
- sourceTree = BUILT_PRODUCTS_DIR;
- };
- DCE4006D0951CC850040D71F /* Build Extras */ = {
- isa = PBXGroup;
- children = (
- DCE400B00951CF710040D71F /* XMPSamples-Common.xcconfig */,
- DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */,
- DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */,
- );
- name = "Build Extras";
- sourceTree = "<group>";
- };
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
- 018881EF0B7C935100EECA52 /* XMPFilesCoverage Debug */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 018881F30B7C935100EECA52 /* Build configuration list for PBXNativeTarget "XMPFilesCoverage Debug" */;
- buildPhases = (
- 018881F00B7C935100EECA52 /* Sources */,
- 018881F20B7C935100EECA52 /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "XMPFilesCoverage Debug";
- productInstallPath = "$(HOME)/bin";
- productName = XMPCoverage;
- productReference = 018881F50B7C935100EECA52 /* XMPFilesCoverage */;
- productType = "com.apple.product-type.tool";
- };
- 018881F70B7C936A00EECA52 /* XMPFilesCoverage Release */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 018881FB0B7C936A00EECA52 /* Build configuration list for PBXNativeTarget "XMPFilesCoverage Release" */;
- buildPhases = (
- 018881F80B7C936A00EECA52 /* Sources */,
- 018881FA0B7C936A00EECA52 /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "XMPFilesCoverage Release";
- productInstallPath = "$(HOME)/bin";
- productName = XMPCoverage;
- productReference = 018881FD0B7C936A00EECA52 /* XMPFilesCoverage */;
- productType = "com.apple.product-type.tool";
- };
- 018882010B7C93AB00EECA52 /* DumpMainXMP Debug */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 018882060B7C93AB00EECA52 /* Build configuration list for PBXNativeTarget "DumpMainXMP Debug" */;
- buildPhases = (
- 018882020B7C93AB00EECA52 /* Sources */,
- 018882050B7C93AB00EECA52 /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "DumpMainXMP Debug";
- productInstallPath = "$(HOME)/bin";
- productName = XMPCoverage;
- productReference = 018882080B7C93AB00EECA52 /* DumpMainXMP */;
- productType = "com.apple.product-type.tool";
- };
- 0188820A0B7C93AF00EECA52 /* DumpMainXMP Release */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 0188820F0B7C93AF00EECA52 /* Build configuration list for PBXNativeTarget "DumpMainXMP Release" */;
- buildPhases = (
- 0188820B0B7C93AF00EECA52 /* Sources */,
- 0188820E0B7C93AF00EECA52 /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "DumpMainXMP Release";
- productInstallPath = "$(HOME)/bin";
- productName = XMPCoverage;
- productReference = 018882110B7C93AF00EECA52 /* DumpMainXMP */;
- productType = "com.apple.product-type.tool";
- };
- DC9728FD09A3E964005A68DF /* DumpScannedXMP Debug */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = DC97290109A3E964005A68DF /* Build configuration list for PBXNativeTarget "DumpScannedXMP Debug" */;
- buildPhases = (
- DC9728FE09A3E964005A68DF /* Sources */,
- DC97290009A3E964005A68DF /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "DumpScannedXMP Debug";
- productInstallPath = "$(HOME)/bin";
- productName = XMPCoverage;
- productReference = DC97290309A3E964005A68DF /* DumpScannedXMP */;
- productType = "com.apple.product-type.tool";
- };
- DC97290509A3E969005A68DF /* DumpScannedXMP Release */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = DC97290909A3E969005A68DF /* Build configuration list for PBXNativeTarget "DumpScannedXMP Release" */;
- buildPhases = (
- DC97290609A3E969005A68DF /* Sources */,
- DC97290809A3E969005A68DF /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "DumpScannedXMP Release";
- productInstallPath = "$(HOME)/bin";
- productName = XMPCoverage;
- productReference = DC97290B09A3E969005A68DF /* DumpScannedXMP */;
- productType = "com.apple.product-type.tool";
- };
- DCE615410951C75C001247EE /* XMPCoreCoverage Release */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = DCE615450951C75C001247EE /* Build configuration list for PBXNativeTarget "XMPCoreCoverage Release" */;
- buildPhases = (
- DCE615420951C75C001247EE /* Sources */,
- DCE615440951C75C001247EE /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "XMPCoreCoverage Release";
- productInstallPath = "$(HOME)/bin";
- productName = XMPCoverage;
- productReference = DCE615470951C75C001247EE /* XMPCoreCoverage */;
- productType = "com.apple.product-type.tool";
- };
- DCED0E5B089E7E6E009B80AF /* XMPCoreCoverage Debug */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = DCED0E60089E7E6E009B80AF /* Build configuration list for PBXNativeTarget "XMPCoreCoverage Debug" */;
- buildPhases = (
- DCED0E5C089E7E6E009B80AF /* Sources */,
- DCED0E5E089E7E6E009B80AF /* Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "XMPCoreCoverage Debug";
- productInstallPath = "$(HOME)/bin";
- productName = XMPCoverage;
- productReference = DCED0E65089E7E6E009B80AF /* XMPCoreCoverage */;
- productType = "com.apple.product-type.tool";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 08FB7793FE84155DC02AAC07 /* Project object */ = {
- isa = PBXProject;
- buildConfigurationList = DC47BE960871F34F0088D201 /* Build configuration list for PBXProject "XMPSamples" */;
- hasScannedForEncodings = 1;
- mainGroup = 08FB7794FE84155DC02AAC07 /* XMPCoverage */;
- projectDirPath = "";
- targets = (
- DC97291609A3EACA005A68DF /* Build All */,
- DCED0E5B089E7E6E009B80AF /* XMPCoreCoverage Debug */,
- DCE615410951C75C001247EE /* XMPCoreCoverage Release */,
- DC9728FD09A3E964005A68DF /* DumpScannedXMP Debug */,
- DC97290509A3E969005A68DF /* DumpScannedXMP Release */,
- 018881EF0B7C935100EECA52 /* XMPFilesCoverage Debug */,
- 018881F70B7C936A00EECA52 /* XMPFilesCoverage Release */,
- 018882010B7C93AB00EECA52 /* DumpMainXMP Debug */,
- 0188820A0B7C93AF00EECA52 /* DumpMainXMP Release */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXSourcesBuildPhase section */
- 018881F00B7C935100EECA52 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 018881FF0B7C93A300EECA52 /* XMPFilesCoverage.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 018881F80B7C936A00EECA52 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 018882000B7C93A300EECA52 /* XMPFilesCoverage.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 018882020B7C93AB00EECA52 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 018882040B7C93AB00EECA52 /* XMPScanner.cpp in Sources */,
- 018882130B7C93EE00EECA52 /* DumpMainXMP.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 0188820B0B7C93AF00EECA52 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 0188820D0B7C93AF00EECA52 /* XMPScanner.cpp in Sources */,
- 018882140B7C93EF00EECA52 /* DumpMainXMP.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DC9728FE09A3E964005A68DF /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- DC97291109A3E9B7005A68DF /* DumpScannedXMP.cpp in Sources */,
- DC97291409A3E9BF005A68DF /* XMPScanner.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DC97290609A3E969005A68DF /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- DC97291209A3E9B7005A68DF /* DumpScannedXMP.cpp in Sources */,
- DC97291509A3E9BF005A68DF /* XMPScanner.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DCE615420951C75C001247EE /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- DCE615430951C75C001247EE /* XMPCoreCoverage.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DCED0E5C089E7E6E009B80AF /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- DCED0E5D089E7E6E009B80AF /* XMPCoreCoverage.cpp in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXTargetDependency section */
- 018882220B7C941400EECA52 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 0188820A0B7C93AF00EECA52 /* DumpMainXMP Release */;
- targetProxy = 018882210B7C941400EECA52 /* PBXContainerItemProxy */;
- };
- 018882240B7C941400EECA52 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 018882010B7C93AB00EECA52 /* DumpMainXMP Debug */;
- targetProxy = 018882230B7C941400EECA52 /* PBXContainerItemProxy */;
- };
- 018882260B7C941400EECA52 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 018881F70B7C936A00EECA52 /* XMPFilesCoverage Release */;
- targetProxy = 018882250B7C941400EECA52 /* PBXContainerItemProxy */;
- };
- 018882280B7C941400EECA52 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 018881EF0B7C935100EECA52 /* XMPFilesCoverage Debug */;
- targetProxy = 018882270B7C941400EECA52 /* PBXContainerItemProxy */;
- };
- DC97291809A3EAD0005A68DF /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = DCED0E5B089E7E6E009B80AF /* XMPCoreCoverage Debug */;
- targetProxy = DC97291709A3EAD0005A68DF /* PBXContainerItemProxy */;
- };
- DC97291E09A3EB06005A68DF /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = DCE615410951C75C001247EE /* XMPCoreCoverage Release */;
- targetProxy = DC97291D09A3EB06005A68DF /* PBXContainerItemProxy */;
- };
- DC97292009A3EB0C005A68DF /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = DC9728FD09A3E964005A68DF /* DumpScannedXMP Debug */;
- targetProxy = DC97291F09A3EB0C005A68DF /* PBXContainerItemProxy */;
- };
- DC97292209A3EB12005A68DF /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = DC97290509A3E969005A68DF /* DumpScannedXMP Release */;
- targetProxy = DC97292109A3EB12005A68DF /* PBXContainerItemProxy */;
- };
-/* End PBXTargetDependency section */
-
-/* Begin XCBuildConfiguration section */
- 018881F40B7C935100EECA52 /* Default */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */;
- buildSettings = {
- OTHER_LDFLAGS = (
- "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
- "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
- "-framework",
- Carbon,
- "-framework",
- QuickTime,
- );
- PRODUCT_NAME = XMPFilesCoverage;
- };
- name = Default;
- };
- 018881FC0B7C936A00EECA52 /* Default */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */;
- buildSettings = {
- OTHER_LDFLAGS = (
- "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
- "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
- "-framework",
- Carbon,
- "-framework",
- QuickTime,
- );
- PRODUCT_NAME = XMPFilesCoverage;
- };
- name = Default;
- };
- 018882070B7C93AB00EECA52 /* Default */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */;
- buildSettings = {
- OTHER_LDFLAGS = (
- "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
- "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
- "-framework",
- Carbon,
- "-framework",
- QuickTime,
- );
- PRODUCT_NAME = DumpMainXMP;
- };
- name = Default;
- };
- 018882100B7C93AF00EECA52 /* Default */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */;
- buildSettings = {
- OTHER_LDFLAGS = (
- "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
- "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
- "-framework",
- Carbon,
- "-framework",
- QuickTime,
- );
- PRODUCT_NAME = DumpMainXMP;
- };
- name = Default;
- };
- DC47BE980871F34F0088D201 /* Default */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = DCE400B00951CF710040D71F /* XMPSamples-Common.xcconfig */;
- buildSettings = {
- };
- name = Default;
- };
- DC97290209A3E964005A68DF /* Default */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */;
- buildSettings = {
- PRODUCT_NAME = DumpScannedXMP;
- };
- name = Default;
- };
- DC97290A09A3E969005A68DF /* Default */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */;
- buildSettings = {
- PRODUCT_NAME = DumpScannedXMP;
- };
- name = Default;
- };
- DC97292809A3EB4F005A68DF /* Default */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- PRODUCT_NAME = "Build All";
- };
- name = Default;
- };
- DCE615460951C75C001247EE /* Default */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */;
- buildSettings = {
- PRODUCT_NAME = XMPCoreCoverage;
- };
- name = Default;
- };
- DCED0E63089E7E6E009B80AF /* Default */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */;
- buildSettings = {
- PRODUCT_NAME = XMPCoreCoverage;
- };
- name = Default;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 018881F30B7C935100EECA52 /* Build configuration list for PBXNativeTarget "XMPFilesCoverage Debug" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 018881F40B7C935100EECA52 /* Default */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Default;
- };
- 018881FB0B7C936A00EECA52 /* Build configuration list for PBXNativeTarget "XMPFilesCoverage Release" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 018881FC0B7C936A00EECA52 /* Default */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Default;
- };
- 018882060B7C93AB00EECA52 /* Build configuration list for PBXNativeTarget "DumpMainXMP Debug" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 018882070B7C93AB00EECA52 /* Default */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Default;
- };
- 0188820F0B7C93AF00EECA52 /* Build configuration list for PBXNativeTarget "DumpMainXMP Release" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 018882100B7C93AF00EECA52 /* Default */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Default;
- };
- DC47BE960871F34F0088D201 /* Build configuration list for PBXProject "XMPSamples" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- DC47BE980871F34F0088D201 /* Default */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Default;
- };
- DC97290109A3E964005A68DF /* Build configuration list for PBXNativeTarget "DumpScannedXMP Debug" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- DC97290209A3E964005A68DF /* Default */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Default;
- };
- DC97290909A3E969005A68DF /* Build configuration list for PBXNativeTarget "DumpScannedXMP Release" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- DC97290A09A3E969005A68DF /* Default */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Default;
- };
- DC97292709A3EB4F005A68DF /* Build configuration list for PBXAggregateTarget "Build All" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- DC97292809A3EB4F005A68DF /* Default */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Default;
- };
- DCE615450951C75C001247EE /* Build configuration list for PBXNativeTarget "XMPCoreCoverage Release" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- DCE615460951C75C001247EE /* Default */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Default;
- };
- DCED0E60089E7E6E009B80AF /* Build configuration list for PBXNativeTarget "XMPCoreCoverage Debug" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- DCED0E63089E7E6E009B80AF /* Default */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Default;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
-}
diff --git a/samples/build/xcode/XMPSamples-Common.xcconfig b/samples/build/xcode2/XMPSamples-Common.xcconfig
index 53dcdb0..53dcdb0 100644
--- a/samples/build/xcode/XMPSamples-Common.xcconfig
+++ b/samples/build/xcode2/XMPSamples-Common.xcconfig
diff --git a/samples/build/xcode/XMPSamples-Debug.xcconfig b/samples/build/xcode2/XMPSamples-Debug.xcconfig
index 78a602e..78a602e 100644
--- a/samples/build/xcode/XMPSamples-Debug.xcconfig
+++ b/samples/build/xcode2/XMPSamples-Debug.xcconfig
diff --git a/samples/build/xcode/XMPSamples-Release.xcconfig b/samples/build/xcode2/XMPSamples-Release.xcconfig
index 87c599a..87c599a 100644
--- a/samples/build/xcode/XMPSamples-Release.xcconfig
+++ b/samples/build/xcode2/XMPSamples-Release.xcconfig
diff --git a/samples/build/xcode2/XMPSamples.xcodeproj/project.pbxproj b/samples/build/xcode2/XMPSamples.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..5ac220e
--- /dev/null
+++ b/samples/build/xcode2/XMPSamples.xcodeproj/project.pbxproj
@@ -0,0 +1,1761 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 42;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ DC97291609A3EACA005A68DF /* Build All */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = DC97292709A3EB4F005A68DF /* Build configuration list for PBXAggregateTarget "Build All" */;
+ buildPhases = (
+ );
+ dependencies = (
+ DC97291809A3EAD0005A68DF /* PBXTargetDependency */,
+ DC97291E09A3EB06005A68DF /* PBXTargetDependency */,
+ DC97292009A3EB0C005A68DF /* PBXTargetDependency */,
+ DC97292209A3EB12005A68DF /* PBXTargetDependency */,
+ 018882280B7C941400EECA52 /* PBXTargetDependency */,
+ 018882260B7C941400EECA52 /* PBXTargetDependency */,
+ 018882240B7C941400EECA52 /* PBXTargetDependency */,
+ 018882220B7C941400EECA52 /* PBXTargetDependency */,
+ 01C2B04E0E3A0681003F4586 /* PBXTargetDependency */,
+ 01C2B04C0E3A0681003F4586 /* PBXTargetDependency */,
+ 01C2B0520E3A0684003F4586 /* PBXTargetDependency */,
+ 01C2B0500E3A0684003F4586 /* PBXTargetDependency */,
+ 01C2B0810E3A0776003F4586 /* PBXTargetDependency */,
+ 01C2B07F0E3A0776003F4586 /* PBXTargetDependency */,
+ 01C2B07D0E3A0776003F4586 /* PBXTargetDependency */,
+ 01C2B07B0E3A0776003F4586 /* PBXTargetDependency */,
+ 01C2B09E0E3A081C003F4586 /* PBXTargetDependency */,
+ 01C2B09C0E3A081C003F4586 /* PBXTargetDependency */,
+ 01C2B0D30E3A0984003F4586 /* PBXTargetDependency */,
+ 01C2B0D10E3A0984003F4586 /* PBXTargetDependency */,
+ );
+ name = "Build All";
+ productName = "Build All";
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ 018881FF0B7C93A300EECA52 /* XMPFilesCoverage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 018881EE0B7C934100EECA52 /* XMPFilesCoverage.cpp */; };
+ 018882000B7C93A300EECA52 /* XMPFilesCoverage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 018881EE0B7C934100EECA52 /* XMPFilesCoverage.cpp */; };
+ 018882040B7C93AB00EECA52 /* XMPScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC97291309A3E9BF005A68DF /* XMPScanner.cpp */; };
+ 0188820D0B7C93AF00EECA52 /* XMPScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC97291309A3E9BF005A68DF /* XMPScanner.cpp */; };
+ 018882130B7C93EE00EECA52 /* DumpMainXMP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 018881ED0B7C934100EECA52 /* DumpMainXMP.cpp */; };
+ 018882140B7C93EF00EECA52 /* DumpMainXMP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 018881ED0B7C934100EECA52 /* DumpMainXMP.cpp */; };
+ 01C2AFDB0E3A023B003F4586 /* CustomSchema.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2AFDA0E3A023B003F4586 /* CustomSchema.cpp */; };
+ 01C2AFDC0E3A023B003F4586 /* CustomSchema.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2AFDA0E3A023B003F4586 /* CustomSchema.cpp */; };
+ 01C2AFF30E3A0398003F4586 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2AFF20E3A0398003F4586 /* main.cpp */; };
+ 01C2AFF40E3A0398003F4586 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2AFF20E3A0398003F4586 /* main.cpp */; };
+ 01C2B0300E3A04F9003F4586 /* DumpFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0220E3A04F9003F4586 /* DumpFile.cpp */; };
+ 01C2B0320E3A04F9003F4586 /* Log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0260E3A04F9003F4586 /* Log.cpp */; };
+ 01C2B0340E3A04F9003F4586 /* OutputUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B02A0E3A04F9003F4586 /* OutputUtils.cpp */; };
+ 01C2B0350E3A04F9003F4586 /* QEScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B02C0E3A04F9003F4586 /* QEScanner.cpp */; };
+ 01C2B0360E3A04F9003F4586 /* TagTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B02E0E3A04F9003F4586 /* TagTree.cpp */; };
+ 01C2B0380E3A04F9003F4586 /* DumpFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0220E3A04F9003F4586 /* DumpFile.cpp */; };
+ 01C2B03A0E3A04F9003F4586 /* Log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0260E3A04F9003F4586 /* Log.cpp */; };
+ 01C2B03C0E3A04F9003F4586 /* OutputUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B02A0E3A04F9003F4586 /* OutputUtils.cpp */; };
+ 01C2B03D0E3A04F9003F4586 /* QEScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B02C0E3A04F9003F4586 /* QEScanner.cpp */; };
+ 01C2B03E0E3A04F9003F4586 /* TagTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B02E0E3A04F9003F4586 /* TagTree.cpp */; };
+ 01C2B0410E3A0591003F4586 /* LargeFileAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B03F0E3A0523003F4586 /* LargeFileAccess.cpp */; };
+ 01C2B0420E3A0591003F4586 /* LargeFileAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B03F0E3A0523003F4586 /* LargeFileAccess.cpp */; };
+ 01C2B0780E3A076E003F4586 /* ReadingXMP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0770E3A076E003F4586 /* ReadingXMP.cpp */; };
+ 01C2B0790E3A076E003F4586 /* ReadingXMP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0770E3A076E003F4586 /* ReadingXMP.cpp */; };
+ 01C2B0960E3A07F5003F4586 /* ModifyingXMP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0740E3A0765003F4586 /* ModifyingXMP.cpp */; };
+ 01C2B0970E3A07F6003F4586 /* ModifyingXMP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0740E3A0765003F4586 /* ModifyingXMP.cpp */; };
+ 01C2B09A0E3A0805003F4586 /* XmpIterations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0980E3A0805003F4586 /* XmpIterations.cpp */; };
+ 01C2B0B20E3A08A3003F4586 /* XmpIterations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0980E3A0805003F4586 /* XmpIterations.cpp */; };
+ 01C2B0B90E3A08B3003F4586 /* Actions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0B50E3A08B3003F4586 /* Actions.cpp */; };
+ 01C2B0BA0E3A08B3003F4586 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0B70E3A08B3003F4586 /* main.cpp */; };
+ 01C2B0BB0E3A08B3003F4586 /* PrintUsage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0B80E3A08B3003F4586 /* PrintUsage.cpp */; };
+ 01C2B0BC0E3A08B3003F4586 /* Actions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0B50E3A08B3003F4586 /* Actions.cpp */; };
+ 01C2B0BD0E3A08B3003F4586 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0B70E3A08B3003F4586 /* main.cpp */; };
+ 01C2B0BE0E3A08B3003F4586 /* PrintUsage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0B80E3A08B3003F4586 /* PrintUsage.cpp */; };
+ 01C2B0C00E3A08DB003F4586 /* Log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0260E3A04F9003F4586 /* Log.cpp */; };
+ 01C2B0C10E3A08DC003F4586 /* Log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B0260E3A04F9003F4586 /* Log.cpp */; };
+ 01C2B0C20E3A08E8003F4586 /* LargeFileAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B03F0E3A0523003F4586 /* LargeFileAccess.cpp */; };
+ 01C2B0C30E3A08E9003F4586 /* LargeFileAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B03F0E3A0523003F4586 /* LargeFileAccess.cpp */; };
+ 01C2B0CB0E3A0947003F4586 /* OutputUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B02A0E3A04F9003F4586 /* OutputUtils.cpp */; };
+ 01C2B0CC0E3A0948003F4586 /* OutputUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 01C2B02A0E3A04F9003F4586 /* OutputUtils.cpp */; };
+ DC97291109A3E9B7005A68DF /* DumpScannedXMP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC97291009A3E9B7005A68DF /* DumpScannedXMP.cpp */; };
+ DC97291209A3E9B7005A68DF /* DumpScannedXMP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC97291009A3E9B7005A68DF /* DumpScannedXMP.cpp */; };
+ DC97291409A3E9BF005A68DF /* XMPScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC97291309A3E9BF005A68DF /* XMPScanner.cpp */; };
+ DC97291509A3E9BF005A68DF /* XMPScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DC97291309A3E9BF005A68DF /* XMPScanner.cpp */; };
+ DCE615430951C75C001247EE /* XMPCoreCoverage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DCF3A64D087F1D9000FEB713 /* XMPCoreCoverage.cpp */; };
+ DCED0E5D089E7E6E009B80AF /* XMPCoreCoverage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DCF3A64D087F1D9000FEB713 /* XMPCoreCoverage.cpp */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 018882210B7C941400EECA52 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 0188820A0B7C93AF00EECA52;
+ remoteInfo = "DumpMainXMP Release";
+ };
+ 018882230B7C941400EECA52 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 018882010B7C93AB00EECA52;
+ remoteInfo = "DumpMainXMP Debug";
+ };
+ 018882250B7C941400EECA52 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 018881F70B7C936A00EECA52;
+ remoteInfo = "XMPFilesCoverage Release";
+ };
+ 018882270B7C941400EECA52 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 018881EF0B7C935100EECA52;
+ remoteInfo = "XMPFilesCoverage Debug";
+ };
+ 01C2B04B0E3A0681003F4586 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 01C2AFD20E3A01F9003F4586;
+ remoteInfo = "CustomSchema Release";
+ };
+ 01C2B04D0E3A0681003F4586 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 01C2AFCA0E3A01F6003F4586;
+ remoteInfo = "CustomSchema Debug";
+ };
+ 01C2B04F0E3A0684003F4586 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 01C2AFEA0E3A0364003F4586;
+ remoteInfo = "Dumpfile Release";
+ };
+ 01C2B0510E3A0684003F4586 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 01C2AFE20E3A035E003F4586;
+ remoteInfo = "Dumpfile Debug";
+ };
+ 01C2B07A0E3A0776003F4586 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 01C2B06B0E3A06C4003F4586;
+ remoteInfo = "ModifyingXMP Release";
+ };
+ 01C2B07C0E3A0776003F4586 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 01C2B0630E3A06C4003F4586;
+ remoteInfo = "ModifyingXMP Debug";
+ };
+ 01C2B07E0E3A0776003F4586 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 01C2B05B0E3A069A003F4586;
+ remoteInfo = "ReadingXMP Release";
+ };
+ 01C2B0800E3A0776003F4586 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 01C2B0530E3A069A003F4586;
+ remoteInfo = "ReadingXMP Debug";
+ };
+ 01C2B09B0E3A081C003F4586 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 01C2B08E0E3A07A7003F4586;
+ remoteInfo = "XMPIterations Release";
+ };
+ 01C2B09D0E3A081C003F4586 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 01C2B0860E3A07A7003F4586;
+ remoteInfo = "XMPIterations Debug";
+ };
+ 01C2B0D00E3A0984003F4586 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 01C2B0AA0E3A084F003F4586;
+ remoteInfo = "XMPCommand Release";
+ };
+ 01C2B0D20E3A0984003F4586 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 01C2B0A20E3A084F003F4586;
+ remoteInfo = "XMPCommand Debug";
+ };
+ DC97291709A3EAD0005A68DF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = DCED0E5B089E7E6E009B80AF;
+ remoteInfo = "XMPCoverage Debug";
+ };
+ DC97291D09A3EB06005A68DF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = DCE615410951C75C001247EE;
+ remoteInfo = "XMPCoverage Release";
+ };
+ DC97291F09A3EB0C005A68DF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = DC9728FD09A3E964005A68DF;
+ remoteInfo = "DumpXMP Debug";
+ };
+ DC97292109A3EB12005A68DF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = DC97290509A3E969005A68DF;
+ remoteInfo = "DumpXMP Release";
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 018881ED0B7C934100EECA52 /* DumpMainXMP.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = DumpMainXMP.cpp; sourceTree = "<group>"; };
+ 018881EE0B7C934100EECA52 /* XMPFilesCoverage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XMPFilesCoverage.cpp; sourceTree = "<group>"; };
+ 018881F50B7C935100EECA52 /* XMPFilesCoverage */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = XMPFilesCoverage; sourceTree = BUILT_PRODUCTS_DIR; };
+ 018881FD0B7C936A00EECA52 /* XMPFilesCoverage */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = XMPFilesCoverage; sourceTree = BUILT_PRODUCTS_DIR; };
+ 018882080B7C93AB00EECA52 /* DumpMainXMP */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = DumpMainXMP; sourceTree = BUILT_PRODUCTS_DIR; };
+ 018882110B7C93AF00EECA52 /* DumpMainXMP */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = DumpMainXMP; sourceTree = BUILT_PRODUCTS_DIR; };
+ 01C2AFD00E3A01F6003F4586 /* CustomSchema */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = CustomSchema; sourceTree = BUILT_PRODUCTS_DIR; };
+ 01C2AFD80E3A01F9003F4586 /* CustomSchema */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = CustomSchema; sourceTree = BUILT_PRODUCTS_DIR; };
+ 01C2AFDA0E3A023B003F4586 /* CustomSchema.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CustomSchema.cpp; sourceTree = "<group>"; };
+ 01C2AFE80E3A035E003F4586 /* dumpfile */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dumpfile; sourceTree = BUILT_PRODUCTS_DIR; };
+ 01C2AFF00E3A0364003F4586 /* dumpfile */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dumpfile; sourceTree = BUILT_PRODUCTS_DIR; };
+ 01C2AFF20E3A0398003F4586 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = dumpfile/main.cpp; sourceTree = "<group>"; };
+ 01C2B01E0E3A04F9003F4586 /* TagTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TagTree.h; sourceTree = "<group>"; };
+ 01C2B01F0E3A04F9003F4586 /* globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = globals.h; sourceTree = "<group>"; };
+ 01C2B0220E3A04F9003F4586 /* DumpFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DumpFile.cpp; sourceTree = "<group>"; };
+ 01C2B0230E3A04F9003F4586 /* DumpFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DumpFile.h; sourceTree = "<group>"; };
+ 01C2B0260E3A04F9003F4586 /* Log.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Log.cpp; sourceTree = "<group>"; };
+ 01C2B0270E3A04F9003F4586 /* Log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Log.h; sourceTree = "<group>"; };
+ 01C2B02A0E3A04F9003F4586 /* OutputUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OutputUtils.cpp; sourceTree = "<group>"; };
+ 01C2B02B0E3A04F9003F4586 /* OutputUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OutputUtils.h; sourceTree = "<group>"; };
+ 01C2B02C0E3A04F9003F4586 /* QEScanner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QEScanner.cpp; sourceTree = "<group>"; };
+ 01C2B02D0E3A04F9003F4586 /* QEScanner.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = QEScanner.hpp; sourceTree = "<group>"; };
+ 01C2B02E0E3A04F9003F4586 /* TagTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TagTree.cpp; sourceTree = "<group>"; };
+ 01C2B03F0E3A0523003F4586 /* LargeFileAccess.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; name = LargeFileAccess.cpp; path = ../../../source/common/LargeFileAccess.cpp; sourceTree = "<group>"; };
+ 01C2B0400E3A0523003F4586 /* LargeFileAccess.hpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; name = LargeFileAccess.hpp; path = ../../../source/common/LargeFileAccess.hpp; sourceTree = "<group>"; };
+ 01C2B0590E3A069A003F4586 /* ReadingXMP */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ReadingXMP; sourceTree = BUILT_PRODUCTS_DIR; };
+ 01C2B0610E3A069A003F4586 /* ReadingXMP */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ReadingXMP; sourceTree = BUILT_PRODUCTS_DIR; };
+ 01C2B0690E3A06C4003F4586 /* ModifyingXMP */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ModifyingXMP; sourceTree = BUILT_PRODUCTS_DIR; };
+ 01C2B0710E3A06C4003F4586 /* ModifyingXMP */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ModifyingXMP; sourceTree = BUILT_PRODUCTS_DIR; };
+ 01C2B0740E3A0765003F4586 /* ModifyingXMP.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ModifyingXMP.cpp; sourceTree = "<group>"; };
+ 01C2B0770E3A076E003F4586 /* ReadingXMP.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReadingXMP.cpp; sourceTree = "<group>"; };
+ 01C2B08C0E3A07A7003F4586 /* XMPIterations */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = XMPIterations; sourceTree = BUILT_PRODUCTS_DIR; };
+ 01C2B0940E3A07A7003F4586 /* XMPIterations */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = XMPIterations; sourceTree = BUILT_PRODUCTS_DIR; };
+ 01C2B0980E3A0805003F4586 /* XmpIterations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XmpIterations.cpp; sourceTree = "<group>"; };
+ 01C2B0A80E3A084F003F4586 /* xmpcommand */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = xmpcommand; sourceTree = BUILT_PRODUCTS_DIR; };
+ 01C2B0B00E3A084F003F4586 /* xmpcommand */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = xmpcommand; sourceTree = BUILT_PRODUCTS_DIR; };
+ 01C2B0B40E3A08B3003F4586 /* PrintUsage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PrintUsage.h; path = xmpcommand/PrintUsage.h; sourceTree = "<group>"; };
+ 01C2B0B50E3A08B3003F4586 /* Actions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Actions.cpp; path = xmpcommand/Actions.cpp; sourceTree = "<group>"; };
+ 01C2B0B60E3A08B3003F4586 /* Actions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Actions.h; path = xmpcommand/Actions.h; sourceTree = "<group>"; };
+ 01C2B0B70E3A08B3003F4586 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = xmpcommand/main.cpp; sourceTree = "<group>"; };
+ 01C2B0B80E3A08B3003F4586 /* PrintUsage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PrintUsage.cpp; path = xmpcommand/PrintUsage.cpp; sourceTree = "<group>"; };
+ DC97290309A3E964005A68DF /* DumpScannedXMP */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = DumpScannedXMP; sourceTree = BUILT_PRODUCTS_DIR; };
+ DC97290B09A3E969005A68DF /* DumpScannedXMP */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = DumpScannedXMP; sourceTree = BUILT_PRODUCTS_DIR; };
+ DC97291009A3E9B7005A68DF /* DumpScannedXMP.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = DumpScannedXMP.cpp; sourceTree = "<group>"; };
+ DC97291309A3E9BF005A68DF /* XMPScanner.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XMPScanner.cpp; sourceTree = "<group>"; };
+ DCE400B00951CF710040D71F /* XMPSamples-Common.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; path = "XMPSamples-Common.xcconfig"; sourceTree = "<group>"; };
+ DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; path = "XMPSamples-Debug.xcconfig"; sourceTree = "<group>"; };
+ DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; path = "XMPSamples-Release.xcconfig"; sourceTree = "<group>"; };
+ DCE615470951C75C001247EE /* XMPCoreCoverage */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = XMPCoreCoverage; sourceTree = BUILT_PRODUCTS_DIR; };
+ DCED0E65089E7E6E009B80AF /* XMPCoreCoverage */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = XMPCoreCoverage; sourceTree = BUILT_PRODUCTS_DIR; };
+ DCF3A64D087F1D9000FEB713 /* XMPCoreCoverage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XMPCoreCoverage.cpp; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 018881F20B7C935100EECA52 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 018881FA0B7C936A00EECA52 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 018882050B7C93AB00EECA52 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 0188820E0B7C93AF00EECA52 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2AFCD0E3A01F6003F4586 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2AFD50E3A01F9003F4586 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2AFE50E3A035E003F4586 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2AFED0E3A0364003F4586 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2B0560E3A069A003F4586 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2B05E0E3A069A003F4586 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2B0660E3A06C4003F4586 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2B06E0E3A06C4003F4586 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2B0890E3A07A7003F4586 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2B0910E3A07A7003F4586 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2B0A50E3A084F003F4586 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2B0AD0E3A084F003F4586 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ DC97290009A3E964005A68DF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ DC97290809A3E969005A68DF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ DCE615440951C75C001247EE /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ DCED0E5E089E7E6E009B80AF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 01C2AFB40E39EAD6003F4586 /* XMPIterations */ = {
+ isa = PBXGroup;
+ children = (
+ 01C2B0980E3A0805003F4586 /* XmpIterations.cpp */,
+ );
+ name = XMPIterations;
+ sourceTree = "<group>";
+ };
+ 01C2AFB50E39EAD8003F4586 /* XMPFilesCoverage */ = {
+ isa = PBXGroup;
+ children = (
+ 018881EE0B7C934100EECA52 /* XMPFilesCoverage.cpp */,
+ );
+ name = XMPFilesCoverage;
+ sourceTree = "<group>";
+ };
+ 01C2AFB60E39EADB003F4586 /* XMPCoreCoverage */ = {
+ isa = PBXGroup;
+ children = (
+ DCF3A64D087F1D9000FEB713 /* XMPCoreCoverage.cpp */,
+ );
+ name = XMPCoreCoverage;
+ sourceTree = "<group>";
+ };
+ 01C2AFB70E39EADD003F4586 /* XMPCommand */ = {
+ isa = PBXGroup;
+ children = (
+ 01C2B0B40E3A08B3003F4586 /* PrintUsage.h */,
+ 01C2B0B50E3A08B3003F4586 /* Actions.cpp */,
+ 01C2B0B60E3A08B3003F4586 /* Actions.h */,
+ 01C2B0B70E3A08B3003F4586 /* main.cpp */,
+ 01C2B0B80E3A08B3003F4586 /* PrintUsage.cpp */,
+ );
+ name = XMPCommand;
+ sourceTree = "<group>";
+ };
+ 01C2AFB80E39EAF3003F4586 /* ReadingXMP */ = {
+ isa = PBXGroup;
+ children = (
+ 01C2B0770E3A076E003F4586 /* ReadingXMP.cpp */,
+ );
+ name = ReadingXMP;
+ sourceTree = "<group>";
+ };
+ 01C2AFB90E39EAF5003F4586 /* ModifyingXMP */ = {
+ isa = PBXGroup;
+ children = (
+ 01C2B0740E3A0765003F4586 /* ModifyingXMP.cpp */,
+ );
+ name = ModifyingXMP;
+ sourceTree = "<group>";
+ };
+ 01C2AFBA0E39EAFA003F4586 /* DumpScannedXMP */ = {
+ isa = PBXGroup;
+ children = (
+ DC97291309A3E9BF005A68DF /* XMPScanner.cpp */,
+ DC97291009A3E9B7005A68DF /* DumpScannedXMP.cpp */,
+ );
+ name = DumpScannedXMP;
+ sourceTree = "<group>";
+ };
+ 01C2AFBB0E39EAFD003F4586 /* DumpMainXMP */ = {
+ isa = PBXGroup;
+ children = (
+ 018881ED0B7C934100EECA52 /* DumpMainXMP.cpp */,
+ );
+ name = DumpMainXMP;
+ sourceTree = "<group>";
+ };
+ 01C2AFBC0E39EAFF003F4586 /* DumpFile */ = {
+ isa = PBXGroup;
+ children = (
+ 01C2AFF20E3A0398003F4586 /* main.cpp */,
+ );
+ name = DumpFile;
+ sourceTree = "<group>";
+ };
+ 01C2AFBD0E39EB01003F4586 /* CustomSchema */ = {
+ isa = PBXGroup;
+ children = (
+ 01C2AFDA0E3A023B003F4586 /* CustomSchema.cpp */,
+ );
+ name = CustomSchema;
+ sourceTree = "<group>";
+ };
+ 01C2AFF60E3A03F3003F4586 /* common */ = {
+ isa = PBXGroup;
+ children = (
+ 01C2B03F0E3A0523003F4586 /* LargeFileAccess.cpp */,
+ 01C2B0400E3A0523003F4586 /* LargeFileAccess.hpp */,
+ 01C2B01E0E3A04F9003F4586 /* TagTree.h */,
+ 01C2B01F0E3A04F9003F4586 /* globals.h */,
+ 01C2B0220E3A04F9003F4586 /* DumpFile.cpp */,
+ 01C2B0230E3A04F9003F4586 /* DumpFile.h */,
+ 01C2B0260E3A04F9003F4586 /* Log.cpp */,
+ 01C2B0270E3A04F9003F4586 /* Log.h */,
+ 01C2B02A0E3A04F9003F4586 /* OutputUtils.cpp */,
+ 01C2B02B0E3A04F9003F4586 /* OutputUtils.h */,
+ 01C2B02C0E3A04F9003F4586 /* QEScanner.cpp */,
+ 01C2B02D0E3A04F9003F4586 /* QEScanner.hpp */,
+ 01C2B02E0E3A04F9003F4586 /* TagTree.cpp */,
+ );
+ path = common;
+ sourceTree = "<group>";
+ };
+ 08FB7794FE84155DC02AAC07 /* XMPCoverage */ = {
+ isa = PBXGroup;
+ children = (
+ 08FB7795FE84155DC02AAC07 /* Source */,
+ DCE4006D0951CC850040D71F /* Build Extras */,
+ 1AB674ADFE9D54B511CA2CBB /* Products */,
+ );
+ name = XMPCoverage;
+ sourceTree = "<group>";
+ };
+ 08FB7795FE84155DC02AAC07 /* Source */ = {
+ isa = PBXGroup;
+ children = (
+ 01C2AFF60E3A03F3003F4586 /* common */,
+ 01C2AFBD0E39EB01003F4586 /* CustomSchema */,
+ 01C2AFBC0E39EAFF003F4586 /* DumpFile */,
+ 01C2AFBB0E39EAFD003F4586 /* DumpMainXMP */,
+ 01C2AFBA0E39EAFA003F4586 /* DumpScannedXMP */,
+ 01C2AFB90E39EAF5003F4586 /* ModifyingXMP */,
+ 01C2AFB80E39EAF3003F4586 /* ReadingXMP */,
+ 01C2AFB70E39EADD003F4586 /* XMPCommand */,
+ 01C2AFB60E39EADB003F4586 /* XMPCoreCoverage */,
+ 01C2AFB50E39EAD8003F4586 /* XMPFilesCoverage */,
+ 01C2AFB40E39EAD6003F4586 /* XMPIterations */,
+ );
+ name = Source;
+ path = ../../source;
+ sourceTree = "<group>";
+ };
+ 1AB674ADFE9D54B511CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ DCED0E65089E7E6E009B80AF /* XMPCoreCoverage */,
+ DCE615470951C75C001247EE /* XMPCoreCoverage */,
+ DC97290309A3E964005A68DF /* DumpScannedXMP */,
+ DC97290B09A3E969005A68DF /* DumpScannedXMP */,
+ 018881F50B7C935100EECA52 /* XMPFilesCoverage */,
+ 018881FD0B7C936A00EECA52 /* XMPFilesCoverage */,
+ 018882080B7C93AB00EECA52 /* DumpMainXMP */,
+ 018882110B7C93AF00EECA52 /* DumpMainXMP */,
+ 01C2AFD00E3A01F6003F4586 /* CustomSchema */,
+ 01C2AFD80E3A01F9003F4586 /* CustomSchema */,
+ 01C2AFE80E3A035E003F4586 /* dumpfile */,
+ 01C2AFF00E3A0364003F4586 /* dumpfile */,
+ 01C2B0590E3A069A003F4586 /* ReadingXMP */,
+ 01C2B0610E3A069A003F4586 /* ReadingXMP */,
+ 01C2B0690E3A06C4003F4586 /* ModifyingXMP */,
+ 01C2B0710E3A06C4003F4586 /* ModifyingXMP */,
+ 01C2B08C0E3A07A7003F4586 /* XMPIterations */,
+ 01C2B0940E3A07A7003F4586 /* XMPIterations */,
+ 01C2B0A80E3A084F003F4586 /* xmpcommand */,
+ 01C2B0B00E3A084F003F4586 /* xmpcommand */,
+ );
+ name = Products;
+ path = ../..;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ DCE4006D0951CC850040D71F /* Build Extras */ = {
+ isa = PBXGroup;
+ children = (
+ DCE400B00951CF710040D71F /* XMPSamples-Common.xcconfig */,
+ DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */,
+ DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */,
+ );
+ name = "Build Extras";
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 018881EF0B7C935100EECA52 /* XMPFilesCoverage Debug */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 018881F30B7C935100EECA52 /* Build configuration list for PBXNativeTarget "XMPFilesCoverage Debug" */;
+ buildPhases = (
+ 018881F00B7C935100EECA52 /* Sources */,
+ 018881F20B7C935100EECA52 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "XMPFilesCoverage Debug";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = 018881F50B7C935100EECA52 /* XMPFilesCoverage */;
+ productType = "com.apple.product-type.tool";
+ };
+ 018881F70B7C936A00EECA52 /* XMPFilesCoverage Release */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 018881FB0B7C936A00EECA52 /* Build configuration list for PBXNativeTarget "XMPFilesCoverage Release" */;
+ buildPhases = (
+ 018881F80B7C936A00EECA52 /* Sources */,
+ 018881FA0B7C936A00EECA52 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "XMPFilesCoverage Release";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = 018881FD0B7C936A00EECA52 /* XMPFilesCoverage */;
+ productType = "com.apple.product-type.tool";
+ };
+ 018882010B7C93AB00EECA52 /* DumpMainXMP Debug */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 018882060B7C93AB00EECA52 /* Build configuration list for PBXNativeTarget "DumpMainXMP Debug" */;
+ buildPhases = (
+ 018882020B7C93AB00EECA52 /* Sources */,
+ 018882050B7C93AB00EECA52 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "DumpMainXMP Debug";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = 018882080B7C93AB00EECA52 /* DumpMainXMP */;
+ productType = "com.apple.product-type.tool";
+ };
+ 0188820A0B7C93AF00EECA52 /* DumpMainXMP Release */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 0188820F0B7C93AF00EECA52 /* Build configuration list for PBXNativeTarget "DumpMainXMP Release" */;
+ buildPhases = (
+ 0188820B0B7C93AF00EECA52 /* Sources */,
+ 0188820E0B7C93AF00EECA52 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "DumpMainXMP Release";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = 018882110B7C93AF00EECA52 /* DumpMainXMP */;
+ productType = "com.apple.product-type.tool";
+ };
+ 01C2AFCA0E3A01F6003F4586 /* CustomSchema Debug */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 01C2AFCE0E3A01F6003F4586 /* Build configuration list for PBXNativeTarget "CustomSchema Debug" */;
+ buildPhases = (
+ 01C2AFCB0E3A01F6003F4586 /* Sources */,
+ 01C2AFCD0E3A01F6003F4586 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "CustomSchema Debug";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = 01C2AFD00E3A01F6003F4586 /* CustomSchema */;
+ productType = "com.apple.product-type.tool";
+ };
+ 01C2AFD20E3A01F9003F4586 /* CustomSchema Release */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 01C2AFD60E3A01F9003F4586 /* Build configuration list for PBXNativeTarget "CustomSchema Release" */;
+ buildPhases = (
+ 01C2AFD30E3A01F9003F4586 /* Sources */,
+ 01C2AFD50E3A01F9003F4586 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "CustomSchema Release";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = 01C2AFD80E3A01F9003F4586 /* CustomSchema */;
+ productType = "com.apple.product-type.tool";
+ };
+ 01C2AFE20E3A035E003F4586 /* Dumpfile Debug */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 01C2AFE60E3A035E003F4586 /* Build configuration list for PBXNativeTarget "Dumpfile Debug" */;
+ buildPhases = (
+ 01C2AFE30E3A035E003F4586 /* Sources */,
+ 01C2AFE50E3A035E003F4586 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Dumpfile Debug";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = 01C2AFE80E3A035E003F4586 /* dumpfile */;
+ productType = "com.apple.product-type.tool";
+ };
+ 01C2AFEA0E3A0364003F4586 /* Dumpfile Release */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 01C2AFEE0E3A0364003F4586 /* Build configuration list for PBXNativeTarget "Dumpfile Release" */;
+ buildPhases = (
+ 01C2AFEB0E3A0364003F4586 /* Sources */,
+ 01C2AFED0E3A0364003F4586 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Dumpfile Release";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = 01C2AFF00E3A0364003F4586 /* dumpfile */;
+ productType = "com.apple.product-type.tool";
+ };
+ 01C2B0530E3A069A003F4586 /* ReadingXMP Debug */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 01C2B0570E3A069A003F4586 /* Build configuration list for PBXNativeTarget "ReadingXMP Debug" */;
+ buildPhases = (
+ 01C2B0540E3A069A003F4586 /* Sources */,
+ 01C2B0560E3A069A003F4586 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "ReadingXMP Debug";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = 01C2B0590E3A069A003F4586 /* ReadingXMP */;
+ productType = "com.apple.product-type.tool";
+ };
+ 01C2B05B0E3A069A003F4586 /* ReadingXMP Release */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 01C2B05F0E3A069A003F4586 /* Build configuration list for PBXNativeTarget "ReadingXMP Release" */;
+ buildPhases = (
+ 01C2B05C0E3A069A003F4586 /* Sources */,
+ 01C2B05E0E3A069A003F4586 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "ReadingXMP Release";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = 01C2B0610E3A069A003F4586 /* ReadingXMP */;
+ productType = "com.apple.product-type.tool";
+ };
+ 01C2B0630E3A06C4003F4586 /* ModifyingXMP Debug */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 01C2B0670E3A06C4003F4586 /* Build configuration list for PBXNativeTarget "ModifyingXMP Debug" */;
+ buildPhases = (
+ 01C2B0640E3A06C4003F4586 /* Sources */,
+ 01C2B0660E3A06C4003F4586 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "ModifyingXMP Debug";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = 01C2B0690E3A06C4003F4586 /* ModifyingXMP */;
+ productType = "com.apple.product-type.tool";
+ };
+ 01C2B06B0E3A06C4003F4586 /* ModifyingXMP Release */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 01C2B06F0E3A06C4003F4586 /* Build configuration list for PBXNativeTarget "ModifyingXMP Release" */;
+ buildPhases = (
+ 01C2B06C0E3A06C4003F4586 /* Sources */,
+ 01C2B06E0E3A06C4003F4586 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "ModifyingXMP Release";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = 01C2B0710E3A06C4003F4586 /* ModifyingXMP */;
+ productType = "com.apple.product-type.tool";
+ };
+ 01C2B0860E3A07A7003F4586 /* XMPIterations Debug */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 01C2B08A0E3A07A7003F4586 /* Build configuration list for PBXNativeTarget "XMPIterations Debug" */;
+ buildPhases = (
+ 01C2B0870E3A07A7003F4586 /* Sources */,
+ 01C2B0890E3A07A7003F4586 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "XMPIterations Debug";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = 01C2B08C0E3A07A7003F4586 /* XMPIterations */;
+ productType = "com.apple.product-type.tool";
+ };
+ 01C2B08E0E3A07A7003F4586 /* XMPIterations Release */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 01C2B0920E3A07A7003F4586 /* Build configuration list for PBXNativeTarget "XMPIterations Release" */;
+ buildPhases = (
+ 01C2B08F0E3A07A7003F4586 /* Sources */,
+ 01C2B0910E3A07A7003F4586 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "XMPIterations Release";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = 01C2B0940E3A07A7003F4586 /* XMPIterations */;
+ productType = "com.apple.product-type.tool";
+ };
+ 01C2B0A20E3A084F003F4586 /* XMPCommand Debug */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 01C2B0A60E3A084F003F4586 /* Build configuration list for PBXNativeTarget "XMPCommand Debug" */;
+ buildPhases = (
+ 01C2B0A30E3A084F003F4586 /* Sources */,
+ 01C2B0A50E3A084F003F4586 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "XMPCommand Debug";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = 01C2B0A80E3A084F003F4586 /* xmpcommand */;
+ productType = "com.apple.product-type.tool";
+ };
+ 01C2B0AA0E3A084F003F4586 /* XMPCommand Release */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 01C2B0AE0E3A084F003F4586 /* Build configuration list for PBXNativeTarget "XMPCommand Release" */;
+ buildPhases = (
+ 01C2B0AB0E3A084F003F4586 /* Sources */,
+ 01C2B0AD0E3A084F003F4586 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "XMPCommand Release";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = 01C2B0B00E3A084F003F4586 /* xmpcommand */;
+ productType = "com.apple.product-type.tool";
+ };
+ DC9728FD09A3E964005A68DF /* DumpScannedXMP Debug */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DC97290109A3E964005A68DF /* Build configuration list for PBXNativeTarget "DumpScannedXMP Debug" */;
+ buildPhases = (
+ DC9728FE09A3E964005A68DF /* Sources */,
+ DC97290009A3E964005A68DF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "DumpScannedXMP Debug";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = DC97290309A3E964005A68DF /* DumpScannedXMP */;
+ productType = "com.apple.product-type.tool";
+ };
+ DC97290509A3E969005A68DF /* DumpScannedXMP Release */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DC97290909A3E969005A68DF /* Build configuration list for PBXNativeTarget "DumpScannedXMP Release" */;
+ buildPhases = (
+ DC97290609A3E969005A68DF /* Sources */,
+ DC97290809A3E969005A68DF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "DumpScannedXMP Release";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = DC97290B09A3E969005A68DF /* DumpScannedXMP */;
+ productType = "com.apple.product-type.tool";
+ };
+ DCE615410951C75C001247EE /* XMPCoreCoverage Release */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DCE615450951C75C001247EE /* Build configuration list for PBXNativeTarget "XMPCoreCoverage Release" */;
+ buildPhases = (
+ DCE615420951C75C001247EE /* Sources */,
+ DCE615440951C75C001247EE /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "XMPCoreCoverage Release";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = DCE615470951C75C001247EE /* XMPCoreCoverage */;
+ productType = "com.apple.product-type.tool";
+ };
+ DCED0E5B089E7E6E009B80AF /* XMPCoreCoverage Debug */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DCED0E60089E7E6E009B80AF /* Build configuration list for PBXNativeTarget "XMPCoreCoverage Debug" */;
+ buildPhases = (
+ DCED0E5C089E7E6E009B80AF /* Sources */,
+ DCED0E5E089E7E6E009B80AF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "XMPCoreCoverage Debug";
+ productInstallPath = "$(HOME)/bin";
+ productName = XMPCoverage;
+ productReference = DCED0E65089E7E6E009B80AF /* XMPCoreCoverage */;
+ productType = "com.apple.product-type.tool";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 08FB7793FE84155DC02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = DC47BE960871F34F0088D201 /* Build configuration list for PBXProject "XMPSamples" */;
+ compatibilityVersion = "Xcode 2.4";
+ hasScannedForEncodings = 1;
+ mainGroup = 08FB7794FE84155DC02AAC07 /* XMPCoverage */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ DC97291609A3EACA005A68DF /* Build All */,
+ DCED0E5B089E7E6E009B80AF /* XMPCoreCoverage Debug */,
+ DCE615410951C75C001247EE /* XMPCoreCoverage Release */,
+ DC9728FD09A3E964005A68DF /* DumpScannedXMP Debug */,
+ DC97290509A3E969005A68DF /* DumpScannedXMP Release */,
+ 018881EF0B7C935100EECA52 /* XMPFilesCoverage Debug */,
+ 018881F70B7C936A00EECA52 /* XMPFilesCoverage Release */,
+ 018882010B7C93AB00EECA52 /* DumpMainXMP Debug */,
+ 0188820A0B7C93AF00EECA52 /* DumpMainXMP Release */,
+ 01C2AFCA0E3A01F6003F4586 /* CustomSchema Debug */,
+ 01C2AFD20E3A01F9003F4586 /* CustomSchema Release */,
+ 01C2AFE20E3A035E003F4586 /* Dumpfile Debug */,
+ 01C2AFEA0E3A0364003F4586 /* Dumpfile Release */,
+ 01C2B0530E3A069A003F4586 /* ReadingXMP Debug */,
+ 01C2B05B0E3A069A003F4586 /* ReadingXMP Release */,
+ 01C2B0630E3A06C4003F4586 /* ModifyingXMP Debug */,
+ 01C2B06B0E3A06C4003F4586 /* ModifyingXMP Release */,
+ 01C2B0860E3A07A7003F4586 /* XMPIterations Debug */,
+ 01C2B08E0E3A07A7003F4586 /* XMPIterations Release */,
+ 01C2B0A20E3A084F003F4586 /* XMPCommand Debug */,
+ 01C2B0AA0E3A084F003F4586 /* XMPCommand Release */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 018881F00B7C935100EECA52 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 018881FF0B7C93A300EECA52 /* XMPFilesCoverage.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 018881F80B7C936A00EECA52 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 018882000B7C93A300EECA52 /* XMPFilesCoverage.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 018882020B7C93AB00EECA52 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 018882040B7C93AB00EECA52 /* XMPScanner.cpp in Sources */,
+ 018882130B7C93EE00EECA52 /* DumpMainXMP.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 0188820B0B7C93AF00EECA52 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0188820D0B7C93AF00EECA52 /* XMPScanner.cpp in Sources */,
+ 018882140B7C93EF00EECA52 /* DumpMainXMP.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2AFCB0E3A01F6003F4586 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 01C2AFDC0E3A023B003F4586 /* CustomSchema.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2AFD30E3A01F9003F4586 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 01C2AFDB0E3A023B003F4586 /* CustomSchema.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2AFE30E3A035E003F4586 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 01C2AFF30E3A0398003F4586 /* main.cpp in Sources */,
+ 01C2B0300E3A04F9003F4586 /* DumpFile.cpp in Sources */,
+ 01C2B0320E3A04F9003F4586 /* Log.cpp in Sources */,
+ 01C2B0340E3A04F9003F4586 /* OutputUtils.cpp in Sources */,
+ 01C2B0350E3A04F9003F4586 /* QEScanner.cpp in Sources */,
+ 01C2B0360E3A04F9003F4586 /* TagTree.cpp in Sources */,
+ 01C2B0420E3A0591003F4586 /* LargeFileAccess.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2AFEB0E3A0364003F4586 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 01C2AFF40E3A0398003F4586 /* main.cpp in Sources */,
+ 01C2B0380E3A04F9003F4586 /* DumpFile.cpp in Sources */,
+ 01C2B03A0E3A04F9003F4586 /* Log.cpp in Sources */,
+ 01C2B03C0E3A04F9003F4586 /* OutputUtils.cpp in Sources */,
+ 01C2B03D0E3A04F9003F4586 /* QEScanner.cpp in Sources */,
+ 01C2B03E0E3A04F9003F4586 /* TagTree.cpp in Sources */,
+ 01C2B0410E3A0591003F4586 /* LargeFileAccess.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2B0540E3A069A003F4586 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 01C2B0790E3A076E003F4586 /* ReadingXMP.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2B05C0E3A069A003F4586 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 01C2B0780E3A076E003F4586 /* ReadingXMP.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2B0640E3A06C4003F4586 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 01C2B0970E3A07F6003F4586 /* ModifyingXMP.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2B06C0E3A06C4003F4586 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 01C2B0960E3A07F5003F4586 /* ModifyingXMP.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2B0870E3A07A7003F4586 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 01C2B09A0E3A0805003F4586 /* XmpIterations.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2B08F0E3A07A7003F4586 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 01C2B0B20E3A08A3003F4586 /* XmpIterations.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2B0A30E3A084F003F4586 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 01C2B0B90E3A08B3003F4586 /* Actions.cpp in Sources */,
+ 01C2B0BA0E3A08B3003F4586 /* main.cpp in Sources */,
+ 01C2B0BB0E3A08B3003F4586 /* PrintUsage.cpp in Sources */,
+ 01C2B0C10E3A08DC003F4586 /* Log.cpp in Sources */,
+ 01C2B0C20E3A08E8003F4586 /* LargeFileAccess.cpp in Sources */,
+ 01C2B0CB0E3A0947003F4586 /* OutputUtils.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 01C2B0AB0E3A084F003F4586 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 01C2B0BC0E3A08B3003F4586 /* Actions.cpp in Sources */,
+ 01C2B0BD0E3A08B3003F4586 /* main.cpp in Sources */,
+ 01C2B0BE0E3A08B3003F4586 /* PrintUsage.cpp in Sources */,
+ 01C2B0C00E3A08DB003F4586 /* Log.cpp in Sources */,
+ 01C2B0C30E3A08E9003F4586 /* LargeFileAccess.cpp in Sources */,
+ 01C2B0CC0E3A0948003F4586 /* OutputUtils.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ DC9728FE09A3E964005A68DF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DC97291109A3E9B7005A68DF /* DumpScannedXMP.cpp in Sources */,
+ DC97291409A3E9BF005A68DF /* XMPScanner.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ DC97290609A3E969005A68DF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DC97291209A3E9B7005A68DF /* DumpScannedXMP.cpp in Sources */,
+ DC97291509A3E9BF005A68DF /* XMPScanner.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ DCE615420951C75C001247EE /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DCE615430951C75C001247EE /* XMPCoreCoverage.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ DCED0E5C089E7E6E009B80AF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DCED0E5D089E7E6E009B80AF /* XMPCoreCoverage.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 018882220B7C941400EECA52 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 0188820A0B7C93AF00EECA52 /* DumpMainXMP Release */;
+ targetProxy = 018882210B7C941400EECA52 /* PBXContainerItemProxy */;
+ };
+ 018882240B7C941400EECA52 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 018882010B7C93AB00EECA52 /* DumpMainXMP Debug */;
+ targetProxy = 018882230B7C941400EECA52 /* PBXContainerItemProxy */;
+ };
+ 018882260B7C941400EECA52 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 018881F70B7C936A00EECA52 /* XMPFilesCoverage Release */;
+ targetProxy = 018882250B7C941400EECA52 /* PBXContainerItemProxy */;
+ };
+ 018882280B7C941400EECA52 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 018881EF0B7C935100EECA52 /* XMPFilesCoverage Debug */;
+ targetProxy = 018882270B7C941400EECA52 /* PBXContainerItemProxy */;
+ };
+ 01C2B04C0E3A0681003F4586 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 01C2AFD20E3A01F9003F4586 /* CustomSchema Release */;
+ targetProxy = 01C2B04B0E3A0681003F4586 /* PBXContainerItemProxy */;
+ };
+ 01C2B04E0E3A0681003F4586 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 01C2AFCA0E3A01F6003F4586 /* CustomSchema Debug */;
+ targetProxy = 01C2B04D0E3A0681003F4586 /* PBXContainerItemProxy */;
+ };
+ 01C2B0500E3A0684003F4586 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 01C2AFEA0E3A0364003F4586 /* Dumpfile Release */;
+ targetProxy = 01C2B04F0E3A0684003F4586 /* PBXContainerItemProxy */;
+ };
+ 01C2B0520E3A0684003F4586 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 01C2AFE20E3A035E003F4586 /* Dumpfile Debug */;
+ targetProxy = 01C2B0510E3A0684003F4586 /* PBXContainerItemProxy */;
+ };
+ 01C2B07B0E3A0776003F4586 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 01C2B06B0E3A06C4003F4586 /* ModifyingXMP Release */;
+ targetProxy = 01C2B07A0E3A0776003F4586 /* PBXContainerItemProxy */;
+ };
+ 01C2B07D0E3A0776003F4586 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 01C2B0630E3A06C4003F4586 /* ModifyingXMP Debug */;
+ targetProxy = 01C2B07C0E3A0776003F4586 /* PBXContainerItemProxy */;
+ };
+ 01C2B07F0E3A0776003F4586 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 01C2B05B0E3A069A003F4586 /* ReadingXMP Release */;
+ targetProxy = 01C2B07E0E3A0776003F4586 /* PBXContainerItemProxy */;
+ };
+ 01C2B0810E3A0776003F4586 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 01C2B0530E3A069A003F4586 /* ReadingXMP Debug */;
+ targetProxy = 01C2B0800E3A0776003F4586 /* PBXContainerItemProxy */;
+ };
+ 01C2B09C0E3A081C003F4586 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 01C2B08E0E3A07A7003F4586 /* XMPIterations Release */;
+ targetProxy = 01C2B09B0E3A081C003F4586 /* PBXContainerItemProxy */;
+ };
+ 01C2B09E0E3A081C003F4586 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 01C2B0860E3A07A7003F4586 /* XMPIterations Debug */;
+ targetProxy = 01C2B09D0E3A081C003F4586 /* PBXContainerItemProxy */;
+ };
+ 01C2B0D10E3A0984003F4586 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 01C2B0AA0E3A084F003F4586 /* XMPCommand Release */;
+ targetProxy = 01C2B0D00E3A0984003F4586 /* PBXContainerItemProxy */;
+ };
+ 01C2B0D30E3A0984003F4586 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 01C2B0A20E3A084F003F4586 /* XMPCommand Debug */;
+ targetProxy = 01C2B0D20E3A0984003F4586 /* PBXContainerItemProxy */;
+ };
+ DC97291809A3EAD0005A68DF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = DCED0E5B089E7E6E009B80AF /* XMPCoreCoverage Debug */;
+ targetProxy = DC97291709A3EAD0005A68DF /* PBXContainerItemProxy */;
+ };
+ DC97291E09A3EB06005A68DF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = DCE615410951C75C001247EE /* XMPCoreCoverage Release */;
+ targetProxy = DC97291D09A3EB06005A68DF /* PBXContainerItemProxy */;
+ };
+ DC97292009A3EB0C005A68DF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = DC9728FD09A3E964005A68DF /* DumpScannedXMP Debug */;
+ targetProxy = DC97291F09A3EB0C005A68DF /* PBXContainerItemProxy */;
+ };
+ DC97292209A3EB12005A68DF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = DC97290509A3E969005A68DF /* DumpScannedXMP Release */;
+ targetProxy = DC97292109A3EB12005A68DF /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 018881F40B7C935100EECA52 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
+ "-framework",
+ Carbon,
+ "-framework",
+ QuickTime,
+ );
+ PRODUCT_NAME = XMPFilesCoverage;
+ };
+ name = Default;
+ };
+ 018881FC0B7C936A00EECA52 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
+ "-framework",
+ Carbon,
+ "-framework",
+ QuickTime,
+ );
+ PRODUCT_NAME = XMPFilesCoverage;
+ };
+ name = Default;
+ };
+ 018882070B7C93AB00EECA52 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
+ "-framework",
+ Carbon,
+ "-framework",
+ QuickTime,
+ );
+ PRODUCT_NAME = DumpMainXMP;
+ };
+ name = Default;
+ };
+ 018882100B7C93AF00EECA52 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
+ "-framework",
+ Carbon,
+ "-framework",
+ QuickTime,
+ );
+ PRODUCT_NAME = DumpMainXMP;
+ };
+ name = Default;
+ };
+ 01C2AFCF0E3A01F6003F4586 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
+ "-framework",
+ Carbon,
+ "-framework",
+ QuickTime,
+ );
+ PRODUCT_NAME = CustomSchema;
+ };
+ name = Default;
+ };
+ 01C2AFD70E3A01F9003F4586 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
+ "-framework",
+ Carbon,
+ "-framework",
+ QuickTime,
+ );
+ PRODUCT_NAME = CustomSchema;
+ };
+ name = Default;
+ };
+ 01C2AFE70E3A035E003F4586 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
+ "-framework",
+ Carbon,
+ "-framework",
+ QuickTime,
+ );
+ PRODUCT_NAME = dumpfile;
+ };
+ name = Default;
+ };
+ 01C2AFEF0E3A0364003F4586 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
+ "-framework",
+ Carbon,
+ "-framework",
+ QuickTime,
+ );
+ PRODUCT_NAME = dumpfile;
+ };
+ name = Default;
+ };
+ 01C2B0580E3A069A003F4586 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
+ "-framework",
+ Carbon,
+ "-framework",
+ QuickTime,
+ );
+ PRODUCT_NAME = ReadingXMP;
+ };
+ name = Default;
+ };
+ 01C2B0600E3A069A003F4586 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
+ "-framework",
+ Carbon,
+ "-framework",
+ QuickTime,
+ );
+ PRODUCT_NAME = ReadingXMP;
+ };
+ name = Default;
+ };
+ 01C2B0680E3A06C4003F4586 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
+ "-framework",
+ Carbon,
+ "-framework",
+ QuickTime,
+ );
+ PRODUCT_NAME = ModifyingXMP;
+ };
+ name = Default;
+ };
+ 01C2B0700E3A06C4003F4586 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
+ "-framework",
+ Carbon,
+ "-framework",
+ QuickTime,
+ );
+ PRODUCT_NAME = ModifyingXMP;
+ };
+ name = Default;
+ };
+ 01C2B08B0E3A07A7003F4586 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
+ "-framework",
+ Carbon,
+ "-framework",
+ QuickTime,
+ );
+ PRODUCT_NAME = XMPIterations;
+ };
+ name = Default;
+ };
+ 01C2B0930E3A07A7003F4586 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
+ "-framework",
+ Carbon,
+ "-framework",
+ QuickTime,
+ );
+ PRODUCT_NAME = XMPIterations;
+ };
+ name = Default;
+ };
+ 01C2B0A70E3A084F003F4586 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
+ "-framework",
+ Carbon,
+ "-framework",
+ QuickTime,
+ );
+ PRODUCT_NAME = xmpcommand;
+ };
+ name = Default;
+ };
+ 01C2B0AF0E3A084F003F4586 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPCore${LIB_SUFFIX}.a",
+ "${XMP_ROOT}/libraries/macintosh/${BUILD_MODE}/libXMPFiles${LIB_SUFFIX}.a",
+ "-framework",
+ Carbon,
+ "-framework",
+ QuickTime,
+ );
+ PRODUCT_NAME = xmpcommand;
+ };
+ name = Default;
+ };
+ DC47BE980871F34F0088D201 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B00951CF710040D71F /* XMPSamples-Common.xcconfig */;
+ buildSettings = {
+ };
+ name = Default;
+ };
+ DC97290209A3E964005A68DF /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */;
+ buildSettings = {
+ PRODUCT_NAME = DumpScannedXMP;
+ };
+ name = Default;
+ };
+ DC97290A09A3E969005A68DF /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */;
+ buildSettings = {
+ PRODUCT_NAME = DumpScannedXMP;
+ };
+ name = Default;
+ };
+ DC97292809A3EB4F005A68DF /* Default */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "Build All";
+ };
+ name = Default;
+ };
+ DCE615460951C75C001247EE /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B20951CF710040D71F /* XMPSamples-Release.xcconfig */;
+ buildSettings = {
+ PRODUCT_NAME = XMPCoreCoverage;
+ };
+ name = Default;
+ };
+ DCED0E63089E7E6E009B80AF /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = DCE400B10951CF710040D71F /* XMPSamples-Debug.xcconfig */;
+ buildSettings = {
+ PRODUCT_NAME = XMPCoreCoverage;
+ };
+ name = Default;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 018881F30B7C935100EECA52 /* Build configuration list for PBXNativeTarget "XMPFilesCoverage Debug" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 018881F40B7C935100EECA52 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 018881FB0B7C936A00EECA52 /* Build configuration list for PBXNativeTarget "XMPFilesCoverage Release" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 018881FC0B7C936A00EECA52 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 018882060B7C93AB00EECA52 /* Build configuration list for PBXNativeTarget "DumpMainXMP Debug" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 018882070B7C93AB00EECA52 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 0188820F0B7C93AF00EECA52 /* Build configuration list for PBXNativeTarget "DumpMainXMP Release" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 018882100B7C93AF00EECA52 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 01C2AFCE0E3A01F6003F4586 /* Build configuration list for PBXNativeTarget "CustomSchema Debug" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 01C2AFCF0E3A01F6003F4586 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 01C2AFD60E3A01F9003F4586 /* Build configuration list for PBXNativeTarget "CustomSchema Release" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 01C2AFD70E3A01F9003F4586 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 01C2AFE60E3A035E003F4586 /* Build configuration list for PBXNativeTarget "Dumpfile Debug" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 01C2AFE70E3A035E003F4586 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 01C2AFEE0E3A0364003F4586 /* Build configuration list for PBXNativeTarget "Dumpfile Release" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 01C2AFEF0E3A0364003F4586 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 01C2B0570E3A069A003F4586 /* Build configuration list for PBXNativeTarget "ReadingXMP Debug" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 01C2B0580E3A069A003F4586 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 01C2B05F0E3A069A003F4586 /* Build configuration list for PBXNativeTarget "ReadingXMP Release" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 01C2B0600E3A069A003F4586 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 01C2B0670E3A06C4003F4586 /* Build configuration list for PBXNativeTarget "ModifyingXMP Debug" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 01C2B0680E3A06C4003F4586 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 01C2B06F0E3A06C4003F4586 /* Build configuration list for PBXNativeTarget "ModifyingXMP Release" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 01C2B0700E3A06C4003F4586 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 01C2B08A0E3A07A7003F4586 /* Build configuration list for PBXNativeTarget "XMPIterations Debug" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 01C2B08B0E3A07A7003F4586 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 01C2B0920E3A07A7003F4586 /* Build configuration list for PBXNativeTarget "XMPIterations Release" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 01C2B0930E3A07A7003F4586 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 01C2B0A60E3A084F003F4586 /* Build configuration list for PBXNativeTarget "XMPCommand Debug" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 01C2B0A70E3A084F003F4586 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 01C2B0AE0E3A084F003F4586 /* Build configuration list for PBXNativeTarget "XMPCommand Release" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 01C2B0AF0E3A084F003F4586 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ DC47BE960871F34F0088D201 /* Build configuration list for PBXProject "XMPSamples" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DC47BE980871F34F0088D201 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ DC97290109A3E964005A68DF /* Build configuration list for PBXNativeTarget "DumpScannedXMP Debug" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DC97290209A3E964005A68DF /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ DC97290909A3E969005A68DF /* Build configuration list for PBXNativeTarget "DumpScannedXMP Release" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DC97290A09A3E969005A68DF /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ DC97292709A3EB4F005A68DF /* Build configuration list for PBXAggregateTarget "Build All" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DC97292809A3EB4F005A68DF /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ DCE615450951C75C001247EE /* Build configuration list for PBXNativeTarget "XMPCoreCoverage Release" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DCE615460951C75C001247EE /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ DCED0E60089E7E6E009B80AF /* Build configuration list for PBXNativeTarget "XMPCoreCoverage Debug" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DCED0E63089E7E6E009B80AF /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
+}
diff --git a/samples/source/CustomSchema.cpp b/samples/source/CustomSchema.cpp
new file mode 100644
index 0000000..7e159b4
--- /dev/null
+++ b/samples/source/CustomSchema.cpp
@@ -0,0 +1,237 @@
+// =================================================================================================
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+/**
+* Tutorial solution for the Walkthrough 3 in the XMP Programmers Guide, Working with custom schema.
+*
+* Demonstrates how to work with a custom schema that has complex properties. It shows how to access
+* and modify properties with complex paths using the path composition utilities from the XMP API
+*/
+
+#include <string>
+
+// Must be defined to instantiate template classes
+#define TXMP_STRING_TYPE std::string
+
+// Ensure XMP templates are instantiated
+#include "XMP.incl_cpp"
+
+// Provide access to the API
+#include "XMP.hpp"
+
+#include <iostream>
+#include <fstream>
+
+// Made up namespace URI. Prefix will be xsdkEdit and xsdkUser
+const XMP_StringPtr kXMP_NS_SDK_EDIT = "http://ns.adobe/meta/sdk/Edit/";
+const XMP_StringPtr kXMP_NS_SDK_USERS = "http://ns.adobe/meta/sdk/User/";
+
+using namespace std;
+
+/**
+* Client defined callback function to dump XMP to a file. In this case an output file stream is used
+* to write a buffer, of length bufferSize, to a text file. This callback is called multiple
+* times during the DumpObject() operation. See the XMP API reference for details of
+* XMP_TextOutputProc() callbacks.
+*/
+XMP_Status XMPFileDump(void * refCon, XMP_StringPtr buffer, XMP_StringLen bufferSize)
+{
+ XMP_Status status = 0;
+ try
+ {
+ ofstream * outFile = static_cast<ofstream*>(refCon);
+ (*outFile).write(buffer, bufferSize);
+ }
+ catch(XMP_Error & e)
+ {
+ cout << e.GetErrMsg() << endl;
+ return -1;
+ }
+ return status;
+}
+
+/**
+* Client defined callback function to dump the registered namespaces to a file. In this case
+* an output file stream is used to write a buffer, of length bufferSize, to a text file. This
+* callback is called multiple times during the DumpObject() operation. See the XMP API
+* reference for details of XMP_TextOutputProc() callbacks.
+*/
+XMP_Status DumpNS(void * refCon, XMP_StringPtr buffer, XMP_StringLen bufferSize)
+{
+ XMP_Status status = 0;
+
+ try
+ {
+ ofstream *outFile= static_cast<ofstream*>(refCon);
+ (*outFile).write(buffer, bufferSize);
+ }
+ catch(XMP_Error & e)
+ {
+ cout << e.GetErrMsg() << endl;
+ return -1;
+ }
+ return status;
+}
+
+/**
+* Writes an XMP packet in XML format to a text file
+*
+* rdf - a pointer to the serialized XMP
+* filename - the name of the file to write to
+*/
+void writeRDFToFile(string * rdf, string filename)
+{
+ ofstream outFile;
+ outFile.open(filename.c_str(), ios::out);
+ outFile << *rdf;
+ outFile.close();
+}
+
+/**
+* Registers the namespaces that will be used with the custom schema. Then adds several new
+* properties to that schema. The properties are complex, containing nested arrays and structures.
+*
+* XMPFiles is not used in this sample, hence no external resource is updated with the metadata. The
+* created XMP object is serialized and written as RDF to a text file, the XMP object is dumped to
+* a text file and the registered namespaces are also dumped to a text file.*
+*
+*/
+int main()
+{
+ if(!SXMPMeta::Initialize())
+ {
+ cout << "Could not initialize Toolkit!";
+ }
+ else
+ {
+ try
+ {
+ // Register the namespaces
+ string actualPrefix;
+ SXMPMeta::RegisterNamespace(kXMP_NS_SDK_EDIT, "xsdkEdit", &actualPrefix);
+ SXMPMeta::RegisterNamespace(kXMP_NS_SDK_USERS, "xsdkUser",&actualPrefix);
+
+ SXMPMeta meta;
+
+ // Adds a user of the document
+ // 1. Add a new item onto the DocumentUsers array -
+ // 2. Compose a path to the last element of DocumentUsers array
+ // 3. Add a value for the User field of the UserDetails structure
+ // 4. Add a qualifier to the User field. Compose the path and set the value
+ // 5. Add a value for the DUID field of the UserDetails structure
+ // 6. Add a Contact property for the ContactDetails field of the UserDetails structure
+ // 7. Compose a path to the ContactDetails field of the UserDetails structure.
+ // 8. Create the fields of the ContactDetails structure and provide values
+
+ // Create/Append the top level DocumentUsers array. If the array exists a new item will be added
+ meta.AppendArrayItem(kXMP_NS_SDK_EDIT, "DocumentUsers", kXMP_PropValueIsArray, 0, kXMP_PropValueIsStruct);
+
+ // Compose a path to the last item in the DocumentUsers array, this will point to a UserDetails structure
+ string userItemPath;
+ SXMPUtils::ComposeArrayItemPath(kXMP_NS_SDK_EDIT, "DocumentUsers", kXMP_ArrayLastItem, &userItemPath);
+
+ // We now have a path to the structure, so we can set the field values
+ meta.SetStructField(kXMP_NS_SDK_EDIT, userItemPath.c_str(), kXMP_NS_SDK_USERS, "User", "John Smith", 0);
+
+ // Add a qualifier to the User field, first compose the path to the field and then add the qualifier
+ string userFieldPath;
+ SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, userItemPath.c_str(), kXMP_NS_SDK_USERS, "User", &userFieldPath);
+ meta.SetQualifier(kXMP_NS_SDK_EDIT, userFieldPath.c_str(), kXMP_NS_SDK_USERS, "Role", "Dev Engineer");
+
+ // Compose a path to the DUID and set field value
+ string duidPath;
+ SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, userItemPath.c_str(), kXMP_NS_SDK_USERS, "DUID", &duidPath);
+ meta.SetProperty_Int(kXMP_NS_SDK_EDIT, duidPath.c_str(), 2, 0);
+
+ // Add the ContactDetails field, this field is a Contact structure
+ meta.SetStructField(kXMP_NS_SDK_EDIT, userItemPath.c_str(), kXMP_NS_SDK_USERS, "ContactDetails", 0, kXMP_PropValueIsStruct);
+
+ // Compose a path to the field that has the ContactDetails structure
+ string contactStructPath;
+ SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, userItemPath.c_str(), kXMP_NS_SDK_USERS, "ContactDetails", &contactStructPath);
+
+ // Now add the fields - all empty initially
+ meta.SetStructField(kXMP_NS_SDK_EDIT, contactStructPath.c_str(), kXMP_NS_SDK_USERS, "Email", 0, kXMP_PropArrayIsAlternate);
+ meta.SetStructField(kXMP_NS_SDK_EDIT, contactStructPath.c_str(), kXMP_NS_SDK_USERS, "Telephone", 0, kXMP_PropValueIsArray);
+ meta.SetStructField(kXMP_NS_SDK_EDIT, contactStructPath.c_str(), kXMP_NS_SDK_USERS, "BaseLocation", "", 0);
+
+ // Add some values for the fields
+ // Email: Get the path to the field named 'Email' in the ContactDetails structure and use it to append items
+ string path;
+ SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, contactStructPath.c_str(), kXMP_NS_SDK_USERS, "Email", &path);
+ meta.AppendArrayItem(kXMP_NS_SDK_EDIT, path.c_str(), 0, "js@adobe.meta.com", 0);
+ meta.AppendArrayItem(kXMP_NS_SDK_EDIT, path.c_str(), 0, "js@adobe.home.com", 0);
+
+ // Telephone
+ SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, contactStructPath.c_str(), kXMP_NS_SDK_USERS, "Telephone", &path);
+ meta.AppendArrayItem(kXMP_NS_SDK_EDIT, path.c_str(), 0, "89112", 0);
+ meta.AppendArrayItem(kXMP_NS_SDK_EDIT, path.c_str(), 0, "84432", 0);
+
+ // BaseLocation
+ SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, contactStructPath.c_str(), kXMP_NS_SDK_USERS, "BaseLocation", &path);
+ meta.SetProperty(kXMP_NS_SDK_EDIT, path.c_str(), "London", 0);
+
+ // Add a user edit
+ // 1. Add an item (a structure) to the DocumentEdit array
+ // 2. Compose a path to the last item in the DocumentEdit array
+ // 3. Add fields and values to the EditDetails structure
+
+ // Create the array
+ meta.AppendArrayItem(kXMP_NS_SDK_EDIT, "DocumentEdit", kXMP_PropArrayIsOrdered, 0, kXMP_PropValueIsStruct);
+
+ // Compose a path to the last item of the DocumentEdit array, this gives the path to the structure
+ string lastItemPath;
+ SXMPUtils::ComposeArrayItemPath(kXMP_NS_SDK_EDIT, "DocumentEdit", kXMP_ArrayLastItem, &lastItemPath);
+
+ // Add the Date field
+ SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, lastItemPath.c_str(), kXMP_NS_SDK_EDIT, "EditDate", &path);
+ XMP_DateTime dt;
+ SXMPUtils::CurrentDateTime(&dt);
+ meta.SetProperty_Date(kXMP_NS_SDK_EDIT, path.c_str(), dt, 0);
+
+ // Add the DUID field
+ SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, lastItemPath.c_str(), kXMP_NS_SDK_EDIT, "DUID", &path);
+ meta.SetProperty_Int(kXMP_NS_SDK_EDIT, path.c_str(), 2, 0);
+
+ // Add the EditComments field
+ SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, lastItemPath.c_str(), kXMP_NS_SDK_EDIT, "EditComments", &path);
+ meta.SetLocalizedText(kXMP_NS_SDK_EDIT, path.c_str(), "en", "en-US", "Document created.", 0);
+
+ // Add the EditTool field
+ meta.SetStructField(kXMP_NS_SDK_EDIT, lastItemPath.c_str(), kXMP_NS_SDK_EDIT, "EditTool", "FrameXML", 0);
+
+ // Write the RDF to a file
+ cout << "writing RDF to file CS_RDF.txt" << endl;
+ string metaBuffer;
+ meta.SerializeToBuffer(&metaBuffer);
+ writeRDFToFile(&metaBuffer, "CS_RDF.txt");
+
+ // Dump the XMP object
+ cout << "dumping XMP object to file XMPDump.txt" << endl;
+ ofstream dumpFile;
+ dumpFile.open("XMPDump.txt", ios::out);
+ meta.DumpObject(XMPFileDump, &dumpFile);
+ dumpFile.close();
+
+ // Dump the namespaces to a file
+ cout << "dumping namespaces to file NameDump.txt" << endl;
+ dumpFile.open("NameDump.txt", ios::out);
+ meta.DumpNamespaces(XMPFileDump, &dumpFile);
+ dumpFile.close();
+
+ }
+ catch(XMP_Error & e)
+ {
+ cout << "ERROR: " << e.GetErrMsg();
+ }
+
+ SXMPMeta::Terminate();
+ }
+
+ return 0;
+}
diff --git a/samples/source/DumpMainXMP.cpp b/samples/source/DumpMainXMP.cpp
index 805b999..06d367a 100644
--- a/samples/source/DumpMainXMP.cpp
+++ b/samples/source/DumpMainXMP.cpp
@@ -1,14 +1,16 @@
-// XMP Toolkit sample application to dump the main XMP packet in a file using the XMP File Handler
-// component of the XMP Toolkit. This is preferred over "dumb" packet scanning.
-
// =================================================================================================
-// Copyright 2002-2005 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
// of the Adobe license agreement accompanying it.
// =================================================================================================
+/**
+* Uses the XMPFiles component API to find the main XMP Packet for a data file, serializes the XMP, and writes
+* it to a human-readable log file. This is preferred over "dumb" packet scanning.
+*/
+
#include <string>
#include <time.h>
@@ -98,7 +100,7 @@ ProcessFile ( const char * fileName )
// =================================================================================================
-extern "C" int
+int
main ( int argc, const char * argv [] )
{
@@ -108,51 +110,20 @@ main ( int argc, const char * argv [] )
}
if ( ! SXMPFiles::Initialize() ) {
- fprintf ( sLogFile, "## SXMPFiles::Initialize failed!\n" );
+ printf ( "## SXMPFiles::Initialize failed!\n" );
return -1;
}
- if ( argc > 1 ) {
-
- printf ( "\n" );
- for ( int i = 1; i < argc; i++ ) ProcessFile ( argv[i] );
-
- } else {
-
- char fileNameBuffer[1025];
-
- while ( true ) {
-
- printf ( "\nFile: " );
- fgets( fileNameBuffer, sizeof(fileNameBuffer), stdin );
- string fileName ( fileNameBuffer );
-
- if ( fileName.empty() ) break;
-
- if ( (fileName[fileName.size()-1] == '\n') || (fileName[fileName.size()-1] == '\r') ) {
- fileName.erase ( fileName.size()-1, 1 ); // Remove eol, allowing for CRLF.
- if ( (fileName[fileName.size()-1] == '\n') || (fileName[fileName.size()-1] == '\r') ) {
- fileName.erase ( fileName.size()-1, 1 );
- }
- }
-
- if ( fileName == "." ) break;
-
- // Dragging an icon on Windows pastes a quoted path.
- if ( fileName[fileName.size()-1] == '"' ) fileName.erase ( fileName.size()-1, 1 );
- if ( fileName[0] == '"' ) fileName.erase ( 0, 1 );
-
- if ( ! fileName.empty() ) {
- printf ( "\n" );
- ProcessFile ( fileName.c_str() );
- }
-
- }
-
+ if ( argc != 2 ) // 2 := command and 1 parameter
+ {
+ printf( "usage: DumpMainXMP (filename)\n");
+ return 0;
}
+
+ ProcessFile ( argv[1] );
SXMPFiles::Terminate();
SXMPMeta::Terminate();
+
return 0;
-
}
diff --git a/samples/source/DumpScannedXMP.cpp b/samples/source/DumpScannedXMP.cpp
index c8c5f94..37929c6 100644
--- a/samples/source/DumpScannedXMP.cpp
+++ b/samples/source/DumpScannedXMP.cpp
@@ -1,11 +1,16 @@
// =================================================================================================
-// Copyright 2002-2005 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
// of the Adobe license agreement accompanying it.
// =================================================================================================
+/**
+* Scans a data file to find all embedded XMP Packets, without using the smart handlers. If a packet is found,
+* serializes the XMP and writes it to log file.
+*/
+
#include <string>
#include <time.h>
@@ -143,44 +148,13 @@ main ( int argc, const char * argv [] )
return -1;
}
- if ( argc > 1 ) {
-
- printf ( "\n" );
- for ( int i = 1; i < argc; i++ ) ProcessFile ( argv[i] );
-
- } else {
-
- char fileNameBuffer[1025];
-
- while ( true ) {
-
- printf ( "\nFile: " );
- fgets( fileNameBuffer, sizeof(fileNameBuffer), stdin );
- string fileName ( fileNameBuffer );
-
- if ( fileName.empty() ) break;
-
- if ( (fileName[fileName.size()-1] == '\n') || (fileName[fileName.size()-1] == '\r') ) {
- fileName.erase ( fileName.size()-1, 1 ); // Remove eol, allowing for CRLF.
- if ( (fileName[fileName.size()-1] == '\n') || (fileName[fileName.size()-1] == '\r') ) {
- fileName.erase ( fileName.size()-1, 1 );
- }
- }
-
- if ( fileName == "." ) break;
-
- // Dragging an icon on Windows pastes a quoted path.
- if ( fileName[fileName.size()-1] == '"' ) fileName.erase ( fileName.size()-1, 1 );
- if ( fileName[0] == '"' ) fileName.erase ( 0, 1 );
-
- if ( ! fileName.empty() ) {
- printf ( "\n" );
- ProcessFile ( fileName.c_str() );
- }
-
- }
-
+ if ( argc != 2 ) // 2 := command and 1 parameter
+ {
+ printf ("usage: DumpScannedXMP (filename)\n");
+ return 0;
}
+
+ ProcessFile ( argv[1] );
SXMPMeta::Terminate();
return 0;
diff --git a/samples/source/ModifyingXMP.cpp b/samples/source/ModifyingXMP.cpp
new file mode 100644
index 0000000..7b73bc0
--- /dev/null
+++ b/samples/source/ModifyingXMP.cpp
@@ -0,0 +1,297 @@
+// =================================================================================================
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+/**
+* Tutorial solution for Walkthrough 2 in the XMP Programmers Guide, Modifying XMP
+* Demonstrates how to open a file for update, and modifying the contained XMP before writing it back to the file.
+*/
+
+#include <string>
+
+// Must be defined to instantiate template classes
+#define TXMP_STRING_TYPE std::string
+
+// Must be defined to give access to XMPFiles
+#define XMP_INCLUDE_XMPFILES 1
+
+// Ensure XMP templates are instantiated
+#include "XMP.incl_cpp"
+
+// Provide access to the API
+#include "XMP.hpp"
+
+#include <iostream>
+#include <fstream>
+
+using namespace std;
+
+/**
+* Display some property values to the console
+*
+* meta - a pointer to the XMP object that will have the properties read
+*/
+void displayPropertyValues(SXMPMeta * meta)
+{
+ // Read a simple property
+ string simpleValue; //Stores the value for the property
+ meta->GetProperty(kXMP_NS_XMP, "CreatorTool", &simpleValue, 0);
+ cout << "meta:CreatorTool = " << simpleValue << endl;
+
+ // Get the first and second element in the dc:creator array
+ string elementValue;
+ meta->GetArrayItem(kXMP_NS_DC, "creator", 1, &elementValue, 0);
+ if(elementValue != "")
+ {
+ cout << "dc:creator[1] = " << elementValue << endl;
+ meta->GetArrayItem(kXMP_NS_DC, "creator", 2, &elementValue, 0);
+ cout << "dc:creator[2] = " << elementValue << endl;
+ }
+
+ // Get the the entire dc:subject array
+ string propValue;
+ int arrSize = meta->CountArrayItems(kXMP_NS_DC, "subject");
+ for(int i = 1; i <= arrSize;i++)
+ {
+ meta->GetArrayItem(kXMP_NS_DC, "subject", i, &propValue, 0);
+ cout << "dc:subject[" << i << "] = " << propValue << endl;
+ }
+
+ // Get the dc:title for English and French
+ string itemValue;
+ string actualLang;
+ meta->GetLocalizedText(kXMP_NS_DC, "title", "en", "en-US", 0, &itemValue, 0);
+ cout << "dc:title in English = " << itemValue << endl;
+
+ meta->GetLocalizedText(kXMP_NS_DC, "title", "fr", "fr-FR", 0, &itemValue, 0);
+ cout << "dc:title in French = " << itemValue << endl;
+
+ // Get dc:MetadataDate
+ XMP_DateTime myDate;
+ if(meta->GetProperty_Date(kXMP_NS_XMP, "MetadataDate", &myDate, 0))
+ {
+ // Convert the date struct into a convenient string and display it
+ string myDateStr;
+ SXMPUtils::ConvertFromDate(myDate, &myDateStr);
+ cout << "meta:MetadataDate = " << myDateStr << endl;
+ }
+
+ cout << "----------------------------------------" << endl;
+}
+
+/**
+* Creates an XMP object from an RDF string. The string is used to
+* to simulate creating and XMP object from multiple input buffers.
+* The last call to ParseFromBuffer has no kXMP_ParseMoreBuffers options,
+* thereby indicating this is the last input buffer.
+*/
+SXMPMeta createXMPFromRDF()
+{
+ const char * rdf =
+ "<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>"
+ "<rdf:Description rdf:about='' xmlns:dc='http://purl.org/dc/elements/1.1/'>"
+ "<dc:subject>"
+ "<rdf:Bag>"
+ "<rdf:li>XMP</rdf:li>"
+ "<rdf:li>SDK</rdf:li>"
+ "<rdf:li>Sample</rdf:li>"
+ "</rdf:Bag>"
+ "</dc:subject>"
+ "<dc:format>image/tiff</dc:format>"
+ "</rdf:Description>"
+ "</rdf:RDF>";
+
+ SXMPMeta meta;
+ // Loop over the rdf string and create the XMP object
+ // 10 characters at a time
+ int i;
+ for (i = 0; i < (long)strlen(rdf) - 10; i += 10 )
+ {
+ meta.ParseFromBuffer ( &rdf[i], 10, kXMP_ParseMoreBuffers );
+ }
+
+ // The last call has no kXMP_ParseMoreBuffers options, signifying
+ // this is the last input buffer
+ meta.ParseFromBuffer ( &rdf[i], (XMP_StringLen) strlen(rdf) - i );
+ return meta;
+
+}
+
+/**
+* Writes an XMP packet in XML format to a text file
+*
+* rdf - a pointer to the serialized XMP
+* filename - the name of the file to write to
+*/
+void writeRDFToFile(string * rdf, string filename)
+{
+ ofstream outFile;
+ outFile.open(filename.c_str(), ios::out);
+ outFile << *rdf;
+ outFile.close();
+}
+
+/**
+* Initializes the toolkit and attempts to open a file for updating its metadata. Initially
+* an attempt to open the file is done with a handler, if this fails then the file is opened with
+* packet scanning. Once the file is open several properties are read and displayed in the console.
+*
+* Several properties are then modified, first by checking for their existence and then, if they
+* exist, by updating their values. The updated properties are then displayed again in the console.
+*
+* Next a new XMP object is created from an RDF stream, the properties from the new XMP object are
+* appended to the original XMP object and the updated properties are displayed in the console for
+* last time.
+*
+* The updated XMP object is then serialized in different formats and written to text files. Lastly,
+* the modified XMP is written back to the resource file.
+*/
+int main ( int argc, const char * argv[] )
+{
+ if ( argc != 2 ) // 2 := command and 1 parameter
+ {
+ cout << "usage: ModifyingXMP (filename)" << endl;
+ return 0;
+ }
+
+ string filename = string( argv[1] );
+
+ if(!SXMPMeta::Initialize())
+ {
+ cout << "Could not initialize toolkit!";
+ return -1;
+ }
+
+ // Must initialize SXMPFiles before we use it
+ if(SXMPFiles::Initialize())
+ {
+ try
+ {
+ // Options to open the file with - open for editing and use a smart handler
+ XMP_OptionBits opts = kXMPFiles_OpenForUpdate | kXMPFiles_OpenUseSmartHandler;
+
+ bool ok;
+ SXMPFiles myFile;
+ std::string status = "";
+
+ // First we try and open the file
+ ok = myFile.OpenFile(filename, kXMP_UnknownFile, opts);
+ if( ! ok )
+ {
+ status += "No smart handler available for " + filename + "\n";
+ status += "Trying packet scanning.\n";
+
+ // Now try using packet scanning
+ opts = kXMPFiles_OpenForUpdate | kXMPFiles_OpenUsePacketScanning;
+ ok = myFile.OpenFile(filename, kXMP_UnknownFile, opts);
+ }
+
+ // If the file is open then read get the XMP data
+ if(ok)
+ {
+ cout << status << endl;
+ cout << filename << " is opened successfully" << endl;
+ // Create the XMP object and get the XMP data
+ SXMPMeta meta;
+ myFile.GetXMP(&meta);
+
+ // Display some properties in the console
+ displayPropertyValues(&meta);
+
+ ///////////////////////////////////////////////////
+ // Now modify the XMP
+ if(meta.DoesPropertyExist(kXMP_NS_XMP, "CreatorTool"))
+ {
+ // Update xap:CreatorTool - we don't need to set any option bits
+ meta.SetProperty(kXMP_NS_XMP, "CreatorTool", "Updated By XMP SDK", 0);
+ }
+
+ // Update the Metadata Date
+ XMP_DateTime updatedTime;
+ // Get the current time. This is a UTC time automatically
+ // adjusted for the local time
+ SXMPUtils::CurrentDateTime(&updatedTime);
+ if(meta.DoesPropertyExist(kXMP_NS_XMP, "MetadataDate"))
+ {
+ meta.SetProperty_Date(kXMP_NS_XMP, "MetadataDate", updatedTime, 0);
+ }
+
+ // Add an item onto the dc:creator array
+ // Note the options used, kXMP_PropArrayIsOrdered, if the array does not exist it will be created
+ meta.AppendArrayItem(kXMP_NS_DC, "creator", kXMP_PropArrayIsOrdered, "Author Name", 0);
+ meta.AppendArrayItem(kXMP_NS_DC, "creator", kXMP_PropArrayIsOrdered, "Another Author Name", 0);
+
+ // Now update alt-text properties
+ meta.SetLocalizedText(kXMP_NS_DC, "title", "en", "en-US", "An English title");
+ meta.SetLocalizedText(kXMP_NS_DC, "title", "fr", "fr-FR", "Un titre Francais");
+
+ // Display the properties again to show changes
+ cout << "After update:" << endl;
+ displayPropertyValues(&meta);
+
+ // Create a new XMP object from an RDF string
+ SXMPMeta rdfMeta = createXMPFromRDF();
+
+ // Append the newly created properties onto the original XMP object
+ // This will:
+ // a) Add ANY new TOP LEVEL properties in the source (rdfMeta) to the destination (meta)
+ // b) Replace any top level properties in the source with the matching properties from the destination
+ SXMPUtils::AppendProperties(rdfMeta, &meta, (kXMPUtil_DoAllProperties | kXMPUtil_ReplaceOldValues ));
+
+ // Display the properties again to show changes
+ cout << "After Appending Properties:" << endl;
+ displayPropertyValues(&meta);
+
+ // Serialize the packet and write the buffer to a file
+ // Let the padding be computed and use the default linefeed and indents without limits
+ string metaBuffer;
+ meta.SerializeToBuffer(&metaBuffer, 0, 0, "", "", 0);
+
+ // Write the packet to a file as RDF
+ writeRDFToFile(&metaBuffer, filename+"_XMP_RDF.txt");
+
+ // Write the packet to a file but this time as compact RDF
+ XMP_OptionBits outOpts = kXMP_OmitPacketWrapper | kXMP_UseCompactFormat;
+ meta.SerializeToBuffer(&metaBuffer, outOpts);
+ writeRDFToFile(&metaBuffer, filename+"_XMP_RDF_Compact.txt");
+
+ // Check we can put the XMP packet back into the file
+ if(myFile.CanPutXMP(meta))
+ {
+ // If so then update the file with the modified XMP
+ myFile.PutXMP(meta);
+ }
+
+ // Close the SXMPFile. This *must* be called. The XMP is not
+ // actually written and the disk file is not closed until this call is made.
+ myFile.CloseFile();
+ }
+ else
+ {
+ cout << "Unable to open " << filename << endl;
+ }
+ }
+ catch(XMP_Error & e)
+ {
+ cout << "ERROR: " << e.GetErrMsg() << endl;
+ }
+
+ // Terminate the toolkit
+ SXMPFiles::Terminate();
+ SXMPMeta::Terminate();
+
+ }
+ else
+ {
+ cout << "Could not initialize SXMPFiles.";
+ return -1;
+ }
+
+ return 0;
+}
+
+
diff --git a/samples/source/ReadingXMP.cpp b/samples/source/ReadingXMP.cpp
new file mode 100644
index 0000000..b1ec3c4
--- /dev/null
+++ b/samples/source/ReadingXMP.cpp
@@ -0,0 +1,204 @@
+// =================================================================================================
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+/**
+* Tutorial solution for the Walkthrough 1 in the XMP Programmers Guide, Opening files and reading XMP.
+* Demonstrates the basic use of the XMPFiles and XMPCore components, obtaining read-only XMP from a file
+* and examining it through the XMP object.
+*/
+
+#include <string>
+
+// Must be defined to instantiate template classes
+#define TXMP_STRING_TYPE std::string
+
+// Must be defined to give access to XMPFiles
+#define XMP_INCLUDE_XMPFILES 1
+
+// Ensure XMP templates are instantiated
+#include "XMP.incl_cpp"
+
+// Provide access to the API
+#include "XMP.hpp"
+
+#include <iostream>
+#include <fstream>
+
+using namespace std;
+
+/**
+* Client defined callback function to dump XMP to a file. In this case an output file stream is used
+* to write a buffer, of length bufferSize, to a text file. This callback is called multiple
+* times during the DumpObject() operation. See the XMP API reference for details of
+* XMP_TextOutputProc() callbacks.
+*/
+XMP_Status DumpXMPToFile(void * refCon, XMP_StringPtr buffer, XMP_StringLen bufferSize)
+{
+ XMP_Status status = 0;
+
+ try
+ {
+ ofstream * outFile = static_cast<ofstream*>(refCon);
+ (*outFile).write(buffer, bufferSize);
+ }
+ catch(XMP_Error & e)
+ {
+ cout << e.GetErrMsg() << endl;
+ return -1; // Return a bad status
+ }
+
+ return status;
+}
+
+/**
+* Initializes the toolkit and attempts to open a file for reading metadata. Initially
+* an attempt to open the file is done with a handler, if this fails then the file is opened with
+* packet scanning. Once the file is open several properties are read and displayed in the console.
+* The XMP object is then dumped to a text file and the resource file is closed.
+*/
+int main ( int argc, const char * argv[] )
+{
+ if ( argc != 2 ) // 2 := command and 1 parameter
+ {
+ cout << "usage: ReadingXMP (filename)" << endl;
+ return 0;
+ }
+
+ string filename = string( argv[1] );
+
+ if(!SXMPMeta::Initialize())
+ {
+ cout << "Could not initialize toolkit!";
+ return -1;
+ }
+
+ // Must initialize SXMPFiles before we use it
+ if ( ! SXMPFiles::Initialize() )
+ {
+ cout << "Could not initialize SXMPFiles.";
+ return -1;
+ }
+
+ try
+ {
+ // Options to open the file with - read only and use a file handler
+ XMP_OptionBits opts = kXMPFiles_OpenForRead | kXMPFiles_OpenUseSmartHandler;
+
+ bool ok;
+ SXMPFiles myFile;
+ std::string status = "";
+
+ // First we try and open the file
+ ok = myFile.OpenFile(filename, kXMP_UnknownFile, opts);
+ if( ! ok )
+ {
+ status += "No smart handler available for " + filename + "\n";
+ status += "Trying packet scanning.\n";
+
+ // Now try using packet scanning
+ opts = kXMPFiles_OpenForUpdate | kXMPFiles_OpenUsePacketScanning;
+ ok = myFile.OpenFile(filename, kXMP_UnknownFile, opts);
+ }
+
+
+ // If the file is open then read the metadata
+ if(ok)
+ {
+ cout << status << endl;
+ cout << filename << " is opened successfully" << endl;
+ // Create the xmp object and get the xmp data
+ SXMPMeta meta;
+ myFile.GetXMP(&meta);
+
+ bool exists;
+
+ // Read a simple property
+ string simpleValue; //Stores the value for the property
+ exists = meta.GetProperty(kXMP_NS_XMP, "CreatorTool", &simpleValue, NULL);
+ if(exists)
+ cout << "CreatorTool = " << simpleValue << endl;
+ else
+ simpleValue.clear();
+
+ // Get the first element in the dc:creator array
+ string elementValue;
+ exists = meta.GetArrayItem(kXMP_NS_DC, "creator", 1, &elementValue, NULL);
+ if(exists)
+ cout << "dc:creator = " << elementValue << endl;
+ else
+ elementValue.clear();
+
+ // Get the the entire dc:subject array
+ string propValue;
+ int arrSize = meta.CountArrayItems(kXMP_NS_DC, "subject");
+ for(int i = 1; i <= arrSize;i++)
+ {
+ meta.GetArrayItem(kXMP_NS_DC, "subject", i, &propValue, 0);
+ cout << "dc:subject[" << i << "] = " << propValue << endl;
+ }
+
+ // Get the dc:title for English and French
+ string itemValue;
+ string actualLang;
+ meta.GetLocalizedText(kXMP_NS_DC, "title", "en", "en-US", NULL, &itemValue, NULL);
+ cout << "dc:title in English = " << itemValue << endl;
+
+ meta.GetLocalizedText(kXMP_NS_DC, "title", "fr", "fr-FR", NULL, &itemValue, NULL);
+ cout << "dc:title in French = " << itemValue << endl;
+
+ // Get dc:MetadataDate
+ XMP_DateTime myDate;
+ if(meta.GetProperty_Date(kXMP_NS_XMP, "MetadataDate", &myDate, NULL))
+ {
+ // Convert the date struct into a convenient string and display it
+ string myDateStr;
+ SXMPUtils::ConvertFromDate(myDate, &myDateStr);
+ cout << "meta:MetadataDate = " << myDateStr << endl;
+ }
+
+ // See if the flash struct exists and see if it was used
+ string path, value;
+ exists = meta.DoesStructFieldExist(kXMP_NS_EXIF, "Flash", kXMP_NS_EXIF,"Fired");
+ if(exists)
+ {
+ bool flashFired;
+ SXMPUtils::ComposeStructFieldPath(kXMP_NS_EXIF, "Flash", kXMP_NS_EXIF, "Fired", &path);
+ meta.GetProperty_Bool(kXMP_NS_EXIF, path.c_str(), &flashFired, NULL);
+ string flash = (flashFired) ? "True" : "False";
+
+ cout << "Flash Used = " << flash << endl;
+ }
+
+ // Dump the current xmp object to a file
+ ofstream dumpFile;
+ dumpFile.open("XMPDump.txt", ios::out);
+ meta.DumpObject(DumpXMPToFile, &dumpFile);
+ dumpFile.close();
+ cout << endl << "XMP dumped to XMPDump.txt" << endl;
+
+ // Close the SXMPFile. The resource file is already closed if it was
+ // opened as read only but this call must still be made.
+ myFile.CloseFile();
+ }
+ else
+ {
+ cout << "Unable to open " << filename << endl;
+ }
+ }
+ catch(XMP_Error & e)
+ {
+ cout << "ERROR: " << e.GetErrMsg() << endl;
+ }
+
+ // Terminate the toolkit
+ SXMPFiles::Terminate();
+ SXMPMeta::Terminate();
+
+ return 0;
+}
+
diff --git a/samples/source/XMPCoreCoverage.cpp b/samples/source/XMPCoreCoverage.cpp
index feb6306..c0c2cef 100644
--- a/samples/source/XMPCoreCoverage.cpp
+++ b/samples/source/XMPCoreCoverage.cpp
@@ -1,3 +1,15 @@
+// =================================================================================================
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+/**
+* Demonstrates syntax and usage by exercising most of the API functions of XMPCore Toolkit SDK component,
+* using a sample XMP Packet that contains all of the different property and attribute types.
+*/
#include <string>
#include <iostream>
#include <iomanip>
@@ -18,6 +30,7 @@ using namespace std;
#if WIN_ENV
#pragma warning ( disable : 4100 ) // ignore unused variable
#pragma warning ( disable : 4127 ) // conditional expression is constant
+ #pragma warning ( disable : 4267 ) // possible loss of data (temporary for 64-bit builds)
#pragma warning ( disable : 4505 ) // unreferenced local function has been removed
#pragma warning ( disable : 4996 ) // '...' was declared deprecated
#endif
@@ -1927,6 +1940,8 @@ extern "C" int main ( int /*argc*/, const char * argv [] )
try {
+// *** Add memory leak checking for both DLL and static builds ***
+
if ( ! SXMPMeta::Initialize() ) {
fprintf ( log, "## XMPMeta::Initialize failed!\n" );
return -1;
@@ -1946,10 +1961,14 @@ extern "C" int main ( int /*argc*/, const char * argv [] )
}
SXMPMeta::Terminate();
+
now = time(0);
fprintf ( log, "XMPCoreCoverage finished %s", ctime(&now) );
fprintf ( log, "Final status = %d\n", result );
fclose ( log );
+
+ printf( "results have been logged into %s\n", logName );
+
return result;
}
diff --git a/samples/source/XMPFilesCoverage.cpp b/samples/source/XMPFilesCoverage.cpp
index 768d055..84e5e27 100644
--- a/samples/source/XMPFilesCoverage.cpp
+++ b/samples/source/XMPFilesCoverage.cpp
@@ -1,3 +1,16 @@
+// =================================================================================================
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+/**
+* Demonstrates syntax and usage by exercising most of the API functions of XMPFiles Toolkit SDK component,
+* using a sample XMP Packet that contains all of the different property and attribute types.
+*/
+
#include <vector>
#include <string>
#include <stdexcept>
@@ -238,7 +251,15 @@ static void TestOneFile ( const char * fileName )
xmpFile.PutXMP ( xmpMeta );
XMP_OptionBits closeOptions = 0;
- if ( (xmpMeta.CountArrayItems ( kXMP_NS_XMP, "XMPFileStamps" ) & 1) == 0 ) closeOptions |= kXMPFiles_UpdateSafely;
+ XMP_OptionBits capabilities = 0;
+ XMP_FileFormat fileFormat = 0;
+ xmpFile.GetFileInfo( NULL, NULL, &fileFormat, NULL);
+ SXMPFiles::GetFormatInfo( fileFormat, &capabilities);
+
+ if ( (xmpMeta.CountArrayItems ( kXMP_NS_XMP, "XMPFileStamps" ) & 1) == 0
+ && ( capabilities & kXMPFiles_AllowsSafeUpdate ) )
+ closeOptions |= kXMPFiles_UpdateSafely;
+
xmpFile.CloseFile ( closeOptions );
fprintf ( sLogFile, "\n" );
@@ -258,7 +279,7 @@ extern "C" int main ( int argc, const char * argv[] )
int result = 0;
char logName[256];
- int nameLen = strlen ( argv[0] );
+ int nameLen = (int) strlen ( argv[0] );
if ( (nameLen >= 4) && (strcmp ( argv[0]+nameLen-4, ".exe" ) == 0) ) nameLen -= 4;
memcpy ( logName, argv[0], nameLen );
memcpy ( &logName[nameLen], "Log.txt", 8 ); // Include final null.
@@ -285,18 +306,18 @@ extern "C" int main ( int argc, const char * argv[] )
DumpHandlerInfo();
- TestOneFile ( "BlueSquares/BlueSquare.ai" );
- TestOneFile ( "BlueSquares/BlueSquare.eps" );
- TestOneFile ( "BlueSquares/BlueSquare.indd" );
- TestOneFile ( "BlueSquares/BlueSquare.jpg" );
- TestOneFile ( "BlueSquares/BlueSquare.pdf" );
- TestOneFile ( "BlueSquares/BlueSquare.psd" );
- TestOneFile ( "BlueSquares/BlueSquare.tif" );
- TestOneFile ( "BlueSquares/BlueSquare.avi" );
- TestOneFile ( "BlueSquares/BlueSquare.mov" );
- TestOneFile ( "BlueSquares/BlueSquare.mp3" );
- TestOneFile ( "BlueSquares/BlueSquare.wav" );
- TestOneFile ( "BlueSquares/BlueSquare.png" );
+ TestOneFile ( "../../../testfiles/BlueSquare.ai" );
+ TestOneFile ( "../../../testfiles/BlueSquare.eps" );
+ TestOneFile ( "../../../testfiles/BlueSquare.indd" );
+ TestOneFile ( "../../../testfiles/BlueSquare.jpg" );
+ TestOneFile ( "../../../testfiles/BlueSquare.pdf" );
+ TestOneFile ( "../../../testfiles/BlueSquare.psd" );
+ TestOneFile ( "../../../testfiles/BlueSquare.tif" );
+ TestOneFile ( "../../../testfiles/BlueSquare.avi" );
+ TestOneFile ( "../../../testfiles/BlueSquare.mov" );
+ TestOneFile ( "../../../testfiles/BlueSquare.mp3" );
+ TestOneFile ( "../../../testfiles/BlueSquare.wav" );
+ TestOneFile ( "../../../testfiles/BlueSquare.png" );
} catch ( XMP_Error & excep ) {
@@ -317,6 +338,9 @@ extern "C" int main ( int argc, const char * argv[] )
fprintf ( sLogFile, "\nXMPFilesCoverage finished %s", ctime(&now) );
fprintf ( sLogFile, "Final status = %d\n", result );
fclose ( sLogFile );
+
+ printf( "\nresults have been logged into %s\n", logName );
+
return result;
} // main
diff --git a/samples/source/XMPScanner.cpp b/samples/source/XMPScanner.cpp
index 6527b0e..63f03d0 100644
--- a/samples/source/XMPScanner.cpp
+++ b/samples/source/XMPScanner.cpp
@@ -1,5 +1,5 @@
// =================================================================================================
-// Copyright 2002-2006 Adobe Systems Incorporated
+// Copyright 2002-2007 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -9,10 +9,11 @@
// one format in a file with a different format', inventors: Sean Parent, Greg Gilley.
// =================================================================================================
-#if WIN_ENV
+#if WIN32
#pragma warning ( disable : 4127 ) // conditional expression is constant
- #pragma warning ( disable : 4702 ) // unreachable code
- #pragma warning ( disable : 4786 ) // The VC++ debugger can't handle long symbol names.
+ #pragma warning ( disable : 4510 ) // default constructor could not be generated
+ #pragma warning ( disable : 4610 ) // user defined constructor required
+ #pragma warning ( disable : 4786 ) // debugger can't handle long symbol names
#endif
@@ -20,11 +21,14 @@
#include <cassert>
#include <string>
-#include <iostream>
-#include <iomanip>
-#include <fstream>
#include <cstdlib>
+#if DEBUG
+ #include <iostream>
+ #include <iomanip>
+ #include <fstream>
+#endif
+
#ifndef UseStringPushBack // VC++ 6.x does not provide push_back for strings!
#define UseStringPushBack 0
@@ -81,7 +85,7 @@ using namespace std;
// PacketMachine
// =============
-XMPScanner::PacketMachine::PacketMachine ( SInt64 bufferOffset, const void * bufferOrigin, SInt64 bufferLength ) :
+XMPScanner::PacketMachine::PacketMachine ( XMP_Int64 bufferOffset, const void * bufferOrigin, XMP_Int64 bufferLength ) :
// Public members
fPacketStart ( 0 ),
@@ -130,7 +134,7 @@ XMPScanner::PacketMachine::~PacketMachine ()
// ===============
void
-XMPScanner::PacketMachine::AssociateBuffer ( SInt64 bufferOffset, const void * bufferOrigin, SInt64 bufferLength )
+XMPScanner::PacketMachine::AssociateBuffer ( XMP_Int64 bufferOffset, const void * bufferOrigin, XMP_Int64 bufferLength )
{
fBufferOffset = bufferOffset;
@@ -783,13 +787,15 @@ XMPScanner::PacketMachine::CheckPacketEnd ( PacketMachine * ths, const char * /*
if ( ths->fPosition == 0 ) { // First call, decide if there is trailing padding.
- const SInt64 currLength = (ths->fBufferOffset + (ths->fBufferPtr - ths->fBufferOrigin)) - ths->fPacketStart;
-
+ const XMP_Int64 currLen64 = (ths->fBufferOffset + (ths->fBufferPtr - ths->fBufferOrigin)) - ths->fPacketStart;
+ if ( currLen64 > 0x7FFFFFFF ) throw std::runtime_error ( "Packet length exceeds 2GB-1" );
+ const XMP_Int32 currLength = (XMP_Int32)currLen64;
+
if ( (ths->fBytesAttr != -1) && (ths->fBytesAttr != currLength) ) {
if ( ths->fBytesAttr < currLength ) {
ths->fBogusPacket = true; // The bytes attribute value is too small.
} else {
- ths->fPosition = (signed long)(ths->fBytesAttr - currLength);
+ ths->fPosition = ths->fBytesAttr - currLength;
if ( (ths->fPosition % ths->fBytesPerChar) != 0 ) {
ths->fBogusPacket = true; // The padding is not a multiple of the character size.
ths->fPosition = (ths->fPosition / ths->fBytesPerChar) * ths->fBytesPerChar;
@@ -815,7 +821,9 @@ XMPScanner::PacketMachine::CheckPacketEnd ( PacketMachine * ths, const char * /*
}
- ths->fPacketLength = (ths->fBufferOffset + (ths->fBufferPtr - ths->fBufferOrigin)) - ths->fPacketStart;
+ const XMP_Int64 currLen64 = (ths->fBufferOffset + (ths->fBufferPtr - ths->fBufferOrigin)) - ths->fPacketStart;
+ if ( currLen64 > 0x7FFFFFFF ) throw std::runtime_error ( "Packet length exceeds 2GB-1" );
+ ths->fPacketLength = (XMP_Int32)currLen64;
return eTriYes;
} // CheckPacketEnd
@@ -985,7 +993,7 @@ XMPScanner::PacketMachine::FindNextPacket ()
// InternalSnip
// ============
-XMPScanner::InternalSnip::InternalSnip ( SInt64 offset, SInt64 length )
+XMPScanner::InternalSnip::InternalSnip ( XMP_Int64 offset, XMP_Int64 length )
{
fInfo.fOffset = offset;
@@ -1029,12 +1037,13 @@ XMPScanner::InternalSnip::~InternalSnip ()
// DumpSnipList
// ============
+#if DEBUG
+
static const char * snipStateName [6] = { "not-seen", "pending", "raw-data", "good-packet", "partial", "bad-packet" };
void
XMPScanner::DumpSnipList ( const char * title )
{
-#if 1
InternalSnipIterator currPos = fInternalSnips.begin();
InternalSnipIterator endPos = fInternalSnips.end();
@@ -1046,9 +1055,10 @@ XMPScanner::DumpSnipList ( const char * title )
<< currSnip->fOffset << ".." << (currSnip->fOffset + currSnip->fLength - 1)
<< ' ' << currSnip->fLength << ' ' << endl;
}
-#endif
} // DumpSnipList
+#endif
+
// =================================================================================================
// PrevSnip and NextSnip
@@ -1079,7 +1089,7 @@ XMPScanner::NextSnip ( InternalSnipIterator snipPos )
//
// Initialize the scanner object with one "not seen" snip covering the whole stream.
-XMPScanner::XMPScanner ( SInt64 streamLength ) :
+XMPScanner::XMPScanner ( XMP_Int64 streamLength ) :
fStreamLength ( streamLength )
@@ -1146,7 +1156,7 @@ XMPScanner::StreamAllScanned ()
// *** happen in parallel, serialize all mucking with the list.
void
-XMPScanner::SplitInternalSnip ( InternalSnipIterator snipPos, SInt64 relOffset, SInt64 newLength )
+XMPScanner::SplitInternalSnip ( InternalSnipIterator snipPos, XMP_Int64 relOffset, XMP_Int64 newLength )
{
assert ( (relOffset + newLength) > relOffset ); // Check for overflow.
@@ -1180,7 +1190,7 @@ XMPScanner::SplitInternalSnip ( InternalSnipIterator snipPos, SInt64 relOffset,
if ( newLength < snipPos->fInfo.fLength ) {
InternalSnipIterator nextPos = NextSnip ( snipPos );
- const SInt64 tailLength = snipPos->fInfo.fLength - newLength;
+ const XMP_Int64 tailLength = snipPos->fInfo.fLength - newLength;
if ( (nextPos != fInternalSnips.end()) && (snipPos->fInfo.fState == nextPos->fInfo.fState) ) {
nextPos->fInfo.fOffset -= tailLength; // Adjust the following snip.
@@ -1219,9 +1229,9 @@ XMPScanner::MergeInternalSnips ( InternalSnipIterator firstPos, InternalSnipIter
// ====
void
-XMPScanner::Scan ( const void * bufferOrigin, SInt64 bufferOffset, SInt64 bufferLength )
+XMPScanner::Scan ( const void * bufferOrigin, XMP_Int64 bufferOffset, XMP_Int64 bufferLength )
{
- SInt64 relOffset;
+ XMP_Int64 relOffset;
#if 0
cout << "Scan: @ " << bufferOrigin << ", " << bufferOffset << ", " << bufferLength << endl;
@@ -1244,7 +1254,7 @@ XMPScanner::Scan ( const void * bufferOrigin, SInt64 bufferOffset, SInt64 buffer
// *** It would be friendly for rescans for out of order problems to accept any buffer postion.
- const SInt64 endOffset = bufferOffset + bufferLength - 1;
+ const XMP_Int64 endOffset = bufferOffset + bufferLength - 1;
InternalSnipIterator snipPos = fInternalSnips.begin();
while ( endOffset > (snipPos->fInfo.fOffset + snipPos->fInfo.fLength - 1) ) ++ snipPos;
diff --git a/samples/source/XMPScanner.hpp b/samples/source/XMPScanner.hpp
index 7f92853..2c8b6fa 100644
--- a/samples/source/XMPScanner.hpp
+++ b/samples/source/XMPScanner.hpp
@@ -2,7 +2,7 @@
#define __XMPScanner_hpp__
// =================================================================================================
-// Copyright 2002-2005 Adobe Systems Incorporated
+// Copyright 2002-2007 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -12,12 +12,15 @@
// one format in a file with a different format', inventors: Sean Parent, Greg Gilley.
// =================================================================================================
+#include "XMP_Environment.h" // ! This must be the first include.
+
#include <list>
#include <vector>
#include <string>
#include <memory>
#include <stdexcept>
+#include "XMP_Const.h"
// =================================================================================================
// The XMPScanner class is used to scan a stream of input for XMP packets. A scanner object is
@@ -50,10 +53,6 @@ public:
// It is possible to have ill-formed packets. These have a syntactically valid header and
// trailer, but some semantic error. For example, if the "bytes" attribute length does not span
// to the end of the trailer, or if the following packet begins within trailing padding.
-
- typedef unsigned char UInt8;
- typedef unsigned long UInt32;
- typedef long long SInt64;
enum {
eNotSeenSnip, // This snip has not been seen yet.
@@ -63,7 +62,7 @@ public:
ePartialPacketSnip, // This snip contains the start of a possible XMP packet.
eBadPacketSnip // This snip contains a complete, but semantically incorrect XMP packet.
};
- typedef UInt8 SnipState;
+ typedef XMP_Uns8 SnipState;
enum { // The values allow easy testing for 16/32 bit and big/little endian.
eChar8Bit = 0,
@@ -72,7 +71,7 @@ public:
eChar32BitBig = 4,
eChar32BitLittle = 5
};
- typedef UInt8 CharacterForm;
+ typedef XMP_Uns8 CharacterForm;
enum {
eChar16BitMask = 2, // These constant shouldn't be used directly, they are mainly
@@ -88,14 +87,14 @@ public:
struct SnipInfo {
- SInt64 fOffset; // The byte offset of this snip within the input stream.
- SInt64 fLength; // The length in bytes of this snip.
+ XMP_Int64 fOffset; // The byte offset of this snip within the input stream.
+ XMP_Int64 fLength; // The length in bytes of this snip.
SnipState fState; // The state of this snip.
bool fOutOfOrder; // If true, this snip was seen before the one in front of it.
char fAccess; // The read-only/read-write access from the end attribute.
CharacterForm fCharForm; // How the packet is divided into characters.
const char * fEncodingAttr; // The value of the encoding attribute, if any, with nulls removed.
- SInt64 fBytesAttr; // The value of the bytes attribute, -1 if not present.
+ XMP_Int64 fBytesAttr; // The value of the bytes attribute, -1 if not present.
SnipInfo() :
fOffset ( 0 ),
@@ -108,7 +107,7 @@ public:
fBytesAttr( -1 )
{ }
- SnipInfo ( SnipState state, SInt64 offset, SInt64 length ) :
+ SnipInfo ( SnipState state, XMP_Int64 offset, XMP_Int64 length ) :
fOffset ( offset ),
fLength ( length ),
fState ( state ),
@@ -123,7 +122,7 @@ public:
typedef std::vector<SnipInfo> SnipInfoVector;
- XMPScanner ( SInt64 streamLength );
+ XMPScanner ( XMP_Int64 streamLength );
// Constructs a new XMPScanner object for a stream with the given length.
~XMPScanner();
@@ -134,7 +133,7 @@ public:
bool StreamAllScanned();
// Returns true if all of the stream has been seen.
- void Scan ( const void * bufferOrigin, SInt64 bufferOffset, SInt64 bufferLength );
+ void Scan ( const void * bufferOrigin, XMP_Int64 bufferOffset, XMP_Int64 bufferLength );
// Scans the given part of the input, incorporating it in to the known snips.
// The bufferOffset is the offset of this block of input relative to the entire stream.
// The bufferLength is the length in bytes of this block of input.
@@ -159,10 +158,9 @@ private: // XMPScanner
SnipInfo fInfo; // The public info about this snip.
std::auto_ptr<PacketMachine> fMachine; // The state machine for "active" snips.
- InternalSnip() {}; // Let everything default.
- InternalSnip ( SInt64 offset, SInt64 length );
+ InternalSnip ( XMP_Int64 offset, XMP_Int64 length );
InternalSnip ( const InternalSnip & );
- ~InternalSnip();
+ ~InternalSnip ();
}; // InternalSnip
@@ -172,9 +170,9 @@ private: // XMPScanner
class PacketMachine {
public:
- SInt64 fPacketStart; // Byte offset relative to the entire stream.
- SInt64 fPacketLength; // Length in bytes to the end of the trailer processing instruction.
- SInt64 fBytesAttr; // The value of the bytes attribute, -1 if not present.
+ XMP_Int64 fPacketStart; // Byte offset relative to the entire stream.
+ XMP_Int32 fPacketLength; // Length in bytes to the end of the trailer processing instruction.
+ XMP_Int32 fBytesAttr; // The value of the bytes attribute, -1 if not present.
std::string fEncodingAttr; // The value of the encoding attribute, if any, with nulls removed.
CharacterForm fCharForm; // How the packet is divided into characters.
char fAccess; // The read-only/read-write access from the end attribute.
@@ -190,9 +188,9 @@ private: // XMPScanner
TriState FindNextPacket();
- void AssociateBuffer ( SInt64 bufferOffset, const void * bufferOrigin, SInt64 bufferLength );
+ void AssociateBuffer ( XMP_Int64 bufferOffset, const void * bufferOrigin, XMP_Int64 bufferLength );
- PacketMachine ( SInt64 bufferOffset, const void * bufferOrigin, SInt64 bufferLength );
+ PacketMachine ( XMP_Int64 bufferOffset, const void * bufferOrigin, XMP_Int64 bufferLength );
~PacketMachine();
private: // PacketMachine
@@ -240,7 +238,7 @@ private: // XMPScanner
};
- SInt64 fBufferOffset; // The offset of the data buffer within the input stream.
+ XMP_Int64 fBufferOffset; // The offset of the data buffer within the input stream.
const char * fBufferOrigin; // The starting address of the data buffer for this snip.
const char * fBufferPtr; // The current postion in the data buffer.
const char * fBufferLimit; // The address one past the last byte in the data buffer.
@@ -308,25 +306,25 @@ private: // XMPScanner
}; // PacketMachine
- SInt64 fStreamLength;
+ XMP_Int64 fStreamLength;
InternalSnipList fInternalSnips;
void
- SplitInternalSnip ( InternalSnipIterator snipPos, SInt64 relOffset, SInt64 newLength );
+ SplitInternalSnip ( InternalSnipIterator snipPos, XMP_Int64 relOffset, XMP_Int64 newLength );
InternalSnipIterator
MergeInternalSnips ( InternalSnipIterator firstPos, InternalSnipIterator secondPos );
- void
- DumpSnipList ( const char * title );
-
InternalSnipIterator
PrevSnip ( InternalSnipIterator snipPos );
InternalSnipIterator
NextSnip ( InternalSnipIterator snipPos );
+
+ #if DEBUG
+ void DumpSnipList ( const char * title );
+ #endif
}; // XMPScanner
-
#endif // __XMPScanner_hpp__
diff --git a/samples/source/XmpIterations.cpp b/samples/source/XmpIterations.cpp
new file mode 100644
index 0000000..855bb71
--- /dev/null
+++ b/samples/source/XmpIterations.cpp
@@ -0,0 +1,318 @@
+// =================================================================================================
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+/**
+* Demonstrates how to use the iteration utility in the XMPCore component to walk through property trees.
+*/
+
+#include <string>
+
+// Must be defined to instantiate template classes
+#define TXMP_STRING_TYPE std::string
+
+// Must be defined to give access to XMPFiles
+#define XMP_INCLUDE_XMPFILES 1
+
+// Ensure XMP templates are instantiated
+#include "XMP.incl_cpp"
+
+// Provide access to the API
+#include "XMP.hpp"
+
+#include <iostream>
+
+using namespace std;
+
+// Provide some custom XMP
+static const char * rdf =
+ "<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>"
+ " <rdf:Description rdf:about='' xmlns:xmpTest='http://ns.adobe.com/xmpTest/'>"
+ ""
+ " <xmpTest:MySimpleProp rdf:parseType='Resource'>"
+ " <rdf:value>A Value</rdf:value>"
+ " <xmpTest:MyQual>Qual Value</xmpTest:MyQual>"
+ " </xmpTest:MySimpleProp>"
+ ""
+ " <xmpTest:MyTopStruct rdf:parseType='Resource'>"
+ " <xmpTest:MySecondStruct rdf:parseType='Resource'>"
+ " <xmpTest:MyThirdStruct rdf:parseType='Resource'>"
+ " <xmpTest:MyThirdStructField>Field Value 3</xmpTest:MyThirdStructField>"
+ " </xmpTest:MyThirdStruct>"
+ " <xmpTest:MySecondStructField>Field Value 2</xmpTest:MySecondStructField>"
+ " </xmpTest:MySecondStruct>"
+ " <xmpTest:MyTopStructField>Field Value 1</xmpTest:MyTopStructField>"
+ " </xmpTest:MyTopStruct>"
+
+ " <xmpTest:MyArrayWithNestedArray>"
+ " <rdf:Bag>"
+ " <rdf:li>"
+ " <rdf:Seq>"
+ " <rdf:li>Item 1</rdf:li>"
+ " <rdf:li>Item 2</rdf:li>"
+ " </rdf:Seq>"
+ " </rdf:li>"
+ " </rdf:Bag>"
+ " </xmpTest:MyArrayWithNestedArray>"
+
+ " <xmpTest:MyArrayWithStructures>"
+ " <rdf:Seq>"
+ " <rdf:li rdf:parseType='Resource'>"
+ " <rdf:value>Field Value 1</rdf:value>"
+ " <xmpTest:FirstQual>Qual Value 1</xmpTest:FirstQual>"
+ " <xmpTest:SecondQual>Qual Value 2</xmpTest:SecondQual>"
+ " </rdf:li>"
+ " <rdf:li rdf:parseType='Resource'>"
+ " <rdf:value>Field Value 2</rdf:value>"
+ " <xmpTest:FirstQual>Qual Value 3</xmpTest:FirstQual>"
+ " <xmpTest:SecondQual>Qual Value 4</xmpTest:SecondQual>"
+ " </rdf:li>"
+ " </rdf:Seq>"
+ " </xmpTest:MyArrayWithStructures>"
+ ""
+ " <xmpTest:MyStructureWithArray rdf:parseType='Resource'>"
+ " <xmpTest:NestedArray>"
+ " <rdf:Bag>"
+ " <rdf:li>Item 3</rdf:li>"
+ " <rdf:li>Item 4</rdf:li>"
+ " <rdf:li>Item 5</rdf:li>"
+ " <rdf:li>Item 6</rdf:li>"
+ " </rdf:Bag>"
+ " </xmpTest:NestedArray>"
+ " <xmpTest:NestedArray2>"
+ " <rdf:Bag>"
+ " <rdf:li>Item 66</rdf:li>"
+ " <rdf:li>Item 46</rdf:li>"
+ " <rdf:li>Item 56</rdf:li>"
+ " <rdf:li>Item 66</rdf:li>"
+ " </rdf:Bag>"
+ " </xmpTest:NestedArray2>"
+ " </xmpTest:MyStructureWithArray>"
+ ""
+ " </rdf:Description>"
+ "</rdf:RDF>";
+
+// The namespace to be used. This will be automatically registered
+// when the RDF is parsed.
+const XMP_StringPtr kXMP_NS_SDK = "http://ns.adobe.com/xmpTest/";
+
+/**
+* Reads some metadata from a file and appends some custom XMP to it. Then does several
+* iterations, using various iterators. Each iteration is displayed in the console window.
+*/
+int main()
+{
+ if(SXMPMeta::Initialize())
+ {
+ SXMPFiles::Initialize();
+
+ bool ok;
+ SXMPFiles myFile;
+
+ XMP_OptionBits opts = kXMPFiles_OpenForRead | kXMPFiles_OpenUseSmartHandler;
+ ok = myFile.OpenFile("../../../testfiles/Image1.jpg", kXMP_UnknownFile, opts);
+ if(ok)
+ {
+ SXMPMeta xmp;
+ myFile.GetXMP(&xmp);
+
+ // Add some custom metadata to the XMP object
+ SXMPMeta custXMP(rdf, (XMP_StringLen) strlen(rdf));
+ SXMPUtils::AppendProperties(custXMP, &xmp);
+
+ // Store any details from the iter.Next() call
+ string schemaNS, propPath, propVal;
+
+ // Only visit the immediate children that are leaf properties of the Dublin Core schema
+ SXMPIterator dcLeafIter(xmp, kXMP_NS_DC, (kXMP_IterJustChildren | kXMP_IterJustLeafNodes));
+ while(dcLeafIter.Next(&schemaNS, &propPath, &propVal))
+ {
+ cout << schemaNS << " " << propPath << " = " << propVal << endl;
+ }
+
+ cout << "----------------------------------" << endl;
+
+ // Visit one property from the XMP Basic schema
+ SXMPIterator xmpKeywordsIter(xmp, kXMP_NS_XMP, "Keywords", kXMP_IterJustLeafNodes);
+ while(xmpKeywordsIter.Next(&schemaNS, &propPath, &propVal))
+ {
+ cout << schemaNS << " " << propPath << " = " << propVal << endl;
+ }
+
+ cout << "----------------------------------" << endl;
+
+ // Visit the Dublin Core schema, omit any quailifiers and only
+ // show the leaf properties
+ SXMPIterator dcIter(xmp, kXMP_NS_DC, (kXMP_IterOmitQualifiers | kXMP_IterJustLeafNodes));
+ while(dcIter.Next(&schemaNS, &propPath, &propVal))
+ {
+ cout << schemaNS << " " << propPath << " = " << propVal << endl;
+ }
+
+ cout << "----------------------------------" << endl;
+
+ // Visit the Dublin Core schema, omit any quailifiers,
+ // show the leaf properties but only return the leaf name and not the full path
+ SXMPIterator dcIter2(xmp, kXMP_NS_DC, (kXMP_IterOmitQualifiers | kXMP_IterJustLeafNodes | kXMP_IterJustLeafName));
+ while(dcIter2.Next(&schemaNS, &propPath, &propVal))
+ {
+ cout << schemaNS << " " << propPath << " = " << propVal << endl;
+ }
+
+ cout << "----------------------------------" << endl;
+
+ // Iterate over a single namespace. Show all properties within
+ // the Photoshop schema
+ SXMPIterator exifIter(xmp, kXMP_NS_Photoshop);
+ while(exifIter.Next(&schemaNS, &propPath, &propVal))
+ {
+ cout << schemaNS << " " << propPath << " = " << propVal << endl;
+ }
+
+ cout << "----------------------------------" << endl;
+
+ // Just visit the leaf nodes of EXIF properties. That is just
+ // properties that may have values.
+ SXMPIterator exifLeafIter(xmp, kXMP_NS_EXIF, kXMP_IterJustLeafNodes);
+ while(exifLeafIter.Next(&schemaNS, &propPath, &propVal))
+ {
+ cout << schemaNS << " " << propPath << " = " << propVal << endl;
+ }
+
+ cout << "----------------------------------" << endl;
+
+ // Iterate over all properties but skip the EXIF schema and skip the custom schema
+ // and continue visiting nodes
+ SXMPIterator skipExifIter (xmp);
+ while(skipExifIter.Next(&schemaNS, &propPath, &propVal))
+ {
+ if(schemaNS == kXMP_NS_EXIF || schemaNS == kXMP_NS_SDK)
+ {
+ skipExifIter.Skip(kXMP_IterSkipSubtree);
+ }
+ else
+ {
+ cout << schemaNS << " " << propPath << " = " << propVal << endl;
+ }
+ }
+
+ cout << "----------------------------------" << endl;
+
+ // Iterate over all properties but skip the EXIF schema
+ // and any remaining siblings of the current node.
+ SXMPIterator stopAfterExifIter ( xmp );
+ while(stopAfterExifIter.Next(&schemaNS, &propPath, &propVal))
+ {
+ if(schemaNS == kXMP_NS_EXIF || schemaNS == kXMP_NS_SDK)
+ {
+ stopAfterExifIter.Skip(kXMP_IterSkipSiblings);
+ }
+ else
+ {
+ cout << schemaNS << " " << propPath << " = " << propVal << endl;
+ }
+ }
+
+ cout << "----------------------------------" << endl;
+
+ //////////////////////////////////////////////////////////////////////////////////////
+
+ // Iterate over the custom XMP
+
+ // Visit the immediate children of this node.
+ // No qualifiers are visisted as they are below the property being visisted.
+ SXMPIterator justChildrenIter(xmp, kXMP_NS_SDK, kXMP_IterJustChildren);
+ while(justChildrenIter.Next(&schemaNS, &propPath, &propVal))
+ {
+ cout << propPath << " = " << propVal << endl;
+ }
+
+ cout << "----------------------------------" << endl;
+
+ // Visit the immediate children of this node but only those that may have values.
+ // No qualifiers are visisted as they are below the property being visisted.
+ SXMPIterator justChildrenAndLeafIter(xmp, kXMP_NS_SDK, (kXMP_IterJustChildren | kXMP_IterJustLeafNodes));
+ while(justChildrenAndLeafIter.Next(&schemaNS, &propPath, &propVal))
+ {
+ cout << propPath << " = " << propVal << endl;
+ }
+
+ cout << "----------------------------------" << endl;
+
+ // Visit the leaf nodes of TopStructProperty
+ SXMPIterator myTopStructIter(xmp, kXMP_NS_SDK, "MyTopStruct", kXMP_IterJustLeafNodes);
+ while(myTopStructIter.Next(&schemaNS, &propPath, &propVal))
+ {
+ cout << propPath << " = " << propVal << endl;
+ }
+
+ cout << "----------------------------------" << endl;
+
+ // Visit the leaf nodes of the TopStructProperty but only return the names for
+ // the leaf components and not the full path
+ SXMPIterator xmyTopStructIterShortNames(xmp, kXMP_NS_SDK, "MyTopStruct", (kXMP_IterJustLeafNodes | kXMP_IterJustLeafName));
+ while(xmyTopStructIterShortNames.Next(&schemaNS, &propPath, &propVal))
+ {
+ cout << propPath << " = " << propVal << endl;
+ }
+
+ cout << "----------------------------------" << endl;
+
+ // Visit a property and all of the qualifiers
+ SXMPIterator iterArrayProp (xmp, kXMP_NS_SDK, "ArrayWithStructures", kXMP_IterJustLeafNodes );
+ while(iterArrayProp.Next(&schemaNS, &propPath, &propVal))
+ {
+ cout << propPath << " = " << propVal << endl;
+ }
+
+ cout << "----------------------------------" << endl;
+
+ // Visit a property and omit all of the qualifiers
+ SXMPIterator iterArrayPropNoQual (xmp, kXMP_NS_SDK, "ArrayWithStructures", (kXMP_IterJustLeafNodes | kXMP_IterOmitQualifiers));
+ while(iterArrayPropNoQual.Next(&schemaNS, &propPath, &propVal))
+ {
+ cout << propPath << " = " << propVal << endl;
+ }
+
+ cout << "----------------------------------" << endl;
+
+ // Skip a subtree and continue onwards. Once 'Item 4' is found then the we can skip all of the
+ // siblings of the current node. If the the current node were a top level node the iteration
+ // would be complete as all siblings would be skipped. However, when 'Item 4' is found the current
+ // node is not at the top level so there are other nodes further up the tree that still need to be
+ // visited.
+ SXMPIterator skipIter (xmp, kXMP_NS_SDK, (kXMP_IterJustLeafNodes | kXMP_IterOmitQualifiers | kXMP_IterJustLeafName));
+ while(skipIter.Next(&schemaNS, &propPath, &propVal))
+ {
+ if(propVal == "Item 4")
+ {
+ skipIter.Skip(kXMP_IterSkipSiblings);
+ }
+ else
+ {
+ cout << schemaNS << " " << propPath << " = " << propVal << endl;
+ }
+ }
+
+ /*
+ // Visit all properties and qualifiers
+ SXMPIterator allPropsIter(xmp);
+ while(allPropsIter.Next(&schemaNS, &propPath, &propVal))
+ {
+ cout << schemaNS << " " << propPath << " = " << propVal << endl;
+ }
+ */
+ }
+
+ }
+
+ SXMPFiles::Terminate();
+ SXMPMeta::Terminate();
+
+ return 0;
+}
+
diff --git a/samples/source/common/DumpFile.cpp b/samples/source/common/DumpFile.cpp
new file mode 100644
index 0000000..64aa548
--- /dev/null
+++ b/samples/source/common/DumpFile.cpp
@@ -0,0 +1,4458 @@
+// =================================================================================================
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+//
+// =================================================================================================
+//
+// DumpFile is suitable for both dumping an entire file structure to screen _as well as_ access to
+// specific to specific legacy fields (as much required for auto-testing).
+//
+// Currently supports
+// - JPEG
+// - TIFF
+// - PHOTOSHOP
+// - JPEG2K
+// - WMAV (ASF/WMA/WMV)
+// - AVI
+// - WAV
+// - PNG
+// - InDesign
+// - MP3
+// - MOV (Quicktime)
+// - UCF (done, including comment zips, zip64 (>4GB))
+// - SWF (in progress)
+// - FLV
+// - MPEG-4
+//
+// DumpFile does depend on XMPCore, it does not depend on XMPFiles. Thus not suitable for any form
+// of XMPCore testing. Suitable for XMPFiles in particular reconciliation issues.
+
+#include <stdarg.h>
+#include "globals.h"
+#include "DumpFile.h"
+#include "LargeFileAccess.hpp"
+
+static const XMP_Uns32 CONST_INFINITE=(XMP_Uns32)(-1);
+
+// converts a (supposed) 8Bit-encoded String to Buginese
+// - suitable for UTF-8 or any other encoding
+// - stopOnNull does just that, exceeding length is declared as |R:1234 at the end of string
+// - len is the max parsing size, defaults to unlimited
+// - having set neither stopOnNull nor max parsing size is a bad idea (checked and yields error)
+std::string convert8Bit( void* str, bool stopOnNull, XMP_Uns32 byteLen )
+{
+ std::string r; //result
+ r.clear(); // ...I have become cautious... :-)
+
+ if ( byteLen == 0 )
+ return r; //nothing to do
+
+ //provoke access violation:
+ //if invalid length leads to access violation, I want it here and now...
+ if ( byteLen!=CONST_INFINITE ) { //if not "CONST_INFINITE"
+ char tmp=((char*)str)[byteLen-1];
+ tmp=tmp;
+ }
+ if( !stopOnNull && (byteLen==CONST_INFINITE ) )
+ Log::error("must set either stopOnNULL or specify length of string");
+
+ bool outside = false; // toggle-flag: outside ASCII ?
+ XMP_Uns32 remainder = 0;
+ char buffer[200]; //changed from 20 to 200 (whatever reason there was to have it so small)
+
+ for ( XMP_Uns32 i = 0;
+ i<byteLen; //either byteLen==0 or run forever (read: till 'break')
+ i++ )
+ {
+ XMP_Uns8 ch = ((char*)str)[i];
+ if ( (0x20 <= ch) && (ch <= 0x7E) )
+ { //outside-case
+ if ( outside )
+ r+=">";
+ r+=ch;
+ outside = false;
+ } else {
+ if ( !outside )
+ r+="<"; //first inside-case
+ else
+ r+=" ";
+ sprintf(buffer, "%.2X", ch );
+ r+=buffer;
+ outside = true;
+ }
+
+ if ( stopOnNull && (ch==0)) {
+ if (byteLen!=CONST_INFINITE) remainder = byteLen -i -2;
+ break;
+ }
+ }
+
+ if ( outside ) r+=">";
+ if (remainder>0) {
+ sprintf(buffer, "|R:%d", remainder );
+ r+=buffer;
+ }
+ return r;
+}
+
+
+//same story, but for (UTF-)16BE characters
+//note: length still to be specified in byte, thus must be even (verified)
+std::string convert16Bit( bool bigEndian, XMP_Uns8* str, bool stopOnNull, XMP_Uns32 byteLen )
+{
+ //if invalid length leads to access violation, I want it here and now...
+ if ( byteLen!=CONST_INFINITE ) {
+ char tmp=str[byteLen-1];
+ tmp=tmp;
+ }
+
+ if( !stopOnNull && (byteLen==CONST_INFINITE ) )
+ Log::error("must set either stopOnNULL or specify length of string");
+ if ( (byteLen!=CONST_INFINITE) && (byteLen % 2 != 0) ) //if neither CONST_INFINITE or even...#
+ Log::error("convert16BitToBuginese: byteLen must be even");
+
+
+ bool outside = false; // toggle-flag: outside ASCII ?
+ XMP_Uns32 remainder = 0;
+ char buffer[20];
+
+ std::string r; //result
+ r.clear(); // ...I have become cautious... :-)
+
+ for ( XMP_Uns32 i = 0;
+ i<byteLen; //either byteLen==0 or run forever (read: till 'break')
+ i=i+2 )
+ {
+ XMP_Uns16 ch = (bigEndian) ? GetUns16BE( &str[i] ) : GetUns16LE( &str[i] );
+
+ if ( (0x20 <= ch) && (ch <= 0x7E) )
+ { //outside-case
+ if ( outside )
+ r+=">";
+ r+=(char)ch;
+ outside = false;
+ } else {
+ if ( !outside )
+ r+="<"; //first inside-case
+ else
+ r+=" ";
+ //I want to reflect actual byte order when dumping, thus byte-wise here and no endian-fork
+ sprintf(buffer, "%.2X %.2X", str[i], str[i+1] );
+ r+=buffer;
+ outside = true;
+ }
+
+ if ( stopOnNull && (ch==0)) {
+ if (byteLen!=CONST_INFINITE) remainder = byteLen -i -2;
+ break;
+ }
+ }
+
+ if ( outside ) r+=">";
+ if (remainder>0) {
+ sprintf(buffer, "|R:%d", remainder );
+ r+=buffer;
+ }
+ return r;
+}
+
+
+std::string fromArgs(const char* format, ...)
+{
+ //note: format and ... are somehow "used up", i.e. dumping them
+ // via vsprintf _and_ via printf brought up errors on Mac (only)
+ // i.e. %d %X stuff looking odd (roughly like signed vs unsigned...)
+ // buffer reuse is fine, just dont use format/... twice.
+
+ char buffer[4096]; //should be big enough but no guarantees..
+ va_list args;
+ va_start(args, format);
+ vsprintf(buffer, format, args);
+ va_end(args);
+
+ return std::string(buffer);
+}
+
+#include <iostream>
+#include <stdarg.h> //fpr va_list et al
+
+DumpFileException::DumpFileException(const char *format, ...) : std::runtime_error("dumpfile exception")
+{
+ va_list args; va_start(args, format);
+ vsnprintf( buffer, XMPQE_MAX_ERROR_LENGTH, format, args);
+ va_end(args);
+}
+
+// overriding, since the buffer needs to be constructed first...
+const char* DumpFileException::what_dumpfile_reason()
+{
+ return buffer;
+}
+
+// REMOVED ON PURPOSE: #include <assert.h>
+// define two assert macros, /w and w/o msg
+// (we don't want to slip malformed files through. Neither in release mode.)
+#undef assertMsg
+#undef assert
+
+//TODO: integrate file pos in parse failure description (LFA_Tell ()...)
+
+// this method just
+#define assertNoThrowMsg(msg,c) \
+try { c } \
+catch ( ... ) { \
+ throw DumpFileException( "- assert: %s\n- message: %s\n- location: " __FILE__ ":%u", \
+ #c, std::string( msg ).c_str(), __LINE__ ); \
+}
+
+#define assertMsg(msg,c) \
+if ( ! (c) ) { \
+ throw DumpFileException( "- assert: %s\n- message: %s\n- location: " __FILE__ ":%u", #c, std::string( msg ).c_str(), __LINE__ ); \
+}
+
+#define assert(c) \
+if ( ! (c) ) { \
+ throw DumpFileException( "- assert: %s\n- location: " __FILE__ ":%u", #c, __LINE__ ); \
+}
+
+#define assertEOF(file) \
+if ( ! LFA_isEof(file) ) { \
+ throw DumpFileException( "- assert: feof(file)\n- message: end of file not reached, still at 0x%X\n- location: " __FILE__ ":%u", LFA_Tell (file), __LINE__ ); \
+}
+
+#define fail(msg) \
+ throw DumpFileException( "- failure\n- message: %s\n- location: " __FILE__ ":%u", std::string( msg ).c_str(), __LINE__ );
+
+using namespace std;
+
+//XMPCore related
+//! no use of XMPFiles
+//! no "XMP.incl_cpp" here, happens in Dumpfile/main.cpp resp. CppUnit/main.cpp
+#define TXMP_STRING_TYPE std::string
+#include "XMP.hpp"
+#include "XMP_Const.h"
+
+//scanning routines - needed by PacketScan(...) routine for unknown files
+#include "QEScanner.hpp"
+
+// QE related
+#include "Log.h"
+
+//disabled warning (take-over)
+#if XMP_WinBuild
+ #pragma warning (disable : 4996) // '...' was declared deprecated
+ #pragma warning (disable : 4244) // conversion from '__w64 int' to 'XMP_Uns32', possible loss of data
+ #pragma warning (disable : 4267) // conversion from 'size_t' to 'int', possible loss of data
+#endif
+
+#pragma pack (1)
+
+//the tag tree to be build up,
+// then dumped (dumpfile.exe) resp.
+// resp. queried (testrunner)
+static TagTree* tree;
+
+// =================================================================================================
+
+long kOne = 1;
+char firstByte = *((char*)&kOne);
+
+const bool sBigEndianHost = (firstByte == 0);
+const bool sLittleEndianHost = (firstByte == 1);
+
+typedef const char * ChPtr;
+#define CheckBytes(left,right,len) (memcmp (((ChPtr)(left)), ((ChPtr)(right)), len) == 0)
+
+static XMP_Uns8* sDataPtr = 0; // Used via CaptureFileData for variable length data.
+static XMP_Uns32 sDataMax = 0;
+static XMP_Uns32 sDataLen = 0;
+
+// storing XMP Info 'globally' for a later dump...
+static XMP_Uns8* sXMPPtr = 0; // Used via CaptureXMP for the main XMP.
+static XMP_Uns32 sXMPMax = 0;
+static XMP_Uns32 sXMPLen = 0;
+static XMP_Int64 sXMPPos = 0;
+
+typedef XMP_Uns16 (*GetUns16_Proc) ( const void * addr );
+typedef XMP_Uns32 (*GetUns32_Proc) ( const void * addr );
+typedef XMP_Uns64 (*GetUns64_Proc) ( const void * addr );
+
+static XMP_Uns16 GetUns16BE ( const void * addr );
+static XMP_Uns16 GetUns16LE ( const void * addr );
+static XMP_Uns32 GetUns32BE ( const void * addr );
+static XMP_Uns32 GetUns32LE ( const void * addr );
+static XMP_Uns64 GetUns64BE ( const void * addr );
+static XMP_Uns64 GetUns64LE ( const void * addr );
+
+#define High32(u64) ((XMP_Uns32)((u64) >> 32))
+#define Low32(u64) ((XMP_Uns32)((u64) & 0xFFFFFFFFUL))
+
+// =================================================================================================
+
+// ahead declarations
+static void DumpTIFF ( XMP_Uns8 * tiffContent, XMP_Uns32 tiffLen, XMP_Uns32 fileOffset, const char * label );
+static void DumpIPTC ( XMP_Uns8 * iptcOrigin, XMP_Uns32 iptcLen, XMP_Uns32 fileOffset, const char * label );
+static void DumpImageResources ( XMP_Uns8 * psirOrigin, XMP_Uns32 psirLen, XMP_Uns32 fileOffset, const char * label );
+static void DumpIFDChain ( XMP_Uns8 * startPtr, XMP_Uns8 * endPtr, XMP_Uns8 * tiffContent, XMP_Uns32 fileOffset, const char * label );
+
+// =================================================================================================
+
+static GetUns16_Proc TIFF_GetUns16 = 0; // Keeps endian procs for the "current" TIFF.
+static GetUns32_Proc TIFF_GetUns32 = 0;
+static GetUns64_Proc TIFF_GetUns64 = 0;
+
+enum { // Special TIFF tags
+ kTIFF_XMP = 700,
+ kTIFF_IPTC = 33723,
+ kTIFF_PSIR = 34377,
+ kTIFF_Exif = 34665,
+ kTIFF_GPS = 34853,
+ kTIFF_MakerNote = 37500,
+ kTIFF_Interop = 40965
+};
+
+enum { // Special Photoshop image resource IDs
+ kPSIR_OldCaption = 1008,
+ kPSIR_PrintCaption = 1020,
+ kPSIR_IPTC = 1028,
+ kPSIR_CopyrightFlag = 1034,
+ kPSIR_CopyrightURL = 1035,
+ kPSIR_Exif_1 = 1058,
+ kPSIR_Exif_3 = 1059,
+ kPSIR_XMP = 1060,
+ kPSIR_IPTC_Digest = 1061
+};
+
+struct IPTC_DataSet { // The 5 byte header of an IPTC DataSet.
+ XMP_Uns8 tagMarker;
+ XMP_Uns8 recordNumber;
+ XMP_Uns8 dataSetNumber;
+ XMP_Uns8 octetCountHigh;
+ XMP_Uns8 octetCountLow;
+};
+
+enum { // IPTC DataSet IDs
+ kIPTC_IntellectualGenre = 4,
+ kIPTC_Title = 5,
+ kIPTC_Urgency = 10,
+ kIPTC_SubjectCode = 12,
+ kIPTC_Category = 15,
+ kIPTC_SuppCategory = 20,
+ kIPTC_Keyword = 25,
+ kIPTC_Instructions = 40,
+ kIPTC_DateCreated = 55,
+ kIPTC_TimeCreated = 60,
+ kIPTC_Creator = 80,
+ kIPTC_CreatorJobtitle = 85,
+ kIPTC_City = 90,
+ kIPTC_Location = 92,
+ kIPTC_State = 95,
+ kIPTC_CountryCode = 100,
+ kIPTC_Country = 101,
+ kIPTC_JobID = 103,
+ kIPTC_Headline = 105,
+ kIPTC_Provider = 110,
+ kIPTC_Source = 115,
+ kIPTC_CopyrightNotice = 116,
+ kIPTC_Description = 120,
+ kIPTC_DescriptionWriter = 122
+};
+
+struct DataSetInfo {
+ XMP_Uns8 id;
+ const char * name;
+};
+
+static const DataSetInfo kDataSetNames[] =
+{ { kIPTC_IntellectualGenre, "Intellectual Genre" },
+{ kIPTC_Title, "Title" },
+{ kIPTC_Urgency, "Urgency" },
+{ kIPTC_SubjectCode, "Subject Code" },
+{ kIPTC_Category, "Category" },
+{ kIPTC_SuppCategory, "Supplemental Category" },
+{ kIPTC_Keyword, "Keyword" },
+{ kIPTC_Instructions, "Instructions" },
+{ kIPTC_DateCreated, "Date Created" },
+{ kIPTC_TimeCreated, "Time Created" },
+{ kIPTC_Creator, "Creator" },
+{ kIPTC_CreatorJobtitle, "Creator Jobtitle" },
+{ kIPTC_City, "City" },
+{ kIPTC_Location, "Location" },
+{ kIPTC_State, "Province-State" },
+{ kIPTC_CountryCode, "Country Code" },
+{ kIPTC_Country, "Country" },
+{ kIPTC_JobID, "Job ID" },
+{ kIPTC_Headline, "Headline" },
+{ kIPTC_Provider, "Provider" },
+{ kIPTC_Source, "Source" },
+{ kIPTC_CopyrightNotice, "Copyright Notice" },
+{ kIPTC_Description, "Description" },
+{ kIPTC_DescriptionWriter, "Description Writer" },
+{ 0, 0 } };
+
+enum {
+ kTIFF_Uns8 = 1,
+ kTIFF_ASCII = 2,
+ kTIFF_Uns16 = 3,
+ kTIFF_Uns32 = 4,
+ kTIFF_URational = 5,
+ kTIFF_Int8 = 6,
+ kTIFF_Undef8 = 7,
+ kTIFF_Int16 = 8,
+ kTIFF_Int32 = 9,
+ kTIFF_SRational = 10,
+ kTIFF_Float = 11,
+ kTIFF_Double = 12,
+ kTIFF_TypeEnd
+};
+
+static const int sTIFF_TypeSizes[] = { 0, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8 };
+static const char * sTIFF_TypeNames[] = { "", "BYTE", "ASCII", "SHORT", "LONG", "RATIONAL",
+"SBYTE", "UNDEFINED", "SSHORT", "SLONG", "SRATIONAL",
+"FLOAT", "DOUBLE" };
+
+struct TagNameInfo {
+ long tag;
+ const char * name;
+};
+
+static const TagNameInfo sTIFF_TagNames[] =
+{ { 256, "ImageWidth" },
+{ 257, "ImageLength" },
+{ 258, "BitsPerSample" },
+{ 259, "Compression" },
+{ 262, "PhotometricInterpretation" },
+{ 270, "ImageDescription" },
+{ 271, "Make" },
+{ 272, "Model" },
+{ 274, "Orientation" },
+{ 282, "XResolution" },
+{ 283, "YResolution" },
+{ 284, "PlanarConfiguration" },
+{ 296, "ResolutionUnit" },
+{ 301, "TransferFunction" },
+{ 305, "Software" },
+{ 306, "DateTime" },
+{ 315, "Artist" },
+{ 318, "WhitePoint" },
+{ 319, "PrimaryChromaticities" },
+{ 529, "YCbCrCoefficients" },
+{ 530, "YCbCrSubSampling" },
+{ 531, "YCbCrPositioning" },
+{ 532, "ReferenceBlackWhite" },
+{ 33432, "Copyright" },
+{ 33434, "ExposureTime" },
+{ 33437, "FNumber" },
+{ 34850, "ExposureProgram" },
+{ 34852, "SpectralSensitivity" },
+{ 34855, "ISOSpeedRatings" },
+{ 34856, "OECF" },
+{ 36864, "ExifVersion" },
+{ 36867, "DateTimeOriginal" },
+{ 36868, "DateTimeDigitized" },
+{ 37121, "ComponentsConfiguration" },
+{ 37122, "CompressedBitsPerPixel" },
+{ 37377, "ShutterSpeedValue" },
+{ 37378, "ApertureValue" },
+{ 37379, "BrightnessValue" },
+{ 37380, "ExposureBiasValue" },
+{ 37381, "MaxApertureValue" },
+{ 37382, "SubjectDistance" },
+{ 37383, "MeteringMode" },
+{ 37384, "LightSource" },
+{ 37385, "Flash" },
+{ 37386, "FocalLength" },
+{ 37396, "SubjectArea" },
+{ 37500, "MakerNote" },
+{ 37510, "UserComment" },
+{ 37520, "SubSecTime" },
+{ 37521, "SubSecTimeOriginal" },
+{ 37522, "SubSecTimeDigitized" },
+{ 40960, "FlashpixVersion" },
+{ 40961, "ColorSpace" },
+{ 40962, "PixelXDimension" },
+{ 40963, "PixelYDimension" },
+{ 40964, "RelatedSoundFile" },
+{ 41483, "FlashEnergy" },
+{ 41484, "SpatialFrequencyResponse" },
+{ 41486, "FocalPlaneXResolution" },
+{ 41487, "FocalPlaneYResolution" },
+{ 41488, "FocalPlaneResolutionUnit" },
+{ 41492, "SubjectLocation" },
+{ 41493, "ExposureIndex" },
+{ 41495, "SensingMethod" },
+{ 41728, "FileSource" },
+{ 41729, "SceneType" },
+{ 41730, "CFAPattern" },
+{ 41985, "CustomRendered" },
+{ 41986, "ExposureMode" },
+{ 41987, "WhiteBalance" },
+{ 41988, "DigitalZoomRatio" },
+{ 41989, "FocalLengthIn35mmFilm" },
+{ 41990, "SceneCaptureType" },
+{ 41991, "GainControl" },
+{ 41992, "Contrast" },
+{ 41993, "Saturation" },
+{ 41994, "Sharpness" },
+{ 41995, "DeviceSettingDescription" },
+{ 41996, "SubjectDistanceRange" },
+{ 42016, "ImageUniqueID" },
+{ 50706, "DNGVersion" },
+{ 50707, "DNGBackwardVersion" },
+{ 50708, "DNG UniqueCameraModel" },
+{ 0, "" } };
+
+// =================================================================================================
+
+struct ASF_GUID {
+
+ XMP_Uns32 part1; // Written little endian.
+ XMP_Uns16 part2; // Written little endian.
+ XMP_Uns16 part3; // Written little endian.
+ XMP_Uns16 part4; // Written big endian.
+ XMP_Uns8 part5[6]; // Written in order.
+
+ ASF_GUID() {};
+ ASF_GUID ( XMP_Uns32 p1, XMP_Uns16 p2, XMP_Uns16 p3, XMP_Uns16 p4, const void* p5 )
+ {
+ part1 = GetUns32LE (&p1);
+ part2 = GetUns16LE (&p2);
+ part3 = GetUns16LE (&p3);
+ part4 = GetUns16BE (&p4);
+ memcpy (&part5, p5, 6);
+ };
+
+};
+
+enum { // Objects for which we have special knowledge.
+ kASFObj_Unknown = 0,
+ kASFObj_Header, // Special top level objects.
+ kASFObj_Data,
+ kASFObj_XMP,
+ kASFObj_FileProperties, // Children of the Header Object.
+ kASFObj_ContentDesc,
+ kASFObj_ContentBrand,
+ kASFObj_ContentEncrypt,
+ kASFObj_HeaderExtension,
+ kASFObj_Padding
+
+};
+
+static const ASF_GUID kASF_HeaderGUID ( 0x75B22630, 0x668E, 0x11CF, 0xA6D9, "\x00\xAA\x00\x62\xCE\x6C" );
+
+struct ASF_ObjectInfo {
+ ASF_GUID guid;
+ const char * name;
+ XMP_Uns8 kind;
+};
+
+static const ASF_ObjectInfo kASF_KnownObjects[] =
+{
+ { ASF_GUID (0x75B22630, 0x668E, 0x11CF, 0xA6D9, "\x00\xAA\x00\x62\xCE\x6C"), "Header", kASFObj_Header },
+ { ASF_GUID (0x75B22636, 0x668E, 0x11CF, 0xA6D9, "\x00\xAA\x00\x62\xCE\x6C"), "Data", kASFObj_Data },
+ { ASF_GUID (0xBE7ACFCB, 0x97A9, 0x42E8, 0x9C71, "\x99\x94\x91\xE3\xAF\xAC"), "XMP", kASFObj_XMP },
+
+ { ASF_GUID (0x33000890, 0xE5B1, 0x11CF, 0x89F4, "\x00\xA0\xC9\x03\x49\xCB"), "Simple_Index", 0 },
+ { ASF_GUID (0xD6E229D3, 0x35DA, 0x11D1, 0x9034, "\x00\xA0\xC9\x03\x49\xBE"), "Index", 0 },
+ { ASF_GUID (0xFEB103F8, 0x12AD, 0x4C64, 0x840F, "\x2A\x1D\x2F\x7A\xD4\x8C"), "Media_Object_Index", 0 },
+ { ASF_GUID (0x3CB73FD0, 0x0C4A, 0x4803, 0x953D, "\xED\xF7\xB6\x22\x8F\x0C"), "Timecode_Index", 0 },
+
+ { ASF_GUID (0x8CABDCA1, 0xA947, 0x11CF, 0x8EE4, "\x00\xC0\x0C\x20\x53\x65"), "File_Properties", kASFObj_FileProperties },
+ { ASF_GUID (0xB7DC0791, 0xA9B7, 0x11CF, 0x8EE6, "\x00\xC0\x0C\x20\x53\x65"), "Stream_Properties", 0 },
+ { ASF_GUID (0x5FBF03B5, 0xA92E, 0x11CF, 0x8EE3, "\x00\xC0\x0C\x20\x53\x65"), "Header_Extension", kASFObj_HeaderExtension },
+ { ASF_GUID (0x86D15240, 0x311D, 0x11D0, 0xA3A4, "\x00\xA0\xC9\x03\x48\xF6"), "Codec_List", 0 },
+ { ASF_GUID (0x1EFB1A30, 0x0B62, 0x11D0, 0xA39B, "\x00\xA0\xC9\x03\x48\xF6"), "Script_Command", 0 },
+ { ASF_GUID (0xF487CD01, 0xA951, 0x11CF, 0x8EE6, "\x00\xC0\x0C\x20\x53\x65"), "Marker", 0 },
+ { ASF_GUID (0xD6E229DC, 0x35DA, 0x11D1, 0x9034, "\x00\xA0\xC9\x03\x49\xBE"), "Bitrate_Mutual_Exclusion", 0 },
+ { ASF_GUID (0x75B22635, 0x668E, 0x11CF, 0xA6D9, "\x00\xAA\x00\x62\xCE\x6C"), "Error_Correction", 0 },
+ { ASF_GUID (0x75B22633, 0x668E, 0x11CF, 0xA6D9, "\x00\xAA\x00\x62\xCE\x6C"), "Content_Description", kASFObj_ContentDesc },
+ { ASF_GUID (0xD2D0A440, 0xE307, 0x11D2, 0x97F0, "\x00\xA0\xC9\x5E\xA8\x50"), "Extended_Content_Description", 0 },
+ { ASF_GUID (0x2211B3FA, 0xBD23, 0x11D2, 0xB4B7, "\x00\xA0\xC9\x55\xFC\x6E"), "Content_Branding", kASFObj_ContentBrand },
+ { ASF_GUID (0x7BF875CE, 0x468D, 0x11D1, 0x8D82, "\x00\x60\x97\xC9\xA2\xB2"), "Stream_Bitrate_Properties", 0 },
+ { ASF_GUID (0x2211B3FB, 0xBD23, 0x11D2, 0xB4B7, "\x00\xA0\xC9\x55\xFC\x6E"), "Content_Encryption", kASFObj_ContentEncrypt },
+ { ASF_GUID (0x298AE614, 0x2622, 0x4C17, 0xB935, "\xDA\xE0\x7E\xE9\x28\x9C"), "Extended_Content_Encryption", 0 },
+ { ASF_GUID (0x2211B3FC, 0xBD23, 0x11D2, 0xB4B7, "\x00\xA0\xC9\x55\xFC\x6E"), "Digital_Signature", 0 },
+ { ASF_GUID (0x1806D474, 0xCADF, 0x4509, 0xA4BA, "\x9A\xAB\xCB\x96\xAA\xE8"), "Padding", kASFObj_Padding },
+
+ { ASF_GUID (0x14E6A5CB, 0xC672, 0x4332, 0x8399, "\xA9\x69\x52\x06\x5B\x5A"), "Extended_Stream_Properties", 0 },
+ { ASF_GUID (0xA08649CF, 0x4775, 0x4670, 0x8A16, "\x6E\x35\x35\x75\x66\xCD"), "Advanced_Mutual_Exclusion", 0 },
+ { ASF_GUID (0xD1465A40, 0x5A79, 0x4338, 0xB71B, "\xE3\x6B\x8F\xD6\xC2\x49"), "Group_Mutual_Exclusion", 0 },
+ { ASF_GUID (0xD4FED15B, 0x88D3, 0x454F, 0x81F0, "\xED\x5C\x45\x99\x9E\x24"), "Stream_Prioritization", 0 },
+ { ASF_GUID (0xA69609E6, 0x517B, 0x11D2, 0xB6AF, "\x00\xC0\x4F\xD9\x08\xE9"), "Bandwidth_Sharing", 0 },
+ { ASF_GUID (0x7C4346A9, 0xEFE0, 0x4BFC, 0xB229, "\x39\x3E\xDE\x41\x5C\x85"), "Language_List", 0 },
+ { ASF_GUID (0xC5F8CBEA, 0x5BAF, 0x4877, 0x8467, "\xAA\x8C\x44\xFA\x4C\xCA"), "Metadata", 0 },
+ { ASF_GUID (0x44231C94, 0x9498, 0x49D1, 0xA141, "\x1D\x13\x4E\x45\x70\x54"), "Metadata_Library", 0 },
+ { ASF_GUID (0xD6E229DF, 0x35DA, 0x11D1, 0x9034, "\x00\xA0\xC9\x03\x49\xBE"), "Index_Parameters", 0 },
+ { ASF_GUID (0x6B203BAD, 0x3F11, 0x48E4, 0xACA8, "\xD7\x61\x3D\xE2\xCF\xA7"), "Media_Object_Index_Parameters", 0 },
+ { ASF_GUID (0xF55E496D, 0x9797, 0x4B5D, 0x8C8B, "\x60\x4D\xFE\x9B\xFB\x24"), "Timecode_Index_Parameters", 0 },
+ { ASF_GUID (0x75B22630, 0x668E, 0x11CF, 0xA6D9, "\x00\xAA\x00\x62\xCE\x6C"), "Compatibility", 0 },
+ { ASF_GUID (0x43058533, 0x6981, 0x49E6, 0x9B74, "\xAD\x12\xCB\x86\xD5\x8C"), "Advanced_Content_Encryption", 0 },
+
+ { ASF_GUID (0x00000000, 0x0000, 0x0000, 0x0000, "\x00\x00\x00\x00\x00\x00"), 0, 0 }
+};
+
+struct ASF_ObjHeader {
+ ASF_GUID guid;
+ XMP_Int64 size;
+};
+
+struct ASF_FileProperties {
+ ASF_GUID guid;
+ XMP_Int64 size;
+ ASF_GUID fileID;
+ XMP_Int64 fileSize;
+ XMP_Int64 creationDate; // Number of 100-nanosecond intervals since January 1, 1601.
+ XMP_Int64 dataPacketsCount;
+ XMP_Int64 playDuration;
+ XMP_Int64 sendDuration;
+ XMP_Int64 preroll;
+ XMP_Uns32 flags; // The Broadcast flag is bit 0 (lsb).
+ XMP_Uns32 minDataPacketSize;
+ XMP_Uns32 maxDataPacketSize;
+ XMP_Uns32 maxBitrate;
+};
+#define kASF_FilePropertiesSize (16 + 8 + 16 + 6*8 + 4*4)
+
+struct ASF_ContentDescription {
+ ASF_GUID guid;
+ XMP_Int64 size;
+ XMP_Uns16 titleLen;
+ XMP_Uns16 authorLen;
+ XMP_Uns16 copyrightLen;
+ XMP_Uns16 descriptionLen;
+ XMP_Uns16 ratingLen;
+ // Little endian UTF-16 strings follow, no BOM, possible nul terminator.
+};
+#define kASF_ContentDescriptionSize (16 + 8 + 5*2)
+
+#if 0 // ! Has embedded variable length fields!
+struct ASF_ContentBranding {
+ ASF_GUID guid;
+ XMP_Int64 size;
+ XMP_Uns32 bannerType;
+ XMP_Uns32 bannerDataSize;
+ // The banner data is here.
+ XMP_Uns32 bannerURLSize;
+ // The banner URL string is here, an ASCII string.
+ XMP_Uns32 copyrightURLSize;
+ // The copyright URL string is here, an ASCII string.
+};
+#endif
+
+#if 0 // ! Has embedded variable length fields!
+struct ASF_ContentEncryption {
+ ASF_GUID guid;
+ XMP_Int64 size;
+ XMP_Uns32 secretDataSize;
+ // The secret data is here.
+ XMP_Uns32 protectionTypeSize;
+ // The protection type is here, an ASCII string.
+ XMP_Uns32 keyIDSize;
+ // The key ID is here, an ASCII string.
+ XMP_Uns32 licenseURLSize;
+ // The licensed URL is here, an ASCII string.
+};
+#endif
+
+struct ASF_HeaderExtension {
+ ASF_GUID guid;
+ XMP_Int64 size;
+ ASF_GUID reserved1;
+ XMP_Uns16 reserved2;
+ XMP_Uns32 dataLen;
+ // The header extension data is a sequence of nested objects.
+};
+#define kASF_HeaderExtensionSize (16 + 8 + 16 + 2 + 4)
+
+// =================================================================================================
+
+enum {
+ kINDD_PageSize = 4096,
+ kINDD_LittleEndian = 1,
+ kINDD_BigEndian = 2,
+ kInDesignGUIDSize = 16
+};
+
+struct InDesignMasterPage {
+ XMP_Uns8 fGUID [kInDesignGUIDSize];
+ XMP_Uns8 fMagicBytes [8];
+ XMP_Uns8 fObjectStreamEndian;
+ XMP_Uns8 fIrrelevant1 [239];
+ XMP_Uns64 fSequenceNumber;
+ XMP_Uns8 fIrrelevant2 [8];
+ XMP_Uns32 fFilePages;
+ XMP_Uns8 fIrrelevant3 [3812];
+};
+
+static const XMP_Uns8 kInDesign_MasterPageGUID [kInDesignGUIDSize] =
+{ 0x06, 0x06, 0xED, 0xF5, 0xD8, 0x1D, 0x46, 0xE5, 0xBD, 0x31, 0xEF, 0xE7, 0xFE, 0x74, 0xB7, 0x1D };
+
+struct InDesignContigObjMarker {
+ XMP_Uns8 fGUID [kInDesignGUIDSize];
+ XMP_Uns32 fObjectUID;
+ XMP_Uns32 fObjectClassID;
+ XMP_Uns32 fStreamLength;
+ XMP_Uns32 fChecksum;
+};
+
+static const XMP_Uns8 kINDDContigObjHeaderGUID [kInDesignGUIDSize] =
+{ 0xDE, 0x39, 0x39, 0x79, 0x51, 0x88, 0x4B, 0x6C, 0x8E, 0x63, 0xEE, 0xF8, 0xAE, 0xE0, 0xDD, 0x38 };
+
+// =================================================================================================
+
+struct FileExtMapping {
+ XMP_StringPtr ext;
+ XMP_FileFormat format;
+};
+
+const FileExtMapping kFileExtMap[] = // Add all known mappings, multiple mappings (tif, tiff) are OK.
+{ { "pdf", kXMP_PDFFile },
+{ "ps", kXMP_PostScriptFile },
+{ "eps", kXMP_EPSFile },
+
+{ "jpg", kXMP_JPEGFile },
+{ "jpeg", kXMP_JPEGFile },
+{ "jpx", kXMP_JPEG2KFile },
+{ "tif", kXMP_TIFFFile },
+{ "tiff", kXMP_TIFFFile },
+{ "gif", kXMP_GIFFile },
+{ "giff", kXMP_GIFFile },
+{ "png", kXMP_PNGFile },
+
+{ "swf", kXMP_SWFFile },
+{ "flv", kXMP_FLVFile },
+
+{ "aif", kXMP_AIFFFile },
+
+{ "mov", kXMP_MOVFile },
+{ "avi", kXMP_AVIFile },
+{ "cin", kXMP_CINFile },
+{ "wav", kXMP_WAVFile },
+{ "mp3", kXMP_MP3File },
+{ "mp4", kXMP_MPEG4File },
+{ "ses", kXMP_SESFile },
+{ "cel", kXMP_CELFile },
+{ "wma", kXMP_WMAVFile },
+{ "wmv", kXMP_WMAVFile },
+
+{ "mpg", kXMP_MPEGFile },
+{ "mpeg", kXMP_MPEGFile },
+{ "mp2", kXMP_MPEGFile },
+{ "mod", kXMP_MPEGFile },
+{ "m2v", kXMP_MPEGFile },
+{ "mpa", kXMP_MPEGFile },
+{ "mpv", kXMP_MPEGFile },
+{ "m2p", kXMP_MPEGFile },
+{ "m2a", kXMP_MPEGFile },
+{ "m2t", kXMP_MPEGFile },
+{ "mpe", kXMP_MPEGFile },
+{ "vob", kXMP_MPEGFile },
+{ "ms-pvr", kXMP_MPEGFile },
+{ "dvr-ms", kXMP_MPEGFile },
+
+{ "html", kXMP_HTMLFile },
+{ "xml", kXMP_XMLFile },
+{ "txt", kXMP_TextFile },
+{ "text", kXMP_TextFile },
+
+{ "psd", kXMP_PhotoshopFile },
+{ "ai", kXMP_IllustratorFile },
+{ "indd", kXMP_InDesignFile },
+{ "indt", kXMP_InDesignFile },
+{ "aep", kXMP_AEProjectFile },
+{ "aet", kXMP_AEProjTemplateFile },
+{ "ffx", kXMP_AEFilterPresetFile },
+{ "ncor", kXMP_EncoreProjectFile },
+{ "prproj", kXMP_PremiereProjectFile },
+{ "prtl", kXMP_PremiereTitleFile },
+
+{ 0, kXMP_UnknownFile } }; // ! Must be last as a sentinel.
+
+// File convenience wrappers (now LFA-based) ====================================
+
+// skip forward by <size> bytes and verify not beyond EOF
+void static Skip(LFA_FileRef file, XMP_Int64 size)
+{
+ // assert no more, since LFA_Seek does not return 0 to say o.k., but actual filePos
+ // OLD assertMsg("unexpected end of file", 0 == LFA_Seek (file, size, SEEK_CUR) );
+ LFA_Seek(file, size, SEEK_CUR);
+}
+
+// going back in the file (use positive values!)
+// (yes redundant to above but "makes a better read")
+void static Rewind(LFA_FileRef file, XMP_Int64 size)
+{
+ assertMsg("use positive values",size > 0);
+ LFA_Seek (file, -size, SEEK_CUR); // ditto to above
+}
+
+// overload, no size parameter, rewinds to start
+void static Rewind(LFA_FileRef file)
+{
+ LFA_Seek (file, 0, SEEK_SET);
+}
+
+XMP_Uns32 static Peek32u(LFA_FileRef file)
+{
+ XMP_Uns32 value = tree->digest32u(file);
+ Rewind(file, 4);
+ return value;
+}
+
+
+// =================================================================================================
+
+static XMP_FileFormat
+LookupFileExtMapping ( const char * filePath )
+{
+ std::string fileExt;
+ size_t extPos = strlen (filePath);
+ for ( --extPos; extPos > 0; --extPos ) if ( filePath[extPos] == '.' ) break;
+
+ if ( filePath[extPos] != '.' ) return kXMP_UnknownFile;
+
+ ++extPos;
+ fileExt.assign ( &filePath[extPos] );
+ for ( size_t i = 0; i < fileExt.size(); ++i ) {
+ if ( ('A' <= fileExt[i]) && (fileExt[i] <= 'Z') ) fileExt[i] += 0x20;
+ }
+
+ size_t mapPos;
+ for ( mapPos = 0; kFileExtMap[mapPos].ext != 0; ++mapPos ) {
+ if ( fileExt == kFileExtMap[mapPos].ext ) break;
+ }
+
+ return kFileExtMap[mapPos].format;
+
+} // LookupFileExtMapping
+
+// =================================================================================================
+
+//*** used by in-RAM code? needs replacement?
+static void
+CaptureFileData ( LFA_FileRef file, XMP_Int64 offset, XMP_Uns32 length )
+{
+
+ if ( length > sDataMax ) {
+ if ( sDataPtr != 0 ) free (sDataPtr);
+ sDataPtr = (XMP_Uns8*) malloc (length);
+ sDataMax = length;
+ }
+
+ if ( offset != 0 ) LFA_Seek ( file, (long)offset, SEEK_SET );
+ LFA_Read ( file, sDataPtr, length, true);
+ sDataLen = length;
+
+} // CaptureFileData
+
+// -------------------------------------------------------------------------------------------------
+
+//*** used by in-RAM code? needs replacement !!!
+static void
+CaptureXMPF ( LFA_FileRef file, XMP_Int64 offset, XMP_Uns32 length )
+{
+
+ if ( length > sXMPMax ) {
+ if ( sXMPPtr != 0 ) free (sXMPPtr);
+ sXMPPtr = (XMP_Uns8*) malloc (length);
+ sXMPMax = length;
+ }
+
+ if ( offset != 0 ) LFA_Seek ( file, (long)offset, SEEK_SET );
+ LFA_Read ( file, sXMPPtr, length, true);
+ sXMPLen = length;
+ sXMPPos = offset;
+
+} // CaptureXMPF
+
+// -------------------------------------------------------------------------------------------------
+
+static void
+CaptureXMP ( const XMP_Uns8 * xmpPtr, const XMP_Uns32 xmpLen, XMP_Int64 fileOffset )
+{
+
+ if ( xmpLen > sXMPMax ) {
+ if (sXMPPtr != 0) free (sXMPPtr);
+ sXMPPtr = (XMP_Uns8*) malloc (xmpLen);
+ sXMPMax = xmpLen;
+ }
+
+ memcpy ( sXMPPtr, xmpPtr, xmpLen );
+ sXMPLen = xmpLen;
+ sXMPPos = fileOffset;
+
+} // CaptureXMP
+
+// -------------------------------------------------------------------------------------------------
+
+static void PrintOnlyASCII_8 ( XMP_Uns8 * strPtr, XMP_Uns32 strLen, const char * /*label = 0*/, bool /*stopOnNUL*/ = true )
+{
+ //wrapping to QEBuginese
+ // - NB: remainder (zero termination earlier then length) is catered for...
+
+ tree->addComment ( convert8Bit ( strPtr, true, strLen ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+static void PrintOnlyASCII_16BE ( XMP_Uns16 * u16Ptr, XMP_Uns32 u16Bytes,
+ const char * label = 0, bool stopOnNUL = true )
+{
+ //TODO: wrap to QEBuginese just like 8bit flavor above...
+
+ bool prevBig = false;
+ size_t remainder = 0;
+ XMP_Uns32 u16Count = u16Bytes/2;
+
+ if ( (label != 0) && (*label != 0) ) tree->addComment ( "%s \"", label );
+
+ for ( XMP_Uns32 i = 0; i < u16Count; ++i ) {
+
+ XMP_Uns16 u16 = u16Ptr[i];
+ u16 = GetUns16BE (&u16);
+
+ if ( (0x20 <= u16) && (u16 <= 0x7E) ) {
+ if (prevBig) tree->addComment ( "\xA9" );
+ tree->addComment ( "%c", u16 );
+ prevBig = false;
+ } else {
+ if ( ! prevBig ) tree->addComment ( "\xA9" );
+ tree->addComment ( "%.4X", u16 );
+ prevBig = true;
+ if ( (u16 == 0) && stopOnNUL ) {
+ remainder = 2 * (u16Count - (i + 1));
+ break;
+ }
+ }
+
+ }
+
+ if ( prevBig ) tree->addComment ( "\xA9" );
+
+ if ( (label != 0) && (*label != 0) ) {
+ tree->addComment ( "\"" );
+ if (remainder != 0) tree->addComment ( "** remainder %d bytes **", remainder );
+
+ }
+
+} // PrintOnlyASCII_16BE
+
+// -------------------------------------------------------------------------------------------------
+
+static void PrintOnlyASCII_16LE ( XMP_Uns16 * u16Ptr, XMP_Uns32 u16Bytes,
+ const char * label = 0, bool stopOnNUL = true )
+{
+ bool prevBig = false;
+ size_t remainder = 0;
+ XMP_Uns32 u16Count = u16Bytes/2;
+
+ if ( (label != 0) && (*label != 0) ) tree->addComment ( "%s \"", label );
+
+ for ( XMP_Uns32 i = 0; i < u16Count; ++i ) {
+
+ XMP_Uns16 u16 = u16Ptr[i];
+ u16 = GetUns16LE (&u16);
+
+ if ( (0x20 <= u16) && (u16 <= 0x7E) ) {
+ if ( prevBig ) tree->addComment ( "\xA9" );
+ tree->addComment ( "%c", u16 );
+ prevBig = false;
+ } else {
+ if ( ! prevBig ) tree->addComment ( "\xA9" );
+ tree->addComment ( "%.4X", u16 );
+ prevBig = true;
+ if ( (u16 == 0) && stopOnNUL ) {
+ remainder = 2 * (u16Count - (i + 1));
+ break;
+ }
+ }
+
+ }
+
+ if ( prevBig ) tree->addComment ( "\xA9" );
+
+ if ( (label != 0) && (*label != 0) ) {
+ tree->addComment ( "\"" );
+ if ( remainder != 0 ) tree->addComment ( "** remainder %d bytes **", remainder );
+
+ }
+
+} // PrintOnlyASCII_16LE
+
+// =================================================================================================
+
+static const XMP_Int64 kJPEGMinSize = 4; // At least the SOI and EOI markers.
+static const XMP_Uns8 kJPEGStart[] = { 0xFF, 0xD8, 0xFF }; // 0xFFD8 is SOI, plus 0xFF for next marker.
+
+static const XMP_Int64 kPhotoshopMinSize = 26 + 4*4; // At least the file header and 4 section lengths.
+static const XMP_Uns8 kPhotoshopV1Start[] = { 0x38, 0x42, 0x50, 0x53, 0x00, 0x01 }; // 0x38425053 is "8BPS".
+static const XMP_Uns8 kPhotoshopV2Start[] = { 0x38, 0x42, 0x50, 0x53, 0x00, 0x02 };
+
+static const XMP_Int64 kTIFFMinSize = 8+2+12+4; // At least the header plus 1 minimal IFD.
+static const XMP_Uns8 kTIFFBigStart[] = { 0x4D, 0x4D, 0x00, 0x2A }; // 0x4D is 'M', 0x2A is 42.
+static const XMP_Uns8 kTIFFLittleStart[] = { 0x49, 0x49, 0x2A, 0x00 }; // 0x49 is 'I'.
+
+static const XMP_Int64 kJPEG2KMinSize = 12+16; // At least the signature and minimal file type boxes.
+static const XMP_Uns8 kJPEG2KStart[] = { 0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20, 0x0D, 0x0A, 0x87, 0x0A };
+
+static const XMP_Int64 kPNGMinSize = 8 + (12+13) + 12; // At least the file header plus IHDR and IEND chunks.
+static const XMP_Uns8 kPNGStart[] = { 137, 80, 78, 71, 13, 10, 26, 10 };
+
+static const XMP_Int64 kASFMinSize = 16; // ! Not really accurate, but covers the header GUID.
+
+static const XMP_Int64 kRIFFMinSize = 12;
+
+static const XMP_Int64 kInDesignMinSize = 2 * kINDD_PageSize; // Two master pages.
+
+static const XMP_Int64 kISOMediaMinSize = 16; // At least a minimal file type box.
+static const XMP_Uns8 kISOMediaFTyp[] = { 0x66, 0x74, 0x79, 0x70 }; // "ftyp"
+
+static const XMP_Uns32 kISOTag_ftyp = 0x66747970UL;
+static const XMP_Uns32 kISOTag_uuid = 0x75756964UL;
+static const XMP_Uns32 kISOTag_moov = 0x6D6F6F76UL;
+static const XMP_Uns32 kISOTag_mvhd = 0x6D766864UL;
+static const XMP_Uns32 kISOTag_udta = 0x75647461UL;
+static const XMP_Uns32 kISOTag_trak = 0x7472616BUL;
+static const XMP_Uns32 kISOTag_meta = 0x6D657461UL;
+static const XMP_Uns32 kISOTag_ilst = 0x696C7374UL;
+
+static const XMP_Uns32 kISOBrand_mp41 = 0x6D703431UL;
+static const XMP_Uns32 kISOBrand_mp42 = 0x6D703432UL;
+static const XMP_Uns32 kISOBrand_f4v = 0x66347620UL;
+
+static const XMP_Uns32 kQTTag_XMP_ = 0x584D505FUL;
+
+static const XMP_Int64 kSWFMinSize = (8+2+4 + 2); // Header with minimal rectangle and an End tag.
+
+static const XMP_Int64 kFLVMinSize = 9; // Header with zero length data.
+
+static XMP_FileFormat
+CheckFileFormat ( const char * filePath, XMP_Uns8 * fileContent, XMP_Int64 fileSize )
+{
+ // ! The buffer passed to CheckFileFormat is just the first 4K bytes of the file.
+
+ if ( (fileSize >= kJPEGMinSize) && CheckBytes (fileContent, kJPEGStart, 3) ) {
+ return kXMP_JPEGFile;
+ }
+
+ if ( (fileSize >= kPhotoshopMinSize) &&
+ (CheckBytes ( fileContent, kPhotoshopV1Start, 6 ) || CheckBytes ( fileContent, kPhotoshopV2Start, 6 )) ) {
+ return kXMP_PhotoshopFile;
+ }
+
+ if ( (fileSize >= kTIFFMinSize ) &&
+ (CheckBytes ( fileContent, kTIFFBigStart , 4 ) || CheckBytes ( fileContent, kTIFFLittleStart, 4 )) ) {
+ return kXMP_TIFFFile;
+ }
+
+ if ( (fileSize >= kJPEG2KMinSize) && CheckBytes ( fileContent, kJPEG2KStart, 12 ) ) {
+ return kXMP_JPEG2KFile;
+ }
+
+ if ( (fileSize >= kASFMinSize) && CheckBytes ( fileContent, &kASF_HeaderGUID, 16 ) ) {
+ return kXMP_WMAVFile;
+ }
+
+ if ( (fileSize >= kPNGMinSize) && CheckBytes ( fileContent, kPNGStart, 8 ) ) {
+ return kXMP_PNGFile;
+ }
+
+ if ( (fileSize >= kRIFFMinSize) && CheckBytes ( fileContent, "RIFF", 4 ) ) {
+ if ( CheckBytes ( fileContent+8, "AVI ", 4 ) ) return kXMP_AVIFile;
+ if ( CheckBytes ( fileContent+8, "WAVE", 4 ) ) return kXMP_WAVFile;
+ }
+
+ if ( (fileSize >= kInDesignMinSize) && CheckBytes ( fileContent, kInDesign_MasterPageGUID, kInDesignGUIDSize ) ) {
+ return kXMP_InDesignFile;
+ }
+
+ if ( (fileSize >= kSWFMinSize) &&
+ (CheckBytes ( fileContent, "FWS", 3 ) || CheckBytes ( fileContent, "CWS", 3 )) &&
+ (fileContent[3] <= 10 /* 2007 latest is 8 */) ) {
+ return kXMP_SWFFile;
+ }
+
+ if ( (fileSize >= kFLVMinSize) &&
+ CheckBytes ( fileContent, "FLV", 3 ) &&
+ (fileContent[3] <= 10 /* 2007 latest is 1 */) ) {
+ return kXMP_FLVFile;
+ }
+
+ if ( (fileSize >= kISOMediaMinSize) && CheckBytes ( fileContent+4, kISOMediaFTyp, 4 ) ) {
+
+ XMP_Uns32 ftypLen = GetUns32BE (fileContent);
+ if ( ftypLen == 0 ) ftypLen = fileSize;
+ if ( (ftypLen < kISOMediaMinSize) || (ftypLen > fileSize) || (ftypLen > 4096) ) return kXMP_UnknownFile;
+
+ XMP_Uns8 * compatPtr = fileContent + 16;
+ XMP_Uns8 * compatEnd = fileContent + ftypLen;
+
+ for ( ; compatPtr < compatEnd; compatPtr += 4 ) {
+ XMP_Uns32 compatBrand = GetUns32BE (compatPtr);
+ if ( (compatBrand == kISOBrand_mp41) || (compatBrand == kISOBrand_mp42) ) return kXMP_MPEG4File;
+ }
+
+ }
+
+ if ( (fileSize > 30) && CheckBytes ( fileContent, "\x50\x4B\x03\x04", 4 ) ) { // "PK 03 04"
+ return kXMP_UCFFile;
+ }
+
+ // ! Do MP3 next to last. It uses the file extension if there is no ID3.
+ if ( CheckBytes ( fileContent, "ID3", 3 ) ||
+ (LookupFileExtMapping (filePath) == kXMP_MP3File) ) return kXMP_MP3File;
+
+ // ! Do MPEG (MP2) and MOV last. They use just the file extension, not content.
+ if ( LookupFileExtMapping (filePath) == kXMP_MPEGFile ) return kXMP_MPEGFile;
+ if ( LookupFileExtMapping (filePath) == kXMP_MOVFile ) return kXMP_MOVFile;
+
+ return kXMP_UnknownFile;
+
+} // CheckFileFormat
+
+// =================================================================================================
+// DumpXMP
+// =======
+
+static void
+DumpXMP (XMP_Uns8 * xmpPtr, XMP_Uns32 xmpLen, XMP_Int64 xmpOffset, const char * label)
+{
+ if (xmpOffset <= 0xFFFFFFFFUL) {
+ tree->pushNode("XMP");
+ tree->addComment("from %s, offset %u (0x%X), size %d",
+ label, (XMP_Uns32)xmpOffset, (XMP_Uns32)xmpOffset, xmpLen);
+ } else {
+ tree->pushNode("XMP");
+ tree->addComment("from %s, offset %ll (0x%X-%.8X), size %d",
+ label, High32(xmpOffset), Low32(xmpOffset), xmpLen);
+ }
+
+ //bool atStart = true;
+ SXMPMeta xmp ((XMP_StringPtr)xmpPtr, xmpLen);
+ xmp.Sort();
+
+ //FNO: could be reactived, but makes the dump naturally very long - harder to read for dev work
+ //xmp.DumpObject( (DumpCallback, &atStart);
+ tree->popNode();
+}
+
+// =================================================================================================
+// DumpXMP
+// =======
+
+// an (old) wrapper for above function relying on static, "global" variables
+static void
+DumpXMP (const char * label)
+{
+ DumpXMP (sXMPPtr, sXMPLen, sXMPPos, label);
+} // DumpXMP
+
+// =================================================================================================
+// DumpIPTC
+// ========
+//
+// The IPTC (IIM, NAA) values are in a sequence of "data sets". Each has a 5 byte header followed
+// by the value. There is no overall length in the sequence itself. Photoshop writes this in TIFF
+// as LONGs (4 byte chunks), so there might be padding at the end.
+
+static void
+DumpIPTC (XMP_Uns8 * iptcOrigin, XMP_Uns32 iptcLen, XMP_Uns32 fileOffset, const char * label)
+{
+ tree->pushNode("IPTC data");
+ tree->addComment("from %s, offset %d (0x%X), size %d",
+ label, fileOffset, fileOffset, iptcLen);
+
+ // ** Compute and print the MD5 digest.
+ XMP_Uns8 * iptcPtr = iptcOrigin;
+ XMP_Uns8 * iptcEnd = iptcPtr + iptcLen;
+ XMP_Uns8 * valuePtr;
+ XMP_Uns32 valueLen;
+
+ while (iptcPtr < (iptcEnd - 4)) { // ! The -4 is to skip terminal padding.
+ IPTC_DataSet * currDS = (IPTC_DataSet*)iptcPtr;
+ if (currDS->tagMarker != 0x1C) {
+ tree->comment("** invalid IPTC marker **");
+ break;
+ }
+ valuePtr = iptcPtr + 5;
+ valueLen = (currDS->octetCountHigh << 8) + currDS->octetCountLow;
+
+ if ((valueLen >> 15) == 1) {
+ int count = valueLen & 0x7FFF;
+ valueLen = 0;
+ for (int i = 0; i < count; ++i) valueLen = (valueLen << 8) + valuePtr[i];
+ valuePtr += count;
+ }
+
+ XMP_Uns32 dsOffset = fileOffset + (iptcPtr - iptcOrigin);
+
+ //key come here ===================
+ tree->setKeyValue(
+ fromArgs("IPTC:%d:%d", currDS->recordNumber, currDS->dataSetNumber),"");
+ tree->addComment("offset %d (0x%X), size %d", dsOffset, dsOffset, valueLen);
+
+
+ if ((currDS->recordNumber != 1) && (currDS->recordNumber != 2)) {
+
+ //LF only 1:** and 2:** bother us
+
+ } else if (currDS->recordNumber == 1) {
+
+ switch (currDS->dataSetNumber) {
+ case 0 :
+ {
+ XMP_Uns16 version = GetUns16BE (valuePtr);
+ tree->addComment("version = 0x%.4X", version);
+ break;
+ }
+ case 90 :
+ if (valueLen == 3) {
+ tree->addComment("encoding = 0x%.2X%.2X%.2X", valuePtr[0], valuePtr[1], valuePtr[2]);
+ if (memcmp (valuePtr, "\x1B\x25\x47", 3) == 0) tree->addComment(" (UTF-8)");
+ }
+ break;
+ default :
+ break;
+ }
+
+ } else if (currDS->dataSetNumber == 0) {
+
+ XMP_Uns16 version = GetUns16BE (valuePtr);
+ tree->addComment(",Version = 0x%.4X", version);
+
+ } else {
+
+ int ds;
+ for (ds = 0; kDataSetNames[ds].name != 0; ++ds) {
+ if (currDS->dataSetNumber == kDataSetNames[ds].id) break;
+ }
+ if (kDataSetNames[ds].name == 0) {
+ //LF
+ } else {
+ tree->addComment("%s", kDataSetNames[ds].name);
+ tree->changeValue(convert8Bit(valuePtr,false,valueLen));
+ }
+
+ }
+
+ iptcPtr = valuePtr + valueLen;
+
+ }
+
+ //LF
+ if (iptcPtr > iptcEnd) {
+ tree->comment("** Too much IPTC data, delta %d", (long)(iptcEnd - iptcPtr));
+ } else {
+ while ((iptcPtr < iptcEnd) && (*iptcPtr == 0)) ++iptcPtr;
+ if (iptcPtr != iptcEnd) tree->comment("** Too little IPTC data, delta %d", (long)(iptcPtr - iptcEnd));
+ }
+
+ tree->popNode();
+} // DumpIPTC
+
+// =================================================================================================
+static void
+DumpImageResources (XMP_Uns8 * psirOrigin, XMP_Uns32 psirLen, XMP_Uns32 fileOffset, const char * label)
+{
+ tree->pushNode("Photoshop Image Resources");
+ tree->addComment("from %s, offset %d (0x%X), size %d",
+ label, fileOffset, fileOffset, psirLen);
+
+ XMP_Uns8 * psirPtr = psirOrigin;
+ XMP_Uns8 * psirEnd = psirPtr + psirLen;
+ XMP_Uns8 * irPtr;
+ XMP_Uns32 irLen, irOffset; //irType replaced by irTypeStr below
+
+ XMP_Uns8 * iptcPtr = 0;
+ XMP_Uns8 * xmpPtr = 0;
+ XMP_Uns8 * exif1Ptr = 0;
+ XMP_Uns8 * exif3Ptr = 0;
+ XMP_Uns32 iptcLen, xmpLen, exif1Len, exif3Len;
+
+ while (psirPtr < psirEnd) {
+ std::string irTypeStr = convert8Bit(psirPtr,false,4); //get in an endian neutral way
+ XMP_Uns16 irID = GetUns16BE ( psirPtr+4 ); // The image resource ID.
+
+ const char* irName = (XMP_StringPtr)psirPtr+6; // A Pascal string.
+ irOffset = 6 + ((*irName + 2) & 0xFFFFFFFE); // Offset to the image resource data length.
+ irLen = GetUns32BE (psirPtr+irOffset);
+ irPtr = psirPtr + irOffset + 4;
+
+ irOffset = fileOffset + (psirPtr - psirOrigin);
+
+ if ( irTypeStr != "8BIM" ) {
+ tree->setKeyValue( fromArgs("PSIR:%s:#%u",irTypeStr.c_str(),irID),"" );
+ tree->comment("(non-8BIM encountered and tolerated, see bug 1454756)");
+ } else if ( irID == kPSIR_IPTC ) { //****************
+ tree->setKeyValue("PSIR:IPTC","");
+ iptcPtr = irPtr;
+ iptcLen = irLen;
+ if (iptcPtr != 0) DumpIPTC (iptcPtr, iptcLen, (fileOffset + (iptcPtr - psirOrigin)), "PSIR #1028");
+ } else if (irID == kPSIR_XMP) { //****************
+ tree->setKeyValue("PSIR:XMP","");
+ xmpPtr = irPtr;
+ xmpLen = irLen;
+ if (xmpPtr != 0) DumpXMP (xmpPtr, xmpLen, (fileOffset + (xmpPtr - psirOrigin)), "PSIR #1060");
+ } else if (irID == kPSIR_Exif_1) { //****************
+ tree->setKeyValue("PSIR:Exif-1","");
+ exif1Ptr = irPtr;
+ exif1Len = irLen;
+ DumpTIFF (exif1Ptr, exif1Len, (fileOffset + (exif1Ptr - psirOrigin)), "PSIR #1058 (Exif 1)");
+ } else if (irID == kPSIR_Exif_3) { //****************
+ tree->setKeyValue("PSIR:Exif-3","");
+ exif3Ptr = irPtr;
+ exif3Len = irLen;
+ if (exif3Ptr != 0) DumpTIFF (exif3Ptr, exif3Len, (fileOffset + (exif3Ptr - psirOrigin)), "PSIR #1059 (Exif 3)");
+ } else if (irID == kPSIR_IPTC_Digest) {
+ tree->setKeyValue("PSIR:IPTC digest",
+ fromArgs("%.8X-%.8X-%.8X-%.8X",
+ GetUns32BE(irPtr),
+ GetUns32BE(irPtr+4),
+ GetUns32BE(irPtr+8),
+ GetUns32BE(irPtr+12) )
+ );
+ } else if (irID == kPSIR_CopyrightFlag) {
+ bool copyrighted = (*irPtr != 0);
+ tree->setKeyValue("PSIR:copyrighted",(copyrighted ? "yes" : "no"));
+ } else if (irID == kPSIR_CopyrightURL) {
+ tree->setKeyValue("PSIR:copyright URL",convert8Bit(irPtr,true,irLen));
+ } else if (irID == kPSIR_OldCaption) {
+ tree->setKeyValue("PSIR:old caption",convert8Bit(irPtr,true,irLen));
+ } else if (irID == kPSIR_PrintCaption) {
+ tree->comment("** obsolete print caption **");
+ } else {
+ tree->setKeyValue(
+ fromArgs("PSIR:%s:#%d",irTypeStr.c_str(),irID),
+ ""
+ );
+ }
+ tree->addComment("offset %d (0x%X), size %d", irOffset, irOffset, irLen);
+ if (*irName != 0) tree->addComment("\"%.*s\"", (int)(*irName), (irName+1));
+ psirPtr = irPtr + ((irLen + 1) & 0xFFFFFFFE); // Round the length to be even.
+ } //while-loop
+
+ if (psirPtr != psirEnd) {
+ tree->addComment("** Unexpected end of image resources, delta %d", (long)(psirPtr - psirEnd));
+ }
+
+ //NB: dump routines moved up into if-else's
+
+ tree->popNode();
+} // DumpImageResources
+
+// =================================================================================================
+
+static void
+DumpOneIFD (int ifdIndex, XMP_Uns8 * ifdPtr, XMP_Uns8 * endPtr,
+ XMP_Uns8 * tiffContent, XMP_Uns32 fileOffset, const char * label)
+{
+ XMP_Uns8 * exifPtr = 0;
+ XMP_Uns8 * gpsPtr = 0;
+ XMP_Uns8 * interopPtr = 0;
+ XMP_Uns8 * makerNotePtr = 0;
+ XMP_Uns8 * psirPtr = 0;
+ XMP_Uns8 * iptcPtr = 0;
+ XMP_Uns8 * xmpPtr = 0;
+ XMP_Uns32 psirLen = 0;
+ XMP_Uns32 iptcLen = 0;
+ XMP_Uns32 xmpLen = 0;
+
+ XMP_Uns32 ifdOffset = ifdPtr - tiffContent;
+ XMP_Uns16 fieldCount = TIFF_GetUns16 (ifdPtr);
+ XMP_Uns32 ifdLen = 2 + (12 * fieldCount) + 4;
+ XMP_Uns32 nextIFD = TIFF_GetUns32 (ifdPtr+ifdLen-4);
+
+ tree->pushNode("TIFF IFD #%d from %s",ifdIndex,label);
+ tree->addComment("offset %d (0x%X), tag count %d",
+ (ifdOffset + fileOffset), (ifdOffset + fileOffset), fieldCount);
+
+ if (nextIFD == 0) {
+ tree->comment("end of IFD chain");
+ } else {
+ tree->comment("next IFD offset %d (0x%X)", (nextIFD + fileOffset), (nextIFD + fileOffset));
+ }
+
+ XMP_Uns16 prevTag = 0;
+ XMP_Uns8 * fieldPtr = tiffContent+ifdOffset+2;
+ for (int i = 0; i < fieldCount; ++i, fieldPtr += 12) {
+
+ XMP_Uns16 fieldTag = TIFF_GetUns16 (fieldPtr);
+ XMP_Uns16 fieldType = TIFF_GetUns16 (fieldPtr+2);
+ XMP_Uns32 valueCount = TIFF_GetUns32 (fieldPtr+4);
+ XMP_Uns32 valueOffset = TIFF_GetUns32 (fieldPtr+8);
+
+ XMP_Uns8 * valuePtr = ifdPtr - ifdOffset + valueOffset;
+ XMP_Uns32 valueLen = 0;
+ if (fieldType < kTIFF_TypeEnd) valueLen = valueCount * sTIFF_TypeSizes[fieldType];
+ if (valueLen <= 4) valuePtr = fieldPtr + 8;
+
+ //===================== adding key here
+ tree->setKeyValue( fromArgs("TIFF:%d", fieldTag) );
+
+ if ((fieldType < 1) || (fieldType >= kTIFF_TypeEnd)) {
+ tree->addComment("type %d", fieldType);
+ } else {
+ tree->addComment("%s", sTIFF_TypeNames[fieldType]);
+ }
+
+ tree->addComment("count %d, value size %d", valueCount, valueLen);
+
+ if (valueLen > 4) {
+ tree->addComment("value offset %d (0x%X)", (valueOffset + fileOffset), (valueOffset + fileOffset));
+ } else {
+ XMP_Uns32 rawValue = GetUns32BE (fieldPtr+8);
+ tree->addComment("value in IFD (0x%.8X)", rawValue);
+ }
+
+ if (fieldTag == kTIFF_Exif) {
+ tree->addComment("Exif IFD offset");
+ exifPtr = tiffContent + TIFF_GetUns32 (valuePtr); // Value is Exif IFD offset.
+ } else if (fieldTag == kTIFF_GPS) {
+ tree->addComment("GPS IFD offset");
+ gpsPtr = tiffContent + TIFF_GetUns32 (valuePtr); // Value is GPS IFD offset.
+ } else if (fieldTag == kTIFF_Interop) {
+ tree->addComment("Interoperability IFD offset");
+ interopPtr = tiffContent + TIFF_GetUns32 (valuePtr); // Value is Interoperability IFD offset.
+ } else if (fieldTag == kTIFF_MakerNote) { // Decide if the Maker Note might be formatted as an IFD.
+ tree->addComment("Maker Note");
+ XMP_Uns32 itemCount = (valueLen - 6) / 12;
+ if ((valueLen >= 18) && (valueLen == (6 + itemCount*12)) &&
+ (itemCount == TIFF_GetUns16 (valuePtr)) &&
+ (TIFF_GetUns32 (valuePtr+2+(12*itemCount)) == 0)) {
+ makerNotePtr = valuePtr;
+ }
+ } else if (fieldTag == kTIFF_PSIR) {
+ tree->addComment("PSIR");
+ psirPtr = valuePtr;
+ psirLen = valueLen;
+ } else if (fieldTag == kTIFF_IPTC) {
+ tree->addComment("IPTC");
+ iptcPtr = valuePtr;
+ iptcLen = valueLen;
+ } else if (fieldTag == kTIFF_XMP) {
+ tree->addComment("XMP");
+ if (fieldType == kTIFF_ASCII) fieldType = kTIFF_Uns8; // Avoid displaying the raw packet for mis-typed XMP.
+ xmpPtr = valuePtr;
+ xmpLen = valueLen;
+ } else {
+ for (int i = 0; sTIFF_TagNames[i].tag != 0; ++i) {
+ if (sTIFF_TagNames[i].tag == fieldTag) {
+ tree->addComment("%s", sTIFF_TagNames[i].name);
+ break;
+ }
+ }
+ }
+
+ XMP_Uns8 value8;
+ XMP_Uns16 value16;
+ XMP_Uns32 value32;
+ std::string tempStr;
+
+ switch (fieldType) {
+
+ case kTIFF_Uns8 :
+ if (valueCount == 1) {
+ value8 = *valuePtr;
+ tree->addComment("hex value = 0x%.2X", value8);
+ tree->changeValue("%u",value8);
+ }
+ break;
+
+ case kTIFF_ASCII :
+ tree->changeValue(convert8Bit(valuePtr,false /* internal NULs OK*/,valueLen));
+ break;
+
+ case kTIFF_Uns16 :
+ if (valueCount == 1) {
+ value16 = TIFF_GetUns16 (valuePtr);
+ tree->addComment("hex value = 0x%.4X", value16);
+ tree->changeValue("%u",value16);
+ }
+ break;
+
+ case kTIFF_Uns32 :
+ if (valueCount == 1) {
+ value32 = TIFF_GetUns32 (valuePtr);
+ tree->addComment("hex value = 0x%.8X", value32);
+ tree->changeValue( "%u" , value32);
+ }
+ break;
+
+ case kTIFF_URational :
+ if (valueCount == 1) {
+ value32 = TIFF_GetUns32 (valuePtr);
+ XMP_Uns32 denom = TIFF_GetUns32 (valuePtr+4);
+ tree->changeValue( "%u/%u" , value32,denom);
+ }
+ break;
+
+ case kTIFF_Int8 :
+ if (valueCount == 1) {
+ value8 = *valuePtr;
+ //fno: show the hex value unsigned (memory representation)´and the decimal signed
+ tree->addComment("hex value 0x%.2X", value8);
+ tree->changeValue( "%d" , *((XMP_Int8*)&value8));
+ }
+ break;
+
+ case kTIFF_Undef8 :
+ if (valueCount == 1) {
+ value8 = *valuePtr;
+ tree->changeValue("0x%.2X", value8);
+ }
+ break;
+
+ case kTIFF_Int16 :
+ if (valueCount == 1) {
+ value16 = TIFF_GetUns16 (valuePtr);
+ tree->changeValue("%d (0x%.4X)", *((XMP_Int16*)&value16), value16);
+ }
+ break;
+
+ case kTIFF_Int32 :
+ if (valueCount == 1) {
+ value32 = TIFF_GetUns32 (valuePtr);
+ tree->changeValue("%d (0x%.8X)", *((XMP_Int32*)&value32), value32);
+ }
+ break;
+
+ case kTIFF_SRational :
+ if (valueCount == 1) {
+ value32 = TIFF_GetUns32 (valuePtr);
+ XMP_Uns32 denom = TIFF_GetUns32 (valuePtr+4);
+ tree->changeValue("%d/%d", *((XMP_Int32*)&value32), *((XMP_Int32*)&denom));
+ }
+ break;
+
+ case kTIFF_Float :
+ break;
+
+ case kTIFF_Double :
+ break;
+
+ default :
+ tree->addComment("** unknown type **");
+ break;
+
+ }
+
+ if (fieldTag == prevTag) {
+ tree->addComment("** Repeated tag **");
+ } else if (fieldTag < prevTag) {
+ tree->addComment("** Out of order tag **");
+ }
+
+ prevTag = fieldTag;
+
+ }
+
+ if (exifPtr != 0) {
+ DumpIFDChain (exifPtr, endPtr, tiffContent,
+ (fileOffset + (exifPtr - tiffContent)), "TIFF tag #34665 (Exif IFD)");
+ }
+
+ if (gpsPtr != 0) {
+ DumpIFDChain (gpsPtr, endPtr, tiffContent,
+ (fileOffset + (gpsPtr - tiffContent)), "TIFF tag #34853 (GPS Info IFD)");
+ }
+
+ if (interopPtr != 0) {
+ DumpIFDChain (interopPtr, endPtr, tiffContent,
+ (fileOffset + (interopPtr - tiffContent)), "TIFF tag #40965 (Interoperability IFD)");
+ }
+
+ if (makerNotePtr != 0) {
+ DumpIFDChain (makerNotePtr, endPtr, tiffContent,
+ (fileOffset + (makerNotePtr - tiffContent)), "TIFF tag #37500 (Maker Note)");
+ }
+
+ if (iptcPtr != 0) {
+ DumpIPTC (iptcPtr, iptcLen, (fileOffset + (iptcPtr - tiffContent)), "TIFF tag #33723");
+ }
+
+ if (psirPtr != 0) {
+ DumpImageResources (psirPtr, psirLen, (fileOffset + (psirPtr - tiffContent)), "TIFF tag #34377");
+ }
+
+ if (xmpPtr != 0) {
+ DumpXMP (xmpPtr, xmpLen, (fileOffset + (xmpPtr - tiffContent)), "TIFF tag #700");
+ }
+
+ tree->popNode();
+} // DumpOneIFD
+
+// =================================================================================================
+
+
+static void
+DumpIFDChain (XMP_Uns8 * startPtr, XMP_Uns8 * endPtr,
+ XMP_Uns8 * tiffContent, XMP_Uns32 fileOrigin, const char * label)
+{
+ XMP_Uns8 * ifdPtr = startPtr;
+ XMP_Uns32 ifdOffset = startPtr - tiffContent;
+
+ for (size_t ifdIndex = 0; ifdOffset != 0; ++ifdIndex) {
+
+ if ((ifdPtr < tiffContent) || (ifdPtr >= endPtr)) {
+ ifdOffset = fileOrigin + (ifdPtr - tiffContent);
+ tree->comment("** Invalid IFD offset, %d (0x%X) tree.", ifdOffset, ifdOffset);
+ return;
+ }
+
+ XMP_Uns16 fieldCount = TIFF_GetUns16 (ifdPtr);
+ DumpOneIFD (ifdIndex, ifdPtr, endPtr, tiffContent, fileOrigin, label);
+ ifdOffset = TIFF_GetUns32 (ifdPtr+2+(12*fieldCount));
+ ifdPtr = tiffContent + ifdOffset;
+
+ }
+
+} // DumpIFDChain
+
+// =================================================================================================
+
+static void
+DumpTIFF (XMP_Uns8 * tiffContent, XMP_Uns32 tiffLen, XMP_Uns32 fileOffset, const char * label)
+{
+ // ! TIFF can be nested because of the Photoshop 6 weiredness. Save and restore the procs.
+ GetUns16_Proc save_GetUns16 = TIFF_GetUns16;
+ GetUns32_Proc save_GetUns32 = TIFF_GetUns32;
+ GetUns64_Proc save_GetUns64 = TIFF_GetUns64;
+
+ if (CheckBytes(tiffContent,"II\x2A\x00",4)) {
+ TIFF_GetUns16 = GetUns16LE;
+ TIFF_GetUns32 = GetUns32LE;
+ TIFF_GetUns64 = GetUns64LE;
+ tree->addComment("Little endian ");
+ } else if (CheckBytes(tiffContent,"MM\x00\x2A",4)) {
+ TIFF_GetUns16 = GetUns16BE;
+ TIFF_GetUns32 = GetUns32BE;
+ TIFF_GetUns64 = GetUns64BE;
+ tree->addComment("Big endian ");
+ } else {
+ tree->comment("** Missing TIFF image file header tree.");
+ return;
+ }
+
+ tree->addComment("TIFF from %s, offset %d (0x%X), size %d", label, fileOffset, fileOffset, tiffLen);
+
+ XMP_Uns32 ifdOffset = TIFF_GetUns32 (tiffContent+4);
+ DumpIFDChain (tiffContent+ifdOffset, tiffContent+tiffLen, tiffContent, fileOffset, label);
+
+ TIFF_GetUns16 = save_GetUns16;
+ TIFF_GetUns32 = save_GetUns32;
+ TIFF_GetUns64 = save_GetUns64;
+
+} // DumpTIFF
+
+// =================================================================================================
+
+static void
+DumpPhotoshop (XMP_Uns8 * psdContent, XMP_Uns32 psdLen)
+{
+ psdLen=psdLen; // Avoid unused parameter warning.
+
+ XMP_Uns32 psirOffset = 26 + 4 + GetUns32BE (psdContent+26);
+ XMP_Uns8 * psirSect = psdContent + psirOffset;
+ XMP_Uns8 * psirPtr = psirSect + 4;
+ XMP_Uns32 psirLen = GetUns32BE (psirSect);
+
+ DumpImageResources (psirPtr, psirLen, (psirPtr - psdContent), "Photoshop file");
+
+} // DumpPhotoshop
+
+// =================================================================================================
+
+static void
+DumpJPEG (XMP_Uns8 * jpegContent, XMP_Uns32 jpegLen)
+{
+ XMP_Uns8 * endPtr = jpegContent + jpegLen;
+ XMP_Uns8 * segPtr = jpegContent;
+ XMP_Uns32 segOffset;
+
+ XMP_Uns8 * xmpPtr = 0;
+ XMP_Uns8 * psirPtr = 0;
+ XMP_Uns8 * exifPtr = 0;
+ XMP_Uns16 xmpLen = 0;
+ XMP_Uns16 psirLen = 0;
+ XMP_Uns16 exifLen = 0;
+
+ while (segPtr < endPtr) { // ----------------------------------------------------------------
+
+ XMP_Uns16 segMark = GetUns16BE (segPtr);
+ if (segMark == 0xFFFF) {
+ segPtr += 1; // Skip leading 0xFF pad byte.
+ continue;
+ }
+
+ XMP_Uns16 minorKind = segMark & 0x000F;
+ segOffset = segPtr - jpegContent;
+
+ tree->pushNode("JPEG:%.4X",segMark);
+ tree->addComment("offset %d (0x%X)", segOffset, segOffset);
+
+ if (((segMark >> 8) != 0xFF) || (segMark == 0xFF00)) {
+ tree->addComment("** invalid JPEG marker **");
+ tree->popNode();
+ break;
+ }
+
+ // Check for standalone markers first, only fetch the length for marker segments.
+
+ if (segMark == 0xFF01) {
+ tree->addComment("** TEM **");
+ segPtr += 2; // A standalone marker.
+ tree->popNode();
+ continue;
+ } else if ((0xFFD0 <= segMark) && (segMark <= 0xFFD7)) {
+ tree->addComment(fromArgs("RST%d ** unexpected **", minorKind));
+ segPtr += 2; // A standalone marker.
+ tree->popNode();
+ continue;
+ } else if (segMark == 0xFFD8) {
+ tree->addComment("SOI");
+ segPtr += 2; // A standalone marker.
+ tree->popNode();
+ continue;
+ } else if (segMark == 0xFFD9) {
+ tree->addComment("EOI");
+ segPtr += 2; // A standalone marker.
+ tree->popNode();
+ break; // Exit on EOI.
+ }
+
+ XMP_Uns16 segLen = GetUns16BE (segPtr+2);
+
+ // figure out Exif vs PSIR vs XMP
+ if ((0xFFE0 <= segMark) && (segMark <= 0xFFEF)) {
+ const char* segName = (const char *)(segPtr+4);
+ tree->addComment(fromArgs("size %d, APP%d, \"%s\"", segLen, minorKind, segName));
+ if ((minorKind == 1) &&
+ ((memcmp(segName,"Exif\0\0",6) == 0) || (memcmp(segName,"Exif\0\xFF",6) == 0))) {
+ tree->addComment("Exif");
+ exifPtr = segPtr + 4 + 6;
+ exifLen = segLen - 2 - 6;
+ } else if ((minorKind == 13) && (strcmp(segName,"Photoshop 3.0") == 0)) {
+ tree->addComment("PSIR");
+ psirPtr = segPtr + 4 + strlen(segName) + 1;
+ psirLen = (XMP_Uns16)(segLen - 2 - strlen(segName) - 1);
+ } else if ((minorKind == 1) && (strcmp(segName,"http://ns.adobe.com/xap/1.0/") == 0)) {
+ tree->addComment("XMP");
+ xmpPtr = segPtr + 4 + strlen(segName) + 1;
+ xmpLen = (XMP_Uns16)(segLen - 2 - strlen(segName) - 1);
+ }
+ segPtr += 2+segLen;
+ tree->popNode();
+ continue;
+ }
+
+ if (segMark == 0xFFDA) {
+ tree->addComment(fromArgs("size %d, SOS", segLen));
+ segPtr += 2+segLen; // Skip the SOS marker segment itself
+ long rstCount = 0;
+ while (segPtr < endPtr) { // Skip the entropy-coded data and RSTn markers.
+ if (*segPtr != 0xFF) {
+ segPtr += 1; // General data byte.
+ } else {
+ segMark = GetUns16BE (segPtr);
+ if (segMark == 0xFF00) {
+ segPtr += 2; // Padded 0xFF data byte.
+ } else if ((segMark < 0xFFD0) || (segMark > 0xFFD7)) {
+ segLen = 0;
+ segPtr -= 2; // Prepare for the increment in the outer loop.
+ break; // Exit, non-RSTn marker.
+ } else {
+ ++rstCount;
+ segPtr += 2;
+ }
+ }
+ }
+ tree->addComment(fromArgs("%d restart markers", rstCount));
+
+ segPtr += 2+segLen;
+ tree->popNode();
+ continue;
+ }
+
+
+ if ((0xFF02 <= segMark) && (segMark <= 0xFFBF)) {
+ tree->addComment(fromArgs("size %d, ** RES **", segLen));
+ } else if ((0xFFC0 <= segMark) && (segMark <= 0xFFC3)) {
+ tree->addComment(fromArgs("size %d, SOF%d", segLen, minorKind));
+ } else if (segMark == 0xFFC4) {
+ tree->addComment(fromArgs("size %d, DHT", segLen));
+ } else if ((0xFFC5 <= segMark) && (segMark <= 0xFFC7)) {
+ tree->addComment(fromArgs("size %d, SOF%d", segLen, minorKind));
+ } else if (segMark == 0xFFC8) {
+ tree->addComment(fromArgs("size %d, JPG", segLen));
+ } else if ((0xFFC9 <= segMark) && (segMark <= 0xFFCB)) {
+ tree->addComment(fromArgs("size %d, SOF%d", segLen, minorKind));
+ } else if (segMark == 0xFFCC) {
+ tree->addComment(fromArgs("size %d, DAC", segLen));
+ } else if ((0xFFCD <= segMark) && (segMark <= 0xFFCF)) {
+ tree->addComment(fromArgs("size %d, SOF%d", segLen, minorKind));
+ } else if (segMark == 0xFFDB) {
+ tree->addComment(fromArgs("size %d, DQT", segLen));
+ } else if (segMark == 0xFFDC) {
+ tree->addComment(fromArgs("size %d, DNL", segLen));
+ } else if (segMark == 0xFFDD) {
+ tree->addComment(fromArgs("size %d, DRI", segLen));
+ } else if (segMark == 0xFFDE) {
+ tree->addComment(fromArgs("size %d, DHP", segLen));
+ } else if (segMark == 0xFFDF) {
+ tree->addComment(fromArgs("size %d, EXP", segLen));
+ } else if ((0xFFF0 <= segMark) && (segMark <= 0xFFFD)) {
+ tree->addComment(fromArgs("size %d, JPG%d", segLen, minorKind));
+ } else if (segMark == 0xFFFE) {
+ tree->addComment(fromArgs("size %d, COM", segLen));
+ } else {
+ tree->addComment("** UNRECOGNIZED MARKER **");
+ }
+
+ segPtr += 2+segLen;
+
+ tree->popNode();
+ } // ------------------------------------------------------------------------------------
+
+ if (segPtr != endPtr) {
+ segOffset = segPtr - jpegContent;
+ tree->addComment(fromArgs(
+ "** Unexpected end of JPEG markers at offset %d (0x%X), delta %d tree.",
+ segOffset, segOffset, (long)(endPtr-segPtr)
+ ));
+ }
+
+ if (exifPtr != 0) DumpTIFF (exifPtr, exifLen, (exifPtr - jpegContent), "JPEG Exif APP1");
+ if (psirPtr != 0) DumpImageResources (psirPtr, psirLen, (psirPtr - jpegContent), "JPEG Photoshop APP13");
+ if (xmpPtr != 0) DumpXMP (xmpPtr, xmpLen, (xmpPtr - jpegContent), "JPEG XMP APP1");
+
+} // DumpJPEG
+
+// =================================================================================================
+
+static XMP_Uns32
+DumpISOFileType (XMP_Uns8 * ftypPtr, XMP_Uns32 ftypLimit)
+{
+ XMP_Uns32 ftypLen = GetUns32BE (ftypPtr);
+ XMP_Uns32 ftypTag = GetUns32BE (ftypPtr+4);
+
+ if (ftypLen == 0) ftypLen = ftypLimit;
+
+ if ((ftypLen < 16) || (ftypLen > ftypLimit) || (ftypTag != kISOTag_ftyp)) {
+ tree->addComment( "** Invalid File Type box: tag = '%.4s' (0x%.8X), size = %d **",
+ ftypPtr+4, ftypTag, ftypLen);
+ return ftypLimit; // Force caller to skip the rest of the file.
+ }
+
+ XMP_Uns32 ftypVersion = GetUns32BE (ftypPtr+12);
+
+ tree->comment("Major Brand '%.4s', version %d",ftypPtr+8, ftypVersion);
+ tree->comment("Compatible brands:");
+
+ XMP_Uns8 * compatPtr = ftypPtr + 16;
+ XMP_Uns8 * compatEnd = ftypPtr + ftypLen;
+
+ if (compatPtr >= compatEnd)
+ tree->addComment("<none>");
+
+ for (; compatPtr < compatEnd; compatPtr += 4) {
+ tree->addComment("'%.4s'", compatPtr);
+ }
+
+ return ftypLen;
+} // DumpISOFileType
+
+// =================================================================================================
+
+static const XMP_Uns8 kUUID_XMP[16] =
+{ 0xBE, 0x7A, 0xCF, 0xCB, 0x97, 0xA9, 0x42, 0xE8, 0x9C, 0x71, 0x99, 0x94, 0x91, 0xE3, 0xAF, 0xAC };
+static const XMP_Uns8 kUUID_Exif[16] =
+{ 0x05, 0x37, 0xCD, 0xAB, 0x9D, 0x0C, 0x44, 0x31, 0xA7, 0x2A, 0xFA, 0x56, 0x1F, 0x2A, 0x11, 0x3E };
+static const XMP_Uns8 kUUID_IPTC[16] =
+{ 0x09, 0xA1, 0x4E, 0x97, 0xC0, 0xB4, 0x42, 0xE0, 0xBE, 0xBF, 0x36, 0xDF, 0x6F, 0x0C, 0xE3, 0x6F };
+static const XMP_Uns8 kUUID_PSIR[16] =
+{ 0x2C, 0x4C, 0x01, 0x00, 0x85, 0x04, 0x40, 0xB9, 0xA0, 0x3E, 0x56, 0x21, 0x48, 0xD6, 0xDF, 0xEB };
+
+static XMP_Uns8 * sISOPtr_XMP = 0; // ! Rather ugly, but what the heck.
+static XMP_Uns32 sISOLen_XMP = 0;
+static XMP_Int32 sISOPos_XMP = 0; // *** Should be 64 bits.
+
+static XMP_Uns8 * sISOPtr_Exif = 0;
+static XMP_Uns32 sISOLen_Exif = 0;
+static XMP_Uns32 sISOPos_Exif = 0;
+
+static XMP_Uns8 * sISOPtr_IPTC = 0;
+static XMP_Uns32 sISOLen_IPTC = 0;
+static XMP_Uns32 sISOPos_IPTC = 0;
+
+static XMP_Uns8 * sISOPtr_PSIR = 0;
+static XMP_Uns32 sISOLen_PSIR = 0;
+static XMP_Uns32 sISOPos_PSIR = 0;
+
+// -------------------------------------------------------------------------------------------------
+
+static void
+CleanISOLegacy()
+{
+ if (sISOPtr_XMP != 0) free (sISOPtr_XMP);
+ sISOPtr_XMP = 0;
+ sISOLen_XMP = 0;
+ sISOPos_XMP = 0;
+
+ if (sISOPtr_Exif != 0) free (sISOPtr_Exif);
+ sISOPtr_Exif = 0;
+ sISOLen_Exif = 0;
+ sISOPos_Exif = 0;
+
+ if (sISOPtr_IPTC != 0) free (sISOPtr_IPTC);
+ sISOPtr_IPTC = 0;
+ sISOLen_IPTC = 0;
+ sISOPos_IPTC = 0;
+
+ if (sISOPtr_PSIR != 0) free (sISOPtr_PSIR);
+ sISOPtr_PSIR = 0;
+ sISOLen_PSIR = 0;
+ sISOPos_PSIR = 0;
+
+} // CleanISOLegacy
+
+// =================================================================================================
+
+static XMP_Uns32
+DumpISOBoxInfo ( LFA_FileRef file, XMP_Uns32 parent, XMP_Uns32 boxOffset, XMP_Uns32 boxLimit,
+ bool isQT = false, bool doPop = true )
+{
+ XMP_Uns32 boxLen, boxTag, contentOffset;
+ XMP_Int64 bigLen = 0;
+
+ if ( (boxOffset > boxLimit) || ((boxLimit-boxOffset) < 8) ) {
+ tree->comment ( "** No room for box in %d..%d, %d **", boxOffset, boxLimit, (boxLimit-boxOffset) );
+ return boxLimit; // Off track, stop looking for boxes.
+ }
+
+ LFA_Seek ( file, boxOffset, SEEK_SET );
+ LFA_Read ( file, &boxLen, 4, true);
+ LFA_Read ( file, &boxTag, 4, true);
+
+ boxLen = GetUns32BE ( &boxLen );
+ contentOffset = 8;
+
+ if ( boxLen == 0 ) {
+ boxLen = boxLimit;
+ } else if ( boxLen == 1 ) {
+ LFA_Read ( file, &bigLen, 8, true);
+ bigLen = GetUns64BE ( &bigLen );
+ boxLen = Low32(bigLen); // ! HACK!
+ contentOffset = 16;
+ }
+
+ if ( boxLen < 8 ) {
+ tree->comment ( "** Bad box size of %d **", boxLen );
+ return boxLimit; // Off track, stop looking for boxes.
+ }
+
+ tree->pushNode ( fromArgs("'%.4s'", &boxTag) );
+
+ boxTag = GetUns32BE ( &boxTag ); // ! After string print before hex print. needed below, too, to make comparisons work.
+ if ( bigLen == 0 ) {
+ tree->addComment( fromArgs( "hex value: %X, offset %d (0x%X), size %d", boxTag, boxOffset, boxOffset, boxLen ) );
+ } else {
+ tree->addComment( fromArgs( "hex value: %X, offset %d (0x%X), size %llu (0x %X_%.8X)",boxTag, boxOffset, boxOffset, bigLen, High32(bigLen), Low32(bigLen) ));
+ }
+
+ // only go deeper into boxes that matter:
+ if ( (boxTag == kISOTag_moov) || (boxTag == kISOTag_udta) ||
+ (boxTag == kISOTag_trak) || (boxTag == kISOTag_meta) ) {
+
+ XMP_Uns32 childPos, childLen;
+ XMP_Uns32 childLimit = boxOffset + boxLen;
+ if ( boxTag == kISOTag_meta ) {
+ // reasoning here:
+ // meta boxes with parent udta have versions
+ // (as any ISO-part-12 file should, thus "!isQT or ...")
+ // other meta boxes (i.e. under 'trak') do not
+ if ( (! isQT) || (parent == kISOTag_udta) ) {
+ contentOffset += 4; // Skip the version and flags.
+ } else {
+ tree->addComment ( "\t** QT hack for 'meta' with no version/flags **" );
+ }
+ }
+
+ for ( childPos = (boxOffset + contentOffset); childPos < childLimit; childPos += childLen ) {
+ childLen = DumpISOBoxInfo ( file, boxTag, childPos, childLimit, isQT );
+ }
+
+ } else if ( boxTag == kISOTag_ilst ) {
+
+ // The Apple 'ilst' metadata appears to have a simple 2 level structure. 'Appears to' because
+ // we do not have official documentation. The 'ilst' box is a simple container Box (no
+ // version/flags), as are the boxes that it contains. It looks like those subboxes are the
+ // metadata items. The sub-box type is the metadata item name, the sub-box contains just a
+ // 'data' box with the value.
+
+ // *** The inner loop is hardwired to assume the sub-box has an 8 byte header.
+
+ XMP_Uns32 downOnePos, downOneLen;
+ XMP_Uns32 downOneLimit = boxOffset + boxLen;
+
+ for ( downOnePos = (boxOffset + contentOffset); downOnePos < downOneLimit; downOnePos += downOneLen ) {
+
+ downOneLen = DumpISOBoxInfo ( file, boxTag, downOnePos, downOneLimit, isQT, false /* no pop */ );
+
+ XMP_Uns32 downTwoPos, downTwoLen;
+ XMP_Uns32 downTwoLimit = downOnePos + downOneLen;
+
+ for ( downTwoPos = (downOnePos + 8); downTwoPos < downTwoLimit; downTwoPos += downTwoLen ) {
+ downTwoLen = DumpISOBoxInfo ( file, boxTag, downTwoPos, downTwoLimit, isQT );
+ }
+
+ tree->popNode();
+
+ }
+
+ } else if ( boxTag == kQTTag_XMP_ ) {
+
+ tree->addComment ( "QuickTime XMP" );
+ if ( sISOPtr_XMP != 0 ) tree->addComment ( "** Redundant QuickTime XMP **" );
+
+ sISOLen_XMP = boxLen - 8;
+ sISOPtr_XMP = (XMP_Uns8*) malloc ( sISOLen_XMP );
+ sISOPos_XMP = LFA_Tell ( file );
+ LFA_Read ( file, sISOPtr_XMP, sISOLen_XMP, true );
+
+ } else if ( (boxTag == kISOTag_uuid) && (boxLen >= 24) ) {
+
+ XMP_Uns8 uuid[16];
+ LFA_Read ( file, &uuid, 16, true);
+
+ tree->addComment ( "UUID" );
+ for ( int i = 0; i < 16; ++i ) {
+ if ( (i & 3) == 0 ) tree->addComment ( " " );
+ tree->addComment ( "%.2X", uuid[i] );
+ }
+
+ if ( CheckBytes ( uuid, kUUID_XMP, 16 ) ) {
+
+ tree->addComment ( "ISO Base Media XMP" );
+ if ( sISOPtr_XMP != 0 ) tree->addComment ( "** Redundant ISO Base Media XMP **" );
+
+ sISOLen_XMP = boxLen - 24;
+ sISOPtr_XMP = (XMP_Uns8*) malloc ( sISOLen_XMP );
+ sISOPos_XMP = LFA_Tell ( file );
+ LFA_Read ( file, sISOPtr_XMP, sISOLen_XMP, true );
+
+ } else if ( CheckBytes ( uuid, kUUID_Exif, 16 ) ) {
+
+ tree->addComment ( "ISO Base Media Exif" );
+ if ( sISOPtr_Exif != 0 ) tree->addComment ( "** Redundant ISO Base Media Exif **" );
+
+ sISOLen_Exif = boxLen - 24;
+ sISOPtr_Exif = (XMP_Uns8*) malloc ( sISOLen_Exif );
+ sISOPos_Exif = LFA_Tell ( file );
+ LFA_Read ( file, sISOPtr_Exif, sISOLen_Exif, true );
+
+ } else if ( CheckBytes ( uuid, kUUID_IPTC, 16 ) ) {
+
+ tree->addComment ( "ISO Base Media IPTC" );
+ if ( sISOPtr_IPTC != 0 ) tree->addComment ( "** Redundant ISO Base Media IPTC **" );
+
+ sISOLen_IPTC = boxLen - 24;
+ sISOPtr_IPTC = (XMP_Uns8*) malloc ( sISOLen_IPTC );
+ sISOPos_IPTC = LFA_Tell ( file );
+ LFA_Read ( file, sISOPtr_IPTC, sISOLen_IPTC, true );
+
+ } else if ( CheckBytes ( uuid, kUUID_PSIR, 16 ) ) {
+
+ tree->addComment ( "ISO Base Media PSIR" );
+ if ( sISOPtr_PSIR != 0 ) tree->addComment ( "** Redundant ISO Base Media PSIR **" );
+
+ sISOLen_PSIR = boxLen - 24;
+ sISOPtr_PSIR = (XMP_Uns8*) malloc ( sISOLen_PSIR );
+ sISOPos_PSIR = LFA_Tell ( file );
+ LFA_Read ( file, sISOPtr_PSIR, sISOLen_PSIR, true );
+ }
+
+ }
+
+ if ( doPop ) tree->popNode();
+
+ return boxLen;
+
+} // DumpISOBoxInfo
+
+// =================================================================================================
+
+static void
+DumpJPEG2000 (LFA_FileRef file, XMP_Uns32 jp2kLen)
+{
+ // JPEG 2000 files are ISO base media file format,
+ // ISO 14496-12, with an initial 12 byte signature.
+
+ XMP_Uns8 buffer[4096];
+ size_t bufLen;
+
+ LFA_Seek ( file, 12, SEEK_SET );
+ bufLen = LFA_Read ( file, buffer, sizeof(buffer), false);
+
+ XMP_Uns32 ftypLen = DumpISOFileType ( buffer, bufLen );
+
+ XMP_Uns32 boxPos, boxLen;
+
+ for ( boxPos = ftypLen+12; boxPos < jp2kLen; boxPos += boxLen ) {
+ boxLen = DumpISOBoxInfo ( file, 0, boxPos, jp2kLen );
+ }
+
+ if ( sISOPtr_Exif != 0 ) {
+ DumpTIFF ( sISOPtr_Exif, sISOLen_Exif, sISOPos_Exif, "JPEG 2000 Exif" );
+ }
+
+ if ( sISOPtr_IPTC != 0) {
+ DumpIPTC ( sISOPtr_IPTC, sISOLen_IPTC, sISOPos_IPTC, "JPEG 2000 IPTC" );
+ }
+
+ if ( sISOPtr_PSIR != 0 ) {
+ DumpImageResources ( sISOPtr_PSIR, sISOLen_PSIR, sISOPos_PSIR, "JPEG 2000 PSIR" );
+ }
+
+ if ( sISOPtr_XMP != 0 ) {
+ DumpXMP ( sISOPtr_XMP, sISOLen_XMP, sISOPos_XMP, "JPEG 2000 XMP" );
+ }
+
+ CleanISOLegacy();
+} // DumpJPEG2000
+
+// =================================================================================================
+
+// attempt to combine dumping of mpeg-4 and quicktime (mov) into one routine...
+static void
+DumpISO ( LFA_FileRef file, XMP_Uns32 fileLen, bool isQT )
+{
+ // MPEG-4
+ // uses the ISO base media file format, ISO 14496-12. The base structure is a sequence of
+ // boxes, a box can have nested boxes. The box structure is:
+ // A big endian UInt32 box size, the offset to the following box
+ // A big endian UInt32 box type, generally 4 ASCII characters
+ // The box data
+ // A box size of 0 means the last box in the file. If the box size is 1 a big endian UInt64 size
+ // is present between the box type and data. A common subtype is a UUID box. These have a type
+ // of uuid, followed by a 16 byte UUID, followed by other box data.
+ //
+ // The XMP is in a top level UUID box with the UUID BE7ACFCB 97A942E8 9C719994 91E3AFAC.
+
+ // MOV
+ // A QuickTime file happens to be identical to the ISO base media file format at the raw level.
+ // * The chunks are called "atoms" instead of "boxes"
+ // * A leading 'ftyp' atom is not required.
+
+ XMP_Uns32 boxPos = 0; //assume null (presence of ftyp box will correct)
+ XMP_Uns32 boxLen;
+
+ // TODO: make obsolete
+ XMP_Uns8 buffer[4096];
+ size_t bufLen;
+ LFA_Seek ( file, 0, SEEK_SET );
+ bufLen = LFA_Read ( file, buffer, sizeof(buffer) );
+
+ //peek at first 4 bytes
+ Rewind(file);
+ Skip(file,4);
+
+ XMP_Uns32 temp = tree->digest32u( file , "" , true, true );
+ bool hasFtyp = ( kISOTag_ftyp == temp);
+ Rewind(file,4);
+
+ //in Quicktime, a leading 'ftyp' atom is optional,
+ //in MPEG-4 it is mandatory:
+ if (! isQT)
+ assertMsg("MPEG-4 File must have a first 'ftyp' box!", hasFtyp );
+
+ // if existing, go parse it:
+ if( hasFtyp )
+ boxPos = DumpISOFileType ( buffer, bufLen );
+
+ // iterate rest of boxes
+ for ( ; boxPos < fileLen; boxPos += boxLen ) {
+ boxLen = DumpISOBoxInfo ( file, 0, boxPos, fileLen, isQT);
+ }
+
+ // final memory test
+ assertMsg("Unexpected Exif (somewhere in file)", sISOPtr_Exif == 0);
+ assertMsg("Unexpected IPTC (somewhere in file)", sISOPtr_IPTC == 0);
+ assertMsg("Unexpected PSIR (somewhere in file)", sISOPtr_PSIR == 0);
+
+ CleanISOLegacy(); //free's some memory
+}
+
+// =================================================================================================
+
+static size_t GetASFObjectInfo (LFA_FileRef file, XMP_Uns32 objOffset, ASF_ObjHeader* objHeader, size_t nesting)
+{
+ LFA_Seek (file, objOffset, SEEK_SET);
+ LFA_Read ( file, objHeader, 24, true);
+
+ objHeader->size = GetUns64LE (&objHeader->size);
+ XMP_Uns32 size32 = (XMP_Uns32)objHeader->size;
+
+ if (objHeader->size > 0xFFFFFFFF) {
+ tree->addComment("** ASF Object at offset 0x%X is over 4GB: 0x%.8X 0x%.8X",
+ objOffset, High32(objHeader->size), Low32(objHeader->size));
+ }
+
+ size_t infoIndex;
+ for (infoIndex = 0; kASF_KnownObjects[infoIndex].name != 0; ++infoIndex) {
+ if (memcmp (&objHeader->guid, &kASF_KnownObjects[infoIndex].guid, 16) == 0) break;
+ }
+
+ std::string indent (3*nesting, ' ');
+
+ if (kASF_KnownObjects[infoIndex].name != 0) {
+ tree->addComment("%s %s Object, offset %u (0x%X), size %u",
+ indent.c_str(), kASF_KnownObjects[infoIndex].name, objOffset, objOffset, size32);
+ } else {
+ tree->addComment("%s <<unknown object>>, offset %u (0x%X), size %u",
+ indent.c_str(), objOffset, objOffset, size32);
+ ASF_GUID guid;
+ guid.part1 = GetUns32LE (&objHeader->guid.part1);
+ guid.part2 = GetUns16LE (&objHeader->guid.part2);
+ guid.part3 = GetUns16LE (&objHeader->guid.part3);
+ guid.part4 = GetUns16LE (&objHeader->guid.part4);
+ tree->addComment("GUID %.8X-%.4X-%.4X-%.4X-%.4X%.8X",
+ guid.part1, guid.part2, guid.part3, guid.part4,
+ *(XMP_Uns16*)(&guid.part5[0]), *(XMP_Uns32*)(&guid.part5[2]));
+ }
+
+ if (objOffset != 0) tree->addComment(""); // Don't print newline for the real header.
+
+ return infoIndex;
+
+} // GetASFObjectInfo
+
+// =================================================================================================
+
+static void PrinfASF_UTF16 (LFA_FileRef file, XMP_Uns16 byteCount, const char * label)
+{
+ size_t filePos = LFA_Tell (file);
+ //FNO: note: has sideeffect on sDataPtr
+ CaptureFileData (file, 0, byteCount);
+
+ tree->setKeyValue(
+ label,
+ convert16Bit(false,sDataPtr,false,byteCount),
+ fromArgs("offset %d (0x%X), size %d",filePos, filePos, byteCount)
+ );
+}
+
+static void DumpASFFileProperties (LFA_FileRef file, XMP_Uns32 objOffset, XMP_Uns32 objLen)
+{
+ ASF_FileProperties fileProps;
+
+ if (objLen < kASF_FilePropertiesSize) {
+ tree->comment("** File Properties Object is too short");
+ return;
+ }
+
+ LFA_Seek (file, objOffset, SEEK_SET);
+ LFA_Read ( file, &fileProps, kASF_FilePropertiesSize, true);
+
+ fileProps.flags = GetUns32LE (&fileProps.flags); // Only care about flags and create date.
+ fileProps.creationDate = GetUns64LE (&fileProps.creationDate);
+
+ bool bcast = (bool)(fileProps.flags & 1);
+ tree->setKeyValue("ASF:broadcast",
+ (bcast ? "set" : "not set")
+ );
+
+ XMP_Int64 totalSecs = fileProps.creationDate / (10*1000*1000);
+ XMP_Int32 nanoSec = ((XMP_Int32) (fileProps.creationDate - (totalSecs * 10*1000*1000))) * 100;
+ XMP_Int32 days = (XMP_Int32) (totalSecs / 86400);
+ totalSecs -= ((XMP_Int64)days * 86400);
+ XMP_Int32 hour = (XMP_Int32) (totalSecs / 3600);
+ totalSecs -= ((XMP_Int64)hour * 3600);
+ XMP_Int32 minute = (XMP_Int32) (totalSecs / 60);
+ totalSecs -= ((XMP_Int64)minute * 60);
+ XMP_Int32 second = (XMP_Int32)totalSecs;
+ XMP_DateTime binDate;
+ memset (&binDate, 0, sizeof(binDate));
+
+ binDate.year = 1601;
+ binDate.month = 1;
+ binDate.day = 1;
+
+ binDate.day += days;
+ binDate.hour = hour;
+ binDate.minute = minute;
+ binDate.second = second;
+ binDate.nanoSecond = nanoSec;
+
+ SXMPUtils::ConvertToUTCTime (&binDate);
+ std::string strDate;
+ SXMPUtils::ConvertFromDate (binDate, &strDate);
+
+ tree->setKeyValue("ASF:creation date",
+ fromArgs("%s (0x%.8X-%.8X)",
+ strDate.c_str(), High32(fileProps.creationDate), Low32(fileProps.creationDate))
+ );
+} // DumpASFFileProperties
+
+// =================================================================================================
+
+static void DumpASFContentDescription (LFA_FileRef file, XMP_Uns32 objOffset, XMP_Uns32 objLen)
+{
+ ASF_ContentDescription contentDesc; // ! The lengths are in bytes.
+
+ if (objLen < kASF_ContentDescriptionSize) {
+ tree->comment("** Content Description Object is too short");
+ return;
+ }
+
+ LFA_Seek (file, objOffset, SEEK_SET);
+ LFA_Read ( file, &contentDesc, kASF_ContentDescriptionSize, true);
+
+ contentDesc.titleLen = GetUns16LE (&contentDesc.titleLen);
+ contentDesc.authorLen = GetUns16LE (&contentDesc.authorLen);
+ contentDesc.copyrightLen = GetUns16LE (&contentDesc.copyrightLen);
+ contentDesc.descriptionLen = GetUns16LE (&contentDesc.descriptionLen);
+ contentDesc.ratingLen = GetUns16LE (&contentDesc.ratingLen);
+
+ PrinfASF_UTF16 (file, contentDesc.titleLen, "ASF:title");
+ PrinfASF_UTF16 (file, contentDesc.authorLen, "ASF:author");
+ PrinfASF_UTF16 (file, contentDesc.copyrightLen, "ASF:copyright");
+ PrinfASF_UTF16 (file, contentDesc.descriptionLen, "ASF:description");
+ PrinfASF_UTF16 (file, contentDesc.ratingLen, "ASF:rating");
+
+} // DumpASFContentDescription
+
+// =================================================================================================
+
+static void DumpASFContentBranding (LFA_FileRef file, XMP_Uns32 objOffset, XMP_Uns32 objLen)
+{
+ XMP_Uns32 fieldSize;
+
+ if (objLen < (16 + 8 + 4*4)) {
+ tree->comment("** Content Branding Object is too short");
+ return;
+ }
+
+ XMP_Uns32 fieldOffset = objOffset + 16 + 8 + 4;
+ LFA_Seek (file, fieldOffset, SEEK_SET);
+
+ LFA_Read ( file, &fieldSize, 4, true);
+ fieldSize = GetUns32LE (&fieldSize);
+ fieldOffset += fieldSize;
+ LFA_Seek (file, fieldSize, SEEK_CUR); // Skip the banner data.
+
+ LFA_Read ( file, &fieldSize, 4, true);
+ fieldSize = GetUns32LE (&fieldSize);
+ fieldOffset += fieldSize;
+ tree->setKeyValue("ASF:banner URL",
+ "",
+ fromArgs("offset %d (0x%X), size %d", fieldOffset, fieldOffset, fieldSize )
+ );
+
+ if (fieldSize != 0) {
+ CaptureFileData (file, 0, fieldSize);
+ //NB: not yet tested..., not sure if stopOnNull needed, thus using false
+ tree->changeValue(convert8Bit(sDataPtr,false,fieldSize));
+ }
+
+ LFA_Read ( file, &fieldSize, 4, true);
+ fieldSize = GetUns32LE (&fieldSize);
+ fieldOffset += fieldSize;
+ tree->setKeyValue("ASF:copyright URL",
+ "",
+ fromArgs("offset %d (0x%X), size %d", fieldOffset, fieldOffset, fieldSize)
+ );
+
+ if (fieldSize != 0) {
+ CaptureFileData (file, 0, fieldSize);
+ //NB: not yet tested..., not sure if stopOnNull needed, thus using false
+ tree->changeValue(convert8Bit(sDataPtr,false,fieldSize));
+ }
+
+} // DumpASFContentBranding
+
+// =================================================================================================
+
+static void DumpASFContentEncryption (LFA_FileRef file, XMP_Uns32 objOffset, XMP_Uns32 objLen)
+{
+ XMP_Uns32 fieldSize;
+
+ if (objLen < (16 + 8 + 4*4)) {
+ tree->addComment("** Content Encryption Object is too short");
+ return;
+ }
+
+ LFA_Seek (file, (objOffset+16+8), SEEK_SET);
+
+ LFA_Read ( file, &fieldSize, 4, true);
+ fieldSize = GetUns32LE (&fieldSize);
+ LFA_Seek (file, fieldSize, SEEK_CUR); // Skip the secret data.
+
+ LFA_Read ( file, &fieldSize, 4, true);
+ fieldSize = GetUns32LE (&fieldSize);
+ LFA_Seek (file, fieldSize, SEEK_CUR); // Skip the protection type.
+
+ LFA_Read ( file, &fieldSize, 4, true);
+ fieldSize = GetUns32LE (&fieldSize);
+ CaptureFileData (file, 0, fieldSize);
+ PrintOnlyASCII_8 (sDataPtr, fieldSize, "Key ID");
+
+ LFA_Read ( file, &fieldSize, 4, true);
+ fieldSize = GetUns32LE (&fieldSize);
+ CaptureFileData (file, 0, fieldSize);
+ PrintOnlyASCII_8 (sDataPtr, fieldSize, "License URL");
+
+} // DumpASFContentEncryption
+
+// =================================================================================================
+
+static void DumpASFHeaderExtension (LFA_FileRef file, XMP_Uns32 extOffset, XMP_Uns32 extLen)
+{
+ // The Header Extension Object is a child of the Header Object and the parent of nested objects.
+
+ XMP_Uns32 extEnd = extOffset + extLen;
+
+ XMP_Uns32 childLen;
+ XMP_Uns32 childOffset;
+
+ ASF_ObjHeader childHeader;
+
+ for (childOffset = (extOffset + kASF_HeaderExtensionSize); childOffset < extEnd; childOffset += childLen) {
+ (void) GetASFObjectInfo (file, childOffset, &childHeader, 2);
+ childLen = (XMP_Uns32)childHeader.size;
+ }
+
+ if (childOffset != extEnd) {
+ tree->addComment("** Invalid end to nested Header Extension objects, offset %u", childOffset);
+ }
+
+} // DumpASFHeaderExtension
+
+// =================================================================================================
+
+static void
+DumpASF (LFA_FileRef file, XMP_Uns32 asfLen)
+{
+ // An ASF file contains objects of the form:
+ // A 16 byte GUID giving the object's type and use
+ // A little endian 64-bit object length, includes the GUID and length (== 24 + data size)
+ // The object's data
+ // Objects can be nested. The top level of a file is a Header Object, followed by a Data Object,
+ // followed by any number of "other" top level objects, followed by any number of index objects.
+ // There is legacy metadata in certain nested objects within the Header Object. The XMP is an
+ // "other" top level object.
+
+ size_t infoIndex;
+
+ XMP_Uns32 objLen;
+ XMP_Uns32 objOffset;
+ ASF_ObjHeader objHeader;
+
+ tree->comment("ASF file Object layout");
+
+ // Dump the Header Object's content, looking for legacy metadata.
+ infoIndex = GetASFObjectInfo (file, 0, &objHeader, 0);
+ XMP_Uns32 headerLen = (XMP_Uns32)objHeader.size;
+
+ if (kASF_KnownObjects[infoIndex].kind != kASFObj_Header) {
+ tree->comment("** First object is not the Header Object");
+ return;
+ }
+
+ XMP_Uns32 nestedCount;
+ LFA_Seek (file, 24, SEEK_SET);
+ LFA_Read ( file, &nestedCount, 4, true);
+ nestedCount = GetUns32LE (&nestedCount);
+ tree->addComment("%u nested objects", nestedCount);
+
+ for (objOffset = (16+8+4+2); objOffset < headerLen; objOffset += objLen, --nestedCount) {
+ infoIndex = GetASFObjectInfo (file, objOffset, &objHeader, 1);
+ objLen = (XMP_Uns32)objHeader.size;
+
+ switch (kASF_KnownObjects[infoIndex].kind) {
+ case kASFObj_FileProperties :
+ DumpASFFileProperties (file, objOffset, objLen);
+ break;
+ case kASFObj_ContentDesc :
+ DumpASFContentDescription (file, objOffset, objLen);
+ break;
+ case kASFObj_ContentBrand :
+ DumpASFContentBranding (file, objOffset, objLen);
+ break;
+ case kASFObj_ContentEncrypt :
+ DumpASFContentEncryption (file, objOffset, objLen);
+ break;
+ case kASFObj_HeaderExtension :
+ DumpASFHeaderExtension (file, objOffset, objLen);
+ break;
+ default :
+ break;
+ }
+ }
+
+ if ((objOffset != headerLen) || (nestedCount != 0)) {
+ tree->comment("** Invalid end to nested Header objects, offset %u, count %u",
+ objOffset, nestedCount);
+ objOffset = headerLen;
+ }
+
+ // Dump the basic info for the remaining objects, looking for the XMP along the way.
+ infoIndex = GetASFObjectInfo (file, objOffset, &objHeader, 0);
+ objLen = (XMP_Uns32)objHeader.size;
+
+ if (kASF_KnownObjects[infoIndex].kind != kASFObj_Data) {
+ tree->addComment("** Second object is not the Data Object");
+ if (kASF_KnownObjects[infoIndex].kind == kASFObj_XMP) {
+ if (sXMPPtr == 0)
+ CaptureXMPF (file, (objOffset + 24), (objLen - 24));
+ else
+ tree->addComment("** Multiple XMP objects");
+ }
+ }
+
+ for (objOffset += objLen; objOffset < asfLen; objOffset += objLen) {
+ GetASFObjectInfo (file, objOffset, &objHeader, 0);
+ objLen = (XMP_Uns32)objHeader.size;
+
+ if (kASF_KnownObjects[infoIndex].kind == kASFObj_XMP) {
+ if (sXMPPtr == 0)
+ CaptureXMPF (file, (objOffset + 24), (objLen - 24));
+ else
+ tree->addComment("** Multiple XMP objects");
+ }
+ }
+
+ if (objOffset != asfLen) tree->addComment("** Invalid end to top level objects: %u", objOffset);
+ if (sXMPPtr != 0) DumpXMP ("ASF XMP object");
+
+} // DumpASF
+
+// =================================================================================================
+
+static void
+DumpUCF(LFA_FileRef file, XMP_Int64 len)
+{
+ //////////////////////////////////////////////////////////////////////
+ // constants
+ const static XMP_Uns32 UCF_HS_CONTENTFILE=0x04034b50;
+ const static XMP_Uns32 UCF_CD_FILE_HEADER=0x02014b50; //central directory - file header
+ const static XMP_Uns32 UCF_ZIP64_END_OF_CD_RECORD=0x06064b50;
+ const static XMP_Uns32 UCF_ZIP64_END_OF_CD_LOCATOR=0x07064b50;
+ const static XMP_Uns32 UCF_CD_END=0x06054b50;
+
+ const static XMP_Int32 UCF_COMMENT_MAX = 0xFFFF;
+ const static XMP_Int32 UCF_EOD_FIXED_SIZE = 22;
+
+ const static XMP_Int32 UCF_ZIP64_LOCATOR_FIXED_SIZE = 20;
+ const static XMP_Int32 UCF_ZIP64_RECORD_FIXED_SIZE = 56;
+
+ //////////////////////////////////////////////////////////////////////
+ // variables:
+ XMP_Int64 curPos=0;
+ bool isZip64;
+
+ XMP_Uns32 numDirEntries;
+
+ XMP_Uns64 size_CD;
+ XMP_Uns64 offset_Zip64_EndOfCD_Record=0;
+ XMP_Uns64 offset_CD;
+
+ typedef std::list<XMP_Int64> OffsetStack;
+ OffsetStack contentFiles;
+ contentFiles.clear(); //precaution for mac
+
+ //////////////////////////////////////////////////////////////////////
+ // prolog:
+ tree->comment("len is 0x%I64X",len);
+ tree->comment("inherently parsing bottom-up");
+ if( len > 0xFFFFFFFFl )
+ tree->comment("info: >4GB ==> most like zip64 !");
+
+ //////////////////////////////////////////////////////////////////////
+ // parse bottom up:
+
+ /////////////////////////////////////////////////////////////////////
+ // zip comment:
+ XMP_Int32 zipCommentLen = 0;
+ for ( ; zipCommentLen <= UCF_COMMENT_MAX; zipCommentLen++ )
+ {
+ LFA_Seek( file, -zipCommentLen -2, SEEK_END );
+ if ( LFA_ReadUns16_LE( file ) == zipCommentLen ) //found it?
+ {
+ //double check, might just look like comment length (actually be 'evil' comment)
+ LFA_Seek( file , - UCF_EOD_FIXED_SIZE, SEEK_CUR );
+ if ( LFA_ReadUns32_LE( file ) == UCF_CD_END ) break; //heureka, directory ID
+ // 'else': just go on
+ }
+ }
+ tree->comment( fromArgs("zip Comment length: %d",zipCommentLen ));
+
+ //was it a break or just not found ?
+ assertMsg ( "zip broken near end or invalid comment", zipCommentLen < UCF_COMMENT_MAX );
+
+ /////////////////////////////////////////////////////////////////////
+ // End of CDR:
+ LFA_Seek( file , - UCF_EOD_FIXED_SIZE - zipCommentLen, SEEK_END);
+ curPos = LFA_Tell(file);
+ tree->pushNode("End of Central Directory");
+ tree->addOffset( file );
+ {
+ assertMsg("expected 'end of central directory record'", UCF_CD_END == tree->digest32u(file) );
+ assertMsg("UCF allow single-volume zips only", 0 == tree->digest16u(file)); //volume number (0,1,..)
+ assertMsg("UCF allow single-volume zips only(thus directory must be in 0)", 0 == tree->digest16u(file,"")); //volume number (0,1,..)
+
+ numDirEntries=tree->digest16u(file,"number of directory entries");
+ tree->digest16u(numDirEntries, file,"number of total directory entries");
+
+ size_CD = tree->digest32u(file,"size of central directory",false,true);
+ offset_CD = tree->digest32u(file,"offset of central directory",false,true);
+ if (offset_CD == 0xFFFFFFFF) tree->addComment("apparently zip-64");
+
+ XMP_Uns16 zipCommentLengReverify = tree->digest16u(file,"zip comment length");
+ assertMsg( "zipCommentLengReverify failed", zipCommentLengReverify == zipCommentLen );
+ }
+ tree->popNode();
+ /////////////////////////////////////////////////////////////////////
+ // Zip64 End Of CD Locator
+ LFA_Seek( file, curPos - UCF_ZIP64_LOCATOR_FIXED_SIZE ,SEEK_SET );
+
+ //tree->comment("offset is %X", LFA_Tell(file) );
+ //tree->comment("peek is %X", Peek32u(file) );
+
+ if ( Peek32u(file) != UCF_ZIP64_END_OF_CD_LOCATOR )
+ {
+ tree->comment("no Zip64 CDL -> no Zip64");
+ assertMsg("offset FFFF FFFF indicates zip-64, but no Zip64 CDL found", offset_CD != 0xFFFFFFFF );
+ isZip64=false;
+ }
+ else
+ {
+ isZip64=true;
+ tree->pushNode("Zip64 End-Of-CD Locator");
+ tree->addOffset( file );
+
+ tree->digest32u(file,"sig",false,true);
+ assertMsg("'numOfDisk with central start dir' must be 0",
+ 0 == tree->digest32u(file,"disk with start dir"));
+ tree->digest64u(&offset_Zip64_EndOfCD_Record, file,"Zip64 End Of CD Offset",false,true);
+
+ tree->digest32u( /* deactived while bug #1742179: 1,*/ file, "total num of disks", false, true);
+ tree->popNode();
+ }
+
+ /////////////////////////////////////////////////////////////////////
+ // Zip64 End of CD Record
+ if (isZip64)
+ {
+ XMP_Uns64 size_Zip64_EndOfCD_Record;
+ tree->pushNode("Zip64 End of CD Record");
+ LFA_Seek( file, offset_Zip64_EndOfCD_Record ,SEEK_SET );
+ tree->addOffset( file );
+
+ tree->digest32u( UCF_ZIP64_END_OF_CD_RECORD ,file, "sig", false, true );
+ tree->digest64u( &size_Zip64_EndOfCD_Record, file, "size of zip64 CDR", false, true);
+ tree->digest16u( file, "made by", false, true );
+ tree->digest16u( file, "needed to extract", false, true );
+ tree->digest32u( (XMP_Uns32)0 , file, "number of this disk", false, true);
+ tree->digest32u( (XMP_Uns32)0 , file, "disk that contains start of CD", false, true);
+ tree->digest64u( (XMP_Uns64) numDirEntries, file, "total Num of Entries This Disk", false, false );
+ tree->digest64u( (XMP_Uns64) numDirEntries, file, "total Num of Entries", false, false );
+ //TODO assert agtainst each other and above
+ tree->digest64u( &size_CD, file, "size_CD", false, true );
+ tree->digest64u( &offset_CD, file, "offset_CD", false, true );
+ XMP_Int64 lenExtensibleSector = UCF_ZIP64_RECORD_FIXED_SIZE - size_Zip64_EndOfCD_Record;
+ tree->comment("zip64 extensible data sector (%d bytes)", lenExtensibleSector );
+ //sanity test:
+ Skip( file, lenExtensibleSector );
+ assertMsg("numbers don't add up", Peek32u(file) != UCF_ZIP64_END_OF_CD_LOCATOR );
+
+ tree->popNode();
+ }
+
+ /////////////////////////////////////////////////////////////////////
+ // parse Central directory structure: content file 1..n
+ tree->pushNode("Central directory structure:");
+ LFA_Seek( file, offset_CD ,SEEK_SET );
+ tree->addOffset( file );
+
+ for (XMP_Uns32 contentFileNo=1 ; contentFileNo <= numDirEntries; contentFileNo++ )
+ {
+ tree->pushNode("File Header No %d:", contentFileNo);
+ tree->addOffset( file );
+
+ XMP_Uns16 version, flags, cmethod;
+ XMP_Uns32 crc,compressed_size,uncompressed_size32;
+ XMP_Uns64 offsetLocalHeader = 0;
+ bool usesDescriptionHeader;
+
+ tree->digest32u( UCF_CD_FILE_HEADER, file, "sig", false, true );
+
+ tree->digest16u(file,"version made by",false,true);
+ tree->digest16u(&version, file,"version needed to extract");
+ assertMsg( fromArgs("illegal 'version needed to extract' (must be 10,20 or 45, was %u)",version),
+ ( version == 10 || version == 20 || version == 45));
+
+ tree->digest16u ( &flags, file, "general purpose bit flags", false, true );
+ assertMsg("no zip encryption must be used", (flags&0x1)==0);
+ usesDescriptionHeader= ((flags&0x8) != 0);
+ if (usesDescriptionHeader) tree->addComment("uses description header");
+
+ tree->digest16u(&cmethod, file,"compression method");
+ assertMsg("illegal compression method (must be 0 or 8(flate))!",( cmethod == 0 || cmethod == 8 ));
+
+ tree->digest(file,"last mod file time",0,2);
+ tree->digest(file,"last mod file date",0,2);
+
+ tree->digest32u(&crc, file); //crc-32
+ tree->digest32u(&compressed_size, file,"compressed size");
+ tree->digest32u(&uncompressed_size32, file,"uncompressed size");
+
+ XMP_Uns16 size_filename,size_extra,size_comment;
+
+ tree->digest16u( &size_filename , file , "size filename");
+ assertMsg("unusual name length length (broken file?)", size_filename>0 && size_filename < 500 ); //discover parsing nonsense...
+ tree->digest16u( &size_extra , file , "size extra field");
+ tree->digest16u( &size_comment , file , "size file comment");
+ tree->digest16u( (XMP_Uns16)0 , file , "disk start no");
+
+ tree->digest16u( file , "internal attribs");
+ tree->digest32u( file , "external attribs");
+
+ offsetLocalHeader = tree->digest32u( file , "relative offset local header",false,true); // Int64 <== Uns32
+
+ // name of file, optional relative path, strictly forward slashes.
+ assert(size_filename != 0);
+ std::string filename = tree->digestString(file,"filename",size_filename); //NOT zero-terminated
+
+ if (contentFileNo == 1)
+ {
+ assert( size_extra == 0); //spec guarantes mimetype content at 38 <=> extraFieldLen == 0
+ assertMsg (
+ fromArgs("first file in UCF must be called mimetype, was %s",filename.c_str()),
+ (size_filename == 8) && (filename == "mimetype"));
+ }
+
+ if(size_extra != 0)
+ {
+ tree->pushNode("extraField");
+ XMP_Int32 remaining = size_extra;
+ while (remaining > 0)
+ {
+ assertMsg( "need 4 bytes for next header ID+len", remaining >= 4);
+ XMP_Uns16 headerID = tree->digest16u(file,"headerID",false,true);
+ XMP_Uns16 dataSize = tree->digest16u(file,"data size",false,true);
+ remaining -= 4;
+ assertMsg( "actual field lenght not given", remaining >= dataSize);
+ if ( headerID == 0x1 ) //we only care about "Zip64 extended information extra field"
+ {
+ tree->digest64u( &offsetLocalHeader, file, "64bit offset", false, true);
+ remaining -= 8;
+ }
+ else
+ {
+ Skip(file, dataSize );
+ remaining -= dataSize;
+ }
+
+ }
+ tree->popNode();
+ }
+
+ //now that regular 32 bit and zip-64 is through...
+ if (contentFileNo == 1)
+ {
+ assertMsg( "first header offset (aka content file offset) must (naturally) be 0", offsetLocalHeader==0 );
+ }
+ else
+ {
+ assertMsg("local header offset (aka content file offset) must not be 0", offsetLocalHeader!=0 );
+ }
+ contentFiles.push_back(offsetLocalHeader);
+
+ if(size_comment != 0)
+ {
+ tree->digest(file,"file comment",0,size_comment);
+ }
+ tree->popNode(); //file header
+ }
+ tree->popNode(); //central directory structure
+
+ /////////////////////////////////////////////////////////////////////
+ // Content Files (incl. Headers, etc)
+ for(XMP_Uns16 cfNo=1; cfNo <= numDirEntries; cfNo++)
+ {
+ //vars
+ XMP_Uns32 compressed_size,uncompressed_size, crc32;
+ XMP_Uns16 version,nameLen,extraFieldLen;
+
+ tree->pushNode("Content File %d:", cfNo);
+
+ assert( !contentFiles.empty());
+ XMP_Int64 fileHeaderOffset = contentFiles.front();
+ contentFiles.pop_front();
+
+ bool ok;
+ LFA_Seek( file, fileHeaderOffset, SEEK_SET, &ok );
+ tree->addOffset( file );
+ assert(ok);
+
+ //local file header
+ tree->digest32u( UCF_HS_CONTENTFILE, file, "sig", false, true );
+ tree->digest16u(&version, file,"version");
+ assertMsg("illegal 'version needed to extract' (must be 10,20 or 45, was %u)",
+ ( version == 10 || version == 20 || version == 45));
+ Skip(file,8);
+ tree->digest32u( &crc32, file, "crc-32", false, true );
+ tree->digest32u( &compressed_size, file, "compressed", false, false );
+ tree->digest32u( &uncompressed_size, file, "uncompressed", false, false );
+ tree->digest16u( &nameLen, file, "file name length", false, false );
+ tree->digest16u( &extraFieldLen, file, "extra field length", false, false );
+
+ assert(nameLen != 0);
+ assertMsg("unusual name length length (broken file?)", nameLen>0 && nameLen < 500 ); //discover parsing nonsense...
+
+ // name of file, optional relative path, strictly forward slashes.
+ std::string filename = tree->digestString(file,"filename",nameLen); //NOT zero-terminated
+ if (cfNo == 1)
+ {
+ assertMsg("first file in UCF muste be called mimetype", filename=="mimetype" );
+ assert( extraFieldLen == 0); //spec guarantes mimetype content at 38 <=> extraFieldLen == 0
+ assert( LFA_Tell(file)==38 );
+ tree->digestString(file,"file data (mimetype)",compressed_size);
+ }
+ else //not the first mimetype file thing
+ {
+ // FILE DATA =============================================================
+ if (extraFieldLen != 0) // may indeed not exist, and lenght=0 must not be passed into digestString()
+ tree->digestString(file,"extra field",extraFieldLen); //NOT zero-terminated
+ tree->setKeyValue("file data","",fromArgs("skipping %u bytes",compressed_size));
+ Skip(file,compressed_size);
+ }
+
+
+
+
+ tree->popNode();
+ }
+
+ /////////////////////////////////////////////////////////////////////
+ // :
+ tree->pushNode("");
+ tree->popNode();
+
+ /////////////////////////////////////////////////////////////////////
+ // :
+
+ /////////////////////////////////////////////////////////////////////
+ // :
+
+ /////////////////////////////////////////////////////////////////////
+ // :
+
+
+} // DumpUCF
+
+// =================================================================================================
+
+static const char * kRIFF_Lists[] = { "INFO", "hdrl", "Tdat", "Cdat", 0 };
+
+static const char * kRIFF_LegacyText[] =
+{
+ // INFO list items, taken from Exif 2.2, ASCII with terminating nul:
+ "IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI", "IENG", "IGNR",
+ "IKEY", "ILGT", "IMED", "INAM", "IPLT", "IPRD", "ISBJ", "ISFT", "ISHP", "ISRC", "ISRF", "ITCH",
+ // AVI legacy items, taken from AVI handler code:
+ "ISMT", "tc_O", "tc_A", "rn_O", "rn_A", "cmnt",
+ // WAV legacy items, taken from WAV handler code:
+ "DISP",
+ // Final sentinel
+ 0
+};
+
+// =================================================================================================
+
+static bool
+IsKnownRIFFList ( const char * listID )
+{
+ for ( size_t i = 0; kRIFF_Lists[i] != 0; ++i ) {
+ if ( strncmp ( listID, kRIFF_Lists[i], 4 ) == 0 ) return true;
+ }
+
+ return false;
+
+} // IsKnownRIFFList
+
+// =================================================================================================
+
+static bool
+IsKnownRIFFLegacy ( const char * chunkID )
+{
+ for ( size_t i = 0; kRIFF_LegacyText[i] != 0; ++i ) {
+ if ( strncmp ( chunkID, kRIFF_LegacyText[i], 4 ) == 0 ) return true;
+ }
+
+ return false;
+
+} // IsKnownRIFFLegacy
+
+// =================================================================================================
+
+static XMP_Uns32
+DumpRIFFChunk ( LFA_FileRef file, XMP_Uns32 chunkOffset, XMP_Uns32 parentEnd, size_t nesting )
+{
+ // AVI and WAV files are RIFF based. Although they have usage differences, we can have a common
+ // dumper. This might need changes for other RIFF-based files, e.g. for specific legacy
+ // metadata. RIFF is a chunky format. AVI and WAV have an outermost RIFF chunk. The XMP is in a
+ // top level "_PMX" chunk. Legacy metadata for WAV is in a top level LIST/INFO chunk. Legacy
+ // metadata for AVI is in a variety of places, don't have specs at present. Free space can be
+ // JUNK or JUNQ.
+ //
+ // A RIFF chunk contains:
+ // - A 4 byte chunk ID, typically ASCII letters
+ // - A little endian UInt32 size of the chunk data
+ // - The chunk data
+ // - Pad byte if the chunk data length is odd (added on 2007-03-22)
+
+ // The ID is written in "reading order", e.g. the 'R' in "RIFF" is first in the file. Chunks
+ // must start on even offsets. A pad byte of 0 is written after the data if necessary. The size
+ // does not include the pad, nor the ID and size fields. Some chunks contain nested chunks,
+ // notably the RIFF and LIST chunks do. These have the layout:
+ // - A 4 byte chunk ID, typically ASCII letters
+ // - A little endian UInt32 size of the chunk data
+ // - A 4 byte usage ID, typically ASCII letters
+ // - The nested chunks
+
+ LFA_Seek ( file, chunkOffset, SEEK_SET );
+ char chunkID[4];
+ LFA_Read ( file, chunkID, 4, true );
+
+ XMP_Uns32 chunkLen = tree->digest32u(file);
+
+ bool isRIFF = CheckBytes ( chunkID, "RIFF", 4 );
+ bool isLIST = CheckBytes ( chunkID, "LIST", 4 );
+
+ if ( isRIFF | isLIST ) {
+ char subID[4];
+ LFA_Read ( file, subID, 4, true );
+
+ bool knownList = false;
+ if ( isLIST ) knownList = IsKnownRIFFList ( subID );
+
+ tree->pushNode ( "%.4s:%.4s" , chunkID, subID );
+ tree->addComment ( "offset 0x%X, size %d%s",
+ chunkOffset, chunkLen, (((chunkLen & 1) == 0) ? "" : " (has pad byte)") );
+
+ if ( (chunkOffset + chunkLen) > parentEnd ) {
+ tree->addComment ( "Chunk too long, extends beyond parent" );
+ }
+
+ if ( (isRIFF && (nesting == 0)) || (knownList && (nesting == 1)) ) {
+
+ XMP_Uns32 childLimit = chunkOffset + 8 + chunkLen;
+ XMP_Uns32 childOffset, childLen;
+
+ for ( childOffset = (chunkOffset + 12); childOffset < childLimit; childOffset += (8 + childLen) ) {
+ childLen = DumpRIFFChunk ( file, childOffset, childLimit, nesting+1 );
+ }
+
+ if ( childOffset != childLimit ) {
+ tree->addComment ( "Unexpected end to nested chunks at offset %u (0x%X)", childOffset, childOffset );
+ }
+ }
+ tree->popNode();
+ } else {
+ tree->pushNode ( "%.4s",chunkID );
+ tree->addComment ( "offset 0x%X, size %d%s",
+ chunkOffset, chunkLen, (((chunkLen & 1) == 0) ? "" : " (has pad byte)") );
+
+ if ( (chunkLen > 0) && IsKnownRIFFLegacy (chunkID) ) {
+ CaptureFileData ( file, (chunkOffset + 8), chunkLen );
+ std::string legacyField = convert8Bit ( sDataPtr, false, chunkLen );
+ tree->changeValue ( legacyField.substr(0,30) + ((legacyField.size()>30)?"...":"") );
+ }
+
+ if ( (chunkLen > 0) && CheckBytes ( chunkID, "_PMX", 4 ) ) {
+ tree->pushNode( "XMP packet" );
+ {
+ tree->addComment( "xmp at offset 0x%X, length 0x%X", (chunkOffset + 8), chunkLen );
+ }
+ tree->popNode();
+ }
+ tree->popNode();
+ }
+
+ return (chunkLen + (chunkLen & 1)); // Account for the pad byte.
+} // DumpRIFFChunk
+
+// =================================================================================================
+
+static void
+DumpRIFF ( LFA_FileRef file, XMP_Uns32 fileLen )
+{
+ XMP_Uns32 riffLen = DumpRIFFChunk ( file, 0, fileLen, 0 );
+ riffLen += 8; // Include the chunk header.
+
+ assertMsg( fromArgs("Unexpected end to RIFF at offset %d (0x%X)", riffLen, riffLen), riffLen == fileLen );
+}
+
+// =================================================================================================
+
+static XMP_Uns32 crcTable[256];
+static bool crcTableInited = false;
+
+static XMP_Uns32 ComputeCRCforPNG ( LFA_FileRef file, XMP_Uns32 crcOffset, XMP_Uns32 crcLen )
+{
+ if ( ! crcTableInited ) {
+ for ( int n = 0; n < 256; ++n ) {
+ XMP_Uns32 c = n;
+ for ( int k = 0; k < 8; ++k ) {
+ XMP_Uns32 lowBit = c & 1;
+ c = c >> 1;
+ if ( lowBit != 0 ) c = c ^ 0xEDB88320;
+ }
+ crcTable[n] = c;
+ }
+ crcTableInited = true;
+ }
+
+ XMP_Uns32 crc = 0xFFFFFFFF;
+ CaptureFileData ( file, crcOffset, crcLen );
+
+ for ( XMP_Uns32 i = 0; i < crcLen; ++i ) { // ! The CRC includes the chunk type and data.
+ XMP_Uns8 byte = sDataPtr[i];
+ XMP_Uns8 index = (XMP_Uns8) ((crc ^ byte) & 0xFF);
+ crc = crcTable[index] ^ (crc >> 8);
+ }
+
+ return crc ^ 0xFFFFFFFF;
+
+} // ComputeCRCforPNG
+
+// =================================================================================================
+
+static const XMP_Uns32 kPNG_iTXt = 0x69545874;
+static const XMP_Uns32 kPNG_tEXt = 0x74455874;
+static const XMP_Uns32 kPNG_zTXt = 0x7A545874;
+
+static XMP_Uns32
+DumpPNGChunk ( LFA_FileRef file, XMP_Uns32 pngLen, XMP_Uns32 chunkOffset )
+{
+ // A PNG chunk contains:
+ // A big endian UInt32 length for the data portion. Zero is OK.
+ // A 4 byte chunk type, should be 4 ASCII letters, lower or upper case.
+ // The chunk data.
+ // A big endian UInt32 CRC.
+ // There are no alignment constraints.
+ //
+ // Chunks of type tEXt, iTXt, and zTXt have text values. Each text form has a leading "usage
+ // keyword" followed by the data string. The keywords must be visible Latin-1, 0x20..0x7E and
+ // 0xA1..0xFF. They are limited to 1 to 79 characters, plus a terminating nul.
+ //
+ // A tEXt chunk has 0 or more bytes of Latin-1 characters. The data is not nul terminated, and
+ // embedded nuls are not allowed. A zTXt chunk is like tEXt but the data string is zlib compressed.
+ // An iTXt chunk has a variety of "info tags" followed by a UTF-8 data string.
+ //
+ // The XMP is in an iTXt chunk with the keyword XML:com.adobe.xmp and 4 bytes of 0 for the info.
+
+ XMP_Uns32 chunkLen;
+ XMP_Uns32 chunkType;
+ XMP_Uns32 chunkCRC;
+
+ if ( (pngLen - chunkOffset) < 12 ) {
+ tree->addComment ( "** Unexpected end of PNG file, %ul bytes remaining **", (pngLen - chunkOffset) );
+ return (pngLen - chunkOffset);
+ }
+
+ LFA_Seek ( file, chunkOffset, SEEK_SET );
+ LFA_Read ( file, &chunkLen, 4, true );
+ chunkLen = GetUns32BE (&chunkLen);
+
+ if ( chunkLen > (pngLen - chunkOffset) ) {
+ tree->addComment ( "** No room for PNG chunk, need %u, have %u **", chunkLen, pngLen-chunkOffset );
+ return (pngLen - chunkOffset); // ! Not chunkLen, might be bad and cause wrap-around.
+ }
+
+ LFA_Read ( file, &chunkType, 4, true); // After read, memory is in file order.
+
+ LFA_Seek ( file, (chunkOffset + 8 + chunkLen) , SEEK_SET );
+ LFA_Read ( file, &chunkCRC, 4, true);
+ chunkCRC = GetUns32BE (&chunkCRC);
+
+ tree->addComment ( " '%.4s', offset %u (0x%X), size %d, CRC 0x%.8X",
+ &chunkType, chunkOffset, chunkOffset, chunkLen, chunkCRC );
+
+ XMP_Uns32 newCRC = ComputeCRCforPNG ( file, (chunkOffset + 4), (chunkLen + 4) );
+
+ if ( chunkCRC != newCRC ) tree->addComment ( "** CRC should be 0x%.8X **", newCRC );
+
+ chunkType = GetUns32BE (&chunkType); // Reorder the type to compare with constants.
+
+ if ( (chunkType == kPNG_iTXt) || (chunkType == kPNG_tEXt) || (chunkType == kPNG_zTXt) ) {
+
+ CaptureFileData ( file, (chunkOffset + 8), chunkLen );
+
+ XMP_Uns8 * keywordPtr = sDataPtr;
+ size_t keywordLen = strlen ((char*)keywordPtr);
+
+ PrintOnlyASCII_8 ( keywordPtr, keywordLen, "," );
+
+ if ( (chunkType == kPNG_iTXt) && (keywordLen == 17) && CheckBytes (keywordPtr, "XML:com.adobe.xmp", 18) ) {
+
+ if ( sXMPPtr != 0 ) {
+ tree->addComment ( " ** Redundant XMP **" );
+ } else {
+ CaptureXMP ( (keywordPtr + 22), (chunkLen - 22), (chunkOffset + 8 + 22) );
+ XMP_Uns32 otherFlags = GetUns32BE (keywordPtr+18);
+ if ( otherFlags != 0 ) tree->addComment ( "** bad flags %.8X **", otherFlags );
+ }
+
+ }
+
+ }
+
+ return (8 + chunkLen + 4);
+
+} // DumpPNGChunk
+
+// =================================================================================================
+
+static void
+DumpPNG ( LFA_FileRef file, XMP_Uns32 pngLen )
+{
+ // A PNG file contains an 8 byte signature followed by a sequence of chunks.
+
+ XMP_Uns32 chunkOffset = 8;
+
+ while ( chunkOffset < pngLen ) {
+ XMP_Uns32 chunkLen = DumpPNGChunk ( file, pngLen, chunkOffset );
+ chunkOffset += chunkLen;
+ }
+
+ if ( sXMPPtr != 0 ) DumpXMP ( "PNG XMP 'iTXt' chunk" );
+
+} // DumpPNG
+
+// =================================================================================================
+
+static void
+DumpInDesign (LFA_FileRef file, XMP_Uns32 inddLen)
+{
+ InDesignMasterPage masters[2];
+ size_t dbPages;
+ XMP_Uns8 cobjEndian;
+
+ // FIgure out which master page to use.
+
+ LFA_Seek (file, 0, SEEK_SET);
+ LFA_Read ( file, &masters, sizeof(masters), true);
+
+ XMP_Uns64 seq0 = GetUns64LE ((XMP_Uns8 *) &masters[0].fSequenceNumber);
+ XMP_Uns64 seq1 = GetUns64LE ((XMP_Uns8 *) &masters[1].fSequenceNumber);
+
+ if (seq0 > seq1) {
+ dbPages = GetUns32LE ((XMP_Uns8 *) &masters[0].fFilePages);
+ cobjEndian = masters[0].fObjectStreamEndian;
+ tree->addComment(" Using master page 0");
+ } else {
+ dbPages = GetUns32LE ((XMP_Uns8 *) &masters[1].fFilePages);
+ cobjEndian = masters[1].fObjectStreamEndian;
+ tree->addComment(" Using master page 1");
+ }
+
+ bool bigEndian = (cobjEndian == kINDD_BigEndian);
+
+ tree->addComment("%d pages, %s endian", dbPages, (bigEndian ? "big" : "little"));
+
+ // Look for the XMP contiguous object.
+
+ // *** XMP_Int64 cobjPos = (XMP_Int64)dbPages * kINDD_PageSize; // ! Use a 64 bit multiply!
+ XMP_Uns32 cobjPos = dbPages * kINDD_PageSize;
+ XMP_Uns32 cobjLen;
+
+ for (; cobjPos < inddLen; cobjPos += cobjLen) {
+
+ InDesignContigObjMarker cobjHead;
+
+ LFA_Seek (file, cobjPos, SEEK_SET);
+ LFA_Read ( file, &cobjHead, sizeof(cobjHead), true);
+
+ if (! CheckBytes (&cobjHead.fGUID, kINDDContigObjHeaderGUID, kInDesignGUIDSize)) {
+
+ // No Contiguous Object header. Could be in zero padding for the last page.
+
+ XMP_Uns8 fileTail [kINDD_PageSize];
+ size_t tailLen = inddLen - cobjPos;
+ bool endOK = (tailLen < kINDD_PageSize);
+
+ if (endOK) {
+ LFA_Seek ( file, cobjPos, SEEK_SET );
+ LFA_Read ( file, fileTail, sizeof(fileTail), true);
+ for (size_t i = 0; i < tailLen; ++i) {
+ if (fileTail[i] != 0) {
+ endOK = false;
+ break;
+ }
+ }
+ }
+
+ if (endOK) break;
+ tree->addComment(" ** No Contiguous Object GUID at offset %u (0x%X) tree.", cobjPos, cobjPos);
+ return;
+
+ }
+
+ cobjHead.fObjectUID = GetUns32LE (&cobjHead.fObjectUID);
+ cobjHead.fObjectClassID = GetUns32LE (&cobjHead.fObjectClassID);
+ cobjHead.fStreamLength = GetUns32LE (&cobjHead.fStreamLength);
+ cobjHead.fChecksum = GetUns32LE (&cobjHead.fChecksum);
+
+ cobjLen = cobjHead.fStreamLength + (2 * sizeof(InDesignContigObjMarker));
+
+ tree->addComment(" ContigObj offset %d (0x%X), size %d, Object UID %.8X, class ID %.8X, checksum %.8X",
+ cobjPos, cobjPos, cobjHead.fStreamLength, cobjHead.fObjectUID, cobjHead.fObjectClassID, cobjHead.fChecksum);
+
+ if ((cobjHead.fObjectClassID & 0x40000000) == 0) tree->addComment("read only");
+
+ XMP_Uns32 xmpLen;
+ LFA_Read ( file, &xmpLen, 4, true);
+ if (bigEndian) {
+ xmpLen = GetUns32BE (&xmpLen);
+ } else {
+ xmpLen = GetUns32LE (&xmpLen);
+ }
+
+ XMP_Uns8 xmpStart[16]; // Enough for "<?xpacket begin=".
+ LFA_Read ( file, &xmpStart, sizeof(xmpStart), true);
+
+ if ((cobjHead.fStreamLength > (4+16)) && ((xmpLen+4) == cobjHead.fStreamLength) &&
+ CheckBytes (xmpStart, "<?xpacket begin=", 16)) {
+
+ if (sXMPPtr != 0) {
+ tree->addComment("** redundant XMP **");
+ } else {
+ tree->addComment("XMP");
+ CaptureXMPF (file, (cobjPos + sizeof(InDesignContigObjMarker) + 4), xmpLen);
+ }
+
+ }
+
+ }
+
+ if (sXMPPtr != 0) DumpXMP ("InDesign XMP Contiguous Object");
+
+} // DumpInDesign
+
+// =================================================================================================
+
+#define kSWF_FileAttributesTag 69
+#define kSWF_MetadataTag 77
+
+static void
+DumpSWF ( LFA_FileRef file, XMP_Uns32 swfLen )
+{
+ // SWF is a chunky format, the chunks are called tags. The data of a tag cannot contain an
+ // offset to another tag, so tags can generally be freely inserted, removed, etc. Each tag has a
+ // header followed by data. There are short (2 byte) and long (6 byte) headers. A short header
+ // is a UInt16 with a type code in the upper 10 bits and data length in the lower 6 bits. The
+ // length does not include the header. A length of 63 (0x3F) indicates a long header. This adds
+ // an SInt32 data length.
+ //
+ // All multi-byte integers in SWF are little endian. Strings use byte storage and are null
+ // terminated. In SWF 5 or earlier strings use ASCII or shift-JIS encoding with no indication in
+ // the file. In SWF 6 or later strings use UTF-8.
+ //
+ // The overall structure of a SWF file:
+ // File header
+ // FileAttributes tag, optional before SWF 8
+ // other tags
+ // End tag
+ //
+ // The End tag is #0. No data is defined, but a reader should process the length normally. The
+ // last tag must be an End tag, but End tags can also be used elsewhere (e.g. to end a sprite
+ // definition). There is no standard tag for free or unused space.
+ //
+ // SWF file header:
+ // 0 3 - signature, "FWS"=uncompressed, 'CWS'=compressed (zlib, SWF6 or later)
+ // 3 1 - UInt8 major version
+ // 4 4 - UInt32 uncompressed file length
+ // 8 v - frame rectangle, variable size
+ // ? 2 - UInt16 frame rate
+ // ? 2 - UInt16 frame count
+ //
+ // FileAttributes tag, #69:
+ // 0 3 - reserved, must be 0
+ // 3 1 - HasMetadata, 0/1 Boolean
+ // 4 3 - reserved, must be 0
+ // 7 1 - UseNetwork, 0/1 Boolean
+ // 8 24 - reserved, must be 0
+ //
+ // The Metadata tag is #77. If present, the FileAttributes tag must also be present and
+ // HasMetadata must be set. The data is a string, must be XMP, should be as compact as possible.
+ //
+ // The frame rectangle is a packed sequence of 5 bit fields, with zero bits add as padding to a
+ // byte boundary. The first field is 5 bits long and gives the number of bits in each of the
+ // other 4 fields (0..31). The others are signed integers for the X min/max and Y min/max
+ // coordinates. The frame rectangle field is at least 2 bytes long, and at most 17 bytes long.
+
+ XMP_Uns8 buffer [100]; // Big enough, need 32 for file header and 38 for FileAttributes.
+ size_t ioCount;
+
+ // Dump the file header.
+
+ bool isCompressed = false;
+ bool hasMetadata = false;
+
+ XMP_Uns8 fileVersion;
+ XMP_Uns32 fullLength;
+ XMP_Uns8 rectBits;
+ XMP_Uns16 frameRate, frameCount;
+
+ ioCount = LFA_Read ( file, buffer, sizeof(buffer), true);
+ if ( ioCount < 14 ) {
+ tree->comment ( "** Invalid SWF, file header is too short." );
+ return;
+ }
+
+ if ( CheckBytes ( buffer, "CWS", 3 ) ) {
+ isCompressed = true;
+ } else if ( ! CheckBytes ( buffer, "FWS", 3 ) ) {
+ tree->comment ( "** Invalid SWF, unknown file header signature." );
+ return;
+ }
+
+ fileVersion = buffer[3];
+ fullLength = GetUns32LE ( &buffer[4] );
+ rectBits = buffer[8] >> 3;
+
+ XMP_Uns32 rectBytes = ((5 + 4*rectBits) + 7) >> 3;
+ XMP_Uns32 headerBytes = 8 + rectBytes + 4;
+
+ if ( ioCount < headerBytes ) {
+ tree->comment ( "** Invalid SWF, file header is too short." );
+ return;
+ }
+
+ frameRate = GetUns16LE ( &buffer[8+rectBytes] );
+ frameCount = GetUns16LE ( &buffer[8+rectBytes+2] );
+
+ // *** Someday decode the frame rectangle.
+
+ tree->comment ( "File Header: %scompressed, version %d, full length %d, frame rate %d, frame count %d",
+ (isCompressed ? "" : "un"), fileVersion, fullLength, frameRate, frameCount );
+
+ if ( isCompressed ) {
+ // *** Add support to decompress into a temp file.
+ tree->comment ( "** Ignoring compressed SWF contents." );
+ return;
+ }
+
+ // Dump the tags in the body of the file.
+
+ XMP_Uns16 tagType;
+ XMP_Uns32 tagOffset, tagLength, headerLength, dataLength;
+
+ for ( tagOffset = headerBytes; (tagOffset < swfLen); tagOffset += tagLength ) {
+
+ // Read the tag header, extract the type and data length.
+
+ LFA_Seek ( file, tagOffset, SEEK_SET );
+ ioCount = LFA_Read ( file, buffer, sizeof(buffer), true);
+ if ( ioCount < 2 ) {
+ tree->comment ( "** Invalid SWF, tag header is too short at offset %u (0x%X).", tagOffset, tagOffset );
+ break;
+ }
+
+ tagType = GetUns16LE ( &buffer[0] );
+ dataLength = tagType & 0x3F;
+ tagType = tagType >> 6;
+
+ if ( dataLength < 63 ) {
+ headerLength = 2;
+ } else {
+ if ( ioCount < 6 ) {
+ tree->comment ( "** Invalid SWF, tag header is too short at offset %u (0x%X).", tagOffset, tagOffset );
+ break;
+ }
+ headerLength = 6;
+ dataLength = GetUns32LE ( &buffer[2] );
+ }
+ tagLength = headerLength + dataLength;
+
+ // Make sure the tag fits in the file, being careful about arithmetic overflow.
+
+ if ( tagLength > (swfLen - tagOffset) ) {
+ tree->comment ( "** Invalid SWF, tag is too long at offset %u (0x%X).", tagOffset, tagOffset );
+ break;
+ }
+
+ // See if this is the FileAttributes tag or the Metadata tag.
+
+ if ( (tagOffset == headerBytes) && (tagType != kSWF_FileAttributesTag) && (fileVersion >= 8) ) {
+ tree->comment ( "** Invalid SWF, first tag is not FileAttributes." );
+ }
+
+ if ( tagType == kSWF_FileAttributesTag ) {
+
+ if ( dataLength < 32 ) {
+ tree->comment ( "** Invalid SWF, FileAttributes tag is too short at offset %u (0x%X).", tagOffset, tagOffset );
+ continue;
+ }
+
+ XMP_Uns8 xmpFlag = buffer[headerLength+3];
+ if ( xmpFlag != 0 ) {
+ hasMetadata = true;
+ if ( xmpFlag != 1 ) {
+ tree->comment ( "** Improper SWF, HasMetadata flag not 0/1 at tag offset %d (0x%X).", tagOffset, tagOffset );
+ }
+ }
+
+ tree->comment ( "FileAttributes tag @ %d (0x%X), %s XMP", tagOffset, tagOffset, (hasMetadata ? "has" : "no") );
+
+ } else if ( tagType == kSWF_MetadataTag ) {
+
+ if ( ! hasMetadata ) {
+ tree->comment ( "** Invalid SWF, Metadata tag without HasMetadata flag at offset %u (0x%X).", tagOffset, tagOffset );
+ continue;
+ }
+
+ tree->comment ( "Metadata tag @ %d (0x%X)", tagOffset, tagOffset );
+
+ if ( sXMPPtr != 0 ) {
+ tree->comment ( " ** Redundant Metadata tag" );
+ } else {
+ CaptureXMPF ( file, (tagOffset + headerLength), dataLength );
+ }
+
+ } else {
+
+ // Only for deep debugging:
+ // tree->comment ( "Unspecified tag #%d @ %d (0x%X)", tagType, tagOffset, tagOffset );
+
+ }
+
+ }
+
+ if ( sXMPPtr != 0 ) DumpXMP ( "SWF Metadata tag (#77) XMP" );
+
+} // DumpSWF
+
+// =================================================================================================
+
+static XMP_Uns32 DumpScriptDataArray ( LFA_FileRef file, XMP_Uns32 sdOffset, XMP_Uns32 count,
+ bool isStrict, bool isOnXMP = false );
+static XMP_Uns32 DumpScriptDataObject ( LFA_FileRef file, XMP_Uns32 sdOffset );
+static XMP_Uns32 DumpScriptDataObjectList ( LFA_FileRef file, XMP_Uns32 sdOffset );
+
+static inline XMP_Uns32 GetUns24BE ( XMP_Uns8 * ptr )
+{
+ return (GetUns32BE(ptr) >> 8);
+}
+
+#define ReadSDValue(len) \
+ ioCount = LFA_Read ( file, buffer, len,true); \
+ if ( ioCount != len ) { \
+ tree->comment ( "** Failure reading ScriptDataValue, ioCount = %d", ioCount ); \
+ return (sdOffset + 1 + ioCount); \
+ }
+
+
+static XMP_Uns32 DumpScriptDataValue ( LFA_FileRef file, XMP_Uns32 sdOffset, bool isOnXMP = false )
+{
+ XMP_Uns8 buffer [64*1024];
+ size_t ioCount;
+
+ XMP_Uns8 kind;
+ XMP_Uns16 u16;
+ XMP_Uns32 u32;
+ XMP_Uns64 u64;
+
+ LFA_Seek ( file, sdOffset, SEEK_SET );
+ ioCount = LFA_Read ( file, &kind, 1, true);
+ if ( ioCount != 1 ) {
+ tree->comment ( "** Failure reading ScriptDataValue kind, ioCount = %d", ioCount );
+ return sdOffset;
+ }
+
+ if ( isOnXMP ) {
+ if ( (kind != 8) && (kind != 2) && (kind != 0xC) ) {
+ tree->comment ( "** Invalid kind for onXMPData tag **" );
+ }
+ }
+
+ XMP_Uns64 time;
+ XMP_Int16 tz;
+
+ switch ( kind ) {
+
+ case 0x00: // A number, IEEE double.
+ ReadSDValue ( 8 );
+ u64 = GetUns64BE ( &buffer[0] );
+ tree->addComment ( "float = %f", *((double*)(&u64)) );
+ return (sdOffset + 1 + 8);
+
+ case 0x01: // A 0/1 Boolean. (??? general Uns8?)
+ ReadSDValue ( 1 );
+ tree->addComment ( "bool = %d", buffer[0] );
+ return (sdOffset + 1 + 1);
+
+ case 0x02: // A short UTF-8 string, leading 2 byte count.
+ ReadSDValue ( 2 );
+ u16 = GetUns16BE ( &buffer[0] );
+ ReadSDValue ( u16 );
+ tree->addComment ( "string (%d) = \"%.*s\"", u16, u16, buffer );
+ if ( buffer[u16-1] != 0 ) tree->addComment ( "value lacks trailing nul" );
+ if ( isOnXMP ) CaptureXMPF ( file, (sdOffset+1+2), u16 );
+ return (sdOffset + 1 + 2 + u16);
+
+ case 0x03: // An object list, triples of 0x02/key/value, ends at 0x02000009.
+ tree->addComment ( "object list" );
+ return DumpScriptDataObjectList ( file, sdOffset+1 );
+
+ case 0x04: // A movie clip path as short UTF-8 string
+ ReadSDValue ( 2 );
+ u16 = GetUns16BE ( &buffer[0] );
+ ReadSDValue ( u16 );
+ tree->addComment ( "movie (%d) = \"%.*s\"", u16, u16, buffer );
+ if ( buffer[u16-1] != 0 ) tree->addComment ( "value lacks trailing nul" );
+ return (sdOffset + 1 + 2 + u16);
+
+ case 0x05: // A null, single byte.
+ tree->addComment ( "null" );
+ return (sdOffset + 1);
+
+ case 0x06: // A undefined, single byte.
+ tree->addComment ( "undefined" );
+ return (sdOffset + 1);
+
+ case 0x07: // A reference, Uns16.
+ ReadSDValue ( 2 );
+ u16 = GetUns16BE ( &buffer[0] );
+ tree->addComment ( "reference = %d", u16 );
+ return (sdOffset + 1 + 2);
+
+ case 0x08: // An ECMA array, 32-bit count then any number of key/value pairs. Has 0x000009 terminator.
+ ReadSDValue ( 4 );
+ u32 = GetUns32BE ( &buffer[0] );
+ tree->addComment ( "ECMA array [%d]", u32 );
+ return DumpScriptDataArray ( file, sdOffset+1+4, u32, false, isOnXMP );
+
+ case 0x09: // End of object or array. Should not see this here!
+ tree->addComment ( "** end **" );
+ return (sdOffset + 1);
+
+ case 0x0A: // A strict array, count then that many key/value pairs, no 0x000009 terminator.
+ ReadSDValue ( 4 );
+ u32 = GetUns32BE ( &buffer[0] );
+ tree->addComment ( "strict array [%d]", u32 );
+ return DumpScriptDataArray ( file, sdOffset+1+4, u32, true );
+
+ case 0x0B: // A date, Uns64 milliseconds since Jan 1 1970, Int16 TZ offset in minutes.
+ ReadSDValue ( 10 );
+ time = GetUns64BE ( &buffer[0] );
+ tz = (XMP_Int16) GetUns16BE ( &buffer[8] );
+ tree->addComment ( "date, time=%ULL, tz=%d", time, tz );
+ return (sdOffset + 1 + 10);
+
+ case 0x0C: // A long UTF-8 string, leading 4 byte count.
+ ReadSDValue ( 4 );
+ u32 = GetUns32BE ( &buffer[0] );
+ if ( u32 < sizeof(buffer) ) {
+ ReadSDValue ( u32 );
+ tree->addComment ( "long string (%d) = \"%.*s\"", u32, u32, buffer );
+ if ( buffer[u32-1] != 0 ) tree->addComment ( "value lacks trailing nul" );
+ } else {
+ ReadSDValue ( sizeof(buffer) );
+ tree->addComment ( "long string (%d) = \"%.*s\"", u32, sizeof(buffer), buffer );
+ tree->comment ( "** truncated long string output **" );
+ }
+ if ( isOnXMP ) CaptureXMPF ( file, (sdOffset+1+4), u32 );
+ return (sdOffset + 1 + 4 + u32);
+
+ case 0x0D: // Unsupported, single byte.
+ tree->addComment ( "unsupported" );
+ return (sdOffset + 1);
+
+ case 0x0E: // A RecordSet. (???)
+ tree->addComment ( "** record set ?? **" );
+ return (sdOffset + 1);
+
+ case 0x0F: // XML as a long UTF-8 string
+ ReadSDValue ( 4 );
+ u32 = GetUns32BE ( &buffer[0] );
+ if ( u32 < sizeof(buffer) ) {
+ ReadSDValue ( u32 );
+ tree->addComment ( "XML (%d) = \"%.*s\"", u32, u32, buffer );
+ if ( buffer[u32-1] != 0 ) tree->addComment ( "value lacks trailing nul" );
+ } else {
+ ReadSDValue ( sizeof(buffer) );
+ tree->addComment ( "XML (%d) = \"%.*s\"", u32, sizeof(buffer), buffer );
+ tree->comment ( "** truncated long string output **" );
+ }
+ if ( isOnXMP ) CaptureXMPF ( file, (sdOffset+1+4), u32 );
+ return (sdOffset + 1 + 4 + u32);
+
+ case 0x10: // A typed object list, short string class name, object list (like case 0x03).
+ ReadSDValue ( 2 );
+ u16 = GetUns16BE ( &buffer[0] );
+ ReadSDValue ( u16 );
+ tree->addComment ( "class, name = %.*s", u16, u16, buffer );
+ if ( buffer[u16-1] == 0 ) tree->addComment ( "name has trailing nul" );
+ return DumpScriptDataObjectList ( file, (sdOffset + 1 + 2 + u16) );
+
+ case 0x11: // AMF 3 data. (???)
+ tree->addComment ( "** AMF 3 data ?? **" );
+ return (sdOffset + 1);
+
+ default:
+ tree->addComment ( "** unknown kind = %d **", kind );
+ return (sdOffset + 1);
+
+ }
+
+} // DumpScriptDataValue
+
+// =================================================================================================
+
+static XMP_Uns32 DumpScriptVariable ( LFA_FileRef file, XMP_Uns32 sdOffset, bool isOnXMP = false )
+{
+ XMP_Uns8 buffer [64*1024];
+ size_t ioCount;
+
+ LFA_Seek ( file, sdOffset, SEEK_SET );
+ ioCount = LFA_Read ( file, buffer, 2, true );
+ if ( ioCount != 2 ) {
+ tree->comment ( "** Failure reading DumpScriptVariable start, ioCount = %d", ioCount );
+ return (sdOffset + ioCount);
+ }
+
+ XMP_Uns16 nameLen = GetUns16BE ( &buffer[0] );
+ ioCount = LFA_Read ( file, buffer, nameLen, true );
+ if ( ioCount != nameLen ) {
+ tree->comment ( "** Failure reading ScriptDataObject name, ioCount = %d", ioCount );
+ return (sdOffset + 3 + ioCount);
+ }
+
+ tree->pushNode ( "%.*s @ 0x%X", nameLen, buffer, sdOffset );
+ if ( buffer[nameLen-1] == 0 ) tree->addComment ( "name has trailing nul" );
+ if ( strncmp ( (char*)buffer, "liveXML", nameLen ) != 0 ) isOnXMP = false; // ! Else keep the input value.
+ XMP_Uns32 nextOffset = DumpScriptDataValue ( file, (sdOffset+2+nameLen), isOnXMP );
+ tree->popNode();
+
+ return nextOffset;
+
+} // DumpScriptVariable
+
+// =================================================================================================
+
+static XMP_Uns32 DumpScriptDataArray ( LFA_FileRef file, XMP_Uns32 sdOffset, XMP_Uns32 headerCount,
+ bool isStrict, bool isOnXMP /* = false */ )
+{
+ XMP_Uns8 buffer [3];
+ size_t ioCount;
+
+ XMP_Uns32 actualCount = 0;
+ XMP_Uns32 currOffset = sdOffset;
+
+ if ( isStrict ) {
+
+ for ( ; headerCount > 0; --headerCount ) {
+ XMP_Uns32 nextOffset = DumpScriptVariable ( file, currOffset );
+ if ( nextOffset == currOffset ) {
+ tree->comment ( "** Failure reading DumpScriptDataArray, no progress" );
+ return currOffset;
+ }
+ currOffset = nextOffset;
+ }
+
+ } else {
+
+ while ( true ) {
+
+ LFA_Seek ( file, currOffset, SEEK_SET );
+ ioCount = LFA_Read ( file, buffer, 3, true );
+ if ( ioCount != 3 ) {
+ tree->comment ( "** Failure check DumpScriptDataArray, ioCount = %d", ioCount );
+ return (currOffset + ioCount);
+ }
+ if ( GetUns24BE ( &buffer[0] ) == 9 ) break;
+
+ XMP_Uns32 nextOffset = DumpScriptVariable ( file, currOffset, isOnXMP );
+ if ( nextOffset == currOffset ) {
+ tree->comment ( "** Failure reading DumpScriptDataArray, no progress" );
+ return currOffset;
+ }
+
+ ++actualCount;
+ currOffset = nextOffset;
+
+ }
+
+ if ( (headerCount != (XMP_Uns32)(-1)) && (headerCount != actualCount) ) {
+ tree->comment ( "Count mismatch, actual = %d", actualCount ); // ! Not an error!
+ }
+
+ currOffset += 3; // ! Include the 0x000009 terminator.
+
+ }
+
+ return currOffset;
+
+} // DumpScriptDataArray
+
+// =================================================================================================
+
+static XMP_Uns32 DumpScriptDataObject ( LFA_FileRef file, XMP_Uns32 sdOffset )
+{
+ XMP_Uns8 buffer [64*1024];
+ size_t ioCount;
+
+ LFA_Seek ( file, sdOffset, SEEK_SET );
+ ioCount = LFA_Read ( file, buffer, 2,true);
+ if ( ioCount != 2 ) {
+ tree->comment ( "** Failure reading ScriptDataObject name length, ioCount = %d", ioCount );
+ return (sdOffset + ioCount);
+ }
+
+ XMP_Uns16 nameLen = GetUns16BE ( &buffer[1] );
+ ioCount = LFA_Read ( file, buffer, nameLen, true);
+ if ( ioCount != nameLen ) {
+ tree->comment ( "** Failure reading ScriptDataObject name, ioCount = %d", ioCount );
+ return (sdOffset + 2 + ioCount);
+ }
+
+ tree->pushNode ( "%.*s @ 0x%X", nameLen, buffer, sdOffset );
+ if ( buffer[nameLen-1] == 0 ) tree->addComment ( "name has trailing nul" );
+ XMP_Uns32 nextOffset = DumpScriptDataValue ( file, (sdOffset+2+nameLen) );
+ tree->popNode();
+
+ return nextOffset;
+
+} // DumpScriptDataObject
+
+// =================================================================================================
+
+static XMP_Uns32 DumpScriptDataObjectList ( LFA_FileRef file, XMP_Uns32 sdOffset )
+{
+ XMP_Uns8 buffer [3];
+ size_t ioCount;
+
+ XMP_Uns32 currOffset = sdOffset;
+
+ while ( true ) {
+
+ LFA_Seek ( file, currOffset, SEEK_SET );
+ ioCount = LFA_Read ( file, buffer, 3, true);
+ if ( ioCount != 3 ) {
+ tree->comment ( "** Failure check ScriptDataObjectList, ioCount = %d", ioCount );
+ return (currOffset + ioCount);
+ }
+
+ XMP_Uns32 endFlag = GetUns24BE ( &buffer[0] );
+ if ( endFlag == 9 ) return (currOffset + 3);
+
+ XMP_Uns32 nextOffset = DumpScriptDataObject ( file, currOffset );
+ if ( nextOffset == currOffset ) {
+ tree->comment ( "** Failure reading ScriptDataObjectList, no progress" );
+ return currOffset;
+ }
+
+ currOffset = nextOffset;
+
+ }
+
+} // DumpScriptDataObjectList
+
+// =================================================================================================
+
+static XMP_Uns32 DumpScriptDataTagContent ( LFA_FileRef file, XMP_Uns32 sdOffset, XMP_Uns32 tagTime )
+{
+ XMP_Uns8 buffer [64*1024];
+ size_t ioCount;
+
+ LFA_Seek ( file, sdOffset, SEEK_SET );
+ ioCount = LFA_Read ( file, buffer, 3, true );
+ if ( (ioCount != 3) || (buffer[0] != 2) ) {
+ tree->comment ( "** Failure reading ScriptDataObject start, ioCount = %d, buffer[0]=0x%X", ioCount, buffer[0] );
+ return (sdOffset + ioCount);
+ }
+
+ XMP_Uns16 nameLen = GetUns16BE ( &buffer[1] );
+ ioCount = LFA_Read ( file, buffer, nameLen, true );
+ if ( ioCount != nameLen ) {
+ tree->comment ( "** Failure reading ScriptDataObject name, ioCount = %d", ioCount );
+ return (sdOffset + 3 + ioCount);
+ }
+
+ tree->addComment ( "%.*s @ 0x%X", nameLen, buffer, sdOffset );
+ if ( buffer[nameLen-1] == 0 ) tree->addComment ( "name has trailing nul" );
+
+ bool isOnXMP = (tagTime == 0) && (nameLen == 9) && (strncmp ( (char*)buffer, "onXMPData", 9 ) == 0);
+ return DumpScriptDataValue ( file, (sdOffset+1+2+nameLen), isOnXMP );
+
+} // DumpScriptDataTagContent
+
+// =================================================================================================
+
+static void
+DumpFLV ( LFA_FileRef file, XMP_Uns32 flvLen )
+{
+ // FLV must not be confused with SWF, they are quite different internally. FLV is a chunky
+ // format, the chunks are called tags. All multi-byte integers in FLV are stored in big endian
+ // order. An FLV file begins with a variable length file header followed by a sequence of tags
+ // (the file body).
+ //
+ // Each tag contains a header, content, and back-pointer. The size in a tag header is just the
+ // data size. The back-pointer is the full size of the preceeding tag, not just the data length.
+ // The first tag is preceeded by a 0 back-pointer (not by the length of the header). The last
+ // tagk is followed by a back pointer.
+ //
+ // The FLV file header:
+ // 0 3 - signature, "FLV"
+ // 3 1 - UInt8 major version
+ // 4 1 - UInt8 flags
+ // 5 4 - UInt32 size of header (offset to body)
+ //
+ // The FLV tag header:
+ // 0 1 - UInt8 tag type
+ // 1 3 - UInt24 length of data
+ // 4 3 - UInt24 timestamp, milliseconds into the playback
+ // 7 1 - UInt8 timestamp high, for a full UInt32 playback time
+ // 8 3 - UInt24 stream ID, must be 0
+ //
+ // Only 3 tag types are defined by SWF-FLV-8, 8 = audio, 9 = video, 18 = script data. There is
+ // confusion or missing information in the spec about script data tags. In one place it uses the
+ // term "script data", in another SCRIPTDATAOBJECT for type 18. Then within the "Data Tags"
+ // section it talks about SCRIPTDATAOBJECT, SCRIPTDATAOBJECTEND, SCRIPTDATASTRING,
+ // SCRIPTDATALONGSTRING, SCRIPTDATAVALUE, SCRIPTDATAVARIABLE, SCRIPTDATAVARIABLEEND, and
+ // SCRIPTDATADATE. It isn't clear if these SCRIPTDATA* things are FLV tags, or substructure
+ // within the data of tag type 18.
+
+ XMP_Uns8 buffer [100];
+ size_t ioCount;
+ XMP_Uns32 size, time, stream, backSize;
+
+ ioCount = LFA_Read ( file, buffer, 9+4, true);
+ if ( ioCount != 9+4 ) {
+ tree->comment ( "** Failure reading FLV header, ioCount = %d", ioCount );
+ return;
+ }
+
+ size = GetUns32BE ( &buffer[5] );
+ tree->addComment ( "FLV header: \"%.3s\", version %d, flags 0x%.2X, size %d (0x%X)",
+ &buffer[0], buffer[3], buffer[4], size );
+
+ LFA_Seek ( file, size, SEEK_SET );
+ ioCount = LFA_Read ( file, buffer, 4, true);
+ if ( ioCount != 4 ) {
+ tree->comment ( "** Failure reading leading backSize, ioCount = %d", ioCount );
+ return;
+ }
+ backSize = GetUns32BE ( &buffer[0] );
+ if ( backSize != 0 ) {
+ tree->comment ( "** Bad leading backSize = %d", backSize );
+ return;
+ }
+
+ for ( XMP_Uns32 tagOffset = (size+4); tagOffset < flvLen; tagOffset += (11+size+4) ) {
+
+ LFA_Seek ( file, tagOffset, SEEK_SET );
+ ioCount = LFA_Read ( file, buffer, 11, true); // Back pointer plus tag header.
+ if ( ioCount != 11 ) {
+ tree->comment ( "** Failure reading FLV tag, ioCount = %d", ioCount );
+ return;
+ }
+
+ size = GetUns24BE ( &buffer[1] );
+ time = GetUns24BE ( &buffer[4] );
+ time += ((XMP_Uns32)buffer[7] << 24);
+ stream = GetUns24BE ( &buffer[8] );
+
+ if ( time != 0 ) break; // ! Just do the time 0 tags for this tool.
+
+ char label [100];
+ char comment [1000];
+
+ XMP_Uns8 kind = buffer[0];
+ if ( kind == 8 ) {
+ if ( time == 0 ) sprintf ( label, "Audio" ); // Don't normally print, there are too many.
+ } else if ( kind == 9 ) {
+ if ( time == 0 ) sprintf ( label, "Video" ); // Don't normally print, there are too many.
+ } else if ( kind == 18 ) {
+ sprintf ( label, "ScriptData" );
+ } else {
+ sprintf ( label, "<other-%d>", kind );
+ }
+ sprintf ( comment, "%s @ 0x%X, size=%d, time=%d, stream=%d", label, tagOffset, size, time, stream );
+
+ tree->pushNode ( comment );
+
+ LFA_Seek ( file, (tagOffset+11+size), SEEK_SET );
+ ioCount = LFA_Read ( file, buffer, 4, true ); // Back pointer plus tag header.
+ if ( ioCount != 4 ) {
+ tree->comment ( "** Failure reading backSize, ioCount = %d", ioCount );
+ return;
+ }
+
+ backSize = GetUns32BE ( &buffer[0] );
+ if ( backSize != (11+size) ) tree->comment ( "** Bad backSize= %d", backSize );
+
+ if ( kind == 18 ) {
+ XMP_Uns32 endOffset = DumpScriptDataTagContent ( file, (tagOffset+11), time );
+ if ( endOffset != (tagOffset+11+size) ) {
+ tree->comment ( "** Bad endOffset = 0x%X", endOffset );
+ }
+ }
+
+ tree->popNode();
+
+ }
+
+ if ( sXMPPtr != 0 ) DumpXMP ( "FLV onXMPData tag" );
+
+} // DumpFLV
+
+// =================================================================================================
+
+static bool
+PrintID3Encoding ( XMP_Uns8 encoding, XMP_Uns8 * strPtr )
+{
+ bool bigEndian = true;
+
+ tree->addComment ( "encoding %d", encoding );
+
+ switch ( encoding ) {
+ case 0 :
+ tree->addComment ( " (ISO Latin-1)" );
+ break;
+ case 1 :
+ if ( *strPtr == 0xFF ) bigEndian = false;
+ tree->addComment ( " (UTF-16 with BOM, %s endian)", (bigEndian ? "big" : "little") );
+ break;
+ case 2 :
+ tree->addComment ( " (UTF-16 big endian)" );
+ break;
+ case 3 :
+ tree->addComment ( " (UTF-8)" );
+ break;
+ default :
+ tree->addComment ( " (** unknown **)" );
+ break;
+ }
+
+ return bigEndian;
+
+} // PrintID3Encoding
+
+// =================================================================================================
+
+//static void
+//PrintID3EncodedText (XMP_Uns8 encoding, void * _strPtr, const char * label)
+//{
+//} // PrintID3EncodedText
+
+// =================================================================================================
+
+struct ID3_Header {
+ char id3[3];
+ XMP_Uns8 vMajor, vMinor, flags;
+ XMP_Uns8 size[4];
+};
+
+struct ID3_FrameHeader {
+ char id[4];
+ XMP_Uns32 size;
+ XMP_Uns16 flags;
+};
+
+#define _U32b(ptr,n) ((XMP_Uns32) (((XMP_Uns8*)(ptr))[n]))
+#define GetSyncSafe32(ptr) ((_U32b(ptr,0) << 21) | (_U32b(ptr,1) << 14) | (_U32b(ptr,2) << 7) | _U32b(ptr,3))
+
+#define GetID3Size(ver,ptr) ((ver == 3) ? GetUns32BE(ptr) : GetSyncSafe32(ptr))
+
+static void
+DumpMP3 (LFA_FileRef file, XMP_Uns32 /*mp3Len*/)
+{
+ // ** We're ignoring the effects of the unsync flag, and not checking the CRC (if present).
+
+ assert (sizeof(ID3_Header) == 10);
+ assert (sizeof(ID3_FrameHeader) == 10);
+
+ // Dump the basic ID3 header.
+
+ ID3_Header id3Head;
+
+ LFA_Seek (file, 0, SEEK_SET);
+ LFA_Read ( file, &id3Head, sizeof(id3Head), true);
+
+ if (! CheckBytes (id3Head.id3, "ID3", 3)) {
+ tree->addComment(" No ID3v2 section");
+ return;
+ }
+
+ XMP_Uns32 id3Len = GetSyncSafe32 (id3Head.size);
+ XMP_Uns32 framePos = sizeof(id3Head); // The offset of the next (first) ID3 frame.
+ XMP_Uns32 frameEnd = framePos + id3Len;
+
+ tree->addComment(" ID3v2.%d.%d, size %d, flags 0x%.2X",
+ id3Head.vMajor, id3Head.vMinor, id3Len, id3Head.flags);
+ if (id3Head.flags != 0) {
+ tree->addComment("%s%s%s%s",
+ ((id3Head.flags & 0x80) ? ", unsync" : ""),
+ ((id3Head.flags & 0x40) ? ", extended header" : ""),
+ ((id3Head.flags & 0x20) ? ", experimental" : ""),
+ ((id3Head.flags & 0x10) ? ", has footer" : ""));
+ }
+
+
+ if ((id3Head.vMajor != 3) && (id3Head.vMajor != 4)) {
+ tree->addComment(" ** Unrecognized major version tree.");
+ return;
+ }
+
+ bool hasExtHeader = ((id3Head.flags & 0x40) != 0);
+
+ // Dump the extended header if present.
+
+ if (hasExtHeader) {
+
+ XMP_Uns32 extHeaderLen;
+ LFA_Read ( file, &extHeaderLen, 4, true );
+ extHeaderLen = GetID3Size (id3Head.vMajor, &extHeaderLen);
+
+ framePos += (4 + extHeaderLen);
+
+ if (id3Head.vMajor == 3) {
+
+ XMP_Uns16 extHeaderFlags;
+ LFA_Read ( file, &extHeaderFlags, 2, true );
+ extHeaderFlags = GetUns16BE (&extHeaderFlags);
+
+ XMP_Uns32 padLen;
+ LFA_Read ( file, &padLen, 4, true );
+ padLen = GetUns32BE (&padLen);
+
+ frameEnd -= padLen;
+
+ tree->addComment(" Extended header size %d, flags 0x%.4X, pad size %d",
+ extHeaderLen, extHeaderFlags, padLen);
+
+ if (extHeaderFlags & 0x8000) {
+ XMP_Uns32 crc;
+ LFA_Read ( file, &crc, 4, true );
+ crc = GetUns32BE (&crc);
+ tree->addComment("CRC 0x%.8X", crc);
+ }
+
+ } else if (id3Head.vMajor == 4) {
+
+ XMP_Uns8 flagCount;
+ LFA_Read ( file, &flagCount, 1, true );
+
+ tree->addComment(" Extended header size %d, flag count %d", extHeaderLen, flagCount);
+
+ for (size_t i = 0; i < flagCount; ++i) {
+ XMP_Uns8 flag;
+ LFA_Read ( file, &flag, 1, true );
+ tree->addComment("0x%.2X", flag);
+ }
+
+ }
+
+ }
+
+ // Dump the ID3 frames.
+
+ while (framePos < frameEnd) {
+
+ if ((frameEnd - framePos) < 10) break; // Assume into ID3v2.4 padding.
+
+ ID3_FrameHeader frameHead;
+ LFA_Seek (file, framePos, SEEK_SET);
+ LFA_Read ( file, &frameHead, sizeof(frameHead), true);
+
+ if (CheckBytes (frameHead.id, "\x0\x0\x0\x0", 4)) break; // Assume into ID3v2.4 padding.
+
+ frameHead.size = GetID3Size (id3Head.vMajor, &frameHead.size);
+ frameHead.flags = GetUns16BE (&frameHead.flags);
+
+ tree->addComment(" '%.4s', offset %d (0x%X), size %d, flags 0x%.2X",
+ frameHead.id, framePos, framePos, frameHead.size, frameHead.flags);
+
+ if (frameHead.id[0] == 'T') {
+
+ CaptureFileData (file, 0, frameHead.size);
+ XMP_Uns8 encoding = sDataPtr[0];
+
+ bool bigEndian = PrintID3Encoding (encoding, (sDataPtr + 1));
+
+ if ((encoding == 0) || (encoding == 3)) {
+ PrintOnlyASCII_8 ((sDataPtr + 1), (frameHead.size - 1), " ");
+ } else if ((encoding == 1) || (encoding == 2)) {
+ XMP_Uns16 * valuePtr = (XMP_Uns16*) (sDataPtr + 1);
+ if (bigEndian) {
+ PrintOnlyASCII_16BE (valuePtr, (frameHead.size - 1), " ");
+ } else {
+ PrintOnlyASCII_16LE (valuePtr, (frameHead.size - 1), " ");
+ }
+ }
+
+ } else if (CheckBytes (frameHead.id, "PRIV", 4) && (frameHead.size >= 4)) {
+
+ CaptureFileData (file, 0, frameHead.size);
+ PrintOnlyASCII_8 (sDataPtr, strlen((char*)sDataPtr), ",");
+ if (CheckBytes (sDataPtr, "XMP\x0", 4)) {
+ CaptureXMPF (file, (framePos + 10 + 4), (frameHead.size - 4));
+ }
+
+ } else if (CheckBytes (frameHead.id, "COMM", 4)) {
+
+ CaptureFileData (file, 0, frameHead.size);
+ XMP_Uns8 * frameEnd = sDataPtr + frameHead.size;
+
+ XMP_Uns8 encoding = sDataPtr[0];
+ char * lang = (char*) (sDataPtr + 1);
+
+ tree->addComment("lang '%.3s'", lang);
+ bool bigEndian = PrintID3Encoding (encoding, (sDataPtr + 4));
+
+ if ((encoding == 0) || (encoding == 3)) {
+
+ XMP_Uns8 * descrPtr = sDataPtr + 4;
+ XMP_Uns8 * valuePtr = descrPtr;
+ while (*valuePtr != 0) ++valuePtr;
+ ++valuePtr;
+
+ PrintOnlyASCII_8 (descrPtr, (valuePtr - descrPtr - 1), " ");
+ PrintOnlyASCII_8 (valuePtr, (frameEnd - valuePtr), " ");
+
+ } else if ((encoding == 1) || (encoding == 2)) {
+
+ XMP_Uns16 * descrPtr = (XMP_Uns16*) (sDataPtr + 4);
+ XMP_Uns16 * valuePtr = descrPtr;
+ while (*valuePtr != 0) ++valuePtr;
+ ++valuePtr;
+
+ size_t descrBytes = 2 * (valuePtr - descrPtr - 1);
+ size_t valueBytes = 2 * ((XMP_Uns16*)frameEnd - valuePtr);
+
+ if (bigEndian) {
+ PrintOnlyASCII_16BE (descrPtr, descrBytes, " ");
+ PrintOnlyASCII_16BE (valuePtr, valueBytes, " ");
+ } else {
+ PrintOnlyASCII_16LE (descrPtr, descrBytes, " ");
+ PrintOnlyASCII_16LE (valuePtr, valueBytes, " ");
+ }
+
+ }
+
+ }
+
+ framePos += (sizeof(ID3_FrameHeader) + frameHead.size);
+
+ }
+
+ if (framePos < frameEnd) {
+ tree->addComment(" Padding assumed, offset %d (0x%X), size %d",
+ framePos, framePos, (frameEnd - framePos));
+ }
+
+ if (sXMPPtr != 0) DumpXMP ("ID3 'PRIV' \"XMP\" frame");
+
+
+} // DumpMP3
+
+// =================================================================================================
+
+static void
+PacketScan (LFA_FileRef file, XMP_Int64 fileLen)
+{
+ try {
+
+ QEScanner scanner (fileLen);
+ LFA_Seek (file, 0, SEEK_SET);
+
+ XMP_Uns8 buffer [64*1024];
+ XMP_Uns32 filePos, readLen;
+
+ for (filePos = 0; filePos < fileLen; filePos += readLen) {
+ readLen = LFA_Read ( file, buffer, sizeof(buffer), false );
+ if (readLen == 0) throw std::logic_error ("Empty read");
+ scanner.Scan (buffer, filePos, readLen);
+ }
+
+ size_t snipCount = scanner.GetSnipCount();
+ QEScanner::SnipInfoVector snips (snipCount);
+ scanner.Report (snips);
+
+ size_t packetCount = 0;
+
+ for (size_t s = 0; s < snipCount; ++s) {
+ if (snips[s].fState == QEScanner::eValidPacketSnip) {
+ ++packetCount;
+ CaptureXMPF (file, (XMP_Uns32)snips[s].fOffset, (XMP_Uns32)snips[s].fLength);
+ DumpXMP ("packet scan");
+ }
+ }
+
+ if (packetCount == 0) tree->addComment(" No packets found");
+
+ } catch (...) {
+
+ tree->addComment("** Scanner failure tree.");
+
+ }
+
+} // PacketScan
+
+// =================================================================================================
+// External Routines
+
+namespace DumpFile_NS {
+ // ! Xcode compiler warns about normal offsetof macro.
+#define SafeOffsetOf(type,field) ((size_t)(&(((type*)1000)->field)) - 1000)
+
+ //assure that packing is 100% tight
+ //see above:
+ // - #pragma pack (1)
+ // - SafeOffsetOf macro definition
+ //
+ // calling this at least once is an extremly good idea,
+ // because among other reasons, the #pragma pack directive
+ // is not ANSI-C thus things could go wrong on one platform or another...
+ //
+ // returns nothing, but asserts will be triggered if something is wrong.
+ static bool selfTestDone=false;
+ void selfTest() {
+ //only very first call at each runtime runs the selfTest (mostly verify about structPacking etc...)
+ if (DumpFile_NS::selfTestDone) return;
+
+ assert (sizeof (ASF_GUID) == 16);
+ assert (SafeOffsetOf (ASF_GUID, part1) == 0);
+
+ assert (SafeOffsetOf (ASF_GUID, part2) == 4);
+ assert (SafeOffsetOf (ASF_GUID, part3) == 6);
+ assert (SafeOffsetOf (ASF_GUID, part4) == 8);
+ assert (SafeOffsetOf (ASF_GUID, part5) == 10);
+
+ assert (sizeof (ASF_ObjHeader) == (16 + 8));
+ assert (SafeOffsetOf (ASF_ObjHeader, guid) == 0);
+ assert (SafeOffsetOf (ASF_ObjHeader, size) == 16);
+
+ assert (sizeof (ASF_FileProperties) == kASF_FilePropertiesSize);
+ assert (SafeOffsetOf (ASF_FileProperties, guid) == 0);
+ assert (SafeOffsetOf (ASF_FileProperties, size) == 16);
+ assert (SafeOffsetOf (ASF_FileProperties, fileID) == 24);
+ assert (SafeOffsetOf (ASF_FileProperties, fileSize) == 40);
+ assert (SafeOffsetOf (ASF_FileProperties, creationDate) == 48);
+ assert (SafeOffsetOf (ASF_FileProperties, dataPacketsCount) == 56);
+ assert (SafeOffsetOf (ASF_FileProperties, playDuration) == 64);
+ assert (SafeOffsetOf (ASF_FileProperties, sendDuration) == 72);
+ assert (SafeOffsetOf (ASF_FileProperties, preroll) == 80);
+ assert (SafeOffsetOf (ASF_FileProperties, flags) == 88);
+ assert (SafeOffsetOf (ASF_FileProperties, minDataPacketSize) == 92);
+ assert (SafeOffsetOf (ASF_FileProperties, maxDataPacketSize) == 96);
+ assert (SafeOffsetOf (ASF_FileProperties, maxBitrate) == 100);
+
+ assert (sizeof (ASF_ContentDescription) == kASF_ContentDescriptionSize);
+ assert (SafeOffsetOf (ASF_ContentDescription, guid) == 0);
+ assert (SafeOffsetOf (ASF_ContentDescription, size) == 16);
+ assert (SafeOffsetOf (ASF_ContentDescription, titleLen) == 24);
+ assert (SafeOffsetOf (ASF_ContentDescription, authorLen) == 26);
+ assert (SafeOffsetOf (ASF_ContentDescription, copyrightLen) == 28);
+ assert (SafeOffsetOf (ASF_ContentDescription, descriptionLen) == 30);
+ assert (SafeOffsetOf (ASF_ContentDescription, ratingLen) == 32);
+
+ assert (sizeof (InDesignMasterPage) == kINDD_PageSize);
+ assert (SafeOffsetOf (InDesignMasterPage, fGUID) == 0);
+ assert (SafeOffsetOf (InDesignMasterPage, fMagicBytes) == 16);
+ assert (SafeOffsetOf (InDesignMasterPage, fObjectStreamEndian) == 24);
+ assert (SafeOffsetOf (InDesignMasterPage, fIrrelevant1) == 25);
+ assert (SafeOffsetOf (InDesignMasterPage, fSequenceNumber) == 264);
+ assert (SafeOffsetOf (InDesignMasterPage, fIrrelevant2) == 272);
+ assert (SafeOffsetOf (InDesignMasterPage, fFilePages) == 280);
+ assert (SafeOffsetOf (InDesignMasterPage, fIrrelevant3) == 284);
+
+ assert (sizeof (InDesignContigObjMarker) == 32);
+ assert (SafeOffsetOf (InDesignContigObjMarker, fGUID) == 0);
+ assert (SafeOffsetOf (InDesignContigObjMarker, fObjectUID) == 16);
+ assert (SafeOffsetOf (InDesignContigObjMarker, fObjectClassID) == 20);
+ assert (SafeOffsetOf (InDesignContigObjMarker, fStreamLength) == 24);
+ assert (SafeOffsetOf (InDesignContigObjMarker, fChecksum) == 28);
+
+ selfTestDone=true;
+ } // selfTest
+
+} /*namespace DumpFile_NS*/
+
+// -------------------------------------------------------------------------------------------------
+
+void DumpFile::Scan (std::string filename, TagTree &tagTree)
+{
+ DumpFile_NS::selfTest(); //calls selftest (will happen only once per runtime, optimization done)
+ tree = &tagTree; // static "global" helper to avoid looping throug 'tree' 24x7
+
+ // Read the first 4K of the file into a local buffer and determine the file format.
+ // ! We're using ANSI C calls that don't handle files over 2GB.
+ // ! Should switch to copies of the "LFA" routines used inside XMP.
+
+ LFA_FileRef fileRef = LFA_Open( filename.c_str(), 'r' );
+
+ assertMsg ( std::string("can't open ")+filename, fileRef != 0 );
+
+ LFA_Seek( fileRef, 0, SEEK_END );
+ XMP_Int64 fileLen = LFA_Tell(fileRef);
+
+ XMP_Uns8 first4K [4096];
+
+ LFA_Seek ( fileRef, 0, SEEK_SET );
+ LFA_Read ( fileRef, first4K, 4096, false);
+
+ LFA_Seek ( fileRef, 0, SEEK_SET ); //rewinds
+ // (remains rewinded behind CheckFileDFormat, since that call does not get the fileRef handle)
+
+ XMP_FileFormat format = CheckFileFormat ( filename.c_str(), first4K, fileLen );
+
+ if ( sXMPPtr != 0) free(sXMPPtr);
+ sXMPPtr = 0;
+ sXMPMax = 0;
+ sXMPLen = 0;
+ sXMPPos = 0;
+
+ //TODO refactor-out
+ XMP_Uns8 * fileContent = 0; // *** Hack for old file-in-RAM code.
+
+ if ( format == kXMP_JPEGFile ) {
+
+ tagTree.pushNode ( "Dumping JPEG file" );
+ tagTree.addComment ( "size %d(0x%X)", fileLen, fileLen );
+ {
+ fileContent = (XMP_Uns8*) malloc(fileLen);
+ LFA_Seek ( fileRef, 0, SEEK_SET );
+ LFA_Read ( fileRef, fileContent, fileLen, true );
+ DumpJPEG ( fileContent, fileLen );
+ }
+ tagTree.popNode();
+
+ } else if ( format == kXMP_PhotoshopFile ) {
+
+ tagTree.pushNode ( "Dumping Photoshop file" );
+ tagTree.addComment ( "size %d (0x%X)", fileLen, fileLen );
+ {
+ fileContent = (XMP_Uns8*) malloc(fileLen);
+ LFA_Seek ( fileRef, 0, SEEK_SET );
+ LFA_Read ( fileRef, fileContent, fileLen, true);
+ DumpPhotoshop ( fileContent, fileLen );
+ }
+ tagTree.popNode();
+
+ } else if ( format == kXMP_TIFFFile ) {
+
+ tagTree.pushNode ( "Dumping TIFF file" );
+ tagTree.addComment ( "size %d (0x%X)", fileLen, fileLen );
+ {
+ fileContent = (XMP_Uns8*) malloc(fileLen);
+ LFA_Seek ( fileRef, 0, SEEK_SET );
+ LFA_Read ( fileRef, fileContent, fileLen, true);
+ DumpTIFF ( fileContent, fileLen, 0, "TIFF file" );
+ }
+ tagTree.popNode();
+
+ } else if ( format == kXMP_JPEG2KFile ) {
+
+ tagTree.pushNode ( "Dumping JPEG 2000 file" );
+ tagTree.addComment ( "size %d (0x%X)", fileLen, fileLen );
+ DumpJPEG2000 (fileRef, fileLen );
+ tagTree.popNode();
+
+ } else if ( format == kXMP_WMAVFile ) {
+
+ tagTree.pushNode ( "Dumping ASF (WMA/WMV) file" );
+ tagTree.addComment ( "size %d (0x%X)", fileLen, fileLen );
+ DumpASF ( fileRef, fileLen );
+ tagTree.popNode();
+
+ } else if ( format == kXMP_AVIFile ) {
+
+ tagTree.pushNode ( "Dumping AVI file" );
+ tagTree.addComment ( "size %d (0x%X)", fileLen, fileLen );
+ DumpRIFF ( fileRef, fileLen );
+ tagTree.popNode();
+
+ } else if ( format == kXMP_WAVFile ) {
+
+ tagTree.pushNode ( "Dumping WAV file" );
+ tagTree.addComment ( "size %d (0x%X)", fileLen, fileLen );
+ DumpRIFF ( fileRef, fileLen );
+ tagTree.popNode();
+
+ } else if ( format == kXMP_MPEG4File || format == kXMP_MOVFile ) {
+
+ bool isQT = (format == kXMP_MOVFile);
+
+ tagTree.pushNode ( "Dumping ISO (MPEG-4 or Quicktime) file" );
+ tagTree.addComment ( "size %d (0x%X)", fileLen, fileLen );
+ DumpISO( fileRef, fileLen, isQT );
+ tagTree.popNode();
+
+ } else if ( format == kXMP_PNGFile ) {
+
+ tagTree.pushNode ( "Dumping PNG file" );
+ tagTree.addComment ( "size %d (0x%X)", fileLen, fileLen );
+ DumpPNG ( fileRef, fileLen );
+ tagTree.popNode();
+
+ } else if ( format == kXMP_InDesignFile ) {
+
+ tagTree.pushNode ( "Dumping InDesign file" );
+ tagTree.addComment ( "size %d (0x%X)", fileLen, fileLen );
+ DumpInDesign ( fileRef, fileLen );
+ tagTree.popNode();
+
+ } else if ( format == kXMP_SWFFile ) {
+
+ tagTree.pushNode ( "Dumping SWF file" );
+ tagTree.addComment ( "size %d (0x%X)", fileLen, fileLen );
+ DumpSWF ( fileRef, fileLen );
+ tagTree.popNode();
+
+ } else if ( format == kXMP_FLVFile ) {
+
+ tagTree.pushNode ( "Dumping FLV file" );
+ tagTree.addComment ( "size %d (0x%X)", fileLen, fileLen );
+ DumpFLV ( fileRef, fileLen );
+ tagTree.popNode();
+
+ } else if ( format == kXMP_MP3File ) {
+
+ tagTree.pushNode ( "Dumping MP3 file" );
+ tagTree.addComment ( "size %d (0x%X)", fileLen, fileLen );
+ DumpMP3 ( fileRef, fileLen );
+ tagTree.popNode();
+
+ } else if ( format == kXMP_UCFFile ) {
+
+ tagTree.pushNode ( "Dumping UCF (Universal Container Format) file" );
+ tagTree.addComment ( "size %d (0x%X)", fileLen, fileLen );
+ DumpUCF ( fileRef, fileLen );
+ tagTree.popNode();
+
+ } else if ( format == kXMP_MPEGFile ) {
+
+ tagTree.comment ( "** Recognized MPEG-2 file type, but this is a pure sidecar solution. No legacy dump available at this time." );
+
+ } else if ( format == kXMP_UnknownFile ) {
+
+ tagTree.pushNode ( "Unknown format. packet scanning, size %d (0x%X)", fileLen, fileLen );
+ PacketScan ( fileRef, fileLen );
+ tagTree.popNode();
+
+ } else {
+ tagTree.comment ( "** Recognized file type, '%.4s', but no smart dumper for it.", &format );
+ }
+
+ if ( fileContent != 0) free(fileContent);
+ LFA_Close(fileRef);
+
+} // DumpFile
diff --git a/samples/source/common/DumpFile.h b/samples/source/common/DumpFile.h
new file mode 100644
index 0000000..05857f8
--- /dev/null
+++ b/samples/source/common/DumpFile.h
@@ -0,0 +1,21 @@
+// =================================================================================================
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+//
+// =================================================================================================
+
+#ifndef XMPQE_DUMPFILE_H
+#define XMPQE_DUMPFILE_H
+
+#include "TagTree.h"
+
+class DumpFile {
+public:
+ static void Scan(std::string filename, TagTree &tagTree);
+};
+
+#endif
+
diff --git a/samples/source/common/Log.cpp b/samples/source/common/Log.cpp
new file mode 100644
index 0000000..fe132ba
--- /dev/null
+++ b/samples/source/common/Log.cpp
@@ -0,0 +1,209 @@
+// =================================================================================================
+// Copyright 2005-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+//
+// =================================================================================================
+
+/*
+*
+* a little set of functions for logging info, warnings, errors either to
+* stdout or a file (this is no class on purpose, to avoid having to pass
+* a particular instance on and on...)
+*
+* you can call the (static) log funcitons right away (resulting in stdout)
+* or create one (1!, singleton) instance first telling the outfile
+* recommendation: do that as a scoped variable not using new, since ~destruction == proper file closure...
+* (following exception-safe RAII-philosophy http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization )
+*
+*/
+
+#ifdef WIN32
+ #pragma warning ( disable : 4996 ) // fopen was declared deprecated...
+#endif
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "Log.h"
+
+using namespace std;
+
+//static variables ////////////////////////////////////////////////////////////////////
+FILE* Log::logfile=NULL;
+bool Log::noErrorsOrWarnings=true;
+bool Log::mute=false;
+bool Log::muteWarnings=false;
+//////////////////////////////////////////////////////////////////////////////////////
+
+/* standard log, use filename=NULL or filename="" or do not construct at all
+ * for logging to stdout only
+ * (otherwise stuff gets logged to stdout *and* to the logfile specified)
+ */
+Log::Log(const char* filename)
+{
+ if (Log::logfile) { //enfore singleton
+ printf("tried to create two logs (forbidden, singleton)");
+ throw LOG_Exception("tried to create two logs (forbidden, singleton)");
+ }
+ if (!filename)
+ logfile=NULL; //OLD: logfile=stdout;
+ else if (!strcmp(filename,""))
+ logfile=NULL; //empty string
+ else {
+ logfile=fopen(filename,"wt");
+ if (!logfile) {
+ printf("could not open output file %s for writing",filename); //do in addition to make sure it's output
+ throw LOG_Exception("could not open output file for writing");
+ }
+ }
+}
+
+Log::~Log()
+{
+ if(logfile) {
+ //info("logfile properly closed.");
+ fclose(logfile);
+ logfile=NULL; //BUGSOURCE: null out such that any possible following traces do not go to invalid file...
+ }
+}
+
+/*
+* outputs to file and standardout
+* (Note: it would be wunderbar to group the essential output into one function,
+* regretably that type for "..."-paramter forwarding doesn't go down well with logging MACROS (__DATE etc...)
+* thus this may be the best solution
+*/
+
+void Log::trace(const char* format, ...) {
+ if (Log::mute) return;
+ va_list args; va_start(args, format);
+ //stdout
+ vprintf( format, args);
+ printf( "\n");
+ //file
+ if(logfile) {
+ vfprintf( logfile, format, args);
+ fprintf( logfile, "\n");
+ }
+ va_end(args);
+}
+
+void Log::info(const char* format, ...) {
+ // experience from TagTree, not encountered in Log.
+ //note: format and ... are somehow "used up", i.e. dumping them
+ // via vsprintf _and_ via printf brought up errors on Mac (only)
+ // i.e. %d %X stuff looking odd (roughly like signed vs unsigned...)
+ // buffer reuse as in (2) is fine, just dont use format/... twice.
+
+ if (Log::mute) return;
+ va_list args; va_start(args, format);
+ //stdout
+ vprintf( format, args);
+ printf( "\n");
+ //file
+ if(logfile) {
+ vfprintf( logfile, format, args);
+ fprintf( logfile, "\n");
+ }
+ va_end(args);
+}
+
+void Log::important(const char* format, ...) {
+ va_list args; va_start(args, format);
+ //stdout
+ vprintf( format, args);
+ printf( "\n");
+ //file
+ if(logfile) {
+ vfprintf( logfile, format, args);
+ fprintf( logfile, "\n");
+ }
+ va_end(args);
+}
+
+
+void Log::infoNoLF(const char* format, ...) {
+ if (Log::mute) return;
+ va_list args; va_start(args, format);
+ //stdout
+ vprintf( format, args);
+ //file
+ if(logfile) {
+ vfprintf( logfile, format, args);
+ }
+ va_end(args);
+}
+
+void Log::warn(const char* format, ...){
+ if (Log::muteWarnings) return; //bogus warnings or neither output nor do they 'count'
+
+ noErrorsOrWarnings=false; //too bad...
+ va_list args; va_start(args, format);
+ //stdout
+ printf( "warning:" );
+ vprintf( format, args);
+ printf( "\n");
+ //file
+ if(logfile) {
+ fprintf( logfile, "warning:");
+ vfprintf( logfile, format, args);
+ fprintf( logfile, "\n");
+ }
+ va_end(args);
+}
+
+void Log::error(const char* format, ...){
+ noErrorsOrWarnings=false; //too bad...
+ va_list args; va_start(args, format);
+ //since many errors in test are caused by intend in testing
+ //(so you don't want to see them), do not output directly here,
+ //but leave that to a particular dump-Function
+ //(which should be part of any catch(LOG_Exception))
+ char buffer [XMPQE_MAX_ERROR_LENGTH]; //let's hope that fits (see .h file)
+ vsnprintf( buffer, XMPQE_MAX_ERROR_LENGTH, format, args);
+ //if not existing on sme unix consider going back to (minimally less secure vsprintf (w/o the n))
+ va_end(args);
+ throw LOG_Exception(buffer);
+ //may throw exception ONLY, no exit()-call, for cppunit's sake
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+//convenience overloads
+
+void Log::info(std::string s1)
+{
+ if (Log::mute) return;
+ info(s1.c_str());
+}
+
+void Log::important(std::string s1)
+{
+ info(s1.c_str());
+}
+
+/////////////////////////////////////////////////////////////////////////////////
+// mute vs. verbose
+
+void Log::setMute()
+{
+ Log::mute = true;
+}
+
+void Log::setVerbose()
+{
+ Log::mute = false;
+}
+
+void Log::setMuteWarnings()
+{
+ Log::muteWarnings = true;
+}
+
+void Log::setVerboseWarnings()
+{
+ Log::muteWarnings = false;
+}
+
diff --git a/samples/source/common/Log.h b/samples/source/common/Log.h
new file mode 100644
index 0000000..3bd370c
--- /dev/null
+++ b/samples/source/common/Log.h
@@ -0,0 +1,85 @@
+// =================================================================================================
+// Copyright 2005-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+//
+// =================================================================================================
+
+#ifndef __Log_h__
+#define __Log_h__ 1
+
+#include "XMP_Environment.h"
+
+#include <stdexcept> // (xcode needs stdexcept to accept class declaration below )
+#include <string>
+
+
+#if XMP_WinBuild
+ #pragma warning ( disable : 4996 ) // Consider using _snprintf_s instead.
+ #define snprintf _snprintf
+ //#define assertMsg(msg,c) \
+ //if ( ! (c) ) { \
+ // Log::error ( "- assert that failed: %s\n- message: %s\n- " __FILE__ ":%u", #c, std::string( msg ).c_str(), __LINE__ ); \
+ // /* Log::error throws the exception which either fails the testcase resp. terminates dumpfile */ \
+ // /* important to do it this way such that both testrunner and standalone use is possible */ \
+ //}
+#endif
+
+//8K hopefully does for any type of error message
+#define XMPQE_MAX_ERROR_LENGTH 8*1048
+
+class LOG_Exception : public std::runtime_error {
+public:
+ LOG_Exception(const char* errorMsg) : std::runtime_error(errorMsg) { }
+};
+
+class Log {
+ public:
+ Log(const char* filename);
+ ~Log(void);
+
+ // trace is identical to info, except that it can be turned of (soon)
+ // ==> use trace for any non-crucial information
+ // i.e. bits and pieces in a test
+ // do not use for parts of known-good-output, essential summaries, etc...
+ static void trace(const char* format, ...);
+
+ // be aware of bug1741056, feeding 64bit numbers might not output correctly
+ static void info(const char* format, ...);
+ static void infoNoLF(const char* format, ...);
+ static void warn(const char* format, ...);
+ static void error(const char* format, ...);
+ static bool noErrorsOrWarnings; //set to true, if any warnings occured
+
+ //identical to info, but immune to "mute"
+ // be aware of bug1741056, feeding 64bit numbers might not output correctly
+ static void important(const char* format, ...);
+
+ //convenience overloads:
+ static void info(std::string s1);
+ static void important(std::string s1);
+
+ // mute vs. verbose
+ static void setMute();
+ static void setVerbose();
+
+ static void setMuteWarnings();
+ static void setVerboseWarnings();
+
+ static bool mute;
+ // NB: public on intend, such that i.e. copy commands can decide to
+ // send their output to nirvana accordingly on mute==true;
+ // (getter/setter on a static boolean var is fairly pointless)
+
+ private:
+ static bool singletonInstanciated;
+ static FILE* logfile;
+
+ //should only be temporarily used, i.e. on selftests that
+ //inevitable yield (during selftet: bogus) warnings
+ static bool muteWarnings;
+};
+
+#endif
diff --git a/samples/source/common/OutputUtils.cpp b/samples/source/common/OutputUtils.cpp
new file mode 100644
index 0000000..0c59339
--- /dev/null
+++ b/samples/source/common/OutputUtils.cpp
@@ -0,0 +1,227 @@
+// =================================================================================================
+// Copyright 2005-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+//
+// =================================================================================================
+
+#include <string>
+#include <stdarg.h>
+
+#include "OutputUtils.h"
+#include "Log.h"
+
+
+using namespace std;
+
+namespace Utils {
+ /* hand over the fileFormat and get a fileFormatName (2-3 Letters ie. PDF)
+ * and a Description (i.e. "Portable Document Format") back.
+ * see also public/include/XMP_Const.h
+ */
+ void fileFormatNameToString ( XMP_FileFormat fileFormat, std::string & fileFormatName, std::string & fileFormatDesc )
+ {
+ fileFormatName.erase();
+ fileFormatDesc.erase();
+ switch(fileFormat) {
+ case kXMP_PDFFile:
+ fileFormatName = "PDF ";fileFormatDesc = "Portable Document Format";break;
+ case kXMP_PostScriptFile:
+ fileFormatName = "PS ";fileFormatDesc = "Post Script";break;
+ case kXMP_EPSFile:
+ fileFormatName = "EPS ";fileFormatDesc = "Encapsulated Post Script";break;
+ case kXMP_JPEGFile:
+ fileFormatName = "JPEG";fileFormatDesc = "Joint Photographic Experts Group";break;
+ case kXMP_JPEG2KFile:
+ fileFormatName = "JPX ";fileFormatDesc = "JPEG 2000";break;
+ case kXMP_TIFFFile:
+ fileFormatName = "TIFF";fileFormatDesc = "Tagged Image File Format";break;
+ case kXMP_GIFFile:
+ fileFormatName = "GIF ";fileFormatDesc = "Graphics Interchange Format";break;
+ case kXMP_PNGFile:
+ fileFormatName = "PNG ";fileFormatDesc = "Portable Network Graphic";break;
+ case kXMP_MOVFile:
+ fileFormatName = "MOV ";fileFormatDesc = "Quicktime";break;
+ case kXMP_AVIFile:
+ fileFormatName = "AVI ";fileFormatDesc = "Quicktime";break;
+ case kXMP_CINFile:
+ fileFormatName = "CIN ";fileFormatDesc = "Cineon";break;
+ case kXMP_WAVFile:
+ fileFormatName = "WAV ";fileFormatDesc = "WAVE Form Audio Format";break;
+ case kXMP_MP3File:
+ fileFormatName = "MP3 ";fileFormatDesc = "MPEG-1 Audio Layer 3";break;
+ case kXMP_SESFile:
+ fileFormatName = "SES ";fileFormatDesc = "Audition session";break;
+ case kXMP_CELFile:
+ fileFormatName = "CEL ";fileFormatDesc = "Audition loop";break;
+ case kXMP_MPEGFile:
+ fileFormatName = "MPEG";fileFormatDesc = "Motion Pictures Experts Group";break;
+ case kXMP_MPEG2File:
+ fileFormatName = "MP2 ";fileFormatDesc = "MPEG-2";break;
+ case kXMP_WMAVFile:
+ fileFormatName = "WMAV";fileFormatDesc = "Windows Media Audio and Video";break;
+ case kXMP_HTMLFile:
+ fileFormatName = "HTML";fileFormatDesc = "HyperText Markup Language";break;
+ case kXMP_XMLFile:
+ fileFormatName = "XML ";fileFormatDesc = "Extensible Markup Language";break;
+ case kXMP_TextFile:
+ fileFormatName = "TXT ";fileFormatDesc = "text";break;
+ case kXMP_PhotoshopFile:
+ fileFormatName = "PSD ";fileFormatDesc = "Photoshop Document";break;
+ case kXMP_IllustratorFile:
+ fileFormatName = "AI ";fileFormatDesc = "Adobe Illustrator";break;
+ case kXMP_InDesignFile:
+ fileFormatName = "INDD";fileFormatDesc = "Adobe InDesign";break;
+ case kXMP_AEProjectFile:
+ fileFormatName = "AEP ";fileFormatDesc = "AfterEffects Project";break;
+ case kXMP_AEFilterPresetFile:
+ fileFormatName = "FFX ";fileFormatDesc = "AfterEffects Filter Preset";break;
+ case kXMP_EncoreProjectFile:
+ fileFormatName = "NCOR";fileFormatDesc = "Encore Project";break;
+ case kXMP_PremiereProjectFile:
+ fileFormatName = "PPRJ";fileFormatDesc = "Premier Project";break;
+ case kXMP_SWFFile:
+ fileFormatName = "SWF ";fileFormatDesc = "Shockwave Flash";break;
+ case kXMP_PremiereTitleFile:
+ fileFormatName = "PRTL";fileFormatDesc = "Premier Title";break;
+ default:
+ fileFormatName = " ";fileFormatDesc = "Unkown file format";break;
+ }
+ } //fileFormatNameToString
+
+ /**
+ * GetFormatInfo-Flags (aka Handler-Flags)
+ * find this in XMP_Const.h under "Options for GetFormatInfo"
+ */
+ std::string XMPFiles_FormatInfoToString ( const XMP_OptionBits options) {
+ std::string outString;
+
+ if( options & kXMPFiles_CanInjectXMP )
+ outString.append(" CanInjectXMP");
+ if( options & kXMPFiles_CanExpand )
+ outString.append(" CanExpand");
+ if( options & kXMPFiles_CanRewrite )
+ outString.append(" CanRewrite");
+ if( options & kXMPFiles_PrefersInPlace )
+ outString.append(" PrefersInPlace");
+ if( options & kXMPFiles_CanReconcile )
+ outString.append(" CanReconcile");
+ if( options & kXMPFiles_AllowsOnlyXMP )
+ outString.append(" AllowsOnlyXMP");
+ if( options & kXMPFiles_ReturnsRawPacket )
+ outString.append(" ReturnsRawPacket");
+ if( options & kXMPFiles_ReturnsTNail )
+ outString.append(" ReturnsTNail");
+ if( options & kXMPFiles_HandlerOwnsFile )
+ outString.append(" HandlerOwnsFile");
+ if( options & kXMPFiles_AllowsSafeUpdate )
+ outString.append(" AllowsSafeUpdate");
+
+ if (outString.empty()) outString=" (none)";
+ return outString;
+ }
+
+ /**
+ * openOptions to String, find this in
+ * XMP_Const.h under "Options for OpenFile"
+ */
+ std::string XMPFiles_OpenOptionsToString ( const XMP_OptionBits options) {
+ std::string outString;
+ if( options & kXMPFiles_OpenForRead)
+ outString.append(" OpenForRead");
+ if( options & kXMPFiles_OpenForUpdate)
+ outString.append(" OpenForUpdate");
+ if( options & kXMPFiles_OpenOnlyXMP)
+ outString.append(" OpenOnlyXMP");
+ if( options & kXMPFiles_OpenCacheTNail)
+ outString.append(" OpenCacheTNail");
+ if( options & kXMPFiles_OpenStrictly)
+ outString.append(" OpenStrictly");
+ if( options & kXMPFiles_OpenUseSmartHandler)
+ outString.append(" OpenUseSmartHandler");
+ if( options & kXMPFiles_OpenUsePacketScanning)
+ outString.append(" OpenUsePacketScanning");
+ if( options & kXMPFiles_OpenLimitedScanning)
+ outString.append(" OpenLimitedScanning");
+
+ if (outString.empty()) outString=" (none)";
+ return outString;
+ }
+
+
+
+ std::string fromArgs(const char* format, ...)
+ {
+ //note: format and ... are somehow "used up", i.e. dumping them
+ // via vsprintf _and_ via printf brought up errors on Mac (only)
+ // i.e. %d %X stuff looking odd (roughly like signed vs unsigned...)
+ // buffer reuse is fine, just dont use format/... twice.
+
+ char buffer[4096]; //should be big enough but no guarantees..
+ va_list args;
+ va_start(args, format);
+ vsprintf(buffer, format, args);
+ va_end(args);
+
+ return std::string(buffer);
+ }
+
+
+
+ //just the callback-Function
+ XMP_Status DumpToString( void * refCon, XMP_StringPtr outStr, XMP_StringLen outLen )
+ {
+ XMP_Status status = 0;
+ std::string* dumpString = static_cast < std::string* > ( refCon );
+ dumpString->append (outStr, outLen); // less effective: ( std::string(outStr).substr(0,outLen) );
+ return status;
+ }
+
+ //full output to Log
+ void dumpXMP(SXMPMeta* xmpMeta){
+ std::string dump;
+ xmpMeta->Sort();
+ xmpMeta->DumpObject(DumpToString, &dump);
+ Log::info("%s",dump.c_str());
+ }
+
+ //same but with Comment
+ void dumpXMP(std::string comment, SXMPMeta* xmpMeta){
+ Log::info("%s",comment.c_str());
+ std::string dump;
+ xmpMeta->Sort();
+ xmpMeta->DumpObject(DumpToString, &dump);
+ Log::info("%s",dump.c_str());
+ }
+
+ // dump Aliases ****************************
+ //full output to Log
+ void dumpAliases()
+ {
+ std::string dump;
+ SXMPMeta::DumpAliases(DumpToString,&dump);
+ Log::info("List of aliases:");
+ Log::info("%s",dump.c_str());
+ }
+
+ void DumpXMP_DateTime( const XMP_DateTime & date ) {
+ static std::string tempStr;
+ tempStr.clear();
+ SXMPUtils::ConvertFromDate( date, &tempStr );
+ Log::info("%s\nYear: '%d' Month: '%d' Day: '%d' Hour: '%d' Min: '%d' Sec: '%d' Nanos: '%d' TZSign: '%d' TZHour: '%d' TZMinute: '%d'\n", tempStr.c_str(), date.year, date.month, date.day, date.hour, date.minute, date.second, date.nanoSecond, date.tzSign, date.tzHour, date.tzMinute );
+ }
+
+
+
+
+ void removeNLines(std::string* s, int n){
+ for(int i=0;i<n;i++)
+ s->erase(0,s->find_first_of("\n")+1);
+ }
+
+
+
+} /*namespace Utils*/
+
diff --git a/samples/source/common/OutputUtils.h b/samples/source/common/OutputUtils.h
new file mode 100644
index 0000000..6597ed8
--- /dev/null
+++ b/samples/source/common/OutputUtils.h
@@ -0,0 +1,50 @@
+// =================================================================================================
+// Copyright 2005-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+//
+// =================================================================================================
+
+#ifndef __XMPQE_QEOUTPUTUTILS_h__
+#define __XMPQE_QEOUTPUTUTILS_h__ 1
+
+//XMP related
+#define TXMP_STRING_TYPE std::string
+
+#include "XMP.hpp"
+
+namespace Utils{
+
+
+ void fileFormatNameToString( XMP_FileFormat fileFormat, std::string &fileFormatName, std::string &fileFormatDesc );
+
+ std::string XMPFiles_FormatInfoToString ( const XMP_OptionBits options);
+ std::string XMPFiles_OpenOptionsToString ( const XMP_OptionBits options);
+
+ std::string fromArgs(const char* format, ...);
+
+ //just the DumpToString Callback routine
+ // - (taken over from dfranzen resp. DevTestProto)
+ // - /*outLen*/ ==> avoid unused warning
+ XMP_Status DumpToString ( void * refCon, XMP_StringPtr outStr, XMP_StringLen /*outLen*/ );
+
+ // dumps xmp (using Log::info())
+ // based on dfranzen's conglomerate of dump-functions in XMPTestCase.cpp
+ // no return value, will Log::error() on problems
+ void dumpXMP(SXMPMeta* xmpMeta);
+ void dumpXMP(std::string comment, SXMPMeta* xmpMeta);
+ void dumpAliases();
+
+ //remove n first lines from a string
+ // handy i.e. for first line of xmp-rdf packets prior to KGO,
+ // since firt line may contain -date- or actual date,
+ // (debug) or 7 spaces, etc...
+ void removeNLines(std::string* s, int n=1);
+
+ void DumpXMP_DateTime( const XMP_DateTime & date );
+
+}
+
+#endif
diff --git a/samples/source/common/QEScanner.cpp b/samples/source/common/QEScanner.cpp
new file mode 100644
index 0000000..5553495
--- /dev/null
+++ b/samples/source/common/QEScanner.cpp
@@ -0,0 +1,1469 @@
+// =================================================================================================
+// Copyright 2002-2006 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+//
+// Adobe patent application tracking #P435, entitled 'Unique markers to simplify embedding data of
+// one format in a file with a different format', inventors: Sean Parent, Greg Gilley.
+// =================================================================================================
+
+#if WIN_ENV
+ #pragma warning ( disable : 4786 ) // The VC++ debugger can't handle long symbol names.
+ #pragma warning ( disable : 4127 ) // conditional expression is constant
+#endif
+
+
+#include "QEScanner.hpp"
+
+#include <cassert>
+#include <string>
+#include <iostream>
+#include <iomanip>
+#include <fstream>
+#include <cstdlib>
+
+
+#ifndef UseStringPushBack // VC++ 6.x does not provide push_back for strings!
+ #define UseStringPushBack 0
+#endif
+
+
+using namespace std;
+
+
+// *** Consider Boyer-Moore style search for "<?xpacket begin=". It isn't an obvious win, the
+// *** additional code might be slower than scanning every character. Especially if we will
+// *** read every cache line anyway.
+
+
+// =================================================================================================
+// =================================================================================================
+// class PacketMachine
+// ===================
+//
+// This is the packet recognizer state machine. The top of the machine is FindNextPacket, this
+// calls the specific state components and handles transitions. The states are described by an
+// array of RecognizerInfo records, indexed by the RecognizerKind enumeration. Each RecognizerInfo
+// record has a function that does that state's work, the success and failure transition states,
+// and a string literal that is passed to the state function. The literal lets a common MatchChar
+// or MatchString function be used in several places.
+//
+// The state functions are responsible for consuming input to recognize their particular state.
+// This includes intervening nulls for 16 and 32 bit character forms. For the simplicity, things
+// are treated as essentially little endian and the nulls are not actually checked. The opening
+// '<' is found with a byte-by-byte search, then the number of bytes per character is determined
+// by counting the following nulls. From then on, consuming a character means incrementing the
+// buffer pointer by the number of bytes per character. Thus the buffer pointer only points to
+// the "real" bytes. This also means that the pointer can go off the end of the buffer by a
+// variable amount. The amount of overrun is saved so that the pointer can be positioned at the
+// right byte to start the next buffer.
+//
+// The state functions return a TriState value, eTriYes means the pattern was found, eTriNo means
+// the pattern was definitely not found, eTriMaybe means that the end of the buffer was reached
+// while working through the pattern.
+//
+// When eTriYes is returned, the fBufferPtr data member is left pointing to the "real" byte
+// following the last actual byte. Which might not be addressable memory! This also means that
+// a state function can be entered with nothing available in the buffer. When eTriNo is returned,
+// the fBufferPtr data member is left pointing to the byte that caused the failure. The state
+// machine starts over from the failure byte.
+//
+// The state functions must preserve their internal micro-state before returning eTriMaybe, and
+// resume processing when called with the next buffer. The fPosition data member is used to denote
+// how many actual characters have been consumed. The fNullCount data member is used to denote how
+// many nulls are left before the next actual character.
+
+
+// =================================================================================================
+// PacketMachine
+// =============
+
+QEScanner::PacketMachine::PacketMachine ( SInt64 bufferOffset, const void * bufferOrigin, SInt64 bufferLength ) :
+
+ // Public members
+ fPacketStart ( 0 ),
+ fPacketLength ( 0 ),
+ fBytesAttr ( -1 ),
+ fCharForm ( eChar8Bit ),
+ fAccess ( ' ' ),
+ fBogusPacket ( false ),
+
+ // Private members
+ fBufferOffset ( bufferOffset ),
+ fBufferOrigin ( (const char *) bufferOrigin ),
+ fBufferPtr ( fBufferOrigin ),
+ fBufferLimit ( fBufferOrigin + bufferLength ),
+ fRecognizer ( eLeadInRecognizer ),
+ fPosition ( 0 ),
+ fBytesPerChar ( 1 ),
+ fBufferOverrun ( 0 ),
+ fQuoteChar ( ' ' )
+
+{
+ /*
+ REVIEW NOTES : Should the buffer stuff be in a class?
+ */
+
+ assert ( bufferOrigin != NULL );
+ assert ( bufferLength != 0 );
+
+} // PacketMachine
+
+
+// =================================================================================================
+// ~PacketMachine
+// ==============
+
+QEScanner::PacketMachine::~PacketMachine ()
+{
+
+ // An empty placeholder.
+
+} // ~PacketMachine
+
+
+// =================================================================================================
+// AssociateBuffer
+// ===============
+
+void
+QEScanner::PacketMachine::AssociateBuffer ( SInt64 bufferOffset, const void * bufferOrigin, SInt64 bufferLength )
+{
+
+ fBufferOffset = bufferOffset;
+ fBufferOrigin = (const char *) bufferOrigin;
+ fBufferPtr = fBufferOrigin + fBufferOverrun;
+ fBufferLimit = fBufferOrigin + bufferLength;
+
+} // AssociateBuffer
+
+
+// =================================================================================================
+// ResetMachine
+// ============
+
+void
+QEScanner::PacketMachine::ResetMachine ()
+{
+
+ fRecognizer = eLeadInRecognizer;
+ fPosition = 0;
+ fBufferOverrun = 0;
+ fCharForm = eChar8Bit;
+ fBytesPerChar = 1;
+ fAccess = ' ';
+ fBytesAttr = -1;
+ fBogusPacket = false;
+
+ fAttrName.erase ( fAttrName.begin(), fAttrName.end() );
+ fAttrValue.erase ( fAttrValue.begin(), fAttrValue.end() );
+ fEncodingAttr.erase ( fEncodingAttr.begin(), fEncodingAttr.end() );
+
+} // ResetMachine
+
+
+// =================================================================================================
+// FindLessThan
+// ============
+
+QEScanner::PacketMachine::TriState
+QEScanner::PacketMachine::FindLessThan ( PacketMachine * ths, const char * which )
+{
+
+ if ( *which == 'H' ) {
+
+ // --------------------------------------------------------------------------------
+ // We're looking for the '<' of the header. If we fail there is no packet in this
+ // part of the input, so return eTriNo.
+
+ ths->fCharForm = eChar8Bit; // We might have just failed from a bogus 16 or 32 bit case.
+ ths->fBytesPerChar = 1;
+
+ while ( ths->fBufferPtr < ths->fBufferLimit ) { // Don't skip nulls for the header's '<'!
+ if ( *ths->fBufferPtr == '<' ) break;
+ ths->fBufferPtr++;
+ }
+
+ if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriNo;
+ ths->fBufferPtr++;
+ return eTriYes;
+
+ } else {
+
+ // --------------------------------------------------------------------------------
+ // We're looking for the '<' of the trailer. We're already inside the packet body,
+ // looking for the trailer. So here if we fail we must return eTriMaybe so that we
+ // keep looking for the trailer in the next buffer.
+
+ const int bytesPerChar = ths->fBytesPerChar;
+
+ while ( ths->fBufferPtr < ths->fBufferLimit ) {
+ if ( *ths->fBufferPtr == '<' ) break;
+ ths->fBufferPtr += bytesPerChar;
+ }
+
+ if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe;
+ ths->fBufferPtr += bytesPerChar;
+ return eTriYes;
+
+ }
+
+} // FindLessThan
+
+
+// =================================================================================================
+// MatchString
+// ===========
+
+QEScanner::PacketMachine::TriState
+QEScanner::PacketMachine::MatchString ( PacketMachine * ths, const char * literal )
+{
+ const int bytesPerChar = ths->fBytesPerChar;
+ const char * litPtr = literal + ths->fPosition;
+ const size_t charsToGo = strlen ( literal ) - ths->fPosition;
+ size_t charsDone = 0;
+
+ while ( (charsDone < charsToGo) && (ths->fBufferPtr < ths->fBufferLimit) ) {
+ if ( *litPtr != *ths->fBufferPtr ) return eTriNo;
+ charsDone++;
+ litPtr++;
+ ths->fBufferPtr += bytesPerChar;
+ }
+
+ if ( charsDone == charsToGo ) return eTriYes;
+ ths->fPosition += charsDone;
+ return eTriMaybe;
+
+} // MatchString
+
+
+// =================================================================================================
+// MatchChar
+// =========
+
+QEScanner::PacketMachine::TriState
+QEScanner::PacketMachine::MatchChar ( PacketMachine * ths, const char * literal )
+{
+ const int bytesPerChar = ths->fBytesPerChar;
+
+ if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe;
+
+ const char currChar = *ths->fBufferPtr;
+ if ( currChar != *literal ) return eTriNo;
+ ths->fBufferPtr += bytesPerChar;
+ return eTriYes;
+
+} // MatchChar
+
+
+// =================================================================================================
+// MatchOpenQuote
+// ==============
+
+QEScanner::PacketMachine::TriState
+QEScanner::PacketMachine::MatchOpenQuote ( PacketMachine * ths, const char * /* unused */ )
+{
+ const int bytesPerChar = ths->fBytesPerChar;
+
+ if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe;
+
+ const char currChar = *ths->fBufferPtr;
+ if ( (currChar != '\'') && (currChar != '"') ) return eTriNo;
+ ths->fQuoteChar = currChar;
+ ths->fBufferPtr += bytesPerChar;
+ return eTriYes;
+
+} // MatchOpenQuote
+
+
+// =================================================================================================
+// MatchCloseQuote
+// ===============
+
+QEScanner::PacketMachine::TriState
+QEScanner::PacketMachine::MatchCloseQuote ( PacketMachine * ths, const char * /* unused */ )
+{
+
+ return MatchChar ( ths, &ths->fQuoteChar );
+
+} // MatchCloseQuote
+
+
+// =================================================================================================
+// CaptureAttrName
+// ===============
+
+QEScanner::PacketMachine::TriState
+QEScanner::PacketMachine::CaptureAttrName ( PacketMachine * ths, const char * /* unused */ )
+{
+ const int bytesPerChar = ths->fBytesPerChar;
+ char currChar;
+
+ if ( ths->fPosition == 0 ) { // Get the first character in the name.
+
+ if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe;
+
+ currChar = *ths->fBufferPtr;
+ if ( ths->fAttrName.size() == 0 ) {
+ if ( ! ( ( ('a' <= currChar) && (currChar <= 'z') ) ||
+ ( ('A' <= currChar) && (currChar <= 'Z') ) ||
+ (currChar == '_') || (currChar == ':') ) ) {
+ return eTriNo;
+ }
+ }
+
+ ths->fAttrName.erase ( ths->fAttrName.begin(), ths->fAttrName.end() );
+ #if UseStringPushBack
+ ths->fAttrName.push_back ( currChar );
+ #else
+ ths->fAttrName.insert ( ths->fAttrName.end(), currChar );
+ #endif
+ ths->fBufferPtr += bytesPerChar;
+
+ }
+
+ while ( ths->fBufferPtr < ths->fBufferLimit ) { // Get the remainder of the name.
+
+ currChar = *ths->fBufferPtr;
+ if ( ! ( ( ('a' <= currChar) && (currChar <= 'z') ) ||
+ ( ('A' <= currChar) && (currChar <= 'Z') ) ||
+ ( ('0' <= currChar) && (currChar <= '9') ) ||
+ (currChar == '-') || (currChar == '.') || (currChar == '_') || (currChar == ':') ) ) {
+ break;
+ }
+
+ #if UseStringPushBack
+ ths->fAttrName.push_back ( currChar );
+ #else
+ ths->fAttrName.insert ( ths->fAttrName.end(), currChar );
+ #endif
+ ths->fBufferPtr += bytesPerChar;
+
+ }
+
+ if ( ths->fBufferPtr < ths->fBufferLimit ) return eTriYes;
+ ths->fPosition = ths->fAttrName.size(); // The name might span into the next buffer.
+ return eTriMaybe;
+
+} // CaptureAttrName
+
+
+// =================================================================================================
+// CaptureAttrValue
+// ================
+//
+// Recognize the equal sign and the quoted string value, capture the value along the way.
+
+QEScanner::PacketMachine::TriState
+QEScanner::PacketMachine::CaptureAttrValue ( PacketMachine * ths, const char * /* unused */ )
+{
+ const int bytesPerChar = ths->fBytesPerChar;
+ char currChar = 0;
+ TriState result = eTriMaybe;
+
+ if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe;
+
+ switch ( ths->fPosition ) {
+
+ case 0 : // The name should haved ended at the '=', nulls already skipped.
+
+ if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe;
+ if ( *ths->fBufferPtr != '=' ) return eTriNo;
+ ths->fBufferPtr += bytesPerChar;
+ ths->fPosition = 1;
+ // fall through OK because MatchOpenQuote will check the buffer limit and nulls ...
+
+ case 1 : // Look for the open quote.
+
+ result = MatchOpenQuote ( ths, NULL );
+ if ( result != eTriYes ) return result;
+ ths->fPosition = 2;
+ // fall through OK because the buffer limit and nulls are checked below ...
+
+ default : // Look for the close quote, capturing the value along the way.
+
+ assert ( ths->fPosition == 2 );
+
+ const char quoteChar = ths->fQuoteChar;
+
+ while ( ths->fBufferPtr < ths->fBufferLimit ) {
+ currChar = *ths->fBufferPtr;
+ if ( currChar == quoteChar ) break;
+ #if UseStringPushBack
+ ths->fAttrValue.push_back ( currChar );
+ #else
+ ths->fAttrValue.insert ( ths->fAttrValue.end(), currChar );
+ #endif
+ ths->fBufferPtr += bytesPerChar;
+ }
+
+ if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe;
+ assert ( currChar == quoteChar );
+ ths->fBufferPtr += bytesPerChar; // Advance past the closing quote.
+ return eTriYes;
+
+ }
+
+} // CaptureAttrValue
+
+
+// =================================================================================================
+// RecordStart
+// ===========
+//
+// Note that this routine looks at bytes, not logical characters. It has to figure out how many
+// bytes per character there are so that the other recognizers can skip intervening nulls.
+
+QEScanner::PacketMachine::TriState
+QEScanner::PacketMachine::RecordStart ( PacketMachine * ths, const char * /* unused */ )
+{
+
+ while ( true ) {
+
+ if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe;
+
+ const char currByte = *ths->fBufferPtr;
+
+ switch ( ths->fPosition ) {
+
+ case 0 : // Record the length.
+ assert ( ths->fCharForm == eChar8Bit );
+ assert ( ths->fBytesPerChar == 1 );
+ ths->fPacketStart = ths->fBufferOffset + ((ths->fBufferPtr - 1) - ths->fBufferOrigin);
+ ths->fPacketLength = 0;
+ ths->fPosition = 1;
+ // ! OK to fall through here, we didn't consume a byte in this step.
+
+ case 1 : // Look for the first null byte.
+ if ( currByte != 0 ) return eTriYes; // No nulls found.
+ ths->fCharForm = eChar16BitBig; // Assume 16 bit big endian for now.
+ ths->fBytesPerChar = 2;
+ ths->fBufferPtr++;
+ ths->fPosition = 2;
+ break; // ! Don't fall through, have to check for the end of the buffer between each byte.
+
+ case 2 : // One null was found, look for a second.
+ if ( currByte != 0 ) return eTriYes; // Just one null found.
+ ths->fBufferPtr++;
+ ths->fPosition = 3;
+ break;
+
+ case 3 : // Two nulls were found, look for a third.
+ if ( currByte != 0 ) return eTriNo; // Just two nulls is not valid.
+ ths->fCharForm = eChar32BitBig; // Assume 32 bit big endian for now.
+ ths->fBytesPerChar = 4;
+ ths->fBufferPtr++;
+ return eTriYes;
+ break;
+
+ }
+
+ }
+
+} // RecordStart
+
+
+// =================================================================================================
+// RecognizeBOM
+// ============
+//
+// Recognizing the byte order marker is a surprisingly messy thing to do. It can't be done by the
+// normal string matcher, there are no intervening nulls. There are 4 transitions after the opening
+// quote, the closing quote or one of the three encodings. For the actual BOM there are then 1 or 2
+// following bytes that depend on which of the encodings we're in. Not to mention that the buffer
+// might end at any point.
+//
+// The intervening null count done earlier determined 8, 16, or 32 bits per character, but not the
+// big or little endian nature for the 16/32 bit cases. The BOM must be present for the 16 and 32
+// bit cases in order to determine the endian mode. There are six possible byte sequences for the
+// quoted BOM string, ignoring the differences for quoting with ''' versus '"'.
+//
+// Keep in mind that for the 16 and 32 bit cases there will be nulls for the quote. In the table
+// below the symbol <quote> means just the one byte containing the ''' or '"'. The nulls for the
+// quote character are explicitly shown.
+//
+// <quote> <quote> - 1: No BOM, this must be an 8 bit case.
+// <quote> \xEF \xBB \xBF <quote> - 1.12-13: The 8 bit form.
+//
+// <quote> \xFE \xFF \x00 <quote> - 1.22-23: The 16 bit, big endian form
+// <quote> \x00 \xFF \xFE <quote> - 1.32-33: The 16 bit, little endian form.
+//
+// <quote> \x00 \x00 \xFE \xFF \x00 \x00 \x00 <quote> - 1.32.43-45.56-57: The 32 bit, big endian form.
+// <quote> \x00 \x00 \x00 \xFF \xFE \x00 \x00 <quote> - 1.32.43.54-57: The 32 bit, little endian form.
+
+enum {
+ eBOM_8_1 = 0xEF,
+ eBOM_8_2 = 0xBB,
+ eBOM_8_3 = 0xBF,
+ eBOM_Big_1 = 0xFE,
+ eBOM_Big_2 = 0xFF,
+ eBOM_Little_1 = eBOM_Big_2,
+ eBOM_Little_2 = eBOM_Big_1
+};
+
+QEScanner::PacketMachine::TriState
+QEScanner::PacketMachine::RecognizeBOM ( PacketMachine * ths, const char * /* unused */ )
+{
+ const int bytesPerChar = ths->fBytesPerChar;
+
+ while ( true ) { // Handle one character at a time, the micro-state (fPosition) changes for each.
+
+ if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe;
+
+ const unsigned char currChar = *ths->fBufferPtr; // ! The BOM bytes look like integers bigger than 127.
+
+ switch ( ths->fPosition ) {
+
+ case 0 : // Look for the opening quote.
+ if ( (currChar != '\'') && (currChar != '"') ) return eTriNo;
+ ths->fQuoteChar = currChar;
+ ths->fBufferPtr++;
+ ths->fPosition = 1;
+ break; // ! Don't fall through, have to check for the end of the buffer between each byte.
+
+ case 1 : // Look at the byte immediately following the opening quote.
+ if ( currChar == ths->fQuoteChar ) { // Closing quote, no BOM character, must be 8 bit.
+ if ( ths->fCharForm != eChar8Bit ) return eTriNo;
+ ths->fBufferPtr += bytesPerChar; // Skip the nulls after the closing quote.
+ return eTriYes;
+ } else if ( currChar == eBOM_8_1 ) { // Start of the 8 bit form.
+ if ( ths->fCharForm != eChar8Bit ) return eTriNo;
+ ths->fBufferPtr++;
+ ths->fPosition = 12;
+ } else if ( currChar == eBOM_Big_1 ) { // Start of the 16 bit big endian form.
+ if ( ths->fCharForm != eChar16BitBig ) return eTriNo;
+ ths->fBufferPtr++;
+ ths->fPosition = 22;
+ } else if ( currChar == 0 ) { // Start of the 16 bit little endian or either 32 bit form.
+ if ( ths->fCharForm == eChar8Bit ) return eTriNo;
+ ths->fBufferPtr++;
+ ths->fPosition = 32;
+ } else {
+ return eTriNo;
+ }
+ break;
+
+ case 12 : // Look for the second byte of the 8 bit form.
+ if ( currChar != eBOM_8_2 ) return eTriNo;
+ ths->fPosition = 13;
+ ths->fBufferPtr++;
+ break;
+
+ case 13 : // Look for the third byte of the 8 bit form.
+ if ( currChar != eBOM_8_3 ) return eTriNo;
+ ths->fPosition = 99;
+ ths->fBufferPtr++;
+ break;
+
+ case 22 : // Look for the second byte of the 16 bit big endian form.
+ if ( currChar != eBOM_Big_2 ) return eTriNo;
+ ths->fPosition = 23;
+ ths->fBufferPtr++;
+ break;
+
+ case 23 : // Look for the null before the closing quote of the 16 bit big endian form.
+ if ( currChar != 0 ) return eTriNo;
+ ths->fBufferPtr++;
+ ths->fPosition = 99;
+ break;
+
+ case 32 : // Look at the second byte of the 16 bit little endian or either 32 bit form.
+ if ( currChar == eBOM_Little_1 ) {
+ ths->fPosition = 33;
+ } else if ( currChar == 0 ) {
+ ths->fPosition = 43;
+ } else {
+ return eTriNo;
+ }
+ ths->fBufferPtr++;
+ break;
+
+ case 33 : // Look for the third byte of the 16 bit little endian form.
+ if ( ths->fCharForm != eChar16BitBig ) return eTriNo; // Null count before assumed big endian.
+ if ( currChar != eBOM_Little_2 ) return eTriNo;
+ ths->fCharForm = eChar16BitLittle;
+ ths->fPosition = 99;
+ ths->fBufferPtr++;
+ break;
+
+ case 43 : // Look at the third byte of either 32 bit form.
+ if ( ths->fCharForm != eChar32BitBig ) return eTriNo; // Null count before assumed big endian.
+ if ( currChar == eBOM_Big_1 ) {
+ ths->fPosition = 44;
+ } else if ( currChar == 0 ) {
+ ths->fPosition = 54;
+ } else {
+ return eTriNo;
+ }
+ ths->fBufferPtr++;
+ break;
+
+ case 44 : // Look for the fourth byte of the 32 bit big endian form.
+ if ( currChar != eBOM_Big_2 ) return eTriNo;
+ ths->fPosition = 45;
+ ths->fBufferPtr++;
+ break;
+
+ case 45 : // Look for the first null before the closing quote of the 32 bit big endian form.
+ if ( currChar != 0 ) return eTriNo;
+ ths->fPosition = 56;
+ ths->fBufferPtr++;
+ break;
+
+ case 54 : // Look for the fourth byte of the 32 bit little endian form.
+ ths->fCharForm = eChar32BitLittle;
+ if ( currChar != eBOM_Little_1 ) return eTriNo;
+ ths->fPosition = 55;
+ ths->fBufferPtr++;
+ break;
+
+ case 55 : // Look for the fifth byte of the 32 bit little endian form.
+ if ( currChar != eBOM_Little_2 ) return eTriNo;
+ ths->fPosition = 56;
+ ths->fBufferPtr++;
+ break;
+
+ case 56 : // Look for the next to last null before the closing quote of the 32 bit forms.
+ if ( currChar != 0 ) return eTriNo;
+ ths->fPosition = 57;
+ ths->fBufferPtr++;
+ break;
+
+ case 57 : // Look for the last null before the closing quote of the 32 bit forms.
+ if ( currChar != 0 ) return eTriNo;
+ ths->fPosition = 99;
+ ths->fBufferPtr++;
+ break;
+
+ default : // Look for the closing quote.
+ assert ( ths->fPosition == 99 );
+ if ( currChar != ths->fQuoteChar ) return eTriNo;
+ ths->fBufferPtr += bytesPerChar; // Skip the nulls after the closing quote.
+ return eTriYes;
+ break;
+
+ }
+
+ }
+
+} // RecognizeBOM
+
+
+// =================================================================================================
+// RecordHeadAttr
+// ==============
+
+QEScanner::PacketMachine::TriState
+QEScanner::PacketMachine::RecordHeadAttr ( PacketMachine * ths, const char * /* unused */ )
+{
+
+ if ( ths->fAttrName == "encoding" ) {
+
+ assert ( ths->fEncodingAttr.empty() );
+ ths->fEncodingAttr = ths->fAttrValue;
+
+ } else if ( ths->fAttrName == "bytes" ) {
+
+ long value = 0;
+ size_t count = ths->fAttrValue.size();
+ size_t i;
+
+ assert ( ths->fBytesAttr == -1 );
+
+ if ( count > 0 ) { // Allow bytes='' to be the same as no bytes attribute.
+
+ for ( i = 0; i < count; i++ ) {
+ const char currChar = ths->fAttrValue[i];
+ if ( ('0' <= currChar) && (currChar <= '9') ) {
+ value = (value * 10) + (currChar - '0');
+ } else {
+ ths->fBogusPacket = true;
+ value = -1;
+ break;
+ }
+ }
+ ths->fBytesAttr = value;
+
+ if ( CharFormIs16Bit ( ths->fCharForm ) ) {
+ if ( (ths->fBytesAttr & 1) != 0 ) ths->fBogusPacket = true;
+ } else if ( CharFormIs32Bit ( ths->fCharForm ) ) {
+ if ( (ths->fBytesAttr & 3) != 0 ) ths->fBogusPacket = true;
+ }
+
+ }
+
+ }
+
+ ths->fAttrName.erase ( ths->fAttrName.begin(), ths->fAttrName.end() );
+ ths->fAttrValue.erase ( ths->fAttrValue.begin(), ths->fAttrValue.end() );
+
+ return eTriYes;
+
+} // RecordHeadAttr
+
+
+// =================================================================================================
+// CaptureAccess
+// =============
+
+QEScanner::PacketMachine::TriState
+QEScanner::PacketMachine::CaptureAccess ( PacketMachine * ths, const char * /* unused */ )
+{
+ const int bytesPerChar = ths->fBytesPerChar;
+
+ while ( true ) {
+
+ if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe;
+
+ const char currChar = *ths->fBufferPtr;
+
+ switch ( ths->fPosition ) {
+
+ case 0 : // Look for the opening quote.
+ if ( (currChar != '\'') && (currChar != '"') ) return eTriNo;
+ ths->fQuoteChar = currChar;
+ ths->fBufferPtr += bytesPerChar;
+ ths->fPosition = 1;
+ break; // ! Don't fall through, have to check for the end of the buffer between each byte.
+
+ case 1 : // Look for the 'r' or 'w'.
+ if ( (currChar != 'r') && (currChar != 'w') ) return eTriNo;
+ ths->fAccess = currChar;
+ ths->fBufferPtr += bytesPerChar;
+ ths->fPosition = 2;
+ break;
+
+ default : // Look for the closing quote.
+ assert ( ths->fPosition == 2 );
+ if ( currChar != ths->fQuoteChar ) return eTriNo;
+ ths->fBufferPtr += bytesPerChar;
+ return eTriYes;
+ break;
+
+ }
+
+ }
+
+} // CaptureAccess
+
+
+// =================================================================================================
+// RecordTailAttr
+// ==============
+
+QEScanner::PacketMachine::TriState
+QEScanner::PacketMachine::RecordTailAttr ( PacketMachine * ths, const char * /* unused */ )
+{
+
+ // There are no known "general" attributes for the packet trailer.
+
+ ths->fAttrName.erase ( ths->fAttrName.begin(), ths->fAttrName.end() );
+ ths->fAttrValue.erase ( ths->fAttrValue.begin(), ths->fAttrValue.end() );
+
+ return eTriYes;
+
+
+} // RecordTailAttr
+
+
+// =================================================================================================
+// CheckPacketEnd
+// ==============
+//
+// Check for trailing padding and record the packet length. We have trailing padding if the bytes
+// attribute is present and has a value greater than the current length.
+
+QEScanner::PacketMachine::TriState
+QEScanner::PacketMachine::CheckPacketEnd ( PacketMachine * ths, const char * /* unused */ )
+{
+ const int bytesPerChar = ths->fBytesPerChar;
+
+ if ( ths->fPosition == 0 ) { // First call, decide if there is trailing padding.
+
+ const SInt64 currLength = (ths->fBufferOffset + (ths->fBufferPtr - ths->fBufferOrigin)) - ths->fPacketStart;
+
+ if ( (ths->fBytesAttr != -1) && (ths->fBytesAttr != currLength) ) {
+ if ( ths->fBytesAttr < currLength ) {
+ ths->fBogusPacket = true; // The bytes attribute value is too small.
+ } else {
+ ths->fPosition = (signed long)(ths->fBytesAttr - currLength);
+ if ( (ths->fPosition % ths->fBytesPerChar) != 0 ) {
+ ths->fBogusPacket = true; // The padding is not a multiple of the character size.
+ ths->fPosition = (ths->fPosition / ths->fBytesPerChar) * ths->fBytesPerChar;
+ }
+ }
+ }
+
+ }
+
+ while ( ths->fPosition > 0 ) {
+
+ if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe;
+
+ const char currChar = *ths->fBufferPtr;
+
+ if ( (currChar != ' ') && (currChar != '\t') && (currChar != '\n') && (currChar != '\r') ) {
+ ths->fBogusPacket = true; // The padding is not whitespace.
+ break; // Stop the packet here.
+ }
+
+ ths->fPosition -= bytesPerChar;
+ ths->fBufferPtr += bytesPerChar;
+
+ }
+
+ ths->fPacketLength = (ths->fBufferOffset + (ths->fBufferPtr - ths->fBufferOrigin)) - ths->fPacketStart;
+ return eTriYes;
+
+} // CheckPacketEnd
+
+
+// =================================================================================================
+// CheckFinalNulls
+// ===============
+//
+// Do some special case processing for little endian characters. We have to make sure the presumed
+// nulls after the last character actually exist, i.e. that the stream does not end too soon. Note
+// that the prior character scanning has moved the buffer pointer to the address following the last
+// byte of the last character. I.e. we're already past the presumed nulls, so we can't check their
+// content. All we can do is verify that the stream does not end too soon.
+//
+// Doing this check is simple yet subtle. If we're still in the current buffer then the trailing
+// bytes obviously exist. If we're exactly at the end of the buffer then the bytes also exist.
+// The only question is when we're actually past this buffer, partly into the next buffer. This is
+// when "ths->fBufferPtr > ths->fBufferLimit" on entry. For that case we have to wait until we've
+// actually seen enough extra bytes of input.
+//
+// Since the normal buffer processing is already adjusting for this partial character overrun, all
+// that needs to be done here is wait until "ths->fBufferPtr <= ths->fBufferLimit" on entry. In
+// other words, if we're presently too far, ths->fBufferPtr will be adjusted by the amount of the
+// overflow the next time QEScanner::Scan is called. This might still be too far, so just keep
+// waiting for enough data to pass by.
+//
+// Note that there is a corresponding special case for big endian characters, we must decrement the
+// starting offset by the number of leading nulls. But we don't do that here, we leave it to the
+// outer code. This is because the leading nulls might have been at the exact end of a previous
+// buffer, in which case we have to also decrement the length of that raw data snip.
+
+QEScanner::PacketMachine::TriState
+QEScanner::PacketMachine::CheckFinalNulls ( PacketMachine * ths, const char * /* unused */ )
+{
+
+ if ( (ths->fCharForm != eChar8Bit) && CharFormIsLittleEndian ( ths->fCharForm ) ) {
+ if ( ths->fBufferPtr > ths->fBufferLimit ) return eTriMaybe;
+ }
+
+ return eTriYes;
+
+} // CheckFinalNulls
+
+
+// =================================================================================================
+// SetNextRecognizer
+// =================
+
+void
+QEScanner::PacketMachine::SetNextRecognizer ( RecognizerKind nextRecognizer )
+{
+
+ fRecognizer = nextRecognizer;
+ fPosition = 0;
+
+} // SetNextRecognizer
+
+
+// =================================================================================================
+// FindNextPacket
+// ==============
+
+// *** When we start validating intervening nulls for 2 and 4 bytes characters, throw an exception
+// *** for errors. Don't return eTriNo, that might skip at an optional point.
+
+QEScanner::PacketMachine::TriState
+QEScanner::PacketMachine::FindNextPacket ()
+{
+
+ TriState status;
+
+ #define kPacketHead "?xpacket begin="
+ #define kPacketID "W5M0MpCehiHzreSzNTczkc9d"
+ #define kPacketTail "?xpacket end="
+
+ static const RecognizerInfo recognizerTable [eRecognizerCount] = { // ! Would be safer to assign these explicitly.
+
+ // proc successNext failureNext literal
+
+ { NULL, eFailureRecognizer, eFailureRecognizer, NULL}, // eFailureRecognizer
+ { NULL, eSuccessRecognizer, eSuccessRecognizer, NULL}, // eSuccessRecognizer
+
+ { FindLessThan, eHeadStartRecorder, eFailureRecognizer, "H" }, // eLeadInRecognizer
+ { RecordStart, eHeadStartRecognizer, eLeadInRecognizer, NULL }, // eHeadStartRecorder
+ { MatchString, eBOMRecognizer, eLeadInRecognizer, kPacketHead }, // eHeadStartRecognizer
+
+ { RecognizeBOM, eIDTagRecognizer, eLeadInRecognizer, NULL }, // eBOMRecognizer
+
+ { MatchString, eIDOpenRecognizer, eLeadInRecognizer, " id=" }, // eIDTagRecognizer
+ { MatchOpenQuote, eIDValueRecognizer, eLeadInRecognizer, NULL }, // eIDOpenRecognizer
+ { MatchString, eIDCloseRecognizer, eLeadInRecognizer, kPacketID }, // eIDValueRecognizer
+ { MatchCloseQuote, eAttrSpaceRecognizer_1, eLeadInRecognizer, NULL }, // eIDCloseRecognizer
+
+ { MatchChar, eAttrNameRecognizer_1, eHeadEndRecognizer, " " }, // eAttrSpaceRecognizer_1
+ { CaptureAttrName, eAttrValueRecognizer_1, eLeadInRecognizer, NULL }, // eAttrNameRecognizer_1
+ { CaptureAttrValue, eAttrValueRecorder_1, eLeadInRecognizer, NULL }, // eAttrValueRecognizer_1
+ { RecordHeadAttr, eAttrSpaceRecognizer_1, eLeadInRecognizer, NULL }, // eAttrValueRecorder_1
+
+ { MatchString, eBodyRecognizer, eLeadInRecognizer, "?>" }, // eHeadEndRecognizer
+
+ { FindLessThan, eTailStartRecognizer, eBodyRecognizer, "T"}, // eBodyRecognizer
+
+ { MatchString, eAccessValueRecognizer, eBodyRecognizer, kPacketTail }, // eTailStartRecognizer
+ { CaptureAccess, eAttrSpaceRecognizer_2, eBodyRecognizer, NULL }, // eAccessValueRecognizer
+
+ { MatchChar, eAttrNameRecognizer_2, eTailEndRecognizer, " " }, // eAttrSpaceRecognizer_2
+ { CaptureAttrName, eAttrValueRecognizer_2, eBodyRecognizer, NULL }, // eAttrNameRecognizer_2
+ { CaptureAttrValue, eAttrValueRecorder_2, eBodyRecognizer, NULL }, // eAttrValueRecognizer_2
+ { RecordTailAttr, eAttrSpaceRecognizer_2, eBodyRecognizer, NULL }, // eAttrValueRecorder_2
+
+ { MatchString, ePacketEndRecognizer, eBodyRecognizer, "?>" }, // eTailEndRecognizer
+ { CheckPacketEnd, eCloseOutRecognizer, eBodyRecognizer, "" }, // ePacketEndRecognizer
+ { CheckFinalNulls, eSuccessRecognizer, eBodyRecognizer, "" } // eCloseOutRecognizer
+
+ };
+
+ while ( true ) {
+
+ switch ( fRecognizer ) {
+
+ case eFailureRecognizer :
+ return eTriNo;
+
+ case eSuccessRecognizer :
+ return eTriYes;
+
+ default :
+
+ // -------------------------------------------------------------------
+ // For everything else, the normal cases, use the state machine table.
+
+ const RecognizerInfo * thisState = &recognizerTable [fRecognizer];
+
+ status = thisState->proc ( this, thisState->literal );
+
+ switch ( status ) {
+
+ case eTriNo :
+ SetNextRecognizer ( thisState->failureNext );
+ continue;
+
+ case eTriYes :
+ SetNextRecognizer ( thisState->successNext );
+ continue;
+
+ case eTriMaybe :
+ fBufferOverrun = (unsigned char)(fBufferPtr - fBufferLimit);
+ return eTriMaybe; // Keep this recognizer intact, to be resumed later.
+
+ }
+
+ } // switch ( fRecognizer ) { ...
+
+ } // while ( true ) { ...
+
+} // FindNextPacket
+
+
+// =================================================================================================
+// =================================================================================================
+// class InternalSnip
+// ==================
+
+
+// =================================================================================================
+// InternalSnip
+// ============
+
+QEScanner::InternalSnip::InternalSnip ( SInt64 offset, SInt64 length )
+{
+
+ fInfo.fOffset = offset;
+ fInfo.fLength = length;
+
+} // InternalSnip
+
+
+// =================================================================================================
+// InternalSnip
+// ============
+
+QEScanner::InternalSnip::InternalSnip ( const InternalSnip & rhs ) :
+ fInfo ( rhs.fInfo ),
+ fMachine ( NULL )
+{
+
+ assert ( rhs.fMachine.get() == NULL ); // Don't copy a snip with a machine.
+ assert ( (rhs.fInfo.fEncodingAttr == 0) || (*rhs.fInfo.fEncodingAttr == 0) ); // Don't copy a snip with an encoding.
+
+} // InternalSnip
+
+
+// =================================================================================================
+// ~InternalSnip
+// =============
+
+QEScanner::InternalSnip::~InternalSnip ()
+{
+} // ~InternalSnip
+
+
+
+// =================================================================================================
+// =================================================================================================
+// class QEScanner
+// ================
+
+
+// =================================================================================================
+// DumpSnipList
+// ============
+
+static const char * snipStateName [6] = { "not-seen", "pending", "raw-data", "good-packet", "partial", "bad-packet" };
+
+void
+QEScanner::DumpSnipList ( const char * title )
+{
+#if 1
+ InternalSnipIterator currPos = fInternalSnips.begin();
+ InternalSnipIterator endPos = fInternalSnips.end();
+
+ cout << endl << title << " snip list: " << fInternalSnips.size() << endl;
+
+ for ( ; currPos != endPos; ++currPos ) {
+ SnipInfo * currSnip = &currPos->fInfo;
+ cout << '\t' << currSnip << ' ' << snipStateName[currSnip->fState] << ' '
+ << currSnip->fOffset << ".." << (currSnip->fOffset + currSnip->fLength - 1)
+ << ' ' << currSnip->fLength << ' ' << endl;
+ }
+#endif
+} // DumpSnipList
+
+
+// =================================================================================================
+// PrevSnip and NextSnip
+// =====================
+
+QEScanner::InternalSnipIterator
+QEScanner::PrevSnip ( InternalSnipIterator snipPos )
+{
+
+ InternalSnipIterator prev = snipPos;
+ return --prev;
+
+} // PrevSnip
+
+QEScanner::InternalSnipIterator
+QEScanner::NextSnip ( InternalSnipIterator snipPos )
+{
+
+ InternalSnipIterator next = snipPos;
+ return ++next;
+
+} // NextSnip
+
+
+// =================================================================================================
+// QEScanner
+// ==========
+//
+// Initialize the scanner object with one "not seen" snip covering the whole stream.
+
+QEScanner::QEScanner ( SInt64 streamLength ) :
+
+ fStreamLength ( streamLength )
+
+{
+ InternalSnip rootSnip ( 0, streamLength );
+
+ if ( streamLength > 0 ) fInternalSnips.push_front ( rootSnip ); // Be nice for empty files.
+ // DumpSnipList ( "New QEScanner" );
+
+} // QEScanner
+
+
+// =================================================================================================
+// ~QEScanner
+// ===========
+
+QEScanner::~QEScanner()
+{
+
+} // ~QEScanner
+
+
+// =================================================================================================
+// GetSnipCount
+// ============
+
+size_t
+QEScanner::GetSnipCount ()
+{
+
+ return fInternalSnips.size();
+
+} // GetSnipCount
+
+
+// =================================================================================================
+// StreamAllScanned
+// ================
+
+bool
+QEScanner::StreamAllScanned ()
+{
+ InternalSnipIterator currPos = fInternalSnips.begin();
+ InternalSnipIterator endPos = fInternalSnips.end();
+
+ for ( ; currPos != endPos; ++currPos ) {
+ if ( currPos->fInfo.fState == eNotSeenSnip ) return false;
+ }
+ return true;
+
+} // StreamAllScanned
+
+
+// =================================================================================================
+// SplitInternalSnip
+// =================
+//
+// Split the given snip into up to 3 pieces. The new pieces are inserted before and after this one
+// in the snip list. The relOffset is the first byte to be kept, it is relative to this snip. If
+// the preceeding or following snips have the same state as this one, just shift the boundaries.
+// I.e. move the contents from one snip to the other, don't create a new snip.
+
+// *** To be thread safe we ought to lock the entire list during manipulation. Let data scanning
+// *** happen in parallel, serialize all mucking with the list.
+
+void
+QEScanner::SplitInternalSnip ( InternalSnipIterator snipPos, SInt64 relOffset, SInt64 newLength )
+{
+
+ assert ( (relOffset + newLength) > relOffset ); // Check for overflow.
+ assert ( (relOffset + newLength) <= snipPos->fInfo.fLength );
+
+ // -----------------------------------
+ // First deal with the low offset end.
+
+ if ( relOffset > 0 ) {
+
+ InternalSnipIterator prevPos;
+ if ( snipPos != fInternalSnips.begin() ) prevPos = PrevSnip ( snipPos );
+
+ if ( (snipPos != fInternalSnips.begin()) && (snipPos->fInfo.fState == prevPos->fInfo.fState) ) {
+ prevPos->fInfo.fLength += relOffset; // Adjust the preceeding snip.
+ } else {
+ InternalSnip headExcess ( snipPos->fInfo.fOffset, relOffset );
+ headExcess.fInfo.fState = snipPos->fInfo.fState;
+ headExcess.fInfo.fOutOfOrder = snipPos->fInfo.fOutOfOrder;
+ fInternalSnips.insert ( snipPos, headExcess ); // Insert the head piece before the middle piece.
+ }
+
+ snipPos->fInfo.fOffset += relOffset; // Adjust the remainder of this snip.
+ snipPos->fInfo.fLength -= relOffset;
+
+ }
+
+ // ----------------------------------
+ // Now deal with the high offset end.
+
+ if ( newLength < snipPos->fInfo.fLength ) {
+
+ InternalSnipIterator nextPos = NextSnip ( snipPos );
+ const SInt64 tailLength = snipPos->fInfo.fLength - newLength;
+
+ if ( (nextPos != fInternalSnips.end()) && (snipPos->fInfo.fState == nextPos->fInfo.fState) ) {
+ nextPos->fInfo.fOffset -= tailLength; // Adjust the following snip.
+ nextPos->fInfo.fLength += tailLength;
+ } else {
+ InternalSnip tailExcess ( (snipPos->fInfo.fOffset + newLength), tailLength );
+ tailExcess.fInfo.fState = snipPos->fInfo.fState;
+ tailExcess.fInfo.fOutOfOrder = snipPos->fInfo.fOutOfOrder;
+ fInternalSnips.insert ( nextPos, tailExcess ); // Insert the tail piece after the middle piece.
+ }
+
+ snipPos->fInfo.fLength = newLength;
+
+ }
+
+} // SplitInternalSnip
+
+
+// =================================================================================================
+// MergeInternalSnips
+// ==================
+
+QEScanner::InternalSnipIterator
+QEScanner::MergeInternalSnips ( InternalSnipIterator firstPos, InternalSnipIterator secondPos )
+{
+
+ firstPos->fInfo.fLength += secondPos->fInfo.fLength;
+ fInternalSnips.erase ( secondPos );
+ return firstPos;
+
+} // MergeInternalSnips
+
+
+// =================================================================================================
+// Scan
+// ====
+
+void
+QEScanner::Scan ( const void * bufferOrigin, SInt64 bufferOffset, SInt64 bufferLength )
+{
+ SInt64 relOffset;
+
+ #if 0
+ cout << "Scan: @ " << bufferOrigin << ", " << bufferOffset << ", " << bufferLength << endl;
+ #endif
+
+ if ( bufferLength == 0 ) return;
+
+ // ----------------------------------------------------------------
+ // These comparisons are carefully done to avoid overflow problems.
+
+ if ( (bufferOffset >= fStreamLength) ||
+ (bufferLength > (fStreamLength - bufferOffset)) ||
+ (bufferOrigin == 0) ) {
+ throw ScanError ( "Bad origin, offset, or length" );
+ }
+
+ // ----------------------------------------------------------------------------------------------
+ // This buffer must be within a not-seen snip. Find it and split it. The first snip whose whose
+ // end is beyond the buffer must be the enclosing one.
+
+ // *** It would be friendly for rescans for out of order problems to accept any buffer postion.
+
+ const SInt64 endOffset = bufferOffset + bufferLength - 1;
+ InternalSnipIterator snipPos = fInternalSnips.begin();
+
+ while ( endOffset > (snipPos->fInfo.fOffset + snipPos->fInfo.fLength - 1) ) ++ snipPos;
+ if ( snipPos->fInfo.fState != eNotSeenSnip ) throw ScanError ( "Already seen" );
+
+ relOffset = bufferOffset - snipPos->fInfo.fOffset;
+ if ( (relOffset + bufferLength) > snipPos->fInfo.fLength ) throw ScanError ( "Not within existing snip" );
+
+ SplitInternalSnip ( snipPos, relOffset, bufferLength ); // *** If sequential & prev is partial, just tack on,
+
+ // --------------------------------------------------------
+ // Merge this snip with the preceeding snip if appropriate.
+
+ // *** When out of order I/O is supported we have to do something about buffers who's predecessor is not seen.
+
+ if ( snipPos->fInfo.fOffset > 0 ) {
+ InternalSnipIterator prevPos = PrevSnip ( snipPos );
+ if ( prevPos->fInfo.fState == ePartialPacketSnip ) snipPos = MergeInternalSnips ( prevPos, snipPos );
+ }
+
+ // ----------------------------------
+ // Look for packets within this snip.
+
+ snipPos->fInfo.fState = ePendingSnip;
+ PacketMachine* thisMachine = snipPos->fMachine.get();
+ // DumpSnipList ( "Before scan" );
+
+ if ( thisMachine != 0 ) {
+ thisMachine->AssociateBuffer ( bufferOffset, bufferOrigin, bufferLength );
+ } else {
+ // *** snipPos->fMachine.reset ( new PacketMachine ( bufferOffset, bufferOrigin, bufferLength ) ); VC++ lacks reset
+ #if 0
+ snipPos->fMachine = auto_ptr<PacketMachine> ( new PacketMachine ( bufferOffset, bufferOrigin, bufferLength ) );
+ #else
+ {
+ // Some versions of gcc complain about the assignment operator above. This avoids the gcc bug.
+ PacketMachine * pm = new PacketMachine ( bufferOffset, bufferOrigin, bufferLength );
+ auto_ptr<PacketMachine> ap ( pm );
+ snipPos->fMachine = ap;
+ }
+ #endif
+ thisMachine = snipPos->fMachine.get();
+ }
+
+ bool bufferDone = false;
+ while ( ! bufferDone ) {
+
+ PacketMachine::TriState foundPacket = thisMachine->FindNextPacket();
+
+ if ( foundPacket == PacketMachine::eTriNo ) {
+
+ // -----------------------------------------------------------------------
+ // No packet, mark the snip as raw data and get rid of the packet machine.
+ // We're done with this buffer.
+
+ snipPos->fInfo.fState = eRawInputSnip;
+ #if 0
+ snipPos->fMachine = auto_ptr<PacketMachine>(); // *** snipPos->fMachine.reset(); VC++ lacks reset
+ #else
+ {
+ // Some versions of gcc complain about the assignment operator above. This avoids the gcc bug.
+ auto_ptr<PacketMachine> ap ( 0 );
+ snipPos->fMachine = ap;
+ }
+ #endif
+ bufferDone = true;
+
+ } else {
+
+ // ---------------------------------------------------------------------------------------------
+ // Either a full or partial packet. First trim any excess off of the front as a raw input snip.
+ // If this is a partial packet mark the snip and keep the packet machine to be resumed later.
+ // We're done with this buffer, the partial packet by definition extends to the end. If this is
+ // a complete packet first extract the additional information from the packet machine. If there
+ // is leftover data split the snip and transfer the packet machine to the new trailing snip.
+
+ if ( thisMachine->fPacketStart > snipPos->fInfo.fOffset ) {
+
+ // There is data at the front of the current snip that must be trimmed.
+ SnipState savedState = snipPos->fInfo.fState;
+ snipPos->fInfo.fState = eRawInputSnip; // ! So it gets propagated to the trimmed front part.
+ relOffset = thisMachine->fPacketStart - snipPos->fInfo.fOffset;
+ SplitInternalSnip ( snipPos, relOffset, (snipPos->fInfo.fLength - relOffset) );
+ snipPos->fInfo.fState = savedState;
+
+ }
+
+ if ( foundPacket == PacketMachine::eTriMaybe ) {
+
+ // We have only found a partial packet.
+ snipPos->fInfo.fState = ePartialPacketSnip;
+ bufferDone = true;
+
+ } else {
+
+ // We have found a complete packet. Extract all the info for it and split any trailing data.
+
+ InternalSnipIterator packetSnip = snipPos;
+ SnipState packetState = eValidPacketSnip;
+
+ if ( thisMachine->fBogusPacket ) packetState = eBadPacketSnip;
+
+ packetSnip->fInfo.fAccess = thisMachine->fAccess;
+ packetSnip->fInfo.fCharForm = thisMachine->fCharForm;
+ packetSnip->fInfo.fBytesAttr = thisMachine->fBytesAttr;
+ packetSnip->fInfo.fEncodingAttr = thisMachine->fEncodingAttr.c_str();
+ thisMachine->fEncodingAttr.erase ( thisMachine->fEncodingAttr.begin(), thisMachine->fEncodingAttr.end() );
+
+ if ( (thisMachine->fCharForm != eChar8Bit) && CharFormIsBigEndian ( thisMachine->fCharForm ) ) {
+
+ // ------------------------------------------------------------------------------
+ // Handle a special case for big endian characters. The packet machine works as
+ // though things were little endian. The packet starting offset points to the
+ // byte containing the opening '<', and the length includes presumed nulls that
+ // follow the last "real" byte. If the characters are big endian we now have to
+ // decrement the starting offset of the packet, and also decrement the length of
+ // the previous snip.
+ //
+ // Note that we can't do this before the head trimming above in general. The
+ // nulls might have been exactly at the end of a buffer and already in the
+ // previous snip. We are doing this before trimming the tail from the raw snip
+ // containing the packet. We adjust the raw snip's size because it ends with
+ // the input buffer. We don't adjust the packet's size, it is already correct.
+ //
+ // The raw snip (the one before the packet) might entirely disappear. A simple
+ // example of this is when the packet is at the start of the file.
+
+ assert ( packetSnip != fInternalSnips.begin() ); // Leading nulls were trimmed!
+
+ if ( packetSnip != fInternalSnips.begin() ) { // ... but let's program defensibly.
+
+ InternalSnipIterator prevSnip = PrevSnip ( packetSnip );
+ const unsigned int nullsToAdd = ( CharFormIs16Bit ( thisMachine->fCharForm ) ? 1 : 3 );
+
+ assert ( nullsToAdd <= prevSnip->fInfo.fLength );
+ prevSnip->fInfo.fLength -= nullsToAdd;
+ if ( prevSnip->fInfo.fLength == 0 ) (void) fInternalSnips.erase ( prevSnip );
+
+ packetSnip->fInfo.fOffset -= nullsToAdd;
+ packetSnip->fInfo.fLength += nullsToAdd;
+ thisMachine->fPacketStart -= nullsToAdd;
+
+ }
+
+ }
+
+ if ( thisMachine->fPacketLength == snipPos->fInfo.fLength ) {
+
+ // This packet ends exactly at the end of the current snip.
+ #if 0
+ snipPos->fMachine = auto_ptr<PacketMachine>(); // *** snipPos->fMachine.reset(); VC++ lacks reset
+ #else
+ {
+ // Some versions of gcc complain about the assignment operator above. This avoids the gcc bug.
+ auto_ptr<PacketMachine> ap ( 0 );
+ snipPos->fMachine = ap;
+ }
+ #endif
+ bufferDone = true;
+
+ } else {
+
+ // There is trailing data to split from the just found packet.
+ SplitInternalSnip ( snipPos, 0, thisMachine->fPacketLength );
+
+ InternalSnipIterator tailPos = NextSnip ( snipPos );
+
+ tailPos->fMachine = snipPos->fMachine; // auto_ptr assignment - taking ownership
+ thisMachine->ResetMachine ();
+
+ snipPos = tailPos;
+
+ }
+
+ packetSnip->fInfo.fState = packetState; // Do this last to avoid messing up the tail split.
+ // DumpSnipList ( "Found a packet" );
+
+
+ }
+
+ }
+
+ }
+
+ // --------------------------------------------------------
+ // Merge this snip with the preceeding snip if appropriate.
+
+ // *** When out of order I/O is supported we have to check the following snip too.
+
+ if ( (snipPos->fInfo.fOffset > 0) && (snipPos->fInfo.fState == eRawInputSnip) ) {
+ InternalSnipIterator prevPos = PrevSnip ( snipPos );
+ if ( prevPos->fInfo.fState == eRawInputSnip ) snipPos = MergeInternalSnips ( prevPos, snipPos );
+ }
+
+ // DumpSnipList ( "After scan" );
+
+} // Scan
+
+
+// =================================================================================================
+// Report
+// ======
+
+void
+QEScanner::Report ( SnipInfoVector& snips )
+{
+ const size_t count = fInternalSnips.size();
+ InternalSnipIterator snipPos = fInternalSnips.begin();
+
+ size_t s;
+
+ // DumpSnipList ( "Report" );
+
+ snips.erase ( snips.begin(), snips.end() ); // ! Should use snips.clear, but VC++ doesn't have it.
+ snips.reserve ( count );
+
+ for ( s = 0; s < count; s += 1 ) {
+ snips.push_back ( SnipInfo ( snipPos->fInfo.fState, snipPos->fInfo.fOffset, snipPos->fInfo.fLength ) );
+ snips[s] = snipPos->fInfo; // Pick up all of the fields.
+ ++ snipPos;
+ }
+
+} // Report
diff --git a/samples/source/common/QEScanner.hpp b/samples/source/common/QEScanner.hpp
new file mode 100644
index 0000000..0c24dce
--- /dev/null
+++ b/samples/source/common/QEScanner.hpp
@@ -0,0 +1,331 @@
+#ifndef __QEScanner_hpp__
+#define __QEScanner_hpp__
+
+// =================================================================================================
+// Copyright 2002-2005 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+//
+// Adobe patent application tracking #P435, entitled 'Unique markers to simplify embedding data of
+// one format in a file with a different format', inventors: Sean Parent, Greg Gilley.
+// =================================================================================================
+
+#include <list>
+#include <vector>
+#include <string>
+#include <memory>
+#include <stdexcept>
+
+// =================================================================================================
+// The QEScanner class is used to scan a stream of input for XMP packets. A scanner object is
+// constructed then fed the input through a series of calls to Scan. Report may be called at any
+// time to get the current knowledge of the input.
+//
+// A packet starts when a valid header is found and ends when a valid trailer is found. If the
+// header contains a "bytes" attribute, additional whitespace must follow.
+//
+// *** RESTRICTIONS: The current implementation of the scanner has the the following restrictions:
+// - The input must be presented in order.
+// - Not fully thread safe, don't make concurrent calls to the same QEScanner object.
+// =================================================================================================
+
+class QEScanner {
+public:
+
+ // =============================================================================================
+ // The entire input stream is represented as a series of snips. Each snip defines one portion
+ // of the input stream that either has not been seen, has been seen and contains no packets, is
+ // exactly one packet, or contains the start of an unfinished packet. Adjacent snips with the
+ // same state are merged, so the number of snips is always minimal.
+ //
+ // A newly constructed QEScanner object has one snip covering the whole input with a state
+ // of "not seen". A block of input that contains a full XMP packet is split into 3 parts: a
+ // (possibly empty) raw input snip, the packet, and another (possibly empty) raw input snip. A
+ // block of input that contains the start of an XMP packet is split into two snips, a (possibly
+ // empty) raw input snip and the packet start; the following snip must be a "not seen" snip.
+ //
+ // It is possible to have ill-formed packets. These have a syntactically valid header and
+ // trailer, but some semantic error. For example, if the "bytes" attribute length does not span
+ // to the end of the trailer, or if the following packet begins within trailing padding.
+
+ typedef unsigned char UInt8;
+ typedef unsigned long UInt32;
+ typedef long long SInt64;
+
+ enum {
+ eNotSeenSnip, // This snip has not been seen yet.
+ ePendingSnip, // This snip is an input buffer being processed.
+ eRawInputSnip, // This snip is raw input, it doesn't contain any part of an XMP packet.
+ eValidPacketSnip, // This snip is a complete, valid XMP packet.
+ ePartialPacketSnip, // This snip contains the start of a possible XMP packet.
+ eBadPacketSnip // This snip contains a complete, but semantically incorrect XMP packet.
+ };
+ typedef UInt8 SnipState;
+
+ enum { // The values allow easy testing for 16/32 bit and big/little endian.
+ eChar8Bit = 0,
+ eChar16BitBig = 2,
+ eChar16BitLittle = 3,
+ eChar32BitBig = 4,
+ eChar32BitLittle = 5
+ };
+ typedef UInt8 CharacterForm;
+
+ enum {
+ eChar16BitMask = 2, // These constant shouldn't be used directly, they are mainly
+ eChar32BitMask = 4, // for the CharFormIsXyz macros below.
+ eCharLittleEndianMask = 1
+ };
+
+ #define CharFormIs16Bit(f) ( ((int)(f) & QEScanner::eChar16BitMask) != 0 )
+ #define CharFormIs32Bit(f) ( ((int)(f) & QEScanner::eChar32BitMask) != 0 )
+
+ #define CharFormIsBigEndian(f) ( ((int)(f) & QEScanner::eCharLittleEndianMask) == 0 )
+ #define CharFormIsLittleEndian(f) ( ((int)(f) & QEScanner::eCharLittleEndianMask) != 0 )
+
+ struct SnipInfo {
+
+ SInt64 fOffset; // The byte offset of this snip within the input stream.
+ SInt64 fLength; // The length in bytes of this snip.
+ SnipState fState; // The state of this snip.
+ bool fOutOfOrder; // If true, this snip was seen before the one in front of it.
+ char fAccess; // The read-only/read-write access from the end attribute.
+ CharacterForm fCharForm; // How the packet is divided into characters.
+ const char * fEncodingAttr; // The value of the encoding attribute, if any, with nulls removed.
+ SInt64 fBytesAttr; // The value of the bytes attribute, -1 if not present.
+
+ SnipInfo() :
+ fOffset ( 0 ),
+ fLength ( 0 ),
+ fState ( eNotSeenSnip ),
+ fOutOfOrder ( false ),
+ fAccess ( ' ' ),
+ fCharForm ( eChar8Bit ),
+ fEncodingAttr ( "" ),
+ fBytesAttr( -1 )
+ { }
+
+ SnipInfo ( SnipState state, SInt64 offset, SInt64 length ) :
+ fOffset ( offset ),
+ fLength ( length ),
+ fState ( state ),
+ fOutOfOrder ( false ),
+ fAccess ( ' ' ),
+ fCharForm ( eChar8Bit ),
+ fEncodingAttr ( "" ),
+ fBytesAttr( -1 )
+ { }
+
+ };
+
+ typedef std::vector<SnipInfo> SnipInfoVector;
+
+ QEScanner ( SInt64 streamLength );
+ // Constructs a new QEScanner object for a stream with the given length.
+
+ ~QEScanner();
+
+ size_t GetSnipCount();
+ // Returns the number of snips that the stream has been divided into.
+
+ bool StreamAllScanned();
+ // Returns true if all of the stream has been seen.
+
+ void Scan ( const void * bufferOrigin, SInt64 bufferOffset, SInt64 bufferLength );
+ // Scans the given part of the input, incorporating it in to the known snips.
+ // The bufferOffset is the offset of this block of input relative to the entire stream.
+ // The bufferLength is the length in bytes of this block of input.
+
+ void Report ( SnipInfoVector & snips );
+ // Produces a report of what is known about the input stream.
+
+ class ScanError : public std::logic_error {
+ public:
+ ScanError() throw() : std::logic_error ( "" ) {}
+ explicit ScanError ( const char * message ) throw() : std::logic_error ( message ) {}
+ virtual ~ScanError() throw() {}
+ };
+
+private: // QEScanner
+
+ class PacketMachine;
+
+ class InternalSnip {
+ public:
+
+ SnipInfo fInfo; // The public info about this snip.
+ std::auto_ptr<PacketMachine> fMachine; // The state machine for "active" snips.
+
+ InternalSnip() {}; // Let everything default.
+ InternalSnip ( SInt64 offset, SInt64 length );
+ InternalSnip ( const InternalSnip & );
+ ~InternalSnip();
+
+ }; // InternalSnip
+
+ typedef std::list<InternalSnip> InternalSnipList;
+ typedef InternalSnipList::iterator InternalSnipIterator;
+
+ class PacketMachine {
+ public:
+
+ SInt64 fPacketStart; // Byte offset relative to the entire stream.
+ SInt64 fPacketLength; // Length in bytes to the end of the trailer processing instruction.
+ SInt64 fBytesAttr; // The value of the bytes attribute, -1 if not present.
+ std::string fEncodingAttr; // The value of the encoding attribute, if any, with nulls removed.
+ CharacterForm fCharForm; // How the packet is divided into characters.
+ char fAccess; // The read-only/read-write access from the end attribute.
+ bool fBogusPacket; // True if the packet has an error such as a bad "bytes" attribute value.
+
+ void ResetMachine();
+
+ enum TriState {
+ eTriNo,
+ eTriMaybe,
+ eTriYes
+ };
+
+ TriState FindNextPacket();
+
+ void AssociateBuffer ( SInt64 bufferOffset, const void * bufferOrigin, SInt64 bufferLength );
+
+ PacketMachine ( SInt64 bufferOffset, const void * bufferOrigin, SInt64 bufferLength );
+ ~PacketMachine();
+
+ private: // PacketMachine
+
+ PacketMachine() {}; // ! Hide the default constructor.
+
+ enum RecognizerKind {
+
+ eFailureRecognizer, // Not really recognizers, special states to end one buffer's processing.
+ eSuccessRecognizer,
+
+ eLeadInRecognizer, // Anything up to the next '<'.
+ eHeadStartRecorder, // Save the starting offset, count intervening nulls.
+ eHeadStartRecognizer, // The literal string "?xpacket begin=".
+
+ eBOMRecognizer, // Recognize and record the quoted byte order marker.
+
+ eIDTagRecognizer, // The literal string " id=".
+ eIDOpenRecognizer, // The opening quote for the ID.
+ eIDValueRecognizer, // The literal string "W5M0MpCehiHzreSzNTczkc9d".
+ eIDCloseRecognizer, // The closing quote for the ID.
+
+ eAttrSpaceRecognizer_1, // The space before an attribute.
+ eAttrNameRecognizer_1, // The name of an attribute.
+ eAttrValueRecognizer_1, // The equal sign and quoted string value for an attribute.
+ eAttrValueRecorder_1, // Record the value of an attribute.
+
+ eHeadEndRecognizer, // The string literal "?>".
+
+ eBodyRecognizer, // The packet body, anything up to the next '<'.
+
+ eTailStartRecognizer, // The string literal "?xpacket end=".
+ eAccessValueRecognizer, // Recognize and record the quoted r/w access mode.
+
+ eAttrSpaceRecognizer_2, // The space before an attribute.
+ eAttrNameRecognizer_2, // The name of an attribute.
+ eAttrValueRecognizer_2, // The equal sign and quoted string value for an attribute.
+ eAttrValueRecorder_2, // Record the value of an attribute.
+
+ eTailEndRecognizer, // The string literal "?>".
+ ePacketEndRecognizer, // Look for trailing padding, check and record the packet size.
+ eCloseOutRecognizer, // Look for final nulls for little endian multibyte characters.
+
+ eRecognizerCount
+
+ };
+
+ SInt64 fBufferOffset; // The offset of the data buffer within the input stream.
+ const char * fBufferOrigin; // The starting address of the data buffer for this snip.
+ const char * fBufferPtr; // The current postion in the data buffer.
+ const char * fBufferLimit; // The address one past the last byte in the data buffer.
+
+ RecognizerKind fRecognizer; // Which recognizer is currently active.
+ /*signed long*/ size_t fPosition; // The internal position within a string literal, etc.
+ unsigned char fBytesPerChar; // The number of bytes per logical character, 1, 2, or 4.
+ unsigned char fBufferOverrun; // Non-zero if suspended while skipping intervening nulls.
+ char fQuoteChar; // The kind of quote seen at the start of a quoted value.
+ std::string fAttrName; // The name for an arbitrary attribute (other than "begin" and "id").
+ std::string fAttrValue; // The value for an arbitrary attribute (other than "begin" and "id").
+
+ void SetNextRecognizer ( RecognizerKind nextRecognizer );
+
+ typedef TriState (* RecognizerProc) ( PacketMachine *, const char * );
+
+ static TriState
+ FindLessThan ( PacketMachine * ths, const char * which );
+
+ static TriState
+ MatchString ( PacketMachine * ths, const char * literal );
+
+ static TriState
+ MatchChar ( PacketMachine * ths, const char * literal );
+
+ static TriState
+ MatchOpenQuote ( PacketMachine * ths, const char * /* unused */ );
+
+ static TriState
+ MatchCloseQuote ( PacketMachine * ths, const char * /* unused */ );
+
+ static TriState
+ CaptureAttrName ( PacketMachine * ths, const char * /* unused */ );
+
+ static TriState
+ CaptureAttrValue ( PacketMachine * ths, const char * /* unused */ );
+
+ static TriState
+ RecordStart ( PacketMachine * ths, const char * /* unused */ );
+
+ static TriState
+ RecognizeBOM ( PacketMachine * ths, const char * /* unused */ );
+
+ static TriState
+ RecordHeadAttr ( PacketMachine * ths, const char * /* unused */ );
+
+ static TriState
+ CaptureAccess ( PacketMachine * ths, const char * /* unused */ );
+
+ static TriState
+ RecordTailAttr ( PacketMachine * ths, const char * /* unused */ );
+
+ static TriState
+ CheckPacketEnd ( PacketMachine * ths, const char * /* unused */ );
+
+ static TriState
+ CheckFinalNulls ( PacketMachine * ths, const char * /* unused */ );
+
+ struct RecognizerInfo {
+ RecognizerProc proc;
+ RecognizerKind successNext;
+ RecognizerKind failureNext;
+ const char * literal;
+ };
+
+ }; // PacketMachine
+
+ SInt64 fStreamLength;
+ InternalSnipList fInternalSnips;
+
+ void
+ SplitInternalSnip ( InternalSnipIterator snipPos, SInt64 relOffset, SInt64 newLength );
+
+ InternalSnipIterator
+ MergeInternalSnips ( InternalSnipIterator firstPos, InternalSnipIterator secondPos );
+
+ void
+ DumpSnipList ( const char * title );
+
+ InternalSnipIterator
+ PrevSnip ( InternalSnipIterator snipPos );
+
+ InternalSnipIterator
+ NextSnip ( InternalSnipIterator snipPos );
+
+}; // QEScanner
+
+
+#endif // __QEScanner_hpp__
diff --git a/samples/source/common/TagTree.cpp b/samples/source/common/TagTree.cpp
new file mode 100644
index 0000000..2870057
--- /dev/null
+++ b/samples/source/common/TagTree.cpp
@@ -0,0 +1,615 @@
+// =================================================================================================
+// Copyright 2005-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+//
+// =================================================================================================
+
+/*
+* all legacy metadata comes in some hierarchical form
+* these routines help generate a tree, which is subsequently parseable (the "classic" dumpImage)
+
+* as well as queriable (primitive but workable solution)
+* having direct access to particluar legacy fields through unique keys (like "psir424")
+* enables efficient testing. tagMap is used for that.
+*
+* if keys are defined multiple times, the are named sameKey, sameKey-2, sameKey-3, sameKey-4
+* allowing also specific queries on those
+*
+*/
+
+#include "TagTree.h"
+#include <stdarg.h>
+
+
+#if WIN_ENV
+ //should preferably be within a #if XMP_WinBuild, not doable here...
+ #pragma warning ( disable : 4996 ) // 'sprintf' was declared deprecated
+
+ #include <stdio.h>
+ #ifndef snprintf
+ #define snprintf _xmp_snprintf
+ #pragma warning ( disable : 4996 ) // Consider using _snprintf_s instead.
+
+ void _xmp_snprintf(char * buffer,size_t len,const char * format, ...)
+ {
+ va_list args; va_start(args, format);
+ _snprintf( buffer, len, format, args);
+ // using bad windows routine from stdio.h
+ // and indeed named, _snprintf, no such thing as snprintf
+ buffer[len-1] = 0; //write that trailing zero..
+ va_end(args);
+ }
+ #endif
+#endif
+
+//private - duplicate of Utils routine
+std::string itos(int i)
+{
+ char cs[31]; //worst to come is 64 bit <=> 21 bytes (more likely will be 32 bit forever)
+ snprintf(cs,30,"%d",i); //snprintf does buffer overrun check which sprintf doesn't
+ return std::string(cs);
+}
+
+TagTree::TagTree()
+{
+ rootNode.key="rootkey"; //all never seen
+ rootNode.value="rootvalue";
+ rootNode.comment="rootcomment";
+ tagMap.clear(); // making extra sure it's clear, avoid OS X std:: issues
+ nodeStack.clear();
+ nodeStack.push_back(&rootNode);
+ lastNode=NULL;
+}
+
+TagTree::~TagTree()
+{
+ tagMap.clear();
+ nodeStack.clear();
+ nodeStack.push_back(&rootNode);
+ //any further cleanup needed?
+}
+
+void TagTree::setKeyValue(const std::string key,const std::string value, const std::string comment)
+{
+ Node* pCurNode=*nodeStack.rbegin(); //current Node
+ pCurNode->children.push_back(Node(key,value,comment));
+
+ if(key.size()==0) { // standalone comment?
+ if (value.size()!=0) // must have no value
+ Log::error("no key but value found.");
+ return; // ==> do not add to tag-map
+ }
+
+ //find first free foo, foo-2, foo-3 (note: no foo-1)
+ int i=1;
+ std::string extkey=key;
+ while( tagMap.count(extkey) )
+ {
+ i++;
+ extkey = key + "-" + itos(i);
+ }
+
+ //add to Map -----------------------------------
+ lastNode=&*(pCurNode->children.rbegin());
+ tagMap[extkey]=lastNode;
+}
+
+void TagTree::digest(LFA_FileRef file,const std::string key /*=NULL*/,
+ void* returnValue /*=""*/,
+ XMP_Int32 numOfBytes /*=0*/ )
+{
+ if (numOfBytes==0) {
+ //0-byte requests *are* legitimate, reducing codeforks for the caller
+ if ( !key.empty() )
+ setKeyValue(key,"(0 bytes)");
+ return;
+ }
+
+ //do we need own space or will it be provided?
+ char* value;
+ if (returnValue)
+ value=(char*)returnValue;
+ else
+ value=new char[numOfBytes+1];
+
+ if (numOfBytes != LFA_Read ( file, value, numOfBytes, true)) // saying 1,4 guarantes read as ordered (4,1 would not)
+ Log::error("could not read %d number of files (End of File reached?)",numOfBytes);
+
+ char* out=new char[2 + numOfBytes*3 + 5]; //'0x12 34 45 78 ' length formula: 2 ("0x") + numOfBytes x 3 + 5 (padding)
+
+ if (!key.empty()) {
+ snprintf(out,3,"0x");
+ XMP_Int64 i; // *)
+ for (i=0; i < numOfBytes; i++)
+ snprintf(&out[2+i*3],4,"%.2X ",value[i]); //always must allow that extra 0-byte on mac (overwritten again and again)
+ snprintf(&out[2+i*3],1,"\0"); // *) using i one more time (needed while bug 1613297 regarding snprintf not fixed)
+ setKeyValue(key,out);
+ }
+
+ delete out;
+ if (!returnValue) delete value; //if we own it, we delete it
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+// numeric digest routines
+//
+XMP_Int64 TagTree::digest64s(LFA_FileRef file,const std::string key /* ="" */ , bool BigEndian /*=false*/ )
+{
+ XMP_Int64 r;
+ if (8 != LFA_Read ( file, &r, 8, true))
+ Log::error("could not read 8-byte value from file (end of file?)");
+ if ( ((kBigEndianHost==1) && !BigEndian ) || ((kBigEndianHost==0) && BigEndian )) // "XOR"
+ Flip8(&r);
+
+ if (!key.empty()) {
+ char out[25]; //longest is "18446744073709551615", 21 chars ==> 25
+ snprintf(out,24,"%d",r); //signed, mind the trailing \0 on Mac btw
+ setKeyValue(key,out);
+ }
+ return r;
+}
+
+XMP_Uns64 TagTree::digest64u(LFA_FileRef file,const std::string key /* ="" */, bool BigEndian /*=false*/,bool hexDisplay /*=false*/ )
+{
+ XMP_Uns64 r;
+ if (8 != LFA_Read ( file, &r, 8, true))
+ Log::error("could not read 8-byte value from file (end of file?)");
+ if ( ((kBigEndianHost==1) && !BigEndian ) || ((kBigEndianHost==0) && BigEndian )) // "XOR"
+ Flip8(&r);
+ if (!key.empty()) {
+ char out[25]; //largets 64 bit no: 18446744073709551616 -1 (20 digits)
+ if (!hexDisplay)
+ {
+ //not working, 0x1244e7780 ==> 609122176 decimal (== 0x244e7780)
+ #if WIN_ENV
+ snprintf(out , 24 , "%I64u" , r);
+ #else
+ // MAC, UNIX
+ snprintf(out , 24 , "%0xllu" , r);
+ #endif
+ }
+ else
+ {
+ //not working, upper 32 bit empty:
+ #if WIN_ENV
+ snprintf( out , 24 , "0x%I64.16X" , r );
+ #else
+ snprintf( out , 24 , "0x%ll.16X" , r );
+ #endif
+ }
+ setKeyValue(key,out);
+ }
+ return r;
+}
+
+
+XMP_Int32 TagTree::digest32s(LFA_FileRef file,const std::string key /* ="" */ , bool BigEndian /*=false*/ )
+{
+ XMP_Int32 r;
+ if (4 != LFA_Read ( file, &r, 4, true))
+ Log::error("could not read 4-byte value from file (end of file?)");
+ if ( ((kBigEndianHost==1) && !BigEndian ) || ((kBigEndianHost==0) && BigEndian )) // "XOR"
+ Flip4(&r);
+ if (!key.empty()) {
+ char out[15]; //longest signed int is "–2147483648", 11 chars
+ snprintf(out,14,"%d",r); //signed, mind the trailing \0 on Mac btw
+ setKeyValue(key,out);
+ }
+ return r;
+}
+
+XMP_Uns32 TagTree::digest32u(LFA_FileRef file,const std::string key /* ="" */, bool BigEndian /*=false*/,bool hexDisplay /*=false*/ )
+{
+ XMP_Uns32 r;
+ if (4 != LFA_Read ( file, &r, 4, true))
+ Log::error("could not read 4-byte value from file (end of file?)");
+ if ( ((kBigEndianHost==1) && !BigEndian ) || ((kBigEndianHost==0) && BigEndian )) // "XOR"
+ Flip4(&r);
+ if (!key.empty()) {
+ char out[19]; //longest unsigned int is "2147483648", 10 chars resp. 0xFFFFFFFF 10 chars
+ if (!hexDisplay)
+ snprintf(out,18,"%u",r); //unsigned, mind the trailing \0 on Mac btw
+ else
+ snprintf(out,18,"0x%.8X",r); //unsigned, mind the trailing \0 on Mac btw
+ setKeyValue(key,out);
+ }
+ return r;
+}
+//////////////////
+XMP_Int16 TagTree::digest16s(LFA_FileRef file,const std::string key /* ="" */ , bool BigEndian /*=false*/ )
+{
+ XMP_Int16 r;
+ if (2 != LFA_Read ( file, &r, 2, true))
+ Log::error("could not read 2-byte value from file (end of file?)");
+ if ( ((kBigEndianHost==1) && !BigEndian ) || ((kBigEndianHost==0) && BigEndian )) // "XOR"
+ Flip2(&r);
+ if (!key.empty()) {
+ char out[10]; //longest signed int is "–32768", 6 chars
+ snprintf(out,9,"%d",r);
+ setKeyValue(key,out);
+ }
+ return r;
+}
+
+XMP_Uns16 TagTree::digest16u(LFA_FileRef file,const std::string key /* ="" */, bool BigEndian /*=false*/,bool hexDisplay /*=false*/ )
+{
+ XMP_Uns16 r;
+ if (2 != LFA_Read ( file, &r, 2, true))
+ Log::error("could not read 2-byte value from file (end of file?)");
+ if ( ((kBigEndianHost==1) && !BigEndian ) || ((kBigEndianHost==0) && BigEndian )) // "XOR"
+ Flip2(&r);
+ if (!key.empty()) {
+ char out[15]; //longest unsigned int is "65536", 5 chars resp. 0xFFFF = 6 chars
+ if (!hexDisplay)
+ snprintf(out,14,"%u",r);
+ else
+ snprintf(out,14,"0x%.4X",r);
+ setKeyValue(key,out);
+ }
+ return r;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// "expected" Overrides
+void TagTree::digest64s(XMP_Int64 expected, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/ )
+{
+ XMP_Int64 tmp=digest64s(file,"",BigEndian);
+ if ( expected != tmp )
+ throw DumpFileException("'%s' was %d, expected: %d",key.c_str(),tmp,expected);
+}
+
+void TagTree::digest64u(XMP_Uns64 expected, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/, bool hexDisplay /*=false*/)
+{
+ XMP_Uns64 tmp=digest64u( file,"",BigEndian, hexDisplay );
+ if (expected != tmp )
+ if (hexDisplay)
+ throw DumpFileException("'%s' was 0x%.16X, expected: 0x%.16X",key.c_str(),tmp,expected);
+ else
+ throw DumpFileException("'%s' was %d, expected: %d",key.c_str(),tmp,expected);
+}
+
+void TagTree::digest32s(XMP_Int32 expected, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/ )
+{
+ XMP_Int32 tmp=digest32s(file,"",BigEndian);
+ if ( expected != tmp )
+ throw DumpFileException("'%s' was %d, expected: %d",key.c_str(),tmp,expected);
+}
+
+void TagTree::digest32u(XMP_Uns32 expected, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/, bool hexDisplay /*=false*/)
+{
+ XMP_Uns32 tmp=digest32u( file,"",BigEndian, hexDisplay );
+ if (expected != tmp )
+ if (hexDisplay)
+ throw DumpFileException("'%s' was 0x%.8X, expected: 0x%.8X",key.c_str(),tmp,expected);
+ else
+ throw DumpFileException("'%s' was %d, expected: %d",key.c_str(),tmp,expected);
+}
+
+void TagTree::digest16s(XMP_Int16 expected, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/ )
+{
+ XMP_Int16 tmp=digest16s(file,key,BigEndian);
+ if ( expected != tmp )
+ throw DumpFileException("'%s' was %d, expected: %d",key.c_str(),tmp,expected);
+}
+
+void TagTree::digest16u(XMP_Uns16 expected, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/, bool hexDisplay /*=false*/)
+{
+ XMP_Uns16 tmp=digest16u( file,key,BigEndian, hexDisplay );
+ if (expected != tmp )
+ if (hexDisplay)
+ throw DumpFileException("'%s' was 0x%.4X, expected: 0x%.4X",key.c_str(),tmp,expected);
+ else
+ throw DumpFileException("'%s' was %d, expected: %d",key.c_str(),tmp,expected);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// CBR Overrides
+void TagTree::digest64s(XMP_Int64* returnValue, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/ )
+{
+ *returnValue = digest64s(file,key,BigEndian);
+}
+
+void TagTree::digest64u(XMP_Uns64* returnValue, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/, bool hexDisplay /*=false*/)
+{
+ *returnValue = digest64u( file, key,BigEndian, hexDisplay );
+}
+
+void TagTree::digest32s(XMP_Int32* returnValue, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/ )
+{
+ *returnValue = digest32s(file,key,BigEndian);
+}
+
+void TagTree::digest32u(XMP_Uns32* returnValue, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/, bool hexDisplay /*=false*/)
+{
+ *returnValue = digest32u( file, key,BigEndian, hexDisplay );
+}
+
+void TagTree::digest16s(XMP_Int16* returnValue, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/ )
+{
+ *returnValue = digest16s(file,key,BigEndian);
+}
+
+void TagTree::digest16u(XMP_Uns16* returnValue, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/, bool hexDisplay /*=false*/)
+{
+ *returnValue = digest16u( file, key,BigEndian, hexDisplay );
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+std::string TagTree::digestString(LFA_FileRef file,const std::string key /*=""*/, size_t length /* =0 */, bool verifyZeroTerm /* =false */)
+{
+ std::string r(256,'\0'); //give some room in advance (performance)
+ r.clear(); // safety measure (may be needed on mac)
+
+ bool outside = false; // toggle-flag: outside ASCII
+
+ for ( XMP_Uns32 i = 0; ( i<length ) || (length==0) ; i++ )
+ {
+ XMP_Uns8 ch = (XMP_Uns8)LFA_GetChar(file);
+ if ( (0x20 <= ch) && (ch <= 0x7E) )
+ { //outside-case
+ if ( outside )
+ r.push_back('>');
+ r.push_back(ch);
+ outside = false;
+ } else {
+ if ( !outside )
+ r.push_back('<'); //first inside
+ else if (!((length==0) && (ch =='\0')))
+ r.push_back(' '); //further inside (except very last)
+ outside = true;
+ if ( (length==0) && (ch == '\0' ) )
+ break; // lenght zero => watch for zero termination...
+ char tmp[4];
+ sprintf(tmp, "%.2X", ch );
+ r+=tmp;
+ }
+ }
+
+ if ( outside ) r.push_back('>'); //last one
+
+ if ( verifyZeroTerm )
+ {
+ XMP_Uns8 ch = (XMP_Uns8)LFA_GetChar(file);
+ if ( ch != 0 )
+ Log::error("string for key %s not terminated with zero as requested but with 0x%.2X",key.c_str(),ch);
+ }
+
+
+ if (!key.empty())
+ setKeyValue(key,r);
+
+ return r;
+}
+
+void TagTree::comment(const std::string comment)
+{
+ setKeyValue("","",comment);
+}
+
+void TagTree::comment(const char* format, ...)
+{
+ char buffer[XMPQE_BUFFERSIZE];
+ va_list args;
+ va_start(args, format);
+ vsprintf(buffer, format, args);
+ va_end(args);
+
+ setKeyValue("","",buffer);
+}
+
+//adding a subnode to tagMap and current node
+//(do "go in", pushes onto nodeStack, making this the current node)
+void TagTree::pushNode(const std::string key)
+{
+ //TODO: adding fromArgs("offset:%s",LFA_Seek( file, offset_CD ,SEEK_SET )); <== requires file to be passed in
+ setKeyValue(key,"","");
+ //_and_ push reference to that one on stack
+ Node* pCurNode=*nodeStack.rbegin();
+ nodeStack.push_back( &*pCurNode->children.rbegin() );
+}
+
+//formatstring wrapper
+void TagTree::pushNode(const char* format, ...)
+{
+ char buffer[XMPQE_BUFFERSIZE];
+ va_list args;
+ va_start(args, format);
+ vsprintf(buffer, format, args);
+ va_end(args);
+
+ pushNode( std::string(buffer) );
+}
+
+void TagTree::addOffset(LFA_FileRef file)
+{
+ // 3 points for doing it here: shortness, convenience, 64bit forks needed
+ #if WIN_ENV
+ addComment( "offset: 0x%I64X", LFA_Tell( file ) );
+ #else
+ addComment( "offset: 0x%ll.16X", LFA_Tell( file ) );
+ #endif
+}
+
+//takes a Node off the stack
+// - addTag()'s will now go to the prior Node
+void TagTree::popNode()
+{
+ if (nodeStack.size() <= 1)
+ Log::error("nodeStack underflow: %d",nodeStack.size());
+ nodeStack.pop_back();
+}
+
+// takes all Nodes from the stack
+// - the right thing to do after a parsing failure to at least dump
+// the partial tree till there
+void TagTree::popAllNodes()
+{
+ while (nodeStack.size() > 1)
+ nodeStack.pop_back();
+}
+
+
+void TagTree::changeValue(const std::string value)
+{
+ if (!lastNode)
+ Log::error("lastnode NULL");
+ lastNode->value=value;
+}
+
+void TagTree::changeValue(const char* format, ...)
+{
+ char buffer[XMPQE_BUFFERSIZE];
+ va_list args;
+ va_start(args, format);
+ vsprintf(buffer, format, args);
+ va_end(args);
+
+ changeValue( std::string(buffer) );
+}
+
+
+void TagTree::addComment(const std::string comment)
+{
+ if (!lastNode)
+ Log::error("lastnode NULL");
+ lastNode->comment=lastNode->comment +
+ ( (lastNode->comment.size())?",":"") //only add comma, if there already is...
+ +comment;
+}
+
+void TagTree::addComment(const char* format, ...)
+{
+ char buffer[4096];
+ va_list args;
+ va_start(args, format);
+ vsprintf(buffer, format, args);
+ va_end(args);
+
+ addComment( std::string(buffer) );
+}
+
+// ============================================================================
+// Output functions
+// ============================================================================
+
+// this is essentiall the last function to call...
+// - fileDump "end-users" should call it by just saying dumpTree()
+// - dumps tree to stdout (by way of Log::info)
+// - recursive calls, depth is used for indentation
+void TagTree::dumpTree(bool commentsFlag /*true*/,Node* pNode /*null*/ ,unsigned int depth /*=0*/)
+{
+ if (!pNode) { //NULL --> initial node is rootNode
+ //check (only needed on first==outermost call) that push and pop match...
+ if (nodeStack.size()>1)
+ Log::error("nodeStack not emptied: should be 1 but is %d",nodeStack.size());
+ //no need to iterate or dump rootnode itself,
+ for( NodeList::iterator iter = rootNode.children.begin(); iter != rootNode.children.end(); iter++ )
+ dumpTree ( commentsFlag,&*iter, depth); //to not iterate on first level
+ return; //...and then finally return
+ }
+
+ std::string indent(depth*2,' '); //read: tab 4
+
+ if (commentsFlag) {
+ Log::info( "%s%s%s%s%s%s%s%s%s", //fancy formatting foo='bar' [re,do]
+ indent.c_str(),
+ pNode->key.c_str(),
+ pNode->value.size()?" = '":"",
+ pNode->value.c_str(),
+ pNode->value.size()?"'":"",
+ ( pNode->key.size() + pNode->value.size() > 0 ) ? " ":"",
+ pNode->comment.size() && ( pNode->key.size() || pNode->value.size() ) ?"[":"",
+ //standalone comments don't need brackets
+ pNode->comment.c_str(),
+ pNode->comment.size() && ( pNode->key.size() || pNode->value.size() ) ?"]":""
+ );
+ } else {
+ //if "NoComments" mode, then make sure, there at least is a comment to avoid blankline
+ if ( pNode->key.size() || pNode->value.size())
+ {
+ Log::info( "%s%s%s%s%s", //fancy formatting foo='bar' [re,do]
+ indent.c_str(),
+ pNode->key.c_str(),
+ pNode->value.size()?" = '":"",
+ pNode->value.c_str(),
+ pNode->value.size()?"'":""
+ );
+ }
+ }
+
+ //iterate over children (gracefully covers no-children case)
+ for( NodeList::iterator iter = pNode->children.begin(); iter != pNode->children.end(); iter++ )
+ dumpTree ( commentsFlag, &*iter, depth+1);
+}
+
+void TagTree::dumpTagMap()
+{
+ for( TagMap::iterator iter = tagMap.begin(); iter != tagMap.end(); iter++ )
+ {
+ Node* pNode=((*iter).second);
+ if (!pNode->children.size()) //supress node with children
+ Log::info( "%s%s%s%s", //(no index string this time)
+ pNode->key.c_str(),
+ pNode->value.size()?" = '":"",
+ pNode->value.c_str(),
+ pNode->value.size()?"'":""
+ );
+ }
+}
+
+// shrinked copy of dumpTree (which has faithfull order)
+// just no commenting, indenting,...)
+void TagTree::dumpTagList(Node* pNode,unsigned int depth /*=0*/)
+{
+ if (!pNode) { //NULL --> initial node is rootNode
+ //check (only needed on first==outermost call) that push and pop match...
+ if (nodeStack.size()>1)
+ Log::error("nodeStack not emptied: should be 1 but is %d",nodeStack.size());
+ //no need to iterate or dump rootnode itself,
+ for( NodeList::iterator iter = rootNode.children.begin(); iter != rootNode.children.end(); iter++ )
+ dumpTagList ( &*iter, depth);
+ return;
+ }
+
+ //make sure, there at least is a comment to avoid blankline
+ if ( pNode->key.size() || pNode->value.size())
+ {
+ Log::info( "%s%s%s%s", //fancy formatting foo='bar' [re,do]
+ pNode->key.c_str(),
+ pNode->value.size()?" = '":"",
+ pNode->value.c_str(),
+ pNode->value.size()?"'":""
+ );
+ }
+
+ for( NodeList::iterator iter = pNode->children.begin(); iter != pNode->children.end(); iter++ )
+ dumpTagList ( &*iter, depth+1);
+
+}
+
+std::string TagTree::getValue(const std::string key)
+{
+ if ( !hasNode(key) )
+ Log::error("key %s does not exist",key.c_str());
+ return tagMap[key]->value;
+}
+
+std::string TagTree::getComment(const std::string key)
+{
+ if ( !hasNode(key) )
+ Log::error("key %s does not exist",key.c_str());
+ return tagMap[key]->comment;
+}
+
+bool TagTree::hasNode(const std::string key)
+{
+ if ( tagMap.count(key)==0 )
+ return false; //no such node
+ return true;
+}
+
diff --git a/samples/source/common/TagTree.h b/samples/source/common/TagTree.h
new file mode 100644
index 0000000..7ec490c
--- /dev/null
+++ b/samples/source/common/TagTree.h
@@ -0,0 +1,186 @@
+// =================================================================================================
+// Copyright 2005-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+//
+// =================================================================================================
+
+#ifndef TagTree_H
+#define TagTree_H
+
+#include <map>
+#include <list>
+#include <string>
+#include "EndianUtils.hpp"
+#include "globals.h"
+#include "XMP_Const.h" //needed for setKV convenience functions
+#include "Log.h"
+
+#include "LargeFileAccess.hpp"
+void LFA_Throw ( const char* msg, int id );
+
+using namespace std;
+
+// TagTree routines must be able to throw these..
+class DumpFileException : public std::runtime_error {
+ public:
+ DumpFileException(const char* format, ...);
+
+ const char* what_dumpfile_reason(); //no override, but almost..
+ private:
+ static const unsigned int DUMPFILE_MAX_ERROR_LENGTH=2048;
+ char buffer [DUMPFILE_MAX_ERROR_LENGTH+1];
+};
+
+class TagTree {
+private:
+ struct Node; //forward-looking declaration
+ typedef std::list<Node> NodeList;
+
+ struct Node {
+ std::string key; // node structure name resp. tag name
+ std::string value; // value if applicable/of relevance
+ std::string comment; // comment string, add-on as many as you like
+ NodeList children; // children of this tag, if any
+ public:
+ //default-constructor is an std::container requirement. DO NOT ACTUALLY USE.
+ Node() {
+ key=std::string("unnamed"); // should be overridden at all times
+ value=std::string("no value");
+ comment=std::string("no comment");
+ children.clear(); // be safe (std::mac-issue..) clear beforehand
+ }
+
+ //the one to use
+ Node(std::string key, std::string value, std::string comment) {
+ this->key=key;
+ this->value=value;
+ this->comment=comment;
+ children.clear();
+ }
+ };
+
+ // the map (always alphabetic) to collect key-value pairs
+ // - Node* rather than string to have access to value and comment info
+ typedef std::map<std::string,Node*> TagMap;
+ TagMap tagMap;
+
+ //used for changeValue and addComment
+ //(NB: not null-ed or such on push+pop, thus stretches beyond)
+ Node* lastNode;
+
+ //we need a stack to iterate in and out
+ // during build-up and dump recursion
+ typedef std::list<Node*> NodeStack;
+
+ NodeStack nodeStack;
+ Node rootNode; //TODO: ("root","");
+
+public:
+ TagTree();
+ ~TagTree();
+
+ //input functions =========================================================
+
+ void pushNode(const std::string key);
+ void pushNode(const char* format, ...);
+
+ // add file offset as comment -> own routine to better output 64 bit offsets...
+ void addOffset(LFA_FileRef file);
+
+ void popNode();
+ void popAllNodes();
+
+ //sets a key-value pair and optinal comment. value is also optional and may be set at a later time
+ //can also be used to set pure, standalone comments (using key==value=="")
+ void setKeyValue(const std::string key,const std::string value="", const std::string comment="");
+
+ // convenience functions //////////////////////////////////////////////////////////////////
+ // these functions read bytes (assert in file-length), dump them to screen (as hex or as number)
+ // and optionally return the values for further processing
+
+ //read, convert endianess, dump certain values all in one go:
+ // * key - may be NULL if you just want to obtain the values but not make a KV entry
+ // * returnValue - returns the bytes digested
+ // * numOfBytes - 0-byte requests *are* legitimate, as they may reduce codeforks for the client
+ void digest(LFA_FileRef file,const std::string key="",
+ void* returnValue=NULL,
+ XMP_Int32 numOfBytes=0);
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // numeric digest routines
+ //
+ // same parameters as above, plus:
+ // * bigEndian - set to false, if the number is in the file as little endian
+ // ( correct return value according to machine type is taken care of for either setting)
+ // overload signed and unsigned, 32 and 16 bit
+ // Note, again: key may be NULL if you just want to obtain the values but not make a KV entry
+ XMP_Int64 digest64s(LFA_FileRef file,const std::string key="", bool BigEndian=false);
+ XMP_Uns64 digest64u(LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false);
+ XMP_Int32 digest32s(LFA_FileRef file,const std::string key="", bool BigEndian=false);
+ XMP_Uns32 digest32u(LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false);
+ XMP_Int16 digest16s(LFA_FileRef file,const std::string key="", bool BigEndian=false);
+ XMP_Uns16 digest16u(LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false);
+
+ // "expected" Overrides
+ void digest64s(XMP_Int64 expected, LFA_FileRef file,const std::string key="", bool BigEndian=false);
+ void digest64u(XMP_Uns64 expected, LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false);
+ void digest32s(XMP_Int32 expected, LFA_FileRef file,const std::string key="", bool BigEndian=false);
+ void digest32u(XMP_Uns32 expected, LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false);
+ void digest16s(XMP_Int16 expected, LFA_FileRef file,const std::string key="", bool BigEndian=false);
+ void digest16u(XMP_Uns16 expected, LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false);
+
+ //CBR Overrides
+ void digest64s(XMP_Int64* returnValue, LFA_FileRef file,const std::string key="", bool BigEndian=false);
+ void digest64u(XMP_Uns64* returnValue, LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false);
+ void digest32s(XMP_Int32* returnValue, LFA_FileRef file,const std::string key="", bool BigEndian=false);
+ void digest32u(XMP_Uns32* returnValue, LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false);
+ void digest16s(XMP_Int16* returnValue, LFA_FileRef file,const std::string key="", bool BigEndian=false);
+ void digest16u(XMP_Uns16* returnValue, LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false);
+
+
+ //8-bit string (whichever encoding -> "buginese") to std::string
+ //use length==0 to indicate zero-termination,
+ //otherwise indicated lenght will be grabbed also accross \0 's
+ //(length is counted w/o trailing zero termination, i.e. length("hans")==4 )
+ // TODO: length default = 0 not yet implemented
+ // verifyZeroTerm
+ // - has an effect only if a length!=0 is given
+ // - in this case, asserts that the string has a terminating zero
+ // (_after_ <length> bytes, otherwise that byte is not read which has an impact on the filepointer!)
+ // would throw if any zero (\0) is encountered prior to that
+ std::string digestString(LFA_FileRef file,const std::string key="", size_t length=0, bool verifyZeroTerm=false );
+
+ // (wrappers)
+ // standalone comment
+ void comment(const std::string comment);
+ // standalone comment
+ // be aware of bug1741056, feeding 64bit numbers might not output correctly
+ void comment(const char* format, ...);
+
+ //sometimes its worth changing (or actually setting for the first time) they current
+ //(aka last set) key/value at a later time. includes correction in tagmap.
+ void changeValue(const std::string value);
+ void changeValue(const char* format, ...);
+
+ //adds a comment to last prior entry ( which could be KeyValue, Node or standalone comment...)
+ void addComment(const std::string comment);
+ //adds a comment to last prior entry ( which could be KeyValue, Node or standalone comment...)
+ void addComment(const char* format, ...);
+
+ //output functions ===========================================================
+ void dumpTree(bool commentsFlag=true, Node* pNode = NULL,unsigned int depth=0);
+
+ void dumpTagMap();
+ void dumpTagList(Node* pNode = NULL,unsigned int depth=0);
+
+ std::string getValue(const std::string key);
+ std::string getComment(const std::string key);
+
+ //returns true if there is such a node, false if not, error if it happens to be key-value pair
+ bool hasNode(const std::string key);
+};
+
+#endif
diff --git a/samples/source/common/globals.h b/samples/source/common/globals.h
new file mode 100644
index 0000000..291ceb3
--- /dev/null
+++ b/samples/source/common/globals.h
@@ -0,0 +1,43 @@
+// =================================================================================================
+// Copyright 2005-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+//
+// =================================================================================================
+
+#ifndef XMPQE_GLOBALS_H
+#define XMPQE_GLOBALS_H
+
+ #include <string>
+
+ //sanity check platform/endianess
+ #if !defined(WIN_ENV) && !defined(MAC_ENV) && !defined(UNIX_ENV)
+ #error "XMP environment error - must define one of MAC_ENV, WIN_ENV, or UNIX_ENV"
+ #endif
+
+ #ifdef WIN_ENV
+ #define XMPQE_LITTLE_ENDIAN
+ #elif (defined(MAC_ENV) || defined(UNIX_ENV))
+ #if __BIG_ENDIAN__
+ #define XMPQE_BIG_ENDIAN
+ #elif __LITTLE_ENDIAN__
+ #define XMPQE_LITTLE_ENDIAN
+ #else
+ #error "Neither __BIG_ENDIAN__ nor __LITTLE_ENDIAN__ is set"
+ #endif
+ #else
+ #error "Unknown build environment, neither WIN_ENV nor MAC_ENV nor UNIX_ENV"
+ #endif
+
+ const static unsigned int XMPQE_BUFFERSIZE=4096; //should do for all my buffer output, but you never now (stdarg dilemma)
+
+ const char OMNI_CSTRING[]={0x41,0xE4,0xB8,0x80,0x42,0xE4,0xBA,0x8C,0x43,0xC3,0x96,0x44,0xF0,0x90,0x81,0x91,0x45,'\0'};
+ const char BOM_CSTRING[]={0xEF,0xBB,0xBF,'\0'}; // nb: forgetting the '\0' is a very evil mistake.
+ const std::string OMNI_STRING(OMNI_CSTRING);
+ //if plain utf8 conversion, mac/win local encoding is a different story...
+ const std::string OMNI_BUGINESE("A<E4 B8 80>B<E4 BA 8C>C<C3 96>D<F0 90 81 91>E");
+
+#endif // XMPQE_GLOBALS_H
+
diff --git a/samples/source/dumpfile/main.cpp b/samples/source/dumpfile/main.cpp
new file mode 100644
index 0000000..d1541a6
--- /dev/null
+++ b/samples/source/dumpfile/main.cpp
@@ -0,0 +1,259 @@
+// =================================================================================================
+// Copyright 2004-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+//
+//
+// Dumpfile is a dev utility to understand, and to a certain degree validate file structures, with
+// specific focus on metadata related aspects, naturally. Dumpfile is NOT meant to extract
+// valid metadata from files. Dumpfile is NOT meant to be a production tool.
+// NO reconciliation, NO XMP logic, NO attention to encoding matters, etc.
+//
+// Dumpfile gives developers a view on files just like a hex editor,
+// slightly more readible but in no way more sophisticated.
+
+//sanity check platform/endianess
+#include "globals.h"
+
+#ifdef WIN_ENV
+#pragma warning ( disable : 4267 ) // suppress string conversion warning
+// #pragma warning ( disable : 1234 ) // say what you do here
+#endif
+
+//only define in one non-public-source, non-header(.cpp) place
+
+const int DUMPFILEVERSION=2;
+#define EXENAME "dumpfile"
+
+//standard stuff
+#include <stdexcept>
+#include <iostream>
+#include <string>
+#include <vector>
+#include <sstream>
+
+//XMPCore (only!)
+#define TXMP_STRING_TYPE std::string
+#include "XMP.hpp" //NB: no XMP.incl_cpp here on purpose, gets compiled in main...
+#include "XMP.incl_cpp" //include in EXACTLY one source file (i.e. main, in Action gets you trouble...)
+#include "XMP_Const.h"
+
+//QE related
+#include "Log.h"
+
+#include "LargeFileAccess.hpp"
+
+void LFA_Throw ( const char* msg, int id )
+{
+ switch(id)
+ {
+ case kLFAErr_InternalFailure:
+ Log::error("LFA User Abort:%s", msg);
+ break;
+ case kLFAErr_ExternalFailure:
+ Log::error("LFA External Failure:%s", msg);
+ break;
+ case kLFAErr_UserAbort:
+ Log::error("LFA User Abort:%s", msg);
+ break;
+ default:
+ Log::error("LFA unknown error:%s", msg); //should not occur
+ break;
+ }
+}
+
+#include "DumpFile.h"
+
+using namespace std;
+
+void printUsageShort() {
+ Log::info("%s -version",EXENAME);
+ Log::info(" Print version information for this utility");
+ Log::info("");
+ Log::info("%s -help",EXENAME);
+ Log::info(" Print descriptions of all available switches, including examples");
+ Log::info("");
+ Log::info("%s [ -help | -version | [-keys|-tree|-list] [-nocomments] <path> ]",EXENAME);
+ Log::info("");
+ Log::info("Copyright 2008 Adobe Systems Incorporated. All Rights Reserved.");
+ Log::info("");
+}
+
+void printUsageLong() {
+ Log::info("%s -version",EXENAME);
+ Log::info(" Print version information for this utility");
+ Log::info("");
+ Log::info("%s -help",EXENAME);
+ Log::info(" Print descriptions of all available switches, including examples");
+ Log::info("");
+ Log::info("%s [ -help | -version | [-keys|-tree|-list] [-nocomments] <path> ]",EXENAME);
+ Log::info("");
+ Log::info("Copyright 2008 Adobe Systems Incorporated. All Rights Reserved.");
+ Log::info("NOTICE: Adobe permits you to use, modify, and distribute this file in");
+ Log::info(" accordance with the terms of the Adobe license agreement");
+ Log::info(" accompanying it.");
+ Log::info("");
+ Log::info("Switches:");
+ Log::info("-help Prints usage information for the command.");
+ Log::info("");
+ Log::info("-version Prints version information for this tool, and for the version");
+ Log::info(" of XMPCore to which it is statically linked. (NB: Dumpfile does");
+ Log::info(" not use XMPFiles.");
+ Log::info("");
+ Log::info("-tree Shows the tree structure of the file. (default)");
+ Log::info("");
+ Log::info("-keys Shows only the key-value nodes found in the file, as a list with no");
+ Log::info(" hierarchical structure, in alphabetical order by key.");
+ Log::info("");
+ Log::info("-list Shows only the key-value nodes found in the file, as a list with no");
+ Log::info(" hierarchical structure, in the order of parsing.");
+ Log::info("");
+ Log::info("-nocomments Supresses the comment portion of key-value nodes.");
+ Log::info("");
+
+ Log::info("");
+ Log::info("Examples:");
+ Log::info("%s -keys Sample.jpg",EXENAME);
+ Log::info("");
+ Log::info("dumpfile returns 0 if there are no errors. Note: Warnings and errors");
+ Log::info("are printed as part of the stdout output, not to stderr.");
+ Log::info("");
+}
+
+int
+main( int argc, char* argv[] )
+{
+ //if both not flagged will default to tree-only (below)
+ bool treeFlag=false;
+ bool keysFlag=false;
+ bool listFlag=false;
+ bool commentsFlag=true; // true <=> do not supress comments (supressing them is better for kgo)
+
+ //NB: not logging to file since mostly pointless...
+ int returnValue=0; //assume all will be good
+
+ int i=1; //define outside scope to access in catch clause
+ try {
+ if ( ! SXMPMeta::Initialize( ) )
+ {
+ Log::info( "SXMPMeta::Initialize failed!" );
+ return -1;
+ }
+
+ //no parameters? print usage.
+ if ( argc == 1 )
+ {
+ printUsageShort();
+ return 0;
+ }
+
+ //one parameter? check...
+ if (
+ !strcmp("-help",argv[1]) ||
+ !strcmp("--help",argv[1]) ||
+ !strcmp("-h",argv[1]) ||
+ !strcmp("-?",argv[1]) ||
+ !strcmp("/?",argv[1]) )
+ {
+ printUsageLong();
+ return 0;
+ }
+ else if ( !strcmp("-version",argv[1]) )
+ {
+ XMP_VersionInfo coreVersion;
+ SXMPMeta::GetVersionInfo ( &coreVersion );
+ Log::info("using XMPCore %s", coreVersion.message );
+ Log::info("dumpfile Version %d", DUMPFILEVERSION );
+ return 0;
+ }
+
+ //multiple parameters? all but last must be switches!
+ while (i < argc-1) //while not last parameter
+ {
+ if ( !strcmp("-keys",argv[i]) )
+ keysFlag=true;
+ else if ( !strcmp("-tree",argv[i]) )
+ treeFlag=true;
+ else if ( !strcmp("-list",argv[i]) )
+ listFlag=true;
+ else if ( !strcmp("-nocomments",argv[i]) )
+ commentsFlag=false;
+ else if (argv[i][0] == '-') //yet-another-switch?
+ {
+ Log::info("unknown switch %s",argv[i]);
+ printUsageShort();
+ return -1;
+ }
+ else
+ {
+ Log::info("only one image at a time: %s",argv[i]);
+ printUsageShort();
+ return -1;
+ }
+ i++;
+ } //while
+
+ if (!treeFlag && !keysFlag && !listFlag) //if nothing request default to "-tree"
+ treeFlag=true;
+
+ TagTree tree;
+ std::string errMsg;
+ try //parsing failures on incorrect files should still lead to partial dump
+ {
+ DumpFile::Scan(argv[i],tree);
+ }
+ catch (DumpFileException& d)
+ {
+ tree.popAllNodes();
+ returnValue = -9; //earmark but keep going
+ errMsg=d.what_dumpfile_reason();
+ }
+
+ if (treeFlag)
+ tree.dumpTree(commentsFlag);
+ if (treeFlag && keysFlag) //separator if needed
+ Log::info("------------------------------------------------------------------------");
+ if (keysFlag)
+ tree.dumpTagMap();
+ if ( (treeFlag || keysFlag) && listFlag) //separator if needed
+ Log::info("------------------------------------------------------------------------");
+ if (listFlag)
+ tree.dumpTagList();
+
+ //order appears more logical to print after the dumping happended:
+ if (returnValue != 0) {
+ Log::info("parsing failed. \n%s",errMsg.c_str());
+ }
+
+ SXMPMeta::Terminate();
+ }
+ catch (XMP_Error& x ) {
+ Log::info("XMPError on file %s:\n%s", argv[i] , x.GetErrMsg() );
+ return -3;
+ }
+ catch (LOG_Exception& q) {
+ //also used by assert which are very self-explanatory
+ //neutral wording for standalone app
+ Log::info("INTERNAL parsing error\n- file: %s\n%s", argv[i] , q.what() );
+ return -4;
+ }
+ catch ( std::exception &e )
+ {
+ Log::info("std:exception on file %s:\n%s", argv[i] , e.what() );
+ return -5;
+ }
+ catch (...)
+ {
+ Log::info("unknown (...) exception on file %s", argv[i] );
+ return -6;
+ }
+
+ if (returnValue==0)
+ Log::info("OK");
+ else
+ Log::info("ERROR(s) encountered");
+ return returnValue;
+}
diff --git a/samples/source/xmpcommand/Actions.cpp b/samples/source/xmpcommand/Actions.cpp
new file mode 100644
index 0000000..2324b10
--- /dev/null
+++ b/samples/source/xmpcommand/Actions.cpp
@@ -0,0 +1,334 @@
+// =================================================================================================
+// Copyright 2004-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+// actions.cpp|h
+// performs one of the XMPFiles actions as indicated by the paramters (and evaluated in main)
+//
+
+const char * XMP_EXE_VERSION= "4.4";
+
+#include <stdexcept>
+#include <stdarg.h>
+
+//XMP related
+#define TXMP_STRING_TYPE std::string
+#define XMP_INCLUDE_XMPFILES 1
+#include "XMP.hpp" //NB: no XMP.incl_cpp here on purpose, gets compiled in main...
+#include "XMP_Const.h"
+
+#include "globals.h"
+#include "Log.h"
+#include "OutputUtils.h"
+
+#include "Actions.h" //must come after XMP.hpp/XMP_Const.h
+
+// utility functions **************************************************************
+
+ /* does NOT include path fixing (unix vs wxp) on purpose
+ * being readable of course implies existing
+ * - note: this utility is also used by cppunit sanity checks
+ */
+ bool fileIsReadable(const std::string filename)
+ {
+ FILE* fp = NULL;
+ fp = fopen( filename.c_str(), "rb" );
+ if( fp != NULL )
+ {
+ fclose( fp );
+ return true;
+ }
+ return false;
+ }
+
+ bool fileIsWritable(const std::string filename)
+ {
+ FILE* fp = NULL;
+ fp = fopen( filename.c_str(), "rb+" );
+ if( fp != NULL )
+ {
+ fclose( fp );
+ return true;
+ }
+ return false;
+ }
+
+ void verifyFileIsReadable(const std::string filename)
+ {
+ if (! fileIsReadable(filename))
+ Log::error("file %s is not readable or not existing.",filename.c_str());
+
+ }
+
+ void verifyFileIsWritable(const std::string filename)
+ {
+ if (! fileIsWritable(filename))
+ Log::error("file %s is not readwritable or not existing.",filename.c_str());
+ }
+
+
+ std::string getStringFromFile(const std::string& filename)
+ {
+ verifyFileIsReadable(filename);
+
+ //figure out length
+ FILE * file = fopen ( filename.c_str(), "rb" );
+ fseek ( file, 0, SEEK_END );
+ XMP_Uns32 length = ftell( file );
+ fseek ( file, 0, SEEK_SET );
+
+ //write into string
+ std::string content;
+ content.reserve ( (XMP_Uns32) length );
+ content.append ( length, ' ' );
+ fread ( (char*)content.data(), 1, length, file );
+ fclose ( file );
+ return content;
+ }
+
+// ********************************************************************************
+
+void Actions::version() {
+ XMP_VersionInfo coreVersion, filesVersion;
+ SXMPMeta::GetVersionInfo ( &coreVersion );
+ SXMPFiles::GetVersionInfo ( &filesVersion );
+ Log::info("%s", coreVersion.message);
+ Log::info("%s", filesVersion.message);
+ Log::info("Executable Version:%s", XMP_EXE_VERSION);
+
+#ifdef WIN_ENV
+ Log::info("compiled on Windows on %s, %s",__DATE__,__TIME__);
+#endif
+#ifdef MAC_ENV
+ Log::info("compiled on Mac on %s, %s",__DATE__,__TIME__);
+#endif
+#ifndef NDEBUG
+ Log::info("Configuration: debug");
+#else
+ Log::info("Configuration: release");
+#endif
+ Log::info("Edition: Public SDK");
+#if defined(XMPQE_BIG_ENDIAN)
+ Log::info("Big endian machine");
+#elif defined(XMPQE_LITTLE_ENDIAN)
+ Log::info("Little endian machine");
+#else
+ Log::warn("unknown Endian !!!");
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////////////////
+void Actions::info() {
+ if(!this->switch_nocheck) verifyFileIsReadable(this->mediafile);
+ XMP_FileFormat xmpFileFormat=kXMP_UnknownFile;
+ SXMPFiles xmpFile;
+
+ if ( !xmpFile.OpenFile(this->mediafile,xmpFileFormat,generalOpenFlags) )
+ Log::error("error opening file %s",this->mediafile.c_str());
+
+ std::string out_filepath;
+ XMP_OptionBits out_openFlags;
+ XMP_FileFormat out_fileFormat;
+ XMP_OptionBits out_handlerFlags;
+
+ if (!xmpFile.GetFileInfo(&out_filepath,&out_openFlags,&out_fileFormat,&out_handlerFlags))
+ Log::error("error doing GetFileInfo %s",this->mediafile.c_str());
+
+ //FilePath (just verify that identical to what's been used)
+ if ( strcmp(out_filepath.c_str(),this->mediafile.c_str()) ) //that's if it NOT matches (!=0 ...)
+ Log::warn("media filepath %s does not matches filepath %s obtained from GetFileInfo",
+ out_filepath.c_str(),this->mediafile.c_str());
+
+ //openOptions (also verify that identical to what's been used)
+ std::string openFlagsString=Utils::XMPFiles_OpenOptionsToString(out_openFlags);
+ Log::info("openFlags: %s (%X)", openFlagsString.c_str(), out_openFlags);
+ if ( generalOpenFlags != out_openFlags )
+ Log::warn("out_openFlags (0x%X) differ from those used for open (0x%X)",
+ out_openFlags,generalOpenFlags);
+
+ //FileFormat (resolves, usually by way of extension unless specified)
+ std::string fileFormatName, fileFormatDescription;
+ Utils::fileFormatNameToString(out_fileFormat,fileFormatName,fileFormatDescription);
+ Log::info("fileFormat: %s (%s,0x%X)",
+ fileFormatDescription.c_str(),fileFormatName.c_str(),out_fileFormat);
+
+ //FormatInfo aka "HandlerFlags" (show what is possible with this format)
+ std::string formatInfoString=Utils::XMPFiles_FormatInfoToString(out_handlerFlags);
+ Log::info("formatInfo:%s (0x%X)", formatInfoString.c_str(), out_handlerFlags);
+
+ xmpFile.CloseFile(generalCloseFlags); //(enabled again now that bug 1352603 is fixed)
+}
+
+///////////////////////////////////////////////////////////////////////////////////////
+void Actions::get() {
+ if(!this->switch_nocheck) verifyFileIsReadable(this->mediafile);
+ XMP_FileFormat xmpFileFormat=kXMP_UnknownFile;
+
+ SXMPFiles xmpFile;
+ std::string xmpDump; //really just the raw string here
+
+ if ( !xmpFile.OpenFile(this->mediafile,xmpFileFormat,generalOpenFlags) )
+ Log::error("error opening file %s",this->mediafile.c_str());
+
+ if ( this->switch_compact ) {
+ if ( !xmpFile.GetXMP(0,&xmpDump,0))
+ Log::warn("file contains no XMP. - says xmpFile.GetXMP()");
+ else
+ Log::info("%s",xmpDump.c_str());
+ } else {
+ SXMPMeta xmpMeta; //get meta-object first, then get serialization
+ if ( !xmpFile.GetXMP(&xmpMeta,0,0))
+ Log::warn("file contains no XMP. - says xmpFile.GetXMP()");
+ else {
+ xmpMeta.SerializeToBuffer(&xmpDump,
+ 0, //NOT using kXMP_UseCompactFormat - Use a highly compact RDF syntax and layout.
+ 0); //receiving string, options, 0(default) padding
+ Log::info("%s",xmpDump.c_str());
+ }
+ }
+
+ xmpFile.CloseFile(generalCloseFlags); //(enabled again now that bug 1352603 is fixed)
+}
+///////////////////////////////////////////////////////////////////////////////////////
+
+void Actions::dump() {
+ if(!this->switch_nocheck) verifyFileIsReadable(this->mediafile);
+ XMP_FileFormat xmpFileFormat=kXMP_UnknownFile;
+
+ SXMPFiles xmpFile;
+ std::string xmpDump; //really just the raw string here
+
+ if ( !xmpFile.OpenFile(this->mediafile,xmpFileFormat,generalOpenFlags) )
+ Log::error("error opening file %s",this->mediafile.c_str());
+
+ SXMPMeta xmpMeta; //get meta-object first, then get serialization
+ if ( !xmpFile.GetXMP(&xmpMeta,0,0))
+ Log::warn("file contains no XMP. - says xmpFile.GetXMP()");
+ else {
+ Utils::dumpXMP(&xmpMeta);
+ }
+
+ xmpFile.CloseFile(generalCloseFlags); //(enabled again now that bug 1352603 is fixed)
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////
+void Actions::thumb() {
+ if(!this->switch_nocheck) verifyFileIsReadable(this->mediafile); //need readability
+ XMP_FileFormat xmpFileFormat=kXMP_UnknownFile;
+
+ SXMPFiles xmpFile;
+ XMP_ThumbnailInfo tnailInfo;
+ if ( !xmpFile.OpenFile(this->mediafile,
+ xmpFileFormat,
+ generalOpenFlags | kXMPFiles_OpenCacheTNail) )
+ Log::error("error opening file %s",this->mediafile.c_str());
+
+ if ( !xmpFile.GetThumbnail(&tnailInfo)) {
+ Log::warn("no thumbnail found. - says xmpFile.GetThumbnail()");
+ //TODO: comment-in again once bug 1352603 fixed
+ //xmpFile.CloseFile(generalCloseFlags);
+ return;
+ }
+ else {
+ //FileFormat (resolves, usually by way of extension unless specified)
+ std::string fileFormatName, fileFormatDescription;
+ Utils::fileFormatNameToString(tnailInfo.fileFormat,fileFormatName,fileFormatDescription);
+ Log::info("fileFormat: %s (%s,0x%X)",
+ fileFormatDescription.c_str(),fileFormatName.c_str(),tnailInfo.fileFormat);
+
+ Log::info("full image size:%dx%d",tnailInfo.fullWidth,tnailInfo.fullHeight);
+ Log::info("full orientation:0x%X",tnailInfo.fullOrientation);
+ Log::info("thumbnail size:%dx%d (%d bytes)",tnailInfo.tnailWidth,tnailInfo.tnailHeight,tnailInfo.tnailSize);
+ Log::info("thumbnail orientation:0x%X",tnailInfo.tnailOrientation);
+ Log::info("thumbnail format 0x%X",tnailInfo.tnailFormat);
+ }
+
+ xmpFile.CloseFile(generalCloseFlags); //(enabled again now that bug 1352603 is fixed)
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////
+void Actions::put() {
+ //need read and write
+ if(!this->switch_nocheck) verifyFileIsWritable(this->mediafile);
+
+ //first open regular to see if injection possible
+ XMP_FileFormat xmpFileFormat=kXMP_UnknownFile;
+ SXMPFiles xmpFile;
+
+ if ( !xmpFile.OpenFile(this->mediafile,xmpFileFormat,generalOpenFlags | kXMPFiles_OpenForUpdate) )
+ Log::error("error opening file %s",this->mediafile.c_str());
+
+ std::string out_filepath;
+ XMP_FileFormat out_fileFormat;
+ XMP_OptionBits out_handlerFlags;
+
+ if (!xmpFile.GetFileInfo(0,0,&out_fileFormat,&out_handlerFlags))
+ Log::error("error doing GetFileInfo %s",this->mediafile.c_str());
+
+ bool foundXMP = xmpFile.GetXMP( 0, 0, 0);
+
+ //construct the to-be-injected snippet
+ std::string xmpMetaString=getStringFromFile(this->xmpsnippet);
+ SXMPMeta xmpMeta(xmpMetaString.c_str(),(XMP_StringLen)xmpMetaString.length());
+
+ // append metadata if we found XMP or if we didn't but can inject
+ if ( foundXMP == true || (out_handlerFlags & kXMPFiles_CanInjectXMP ) ) {
+
+ if ( !xmpFile.CanPutXMP(xmpMeta) )
+ Log::warn("canPutXMP denies I can inject: (xmpFile.CanPutXMP()==false)");
+
+ try {
+ xmpFile.PutXMP(xmpMeta); //void unfortunatley, must close file to figure out result...
+ xmpFile.CloseFile(generalCloseFlags); // close the file
+
+ } catch ( XMP_Error& e ) {
+ Log::error("puttingXMP failed: %s",e.GetErrMsg());
+ }
+ } else { //handle the error
+ //FileFormat (resolves, usually by way of extension unless specified TODO)
+ std::string fileFormatName, fileFormatDescription;
+ Utils::fileFormatNameToString(out_fileFormat,fileFormatName,fileFormatDescription);
+ Log::error("the File %s of type %s neither contains XMP nor can it be injected (at least kXMPFiles_CanInjectXMP not returned)",
+ this->mediafile.c_str(), fileFormatName.c_str());
+ };
+}
+
+void Actions::doAction() {
+ //do open and close-flags one for all (add ThumbFlag if needed above)
+ generalOpenFlags=kXMPFiles_OpenForRead;
+ if (this->switch_smart) generalOpenFlags|=kXMPFiles_OpenUseSmartHandler;
+ if (this->switch_scan) generalOpenFlags|=kXMPFiles_OpenUsePacketScanning;
+
+ generalCloseFlags=0;
+ if (this->switch_safe) generalOpenFlags|=kXMPFiles_UpdateSafely;
+
+ switch (this->actiontype){
+ case Actions::VERSION:
+ version();
+ break;
+ case Actions::INFO:
+ info();
+ break;
+ case Actions::THUMB: //GetThumbnail()
+ thumb();
+ break;
+ case Actions::PUT: //PutXMP()
+ put();
+ break;
+ case Actions::GET: //GetXMP()
+ get();
+ break;
+ case Actions::DUMP:
+ dump();
+ break;
+ default:
+ Log::error("unknown command or not implemented!!");
+ break;
+ }
+}
diff --git a/samples/source/xmpcommand/Actions.h b/samples/source/xmpcommand/Actions.h
new file mode 100644
index 0000000..084c260
--- /dev/null
+++ b/samples/source/xmpcommand/Actions.h
@@ -0,0 +1,49 @@
+// =================================================================================================
+// Copyright 2004-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#ifndef __ACTIONS_h__
+#define __ACTIONS_h__ 1
+
+class Actions {
+ public:
+ enum ACTION_TYPE { NONE, VERSION, INFO, PUT, GET, DUMP, THUMB};
+
+ //the params to be set:
+ bool switch_safe; //asking for closing file with kXMPFiles_UpdateSafely (safe+rename that is)
+
+ //these two mututally exclusive:
+ bool switch_smart; /* Require the use of a smart handler. (kXMPFiles_OpenUseSmartHandler) */
+ bool switch_scan; /* Force packet scanning, don't use a smart handler. kXMPFiles_OpenUsePacketScanning */
+
+ bool switch_nocheck; /* no "sanity checks" on xmp-side i.e. for read/writeability, only usefull for testing "proper failure" */
+ bool switch_compact; /* ask extract to extract xmp in the compact (non-pretty) RDF-style (attributes rather than content of tags) */
+
+ std::string outfile;//output goes (besides stdout) to an output file...
+ std::string mediafile; //relative path to XMP snippet (null if none)
+
+ ACTION_TYPE actiontype; //inits with NONE
+
+ std::string xmpsnippet; //relative path to XMP snippet (null if none)
+
+ //distributes the actions to the different routines...
+ void doAction();
+
+private:
+ void version(void);
+ void info(void);
+ void thumb(void);
+ void put();
+ void get(void);
+ void dump(void);
+
+ XMP_OptionBits generalOpenFlags;
+ XMP_OptionBits generalCloseFlags;
+
+};
+
+#endif
diff --git a/samples/source/xmpcommand/PrintUsage.cpp b/samples/source/xmpcommand/PrintUsage.cpp
new file mode 100644
index 0000000..3931e18
--- /dev/null
+++ b/samples/source/xmpcommand/PrintUsage.cpp
@@ -0,0 +1,84 @@
+// =================================================================================================
+// Copyright 2004-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "globals.h"
+#include "PrintUsage.h"
+#include "Log.h"
+
+using namespace std;
+
+namespace XMPQE {
+
+ void PrintUsageShort(char* exename) {
+ Log::info("%s -version",exename);
+ Log::info(" Print version information for this utility");
+ Log::info("");
+ Log::info("%s -help",exename);
+ Log::info(" Print descriptions of all available switches, including examples");
+ Log::info("");
+ Log::info("%s [switch [switch]...] action mediafile",exename);
+ Log::info("");
+ Log::info("This command uses the XMPFiles component of the Adobe XMP toolkit. ");
+ Log::info("Copyright 2008 Adobe Systems Incorporated. All Rights Reserved.");
+ Log::info("");
+ }
+
+ void PrintUsageLong(char* exename) {
+ Log::info("%s -version",exename);
+ Log::info(" Print version information for this utility");
+ Log::info("%s -help",exename);
+ Log::info(" Print descriptions of all available switches, including examples");
+ Log::info("%s [switch [switch]...] action mediafile",exename);
+ Log::info("This command uses the XMPFiles component of the Adobe XMP toolkit. ");
+ Log::info("Copyright 2008 Adobe Systems Incorporated. All Rights Reserved.");
+ Log::info("NOTICE: Adobe permits you to use, modify, and distribute this file in");
+ Log::info(" accordance with the terms of the Adobe license agreement");
+ Log::info(" accompanying it.");
+ Log::info("");
+ Log::info("Switches:");
+ Log::info("-out <outfile> Writes output and logs all warnings and errors both to ");
+ Log::info(" standard output, and also to the specified output file. ");
+ Log::info(" If you specify the output file without this switch, stdout is not used.");
+ Log::info(" You should check that there are no warnings or errors (return value is 0) ");
+ Log::info(" before using the output; stderr is not used.");
+ Log::info("-safe Updates safely, writing to a temporary file then renaming ");
+ Log::info(" it to the original file name. See API documentation for ");
+ Log::info(" safeSave(kXMPFiles_UpdateSafely).");
+ Log::info("-smart Requires the use of a smart file-format handler, does no packet scanning.");
+ Log::info(" Use of smart handlers is the default, if one is available.");
+ Log::info("-scan Forces packet scanning, does not use a smart file-format handler.");
+ Log::info("-nocheck Omits readability/writeability checks. Used internally. ");
+ Log::info("");
+ Log::info("-compact Writes extracted XMP Packet in compact RDF-style, rather than");
+ Log::info(" pretty-printing attribute value for readability (which is the default).");
+
+ Log::info("");
+ Log::info("Actions:");
+ Log::info(" info <mediafile> Prints basic information about the file.");
+ Log::info(" thumb <mediafile> Prints information about the native thumbnail ");
+ Log::info(" if one is included, or informs that none is available.");
+ Log::info(" put <xmpfile> <mediafile> Injects the XMP contained in the specified xmpfile ");
+ Log::info(" into the specified mediafile.");
+ Log::info(" get <mediafile> Retrieves the XMP Packet contained in the specified mediafile.");
+ Log::info(" dump <mediafile> Prints the XMP Packet contained in the specified mediafile to standard output. ");
+ Log::info(" <<??>> USE dump ONLY for known-good-output tests, do not use get. <<??>> ");
+ Log::info("");
+ Log::info("Examples:");
+ Log::info("%s info Sample.jpg",exename);
+ Log::info("%s get ../Sample.jpg >onlyFileOut.txt",exename);
+ Log::info("%s -out alsoFileOut.txt get Sample.eps",exename);
+ Log::info("%s put xmp_mySnippet.xmp Sample.jpg",exename);
+ Log::info("%s -smart put xmp_mySnippet.xmp Sample.jpg",exename);
+ Log::info("(Smart handler would be used by default for a JPEG file even without the switch.)");
+ Log::info("");
+ Log::info("Returns 0 if there are no errors. Warnings and errors are printed as part of the output. ");
+ Log::info("You should check the return value before using the output.");
+ Log::info(" ");
+ }
+
+} // of namespace XMPQE
diff --git a/samples/source/xmpcommand/PrintUsage.h b/samples/source/xmpcommand/PrintUsage.h
new file mode 100644
index 0000000..a48b24a
--- /dev/null
+++ b/samples/source/xmpcommand/PrintUsage.h
@@ -0,0 +1,17 @@
+// =================================================================================================
+// Copyright 2004-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#ifndef __XMPQE_PRINT_USAGE_h__
+#define __XMPQE_PRINT_USAGE_h__ 1
+
+namespace XMPQE {
+ void PrintUsageShort(char* exename);
+ void PrintUsageLong(char* exename);
+}
+
+#endif
diff --git a/samples/source/xmpcommand/main.cpp b/samples/source/xmpcommand/main.cpp
new file mode 100644
index 0000000..2dc4374
--- /dev/null
+++ b/samples/source/xmpcommand/main.cpp
@@ -0,0 +1,208 @@
+// =================================================================================================
+// Copyright 2005-2008 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+/**
+* A command-line tool for performing basic XMP actions such as get, put and dump. Can be used for testing
+* and scripting automation.
+*/
+#ifdef WIN32
+ #pragma warning ( disable : 4267 ) // suppress string conversion warning
+#endif
+
+#include <stdexcept>
+#include <iostream>
+#include <string>
+#include <vector>
+#include <sstream>
+
+//some global constants / sanity checking
+#include "globals.h"
+
+#define EXENAME "xmpcommand"
+
+//XMP related
+#define TXMP_STRING_TYPE std::string
+#define XMP_INCLUDE_XMPFILES 1
+#include "XMP.hpp"
+#include "XMP.incl_cpp" //include in EXACTLY one source file (i.e. main, in Action gets you trouble...)
+
+//QE related
+#include "Actions.h"
+#include "Log.h"
+// -help output
+#include "PrintUsage.h"
+
+namespace XMPQE {
+ void InitDependencies()
+ {
+ if ( ! SXMPMeta::Initialize() )
+ Log::error( "XMPMeta::Initialize failed!" );
+
+ if ( ! SXMPFiles::Initialize() )
+ Log::error( "XMPFiles::Initialize failed!" );
+ }
+
+ void ShutdownDependencies()
+ {
+ SXMPFiles::Terminate();
+ SXMPMeta::Terminate();
+ }
+} //namespace XMPQE
+
+using namespace XMPQE;
+
+int main ( int argc, const char * argv[] )
+{
+ Actions action; //create Action (to fill up with parameters below...)
+
+ // ============================================================================================
+ // ============================================================================================
+ // ============================================================================================
+ try { // on try for all
+
+ //clean parameters (this is not elegant but might avoid some macPPC-side bus error bugs whatsoever
+ action.outfile="";
+ action.switch_safe=false;
+ action.switch_smart=false;
+ action.switch_scan=false;
+ action.switch_nocheck=false;
+ action.switch_compact=false;
+ action.mediafile="";
+ action.actiontype=Actions::NONE;
+ action.xmpsnippet="";
+
+ ////////////////////////////////////////////
+ // parameter verification
+ if ( argc == 1 ) { //aka no parameters, just command itself.
+ XMPQE::PrintUsageShort(EXENAME);
+ return 0;
+ } else if ( argc == 2 ) //single-paramter-call?
+ {
+ if ( !strcmp("help",argv[1]) || //only "help" and "version" permitted, ...
+ !strcmp("-help",argv[1]) ||
+ !strcmp("--help",argv[1]) ||
+ !strcmp("-h",argv[1]) ||
+ !strcmp("-?",argv[1]) ||
+ !strcmp("/?",argv[1]) ) {
+ XMPQE::PrintUsageLong(EXENAME);
+ return 0;
+ }
+ else if ( !strcmp("-version",argv[1]) || !strcmp("version",argv[1]) )
+ {
+ action.actiontype=Actions::VERSION;
+ }
+ else
+ { //..thus fail anything else
+ Log::error("unknown parameter %s",argv[1]);
+ }
+
+ }
+ else //multi-argument parameters
+ {
+ int i=1; // "for (int i=1;i<argc;i++)" ....
+
+ while (true) {
+ if (argv[i][0] != '-') {
+ break; //apparently done parsing switches
+ }
+ if ( !strcmp("-safe",argv[i])) {
+ action.switch_safe=true;
+ }
+ else if ( !strcmp("-smart",argv[i])) {
+ action.switch_smart=true;
+ }
+ else if ( !strcmp("-nocheck",argv[i])) {
+ action.switch_nocheck=true;
+ }
+ else if ( !strcmp("-compact",argv[i])) {
+ action.switch_compact=true;
+ }
+ else if ( !strcmp("-scan",argv[i])) {
+ action.switch_scan=true;
+ } else if ( !strcmp("-out",argv[i])) {
+ i++; //ok, so gimme that file
+ if (i>=argc) Log::error("missing output parameter, etc.");
+ action.outfile=argv[i];
+ } else
+ Log::error("unknown switch %s",argv[i]);
+ i++;
+ if (i>=argc) Log::error("missing action parameter, etc.");
+ }
+
+ //check mutually exclusive
+ if (action.switch_scan && action.switch_smart)
+ Log::error("use either -smart or -scan");
+
+ if ( !strcmp("info",argv[i])) {
+ action.actiontype= Actions::INFO;
+ } else if ( !strcmp("thumb",argv[i])) {
+ action.actiontype= Actions::THUMB;
+ } else if ( !strcmp("put",argv[i]) || !strcmp("inject",argv[i]) ) {
+ action.actiontype= Actions::PUT;
+ } else if ( !strcmp("get",argv[i]) || !strcmp("extract",argv[i]) ) {
+ action.actiontype= Actions::GET;
+ } else if ( !strcmp("dump",argv[i])) {
+ action.actiontype= Actions::DUMP;
+ } else
+ Log::error("_unknown action %s",argv[i]);
+ i++;
+
+ //only inject needs an in-file parameter really...
+ if ( action.actiontype== Actions::PUT) {
+ if (i>=argc) Log::error("missing <xmpfile> parameter");
+ action.xmpsnippet=argv[i];
+ i++;
+ }
+
+ //last argument must be mediafile
+ if (i>=argc) Log::error("missing mediafile parameter");
+ action.mediafile=argv[i];
+
+ i++;
+ if (i!=argc) Log::error("too many parameters.");
+ }
+
+ //Init ===========================================================================
+ InitDependencies();
+
+ //Do Action //////////////////
+ Log log(action.outfile.c_str()); //will start logging to file (if filename given) or not ("")
+ action.doAction();
+
+ // Shutdown /////////////////////////////////////////////
+ ShutdownDependencies();
+
+ }
+ catch (XMP_Error& e ) {
+ Log::info("Unexpected XMP_Error %s\n", e.GetErrMsg()); //throw no further, no Log::error.. !
+ return -2;
+ }
+ catch (LOG_Exception& q) {
+ Log::info("LOG_Exception:%s\n",q.what());
+ return -3;
+ }
+ catch (std::runtime_error& p) {
+ Log::info("caught std::runtime_error exception: %s\n",p.what());
+ return -4;
+ }
+ catch (...) {
+ Log::info("unidentified error on action execution\n");
+ return -5;
+ }
+
+ // ============================================================================================
+ // ============================================================================================
+ // ============================================================================================
+
+ if (Log::noErrorsOrWarnings)
+ return 0;
+ //else
+ Log::info("%s finished with warnings",EXENAME);
+ return 10;
+}
+
diff --git a/samples/BlueSquares/BlueSquare.ai b/samples/testfiles/BlueSquare.ai
index 2391f02..2391f02 100644..100755
--- a/samples/BlueSquares/BlueSquare.ai
+++ b/samples/testfiles/BlueSquare.ai
Binary files differ
diff --git a/samples/BlueSquares/BlueSquare.avi b/samples/testfiles/BlueSquare.avi
index f29de6d..f29de6d 100644..100755
--- a/samples/BlueSquares/BlueSquare.avi
+++ b/samples/testfiles/BlueSquare.avi
Binary files differ
diff --git a/samples/BlueSquares/BlueSquare.eps b/samples/testfiles/BlueSquare.eps
index ea4f79c..ea4f79c 100644..100755
--- a/samples/BlueSquares/BlueSquare.eps
+++ b/samples/testfiles/BlueSquare.eps
diff --git a/samples/BlueSquares/BlueSquare.indd b/samples/testfiles/BlueSquare.indd
index c8b9680..c8b9680 100644..100755
--- a/samples/BlueSquares/BlueSquare.indd
+++ b/samples/testfiles/BlueSquare.indd
Binary files differ
diff --git a/samples/BlueSquares/BlueSquare.jpg b/samples/testfiles/BlueSquare.jpg
index 81b8a22..81b8a22 100644..100755
--- a/samples/BlueSquares/BlueSquare.jpg
+++ b/samples/testfiles/BlueSquare.jpg
Binary files differ
diff --git a/samples/BlueSquares/BlueSquare.mov b/samples/testfiles/BlueSquare.mov
index 2ee3885..2ee3885 100644..100755
--- a/samples/BlueSquares/BlueSquare.mov
+++ b/samples/testfiles/BlueSquare.mov
Binary files differ
diff --git a/samples/BlueSquares/BlueSquare.mp3 b/samples/testfiles/BlueSquare.mp3
index 0b275b2..0b275b2 100644..100755
--- a/samples/BlueSquares/BlueSquare.mp3
+++ b/samples/testfiles/BlueSquare.mp3
Binary files differ
diff --git a/samples/BlueSquares/BlueSquare.pdf b/samples/testfiles/BlueSquare.pdf
index 2498719..2498719 100644..100755
--- a/samples/BlueSquares/BlueSquare.pdf
+++ b/samples/testfiles/BlueSquare.pdf
Binary files differ
diff --git a/samples/BlueSquares/BlueSquare.png b/samples/testfiles/BlueSquare.png
index 91589cd..91589cd 100755
--- a/samples/BlueSquares/BlueSquare.png
+++ b/samples/testfiles/BlueSquare.png
Binary files differ
diff --git a/samples/BlueSquares/BlueSquare.psd b/samples/testfiles/BlueSquare.psd
index 1850b8f..1850b8f 100644..100755
--- a/samples/BlueSquares/BlueSquare.psd
+++ b/samples/testfiles/BlueSquare.psd
Binary files differ
diff --git a/samples/BlueSquares/BlueSquare.tif b/samples/testfiles/BlueSquare.tif
index 3ae7b02..3ae7b02 100644..100755
--- a/samples/BlueSquares/BlueSquare.tif
+++ b/samples/testfiles/BlueSquare.tif
Binary files differ
diff --git a/samples/BlueSquares/BlueSquare.wav b/samples/testfiles/BlueSquare.wav
index c9983ff..c9983ff 100644..100755
--- a/samples/BlueSquares/BlueSquare.wav
+++ b/samples/testfiles/BlueSquare.wav
Binary files differ
diff --git a/samples/testfiles/Image1.jpg b/samples/testfiles/Image1.jpg
new file mode 100755
index 0000000..0da199f
--- /dev/null
+++ b/samples/testfiles/Image1.jpg
Binary files differ
diff --git a/samples/testfiles/Image2.jpg b/samples/testfiles/Image2.jpg
new file mode 100755
index 0000000..17862cc
--- /dev/null
+++ b/samples/testfiles/Image2.jpg
Binary files differ
diff --git a/source/XMPCore/ExpatAdapter.cpp b/source/XMPCore/ExpatAdapter.cpp
index d383c98..3dff828 100644
--- a/source/XMPCore/ExpatAdapter.cpp
+++ b/source/XMPCore/ExpatAdapter.cpp
@@ -1,5 +1,5 @@
// =================================================================================================
-// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2005-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -12,6 +12,8 @@
#include "ExpatAdapter.hpp"
#include "XMPMeta.hpp"
+#include "expat.h"
+
#include <string.h>
using namespace std;
@@ -23,7 +25,7 @@ using namespace std;
// *** Set memory handlers.
#ifndef DumpXMLParseEvents
- #define DumpXMLParseEvents 0
+ #define DumpXMLParseEvents 0
#endif
#define FullNameSeparator '@'
@@ -43,16 +45,38 @@ static void EndCdataSectionHandler ( void * userData );
static void ProcessingInstructionHandler ( void * userData, XMP_StringPtr target, XMP_StringPtr data );
static void CommentHandler ( void * userData, XMP_StringPtr comment );
-static void DefaultHandler ( void * userData, XMP_StringPtr data, int len );
+#if BanAllEntityUsage
+
+ // For now we do this by banning DOCTYPE entirely. This is easy and consistent with what is
+ // available in recent Java XML parsers. Another, somewhat less drastic, approach would be to
+ // ban all entity declarations. We can't allow declarations and ban references, Expat does not
+ // call the SkippedEntityHandler for references in attribute values.
+
+ // ! Standard entities (&amp;, &lt;, &gt;, &quot;, &apos;, and numeric character references) are
+ // ! not banned. Expat handles them transparently no matter what.
+
+ static void StartDoctypeDeclHandler ( void * userData, XMP_StringPtr doctypeName,
+ XMP_StringPtr sysid, XMP_StringPtr pubid, int has_internal_subset );
+
+#endif
// =================================================================================================
+
+extern "C" ExpatAdapter * XMP_NewExpatAdapter()
+{
+ return new ExpatAdapter;
+} // XMP_NewExpatAdapter
+
// =================================================================================================
-ExpatAdapter::ExpatAdapter() : parser(0), nesting(0)
+ExpatAdapter::ExpatAdapter() : parser(0)
{
- #if XMP_DebugBuild & DumpXMLParseEvents
- if ( this->parseLog == 0 ) this->parseLog = stdout;
+ #if XMP_DebugBuild
+ this->elemNesting = 0;
+ #if DumpXMLParseEvents
+ if ( this->parseLog == 0 ) this->parseLog = stdout;
+ #endif
#endif
this->parser = XML_ParserCreateNS ( 0, FullNameSeparator );
@@ -69,8 +93,11 @@ ExpatAdapter::ExpatAdapter() : parser(0), nesting(0)
XML_SetProcessingInstructionHandler ( this->parser, ProcessingInstructionHandler );
XML_SetCommentHandler ( this->parser, CommentHandler );
- // ??? XML_SetDefaultHandlerExpand ( this->parser, DefaultHandler );
-
+ #if BanAllEntityUsage
+ XML_SetStartDoctypeDeclHandler ( this->parser, StartDoctypeDeclHandler );
+ isAborted = false;
+ #endif
+
this->parseStack.push_back ( &this->tree ); // Push the XML root node.
} // ExpatAdapter::ExpatAdapter
@@ -93,7 +120,7 @@ ExpatAdapter::~ExpatAdapter()
static const char * kOneSpace = " ";
-void ExpatAdapter::ParseBuffer ( const void * buffer, size_t length, bool last )
+void ExpatAdapter::ParseBuffer ( const void * buffer, size_t length, bool last /* = true */ )
{
enum XML_Status status;
@@ -104,6 +131,10 @@ void ExpatAdapter::ParseBuffer ( const void * buffer, size_t length, bool last )
}
status = XML_Parse ( this->parser, (const char *)buffer, length, last );
+
+ #if BanAllEntityUsage
+ if ( this->isAborted ) XMP_Throw ( "DOCTYPE is not allowed", kXMPErr_BadXML );
+ #endif
if ( status != XML_STATUS_OK ) {
@@ -141,9 +172,9 @@ void ExpatAdapter::ParseBuffer ( const void * buffer, size_t length, bool last )
#if XMP_DebugBuild & DumpXMLParseEvents
- static inline void PrintIndent ( FILE * file, size_t nesting )
+ static inline void PrintIndent ( FILE * file, size_t count )
{
- for ( ; nesting > 0; --nesting ) fprintf ( file, " " );
+ for ( ; count > 0; --count ) fprintf ( file, " " );
}
#endif
@@ -170,12 +201,15 @@ static void SetQualName ( XMP_StringPtr fullName, XML_Node * node )
if ( fullName[sepPos] == FullNameSeparator ) {
XMP_StringPtr prefix;
+ XMP_StringLen prefixLen;
XMP_StringPtr localPart = fullName + sepPos + 1;
node->ns.assign ( fullName, sepPos );
if ( node->ns == "http://purl.org/dc/1.1/" ) node->ns = "http://purl.org/dc/elements/1.1/";
- bool found = XMPMeta::GetNamespacePrefix ( node->ns.c_str(), &prefix, &voidStringLen );
+
+ bool found = XMPMeta::GetNamespacePrefix ( node->ns.c_str(), &prefix, &prefixLen );
if ( ! found ) XMP_Throw ( "Unknown URI in Expat full name", kXMPErr_ExternalFailure );
+ node->nsPrefixLen = prefixLen; // ! Includes the ':'.
node->name = prefix;
node->name += localPart;
@@ -188,9 +222,11 @@ static void SetQualName ( XMP_StringPtr fullName, XML_Node * node )
if ( node->name == "about" ) {
node->ns = kXMP_NS_RDF;
node->name = "rdf:about";
+ node->nsPrefixLen = 4; // ! Include the ':'.
} else if ( node->name == "ID" ) {
node->ns = kXMP_NS_RDF;
node->name = "rdf:ID";
+ node->nsPrefixLen = 4; // ! Include the ':'.
}
}
@@ -216,7 +252,7 @@ static void StartNamespaceDeclHandler ( void * userData, XMP_StringPtr prefix, X
#if XMP_DebugBuild & DumpXMLParseEvents
if ( thiz->parseLog != 0 ) {
- PrintIndent ( thiz->parseLog, thiz->nesting );
+ PrintIndent ( thiz->parseLog, thiz->elemNesting );
fprintf ( thiz->parseLog, "StartNamespace: %s - \"%s\"\n", prefix, uri );
}
#endif
@@ -240,7 +276,7 @@ static void EndNamespaceDeclHandler ( void * userData, XMP_StringPtr prefix )
#if XMP_DebugBuild & DumpXMLParseEvents
if ( thiz->parseLog != 0 ) {
- PrintIndent ( thiz->parseLog, thiz->nesting );
+ PrintIndent ( thiz->parseLog, thiz->elemNesting );
fprintf ( thiz->parseLog, "EndNamespace: %s\n", prefix );
}
#endif
@@ -263,7 +299,7 @@ static void StartElementHandler ( void * userData, XMP_StringPtr name, XMP_Strin
#if XMP_DebugBuild & DumpXMLParseEvents
if ( thiz->parseLog != 0 ) {
- PrintIndent ( thiz->parseLog, thiz->nesting );
+ PrintIndent ( thiz->parseLog, thiz->elemNesting );
fprintf ( thiz->parseLog, "StartElement: %s, %d attrs", name, attrCount );
for ( XMP_StringPtr* attr = attrs; *attr != 0; attr += 2 ) {
XMP_StringPtr attrName = *attr;
@@ -295,12 +331,13 @@ static void StartElementHandler ( void * userData, XMP_StringPtr name, XMP_Strin
parentNode->content.push_back ( elemNode );
thiz->parseStack.push_back ( elemNode );
- if ( (elemNode->name == "rdf:RDF") || (elemNode->name == "pxmp:XMP_Packet") ) {
+ if ( elemNode->name == "rdf:RDF" ) {
thiz->rootNode = elemNode;
++thiz->rootCount;
}
-
- ++thiz->nesting;
+ #if XMP_DebugBuild
+ ++thiz->elemNesting;
+ #endif
} // StartElementHandler
@@ -312,12 +349,14 @@ static void EndElementHandler ( void * userData, XMP_StringPtr name )
ExpatAdapter * thiz = (ExpatAdapter*)userData;
- --thiz->nesting;
+ #if XMP_DebugBuild
+ --thiz->elemNesting;
+ #endif
(void) thiz->parseStack.pop_back();
#if XMP_DebugBuild & DumpXMLParseEvents
if ( thiz->parseLog != 0 ) {
- PrintIndent ( thiz->parseLog, thiz->nesting );
+ PrintIndent ( thiz->parseLog, thiz->elemNesting );
fprintf ( thiz->parseLog, "EndElement: %s\n", name );
}
#endif
@@ -334,9 +373,9 @@ static void CharacterDataHandler ( void * userData, XMP_StringPtr cData, int len
#if XMP_DebugBuild & DumpXMLParseEvents
if ( thiz->parseLog != 0 ) {
- PrintIndent ( thiz->parseLog, thiz->nesting );
+ PrintIndent ( thiz->parseLog, thiz->elemNesting );
fprintf ( thiz->parseLog, "CharContent: \"" );
- for ( ; len > 0; --len, ++cData ) fprintf ( thiz->parseLog, "%c", *cData );
+ for ( int i = 0; i < len; ++i ) fprintf ( thiz->parseLog, "%c", cData[i] );
fprintf ( thiz->parseLog, "\"\n" );
}
#endif
@@ -361,7 +400,7 @@ static void StartCdataSectionHandler ( void * userData )
#if XMP_DebugBuild & DumpXMLParseEvents
if ( thiz->parseLog != 0 ) {
- PrintIndent ( thiz->parseLog, thiz->nesting );
+ PrintIndent ( thiz->parseLog, thiz->elemNesting );
fprintf ( thiz->parseLog, "StartCDATA\n" );
}
#endif
@@ -382,7 +421,7 @@ static void EndCdataSectionHandler ( void * userData )
#if XMP_DebugBuild & DumpXMLParseEvents
if ( thiz->parseLog != 0 ) {
- PrintIndent ( thiz->parseLog, thiz->nesting );
+ PrintIndent ( thiz->parseLog, thiz->elemNesting );
fprintf ( thiz->parseLog, "EndCDATA\n" );
}
#endif
@@ -401,7 +440,7 @@ static void ProcessingInstructionHandler ( void * userData, XMP_StringPtr target
#if XMP_DebugBuild & DumpXMLParseEvents
if ( thiz->parseLog != 0 ) {
- PrintIndent ( thiz->parseLog, thiz->nesting );
+ PrintIndent ( thiz->parseLog, thiz->elemNesting );
fprintf ( thiz->parseLog, "PI: %s - \"%s\"\n", target, data );
}
#endif
@@ -428,7 +467,7 @@ static void CommentHandler ( void * userData, XMP_StringPtr comment )
#if XMP_DebugBuild & DumpXMLParseEvents
if ( thiz->parseLog != 0 ) {
- PrintIndent ( thiz->parseLog, thiz->nesting );
+ PrintIndent ( thiz->parseLog, thiz->elemNesting );
fprintf ( thiz->parseLog, "Comment: \"%s\"\n", comment );
}
#endif
@@ -439,27 +478,25 @@ static void CommentHandler ( void * userData, XMP_StringPtr comment )
// =================================================================================================
-static void DefaultHandler ( void * userData, XMP_StringPtr data, int len )
+#if BanAllEntityUsage
+static void StartDoctypeDeclHandler ( void * userData, XMP_StringPtr doctypeName,
+ XMP_StringPtr sysid, XMP_StringPtr pubid, int has_internal_subset )
{
IgnoreParam(userData);
- #if XMP_DebugBuild & DumpXMLParseEvents // Avoid unused variable warning.
- ExpatAdapter * thiz = (ExpatAdapter*)userData;
- #endif
+ ExpatAdapter * thiz = (ExpatAdapter*)userData;
- if ( (data == 0) || (len == 0) ) { data = ""; len = 0; }
-
- #if XMP_DebugBuild & DumpXMLParseEvents
+ #if XMP_DebugBuild & DumpXMLParseEvents // Avoid unused variable warning.
if ( thiz->parseLog != 0 ) {
- PrintIndent ( thiz->parseLog, thiz->nesting );
- fprintf ( thiz->parseLog, ">>default<<: \"" );
- for ( ; len > 0; --len, ++data ) fprintf ( thiz->parseLog, "%c", *data );
- fprintf ( thiz->parseLog, "\"\n" );
+ PrintIndent ( thiz->parseLog, thiz->elemNesting );
+ fprintf ( thiz->parseLog, "DocType: \"%s\"\n", doctypeName );
}
#endif
- // *** Ignore for now. Complain if not whitespace?
-
-} // DefaultHandler
+ thiz->isAborted = true; // ! Can't throw an exception across the plain C Expat frames.
+ (void) XML_StopParser ( thiz->parser, XML_FALSE /* not resumable */ );
+
+} // StartDoctypeDeclHandler
+#endif
// =================================================================================================
diff --git a/source/XMPCore/ParseRDF.cpp b/source/XMPCore/ParseRDF.cpp
index 575b617..31fb2b9 100644
--- a/source/XMPCore/ParseRDF.cpp
+++ b/source/XMPCore/ParseRDF.cpp
@@ -1,5 +1,5 @@
// =================================================================================================
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -8,6 +8,7 @@
#include "XMP_Environment.h" // ! This must be the first include!
#include "XMPCore_Impl.hpp"
+#include "ExpatAdapter.hpp"
#include <cstring>
@@ -511,8 +512,8 @@ AddQualifierNode ( XMP_Node * xmpParent, const XMP_VarString & name, const XMP_V
}
xmpParent->options |= kXMP_PropHasType;
}
-
- xmpParent->options |= kXMP_PropHasQualifiers; // ! Don't set for the pxmp:compact.
+
+ xmpParent->options |= kXMP_PropHasQualifiers;
return newQual;
@@ -712,7 +713,7 @@ RDF_NodeElementList ( XMP_Node * xmpParent, const XML_Node & xmlParent, bool isT
XML_cNodePos endChild = xmlParent.content.end();
for ( ; currChild != endChild; ++currChild ) {
- if ( IsWhitespaceNode ( **currChild ) ) continue;
+ if ( (*currChild)->IsWhitespaceNode() ) continue;
RDF_NodeElement ( xmpParent, **currChild, isTopLevel );
}
@@ -796,13 +797,10 @@ RDF_NodeElementAttrs ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTo
// This is the rdf:about attribute on a top level node. Set the XMP tree name if
// it doesn't have a name yet. Make sure this name matches the XMP tree name.
XMP_Assert ( xmpParent->parent == 0 ); // Must be the tree root node.
- if ( ! xmpParent->name.empty() ) {
- if ( xmpParent->name != (*currAttr)->value ) XMP_Throw ( "Mismatched top level rdf:about values", kXMPErr_BadXMP );
- } else {
+ if ( xmpParent->name.empty() ) {
xmpParent->name = (*currAttr)->value;
- #if 0 // *** XMP_DebugBuild
- xmpParent->_namePtr = xmpParent->name.c_str();
- #endif
+ } else if ( ! (*currAttr)->value.empty() ) {
+ if ( xmpParent->name != (*currAttr)->value ) XMP_Throw ( "Mismatched top level rdf:about values", kXMPErr_BadXMP );
}
}
@@ -836,7 +834,7 @@ RDF_PropertyElementList ( XMP_Node * xmpParent, const XML_Node & xmlParent, bool
XML_cNodePos endChild = xmlParent.content.end();
for ( ; currChild != endChild; ++currChild ) {
- if ( IsWhitespaceNode ( **currChild ) ) continue;
+ if ( (*currChild)->IsWhitespaceNode() ) continue;
if ( (*currChild)->kind != kElemNode ) {
XMP_Throw ( "Expected property element node not found", kXMPErr_BadRDF );
}
@@ -1010,7 +1008,7 @@ RDF_ResourcePropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bo
XML_cNodePos endChild = xmlNode.content.end();
for ( ; currChild != endChild; ++currChild ) {
- if ( ! IsWhitespaceNode ( **currChild ) ) break;
+ if ( ! (*currChild)->IsWhitespaceNode() ) break;
}
if ( currChild == endChild ) XMP_Throw ( "Missing child of resource property element", kXMPErr_BadRDF );
if ( (*currChild)->kind != kElemNode ) XMP_Throw ( "Children of resource property element must be XML elements", kXMPErr_BadRDF );
@@ -1040,7 +1038,7 @@ RDF_ResourcePropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bo
}
for ( ++currChild; currChild != endChild; ++currChild ) {
- if ( ! IsWhitespaceNode ( **currChild ) ) XMP_Throw ( "Invalid child of resource property element", kXMPErr_BadRDF );
+ if ( ! (*currChild)->IsWhitespaceNode() ) XMP_Throw ( "Invalid child of resource property element", kXMPErr_BadRDF );
}
} // RDF_ResourcePropertyElement
diff --git a/source/XMPCore/WXMPMeta.cpp b/source/XMPCore/WXMPMeta.cpp
index 937409a..4c95c5d 100644
--- a/source/XMPCore/WXMPMeta.cpp
+++ b/source/XMPCore/WXMPMeta.cpp
@@ -1,5 +1,5 @@
// =================================================================================================
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -127,7 +127,7 @@ WXMPMeta_DecrementRefCount_1 ( XMPMetaRef xmpRef )
// validate parameters
// call through to the implementation
// retain toolbox lock if necessary
-// catch anything and return an appropriate BIBError object
+// catch anything and return an appropriate XMP_Error object
// return null (no error if we get to here)
//
// The toolbox lock is acquired through a local wrapper object that automatically unlocks when the
@@ -385,7 +385,7 @@ WXMPMeta_RegisterStandardAliases_1 ( XMP_StringPtr schemaNS,
// acquire object lock
// call through to the implementation
// retain object lock if necessary
-// catch anything and return an appropriate BIBError object
+// catch anything and return an appropriate XMP_Error object
// return null (no error if we get to here)
//
// The object lock is acquired through a local wrapper object that automatically unlocks when the
@@ -1119,6 +1119,34 @@ WXMPMeta_DumpObject_1 ( XMPMetaRef xmpRef,
// -------------------------------------------------------------------------------------------------
void
+WXMPMeta_Sort_1 ( XMPMetaRef xmpRef,
+ WXMP_Result * wResult )
+{
+ XMP_ENTER_WRAPPER ( "WXMPMeta_Sort_1" )
+
+ XMPMeta * meta = WtoXMPMeta_Ptr ( xmpRef );
+ meta->Sort();
+
+ XMP_EXIT_WRAPPER
+}
+
+// -------------------------------------------------------------------------------------------------
+
+void
+WXMPMeta_Erase_1 ( XMPMetaRef xmpRef,
+ WXMP_Result * wResult )
+{
+ XMP_ENTER_WRAPPER ( "WXMPMeta_Erase_1" )
+
+ XMPMeta * meta = WtoXMPMeta_Ptr ( xmpRef );
+ meta->Erase();
+
+ XMP_EXIT_WRAPPER
+}
+
+// -------------------------------------------------------------------------------------------------
+
+void
WXMPMeta_Clone_1 ( XMPMetaRef xmpRef,
XMP_OptionBits options,
WXMP_Result * wResult ) /* const */
@@ -1126,7 +1154,8 @@ WXMPMeta_Clone_1 ( XMPMetaRef xmpRef,
XMP_ENTER_WRAPPER ( "WXMPMeta_Clone_1" )
const XMPMeta & xOriginal = WtoXMPMeta_Ref ( xmpRef );
- XMPMeta * xClone = xOriginal.Clone ( options );
+ XMPMeta * xClone = new XMPMeta;
+ xOriginal.Clone ( xClone, options );
XMP_Assert ( xClone->clientRefs == 0 ); // ! Gets incremented in TXMPMeta::Clone.
wResult->ptrResult = xClone;
diff --git a/source/XMPCore/WXMPUtils.cpp b/source/XMPCore/WXMPUtils.cpp
index 1ab33f3..dac093a 100644
--- a/source/XMPCore/WXMPUtils.cpp
+++ b/source/XMPCore/WXMPUtils.cpp
@@ -1,5 +1,5 @@
// =================================================================================================
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
diff --git a/source/XMPCore/XMLParserAdapter.hpp b/source/XMPCore/XMLParserAdapter.hpp
deleted file mode 100644
index 2d78779..0000000
--- a/source/XMPCore/XMLParserAdapter.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef __XMLParserAdapter_hpp__
-#define __XMLParserAdapter_hpp__
-
-// =================================================================================================
-// Copyright 2005-2007 Adobe Systems Incorporated
-// All Rights Reserved.
-//
-// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
-// of the Adobe license agreement accompanying it.
-// =================================================================================================
-
-#include "XMP_Environment.h" // ! Must be the first #include!
-#include "XMPCore_Impl.hpp"
-
-// =================================================================================================
-// Abstract base class for XML parser adapters used by the XMP toolkit.
-// =================================================================================================
-
-enum { kXMLPendingInputMax = 16 };
-
-class XMLParserAdapter {
-public:
-
- XMLParserAdapter()
- : tree(0,"",kRootNode), rootNode(0), rootCount(0), charEncoding(XMP_OptionBits(-1)), pendingCount(0)
- {
- #if XMP_DebugBuild
- parseLog = 0;
- #endif
- };
-
- virtual ~XMLParserAdapter() {};
-
- virtual void ParseBuffer ( const void * buffer, size_t length, bool last ) = 0;
-
- XML_Node tree;
- XML_NodeVector parseStack;
- XML_Node * rootNode;
- size_t rootCount;
-
- XMP_OptionBits charEncoding;
- size_t pendingCount;
- unsigned char pendingInput[kXMLPendingInputMax]; // Buffered input for character encoding checks.
-
- #if XMP_DebugBuild
- FILE * parseLog;
- #endif
-
-};
-
-// =================================================================================================
-
-#endif // __XMLParserAdapter_hpp__
diff --git a/source/XMPCore/XMPCore_Impl.cpp b/source/XMPCore/XMPCore_Impl.cpp
index 32687ee..1cf92c6 100644
--- a/source/XMPCore/XMPCore_Impl.cpp
+++ b/source/XMPCore/XMPCore_Impl.cpp
@@ -84,28 +84,7 @@ WXMP_Result void_wResult;
// ! times. There is a single XMP lock which is acquired in the wrapper classes. Internal calls
// ! never go back out to the wrappers.
-#if XMP_MacBuild
-
- bool XMP_InitMutex ( XMP_Mutex * mutex ) {
- OSStatus err = MPCreateCriticalRegion ( mutex );
- return (err == noErr );
- }
-
- void XMP_TermMutex ( XMP_Mutex & mutex ) {
- (void) MPDeleteCriticalRegion ( mutex );
- }
-
- void XMP_EnterCriticalRegion ( XMP_Mutex & mutex ) {
- OSStatus err = MPEnterCriticalRegion ( mutex, kDurationForever );
- if ( err != noErr ) XMP_Throw ( "XMP_EnterCriticalRegion - MPEnterCriticalRegion failure", kXMPErr_ExternalFailure );
- }
-
- void XMP_ExitCriticalRegion ( XMP_Mutex & mutex ) {
- OSStatus err = MPExitCriticalRegion ( mutex );
- if ( err != noErr ) XMP_Throw ( "XMP_ExitCriticalRegion - MPExitCriticalRegion failure", kXMPErr_ExternalFailure );
- }
-
-#elif XMP_WinBuild
+#if XMP_WinBuild
bool XMP_InitMutex ( XMP_Mutex * mutex ) {
InitializeCriticalSection ( mutex );
@@ -124,8 +103,9 @@ WXMP_Result void_wResult;
LeaveCriticalSection ( &mutex );
}
-#elif XMP_UNIXBuild
+#else
+ // Use pthread for both Mac and generic UNIX.
// ! Would be nice to specify PTHREAD_MUTEX_ERRORCHECK, but the POSIX documentation is useless.
// ! Would be OK but overkill to specify PTHREAD_MUTEX_RECURSIVE.
@@ -1464,30 +1444,6 @@ DetectAltText ( XMP_Node * xmpParent )
} // DetectAltText
// =================================================================================================
-// IsWhitespaceNode
-// ================
-//
-// Return true if this is a character data node that contains only XML whitespace.
-
-// ! For now only recognize ASCII space, tab, CR, and LF.
-
-bool
-IsWhitespaceNode ( const XML_Node & xmlNode )
-{
- if ( xmlNode.kind != kCDataNode ) return false;
-
- for ( size_t i = 0; i < xmlNode.value.size(); ++i ) {
- unsigned char ch = xmlNode.value[i];
- if ( IsWhitespaceChar ( ch ) ) continue;
- // *** Add checks for other whitespace characters.
- return false; // All the checks failed, this isn't whitespace.
- }
-
- return true;
-
-} // IsWhitespaceNode
-
-// =================================================================================================
// SortNamedNodes
// ==============
//
diff --git a/source/XMPCore/XMPCore_Impl.hpp b/source/XMPCore/XMPCore_Impl.hpp
index 5afc577..d1be1c3 100644
--- a/source/XMPCore/XMPCore_Impl.hpp
+++ b/source/XMPCore/XMPCore_Impl.hpp
@@ -2,7 +2,7 @@
#define __XMPCore_Impl_hpp__
// =================================================================================================
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -13,10 +13,6 @@
#include "XMP_Const.h"
#include "XMP_BuildInfo.h"
-#ifndef UsePublicExpat
- #define UsePublicExpat 1
-#endif
-
#include "client-glue/WXMPMeta.hpp"
#include <vector>
@@ -25,14 +21,18 @@
#include <cassert>
-#if XMP_MacBuild
- #include <Multiprocessing.h>
-#elif XMP_WinBuild
+#if XMP_WinBuild
#include <Windows.h>
-#elif XMP_UNIXBuild
+#else
+ // Use pthread for both Mac and generic UNIX.
#include <pthread.h>
#endif
+#if XMP_WinBuild
+ #pragma warning ( disable : 4244 ) // possible loss of data (temporary for 64 bit builds)
+ #pragma warning ( disable : 4267 ) // possible loss of data (temporary for 64 bit builds)
+#endif
+
// =================================================================================================
// Primary internal types
@@ -40,6 +40,8 @@ class XMP_Node;
class XML_Node;
class XPathStepInfo;
+typedef XMP_Node * XMP_NodePtr;
+
typedef std::vector<XMP_Node*> XMP_NodeOffspring;
typedef XMP_NodeOffspring::iterator XMP_NodePtrPos;
@@ -106,6 +108,9 @@ extern WXMP_Result void_wResult;
#define WtoXMPIterator_Ref(iterRef) *((const XMPIterator *)(iterRef))
#define WtoXMPIterator_Ptr(iterRef) (((iterRef) == 0) ? 0 : (XMPIterator *)(iterRef))
+#define WtoXMPDocOps_Ref(docRef) *((const XMPDocOps *)(docRef))
+#define WtoXMPDocOps_Ptr(docRef) (((docRef) == 0) ? 0 : (XMPDocOps *)(docRef))
+
#define IgnoreParam(p) voidVoidPtr = (void*)&p
// =================================================================================================
@@ -192,11 +197,10 @@ extern WXMP_Result void_wResult;
// -------------------------------------------------------------------------------------------------
-#if XMP_MacBuild
- typedef MPCriticalRegionID XMP_Mutex;
-#elif XMP_WinBuild
+#if XMP_WinBuild
typedef CRITICAL_SECTION XMP_Mutex;
-#elif XMP_UNIXBuild
+#else
+ // Use pthread for both Mac and generic UNIX.
typedef pthread_mutex_t XMP_Mutex;
#endif
@@ -357,11 +361,6 @@ NormalizeLangArray ( XMP_Node * array );
extern void
DetectAltText ( XMP_Node * xmpParent );
-#define IsWhitespaceChar(ch) ( ((ch) == ' ') || ((ch) == 0x09) || ((ch) == 0x0A) || ((ch) == 0x0D) )
-
-extern bool
-IsWhitespaceNode ( const XML_Node & xmlNode );
-
extern void
SortNamedNodes ( XMP_NodeOffspring & nodeVector );
@@ -525,105 +524,6 @@ public:
: nodePtr ( new XMP_Node ( _parent, _name, _value, _options ) ) {};
};
-// =================================================================================================
-// XML_Node details
-
-// The XML_Nodes are used only during the XML/RDF parsing process. This presently uses an XML parser
-// to create an XML tree, then a recursive descent RDF recognizer to build the corresponding XMP.
-// This makes it easier to swap XML parsers and provides a clean separation of XML and RDF issues.
-// The overall parsing would be faster and use less memory if the RDF recognition were done on the
-// fly using a state machine. But it was much easier to write the recursive descent version. The
-// current implementation is pretty fast in absolute terms, so being faster might not be crucial.
-
-// Like the XMP tree, the XML tree contains vectors of pointers for down links, and offspring have
-// a pointer to their parent. Unlike the XMP tree, this is an exact XML document tree. There are no
-// introduced top level namespace nodes or rearrangement of the nodes..
-
-// The exact state of namespaces can vary during the XML parsing, depending on the parser in use.
-// By the time the RDF recognition is done though, the namespaces must be normalized. All of the
-// used namespaces must be registered, this is done automatically if necessary. All of the "live"
-// namespace prefixes will be unique. The ns field of an XML_Node is the namespace URI, the name
-// field contains a qualified name (prefix:local). This includes default namespace mapping, the
-// URI and prefix will be missing only for elements and attributes in no namespace.
-
-class XML_Node;
-enum { kRootNode = 0, kElemNode = 1, kAttrNode = 2, kCDataNode = 3, kPINode = 4 };
-
-typedef std::vector<XML_Node*> XML_NodeVector;
-typedef XML_NodeVector::iterator XML_NodePos;
-typedef XML_NodeVector::const_iterator XML_cNodePos;
-
-#if 0 // Pattern for iterating over the children or attributes:
- for ( size_t xxNum = 0, xxLim = _node_->_offspring_.size(); xxNum < xxLim; ++xxNum ) {
- const XML_Node * _curr_ = _node_->_offspring_[xxNum];
- }
-#endif
-
-class XML_Node {
-public:
-
- XMP_Uns8 kind;
- XMP_VarString ns, name, value;
- XML_Node * parent;
- XML_NodeVector attrs;
- XML_NodeVector content;
- #if 0 // *** XMP_DebugBuild
- XMP_StringPtr _namePtr, _valuePtr; // *** Not working, need operator=?
- #endif
-
- XML_Node ( XML_Node * _parent, XMP_StringPtr _name, XMP_Uns8 _kind )
- : kind(_kind), name(_name), parent(_parent)
- {
- #if 0 // *** XMP_DebugBuild
- _namePtr = name.c_str();
- _valuePtr = value.c_str();
- #endif
- };
-
- XML_Node ( XML_Node * _parent, const XMP_VarString & _name, XMP_Uns8 _kind )
- : kind(_kind), name(_name), parent(_parent)
- {
- #if 0 // *** XMP_DebugBuild
- _namePtr = name.c_str();
- _valuePtr = value.c_str();
- #endif
- };
-
- void RemoveAttrs()
- {
- for ( size_t i = 0, vLim = attrs.size(); i < vLim; ++i ) delete attrs[i];
- attrs.clear();
- }
-
- void RemoveContent()
- {
- for ( size_t i = 0, vLim = content.size(); i < vLim; ++i ) delete content[i];
- content.clear();
- }
-
- void ClearNode()
- {
- kind = 0;
- ns.erase();
- name.erase();
- value.erase();
- this->RemoveAttrs();
- this->RemoveContent();
- }
-
- virtual ~XML_Node() { RemoveAttrs(); RemoveContent(); }
-
-private:
- XML_Node() : kind(0), parent(0) // ! Make sure parent pointer is always set.
- {
- #if 0 // *** XMP_DebugBuild
- _namePtr = name.c_str();
- _valuePtr = value.c_str();
- #endif
- };
-
-};
-
extern void ProcessRDF ( XMP_Node * xmpTree, const XML_Node & xmlTree, XMP_OptionBits options );
// =================================================================================================
diff --git a/source/XMPCore/XMPMeta-GetSet.cpp b/source/XMPCore/XMPMeta-GetSet.cpp
index b564b37..41b01d5 100644
--- a/source/XMPCore/XMPMeta-GetSet.cpp
+++ b/source/XMPCore/XMPMeta-GetSet.cpp
@@ -1,5 +1,5 @@
// =================================================================================================
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -74,8 +74,8 @@ SetNodeValue ( XMP_Node * node, XMP_StringPtr value )
{
#if XMP_DebugBuild // ! Hack to force an assert.
- if ( (node->name == "xap:TestAssertNotify") && XMP_LitMatch ( value, "DoIt!" ) ) {
- XMP_Assert ( node->name != "xap:TestAssertNotify" );
+ if ( (node->name == "xmp:TestAssertNotify") && XMP_LitMatch ( value, "DoIt!" ) ) {
+ XMP_Assert ( node->name != "xmp:TestAssertNotify" );
}
#endif
@@ -1207,3 +1207,4 @@ XMPMeta::SetProperty_Date ( XMP_StringPtr schemaNS,
} // SetProperty_Date
// =================================================================================================
+
diff --git a/source/XMPCore/XMPMeta-Parse.cpp b/source/XMPCore/XMPMeta-Parse.cpp
index 9861286..5ff64f4 100644
--- a/source/XMPCore/XMPMeta-Parse.cpp
+++ b/source/XMPCore/XMPMeta-Parse.cpp
@@ -1,5 +1,5 @@
// =================================================================================================
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -105,23 +105,16 @@ static const char * kReplaceLatin1[128] =
// -------------------------------------------------------------------------------------------------
// PickBestRoot
// ------------
-//
-// Pick the first pxmp:XMP_Packet or x:xmpmeta among multiple root candidates. If there aren't any,
-// pick the first bare rdf:RDF if that is allowed. The returned root is the rdf:RDF child if an
-// x:xmpmeta element was chosen. The search is breadth first, so a higher level candiate is chosen
-// over a lower level one that was textually earlier in the serialized XML.
-
static const XML_Node * PickBestRoot ( const XML_Node & xmlParent, XMP_OptionBits options )
{
- // Look among this parent's content for pxmp:XMP_Packet or x:xmpmeta. The recursion for
- // x:xmpmeta is broader than the strictly defined choice, but gives us smaller code.
+
+ // Look among this parent's content for x:xmpmeta. The recursion for x:xmpmeta is broader than
+ // the strictly defined choice, but gives us smaller code.
for ( size_t childNum = 0, childLim = xmlParent.content.size(); childNum < childLim; ++childNum ) {
const XML_Node * childNode = xmlParent.content[childNum];
if ( childNode->kind != kElemNode ) continue;
- if ( childNode->name == "pxmp:XMP_Packet" ) return childNode;
if ( (childNode->name == "x:xmpmeta") || (childNode->name == "x:xapmeta") ) return PickBestRoot ( *childNode, 0 );
}
-
// Look among this parent's content for a bare rdf:RDF if that is allowed.
if ( ! (options & kXMP_RequireXMPMeta) ) {
for ( size_t childNum = 0, childLim = xmlParent.content.size(); childNum < childLim; ++childNum ) {
@@ -147,8 +140,8 @@ static const XML_Node * PickBestRoot ( const XML_Node & xmlParent, XMP_OptionBit
//
// Find the XML node that is the root of the XMP data tree. Generally this will be an outer node,
// but it could be anywhere if a general XML document is parsed (e.g. SVG). The XML parser counted
-// all rdf:RDF and pxmp:XMP_Packet nodes, and kept a pointer to the last one. If there is more than
-// one possible root use PickBestRoot to choose among them.
+// all possible root nodes, and kept a pointer to the last one. If there is more than one possible
+// root use PickBestRoot to choose among them.
//
// If there is a root node, try to extract the version of the previous XMP toolkit.
@@ -163,18 +156,6 @@ static const XML_Node * FindRootNode ( XMPMeta * thiz, const XMLParserAdapter &
XMP_StringPtr verStr = "";
- if ( rootNode->name == "pxmp:XMP_Packet" ) {
-
- for ( size_t attrNum = 0, attrLim = rootNode->attrs.size(); attrNum < attrLim; ++attrNum ) {
- const XML_Node * currAttr =rootNode->attrs[attrNum];
- if ( currAttr->name == "pxmp:xmptk" ) {
- verStr = currAttr->value.c_str();
- break;
- }
- }
-
- } else {
-
XMP_Assert ( rootNode->name == "rdf:RDF" );
if ( (options & kXMP_RequireXMPMeta) &&
@@ -189,8 +170,6 @@ static const XML_Node * FindRootNode ( XMPMeta * thiz, const XMLParserAdapter &
}
}
- }
-
// Decode the version number into MMmmuubbb digits. If any part is too big, peg it at 99 or 999.
unsigned long part;
@@ -633,6 +612,7 @@ RepairAltText ( XMP_Node & tree, XMP_StringPtr schemaNS, XMP_StringPtr arrayName
if ( (arrayNode == 0) || XMP_ArrayIsAltText ( arrayNode->options ) ) return; // Already OK.
if ( ! XMP_PropIsArray ( arrayNode->options ) ) return; // ! Not even an array, leave it alone.
+ // *** Should probably change simple values to LangAlt with 'x-default' item.
arrayNode->options |= (kXMP_PropArrayIsOrdered | kXMP_PropArrayIsAlternate | kXMP_PropArrayIsAltText);
@@ -689,9 +669,28 @@ TouchUpDataModel ( XMPMeta * xmp )
currSchema = FindSchemaNode ( &tree, kXMP_NS_EXIF, kXMP_ExistingOnly );
if ( currSchema != 0 ) {
+
// Do a special case fix for exif:GPSTimeStamp.
XMP_Node * gpsDateTime = FindChildNode ( currSchema, "exif:GPSTimeStamp", kXMP_ExistingOnly );
if ( gpsDateTime != 0 ) FixGPSTimeStamp ( currSchema, gpsDateTime );
+
+ // *** Should probably have RepairAltText change simple values to LangAlt with 'x-default' item.
+ // *** For now just do this for exif:UserComment, the one case we know about, late in cycle fix.
+ XMP_Node * userComment = FindChildNode ( currSchema, "exif:UserComment", kXMP_ExistingOnly );
+ if ( (userComment != 0) && XMP_PropIsSimple ( userComment->options ) ) {
+ XMP_Node * newChild = new XMP_Node ( userComment, kXMP_ArrayItemName,
+ userComment->value.c_str(), userComment->options );
+ newChild->qualifiers.swap ( userComment->qualifiers );
+ if ( ! XMP_PropHasLang ( newChild->options ) ) {
+ XMP_Node * langQual = new XMP_Node ( newChild, "xml:lang", "x-default", kXMP_PropIsQualifier );
+ newChild->qualifiers.insert ( newChild->qualifiers.begin(), langQual );
+ newChild->options |= (kXMP_PropHasQualifiers | kXMP_PropHasLang);
+ }
+ userComment->value.erase();
+ userComment->options = kXMP_PropArrayFormMask; // ! Happens to have all the right bits.
+ userComment->children.push_back ( newChild );
+ }
+
}
currSchema = FindSchemaNode ( &tree, kXMP_NS_DM, kXMP_ExistingOnly );
@@ -717,7 +716,7 @@ TouchUpDataModel ( XMPMeta * xmp )
RepairAltText ( tree, kXMP_NS_DC, "dc:description" ); // ! Note inclusion of prefixes for direct node lookup!
RepairAltText ( tree, kXMP_NS_DC, "dc:rights" );
RepairAltText ( tree, kXMP_NS_DC, "dc:title" );
- RepairAltText ( tree, kXMP_NS_XMP_Rights, "xapRights:UsageTerms" );
+ RepairAltText ( tree, kXMP_NS_XMP_Rights, "xmpRights:UsageTerms" );
RepairAltText ( tree, kXMP_NS_EXIF, "exif:UserComment" );
// Tweak old XMP: Move an instance ID from rdf:about to the xmpMM:InstanceID property. An old
@@ -1087,7 +1086,7 @@ XMPMeta::ParseFromBuffer ( XMP_StringPtr buffer,
if ( this->xmlParser == 0 ) {
if ( (xmpSize == 0) && lastClientCall ) return; // Tolerate empty parse. Expat complains if there are no XML elements.
- this->xmlParser = new ExpatAdapter;
+ this->xmlParser = XMP_NewExpatAdapter();
}
XMLParserAdapter& parser = *this->xmlParser;
diff --git a/source/XMPCore/XMPMeta-Serialize.cpp b/source/XMPCore/XMPMeta-Serialize.cpp
index 73c0d2b..0aa75ae 100644
--- a/source/XMPCore/XMPMeta-Serialize.cpp
+++ b/source/XMPCore/XMPMeta-Serialize.cpp
@@ -1,5 +1,5 @@
// =================================================================================================
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -43,9 +43,6 @@ using namespace std;
static const char * kPacketHeader = "<?xpacket begin=\"\xEF\xBB\xBF\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>";
static const char * kPacketTrailer = "<?xpacket end=\"w\"?>"; // ! The w/r is at [size-4].
-static const char * kPXMP_PacketStart = "<pxmp:XMP_Packet";
-static const char * kPXMP_PacketEnd = "</pxmp:XMP_Packet>";
-
static const char * kPXMP_SchemaGroup = "XMP_SchemaGroup";
static const char * kRDF_XMPMetaStart = "<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"";
@@ -1106,10 +1103,12 @@ SerializeAsRDF ( const XMPMeta & xmpObj,
}
// Write the xmpmeta element's start tag.
- for ( level = baseIndent; level > 0; --level ) headStr += indentStr;
- headStr += kRDF_XMPMetaStart;
- headStr += kXMPCore_VersionMessage "\">";
- headStr += newline;
+ if ( ! (options & kXMP_OmitXMPMetaElement) ) {
+ for ( level = baseIndent; level > 0; --level ) headStr += indentStr;
+ headStr += kRDF_XMPMetaStart;
+ headStr += kXMPCore_VersionMessage "\">";
+ headStr += newline;
+ }
// Write the rdf:RDF start tag.
for ( level = baseIndent+1; level > 0; --level ) headStr += indentStr;
@@ -1141,9 +1140,11 @@ SerializeAsRDF ( const XMPMeta & xmpObj,
headStr += newline;
// Write the xmpmeta end tag.
- for ( level = baseIndent; level > 0; --level ) headStr += indentStr;
- headStr += kRDF_XMPMetaEnd;
- headStr += newline;
+ if ( ! (options & kXMP_OmitXMPMetaElement) ) {
+ for ( level = baseIndent; level > 0; --level ) headStr += indentStr;
+ headStr += kRDF_XMPMetaEnd;
+ headStr += newline;
+ }
// Write the packet trailer PI into the tail string as UTF-8.
tailStr.erase();
diff --git a/source/XMPCore/XMPMeta.cpp b/source/XMPCore/XMPMeta.cpp
index 888d48e..c5def31 100644
--- a/source/XMPCore/XMPMeta.cpp
+++ b/source/XMPCore/XMPMeta.cpp
@@ -1,5 +1,5 @@
// =================================================================================================
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -12,14 +12,18 @@
#include "XMP_Environment.h" // ! This must be the first include!
#include "XMPCore_Impl.hpp"
+#include <stdio.h>
+
#include "XMPMeta.hpp"
#include "XMPIterator.hpp"
#include "XMPUtils.hpp"
-
#include "XMP_Version.h"
#include "UnicodeInlines.incl_cpp"
#include "UnicodeConversions.hpp"
+#include <algorithm> // For sort and stable_sort.
+#include <stdio.h> // For snprintf.
+
#if XMP_DebugBuild
#include <iostream>
#endif
@@ -82,11 +86,66 @@ static const char * kTenSpaces = " ";
#define OutProcHexInt(num) { snprintf ( buffer, sizeof(buffer), "%X", (num) ); /* AUDIT: Using sizeof for snprintf length is safe */ \
status = (*outProc) ( refCon, buffer, strlen(buffer) ); if ( status != 0 ) goto EXIT; }
+#define OutProcHexByte(num) { snprintf ( buffer, sizeof(buffer), "%.2X", (num) ); /* AUDIT: Using sizeof for snprintf length is safe */ \
+ status = (*outProc) ( refCon, buffer, strlen(buffer) ); if ( status != 0 ) goto EXIT; }
+
static const char * kIndent = " ";
#define OutProcIndent(lev) { for ( size_t i = 0; i < (lev); ++i ) OutProcNChars ( kIndent, 3 ); }
// -------------------------------------------------------------------------------------------------
+// DumpClearString
+// ---------------
+
+static XMP_Status
+DumpClearString ( const XMP_VarString & value, XMP_TextOutputProc outProc, void * refCon )
+{
+
+ char buffer [20];
+ bool prevNormal;
+ XMP_Status status = 0;
+
+ XMP_StringPtr spanStart, spanEnd;
+ XMP_StringPtr valueEnd = &value[0] + value.size();
+
+ spanStart = &value[0];
+ while ( spanStart < valueEnd ) {
+
+ // Output the next span of regular characters.
+ for ( spanEnd = spanStart; spanEnd < valueEnd; ++spanEnd ) {
+ if ( *spanEnd > 0x7F ) break;
+ if ( (*spanEnd < 0x20) && (*spanEnd != kTab) && (*spanEnd != kLF) ) break;
+ }
+ if ( spanStart != spanEnd ) status = (*outProc) ( refCon, spanStart, (spanEnd-spanStart) );
+ if ( status != 0 ) break;
+ spanStart = spanEnd;
+
+ // Output the next span of irregular characters.
+ prevNormal = true;
+ for ( spanEnd = spanStart; spanEnd < valueEnd; ++spanEnd ) {
+ if ( ((0x20 <= *spanEnd) && (*spanEnd <= 0x7F)) || (*spanEnd == kTab) || (*spanEnd == kLF) ) break;
+ char space = ' ';
+ if ( prevNormal ) space = '<';
+ status = (*outProc) ( refCon, &space, 1 );
+ if ( status != 0 ) break;
+ OutProcHexByte ( *spanEnd );
+ prevNormal = false;
+ }
+ if ( ! prevNormal ) {
+ status = (*outProc) ( refCon, ">", 1 );
+ if ( status != 0 ) return status;
+ }
+ spanStart = spanEnd;
+
+ }
+
+EXIT:
+ return status;
+
+} // DumpClearString
+
+
+// -------------------------------------------------------------------------------------------------
// DumpStringMap
// -------------
@@ -109,10 +168,10 @@ DumpStringMap ( const XMP_StringMap & map, XMP_StringPtr label, XMP_TextOutputPr
for ( currPos = map.begin(); currPos != endPos; ++currPos ) {
OutProcNChars ( " ", 2 );
- OutProcString ( currPos->first );
+ DumpClearString ( currPos->first, outProc, refCon );
OutProcPadding ( maxLen - currPos->first.size() );
OutProcNChars ( " => ", 4 );
- OutProcString ( currPos->second );
+ DumpClearString ( currPos->second, outProc, refCon );
OutProcNewline();
}
@@ -211,7 +270,7 @@ DumpPropertyTree ( const XMP_Node * currNode,
OutProcIndent ( (size_t)indent );
if ( itemIndex == 0 ) {
if ( currNode->options & kXMP_PropIsQualifier ) OutProcNChars ( "? ", 2 );
- OutProcString ( currNode->name );
+ DumpClearString ( currNode->name, outProc, refCon );
} else {
OutProcNChars ( "[", 1 );
OutProcDecInt ( itemIndex );
@@ -220,7 +279,7 @@ DumpPropertyTree ( const XMP_Node * currNode,
if ( ! (currNode->options & kXMP_PropCompositeMask) ) {
OutProcNChars ( " = \"", 4 );
- OutProcString ( currNode->value );
+ DumpClearString ( currNode->value, outProc, refCon );
OutProcNChars ( "\"", 1 );
}
@@ -408,6 +467,114 @@ static void DumpXMLTree ( FILE * log, const XML_Node & node, int indent )
#endif // DumpXMLParseTree
+// -------------------------------------------------------------------------------------------------
+// CompareNodeNames
+// ----------------
+//
+// Comparison routine for sorting XMP nodes by name. The name "xml:lang" is less than anything else,
+// and "rdf:type" is less than anything except "xml:lang". This preserves special rules for qualifiers.
+
+static bool
+CompareNodeNames ( XMP_Node * left, XMP_Node * right )
+{
+
+ if ( left->name == "xml:lang" ) return true;
+ if ( right->name == "xml:lang" ) return false;
+
+ if ( left->name == "rdf:type" ) return true;
+ if ( right->name == "rdf:type" ) return false;
+
+ return ( left->name < right->name );
+
+} // CompareNodeNames
+
+
+// -------------------------------------------------------------------------------------------------
+// CompareNodeValues
+// -----------------
+//
+// Comparison routine for sorting XMP nodes by value.
+
+static bool
+CompareNodeValues ( XMP_Node * left, XMP_Node * right )
+{
+
+ if ( XMP_PropIsSimple ( left->options ) && XMP_PropIsSimple ( right->options ) ) {
+ return ( left->value < right->value );
+ }
+
+ XMP_OptionBits leftForm = left->options & kXMP_PropCompositeMask;
+ XMP_OptionBits rightForm = right->options & kXMP_PropCompositeMask;
+
+ return ( leftForm < rightForm );
+
+} // CompareNodeValues
+
+
+// -------------------------------------------------------------------------------------------------
+// CompareNodeLangs
+// ----------------
+//
+// Comparison routine for sorting XMP nodes by xml:lang qualifier. An "x-default" value is less than
+// any other language.
+
+static bool
+CompareNodeLangs ( XMP_Node * left, XMP_Node * right )
+{
+
+ if ( left->qualifiers.empty() || (left->qualifiers[0]->name != "xml:lang") ) return false;
+ if ( right->qualifiers.empty() || (right->qualifiers[0]->name != "xml:lang") ) return false;
+
+ if ( left->qualifiers[0]->value == "x-default" ) return true;
+ if ( right->qualifiers[0]->value == "x-default" ) return false;
+
+ return ( left->qualifiers[0]->value < right->qualifiers[0]->value );
+
+} // CompareNodeLangs
+
+
+// -------------------------------------------------------------------------------------------------
+// SortWithinOffspring
+// -------------------
+//
+// Sort one level down, within the elements of a node vector. This sorts the qualifiers of each
+// node. If the node is a struct it sorts the fields by names. If the node is an unordered array it
+// sorts the elements by value. If the node is an AltText array it sorts the elements by language.
+
+static void
+SortWithinOffspring ( XMP_NodeOffspring & nodeVec )
+{
+
+ for ( size_t i = 0, limit = nodeVec.size(); i < limit; ++i ) {
+
+ XMP_Node * currPos = nodeVec[i];
+
+ if ( ! currPos->qualifiers.empty() ) {
+ sort ( currPos->qualifiers.begin(), currPos->qualifiers.end(), CompareNodeNames );
+ SortWithinOffspring ( currPos->qualifiers );
+ }
+
+ if ( ! currPos->children.empty() ) {
+
+ if ( XMP_PropIsStruct ( currPos->options ) || XMP_NodeIsSchema ( currPos->options ) ) {
+ sort ( currPos->children.begin(), currPos->children.end(), CompareNodeNames );
+ } else if ( XMP_PropIsArray ( currPos->options ) ) {
+ if ( XMP_ArrayIsUnordered ( currPos->options ) ) {
+ stable_sort ( currPos->children.begin(), currPos->children.end(), CompareNodeValues );
+ } else if ( XMP_ArrayIsAltText ( currPos->options ) ) {
+ sort ( currPos->children.begin(), currPos->children.end(), CompareNodeLangs );
+ }
+ }
+
+ SortWithinOffspring ( currPos->children );
+
+ }
+
+ }
+
+} // SortWithinOffspring
+
+
// =================================================================================================
// Constructors
// ============
@@ -451,7 +618,8 @@ XMPMeta::~XMPMeta() RELEASE_NO_THROW
XMPMeta::GetVersionInfo ( XMP_VersionInfo * info )
{
- memset ( info, 0, sizeof(XMP_VersionInfo) );
+ memset ( info, 0, sizeof(*info) ); // AUDIT: Safe, using sizeof the destination.
+ XMP_Assert ( sizeof(*info) == sizeof(XMP_VersionInfo) );
info->major = XMP_API_VERSION_MAJOR;
info->minor = XMP_API_VERSION_MINOR;
@@ -501,7 +669,7 @@ XMPMeta::Initialize()
(void) RegisterNamespace ( kXMP_NS_RDF, "rdf", &voidPtr, &voidLen );
(void) RegisterNamespace ( kXMP_NS_DC, "dc", &voidPtr, &voidLen );
- (void) RegisterNamespace ( kXMP_NS_XMP, "xap", &voidPtr, &voidLen );
+ (void) RegisterNamespace ( kXMP_NS_XMP, "xmp", &voidPtr, &voidLen );
(void) RegisterNamespace ( kXMP_NS_PDF, "pdf", &voidPtr, &voidLen );
(void) RegisterNamespace ( kXMP_NS_Photoshop, "photoshop", &voidPtr, &voidLen );
(void) RegisterNamespace ( kXMP_NS_PSAlbum, "album", &voidPtr, &voidLen );
@@ -516,17 +684,18 @@ XMPMeta::Initialize()
(void) RegisterNamespace ( kXMP_NS_WAV, "wav", &voidPtr, &voidLen );
(void) RegisterNamespace ( kXMP_NS_AdobeStockPhoto, "bmsp", &voidPtr, &voidLen );
+ (void) RegisterNamespace ( kXMP_NS_CreatorAtom, "creatorAtom", &voidPtr, &voidLen );
- (void) RegisterNamespace ( kXMP_NS_XMP_Rights, "xapRights", &voidPtr, &voidLen );
- (void) RegisterNamespace ( kXMP_NS_XMP_MM, "xapMM", &voidPtr, &voidLen );
- (void) RegisterNamespace ( kXMP_NS_XMP_BJ, "xapBJ", &voidPtr, &voidLen );
+ (void) RegisterNamespace ( kXMP_NS_XMP_Rights, "xmpRights", &voidPtr, &voidLen );
+ (void) RegisterNamespace ( kXMP_NS_XMP_MM, "xmpMM", &voidPtr, &voidLen );
+ (void) RegisterNamespace ( kXMP_NS_XMP_BJ, "xmpBJ", &voidPtr, &voidLen );
(void) RegisterNamespace ( kXMP_NS_XMP_Note, "xmpNote", &voidPtr, &voidLen );
(void) RegisterNamespace ( kXMP_NS_DM, "xmpDM", &voidPtr, &voidLen );
- (void) RegisterNamespace ( kXMP_NS_XMP_Text, "xapT", &voidPtr, &voidLen );
- (void) RegisterNamespace ( kXMP_NS_XMP_PagedFile, "xapTPg", &voidPtr, &voidLen );
- (void) RegisterNamespace ( kXMP_NS_XMP_Graphics, "xapG", &voidPtr, &voidLen );
- (void) RegisterNamespace ( kXMP_NS_XMP_Image, "xapGImg", &voidPtr, &voidLen );
+ (void) RegisterNamespace ( kXMP_NS_XMP_Text, "xmpT", &voidPtr, &voidLen );
+ (void) RegisterNamespace ( kXMP_NS_XMP_PagedFile, "xmpTPg", &voidPtr, &voidLen );
+ (void) RegisterNamespace ( kXMP_NS_XMP_Graphics, "xmpG", &voidPtr, &voidLen );
+ (void) RegisterNamespace ( kXMP_NS_XMP_Image, "xmpGImg", &voidPtr, &voidLen );
(void) RegisterNamespace ( kXMP_NS_XMP_Font, "stFnt", &voidPtr, &voidLen );
(void) RegisterNamespace ( kXMP_NS_XMP_Dimensions, "stDim", &voidPtr, &voidLen );
@@ -539,6 +708,7 @@ XMPMeta::Initialize()
(void) RegisterNamespace ( kXMP_NS_XMP_IdentifierQual, "xmpidq", &voidPtr, &voidLen );
(void) RegisterNamespace ( kXMP_NS_IPTCCore, "Iptc4xmpCore", &voidPtr, &voidLen );
+ (void) RegisterNamespace ( kXMP_NS_DICOM, "DICOM", &voidPtr, &voidLen );
(void) RegisterNamespace ( kXMP_NS_PDFA_Schema, "pdfaSchema", &voidPtr, &voidLen );
(void) RegisterNamespace ( kXMP_NS_PDFA_Property, "pdfaProperty", &voidPtr, &voidLen );
@@ -559,7 +729,6 @@ XMPMeta::Initialize()
if ( ! XMPIterator::Initialize() ) XMP_Throw ( "Failure from XMPIterator::Initialize", kXMPErr_InternalFailure );
if ( ! XMPUtils::Initialize() ) XMP_Throw ( "Failure from XMPUtils::Initialize", kXMPErr_InternalFailure );
-
// Do miscelaneous semantic checks of types and arithmetic.
XMP_Assert ( sizeof(XMP_Int8) == 1 );
@@ -649,7 +818,6 @@ XMPMeta::Terminate() RELEASE_NO_THROW
XMPIterator::Terminate();
XMPUtils::Terminate();
-
EliminateGlobal ( sNamespaceURIToPrefixMap );
EliminateGlobal ( sNamespacePrefixToURIMap );
EliminateGlobal ( sRegisteredAliasMap );
@@ -660,7 +828,7 @@ XMPMeta::Terminate() RELEASE_NO_THROW
EliminateGlobal ( sExceptionMessage );
XMP_TermMutex ( sXMPCoreLock );
-
+
} // Terminate
@@ -710,7 +878,7 @@ XMPMeta::DumpNamespaces ( XMP_TextOutputProc outProc,
void * refCon )
{
XMP_Assert ( outProc != 0 ); // ! Enforced by wrapper.
- XMP_Status status;
+ XMP_Status status = 0;
XMP_StringMapPos p2uEnd = sNamespacePrefixToURIMap->end(); // ! Move up to avoid gcc complaints.
XMP_StringMapPos u2pEnd = sNamespaceURIToPrefixMap->end();
@@ -728,7 +896,7 @@ XMPMeta::DumpNamespaces ( XMP_TextOutputProc outProc,
XMP_StringMapPos nsOther = sNamespaceURIToPrefixMap->find ( nsLeft->second );
if ( (nsOther == u2pEnd) || (nsLeft != sNamespacePrefixToURIMap->find ( nsOther->second )) ) {
OutProcLiteral ( " ** bad namespace URI ** " );
- OutProcString ( nsLeft->second );
+ DumpClearString ( nsLeft->second, outProc, refCon );
goto FAILURE;
}
@@ -736,7 +904,7 @@ XMPMeta::DumpNamespaces ( XMP_TextOutputProc outProc,
if ( nsRight == nsLeft ) continue; // ! Can't start at nsLeft+1, no operator+!
if ( nsLeft->second == nsRight->second ) {
OutProcLiteral ( " ** duplicate namespace URI ** " );
- OutProcString ( nsLeft->second );
+ DumpClearString ( nsLeft->second, outProc, refCon );
goto FAILURE;
}
}
@@ -748,7 +916,7 @@ XMPMeta::DumpNamespaces ( XMP_TextOutputProc outProc,
XMP_StringMapPos nsOther = sNamespacePrefixToURIMap->find ( nsLeft->second );
if ( (nsOther == p2uEnd) || (nsLeft != sNamespaceURIToPrefixMap->find ( nsOther->second )) ) {
OutProcLiteral ( " ** bad namespace prefix ** " );
- OutProcString ( nsLeft->second );
+ DumpClearString ( nsLeft->second, outProc, refCon );
goto FAILURE;
}
@@ -756,7 +924,7 @@ XMPMeta::DumpNamespaces ( XMP_TextOutputProc outProc,
if ( nsRight == nsLeft ) continue; // ! Can't start at nsLeft+1, no operator+!
if ( nsLeft->second == nsRight->second ) {
OutProcLiteral ( " ** duplicate namespace prefix ** " );
- OutProcString ( nsLeft->second );
+ DumpClearString ( nsLeft->second, outProc, refCon );
goto FAILURE;
}
}
@@ -784,7 +952,7 @@ XMPMeta::DumpAliases ( XMP_TextOutputProc outProc,
void * refCon )
{
XMP_Assert ( outProc != 0 ); // ! Enforced by wrapper.
- XMP_Status status;
+ XMP_Status status = 0;
XMP_Assert ( sRegisteredAliasMap != 0 );
@@ -803,7 +971,7 @@ XMPMeta::DumpAliases ( XMP_TextOutputProc outProc,
for ( aliasPos = sRegisteredAliasMap->begin(); aliasPos != aliasEnd; ++aliasPos ) {
OutProcNChars ( " ", 3 );
- OutProcString ( aliasPos->first );
+ DumpClearString ( aliasPos->first, outProc, refCon );
OutProcPadding ( maxLen - aliasPos->first.size() );
OutProcNChars ( " => ", 4 );
@@ -986,13 +1154,21 @@ XMPMeta::GetNamespaceURI ( XMP_StringPtr namespacePrefix,
// ---------------
// *** Don't allow standard namespaces to be deleted.
+// *** We would be better off not having this. Instead, have local namespaces from parsing be
+// *** restricted to the object that introduced them.
/* class-static */ void
XMPMeta::DeleteNamespace ( XMP_StringPtr namespaceURI )
{
- namespaceURI = namespaceURI; // Avoid unused parameter warning.
- XMP_Assert ( *namespaceURI != 0 ); // ! Enforced by wrapper.
- XMP_Throw ( "Unimplemented method XMPMeta::DeleteNamespace", kXMPErr_Unimplemented ); // *** #error "write me"
+
+ XMP_StringMapPos uriPos = sNamespaceURIToPrefixMap->find ( namespaceURI );
+ if ( uriPos == sNamespaceURIToPrefixMap->end() ) return;
+
+ XMP_StringMapPos prefixPos = sNamespacePrefixToURIMap->find ( uriPos->second );
+ XMP_Assert ( prefixPos != sNamespacePrefixToURIMap->end() );
+
+ sNamespaceURIToPrefixMap->erase ( uriPos );
+ sNamespacePrefixToURIMap->erase ( prefixPos );
} // DeleteNamespace
@@ -1287,10 +1463,10 @@ XMPMeta::DumpObject ( XMP_TextOutputProc outProc,
void * refCon ) const
{
XMP_Assert ( outProc != 0 ); // ! Enforced by wrapper.
- XMP_Status status;
+ XMP_Status status = 0;
OutProcLiteral ( "Dumping XMPMeta object \"" );
- OutProcString ( tree.name );
+ DumpClearString ( tree.name, outProc, refCon );
OutProcNChars ( "\" ", 3 );
status = DumpNodeOptions ( tree.options, outProc, refCon );
if ( status != 0 ) goto EXIT;
@@ -1302,7 +1478,7 @@ XMPMeta::DumpObject ( XMP_TextOutputProc outProc,
if ( ! tree.value.empty() ) {
OutProcLiteral ( "** bad root value ** \"" );
- OutProcString ( tree.value );
+ DumpClearString ( tree.value, outProc, refCon );
OutProcNChars ( "\"", 1 );
OutProcNewline();
}
@@ -1323,9 +1499,9 @@ XMPMeta::DumpObject ( XMP_TextOutputProc outProc,
OutProcNewline();
OutProcIndent ( 1 );
- OutProcString ( currSchema->name );
+ DumpClearString ( currSchema->value, outProc, refCon );
OutProcNChars ( " ", 2 );
- OutProcString ( currSchema->value );
+ DumpClearString ( currSchema->name, outProc, refCon );
OutProcNChars ( " ", 2 );
status = DumpNodeOptions ( currSchema->options, outProc, refCon );
if ( status != 0 ) goto EXIT;
@@ -1441,20 +1617,68 @@ XMPMeta::SetObjectOptions ( XMP_OptionBits options )
// -------------------------------------------------------------------------------------------------
+// Sort
+// ----
+//
+// At the top level the namespaces are sorted by their prefixes. Within a namespace, the top level
+// properties are sorted by name. Within a struct, the fields are sorted by their qualified name,
+// i.e. their XML prefix:local form. Unordered arrays of simple items are sorted by value. Language
+// Alternative arrays are sorted by the xml:lang qualifiers, with the "x-default" item placed first.
+
+void
+XMPMeta::Sort()
+{
+
+ if ( ! this->tree.qualifiers.empty() ) {
+ sort ( this->tree.qualifiers.begin(), this->tree.qualifiers.end(), CompareNodeNames );
+ SortWithinOffspring ( this->tree.qualifiers );
+ }
+
+ if ( ! this->tree.children.empty() ) {
+ // The schema prefixes are the node's value, the name is the URI, so we sort schemas by value.
+ sort ( this->tree.children.begin(), this->tree.children.end(), CompareNodeValues );
+ SortWithinOffspring ( this->tree.children );
+ }
+
+} // Sort
+
+
+// -------------------------------------------------------------------------------------------------
+// Erase
+// -----
+//
+// Clear everything except for clientRefs.
+
+void
+XMPMeta::Erase()
+{
+
+ this->prevTkVer = 0;
+ if ( this->xmlParser != 0 ) {
+ delete ( this->xmlParser );
+ this->xmlParser = 0;
+ }
+ this->tree.ClearNode();
+
+} // Erase
+
+
+// -------------------------------------------------------------------------------------------------
// Clone
// -----
-XMPMeta *
-XMPMeta::Clone ( XMP_OptionBits options ) const
+void
+XMPMeta::Clone ( XMPMeta * clone, XMP_OptionBits options ) const
{
+ if ( clone == 0 ) XMP_Throw ( "Null clone pointer", kXMPErr_BadParam );
if ( options != 0 ) XMP_Throw ( "No options are defined yet", kXMPErr_BadOptions );
-
- XMPMeta * clone = new XMPMeta;
+ XMP_Assert ( this->tree.parent == 0 );
+
+ clone->tree.ClearNode();
clone->tree.options = this->tree.options;
clone->tree.name = this->tree.name;
clone->tree.value = this->tree.value;
- XMP_Assert ( this->tree.parent == 0 );
#if 0 // *** XMP_DebugBuild
clone->tree._namePtr = clone->tree.name.c_str();
@@ -1463,9 +1687,6 @@ XMPMeta::Clone ( XMP_OptionBits options ) const
CloneOffspring ( &this->tree, &clone->tree );
- XMP_Assert ( clone->clientRefs == 0 ); // Gets incremneted later.
- return clone;
-
} // Clone
// =================================================================================================
diff --git a/source/XMPCore/XMPMeta.hpp b/source/XMPCore/XMPMeta.hpp
index a73eb6a..dca2c2a 100644
--- a/source/XMPCore/XMPMeta.hpp
+++ b/source/XMPCore/XMPMeta.hpp
@@ -2,7 +2,7 @@
#define __XMPMeta_hpp__
// =================================================================================================
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -335,8 +335,14 @@ public:
void
SetObjectOptions ( XMP_OptionBits options );
- XMPMeta *
- Clone ( XMP_OptionBits options ) const;
+ void
+ Sort();
+
+ void
+ Erase();
+
+ void
+ Clone ( XMPMeta * clone, XMP_OptionBits options ) const;
XMP_Index
CountArrayItems ( XMP_StringPtr schemaNS,
diff --git a/source/XMPCore/XMPUtils-FileInfo.cpp b/source/XMPCore/XMPUtils-FileInfo.cpp
index 7bf3836..ebfb9a5 100644
--- a/source/XMPCore/XMPUtils-FileInfo.cpp
+++ b/source/XMPCore/XMPUtils-FileInfo.cpp
@@ -1,5 +1,5 @@
// =================================================================================================
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -23,7 +23,6 @@
#pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning)
#endif
-
// =================================================================================================
// Local Types and Constants
// =========================
@@ -52,7 +51,6 @@ typedef enum UniCharKind UniCharKind;
// Static Variables
// ================
-
// =================================================================================================
// Local Utilities
// ===============
@@ -327,6 +325,7 @@ CodePointToUTF8 ( UniCodePoint uniChar, XMP_VarString & utf8Str )
cpTemp = cpTemp >> 6;
}
byteCount = 8 - i; // The total number of bytes needed.
+ XMP_Assert ( (2 <= byteCount) && (byteCount <= 6) );
// -------------------------------------------------------------------------------------
// Make sure the high order byte can hold the byte count mask, compute and set the mask.
@@ -336,7 +335,8 @@ CodePointToUTF8 ( UniCodePoint uniChar, XMP_VarString & utf8Str )
if ( bitCount > (8 - (byteCount + 1)) ) byteCount += 1;
i = 8 - byteCount; // First byte index and mask shift count.
- buffer[i] |= (UnsByte(0xFF) << i) & UnsByte(0xFF);
+ XMP_Assert ( (0 <= i) && (i <= 6) );
+ buffer[i] |= (UnsByte(0xFF) << i) & UnsByte(0xFF); // AUDIT: Safe, i is between 0 and 6.
}
@@ -447,12 +447,12 @@ IsInternalProperty ( const XMP_VarString & schema, const XMP_VarString & prop )
} else if ( schema == kXMP_NS_XMP ) {
- if ( (prop == "xap:BaseURL") ||
- (prop == "xap:CreatorTool") ||
- (prop == "xap:Format") ||
- (prop == "xap:Locale") ||
- (prop == "xap:MetadataDate") ||
- (prop == "xap:ModifyDate") ) {
+ if ( (prop == "xmp:BaseURL") ||
+ (prop == "xmp:CreatorTool") ||
+ (prop == "xmp:Format") ||
+ (prop == "xmp:Locale") ||
+ (prop == "xmp:MetadataDate") ||
+ (prop == "xmp:ModifyDate") ) {
isInternal = true;
}
@@ -1202,6 +1202,14 @@ XMPUtils::DuplicateSubtree ( const XMPMeta & source,
{
options = options; // Avoid unused parameter warning.
+ bool fullSourceTree = false;
+ bool fullDestTree = false;
+
+ XMP_ExpandedXPath sourcePath, destPath;
+
+ const XMP_Node * sourceNode = 0;
+ XMP_Node * destNode = 0;
+
XMP_Assert ( (sourceNS != 0) && (*sourceNS != 0) );
XMP_Assert ( (sourceRoot != 0) && (*sourceRoot != 0) );
XMP_Assert ( (dest != 0) && (destNS != 0) && (destRoot != 0) );
@@ -1209,47 +1217,126 @@ XMPUtils::DuplicateSubtree ( const XMPMeta & source,
if ( *destNS == 0 ) destNS = sourceNS;
if ( *destRoot == 0 ) destRoot = sourceRoot;
- if ( (&source == dest) &&
- XMP_LitMatch ( sourceNS, destNS ) &&
- XMP_LitMatch ( sourceRoot, destRoot ) ) XMP_Throw ( "Can't duplicate subtree onto itself", kXMPErr_BadParam );
-
- // Find the root nodes for the source and destination subtrees.
+ if ( XMP_LitMatch ( sourceNS, "*" ) ) fullSourceTree = true;
+ if ( XMP_LitMatch ( destNS, "*" ) ) fullDestTree = true;
- XMP_ExpandedXPath sourcePath, destPath;
- ExpandXPath ( sourceNS, sourceRoot, &sourcePath );
- ExpandXPath ( destNS, destRoot, &destPath );
-
- XMP_Node * sourceNode = FindConstNode ( &source.tree, sourcePath );
- if ( sourceNode == 0 ) XMP_Throw ( "Can't find source subtree", kXMPErr_BadXPath );
-
- XMP_Node * destNode = FindNode ( &dest->tree, destPath, kXMP_ExistingOnly ); // Dest must not yet exist.
- if ( destNode != 0 ) XMP_Throw ( "Destination subtree must not exist", kXMPErr_BadXPath );
+ if ( (&source == dest) && (fullSourceTree | fullDestTree) ) {
+ XMP_Throw ( "Can't duplicate tree onto itself", kXMPErr_BadParam );
+ }
- destNode = FindNode ( &dest->tree, destPath, kXMP_CreateNodes ); // Now create the dest.
- if ( destNode == 0 ) XMP_Throw ( "Can't create destination root node", kXMPErr_BadXPath );
+ if ( fullSourceTree & fullDestTree ) XMP_Throw ( "Use Clone for full tree to full tree", kXMPErr_BadParam );
+
+ if ( fullSourceTree ) {
- // Make sure the destination is not within the source! The source can't be inside the destination
- // because the source already existed and the destination was just created.
+ // The destination must be an existing empty struct, copy all of the source top level as fields.
+
+ ExpandXPath ( destNS, destRoot, &destPath );
+ destNode = FindNode ( &dest->tree, destPath, kXMP_ExistingOnly );
+
+ if ( (destNode == 0) || (! XMP_PropIsStruct ( destNode->options )) ) {
+ XMP_Throw ( "Destination must be an existing struct", kXMPErr_BadXPath );
+ }
+
+ if ( ! destNode->children.empty() ) {
+ if ( options & kXMP_DeleteExisting ) {
+ destNode->RemoveChildren();
+ } else {
+ XMP_Throw ( "Destination must be an empty struct", kXMPErr_BadXPath );
+ }
+ }
+
+ for ( size_t schemaNum = 0, schemaLim = source.tree.children.size(); schemaNum < schemaLim; ++schemaNum ) {
+
+ const XMP_Node * currSchema = source.tree.children[schemaNum];
+
+ for ( size_t propNum = 0, propLim = currSchema->children.size(); propNum < propLim; ++propNum ) {
+ sourceNode = currSchema->children[propNum];
+ XMP_Node * copyNode = new XMP_Node ( destNode, sourceNode->name, sourceNode->value, sourceNode->options );
+ destNode->children.push_back ( copyNode );
+ CloneOffspring ( sourceNode, copyNode );
+ }
+
+ }
- if ( &source == dest ) {
- for ( XMP_Node * testNode = destNode; testNode != 0; testNode = testNode->parent ) {
- if ( testNode == sourceNode ) {
- // *** delete the just-created dest root node
- XMP_Throw ( "Destination subtree is within the source subtree", kXMPErr_BadXPath );
+ } else if ( fullDestTree ) {
+
+ // The source node must be an existing struct, copy all of the fields to the dest top level.
+
+ XMP_ExpandedXPath sourcePath;
+ ExpandXPath ( sourceNS, sourceRoot, &sourcePath );
+ sourceNode = FindConstNode ( &source.tree, sourcePath );
+
+ if ( (sourceNode == 0) || (! XMP_PropIsStruct ( sourceNode->options )) ) {
+ XMP_Throw ( "Source must be an existing struct", kXMPErr_BadXPath );
+ }
+
+ destNode = &dest->tree;
+
+ if ( ! destNode->children.empty() ) {
+ if ( options & kXMP_DeleteExisting ) {
+ destNode->RemoveChildren();
+ } else {
+ XMP_Throw ( "Destination tree must be empty", kXMPErr_BadXPath );
}
}
- }
+
+ std::string nsPrefix;
+ XMP_StringPtr nsURI;
+ XMP_StringLen nsLen;
+
+ for ( size_t fieldNum = 0, fieldLim = sourceNode->children.size(); fieldNum < fieldLim; ++fieldNum ) {
+
+ const XMP_Node * currField = sourceNode->children[fieldNum];
+
+ size_t colonPos = currField->name.find ( ':' );
+ nsPrefix.assign ( currField->name.c_str(), colonPos );
+ bool nsOK = XMPMeta::GetNamespaceURI ( nsPrefix.c_str(), &nsURI, &nsLen );
+ if ( ! nsOK ) XMP_Throw ( "Source field namespace is not global", kXMPErr_BadSchema );
+
+ XMP_Node * destSchema = FindSchemaNode ( &dest->tree, nsURI, kXMP_CreateNodes );
+ if ( destSchema == 0 ) XMP_Throw ( "Failed to find destination schema", kXMPErr_BadSchema );
+
+ XMP_Node * copyNode = new XMP_Node ( destSchema, currField->name, currField->value, currField->options );
+ destSchema->children.push_back ( copyNode );
+ CloneOffspring ( currField, copyNode );
+
+ }
+
+ } else {
+
+ // Find the root nodes for the source and destination subtrees.
+
+ ExpandXPath ( sourceNS, sourceRoot, &sourcePath );
+ ExpandXPath ( destNS, destRoot, &destPath );
- // All OK, copy the subtree.
- // *** Could use a CloneTree util here and maybe elsewhere.
+ sourceNode = FindConstNode ( &source.tree, sourcePath );
+ if ( sourceNode == 0 ) XMP_Throw ( "Can't find source subtree", kXMPErr_BadXPath );
+
+ destNode = FindNode ( &dest->tree, destPath, kXMP_ExistingOnly ); // Dest must not yet exist.
+ if ( destNode != 0 ) XMP_Throw ( "Destination subtree must not exist", kXMPErr_BadXPath );
+
+ destNode = FindNode ( &dest->tree, destPath, kXMP_CreateNodes ); // Now create the dest.
+ if ( destNode == 0 ) XMP_Throw ( "Can't create destination root node", kXMPErr_BadXPath );
+
+ // Make sure the destination is not within the source! The source can't be inside the destination
+ // because the source already existed and the destination was just created.
+
+ if ( &source == dest ) {
+ for ( XMP_Node * testNode = destNode; testNode != 0; testNode = testNode->parent ) {
+ if ( testNode == sourceNode ) {
+ // *** delete the just-created dest root node
+ XMP_Throw ( "Destination subtree is within the source subtree", kXMPErr_BadXPath );
+ }
+ }
+ }
- destNode->value = sourceNode->value; // *** Should use SetNode.
- destNode->options = sourceNode->options;
- CloneOffspring ( sourceNode, destNode );
+ // *** Could use a CloneTree util here and maybe elsewhere.
+
+ destNode->value = sourceNode->value; // *** Should use SetNode.
+ destNode->options = sourceNode->options;
+ CloneOffspring ( sourceNode, destNode );
- #if 0 // *** XMP_DebugBuild
- destNode->_valuePtr = destNode->value.c_str();
- #endif
+ }
} // DuplicateSubtree
diff --git a/source/XMPCore/XMPUtils.cpp b/source/XMPCore/XMPUtils.cpp
index 0dacc0c..0cfe497 100644
--- a/source/XMPCore/XMPUtils.cpp
+++ b/source/XMPCore/XMPUtils.cpp
@@ -702,8 +702,8 @@ XMPUtils::ComposeArrayItemPath ( XMP_StringPtr schemaNS,
sComposedPath->append ( reserveLen, ' ' );
if ( itemIndex != kXMP_ArrayLastItem ) {
- // AUDIT: Using string->capacity() for the snprintf length is safe.
- snprintf ( const_cast<char*>(sComposedPath->c_str()), sComposedPath->capacity(), "%s[%d]", arrayName, itemIndex );
+ // AUDIT: Using string->size() for the snprintf length is safe.
+ snprintf ( const_cast<char*>(sComposedPath->c_str()), sComposedPath->size(), "%s[%d]", arrayName, itemIndex );
} else {
*sComposedPath = arrayName;
*sComposedPath += "[last()] ";
@@ -921,8 +921,8 @@ XMPUtils::ConvertFromInt ( XMP_Int32 binValue,
sConvertedValue->reserve ( 100 ); // More than enough for any reasonable format and value.
sConvertedValue->append ( 100, ' ' );
- // AUDIT: Using string->capacity() for the snprintf length is safe.
- snprintf ( const_cast<char*>(sConvertedValue->c_str()), sConvertedValue->capacity(), format, binValue );
+ // AUDIT: Using string->size() for the snprintf length is safe.
+ snprintf ( const_cast<char*>(sConvertedValue->c_str()), sConvertedValue->size(), format, binValue );
*strValue = sConvertedValue->c_str();
*strSize = strlen ( *strValue ); // ! Don't use sConvertedValue->size()!
@@ -944,14 +944,14 @@ XMPUtils::ConvertFromInt64 ( XMP_Int64 binValue,
{
XMP_Assert ( (format != 0) && (strValue != 0) && (strSize != 0) ); // Enforced by wrapper.
- if ( *format == 0 ) format = "%d";
+ if ( *format == 0 ) format = "%lld";
sConvertedValue->erase();
sConvertedValue->reserve ( 100 ); // More than enough for any reasonable format and value.
sConvertedValue->append ( 100, ' ' );
- // AUDIT: Using string->capacity() for the snprintf length is safe.
- snprintf ( const_cast<char*>(sConvertedValue->c_str()), sConvertedValue->capacity(), format, binValue );
+ // AUDIT: Using string->size() for the snprintf length is safe.
+ snprintf ( const_cast<char*>(sConvertedValue->c_str()), sConvertedValue->size(), format, binValue );
*strValue = sConvertedValue->c_str();
*strSize = strlen ( *strValue ); // ! Don't use sConvertedValue->size()!
@@ -979,8 +979,8 @@ XMPUtils::ConvertFromFloat ( double binValue,
sConvertedValue->reserve ( 1000 ); // More than enough for any reasonable format and value.
sConvertedValue->append ( 1000, ' ' );
- // AUDIT: Using string->capacity() for the snprintf length is safe.
- snprintf ( const_cast<char*>(sConvertedValue->c_str()), sConvertedValue->capacity(), format, binValue );
+ // AUDIT: Using string->size() for the snprintf length is safe.
+ snprintf ( const_cast<char*>(sConvertedValue->c_str()), sConvertedValue->size(), format, binValue );
*strValue = sConvertedValue->c_str();
*strSize = strlen ( *strValue ); // ! Don't use sConvertedValue->size()!
@@ -1167,17 +1167,17 @@ XMPUtils::ConvertToInt ( XMP_StringPtr strValue )
{
if ( (strValue == 0) || (*strValue == 0) ) XMP_Throw ( "Empty convert-from string", kXMPErr_BadValue );
- errno = 0;
- char * numEnd;
+ int count;
+ char nextCh;
XMP_Int32 result;
- if ( strncmp ( strValue, "0x", 2 ) != 0 ) {
- result = strtol ( strValue, &numEnd, 0 );
+ if ( ! XMP_LitNMatch ( strValue, "0x", 2 ) ) {
+ count = sscanf ( strValue, "%d%c", &result, &nextCh );
} else {
- result = (XMP_Int32) strtoul ( strValue, &numEnd, 0 ); // Treat hex form as raw bits.
+ count = sscanf ( strValue, "%x%c", &result, &nextCh );
}
- if ( (errno != 0) || (*numEnd != 0) ) XMP_Throw ( "Invalid integer string", kXMPErr_BadParam );
+ if ( count != 1 ) XMP_Throw ( "Invalid integer string", kXMPErr_BadParam );
return result;
@@ -1193,17 +1193,17 @@ XMPUtils::ConvertToInt64 ( XMP_StringPtr strValue )
{
if ( (strValue == 0) || (*strValue == 0) ) XMP_Throw ( "Empty convert-from string", kXMPErr_BadValue );
- errno = 0;
- char * numEnd;
+ int count;
+ char nextCh;
XMP_Int64 result;
- if ( strncmp ( strValue, "0x", 2 ) != 0 ) {
- result = strtol ( strValue, &numEnd, 0 );
+ if ( ! XMP_LitNMatch ( strValue, "0x", 2 ) ) {
+ count = sscanf ( strValue, "%lld%c", &result, &nextCh );
} else {
- result = (XMP_Int64) strtoul ( strValue, &numEnd, 0 ); // Treat hex form as raw bits.
+ count = sscanf ( strValue, "%llx%c", &result, &nextCh );
}
- if ( (errno != 0) || (*numEnd != 0) ) XMP_Throw ( "Invalid integer string", kXMPErr_BadParam );
+ if ( count != 1 ) XMP_Throw ( "Invalid integer string", kXMPErr_BadParam );
return result;
@@ -1276,7 +1276,8 @@ XMPUtils::ConvertToDate ( XMP_StringPtr strValue,
size_t pos = 0;
XMP_Int32 temp;
- (void) memset ( binValue, 0, sizeof ( XMP_DateTime ) );
+ XMP_Assert ( sizeof(*binValue) == sizeof(XMP_DateTime) );
+ (void) memset ( binValue, 0, sizeof(*binValue) ); // AUDIT: Safe, using sizeof destination.
bool timeOnly = ( (strValue[0] == 'T') ||
((strlen(strValue) >= 2) && (strValue[1] == ':')) ||
diff --git a/source/XMPCore/XMPUtils.hpp b/source/XMPCore/XMPUtils.hpp
index adba673..e1c7e78 100644
--- a/source/XMPCore/XMPUtils.hpp
+++ b/source/XMPCore/XMPUtils.hpp
@@ -14,6 +14,7 @@
#include "XMPMeta.hpp"
#include "XMPCore_Impl.hpp"
+#include "client-glue/WXMPUtils.hpp"
// -------------------------------------------------------------------------------------------------
diff --git a/source/XMPFiles/FileHandlers/ASF_Handler.cpp b/source/XMPFiles/FileHandlers/ASF_Handler.cpp
new file mode 100644
index 0000000..5726533
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/ASF_Handler.cpp
@@ -0,0 +1,362 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "ASF_Handler.hpp"
+
+// =================================================================================================
+/// \file ASF_Handler.hpp
+/// \brief File format handler for ASF.
+///
+/// This handler ...
+///
+// =================================================================================================
+
+// =================================================================================================
+// ASF_MetaHandlerCTor
+// ====================
+
+XMPFileHandler * ASF_MetaHandlerCTor ( XMPFiles * parent )
+{
+ return new ASF_MetaHandler ( parent );
+
+} // ASF_MetaHandlerCTor
+
+// =================================================================================================
+// ASF_CheckFormat
+// ===============
+
+bool ASF_CheckFormat ( XMP_FileFormat format,
+ XMP_StringPtr filePath,
+ LFA_FileRef fileRef,
+ XMPFiles * parent )
+{
+
+ IgnoreParam(format); IgnoreParam(fileRef); IgnoreParam(parent);
+ XMP_Assert ( format == kXMP_WMAVFile );
+
+ IOBuffer ioBuf;
+
+ LFA_Seek ( fileRef, 0, SEEK_SET );
+ if ( ! CheckFileSpace ( fileRef, &ioBuf, guidLen ) ) return false;
+
+ GUID guid;
+ memcpy ( &guid, ioBuf.ptr, guidLen );
+
+ if ( ! IsEqualGUID ( ASF_Header_Object, guid ) ) return false;
+
+ return true;
+
+} // ASF_CheckFormat
+
+// =================================================================================================
+// ASF_MetaHandler::ASF_MetaHandler
+// ==================================
+
+ASF_MetaHandler::ASF_MetaHandler ( XMPFiles * _parent )
+{
+ this->parent = _parent;
+ this->handlerFlags = kASF_HandlerFlags;
+ this->stdCharForm = kXMP_Char8Bit;
+
+}
+
+// =================================================================================================
+// ASF_MetaHandler::~ASF_MetaHandler
+// ===================================
+
+ASF_MetaHandler::~ASF_MetaHandler()
+{
+ // Nothing extra to do.
+}
+
+// =================================================================================================
+// ASF_MetaHandler::CacheFileData
+// ===============================
+
+void ASF_MetaHandler::CacheFileData()
+{
+
+ this->containsXMP = false;
+
+ LFA_FileRef fileRef ( this->parent->fileRef );
+ if ( fileRef == 0 ) return;
+
+ ASF_Support support ( &this->legacyManager );
+ ASF_Support::ObjectState objectState;
+ long numTags = support.OpenASF ( fileRef, objectState );
+ if ( numTags == 0 ) return;
+
+ if ( objectState.xmpLen != 0 ) {
+
+ // XMP present
+
+ XMP_Int32 len = XMP_Int32 ( objectState.xmpLen );
+
+ this->xmpPacket.reserve( len );
+ this->xmpPacket.assign ( len, ' ' );
+
+ bool found = ASF_Support::ReadBuffer ( fileRef, objectState.xmpPos, objectState.xmpLen,
+ const_cast<char *>(this->xmpPacket.data()) );
+ if ( found ) {
+ this->packetInfo.offset = objectState.xmpPos;
+ this->packetInfo.length = len;
+ this->containsXMP = true;
+ }
+
+ }
+
+} // ASF_MetaHandler::CacheFileData
+
+// =================================================================================================
+// ASF_MetaHandler::ProcessTNail
+// ==============================
+
+void ASF_MetaHandler::ProcessTNail()
+{
+
+ XMP_Throw ( "ASF_MetaHandler::ProcessTNail isn't implemented yet", kXMPErr_Unimplemented );
+
+} // ASF_MetaHandler::ProcessTNail
+
+// =================================================================================================
+// ASF_MetaHandler::ProcessXMP
+// ============================
+//
+// Process the raw XMP and legacy metadata that was previously cached.
+
+void ASF_MetaHandler::ProcessXMP()
+{
+
+ this->processedXMP = true; // Make sure we only come through here once.
+
+ // Process the XMP packet.
+
+ if ( this->xmpPacket.empty() ) {
+
+ // import legacy in any case, when no XMP present
+ legacyManager.ImportLegacy ( &this->xmpObj );
+ this->legacyManager.SetDigest ( &this->xmpObj );
+
+ } else {
+
+ XMP_Assert ( this->containsXMP );
+ XMP_StringPtr packetStr = this->xmpPacket.c_str();
+ XMP_StringLen packetLen = (XMP_StringLen)this->xmpPacket.size();
+
+ this->xmpObj.ParseFromBuffer ( packetStr, packetLen );
+
+ if ( ! legacyManager.CheckDigest ( this->xmpObj ) ) {
+ legacyManager.ImportLegacy ( &this->xmpObj );
+ }
+
+ }
+
+ // Assume we now have something in the XMP.
+ this->containsXMP = true;
+
+} // ASF_MetaHandler::ProcessXMP
+
+// =================================================================================================
+// ASF_MetaHandler::UpdateFile
+// ============================
+
+void ASF_MetaHandler::UpdateFile ( bool doSafeUpdate )
+{
+
+ bool updated = false;
+
+ if ( ! this->needsUpdate ) return;
+
+ LFA_FileRef fileRef ( this->parent->fileRef );
+ if ( fileRef == 0 ) return;
+
+ ASF_Support support;
+ ASF_Support::ObjectState objectState;
+ long numTags = support.OpenASF ( fileRef, objectState );
+ if ( numTags == 0 ) return;
+
+ XMP_StringLen packetLen = (XMP_StringLen)xmpPacket.size();
+
+ this->legacyManager.ExportLegacy ( this->xmpObj );
+ if ( this->legacyManager.hasLegacyChanged() ) {
+
+ this->legacyManager.SetDigest ( &this->xmpObj );
+
+ // serialize with updated digest
+ if ( objectState.xmpLen == 0 ) {
+
+ // XMP does not exist, use standard padding
+ this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat );
+
+ } else {
+
+ // re-use padding with static XMP size
+ try {
+ XMP_OptionBits compactExact = (kXMP_UseCompactFormat | kXMP_ExactPacketLength);
+ this->xmpObj.SerializeToBuffer ( &this->xmpPacket, compactExact, XMP_StringLen(objectState.xmpLen) );
+ } catch ( ... ) {
+ // re-use padding with exact packet length failed (legacy-digest needed too much space): try again using standard padding
+ this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat );
+ }
+
+ }
+
+ }
+
+ XMP_StringPtr packetStr = xmpPacket.c_str();
+ packetLen = (XMP_StringLen)xmpPacket.size();
+ if ( packetLen == 0 ) return;
+
+ // value, when guessing for sufficient legacy padding (line-ending conversion etc.)
+ const int paddingTolerance = 50;
+
+ bool xmpGrows = ( objectState.xmpLen && (packetLen > objectState.xmpLen) && ( ! objectState.xmpIsLastObject) );
+
+ bool legacyGrows = ( this->legacyManager.hasLegacyChanged() &&
+ (this->legacyManager.getLegacyDiff() > (this->legacyManager.GetPadding() - paddingTolerance)) );
+
+ if ( doSafeUpdate || legacyGrows || xmpGrows ) {
+
+ // do a safe update in any case
+ updated = SafeWriteFile();
+
+ } else {
+
+ // possibly we can do an in-place update
+
+ if ( objectState.xmpLen < packetLen ) {
+
+ updated = SafeWriteFile();
+
+ } else {
+
+ // current XMP chunk size is sufficient -> write (in place update)
+ updated = ASF_Support::WriteBuffer(fileRef, objectState.xmpPos, packetLen, packetStr );
+
+ // legacy update
+ if ( updated && this->legacyManager.hasLegacyChanged() ) {
+
+ ASF_Support::ObjectIterator curPos = objectState.objects.begin();
+ ASF_Support::ObjectIterator endPos = objectState.objects.end();
+
+ for ( ; curPos != endPos; ++curPos ) {
+
+ ASF_Support::ObjectData object = *curPos;
+
+ // find header-object
+ if ( IsEqualGUID ( ASF_Header_Object, object.guid ) ) {
+ // update header object
+ updated = support.UpdateHeaderObject ( fileRef, object, legacyManager );
+ }
+
+ }
+
+ }
+
+ }
+
+ }
+
+ if ( ! updated ) return; // If there's an error writing the chunk, bail.
+
+ this->needsUpdate = false;
+
+} // ASF_MetaHandler::UpdateFile
+
+// =================================================================================================
+// ASF_MetaHandler::WriteFile
+// ===========================
+
+void ASF_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath )
+{
+ LFA_FileRef destRef = this->parent->fileRef;
+
+ ASF_Support support;
+ ASF_Support::ObjectState objectState;
+ long numTags = support.OpenASF ( sourceRef, objectState );
+ if ( numTags == 0 ) return;
+
+ LFA_Truncate ( destRef, 0 );
+
+ ASF_Support::ObjectIterator curPos = objectState.objects.begin();
+ ASF_Support::ObjectIterator endPos = objectState.objects.end();
+
+ for ( ; curPos != endPos; ++curPos ) {
+
+ ASF_Support::ObjectData object = *curPos;
+
+ // discard existing XMP object
+ if ( object.xmp ) continue;
+
+ // update header-object, when legacy needs update
+ if ( IsEqualGUID ( ASF_Header_Object, object.guid) && this->legacyManager.hasLegacyChanged( ) ) {
+ // rewrite header object
+ support.WriteHeaderObject ( sourceRef, destRef, object, this->legacyManager, false );
+ } else {
+ // copy any other object
+ ASF_Support::CopyObject ( sourceRef, destRef, object );
+ }
+
+ // write XMP object immediately after the (one and only) top-level DataObject
+ if ( IsEqualGUID ( ASF_Data_Object, object.guid ) ) {
+ XMP_StringPtr packetStr = xmpPacket.c_str();
+ XMP_StringLen packetLen = (XMP_StringLen)xmpPacket.size();
+ ASF_Support::WriteXMPObject ( destRef, packetLen, packetStr );
+ }
+
+ }
+
+ support.UpdateFileSize ( destRef );
+
+} // ASF_MetaHandler::WriteFile
+
+// =================================================================================================
+// ASF_MetaHandler::SafeWriteFile
+// ===========================
+
+bool ASF_MetaHandler::SafeWriteFile ()
+{
+ bool ret = false;
+
+ std::string origPath = this->parent->filePath;
+ LFA_FileRef origRef = this->parent->fileRef;
+
+ std::string updatePath;
+ LFA_FileRef updateRef = 0;
+
+ CreateTempFile ( origPath, &updatePath, kCopyMacRsrc );
+ updateRef = LFA_Open ( updatePath.c_str(), 'w' );
+
+ this->parent->filePath = updatePath;
+ this->parent->fileRef = updateRef;
+
+ try {
+ this->WriteFile ( origRef, origPath );
+ ret = true;
+ } catch ( ... ) {
+ LFA_Close ( updateRef );
+ this->parent->filePath = origPath;
+ this->parent->fileRef = origRef;
+ throw;
+ }
+
+ LFA_Close ( origRef );
+ LFA_Delete ( origPath.c_str() );
+
+ LFA_Close ( updateRef );
+ LFA_Rename ( updatePath.c_str(), origPath.c_str() );
+ this->parent->filePath = origPath;
+
+ this->parent->fileRef = 0;
+
+ return ret;
+
+} // ASF_MetaHandler::SafeWriteFile
+
+// =================================================================================================
diff --git a/source/XMPFiles/FileHandlers/ASF_Handler.hpp b/source/XMPFiles/FileHandlers/ASF_Handler.hpp
new file mode 100644
index 0000000..9f54b15
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/ASF_Handler.hpp
@@ -0,0 +1,66 @@
+#ifndef __ASF_Handler_hpp__
+#define __ASF_Handler_hpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2007 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XMPFiles_Impl.hpp"
+#include "ASF_Support.hpp"
+
+// =================================================================================================
+/// \file ASF_Handler.hpp
+/// \brief File format handler for ASF.
+///
+/// This header ...
+///
+// =================================================================================================
+
+// *** Could derive from Basic_Handler - buffer file tail in a temp file.
+
+extern XMPFileHandler* ASF_MetaHandlerCTor ( XMPFiles* parent );
+
+extern bool ASF_CheckFormat ( XMP_FileFormat format,
+ XMP_StringPtr filePath,
+ LFA_FileRef fileRef,
+ XMPFiles* parent );
+
+static const XMP_OptionBits kASF_HandlerFlags = ( kXMPFiles_CanInjectXMP |
+ kXMPFiles_CanExpand |
+ kXMPFiles_PrefersInPlace |
+ kXMPFiles_CanReconcile |
+ kXMPFiles_AllowsOnlyXMP |
+ kXMPFiles_ReturnsRawPacket |
+ kXMPFiles_NeedsReadOnlyPacket
+ );
+
+class ASF_MetaHandler : public XMPFileHandler
+{
+public:
+
+ void CacheFileData();
+ void ProcessTNail();
+ void ProcessXMP();
+
+ void UpdateFile ( bool doSafeUpdate );
+ void WriteFile ( LFA_FileRef sourceRef, const std::string& sourcePath );
+
+ bool SafeWriteFile ();
+
+ ASF_MetaHandler ( XMPFiles* parent );
+ virtual ~ASF_MetaHandler();
+
+private:
+
+ ASF_LegacyManager legacyManager;
+
+}; // ASF_MetaHandler
+
+// =================================================================================================
+
+#endif /* __ASF_Handler_hpp__ */
diff --git a/source/XMPFiles/FileHandlers/AVCHD_Handler.cpp b/source/XMPFiles/FileHandlers/AVCHD_Handler.cpp
new file mode 100644
index 0000000..63b8f29
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/AVCHD_Handler.cpp
@@ -0,0 +1,648 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "AVCHD_Handler.hpp"
+
+#include "MD5.h"
+
+using namespace std;
+
+// =================================================================================================
+/// \file AVCHD_Handler.cpp
+/// \brief Folder format handler for AVCHD.
+///
+/// This handler is for the AVCHD video format.
+///
+/// A typical AVCHD layout looks like:
+///
+/// BDMV/
+/// index.bdmv
+/// MovieObject.bdmv
+/// PLAYLIST/
+/// 00000.mpls
+/// 00001.mpls
+/// STREAM/
+/// 00000.m2ts
+/// 00001.m2ts
+/// CLIPINF/
+/// 00000.clpi
+/// 00001.clpi
+/// BACKUP/
+///
+// =================================================================================================
+
+// =================================================================================================
+
+// AVCHD Format. Book 1: Playback System Basic Specifications V 1.01. p. 76
+
+struct AVCHD_blkProgramInfo
+{
+ XMP_Uns32 mLength;
+ XMP_Uns8 mReserved1[2];
+ XMP_Uns32 mSPNProgramSequenceStart;
+ XMP_Uns16 mProgramMapPID;
+ XMP_Uns8 mNumberOfStreamsInPS;
+ XMP_Uns8 mReserved2;
+
+ // Video stream.
+ struct
+ {
+ XMP_Uns8 mPresent;
+ XMP_Uns8 mVideoFormat;
+ XMP_Uns8 mFrameRate;
+ XMP_Uns8 mAspectRatio;
+ XMP_Uns8 mCCFlag;
+ } mVideoStream;
+
+ // Audio stream.
+ struct
+ {
+ XMP_Uns8 mPresent;
+ XMP_Uns8 mAudioPresentationType;
+ XMP_Uns8 mSamplingFrequency;
+ XMP_Uns8 mAudioLanguageCode[4];
+ } mAudioStream;
+
+ // Pverlay bitmap stream.
+ struct
+ {
+ XMP_Uns8 mPresent;
+ XMP_Uns8 mOBLanguageCode[4];
+ } mOverlayBitmapStream;
+
+ // Menu bitmap stream.
+ struct
+ {
+ XMP_Uns8 mPresent;
+ XMP_Uns8 mBMLanguageCode[4];
+ } mMenuBitmapStream;
+
+};
+
+// =================================================================================================
+// AVCHD_CheckFormat
+// =================
+//
+// This version checks for the presence of a top level BPAV directory, and the required files and
+// directories immediately within it. The CLIPINF, PLAYLIST, and STREAM subfolders are required, as
+// are the index.bdmv and MovieObject.bdmv files.
+//
+// The state of the string parameters depends on the form of the path passed by the client. If the
+// client passed a logical clip path, like ".../MyMovie/00001", the parameters are:
+// rootPath - ".../MyMovie"
+// gpName - empty
+// parentName - empty
+// leafName - "00001"
+// If the client passed a full file path, like ".../MyMovie/BDMV/CLIPINF/00001.clpi", they are:
+// rootPath - ".../MyMovie"
+// gpName - "BDMV"
+// parentName - "CLIPINF" or "PALYLIST" or "STREAM"
+// leafName - "00001"
+
+// ! The common code has shifted the gpName, parentName, and leafName strings to upper case. It has
+// ! also made sure that for a logical clip path the rootPath is an existing folder, and that the
+// ! file exists for a full file path.
+
+// ! Using explicit '/' as a separator when creating paths, it works on Windows.
+
+// ! Sample files show that the ".bdmv" extension can sometimes be ".bdm". Allow either.
+
+bool AVCHD_CheckFormat ( XMP_FileFormat format,
+ const std::string & rootPath,
+ const std::string & gpName,
+ const std::string & parentName,
+ const std::string & leafName,
+ XMPFiles * parent )
+{
+ if ( gpName.empty() != parentName.empty() ) return false; // Must be both empty or both non-empty.
+
+ if ( ! gpName.empty() ) {
+ if ( gpName != "BDMV" ) return false;
+ if ( (parentName != "CLIPINF") && (parentName != "PLAYLIST") && (parentName != "STREAM") ) return false;
+ }
+
+ // Check the rest of the required general structure. Look for both ".bdmv" and ".bmd" extensions.
+
+ std::string bdmvPath ( rootPath );
+ bdmvPath += kDirChar;
+ bdmvPath += "BDMV";
+
+ if ( GetChildMode ( bdmvPath, "CLIPINF" ) != kFMode_IsFolder ) return false;
+ if ( GetChildMode ( bdmvPath, "PLAYLIST" ) != kFMode_IsFolder ) return false;
+ if ( GetChildMode ( bdmvPath, "STREAM" ) != kFMode_IsFolder ) return false;
+
+ if ( (GetChildMode ( bdmvPath, "index.bdmv" ) != kFMode_IsFile) &&
+ (GetChildMode ( bdmvPath, "index.bdm" ) != kFMode_IsFile) ) return false;
+
+ if ( (GetChildMode ( bdmvPath, "MovieObject.bdmv" ) != kFMode_IsFile) &&
+ (GetChildMode ( bdmvPath, "MovieObj.bdm" ) != kFMode_IsFile) ) return false;
+
+
+ // Make sure the .clpi file exists.
+ std::string tempPath ( bdmvPath );
+ tempPath += kDirChar;
+ tempPath += "CLIPINF";
+ tempPath += kDirChar;
+ tempPath += leafName;
+ tempPath += ".clpi";
+ const bool foundClpi = ( GetFileMode ( tempPath.c_str() ) == kFMode_IsFile );
+
+ // No .clpi -- check for .cpi instead.
+ if ( ! foundClpi ) {
+ tempPath.erase ( tempPath.size() - 5 ); // Remove the ".clpi" part.
+ tempPath += ".cpi";
+ if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFile ) return false;
+ }
+
+ // And now save the pseudo path for the handler object.
+ tempPath = rootPath;
+ tempPath += kDirChar;
+ tempPath += leafName;
+ size_t pathLen = tempPath.size() + 1; // Include a terminating nul.
+ parent->handlerTemp = malloc ( pathLen );
+ if ( parent->handlerTemp == 0 ) XMP_Throw ( "No memory for AVCHD clip info", kXMPErr_NoMemory );
+ memcpy ( parent->handlerTemp, tempPath.c_str(), pathLen );
+
+ return true;
+
+} // AVCHD_CheckFormat
+
+// =================================================================================================
+// ReadAVCHDProgramInfo
+// ====================
+
+static bool ReadAVCHDProgramInfo ( const std::string& strPath, AVCHD_blkProgramInfo& avchdProgramInfo )
+{
+ try {
+
+ AutoFile idxFile;
+ idxFile.fileRef = LFA_Open ( strPath.c_str(), 'r' );
+ if ( idxFile.fileRef == 0 ) return false; // The open failed.
+
+ memset ( &avchdProgramInfo, 0, sizeof(AVCHD_blkProgramInfo) );
+
+ // Read clip header. (AVCHD Format. Book1. v. 1.01. p 64 )
+ struct AVCHD_ClipInfoHeader
+ {
+ XMP_Uns8 mTypeIndicator[4];
+ XMP_Uns8 mTypeIndicator2[4];
+ XMP_Uns32 mSequenceInfoStartAddress;
+ XMP_Uns32 mProgramInfoStartAddress;
+ XMP_Uns32 mCPIStartAddress;
+ XMP_Uns32 mExtensionDataStartAddress;
+ XMP_Uns8 mReserved[12];
+ };
+
+ // Read the AVCHD header.
+ AVCHD_ClipInfoHeader avchdHeader;
+ LFA_Read ( idxFile.fileRef, avchdHeader.mTypeIndicator, 4 );
+ LFA_Read ( idxFile.fileRef, avchdHeader.mTypeIndicator2, 4 );
+ avchdHeader.mSequenceInfoStartAddress = LFA_ReadUns32_BE ( idxFile.fileRef );
+ avchdHeader.mProgramInfoStartAddress = LFA_ReadUns32_BE ( idxFile.fileRef );
+ avchdHeader.mCPIStartAddress = LFA_ReadUns32_BE ( idxFile.fileRef );
+ avchdHeader.mExtensionDataStartAddress = LFA_ReadUns32_BE ( idxFile.fileRef );
+ LFA_Read ( idxFile.fileRef, avchdHeader.mReserved, 12 );
+
+ // Seek to the program header. (AVCHD Format. Book1. v. 1.01. p 77 )
+ LFA_Seek ( idxFile.fileRef, avchdHeader.mProgramInfoStartAddress, SEEK_SET );
+
+ avchdProgramInfo.mLength = LFA_ReadUns32_BE ( idxFile.fileRef );
+ LFA_Read ( idxFile.fileRef, avchdProgramInfo.mReserved1, 2 );
+ avchdProgramInfo.mSPNProgramSequenceStart = LFA_ReadUns32_BE ( idxFile.fileRef );
+ avchdProgramInfo.mProgramMapPID = LFA_ReadUns16_BE ( idxFile.fileRef );
+ LFA_Read ( idxFile.fileRef, &avchdProgramInfo.mNumberOfStreamsInPS, 1 );
+ LFA_Read ( idxFile.fileRef, &avchdProgramInfo.mReserved2, 1 );
+
+ XMP_Uns16 streamPID = 0;
+ for ( int i=0; i<avchdProgramInfo.mNumberOfStreamsInPS; ++i ) {
+
+ XMP_Uns8 length = 0;
+ XMP_Uns8 streamCodingType = 0;
+
+ streamPID = LFA_ReadUns16_BE ( idxFile.fileRef );
+ LFA_Read ( idxFile.fileRef, &length, 1 );
+
+ XMP_Int64 pos = LFA_Tell ( idxFile.fileRef );
+
+ LFA_Read ( idxFile.fileRef, &streamCodingType, 1 );
+
+ switch ( streamCodingType ) {
+
+ case 0x1B : // Video stream case.
+ {
+ XMP_Uns8 videoFormatAndFrameRate;
+ LFA_Read ( idxFile.fileRef, &videoFormatAndFrameRate, 1 );
+ avchdProgramInfo.mVideoStream.mVideoFormat = videoFormatAndFrameRate >> 4; // hi 4 bits
+ avchdProgramInfo.mVideoStream.mFrameRate = videoFormatAndFrameRate & 0x0f; // lo 4 bits
+
+ XMP_Uns8 aspectRatioAndReserved = 0;
+ LFA_Read ( idxFile.fileRef, &aspectRatioAndReserved, 1 );
+ avchdProgramInfo.mVideoStream.mAspectRatio = aspectRatioAndReserved >> 4; // hi 4 bits
+
+ XMP_Uns8 ccFlag = 0;
+ LFA_Read ( idxFile.fileRef, &ccFlag, 1 );
+ avchdProgramInfo.mVideoStream.mCCFlag = ccFlag;
+
+ avchdProgramInfo.mVideoStream.mPresent = 1;
+ }
+ break;
+
+ case 0x80 : // Fall through.
+ case 0x81 : // Audio stream case.
+ {
+ XMP_Uns8 audioPresentationTypeAndFrequency = 0;
+ LFA_Read ( idxFile.fileRef, &audioPresentationTypeAndFrequency, 1 );
+
+ avchdProgramInfo.mAudioStream.mAudioPresentationType = audioPresentationTypeAndFrequency >> 4; // hi 4 bits
+ avchdProgramInfo.mAudioStream.mSamplingFrequency = audioPresentationTypeAndFrequency & 0x0f; // lo 4 bits
+
+ LFA_Read ( idxFile.fileRef, avchdProgramInfo.mAudioStream.mAudioLanguageCode, 3 );
+ avchdProgramInfo.mAudioStream.mAudioLanguageCode[3] = 0;
+
+ avchdProgramInfo.mAudioStream.mPresent = 1;
+ }
+ break;
+
+ case 0x90 : // Overlay bitmap stream case.
+ LFA_Read ( idxFile.fileRef, &avchdProgramInfo.mOverlayBitmapStream.mOBLanguageCode, 3 );
+ avchdProgramInfo.mOverlayBitmapStream.mOBLanguageCode[3] = 0;
+ avchdProgramInfo.mOverlayBitmapStream.mPresent = 1;
+ break;
+
+ case 0x91 : // Menu bitmap stream.
+ LFA_Read ( idxFile.fileRef, &avchdProgramInfo.mMenuBitmapStream.mBMLanguageCode, 3 );
+ avchdProgramInfo.mMenuBitmapStream.mBMLanguageCode[3] = 0;
+ avchdProgramInfo.mMenuBitmapStream.mPresent = 1;
+ break;
+
+ default :
+ break;
+
+ }
+
+ LFA_Seek ( idxFile.fileRef, pos + length, SEEK_SET );
+
+ }
+
+ } catch ( ... ) {
+
+ return false;
+
+ }
+
+ return true;
+
+} // ReadAVCHDProgramInfo
+
+// =================================================================================================
+// AVCHD_MetaHandlerCTor
+// =====================
+
+XMPFileHandler * AVCHD_MetaHandlerCTor ( XMPFiles * parent )
+{
+ return new AVCHD_MetaHandler ( parent );
+
+} // AVCHD_MetaHandlerCTor
+
+// =================================================================================================
+// AVCHD_MetaHandler::AVCHD_MetaHandler
+// ====================================
+
+AVCHD_MetaHandler::AVCHD_MetaHandler ( XMPFiles * _parent )
+{
+ this->parent = _parent; // Inherited, can't set in the prefix.
+ this->handlerFlags = kAVCHD_HandlerFlags;
+ this->stdCharForm = kXMP_Char8Bit;
+
+ // Extract the root path and clip name.
+
+ XMP_Assert ( this->parent->handlerTemp != 0 );
+
+ this->rootPath.assign ( (char*) this->parent->handlerTemp );
+ free ( this->parent->handlerTemp );
+ this->parent->handlerTemp = 0;
+
+ SplitLeafName ( &this->rootPath, &this->clipName );
+
+} // AVCHD_MetaHandler::AVCHD_MetaHandler
+
+// =================================================================================================
+// AVCHD_MetaHandler::~AVCHD_MetaHandler
+// =====================================
+
+AVCHD_MetaHandler::~AVCHD_MetaHandler()
+{
+
+ if ( this->parent->handlerTemp != 0 ) {
+ free ( this->parent->handlerTemp );
+ this->parent->handlerTemp = 0;
+ }
+
+} // AVCHD_MetaHandler::~AVCHD_MetaHandler
+
+// =================================================================================================
+// AVCHD_MetaHandler::MakeClipInfoPath
+// ===================================
+
+void AVCHD_MetaHandler::MakeClipInfoPath ( std::string * path, XMP_StringPtr suffix )
+{
+
+ *path = this->rootPath;
+ *path += kDirChar;
+ *path += "BDMV";
+ *path += kDirChar;
+ *path += "CLIPINF";
+ *path += kDirChar;
+ *path += this->clipName;
+ *path += suffix;
+
+} // AVCHD_MetaHandler::MakeClipInfoPath
+
+// =================================================================================================
+// AVCHD_MetaHandler::MakeClipStreamPath
+// =====================================
+
+void AVCHD_MetaHandler::MakeClipStreamPath ( std::string * path, XMP_StringPtr suffix )
+{
+
+ *path = this->rootPath;
+ *path += kDirChar;
+ *path += "BDMV";
+ *path += kDirChar;
+ *path += "STREAM";
+ *path += kDirChar;
+ *path += this->clipName;
+ *path += suffix;
+
+} // AVCHD_MetaHandler::MakeClipStreamPath
+
+// =================================================================================================
+// AVCHD_MetaHandler::MakeLegacyDigest
+// ===================================
+
+#define kHexDigits "0123456789ABCDEF"
+
+void AVCHD_MetaHandler::MakeLegacyDigest ( std::string * digestStr )
+{
+ AVCHD_blkProgramInfo avchdProgramInfo;
+ std::string strPath;
+ this->MakeClipInfoPath ( &strPath, ".clpi" );
+
+ if ( ! ReadAVCHDProgramInfo ( strPath, avchdProgramInfo ) ) {
+ this->MakeClipInfoPath ( &strPath, ".cpi" );
+ if ( ! ReadAVCHDProgramInfo ( strPath, avchdProgramInfo ) ) return;
+ }
+
+ MD5_CTX context;
+ unsigned char digestBin [16];
+
+ MD5Init ( &context );
+ MD5Update ( &context, (XMP_Uns8*)&avchdProgramInfo, (unsigned int) sizeof(avchdProgramInfo) );
+ MD5Final ( digestBin, &context );
+
+ char buffer [40];
+ for ( int in = 0, out = 0; in < 16; in += 1, out += 2 ) {
+ XMP_Uns8 byte = digestBin[in];
+ buffer[out] = kHexDigits [ byte >> 4 ];
+ buffer[out+1] = kHexDigits [ byte & 0xF ];
+ }
+ buffer[32] = 0;
+ digestStr->erase();
+ digestStr->append ( buffer, 32 );
+
+} // AVCHD_MetaHandler::MakeLegacyDigest
+
+// =================================================================================================
+// AVCHD_MetaHandler::CacheFileData
+// ================================
+
+void AVCHD_MetaHandler::CacheFileData()
+{
+ XMP_Assert ( (! this->containsXMP) && (! this->containsTNail) );
+
+ // See if the clip's .XMP file exists.
+
+ std::string xmpPath;
+ this->MakeClipStreamPath ( &xmpPath, ".xmp" );
+ if ( GetFileMode ( xmpPath.c_str() ) != kFMode_IsFile ) return; // No XMP.
+
+ // Read the entire .XMP file.
+
+ char openMode = 'r';
+ if ( this->parent->openFlags & kXMPFiles_OpenForUpdate ) openMode = 'w';
+
+ LFA_FileRef xmpFile = LFA_Open ( xmpPath.c_str(), openMode );
+ if ( xmpFile == 0 ) return; // The open failed.
+
+ XMP_Int64 xmpLen = LFA_Measure ( xmpFile );
+ if ( xmpLen > 100*1024*1024 ) {
+ XMP_Throw ( "AVCHD XMP is outrageously large", kXMPErr_InternalFailure ); // Sanity check.
+ }
+
+ this->xmpPacket.erase();
+ this->xmpPacket.reserve ( (size_t ) xmpLen );
+ this->xmpPacket.append ( (size_t ) xmpLen, ' ' );
+
+ XMP_Int32 ioCount = LFA_Read ( xmpFile, (void*)this->xmpPacket.data(), (XMP_Int32)xmpLen, kLFA_RequireAll );
+ XMP_Assert ( ioCount == xmpLen );
+
+ this->packetInfo.offset = 0;
+ this->packetInfo.length = (XMP_Int32)xmpLen;
+ FillPacketInfo ( this->xmpPacket, &this->packetInfo );
+
+ XMP_Assert ( this->parent->fileRef == 0 );
+ if ( openMode == 'r' ) {
+ LFA_Close ( xmpFile );
+ } else {
+ this->parent->fileRef = xmpFile;
+ }
+
+ this->containsXMP = true;
+
+} // AVCHD_MetaHandler::CacheFileData
+
+// =================================================================================================
+// AVCHD_MetaHandler::ProcessXMP
+// =============================
+
+void AVCHD_MetaHandler::ProcessXMP()
+{
+ if ( this->processedXMP ) return;
+ this->processedXMP = true; // Make sure only called once.
+
+ if ( this->containsXMP ) {
+ this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() );
+ }
+
+ // read clip info
+ AVCHD_blkProgramInfo avchdProgramInfo;
+ std::string strPath;
+ this->MakeClipInfoPath ( &strPath, ".clpi" );
+
+ if ( ! ReadAVCHDProgramInfo ( strPath, avchdProgramInfo ) ) {
+ this->MakeClipInfoPath ( &strPath, ".cpi" );
+ if ( ! ReadAVCHDProgramInfo ( strPath, avchdProgramInfo ) ) return;
+ }
+
+ // Video Stream. AVCHD Format v. 1.01 p. 78
+
+ XMP_StringPtr xmpValue = 0;
+
+ if ( avchdProgramInfo.mVideoStream.mPresent ) {
+
+ // XMP videoFrameRate.
+ xmpValue = 0;
+ switch ( avchdProgramInfo.mVideoStream.mFrameRate ) {
+ case 1 : xmpValue = "23.98p"; break; // "23.976"
+ case 2 : xmpValue = "24p"; break; // "24"
+ case 3 : xmpValue = "25p"; break; // "25"
+ case 4 : xmpValue = "29.97p"; break; // "29.97"
+ case 6 : xmpValue = "50i"; break; // "50"
+ case 7 : xmpValue = "59.94i"; break; // "59.94"
+ default: break;
+ }
+ if ( xmpValue != 0 ) {
+ this->xmpObj.SetProperty ( kXMP_NS_DM, "videoFrameRate", xmpValue, kXMP_DeleteExisting );
+ }
+
+ // XMP videoFrameSize.
+ xmpValue = 0;
+ int frameIndex = -1;
+ const char* frameWidth[4] = { "720", "720", "1280", "1920" };
+ const char* frameHeight[4] = { "480", "576", "720", "1080" };
+ switch ( avchdProgramInfo.mVideoStream.mVideoFormat ) {
+ case 1 : frameIndex = 0; break; // 480i
+ case 2 : frameIndex = 1; break; // 576i
+ case 3 : frameIndex = 0; break; // 480i
+ case 4 : frameIndex = 3; break; // 1080i
+ case 5 : frameIndex = 2; break; // 720p
+ case 6 : frameIndex = 3; break; // 1080p
+ default: break;
+ }
+ if ( frameIndex != -1 ) {
+ xmpValue = frameWidth[frameIndex];
+ this->xmpObj.SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "w", xmpValue, 0 );
+ xmpValue = frameHeight[frameIndex];
+ this->xmpObj.SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "h", xmpValue, 0 );
+ xmpValue = "pixels";
+ this->xmpObj.SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "unit", xmpValue, 0 );
+ }
+
+ this->containsXMP = true;
+
+ }
+
+ // Audio Stream.
+ if ( avchdProgramInfo.mAudioStream.mPresent ) {
+
+ xmpValue = 0;
+ switch ( avchdProgramInfo.mAudioStream.mAudioPresentationType ) {
+ case 1 : xmpValue = "Mono"; break;
+ case 3 : xmpValue = "Stereo"; break;
+ default : break;
+ }
+ if ( xmpValue != 0 ) {
+ this->xmpObj.SetProperty ( kXMP_NS_DM, "audioChannelType", xmpValue, kXMP_DeleteExisting );
+ }
+
+ xmpValue = 0;
+ switch ( avchdProgramInfo.mAudioStream.mSamplingFrequency ) {
+ case 1 : xmpValue = "48000"; break;
+ case 4 : xmpValue = "96000"; break;
+ case 5 : xmpValue = "192000"; break;
+ default : break;
+ }
+ if ( xmpValue != 0 ) {
+ this->xmpObj.SetProperty ( kXMP_NS_DM, "audioSampleRate", xmpValue, kXMP_DeleteExisting );
+ }
+
+ this->containsXMP = true;
+
+ }
+
+} // AVCHD_MetaHandler::ProcessXMP
+
+// =================================================================================================
+// AVCHD_MetaHandler::UpdateFile
+// =============================
+//
+// Note that UpdateFile is only called from XMPFiles::CloseFile, so it is OK to close the file here.
+
+void AVCHD_MetaHandler::UpdateFile ( bool doSafeUpdate )
+{
+ if ( ! this->needsUpdate ) return;
+ this->needsUpdate = false; // Make sure only called once.
+
+ std::string newDigest;
+ this->MakeLegacyDigest ( &newDigest );
+ this->xmpObj.SetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "AVCHD", newDigest.c_str(), kXMP_DeleteExisting );
+
+ LFA_FileRef oldFile = this->parent->fileRef;
+
+ this->xmpObj.SerializeToBuffer ( &this->xmpPacket, this->GetSerializeOptions() );
+
+ if ( oldFile == 0 ) {
+
+ // The XMP does not exist yet.
+
+ std::string xmpPath;
+ this->MakeClipStreamPath ( &xmpPath, ".xmp" );
+
+ LFA_FileRef xmpFile = LFA_Create ( xmpPath.c_str() );
+ if ( xmpFile == 0 ) XMP_Throw ( "Failure creating AVCHD XMP file", kXMPErr_ExternalFailure );
+ LFA_Write ( xmpFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() );
+ LFA_Close ( xmpFile );
+
+ } else if ( ! doSafeUpdate ) {
+
+ // Over write the existing XMP file.
+
+ LFA_Seek ( oldFile, 0, SEEK_SET );
+ LFA_Truncate ( oldFile, 0 );
+ LFA_Write ( oldFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() );
+ LFA_Close ( oldFile );
+
+ } else {
+
+ // Do a safe update.
+
+ // *** We really need an LFA_SwapFiles utility.
+
+ std::string xmpPath, tempPath;
+
+ this->MakeClipStreamPath ( &xmpPath, ".xmp" );
+
+ CreateTempFile ( xmpPath, &tempPath );
+ LFA_FileRef tempFile = LFA_Open ( tempPath.c_str(), 'w' );
+ LFA_Write ( tempFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() );
+ LFA_Close ( tempFile );
+
+ LFA_Close ( oldFile );
+ LFA_Delete ( xmpPath.c_str() );
+ LFA_Rename ( tempPath.c_str(), xmpPath.c_str() );
+
+ }
+
+ this->parent->fileRef = 0;
+
+} // AVCHD_MetaHandler::UpdateFile
+
+// =================================================================================================
+// AVCHD_MetaHandler::WriteFile
+// ============================
+
+void AVCHD_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath )
+{
+
+ // ! WriteFile is not supposed to be called for handlers that own the file.
+ XMP_Throw ( "AVCHD_MetaHandler::WriteFile should not be called", kXMPErr_InternalFailure );
+
+} // AVCHD_MetaHandler::WriteFile
+
+// =================================================================================================
diff --git a/source/XMPFiles/FileHandlers/AVCHD_Handler.hpp b/source/XMPFiles/FileHandlers/AVCHD_Handler.hpp
new file mode 100644
index 0000000..45e9cf9
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/AVCHD_Handler.hpp
@@ -0,0 +1,77 @@
+#ifndef __AVCHD_Handler_hpp__
+#define __AVCHD_Handler_hpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XMP_Environment.h" // ! This must be the first include.
+
+#include "XMPFiles_Impl.hpp"
+
+#include "ExpatAdapter.hpp"
+
+// =================================================================================================
+/// \file AVCHD_Handler.hpp
+/// \brief Folder format handler for AVCHD.
+///
+/// This header ...
+///
+// =================================================================================================
+
+extern XMPFileHandler * AVCHD_MetaHandlerCTor ( XMPFiles * parent );
+
+extern bool AVCHD_CheckFormat ( XMP_FileFormat format,
+ const std::string & rootPath,
+ const std::string & gpName,
+ const std::string & parentName,
+ const std::string & leafName,
+ XMPFiles * parent );
+
+static const XMP_OptionBits kAVCHD_HandlerFlags = (kXMPFiles_CanInjectXMP |
+ kXMPFiles_CanExpand |
+ kXMPFiles_CanRewrite |
+ kXMPFiles_PrefersInPlace |
+ kXMPFiles_CanReconcile |
+ kXMPFiles_AllowsOnlyXMP |
+ kXMPFiles_ReturnsRawPacket |
+ kXMPFiles_HandlerOwnsFile |
+ kXMPFiles_AllowsSafeUpdate |
+ kXMPFiles_FolderBasedFormat);
+
+class AVCHD_MetaHandler : public XMPFileHandler
+{
+public:
+
+ void CacheFileData();
+ void ProcessXMP();
+
+ XMP_OptionBits GetSerializeOptions() // *** These should be standard for standalone XMP files.
+ { return (kXMP_UseCompactFormat | kXMP_OmitPacketWrapper); };
+
+ void UpdateFile ( bool doSafeUpdate );
+ void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath );
+
+ AVCHD_MetaHandler ( XMPFiles * _parent );
+ virtual ~AVCHD_MetaHandler();
+
+private:
+
+ AVCHD_MetaHandler() {}; // Hidden on purpose.
+
+ void MakeClipInfoPath ( std::string * path, XMP_StringPtr suffix );
+ void MakeClipStreamPath ( std::string * path, XMP_StringPtr suffix );
+ void MakeLegacyDigest ( std::string * digestStr );
+
+ std::string rootPath, clipName;
+
+}; // AVCHD_MetaHandler
+
+// =================================================================================================
+
+#endif /* __AVCHD_Handler_hpp__ */
diff --git a/source/XMPFiles/FileHandlers/AVI_Handler.cpp b/source/XMPFiles/FileHandlers/AVI_Handler.cpp
index 6511246..96a11ec 100644
--- a/source/XMPFiles/FileHandlers/AVI_Handler.cpp
+++ b/source/XMPFiles/FileHandlers/AVI_Handler.cpp
@@ -1,6 +1,6 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -20,15 +20,10 @@
#endif
#endif
-
using namespace std;
#define kXMPUserDataType MakeFourCC ( '_', 'P', 'M', 'X' ) /* Yes, backwards! */
-
-/*******************************************************
-** Premiere Pro specific info for reconciliation
-*******************************************************/
// FourCC codes for the RIFF chunks
#define aviTimeChunk MakeFourCC('I','S','M','T')
#define avihdrlChunk MakeFourCC('h','d','r','l')
@@ -57,10 +52,6 @@ using namespace std;
#define kAltTapeName "altTapeName"
#define kLogComment "logComment"
-/*******************************************************
-*******************************************************/
-
-
// =================================================================================================
/// \file AVI_Handler.cpp
/// \brief File format handler for AVI.
@@ -144,14 +135,14 @@ void AVI_MetaHandler::UpdateFile ( bool doSafeUpdate )
if ( doSafeUpdate ) XMP_Throw ( "AVI_MetaHandler::UpdateFile: Safe update not supported", kXMPErr_Unavailable );
XMP_StringPtr packetStr = xmpPacket.c_str();
- XMP_StringLen packetLen = xmpPacket.size();
+ XMP_StringLen packetLen = (XMP_StringLen)xmpPacket.size();
if ( packetLen == 0 ) return;
// Make sure we're writing an even number of bytes as required by the RIFF specification.
if ( (xmpPacket.size() & 1) == 1 ) xmpPacket.push_back ( ' ' );
XMP_Assert ( (xmpPacket.size() & 1) == 0 );
packetStr = xmpPacket.c_str(); // ! Make sure they are current.
- packetLen = xmpPacket.size();
+ packetLen = (XMP_StringLen)xmpPacket.size();
LFA_FileRef fileRef(this->parent->fileRef);
if ( fileRef == 0 ) return;
@@ -161,7 +152,10 @@ void AVI_MetaHandler::UpdateFile ( bool doSafeUpdate )
if ( numTags == 0 ) return;
ok = RIFF_Support::PutChunk ( fileRef, riffState, formtypeAVI, kXMPUserDataType, (char*)packetStr, packetLen );
- if ( ! ok )return; // If there's an error writing the chunk, bail.
+ if ( ! ok ) return; // If there's an error writing the chunk, bail.
+
+ ok = CreatorAtom::Update ( this->xmpObj, fileRef, formtypeAVI, riffState );
+ if ( ! ok ) return;
// Update legacy metadata
@@ -185,7 +179,7 @@ void AVI_MetaHandler::UpdateFile ( bool doSafeUpdate )
ok = FindChunk ( riffState, myCommentChunk, myCommentList, 0, 0, 0, 0 );
- if ( ! ok ) {
+ if ( ok ) {
// Always rewrite the comment string, even if empty, so the user can erase it.
RIFF_Support::RewriteChunk ( fileRef, riffState, myCommentChunk, myCommentList, logCommentString.c_str() );
@@ -225,19 +219,29 @@ void AVI_MetaHandler::UpdateFile ( bool doSafeUpdate )
} else {
- ok = MakeChunk ( fileRef, riffState, formtypeAVI, PR_AVI_TIMELEN );
- if ( ! ok ) return; // If there's an error making a chunk, bail
-
- RIFF_Support::ltag listtag;
- listtag.id = MakeUns32LE ( FOURCC_LIST );
- listtag.len = MakeUns32LE ( PR_AVI_TIMELEN - 8 );
- listtag.subid = MakeUns32LE ( myTimeList );
- LFA_Write(fileRef, &listtag, 12);
-
- RIFF_Support::WriteChunk ( fileRef, myOrgTimeChunk, startTimecodeString.c_str(), TIMELEN );
- RIFF_Support::WriteChunk ( fileRef, myAltTimeChunk, altTimecodeString.c_str(), TIMELEN );
- RIFF_Support::WriteChunk ( fileRef, myOrgReelChunk, orgReelString.c_str(), REELLEN );
- RIFF_Support::WriteChunk ( fileRef, myAltReelChunk, altReelString.c_str(), REELLEN );
+ // We don't have the legacy part yet. If none of the XMP items exist then don't do anything.
+ // Otherwise, add all 4 even if empty. This is the original logic from way back.
+
+ bool haveAnyXMP = ( (! startTimecodeString.empty()) || (! altTimecodeString.empty()) ||
+ (! orgReelString.empty()) || (! altReelString.empty()) );
+
+ if ( haveAnyXMP ) {
+
+ ok = MakeChunk ( fileRef, riffState, formtypeAVI, PR_AVI_TIMELEN );
+ if ( ! ok ) return; // If there's an error making a chunk, bail
+
+ RIFF_Support::ltag listtag;
+ listtag.id = MakeUns32LE ( FOURCC_LIST );
+ listtag.len = MakeUns32LE ( PR_AVI_TIMELEN - 8 );
+ listtag.subid = MakeUns32LE ( myTimeList );
+ LFA_Write(fileRef, &listtag, 12);
+
+ RIFF_Support::WriteChunk ( fileRef, myOrgTimeChunk, startTimecodeString.c_str(), TIMELEN );
+ RIFF_Support::WriteChunk ( fileRef, myAltTimeChunk, altTimecodeString.c_str(), TIMELEN );
+ RIFF_Support::WriteChunk ( fileRef, myOrgReelChunk, orgReelString.c_str(), REELLEN );
+ RIFF_Support::WriteChunk ( fileRef, myAltReelChunk, altReelString.c_str(), REELLEN );
+
+ }
}
@@ -259,6 +263,24 @@ void AVI_MetaHandler::WriteFile ( LFA_FileRef sourceRef,
} // AVI_MetaHandler::WriteFile
// =================================================================================================
+
+static void StripSimpleEmpty ( SXMPMeta * xmp, XMP_StringPtr ns, XMP_StringPtr prop )
+{
+ // Small hack to clean up bad data. There are cases of code writing xmpDM:startTimecode and
+ // xmpDM:altTimecode as simple properties with empty values. They are supposed to be structs.
+
+ std::string value;
+ XMP_OptionBits flags;
+
+ bool found = xmp->GetProperty ( ns, prop, &value, &flags );
+
+ if ( found && XMP_PropIsSimple(flags) && value.empty() ) {
+ xmp->DeleteProperty ( ns, prop );
+ }
+
+}
+
+// =================================================================================================
// AVI_MetaHandler::CacheFileData
// ==============================
@@ -268,16 +290,48 @@ void AVI_MetaHandler::CacheFileData()
this->containsXMP = false;
- LFA_FileRef fileRef ( this->parent->fileRef );
+ LFA_FileRef fileRef ( this->parent->fileRef ); //*** simplify to assignment
if ( fileRef == 0 ) return;
+ bool updateFile = XMP_OptionIsSet ( this->parent->openFlags, kXMPFiles_OpenForUpdate );
+ if ( updateFile ) {
+
+ // Workaround for bad files in the field that have a bad size in the outermost RIFF chunk.
+ // Repair the cases where the length is too long (beyond EOF). Don't repair a length that is
+ // less than EOF, we don't know if there actually are multiple top level chunks. There is
+ // also a check and "runtime repair" inside ReadTag, needed for read-only file access.
+
+ XMP_Int64 fileLen = LFA_Measure ( fileRef );
+ XMP_Uns32 riffLen;
+
+ LFA_Seek ( fileRef, 4, SEEK_SET );
+ LFA_Read ( fileRef, &riffLen, 4 );
+ riffLen = GetUns32LE ( &riffLen );
+
+ if ( (fileLen >= 8) && ((XMP_Int64)riffLen > (fileLen - 8)) ) { // Is the initial chunk too long?
+
+ bool repairFile = XMP_OptionIsSet ( this->parent->openFlags, kXMPFiles_OpenRepairFile );
+ if ( ! repairFile ) {
+ XMP_Throw ( "Initial RIFF tag exceeds file length", kXMPErr_BadValue );
+ } else {
+ riffLen = MakeUns32LE ( (XMP_Uns32)fileLen - 8 );
+ LFA_Seek ( fileRef, 4, SEEK_SET );
+ LFA_Write ( fileRef, &riffLen, 4 );
+ }
+
+ }
+
+ }
+
+ // Contnue with normal processing.
+
RIFF_Support::RiffState riffState;
long numTags = RIFF_Support::OpenRIFF ( fileRef, riffState );
- if ( numTags == 0 ) return;
+ if ( numTags == 0 ) return; //*** shouldn't we throw ? XMP_Throw("invalid file format") or such?
// Determine the size of the metadata
unsigned long bufferSize(0);
- ok = RIFF_Support::GetRIFFChunk ( fileRef, riffState, kXMPUserDataType, 0, 0, 0, &bufferSize );
+ ok = RIFF_Support::GetRIFFChunk ( fileRef, riffState, kXMPUserDataType /* _PMX, the xmp packet */, 0, 0, 0, &bufferSize);
if ( ! ok ) {
@@ -290,22 +344,26 @@ void AVI_MetaHandler::CacheFileData()
this->xmpPacket.assign ( bufferSize, ' ' );
// Get the metadata
- ok = RIFF_Support::GetRIFFChunk ( fileRef, riffState, kXMPUserDataType, 0, 0, (char*)this->xmpPacket.c_str(), &bufferSize );
+ XMP_Uns64 xmpPacketPosition;
+ ok = RIFF_Support::GetRIFFChunk ( fileRef, riffState, kXMPUserDataType /* _PMX, the xmp packet */, 0, 0,
+ (char*)this->xmpPacket.c_str(), &bufferSize, &xmpPacketPosition );
if ( ok ) {
- this->packetInfo.offset = kXMPFiles_UnknownOffset;
+ this->packetInfo.offset = xmpPacketPosition;
this->packetInfo.length = bufferSize;
- this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), this->xmpPacket.size() );
+ this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() );
this->containsXMP = true;
}
}
-
// Reconcile legacy metadata.
-
- std::string aviTimeString, orgTimeString, altTimeString;
+
+ std::string aviTimeString, orgTimeString, altTimeString, projectPathString;
unsigned long aviTimeSize, orgTimeSize, altTimeSize;
+ StripSimpleEmpty ( &this->xmpObj, kXMP_NS_DM, kStartTimecode );
+ StripSimpleEmpty ( &this->xmpObj, kXMP_NS_DM, kAltTimecode );
+
ok = RIFF_Support::GetRIFFChunk ( fileRef, riffState, aviTimeChunk, avihdrlChunk, 0, 0, &aviTimeSize );
if ( ok ) {
aviTimeString.reserve ( aviTimeSize );
@@ -422,11 +480,19 @@ void AVI_MetaHandler::CacheFileData()
}
- // Update the xmpPacket, as the xmpObj might have been updated with legacy info.
- this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat );
- this->packetInfo.offset = kXMPFiles_UnknownOffset;
- this->packetInfo.length = this->xmpPacket.size();
+ CreatorAtom::Import ( this->xmpObj, fileRef, riffState );
+
+ //// Update the xmpPacket, as the xmpObj might have been updated with legacy info.
+ //// Produce packet of same size [1781657]
+ //try {
+ // this->xmpObj.SerializeToBuffer ( &this->xmpPacket,
+ // (kXMP_UseCompactFormat | kXMP_ExactPacketLength) , packetInfo.length );
+ //} catch ( XMP_Error ) {
+ // this->xmpObj.SerializeToBuffer ( &this->xmpPacket, (kXMP_UseCompactFormat ) );
+ //}
+ // removed for [1781657] this->packetInfo.offset = kXMPFiles_UnknownOffset;
+ // removed for [1781657] this->packetInfo.length = (XMP_StringLen)this->xmpPacket.size();
this->processedXMP = this->containsXMP;
-
+
} // AVI_MetaHandler::CacheFileData
diff --git a/source/XMPFiles/FileHandlers/Basic_Handler.cpp b/source/XMPFiles/FileHandlers/Basic_Handler.cpp
index 845fe16..f3b471e 100644
--- a/source/XMPFiles/FileHandlers/Basic_Handler.cpp
+++ b/source/XMPFiles/FileHandlers/Basic_Handler.cpp
@@ -71,7 +71,7 @@ void Basic_MetaHandler::UpdateFile ( bool doSafeUpdate )
LFA_Seek ( fileRef, 0, SEEK_END );
this->WriteXMPPrefix();
- LFA_Write ( fileRef, xmpPacket.c_str(), xmpPacket.size() );
+ LFA_Write ( fileRef, xmpPacket.c_str(), (XMP_StringLen)xmpPacket.size() );
this->WriteXMPSuffix();
if ( checkAbort && abortProc(abortArg) ) {
XMP_Throw ( "Basic_MetaHandler::UpdateFile - User abort", kXMPErr_UserAbort );
@@ -135,7 +135,7 @@ void Basic_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & s
// Write the new XMP section to the destination.
this->WriteXMPPrefix();
- LFA_Write ( destRef, this->xmpPacket.c_str(), this->xmpPacket.size() );
+ LFA_Write ( destRef, this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() );
this->WriteXMPSuffix();
if ( checkAbort && abortProc(abortArg) ) {
XMP_Throw ( "Basic_MetaHandler::WriteFile - User abort", kXMPErr_UserAbort );
diff --git a/source/XMPFiles/FileHandlers/Basic_Handler.hpp b/source/XMPFiles/FileHandlers/Basic_Handler.hpp
index 4f8dc77..45eef9f 100644
--- a/source/XMPFiles/FileHandlers/Basic_Handler.hpp
+++ b/source/XMPFiles/FileHandlers/Basic_Handler.hpp
@@ -57,6 +57,7 @@
static const XMP_OptionBits kBasic_HandlerFlags = (kXMPFiles_CanInjectXMP |
kXMPFiles_CanExpand |
kXMPFiles_CanRewrite |
+ kXMPFiles_PrefersInPlace |
kXMPFiles_AllowsOnlyXMP |
kXMPFiles_ReturnsRawPacket |
kXMPFiles_AllowsSafeUpdate);
diff --git a/source/XMPFiles/FileHandlers/FLV_Handler.cpp b/source/XMPFiles/FileHandlers/FLV_Handler.cpp
new file mode 100644
index 0000000..2472870
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/FLV_Handler.cpp
@@ -0,0 +1,750 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "FLV_Handler.hpp"
+
+#include "MD5.h"
+
+using namespace std;
+
+// =================================================================================================
+/// \file FLV_Handler.cpp
+/// \brief File format handler for FLV.
+///
+/// FLV is a fairly simple format, with a strong orientation to streaming use. It consists of a
+/// small file header then a sequence of tags that can contain audio data, video data, or
+/// ActionScript data. All integers in FLV are big endian.
+///
+/// For FLV version 1, the file header contains:
+///
+/// UI24 signature - the characters "FLV"
+/// UI8 version - 1
+/// UI8 flags - 0x01 = has video tags, 0x04 = has audio tags
+/// UI32 length in bytes of file header
+///
+/// For FLV version 1, each tag begins with an 11 byte header:
+///
+/// UI8 tag type - 8 = audio tag, 9 = video tag, 18 = script data tag
+/// UI24 content length in bytes
+/// UI24 time - low order 3 bytes
+/// UI8 time - high order byte
+/// UI24 stream ID
+///
+/// This is followed by the tag's content, then a UI32 "back pointer" which is the header size plus
+/// the content size. A UI32 zero is placed between the file header and the first tag as a
+/// terminator for backward scans. The time in a tag header is the start of playback for that tag.
+/// The tags must be in ascending time order. For a given time it is preferred that script data tags
+/// precede audio and video tags.
+///
+/// For metadata purposes only the script data tags are of interest. Script data information becomes
+/// accessible to ActionScript at the playback moment of the script data tag through a call to a
+/// registered data handler. The content of a script data tag contains a string and an ActionScript
+/// data value. The string is the name of the handler to be invoked, the data value is passed as an
+/// ActionScript Object parameter to the handler.
+///
+/// The XMP is placed in a script data tag with the name "onXMPData". A variety of legacy metadata
+/// is contained in a script data tag with the name "onMetaData". This contains only "internal"
+/// information (like duration or width/height), nothing that is user or author editiable (like
+/// title or description). Some of these legacy items are imported into the XMP, none are updated
+/// from the XMP.
+///
+/// A script data tag's content is:
+///
+/// UI8 0x02
+/// UI16 name length - includes nul terminator if present
+/// UI8n object name - UTF-8, possibly with nul terminator
+/// ... object value - serialized ActionScript value (SCRIPTDATAVALUE in FLV spec)
+///
+/// The onXMPData and onMetaData values are both ECMA arrays. These have more in common with XMP
+/// structs than arrays, the items have arbitrary string names. The serialized form is:
+///
+/// UI8 0x08
+/// UI32 array length - need not be exact, an optimization hint
+/// array items
+/// UI16 name length - includes nul terminator if present
+/// UI8n item name - UTF-8, possibly with nul terminator
+/// ... object value - serialized ActionScript value (SCRIPTDATAVALUE in FLV spec)
+/// UI24 0x000009 - array terminator
+///
+/// The object names and array item names in sample files do not have a nul terminator. The policy
+/// here is to treat them as optional when reading, and to omit them when writing.
+///
+/// The onXMPData array typically has one item named "liveXML". The value of this is a short or long
+/// string as necessary:
+///
+/// UI8 type - 2 for a short string, 12 for a long string
+/// UIx value length - UI16 for a short string, UI32 for a long string, includes nul terminator
+/// UI8n value - UTF-8 with nul terminator
+///
+// =================================================================================================
+
+static inline XMP_Uns32 GetUns24BE ( const void * addr )
+{
+ return (GetUns32BE(addr) >> 8);
+}
+
+static inline void PutUns24BE ( XMP_Uns32 value, void * addr )
+{
+ XMP_Uns8 * bytes = (XMP_Uns8*)addr;
+ bytes[0] = (XMP_Uns8)(value >> 16);
+ bytes[1] = (XMP_Uns8)(value >> 8);
+ bytes[2] = (XMP_Uns8)(value);
+}
+
+// =================================================================================================
+// FLV_CheckFormat
+// ===============
+//
+// Check for "FLV" and 1 in the first 4 bytes, that the header length is at least 9, that the file
+// size is at least as big as the header, and that the leading 0 back pointer is present if the file
+// is bigger than the header.
+
+#define kFLV1 0x464C5601UL
+
+bool FLV_CheckFormat ( XMP_FileFormat format,
+ XMP_StringPtr filePath,
+ LFA_FileRef fileRef,
+ XMPFiles * parent )
+{
+ XMP_Uns8 buffer [9];
+
+ LFA_Seek ( fileRef, 0, SEEK_SET );
+ XMP_Uns32 ioCount = LFA_Read ( fileRef, buffer, 9 );
+ if ( ioCount != 9 ) return false;
+
+ XMP_Uns32 fileSignature = GetUns32BE ( &buffer[0] );
+ if ( fileSignature != kFLV1 ) return false;
+
+ XMP_Uns32 headerSize = GetUns32BE ( &buffer[5] );
+ XMP_Uns64 fileSize = LFA_Measure ( fileRef );
+ if ( (fileSize < (headerSize + 4)) && (fileSize != headerSize) ) return false;
+
+ if ( fileSize >= (headerSize + 4) ) {
+ XMP_Uns32 bpZero;
+ LFA_Seek ( fileRef, headerSize, SEEK_SET );
+ ioCount = LFA_Read ( fileRef, &bpZero, 4 );
+ if ( (ioCount != 4) || (bpZero != 0) ) return false;
+ }
+
+ return true;
+
+} // FLV_CheckFormat
+
+// =================================================================================================
+// FLV_MetaHandlerCTor
+// ===================
+
+XMPFileHandler * FLV_MetaHandlerCTor ( XMPFiles * parent )
+{
+
+ return new FLV_MetaHandler ( parent );
+
+} // FLV_MetaHandlerCTor
+
+// =================================================================================================
+// FLV_MetaHandler::FLV_MetaHandler
+// ================================
+
+FLV_MetaHandler::FLV_MetaHandler ( XMPFiles * _parent )
+ : flvHeaderLen(0), longXMP(false), xmpTagPos(0), omdTagPos(0), xmpTagLen(0), omdTagLen(0)
+{
+
+ this->parent = _parent; // Inherited, can't set in the prefix.
+ this->handlerFlags = kFLV_HandlerFlags;
+ this->stdCharForm = kXMP_Char8Bit;
+
+} // FLV_MetaHandler::FLV_MetaHandler
+
+// =================================================================================================
+// FLV_MetaHandler::~FLV_MetaHandler
+// =================================
+
+FLV_MetaHandler::~FLV_MetaHandler()
+{
+
+ // Nothing to do yet.
+
+} // FLV_MetaHandler::~FLV_MetaHandler
+
+// =================================================================================================
+// GetTagInfo
+// ==========
+//
+// Seek to the start of a tag and extract the type, data size, and timestamp. Leave the file
+// positioned at the first byte of data.
+
+struct TagInfo {
+ XMP_Uns8 type;
+ XMP_Uns32 time;
+ XMP_Uns32 dataSize;
+};
+
+static void GetTagInfo ( LFA_FileRef fileRef, XMP_Uns64 tagPos, TagInfo * info )
+{
+ XMP_Uns8 buffer [11];
+
+ LFA_Seek ( fileRef, tagPos, SEEK_SET );
+ LFA_Read ( fileRef, buffer, 11, kLFA_RequireAll );
+
+ info->type = buffer[0];
+ info->time = GetUns24BE ( &buffer[4] ) || (buffer[7] << 24);
+ info->dataSize = GetUns24BE ( &buffer[1] );
+
+} // GetTagInfo
+
+// =================================================================================================
+// GetASValueLen
+// =============
+//
+// Return the full length of a serialized ActionScript value, including the type byte, zero if unknown.
+
+static XMP_Uns32 GetASValueLen ( const XMP_Uns8 * asValue, const XMP_Uns8 * asLimit )
+{
+ XMP_Uns32 valueLen = 0;
+ const XMP_Uns8 * itemPtr;
+ XMP_Uns32 arrayCount;
+
+ switch ( asValue[0] ) {
+
+ case 0 : // IEEE double
+ valueLen = 1 + 8;
+ break;
+
+ case 1 : // UI8 Boolean
+ valueLen = 1 + 1;
+ break;
+
+ case 2 : // Short string
+ valueLen = 1 + 2 + GetUns16BE ( &asValue[1] );
+ break;
+
+ case 3 : // ActionScript object, a name and value.
+ itemPtr = &asValue[1];
+ itemPtr += 2 + GetUns16BE ( itemPtr ); // Move past the name portion.
+ itemPtr += GetASValueLen ( itemPtr, asLimit ); // And past the data portion.
+ valueLen = (XMP_Uns32) (itemPtr - asValue);
+ break;
+
+ case 4 : // Short string (movie clip path)
+ valueLen = 1 + 2 + GetUns16BE ( &asValue[1] );
+ break;
+
+ case 5 : // Null
+ valueLen = 1;
+ break;
+
+ case 6 : // Undefined
+ valueLen = 1;
+ break;
+
+ case 7 : // UI16 reference ID
+ valueLen = 1 + 2;
+ break;
+
+ case 8 : // ECMA array, ignore the count, look for the 0x000009 terminator.
+ itemPtr = &asValue[5];
+ while ( itemPtr < asLimit ) {
+ XMP_Uns16 nameLen = GetUns16BE ( itemPtr );
+ itemPtr += 2 + nameLen; // Move past the name portion.
+ if ( (nameLen == 0) && (*itemPtr == 9) ) {
+ itemPtr += 1;
+ break; // Done, found the 0x000009 terminator.
+ }
+ itemPtr += GetASValueLen ( itemPtr, asLimit ); // And past the data portion.
+ }
+ valueLen = (XMP_Uns32) (itemPtr - asValue);
+ break;
+
+ case 10 : // Strict array, has an exact count.
+ arrayCount = GetUns32BE ( &asValue[1] );
+ itemPtr = &asValue[5];
+ for ( ; (arrayCount > 0) && (itemPtr < asLimit); --arrayCount ) {
+ itemPtr += 2 + GetUns16BE ( itemPtr ); // Move past the name portion.
+ itemPtr += GetASValueLen ( itemPtr, asLimit ); // And past the data portion.
+ }
+ valueLen = (XMP_Uns32) (itemPtr - asValue);
+ break;
+
+ case 11 : // Date
+ valueLen = 1 + 8 + 2;
+ break;
+
+ case 12: // Long string
+ valueLen = 1 + 4 + GetUns32BE ( &asValue[1] );
+ break;
+
+ }
+
+ return valueLen;
+
+} // GetASValueLen
+
+// =================================================================================================
+// CheckName
+// =========
+//
+// Check for the name portion of a script data tag or array item, with optional nul terminator. The
+// wantedLen must not count the terminator.
+
+static inline bool CheckName ( XMP_StringPtr inputName, XMP_Uns16 inputLen,
+ XMP_StringPtr wantedName, XMP_Uns16 wantedLen )
+{
+
+ if ( inputLen == wantedLen+1 ) {
+ if ( inputName[wantedLen] != 0 ) return false; // Extra byte must be terminating nul.
+ --inputLen;
+ }
+
+ if ( (inputLen == wantedLen) && XMP_LitNMatch ( inputName, wantedName, wantedLen ) ) return true;
+ return false;
+
+} // CheckName
+
+// =================================================================================================
+// FLV_MetaHandler::CacheFileData
+// ==============================
+//
+// Look for the onXMPData and onMetaData script data tags at time 0. Cache all of onMetaData, it
+// shouldn't be that big and this removes a need to know what is reconciled. It can't be more than
+// 16MB anyway, the size field is only 24 bits.
+
+void FLV_MetaHandler::CacheFileData()
+{
+ XMP_Assert ( (! this->containsXMP) && (! this->containsTNail) );
+
+ XMP_AbortProc abortProc = this->parent->abortProc;
+ void * abortArg = this->parent->abortArg;
+ const bool checkAbort = (abortProc != 0);
+
+ LFA_FileRef fileRef = this->parent->fileRef;
+ XMP_Uns64 fileSize = LFA_Measure ( fileRef );
+
+ XMP_Uns8 buffer [16]; // Enough for 1+2+"onMetaData"+nul.
+ XMP_Uns32 ioCount;
+ TagInfo info;
+
+ LFA_Seek ( fileRef, 5, SEEK_SET );
+ LFA_Read ( fileRef, buffer, 4, kLFA_RequireAll );
+
+ this->flvHeaderLen = GetUns32BE ( &buffer[0] );
+ XMP_Uns32 firstTagPos = this->flvHeaderLen + 4; // Include the initial zero back pointer.
+
+ if ( firstTagPos >= fileSize ) return; // Quit now if the file is just a header.
+
+ for ( XMP_Uns64 tagPos = firstTagPos; tagPos < fileSize; tagPos += (11 + info.dataSize + 4) ) {
+
+ if ( checkAbort && abortProc(abortArg) ) {
+ XMP_Throw ( "FLV_MetaHandler::LookForMetadata - User abort", kXMPErr_UserAbort );
+ }
+
+ GetTagInfo ( fileRef, tagPos, &info ); // ! GetTagInfo seeks to the tag offset.
+ if ( info.time != 0 ) break;
+ if ( info.type != 18 ) continue;
+
+ XMP_Assert ( sizeof(buffer) >= (1+2+10+1) ); // 02 000B onMetaData 00
+ ioCount = LFA_Read ( fileRef, buffer, sizeof(buffer) );
+ if ( (ioCount < 4) || (buffer[0] != 0x02) ) continue;
+
+ XMP_Uns16 nameLen = GetUns16BE ( &buffer[1] );
+ XMP_StringPtr namePtr = (XMP_StringPtr)(&buffer[3]);
+
+ if ( this->onXMP.empty() && CheckName ( namePtr, nameLen, "onXMPData", 9 ) ) {
+
+ // ! Put the raw data in onXMPData, analyze the value in ProcessXMP.
+
+ this->xmpTagPos = tagPos;
+ this->xmpTagLen = 11 + info.dataSize + 4; // ! Includes the trailing back pointer.
+
+ this->packetInfo.offset = tagPos + 11 + 1+2+nameLen; // ! Not the real offset yet, the offset of the onXMPData value.
+
+ ioCount = info.dataSize - (1+2+nameLen); // Just the onXMPData value portion.
+ this->onXMP.reserve ( ioCount );
+ this->onXMP.assign ( ioCount, ' ' );
+ LFA_Seek ( fileRef, this->packetInfo.offset, SEEK_SET );
+ LFA_Read ( fileRef, (void*)this->onXMP.data(), ioCount, kLFA_RequireAll );
+
+ if ( ! this->onMetaData.empty() ) break; // Done if we've found both.
+
+ } else if ( this->onMetaData.empty() && CheckName ( namePtr, nameLen, "onMetaData", 10 ) ) {
+
+ this->omdTagPos = tagPos;
+ this->omdTagLen = 11 + info.dataSize + 4; // ! Includes the trailing back pointer.
+
+ ioCount = info.dataSize - (1+2+nameLen); // Just the onMetaData value portion.
+ this->onMetaData.reserve ( ioCount );
+ this->onMetaData.assign ( ioCount, ' ' );
+ LFA_Seek ( fileRef, (tagPos + 11 + 1+2+nameLen), SEEK_SET );
+ LFA_Read ( fileRef, (void*)this->onMetaData.data(), ioCount, kLFA_RequireAll );
+
+ if ( ! this->onXMP.empty() ) break; // Done if we've found both.
+
+ }
+
+ }
+
+} // FLV_MetaHandler::CacheFileData
+
+// =================================================================================================
+// FLV_MetaHandler::MakeLegacyDigest
+// =================================
+
+#define kHexDigits "0123456789ABCDEF"
+
+void FLV_MetaHandler::MakeLegacyDigest ( std::string * digestStr )
+{
+ MD5_CTX context;
+ unsigned char digestBin [16];
+
+ MD5Init ( &context );
+ MD5Update ( &context, (XMP_Uns8*)this->onMetaData.data(), (unsigned int)this->onMetaData.size() );
+ MD5Final ( digestBin, &context );
+
+ char buffer [40];
+ for ( int in = 0, out = 0; in < 16; in += 1, out += 2 ) {
+ XMP_Uns8 byte = digestBin[in];
+ buffer[out] = kHexDigits [ byte >> 4 ];
+ buffer[out+1] = kHexDigits [ byte & 0xF ];
+ }
+ buffer[32] = 0;
+ digestStr->erase();
+ digestStr->append ( buffer, 32 );
+
+} // FLV_MetaHandler::MakeLegacyDigest
+
+// =================================================================================================
+// FLV_MetaHandler::ExtractLiveXML
+// ===============================
+//
+// Extract the XMP packet from the cached onXMPData ECMA array's "liveXMP" item.
+
+void FLV_MetaHandler::ExtractLiveXML()
+{
+ if ( this->onXMP[0] != 0x08 ) return; // Make sure onXMPData is an ECMA array.
+ const XMP_Uns8 * ecmaArray = (const XMP_Uns8 *) this->onXMP.c_str();
+ const XMP_Uns8 * ecmaLimit = ecmaArray + this->onXMP.size();
+
+ if ( this->onXMP.size() >= 3 ) { // Omit the 0x000009 terminator, simplifies the loop.
+ if ( GetUns24BE ( ecmaLimit-3 ) == 9 ) ecmaLimit -= 3;
+ }
+
+ for ( const XMP_Uns8 * itemPtr = ecmaArray + 5; itemPtr < ecmaLimit; /* internal increment */ ) {
+
+ // Find the "liveXML" array item, make sure it is a short or long string.
+
+ XMP_Uns16 nameLen = GetUns16BE ( itemPtr );
+ const XMP_Uns8 * namePtr = itemPtr + 2;
+
+ itemPtr += (2 + nameLen); // Move to the value portion.
+ XMP_Uns32 valueLen = GetASValueLen ( itemPtr, ecmaLimit );
+ if ( valueLen == 0 ) return; // ! Unknown value type, can't look further.
+
+ if ( CheckName ( (char*)namePtr, nameLen, "liveXML", 7 ) ) {
+
+ XMP_Uns32 lenLen = 2; // Assume a short string.
+ if ( *itemPtr == 12 ) {
+ lenLen = 4;
+ this->longXMP = true;
+ } else if ( *itemPtr != 2 ) {
+ return; // Not a short or long string.
+ }
+
+ valueLen -= (1 + lenLen);
+ itemPtr += (1 + lenLen);
+
+ this->packetInfo.offset += (itemPtr - ecmaArray);
+ this->packetInfo.length += valueLen;
+
+ this->xmpPacket.reserve ( valueLen );
+ this->xmpPacket.assign ( (char*)itemPtr, valueLen );
+
+ return;
+
+ }
+
+ itemPtr += valueLen; // Move past the value portion.
+
+ }
+
+} // FLV_MetaHandler::ExtractLiveXML
+
+// =================================================================================================
+// FLV_MetaHandler::ProcessXMP
+// ===========================
+
+void FLV_MetaHandler::ProcessXMP()
+{
+ if ( this->processedXMP ) return;
+ this->processedXMP = true; // Make sure only called once.
+
+ if ( ! this->onXMP.empty() ) { // Look for the XMP packet.
+
+ this->ExtractLiveXML();
+ if ( ! this->xmpPacket.empty() ) {
+ FillPacketInfo ( this->xmpPacket, &this->packetInfo );
+ this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() );
+ this->containsXMP = true;
+ }
+
+ }
+
+ // Now process the legacy, if necessary.
+
+ if ( this->onMetaData.empty() ) return; // No legacy, we're done.
+
+ std::string oldDigest;
+ bool oldDigestFound = this->xmpObj.GetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "FLV", &oldDigest, 0 );
+
+ if ( oldDigestFound ) {
+ std::string newDigest;
+ this->MakeLegacyDigest ( &newDigest );
+ if ( oldDigest == newDigest ) return; // No legacy changes.
+ }
+
+ // *** No spec yet for what legacy to reconcile.
+
+} // FLV_MetaHandler::ProcessXMP
+
+// =================================================================================================
+// FLV_MetaHandler::UpdateFile
+// ===========================
+
+void FLV_MetaHandler::UpdateFile ( bool doSafeUpdate )
+{
+ if ( ! this->needsUpdate ) return;
+ XMP_Assert ( ! doSafeUpdate ); // This should only be called for "unsafe" updates.
+
+ XMP_AbortProc abortProc = this->parent->abortProc;
+ void * abortArg = this->parent->abortArg;
+ const bool checkAbort = (abortProc != 0);
+
+ LFA_FileRef fileRef = this->parent->fileRef;
+ XMP_Uns64 fileSize = LFA_Measure ( fileRef );
+
+ // Make sure the XMP has a legacy digest if appropriate.
+
+ if ( ! this->onMetaData.empty() ) {
+
+ std::string newDigest;
+ this->MakeLegacyDigest ( &newDigest );
+ this->xmpObj.SetStructField ( kXMP_NS_XMP, "NativeDigests",
+ kXMP_NS_XMP, "FLV", newDigest.c_str(), kXMP_DeleteExisting );
+
+ try {
+ XMP_StringLen xmpLen = (XMP_StringLen)this->xmpPacket.size();
+ this->xmpObj.SerializeToBuffer ( &this->xmpPacket, (kXMP_UseCompactFormat | kXMP_ExactPacketLength), xmpLen );
+ } catch ( ... ) {
+ this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat );
+ }
+
+ }
+
+ // Rewrite the packet in-place if it fits. Otherwise rewrite the whole file.
+
+ if ( this->xmpPacket.size() == (size_t)this->packetInfo.length ) {
+
+ LFA_Seek ( fileRef, this->packetInfo.offset, SEEK_SET );
+ LFA_Write ( fileRef, this->xmpPacket.data(), (XMP_Int32)this->xmpPacket.size() );
+
+ } else {
+
+ std::string origPath = this->parent->filePath;
+ LFA_FileRef origRef = this->parent->fileRef;
+
+ std::string updatePath;
+ LFA_FileRef updateRef = 0;
+
+ CreateTempFile ( origPath, &updatePath );
+ updateRef = LFA_Open ( updatePath.c_str(), 'w' );
+
+ this->parent->filePath = updatePath;
+ this->parent->fileRef = updateRef;
+
+ try {
+ this->WriteFile ( origRef, origPath );
+ } catch ( ... ) {
+ LFA_Close ( updateRef );
+ this->parent->filePath = origPath;
+ this->parent->fileRef = origRef;
+ throw;
+ }
+
+ LFA_Close ( origRef );
+ LFA_Delete ( origPath.c_str() );
+
+ LFA_Close ( updateRef );
+ LFA_Rename ( updatePath.c_str(), origPath.c_str() );
+ this->parent->filePath = origPath;
+ this->parent->fileRef = 0;
+
+ }
+
+ this->needsUpdate = false;
+
+} // FLV_MetaHandler::UpdateFile
+
+// =================================================================================================
+// WriteOnXMP
+// ==========
+//
+// Write the XMP packet wrapped up in an ECMA array script data tag:
+//
+// 0 UI8 tag type : 18
+// 1 UI24 content length : 1+2+9+1+4+2+7+1 + <2 or 4> + XMP packet size + 1 + 3
+// 4 UI24 time low : 0
+// 7 UI8 time high : 0
+// 8 UI24 stream ID : 0
+//
+// 11 UI8 0x02
+// 12 UI16 name length : 9
+// 14 str9 tag name : "onXMPData", no nul terminator
+// 23 UI8 value type : 8
+// 24 UI32 array count : 1
+// 28 UI16 name length : 7
+// 30 str7 item name : "liveXML", no nul terminator
+//
+// 37 UI8 value type : 2 for a short string, 12 for a long string
+// 38 UIn XMP packet size + 1, UI16 or UI32 as needed
+// -- str XMP packet, with nul terminator
+//
+// -- UI24 array terminator : 0x000009
+// -- UI32 back pointer : content length + 11
+
+static void WriteOnXMP ( LFA_FileRef fileRef, const std::string & xmpPacket )
+{
+ char buffer [64];
+ bool longXMP = false;
+ XMP_Uns32 tagLen = 1+2+9+1+4+2+7+1 + 2 + (XMP_Uns32)xmpPacket.size() + 1 + 3;
+
+ if ( xmpPacket.size() > 0xFFFE ) {
+ longXMP = true;
+ tagLen += 2;
+ }
+
+ if ( tagLen > 16*1024*1024 ) XMP_Throw ( "FLV tags can't be larger than 16MB", kXMPErr_TBD );
+
+ // Fill in the script data tag header.
+
+ buffer[0] = 18;
+ PutUns24BE ( tagLen, &buffer[1] );
+ PutUns24BE ( 0, &buffer[4] );
+ buffer[7] = 0;
+ PutUns24BE ( 0, &buffer[8] );
+
+ // Fill in the "onXMPData" name, ECMA array start, and "liveXML" name.
+
+ buffer[11] = 2;
+ PutUns16BE ( 9, &buffer[12] );
+ memcpy ( &buffer[14], "onXMPData", 9 ); // AUDIT: Safe, buffer has 64 chars.
+ buffer[23] = 8;
+ PutUns32BE ( 1, &buffer[24] );
+ PutUns16BE ( 7, &buffer[28] );
+ memcpy ( &buffer[30], "liveXML", 7 ); // AUDIT: Safe, buffer has 64 chars.
+
+ // Fill in the XMP packet string type and length, write what we have so far.
+
+ LFA_Seek ( fileRef, 0, SEEK_END );
+ if ( ! longXMP ) {
+ buffer[37] = 2;
+ PutUns16BE ( (XMP_Uns16)xmpPacket.size()+1, &buffer[38] );
+ LFA_Write ( fileRef, buffer, 40 );
+ } else {
+ buffer[37] = 12;
+ PutUns32BE ( (XMP_Uns32)xmpPacket.size()+1, &buffer[38] );
+ LFA_Write ( fileRef, buffer, 42 );
+ }
+
+ // Write the XMP packet, nul terminator, array terminator, and back pointer.
+
+ LFA_Write ( fileRef, xmpPacket.c_str(), (XMP_Int32)xmpPacket.size()+1 );
+ PutUns24BE ( 9, &buffer[0] );
+ PutUns32BE ( tagLen+11, &buffer[3] );
+ LFA_Write ( fileRef, buffer, 7 );
+
+} // WriteOnXMP
+
+// =================================================================================================
+// FLV_MetaHandler::WriteFile
+// ==========================
+//
+// Use a source (old) file and the current XMP to build a destination (new) file. All of the source
+// file is copied except for previous XMP. The current XMP is inserted after onMetaData, or at least
+// before the first time 0 audio or video tag.
+
+// ! We do not currently update anything in onMetaData.
+
+void FLV_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath )
+{
+ if ( ! this->needsUpdate ) return;
+
+ XMP_AbortProc abortProc = this->parent->abortProc;
+ void * abortArg = this->parent->abortArg;
+ const bool checkAbort = (abortProc != 0);
+
+ LFA_FileRef destRef = this->parent->fileRef;
+
+ XMP_Uns64 sourceLen = LFA_Measure ( sourceRef );
+ XMP_Uns64 sourcePos = 0;
+
+ LFA_Seek ( sourceRef, 0, SEEK_SET );
+ LFA_Seek ( destRef, 0, SEEK_SET );
+ LFA_Truncate ( destRef, 0 );
+
+ // First do whatever is needed to put the new XMP after any existing onMetaData tag, or as the
+ // first time 0 tag.
+
+ if ( this->omdTagPos == 0 ) {
+
+ // There is no onMetaData tag. Copy the file header, then write the new XMP as the first tag.
+ // Allow the degenerate case of a file with just a header, no initial back pointer or tags.
+
+ LFA_Copy ( sourceRef, destRef, this->flvHeaderLen, abortProc, abortArg );
+
+ XMP_Uns32 zero = 0; // Don't require the initial 0 back pointer to be in the source file.
+ LFA_Write ( destRef, &zero, 4 );
+
+ sourcePos = this->flvHeaderLen + 4;
+
+ WriteOnXMP ( destRef, this->xmpPacket );
+
+ } else {
+
+ // There is an onMetaData tag. Copy the front of the file through the onMetaData tag,
+ // skipping any XMP that happens to be in the way. The XMP should not be before onMetaData,
+ // but let's be robust. Write the new XMP immediately after onMetaData, at the same time.
+
+ XMP_Uns64 omdEnd = this->omdTagPos + this->omdTagLen;
+
+ if ( (this->xmpTagPos != 0) && (this->xmpTagPos < this->omdTagPos) ) {
+ LFA_Copy ( sourceRef, destRef, this->xmpTagPos, abortProc, abortArg );
+ sourcePos = this->xmpTagPos + this->xmpTagLen;
+ LFA_Seek ( sourceRef, sourcePos, SEEK_SET );
+ }
+
+ LFA_Copy ( sourceRef, destRef, (omdEnd - sourcePos), abortProc, abortArg );
+ sourcePos = omdEnd;
+
+ WriteOnXMP ( destRef, this->xmpPacket );
+
+ }
+
+ // Copy the rest of the file, skipping any XMP that is in the way.
+
+ if ( (this->xmpTagPos != 0) && (this->xmpTagPos >= sourcePos) ) {
+ LFA_Copy ( sourceRef, destRef, (this->xmpTagPos - sourcePos), abortProc, abortArg );
+ sourcePos = this->xmpTagPos + this->xmpTagLen;
+ LFA_Seek ( sourceRef, sourcePos, SEEK_SET );
+ }
+
+ LFA_Copy ( sourceRef, destRef, (sourceLen - sourcePos), abortProc, abortArg );
+
+ this->needsUpdate = false;
+
+} // FLV_MetaHandler::WriteFile
+
+// =================================================================================================
diff --git a/source/XMPFiles/FileHandlers/FLV_Handler.hpp b/source/XMPFiles/FileHandlers/FLV_Handler.hpp
new file mode 100644
index 0000000..1fea76d
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/FLV_Handler.hpp
@@ -0,0 +1,73 @@
+#ifndef __FLV_Handler_hpp__
+#define __FLV_Handler_hpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2007 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XMPFiles_Impl.hpp"
+
+// ================================================================================================
+/// \file FLV_Handler.hpp
+/// \brief File format handler for FLV.
+///
+/// This header ...
+///
+// ================================================================================================
+
+extern XMPFileHandler * FLV_MetaHandlerCTor ( XMPFiles * parent );
+
+extern bool FLV_CheckFormat ( XMP_FileFormat format,
+ XMP_StringPtr filePath,
+ LFA_FileRef fileRef,
+ XMPFiles * parent );
+
+static const XMP_OptionBits kFLV_HandlerFlags = ( kXMPFiles_CanInjectXMP |
+ kXMPFiles_CanExpand |
+ kXMPFiles_CanRewrite |
+ kXMPFiles_PrefersInPlace |
+ kXMPFiles_CanReconcile |
+ kXMPFiles_AllowsOnlyXMP |
+ kXMPFiles_ReturnsRawPacket |
+ kXMPFiles_AllowsSafeUpdate
+ );
+
+class FLV_MetaHandler : public XMPFileHandler
+{
+public:
+
+ void CacheFileData();
+ void ProcessXMP();
+
+ void UpdateFile ( bool doSafeUpdate );
+ void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath );
+
+ FLV_MetaHandler ( XMPFiles * _parent );
+ virtual ~FLV_MetaHandler();
+
+private:
+
+ FLV_MetaHandler() : flvHeaderLen(0), longXMP(false),
+ xmpTagPos(0), omdTagPos(0), xmpTagLen(0), omdTagLen(0) {}; // Hidden on purpose.
+
+ void ExtractLiveXML();
+ void MakeLegacyDigest ( std::string * digestStr );
+
+ XMP_Uns32 flvHeaderLen;
+ bool longXMP; // True if the stored XMP is a long string (4 byte length).
+
+ XMP_Uns64 xmpTagPos, omdTagPos; // The file offset and length of onXMP and onMetaData tags.
+ XMP_Uns32 xmpTagLen, omdTagLen; // Zero if the tag is not present.
+
+ std::string onXMP, onMetaData; // ! Actually contains structured binary data.
+
+}; // FLV_MetaHandler
+
+// =================================================================================================
+
+#endif // __FLV_Handler_hpp__
diff --git a/source/XMPFiles/FileHandlers/InDesign_Handler.cpp b/source/XMPFiles/FileHandlers/InDesign_Handler.cpp
index 55332c0..c26db20 100644
--- a/source/XMPFiles/FileHandlers/InDesign_Handler.cpp
+++ b/source/XMPFiles/FileHandlers/InDesign_Handler.cpp
@@ -1,6 +1,6 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -208,14 +208,15 @@ void InDesign_MetaHandler::CacheFileData()
XMP_Assert ( ! this->streamBigEndian );
if ( cobjEndian == kINDD_BigEndian ) this->streamBigEndian = true;
-
+
// ---------------------------------------------------------------------------------------------
// Look for the XMP contiguous object stream. Most of the time there will be just one stream and
// it will be the XMP. So we might as well fill the whole buffer and not worry about reading too
// much and seeking back to the start of the following stream.
XMP_Int64 cobjPos = (XMP_Int64)dbPages * kINDD_PageSize; // ! Use a 64 bit multiply!
- XMP_Uns32 streamLength = (XMP_Uns32)(-(long)(2*sizeof(InDesignContigObjMarker))); // ! For the first pass in the loop.
+ cobjPos -= (2 * sizeof(InDesignContigObjMarker)); // ! For the first pass in the loop.
+ XMP_Uns32 streamLength = 0; // ! For the first pass in the loop.
while ( true ) {
@@ -225,7 +226,7 @@ void InDesign_MetaHandler::CacheFileData()
// Fetch the start of the next stream and check the contiguous object header.
// ! The writeable bit of fObjectClassID is ignored, we use the packet trailer flag.
-
+
cobjPos += streamLength + (2 * sizeof(InDesignContigObjMarker));
ioBuf.filePos = cobjPos;
ioBuf.ptr = ioBuf.limit; // Make sure RefillBuffer does a simple read.
@@ -331,18 +332,18 @@ void InDesign_MetaHandler::WriteXMPPrefix()
// Write the contiguous object header and the 4 byte length of the XMP packet.
LFA_FileRef fileRef = this->parent->fileRef;
- XMP_PacketInfo & packetInfo = this->packetInfo;
+ XMP_Uns32 packetSize = (XMP_Uns32)this->xmpPacket.size();
InDesignContigObjMarker header;
memcpy ( header.fGUID, kINDDContigObjHeaderGUID, sizeof(header.fGUID) ); // AUDIT: Use of dest sizeof for length is safe.
header.fObjectUID = this->xmpObjID;
header.fObjectClassID = this->xmpClassID;
- header.fStreamLength = MakeUns32LE ( 4 + packetInfo.length );
+ header.fStreamLength = MakeUns32LE ( 4 + packetSize );
header.fChecksum = (XMP_Uns32)(-1);
LFA_Write ( fileRef, &header, sizeof(header) );
- XMP_Uns32 pktLength = MakeUns32LE ( packetInfo.length );
- if ( this->streamBigEndian ) pktLength = MakeUns32BE ( packetInfo.length );
+ XMP_Uns32 pktLength = MakeUns32LE ( packetSize );
+ if ( this->streamBigEndian ) pktLength = MakeUns32BE ( packetSize );
LFA_Write ( fileRef, &pktLength, sizeof(pktLength) );
} // InDesign_MetaHandler::WriteXMPPrefix
@@ -356,14 +357,14 @@ void InDesign_MetaHandler::WriteXMPSuffix()
// Write the contiguous object trailer.
LFA_FileRef fileRef = this->parent->fileRef;
- XMP_PacketInfo & packetInfo = this->packetInfo;
+ XMP_Uns32 packetSize = (XMP_Uns32)this->xmpPacket.size();
InDesignContigObjMarker trailer;
memcpy ( trailer.fGUID, kINDDContigObjTrailerGUID, sizeof(trailer.fGUID) ); // AUDIT: Use of dest sizeof for length is safe.
trailer.fObjectUID = this->xmpObjID;
trailer.fObjectClassID = this->xmpClassID;
- trailer.fStreamLength = MakeUns32LE ( 4 + packetInfo.length );
+ trailer.fStreamLength = MakeUns32LE ( 4 + packetSize );
trailer.fChecksum = (XMP_Uns32)(-1);
LFA_Write ( fileRef, &trailer, sizeof(trailer) );
@@ -409,7 +410,6 @@ void InDesign_MetaHandler::RestoreFileEnding()
// Pad the file with zeros to a page boundary.
LFA_FileRef fileRef = this->parent->fileRef;
- XMP_PacketInfo & packetInfo = this->packetInfo;
XMP_Int64 dataLength = LFA_Measure ( fileRef );
XMP_Int32 padLength = (kINDD_PageSize - ((XMP_Int32)dataLength & kINDD_PageMask)) & kINDD_PageMask;
diff --git a/source/XMPFiles/FileHandlers/JPEG_Handler.cpp b/source/XMPFiles/FileHandlers/JPEG_Handler.cpp
index e57c83f..6917355 100644
--- a/source/XMPFiles/FileHandlers/JPEG_Handler.cpp
+++ b/source/XMPFiles/FileHandlers/JPEG_Handler.cpp
@@ -1,6 +1,6 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -352,7 +352,7 @@ void JPEG_MetaHandler::CacheFileData()
if ( ! ok ) return; // Must be a truncated file.
this->packetInfo.offset = ioBuf.filePos + (ioBuf.ptr - &ioBuf.data[0]);
- this->packetInfo.length = segLen;
+ this->packetInfo.length = (XMP_Int32)segLen;
this->packetInfo.padSize = 0; // Assume for now, set these properly in ProcessXMP.
this->packetInfo.charForm = kXMP_CharUnknown;
this->packetInfo.writeable = true;
@@ -544,7 +544,7 @@ void JPEG_MetaHandler::ProcessTNail()
} else {
this->exifMgr = new TIFF_FileWriter();
}
- this->exifMgr->ParseMemoryStream ( this->exifContents.c_str(), this->exifContents.size() );
+ this->exifMgr->ParseMemoryStream ( this->exifContents.c_str(), (XMP_Uns32)this->exifContents.size() );
}
this->containsTNail = this->exifMgr->GetTNailInfo ( &this->tnailInfo );
@@ -577,7 +577,12 @@ void JPEG_MetaHandler::ProcessXMP()
} else {
if ( this->exifMgr == 0 ) this->exifMgr = new TIFF_FileWriter();
this->psirMgr = new PSIR_FileWriter();
- this->iptcMgr = new IPTC_Writer(); // ! Parse it later.
+ #if ! XMP_UNIXBuild
+ this->iptcMgr = new IPTC_Writer(); // ! Parse it later.
+ #else
+ // ! Hack until the legacy-as-local issues are resolved for generic UNIX.
+ this->iptcMgr = new IPTC_Reader(); // ! Import IPTC but don't export it.
+ #endif
}
// Set up everything for the legacy import, but don't do it yet. This lets us do a forced legacy
@@ -594,11 +599,11 @@ void JPEG_MetaHandler::ProcessXMP()
IPTC_Manager & iptc = *this->iptcMgr;
if ( haveExif ) {
- exif.ParseMemoryStream ( this->exifContents.c_str(), this->exifContents.size() );
+ exif.ParseMemoryStream ( this->exifContents.c_str(), (XMP_Uns32)this->exifContents.size() );
}
if ( ! this->psirContents.empty() ) {
- psir.ParseMemoryResources ( this->psirContents.c_str(), this->psirContents.size() );
+ psir.ParseMemoryResources ( this->psirContents.c_str(), (XMP_Uns32)this->psirContents.size() );
}
// Determine the last-legacy priority and do the reconciliation. For JPEG files, the relevant
@@ -643,7 +648,7 @@ void JPEG_MetaHandler::ProcessXMP()
XMP_Assert ( this->containsXMP );
// Common code takes care of packetInfo.charForm, .padSize, and .writeable.
XMP_StringPtr packetStr = this->xmpPacket.c_str();
- XMP_StringLen packetLen = this->xmpPacket.size();
+ XMP_StringLen packetLen = (XMP_StringLen)this->xmpPacket.size();
try {
this->xmpObj.ParseFromBuffer ( packetStr, packetLen );
} catch ( ... ) {
@@ -677,7 +682,7 @@ void JPEG_MetaHandler::ProcessXMP()
if ( guidPos != this->extendedXMP.end() ) {
try {
XMP_StringPtr extStr = guidPos->second.c_str();
- XMP_StringLen extLen = guidPos->second.size();
+ XMP_StringLen extLen = (XMP_StringLen)guidPos->second.size();
SXMPMeta extXMP ( extStr, extLen );
SXMPUtils::MergeFromJPEG ( &this->xmpObj, extXMP );
} catch ( ... ) {
@@ -716,18 +721,24 @@ void JPEG_MetaHandler::UpdateFile ( bool doSafeUpdate )
if ( oldPacketOffset == kXMPFiles_UnknownOffset ) oldPacketOffset = 0; // ! Simplify checks.
if ( oldPacketLength == kXMPFiles_UnknownLength ) oldPacketLength = 0;
- bool doInPlace = (oldPacketOffset != 0) && (oldPacketLength != 0); // ! Has old packet and new packet fits.
+ bool doInPlace = (this->xmpPacket.size() <= (size_t)this->packetInfo.length);
- if ( doInPlace && (! this->extendedXMP.empty()) ) doInPlace = false;
+ if ( ! this->extendedXMP.empty() ) doInPlace = false;
- if ( doInPlace && (this->exifMgr != 0) && (this->exifMgr->IsLegacyChanged()) ) doInPlace = false;
- if ( doInPlace && (this->psirMgr != 0) && (this->psirMgr->IsLegacyChanged()) ) doInPlace = false;
+ if ( (this->exifMgr != 0) && (this->exifMgr->IsLegacyChanged()) ) doInPlace = false;
+ if ( (this->psirMgr != 0) && (this->psirMgr->IsLegacyChanged()) ) doInPlace = false;
if ( doInPlace ) {
#if GatherPerformanceData
sAPIPerf->back().extraInfo += ", JPEG in-place update";
#endif
+
+ if ( this->xmpPacket.size() < (size_t)this->packetInfo.length ) {
+ // They ought to match, cheap to be sure.
+ size_t extraSpace = (size_t)this->packetInfo.length - this->xmpPacket.size();
+ this->xmpPacket.append ( extraSpace, ' ' );
+ }
LFA_FileRef liveFile = this->parent->fileRef;
std::string & newPacket = this->xmpPacket;
@@ -735,7 +746,7 @@ void JPEG_MetaHandler::UpdateFile ( bool doSafeUpdate )
XMP_Assert ( newPacket.size() == (size_t)oldPacketLength ); // ! Done by common PutXMP logic.
LFA_Seek ( liveFile, oldPacketOffset, SEEK_SET );
- LFA_Write ( liveFile, newPacket.c_str(), newPacket.size() );
+ LFA_Write ( liveFile, newPacket.c_str(), (XMP_Int32)newPacket.size() );
} else {
@@ -851,7 +862,7 @@ void JPEG_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & so
segLen += 2; // ! Don't do above in case machine does 16 bit "+".
if ( ! CheckFileSpace ( sourceRef, &ioBuf, segLen ) ) XMP_Throw ( "Unexpected end to JPEG", kXMPErr_BadJPEG );
- LFA_Write ( destRef, ioBuf.ptr, segLen );
+ LFA_Write ( destRef, ioBuf.ptr, (XMP_Int32)segLen );
ioBuf.ptr += segLen;
}
@@ -880,10 +891,10 @@ void JPEG_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & so
SXMPUtils::PackageForJPEG ( this->xmpObj, &mainXMP, &extXMP, &extDigest );
XMP_Assert ( (extXMP.size() == 0) || (extDigest.size() == 32) );
- first4 = MakeUns32BE ( 0xFFE10000 + 2 + kMainXMPSignatureLength + mainXMP.size() );
+ first4 = MakeUns32BE ( 0xFFE10000 + 2 + kMainXMPSignatureLength + (XMP_Uns32)mainXMP.size() );
LFA_Write ( destRef, &first4, 4 );
LFA_Write ( destRef, kMainXMPSignatureString, kMainXMPSignatureLength );
- LFA_Write ( destRef, mainXMP.c_str(), mainXMP.size() );
+ LFA_Write ( destRef, mainXMP.c_str(), (XMP_Int32)mainXMP.size() );
size_t extPos = 0;
size_t extLen = extXMP.size();
@@ -893,18 +904,18 @@ void JPEG_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & so
size_t partLen = extLen;
if ( partLen > 65000 ) partLen = 65000;
- first4 = MakeUns32BE ( 0xFFE10000 + 2 + kExtXMPPrefixLength + partLen );
+ first4 = MakeUns32BE ( 0xFFE10000 + 2 + kExtXMPPrefixLength + (XMP_Uns32)partLen );
LFA_Write ( destRef, &first4, 4 );
LFA_Write ( destRef, kExtXMPSignatureString, kExtXMPSignatureLength );
- LFA_Write ( destRef, extDigest.c_str(), extDigest.size() );
+ LFA_Write ( destRef, extDigest.c_str(), (XMP_Int32)extDigest.size() );
- first4 = MakeUns32BE ( extXMP.size() );
+ first4 = MakeUns32BE ( (XMP_Int32)extXMP.size() );
LFA_Write ( destRef, &first4, 4 );
- first4 = MakeUns32BE ( extPos );
+ first4 = MakeUns32BE ( (XMP_Int32)extPos );
LFA_Write ( destRef, &first4, 4 );
- LFA_Write ( destRef, &extXMP[extPos], partLen );
+ LFA_Write ( destRef, &extXMP[extPos], (XMP_Int32)partLen );
extPos += partLen;
extLen -= partLen;
@@ -973,7 +984,7 @@ void JPEG_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & so
}
}
- if ( copySegment ) LFA_Write ( destRef, ioBuf.ptr, 2+segLen );
+ if ( copySegment ) LFA_Write ( destRef, ioBuf.ptr, (XMP_Int32)(2+segLen) );
ioBuf.ptr += 2+segLen;
@@ -982,13 +993,13 @@ void JPEG_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & so
// Copy the remainder of the source file.
size_t bufTail = ioBuf.len - (ioBuf.ptr - &ioBuf.data[0]);
- LFA_Write ( destRef, ioBuf.ptr, bufTail );
+ LFA_Write ( destRef, ioBuf.ptr, (XMP_Int32)bufTail );
ioBuf.ptr += bufTail;
while ( true ) {
RefillBuffer ( sourceRef, &ioBuf );
if ( ioBuf.len == 0 ) break;
- LFA_Write ( destRef, ioBuf.ptr, ioBuf.len );
+ LFA_Write ( destRef, ioBuf.ptr, (XMP_Int32)ioBuf.len );
ioBuf.ptr += ioBuf.len;
}
diff --git a/source/XMPFiles/FileHandlers/MOV_Handler.cpp b/source/XMPFiles/FileHandlers/MOV_Handler.cpp
index d7b6dcd..e2ea26c 100644
--- a/source/XMPFiles/FileHandlers/MOV_Handler.cpp
+++ b/source/XMPFiles/FileHandlers/MOV_Handler.cpp
@@ -1,13 +1,16 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
// of the Adobe license agreement accompanying it.
// =================================================================================================
-#if WIN_ENV
+#include "XMP_Environment.h" // ! This must be the first include.
+#if ! ( XMP_64 || XMP_UNIXBuild) // Closes at very bottom.
+
+#if XMP_WinBuild
#pragma warning ( disable : 4996 ) // '...' was declared deprecated
#endif
@@ -30,6 +33,14 @@ using namespace std;
static OSType kXMPUserDataType = 'XMP_';
static long kXMPUserDataTypeIndex = 1;
+static bool CreatorAtom_SetProperties ( SXMPMeta& xmpObj,
+ const MOV_MetaHandler::CreatorAtomStrings& creatorAtomStrings );
+
+static bool CreatorAtom_Update ( SXMPMeta& xmpObj, UserData& movieUserData );
+
+static bool CreatorAtom_ReadStrings ( MOV_MetaHandler::CreatorAtomStrings& creatorAtomStrings,
+ UserData& movieUserData );
+
// =================================================================================================
/// \file MOV_Handler.cpp
/// \brief File format handler for MOV.
@@ -48,7 +59,6 @@ XMPFileHandler * MOV_MetaHandlerCTor ( XMPFiles * parent )
} // MOV_MetaHandlerCTor
-
// =================================================================================================
// MOV_CheckFormat
// ===============
@@ -108,7 +118,7 @@ EXIT:
// ================================
MOV_MetaHandler::MOV_MetaHandler ( XMPFiles * _parent )
- : mQTInit(false), mMovieDataRef(0), mMovieDataHandler(0), mMovie(NULL), mMovieResourceID(0), mFilePermission(0)
+ : mQTInit(false), mMovieDataRef(0), mMovieDataHandler(0), mMovie(0), mMovieResourceID(0), mFilePermission(0)
{
this->parent = _parent;
@@ -131,6 +141,26 @@ MOV_MetaHandler::~MOV_MetaHandler()
} // MOV_MetaHandler::~MOV_MetaHandler
// =================================================================================================
+// MOV_MetaHandler::ProcessXMP
+// ===========================
+
+void MOV_MetaHandler::ProcessXMP()
+{
+ if ( (!this->containsXMP) || this->processedXMP ) return;
+
+ if ( this->handlerFlags & kXMPFiles_CanReconcile ) {
+ XMP_Throw ( "Reconciling file handlers must implement ProcessXMP", kXMPErr_InternalFailure );
+ }
+
+ SXMPUtils::RemoveProperties ( &this->xmpObj, 0, 0, kXMPUtil_DoAllProperties );
+ this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() );
+ this->processedXMP = true;
+
+ CreatorAtom_SetProperties ( this->xmpObj, mCreatorAtomStrings );
+
+}
+
+// =================================================================================================
// MOV_MetaHandler::UpdateFile
// ===========================
@@ -140,7 +170,7 @@ void MOV_MetaHandler::UpdateFile ( bool doSafeUpdate )
if ( doSafeUpdate ) XMP_Throw ( "MOV_MetaHandler::UpdateFile: Safe update not supported", kXMPErr_Unavailable );
XMP_StringPtr packetStr = this->xmpPacket.c_str();
- XMP_StringLen packetLen = this->xmpPacket.size();
+ XMP_StringLen packetLen = (XMP_StringLen)this->xmpPacket.size();
if ( packetLen == 0 ) return; // Bail if no XMP packet
@@ -152,7 +182,7 @@ void MOV_MetaHandler::UpdateFile ( bool doSafeUpdate )
OSErr err;
// Remove previous versions
- err = GetUserData ( movieUserData, NULL, kXMPUserDataType, kXMPUserDataTypeIndex );
+ err = GetUserData ( movieUserData, 0, kXMPUserDataType, kXMPUserDataTypeIndex );
if ( err == noErr ) {
RemoveUserData(movieUserData, kXMPUserDataType, kXMPUserDataTypeIndex);
}
@@ -167,6 +197,8 @@ void MOV_MetaHandler::UpdateFile ( bool doSafeUpdate )
DisposeHandle ( XMPdata );
}
+ CreatorAtom_Update ( this->xmpObj, movieUserData );
+
}
}
@@ -263,12 +295,230 @@ void MOV_MetaHandler::CloseMovie()
} // MOV_MetaHandler::CloseMovie
// =================================================================================================
+// GetAtomInfo
+// ===========
+
+struct AtomInfo {
+ XMP_Int64 atomSize;
+ XMP_Uns32 atomType;
+ bool hasLargeSize;
+};
+
+enum { // ! Do not rearrange, code depends on this order.
+ kBadQT_NoError = 0, // No errors.
+ kBadQT_SmallInner = 1, // An extra 1..7 bytes at the end of an inner span.
+ kBadQT_LargeInner = 2, // More serious inner garbage, found as invalid atom length.
+ kBadQT_SmallOuter = 3, // An extra 1..7 bytes at the end of the file.
+ kBadQT_LargeOuter = 4 // More serious EOF garbage, found as invalid atom length.
+};
+typedef XMP_Uns8 QTErrorMode;
+
+static QTErrorMode GetAtomInfo ( const LFA_FileRef qtFile, XMP_Int64 spanSize, int nesting, AtomInfo * info )
+{
+ QTErrorMode status = kBadQT_NoError;
+ XMP_Uns8 buffer [8];
+
+ info->hasLargeSize = false;
+
+ LFA_Read ( qtFile, buffer, 8, kLFA_RequireAll ); // Will throw if 8 bytes aren't available.
+ info->atomSize = GetUns32BE ( &buffer[0] ); // ! Yes, the initial size is big endian UInt32.
+ info->atomType = GetUns32BE ( &buffer[4] );
+
+ if ( info->atomSize == 0 ) { // Does the atom extend to EOF?
+
+ if ( nesting != 0 ) return kBadQT_LargeInner;
+ info->atomSize = spanSize; // This outer atom goes to EOF.
+
+ } else if ( info->atomSize == 1 ) { // Does the atom have a 64-bit size?
+
+ if ( spanSize < 16 ) { // Is there room in the span for the 16 byte header?
+ status = kBadQT_LargeInner;
+ if ( nesting == 0 ) status += 2; // Convert to "outer".
+ return status;
+ }
+
+ LFA_Read ( qtFile, buffer, 8, kLFA_RequireAll );
+ info->atomSize = (XMP_Int64) GetUns64BE ( &buffer[0] );
+ info->hasLargeSize = true;
+
+ }
+
+ XMP_Assert ( status == kBadQT_NoError );
+ return status;
+
+} // GetAtomInfo
+
+// =================================================================================================
+// CheckAtomList
+// =============
+//
+// Check that a sequence of atoms fills a given span. The I/O position must be at the start of the
+// span, it is left just past the span on success. Recursive checks are done for top level 'moov'
+// atoms, and second level 'udta' atoms ('udta' inside 'moov').
+//
+// Checking continues for "small inner" errors. They will be reported if no other kinds of errors
+// are found, otherwise the other error is reported. Checking is immediately aborted for any "large"
+// error. The rationale is that QuickTime can apparently handle small inner errors. They might be
+// arise from updates that shorten an atom by less than 8 bytes. Larger shrinkage should introduce a
+// 'free' atom.
+
+static QTErrorMode CheckAtomList ( const LFA_FileRef qtFile, XMP_Int64 spanSize, int nesting )
+{
+ QTErrorMode status = kBadQT_NoError;
+ AtomInfo info;
+
+ const static XMP_Uns32 moovAtomType = 0x6D6F6F76; // ! Don't use MakeUns32BE, already big endian.
+ const static XMP_Uns32 udtaAtomType = 0x75647461;
+
+ for ( ; spanSize >= 8; spanSize -= info.atomSize ) {
+
+ QTErrorMode atomStatus = GetAtomInfo ( qtFile, spanSize, nesting, &info );
+ if ( atomStatus != kBadQT_NoError ) return atomStatus;
+
+ XMP_Int64 headerSize = 8;
+ if ( info.hasLargeSize ) headerSize = 16;
+
+ if ( (info.atomSize < headerSize) || (info.atomSize > spanSize) ) {
+ status = kBadQT_LargeInner;
+ if ( nesting == 0 ) status += 2; // Convert to "outer".
+ return status;
+ }
+
+ bool doChildren = false;
+ if ( (nesting == 0) && (info.atomType == moovAtomType) ) doChildren = true;
+ if ( (nesting == 1) && (info.atomType == udtaAtomType) ) doChildren = true;
+
+ XMP_Int64 dataSize = info.atomSize - headerSize;
+
+ if ( ! doChildren ) {
+ LFA_Seek ( qtFile, dataSize, SEEK_CUR );
+ } else {
+ QTErrorMode innerStatus = CheckAtomList ( qtFile, dataSize, nesting+1 );
+ if ( innerStatus > kBadQT_SmallInner ) return innerStatus; // Quit for serious errors.
+ if ( status == kBadQT_NoError ) status = innerStatus; // Remember small inner errors.
+ }
+
+ }
+
+ XMP_Assert ( status <= kBadQT_SmallInner ); // Else already returned.
+ // ! Make sure inner kBadQT_SmallInner is propagated if this span is OK.
+
+ if ( spanSize != 0 ) {
+ LFA_Seek ( qtFile, spanSize, SEEK_CUR ); // ! Skip the trailing garbage of this span.
+ status = kBadQT_SmallInner;
+ if ( spanSize >= 8 ) status = kBadQT_LargeInner;
+ if ( nesting == 0 ) status += 2; // Convert to "outer".
+ }
+
+ return status;
+
+} // CheckAtomList
+
+// =================================================================================================
+// AttemptFileRepair
+// =================
+
+static void AttemptFileRepair ( LFA_FileRef qtFile, XMP_Int64 fileSpace, QTErrorMode status )
+{
+
+ switch ( status ) {
+ case kBadQT_NoError : return; // Sanity check.
+ case kBadQT_SmallInner : return; // Ignore these, QT seems to be able to handle them.
+ case kBadQT_LargeInner : XMP_Throw ( "Can't repair QuickTime file", kXMPErr_BadFileFormat );
+ case kBadQT_SmallOuter : break; // Truncate file below.
+ case kBadQT_LargeOuter : break; // Truncate file below.
+ default : XMP_Throw ( "Invalid QuickTime error mode", kXMPErr_InternalFailure );
+ }
+
+ AtomInfo info;
+ XMP_Int64 headerSize;
+
+ // Process the top level atoms until an error is found.
+
+ LFA_Seek ( qtFile, 0, SEEK_SET );
+
+ for ( ; fileSpace >= 8; fileSpace -= info.atomSize ) {
+
+ QTErrorMode atomStatus = GetAtomInfo ( qtFile, fileSpace, 0, &info );
+
+ headerSize = 8; // ! Set this before checking atomStatus, used after the loop.
+ if ( info.hasLargeSize ) headerSize = 16;
+
+ if ( atomStatus != kBadQT_NoError ) break;
+ if ( (info.atomSize < headerSize) || (info.atomSize > fileSpace) ) break;
+
+ XMP_Int64 dataSize = info.atomSize - headerSize;
+ LFA_Seek ( qtFile, dataSize, SEEK_CUR );
+
+ }
+
+ // Truncate the file. If fileSpace >= 8 then the loop exited early due to a bad atom, seek back
+ // to the atom's start. Otherwise, the loop exited because no mmore atoms are possible, no seek.
+
+ if ( fileSpace >= 8 ) LFA_Seek ( qtFile, -headerSize, SEEK_CUR );
+ XMP_Int64 currPos = LFA_Tell ( qtFile );
+ LFA_Truncate ( qtFile, currPos );
+
+} // AttemptFileRepair
+
+// =================================================================================================
+// CheckFileStructure
+// ==================
+
+static void CheckFileStructure ( XMPFileHandler * thiz, bool doRepair )
+{
+ XMPFiles * parent = thiz->parent;
+
+ // Open the disk file so we can look inside and maybe repair.
+
+ AutoFile localFile; // ! Don't use parent->fileRef keep this usage private.
+ XMP_Assert ( parent->fileRef == 0 ); // The file should not be open yet.
+
+ char openMode = 'r';
+ if ( doRepair ) openMode = 'w';
+ localFile.fileRef = LFA_Open ( parent->filePath.c_str(), openMode );
+ if ( localFile.fileRef == 0 ) XMP_Throw ( "Can't open QuickTime file for update checks", kXMPErr_ExternalFailure );
+ XMP_Int64 fileSize = LFA_Measure ( localFile.fileRef );
+
+ // Check the basic file structure and try to repair if asked.
+
+ QTErrorMode status = CheckAtomList ( localFile.fileRef, fileSize, 0 );
+
+ if ( status != kBadQT_NoError ) {
+ if ( doRepair ) {
+ AttemptFileRepair ( localFile.fileRef, fileSize, status ); // Will throw if the attempt fails.
+ } else if ( status != kBadQT_SmallInner ) {
+ XMP_Throw ( "Ill-formed QuickTime file", kXMPErr_BadFileFormat );
+ } else {
+ return; // ! Ignore these, QT seems to be able to handle them.
+ // *** Might want to throw for check-only, ignore when repairing.
+ }
+ }
+
+} // CheckFileStructure;
+
+
+// =================================================================================================
// MOV_MetaHandler::CacheFileData
// ==============================
void MOV_MetaHandler::CacheFileData()
{
+ // Pre-check files opened for update. We've found bugs in Apple's QT code that make slightly
+ // ill-formed files unreadable.
+
+ XMPFiles * parent = this->parent;
+
+ const bool isUpdate = XMP_OptionIsSet ( parent->openFlags, kXMPFiles_OpenForUpdate );
+ const bool doRepair = XMP_OptionIsSet ( parent->openFlags, kXMPFiles_OpenRepairFile );
+
+ if ( isUpdate ) {
+ CheckFileStructure ( this, doRepair ); // Will throw for failure.
+ }
+
+ // Continue with the usual caching of the file's metadata.
+
this->containsXMP = false;
if ( this->OpenMovie ( kDataHCanRead ) ) {
@@ -297,6 +547,8 @@ void MOV_MetaHandler::CacheFileData()
this->packetInfo.length = (XMP_Int32)dataSize;
this->containsXMP = true;
+ CreatorAtom_ReadStrings ( mCreatorAtomStrings, movieUserData );
+
}
DisposeHandle ( XMPdataHandle );
@@ -310,3 +562,435 @@ void MOV_MetaHandler::CacheFileData()
} // MOV_MetaHandler::CacheFileData
// =================================================================================================
+// =================================================================================================
+
+// *** Could be pulled out, maybe refactored and partly shared with AVI and WAV.
+
+#pragma pack(push,1)
+
+// [TODO] Can we switch to using just a full path here?
+struct FSSpecLegacy
+{
+ short vRefNum;
+ long parID;
+ char name[260]; // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/naming_a_file.asp -- 260 is "old school", 32000 is "new school".
+};
+
+struct CR8R_CreatorAtom
+{
+ unsigned long magicLu;
+
+ long atom_sizeL; // Size of this structure.
+ short atom_vers_majorS; // Major atom version.
+ short atom_vers_minorS; // Minor atom version.
+
+ // mac
+ unsigned long creator_codeLu; // Application code on MacOS.
+ unsigned long creator_eventLu; // Invocation appleEvent.
+
+ // windows
+ char creator_extAC[16]; // Extension allowing registry search to app.
+ char creator_flagAC[16]; // Flag passed to app at invocation time.
+
+ char creator_nameAC[32]; // Name of the creator application.
+};
+
+typedef CR8R_CreatorAtom** CR8R_CreatorAtomHandle;
+
+typedef enum
+{
+ Embed_ExportTypeMovie = 0,
+ Embed_ExportTypeStill,
+ Embed_ExportTypeAudio,
+ Embed_ExportTypeCustom
+}
+Embed_ExportType;
+
+
+struct Embed_ProjectLinkAtom
+{
+ // header data
+ unsigned long magicLu;
+ long atom_sizeL;
+ short atom_vers_apiS;
+ short atom_vers_codeS;
+
+ // the link data
+ unsigned long exportType; // See enum. The type of export that generated the file
+
+ // [TODO] Can we switch to using just a full path here?
+ FSSpecLegacy fullPath; // Full path of the project file
+};
+
+#pragma pack(pop)
+
+// -------------------------------------------------------------------------------------------------
+
+#define kCreatorTool "CreatorTool"
+#define AdobeCreatorAtomVersion_Major 1
+#define AdobeCreatorAtomVersion_Minor 0
+#define AdobeCreatorAtom_Magic 0xBEEFCAFE
+
+#define myCreatorAtom MakeFourCC ( 'C','r','8','r' )
+
+static void CreatorAtom_Initialize ( CR8R_CreatorAtom& creatorAtom )
+{
+ memset ( &creatorAtom, 0, sizeof(CR8R_CreatorAtom) );
+ creatorAtom.magicLu = AdobeCreatorAtom_Magic;
+ creatorAtom.atom_vers_majorS = AdobeCreatorAtomVersion_Major;
+ creatorAtom.atom_vers_minorS = AdobeCreatorAtomVersion_Minor;
+ creatorAtom.atom_sizeL = sizeof(CR8R_CreatorAtom);
+}
+
+// -------------------------------------------------------------------------------------------------
+
+#define PR_PROJECT_LINK_ATOM_VERS_API 1
+#define PR_PROJECT_LINK_ATOM_VERS_CODE 0
+#define PR_PROJECT_LINK_ATOM_TYPE 'PrmL'
+#define PR_PROJECT_LINK_MAGIC 0x600DF00D // GoodFood
+
+#define myProjectLink MakeFourCC ( 'P','r','m','L')
+
+// -------------------------------------------------------------------------------------------------
+
+static void CreatorAtom_MakeValid ( CR8R_CreatorAtom * creator_atomP )
+{
+ // If already valid, no conversion is needed.
+ if ( creator_atomP->magicLu == AdobeCreatorAtom_Magic ) return;
+
+ Flip4 ( &creator_atomP->magicLu );
+ Flip2 ( &creator_atomP->atom_vers_majorS );
+ Flip2 ( &creator_atomP->atom_vers_minorS );
+
+ Flip4 ( &creator_atomP->atom_sizeL );
+ Flip4 ( &creator_atomP->creator_codeLu );
+ Flip4 ( &creator_atomP->creator_eventLu );
+
+ XMP_Assert ( creator_atomP->magicLu == AdobeCreatorAtom_Magic );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+static void CreatorAtom_ToBE ( CR8R_CreatorAtom * creator_atomP )
+{
+ creator_atomP->atom_vers_majorS = MakeUns16BE ( creator_atomP->atom_vers_majorS );
+ creator_atomP->atom_vers_minorS = MakeUns16BE ( creator_atomP->atom_vers_minorS );
+
+ creator_atomP->magicLu = MakeUns32BE ( creator_atomP->magicLu );
+ creator_atomP->atom_sizeL = MakeUns32BE ( creator_atomP->atom_sizeL );
+ creator_atomP->creator_codeLu = MakeUns32BE ( creator_atomP->creator_codeLu );
+ creator_atomP->creator_eventLu = MakeUns32BE ( creator_atomP->creator_eventLu );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+static void ProjectLinkAtom_MakeValid ( Embed_ProjectLinkAtom * link_atomP )
+{
+ // If already valid, no conversion is needed.
+ if ( link_atomP->magicLu == PR_PROJECT_LINK_MAGIC ) return;
+
+ // do the header
+ Flip4 ( &link_atomP->magicLu );
+ Flip4 ( &link_atomP->atom_sizeL );
+ Flip2 ( &link_atomP->atom_vers_apiS );
+ Flip2 ( &link_atomP->atom_vers_codeS );
+
+ // do the FSSpec data
+ Flip2 ( &link_atomP->fullPath.vRefNum );
+ Flip4 ( &link_atomP->fullPath.parID );
+
+ XMP_Assert ( link_atomP->magicLu == PR_PROJECT_LINK_MAGIC );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+static void ProjectLinkAtom_Initialize ( Embed_ProjectLinkAtom& epla, Embed_ExportType type,
+ const std::string& projectPathString)
+{
+
+ memset ( &epla, 0, sizeof(Embed_ProjectLinkAtom) );
+
+ epla.magicLu = PR_PROJECT_LINK_MAGIC;
+ epla.atom_sizeL = epla.atom_vers_apiS = PR_PROJECT_LINK_ATOM_VERS_API;
+ epla.atom_vers_codeS = PR_PROJECT_LINK_ATOM_VERS_CODE;
+ epla.atom_sizeL = sizeof(Embed_ProjectLinkAtom);
+ epla.exportType = type;
+ epla.fullPath.vRefNum = 0;
+ epla.fullPath.parID = 0;
+
+ strncpy ( epla.fullPath.name, projectPathString.c_str(),
+ min ( projectPathString.length(), sizeof(epla.fullPath.name) ) );
+
+}
+
+// -------------------------------------------------------------------------------------------------
+
+static bool Mov_ReadProjectLinkAtom ( UserData& movieUserData, Embed_ProjectLinkAtom* epla )
+{
+ Handle PrmLdataHandle ( NewHandle(0) );
+ if ( PrmLdataHandle == 0 ) return false;
+
+ OSErr err = GetUserData ( movieUserData, PrmLdataHandle, 'PrmL', 1 );
+ if ( err != noErr ) return false;
+
+ // Convert handles data, to std::string raw
+ // std::string PrmLPacket;
+ // PrmLPacket.clear();
+ size_t dataSize = GetHandleSize ( PrmLdataHandle );
+ HLock ( PrmLdataHandle );
+
+ bool ok = (dataSize == sizeof(Embed_ProjectLinkAtom));
+ if ( ok ) {
+ memcpy ( epla, (*PrmLdataHandle), dataSize );
+ ProjectLinkAtom_MakeValid ( epla );
+ }
+
+ HUnlock ( PrmLdataHandle );
+ DisposeHandle ( PrmLdataHandle );
+
+ return ok;
+
+}
+
+// -------------------------------------------------------------------------------------------------
+
+static bool Mov_ReadCreatorAtom ( UserData& movieUserData, CR8R_CreatorAtom* creatorAtom )
+{
+ Handle PrmLdataHandle ( NewHandle(0) );
+ if ( PrmLdataHandle == 0 ) return false;
+
+ OSErr err = GetUserData ( movieUserData, PrmLdataHandle, 'Cr8r', 1 );
+ if ( err != noErr ) return false;
+
+ // Convert handles data, to std::string raw
+ // std::string PrmLPacket;
+ // PrmLPacket.clear();
+ size_t dataSize = GetHandleSize ( PrmLdataHandle );
+ HLock ( PrmLdataHandle );
+
+ bool ok = (sizeof(CR8R_CreatorAtom) == dataSize);
+ if ( ok ) {
+ memcpy ( creatorAtom, (*PrmLdataHandle), dataSize );
+ CreatorAtom_MakeValid ( creatorAtom );
+ }
+
+ HUnlock ( PrmLdataHandle );
+ DisposeHandle ( PrmLdataHandle );
+
+ return ok;
+
+}
+
+// -------------------------------------------------------------------------------------------------
+
+static bool Mov_WriteCreatorAtom ( UserData& movieUserData, CR8R_CreatorAtom& creatorAtom, bool mustExist )
+{
+ Handle PrmLdataHandle ( NewHandle(sizeof(CR8R_CreatorAtom)) );
+ if ( PrmLdataHandle == 0 ) return false;
+
+ OSErr err = GetUserData ( movieUserData, PrmLdataHandle, 'Cr8r', 1);
+ if ( err == noErr ) {
+ while ( ! RemoveUserData ( movieUserData, 'Cr8r', 1 ) ) {};
+ } else {
+ if ( mustExist ) return false;
+ }
+
+ // Convert handles data, to std::string raw
+ // std::string PrmLPacket;
+ // PrmLPacket.clear();
+ size_t dataSize = GetHandleSize ( PrmLdataHandle );
+ HLock ( PrmLdataHandle );
+ memcpy ( (*PrmLdataHandle), &creatorAtom, sizeof(CR8R_CreatorAtom) );
+ CreatorAtom_ToBE ( (CR8R_CreatorAtom*)(*PrmLdataHandle) );
+ HUnlock ( PrmLdataHandle );
+
+ OSErr movieErr = AddUserData ( movieUserData, PrmLdataHandle, 'Cr8r');
+
+ DisposeHandle ( PrmLdataHandle );
+
+ return movieErr==0;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+#define DoAssignBufferedString(str,buffer) AssignBufferedString ( str, buffer, sizeof(buffer) )
+
+static inline void AssignBufferedString ( std::string & str, const char * buffer, size_t maxLen )
+{
+ size_t len;
+ for ( len = 0; (len < maxLen) && (buffer[len] != 0); ++len ) { /* empty body */ }
+ str.assign ( buffer, len );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+static bool CreatorAtom_ReadStrings ( MOV_MetaHandler::CreatorAtomStrings& creatorAtomStrings,
+ UserData& movieUserData )
+{
+ Embed_ProjectLinkAtom epla;
+ bool ok = Mov_ReadProjectLinkAtom ( movieUserData, &epla );
+
+ if ( ok ) {
+
+ std::string projectPathString = epla.fullPath.name;
+
+ if ( ! projectPathString.empty() ) {
+
+ if ( projectPathString[0] == '/' ) {
+ creatorAtomStrings.posixProjectPath = projectPathString;
+ } else if ( projectPathString.substr(0,4) == std::string("\\\\?\\") ) {
+ creatorAtomStrings.uncProjectPath = projectPathString;
+ }
+
+ switch ( epla.exportType ) {
+ case Embed_ExportTypeMovie : creatorAtomStrings.projectRefType = "movie"; break;
+ case Embed_ExportTypeStill : creatorAtomStrings.projectRefType = "still"; break;
+ case Embed_ExportTypeAudio : creatorAtomStrings.projectRefType = "audio"; break;
+ case Embed_ExportTypeCustom : creatorAtomStrings.projectRefType = "custom"; break;
+ }
+
+ }
+
+ }
+
+ CR8R_CreatorAtom creatorAtom;
+ ok = Mov_ReadCreatorAtom ( movieUserData, &creatorAtom );
+
+ if ( ok ) {
+
+ char buffer[256];
+
+ sprintf ( buffer, "%d", creatorAtom.creator_codeLu );
+ creatorAtomStrings.applicationCode = buffer;
+
+ sprintf ( buffer, "%d", creatorAtom.creator_eventLu );
+ creatorAtomStrings.invocationAppleEvent = buffer;
+
+ DoAssignBufferedString ( creatorAtomStrings.extension, creatorAtom.creator_extAC );
+ DoAssignBufferedString ( creatorAtomStrings.invocationFlags, creatorAtom.creator_flagAC );
+ DoAssignBufferedString ( creatorAtomStrings.creatorTool, creatorAtom.creator_nameAC );
+
+ }
+
+ return ok;
+
+}
+
+// -------------------------------------------------------------------------------------------------
+
+static bool CreatorAtom_SetProperties ( SXMPMeta& xmpObj,
+ const MOV_MetaHandler::CreatorAtomStrings& creatorAtomStrings )
+{
+ if ( ! creatorAtomStrings.posixProjectPath.empty() ) {
+ xmpObj.SetStructField ( kXMP_NS_CreatorAtom, "macAtom",
+ kXMP_NS_CreatorAtom, "posixProjectPath", creatorAtomStrings.posixProjectPath, 0 );
+ }
+
+ if ( ! creatorAtomStrings.uncProjectPath.empty() ) {
+ xmpObj.SetStructField ( kXMP_NS_CreatorAtom, "windowsAtom",
+ kXMP_NS_CreatorAtom, "uncProjectPath", creatorAtomStrings.uncProjectPath, 0 );
+ }
+
+ if ( ! creatorAtomStrings.projectRefType.empty() ) {
+ xmpObj.SetStructField ( kXMP_NS_DM, "projectRef", kXMP_NS_DM, "type", creatorAtomStrings.projectRefType.c_str());
+ }
+
+ if ( ! creatorAtomStrings.applicationCode.empty() ) {
+ xmpObj.SetStructField ( kXMP_NS_CreatorAtom, "macAtom",
+ kXMP_NS_CreatorAtom, "applicationCode", creatorAtomStrings.applicationCode, 0 );
+ }
+
+ if ( ! creatorAtomStrings.invocationAppleEvent.empty() ) {
+ xmpObj.SetStructField ( kXMP_NS_CreatorAtom, "macAtom",
+ kXMP_NS_CreatorAtom, "invocationAppleEvent", creatorAtomStrings.invocationAppleEvent, 0 );
+ }
+
+ if ( ! creatorAtomStrings.extension.empty() ) {
+ xmpObj.SetStructField ( kXMP_NS_CreatorAtom, "windowsAtom",
+ kXMP_NS_CreatorAtom, "extension", creatorAtomStrings.extension, 0 );
+ }
+
+ if ( ! creatorAtomStrings.invocationFlags.empty() ) {
+ xmpObj.SetStructField ( kXMP_NS_CreatorAtom, "windowsAtom",
+ kXMP_NS_CreatorAtom, "invocationFlags", creatorAtomStrings.invocationFlags, 0 );
+ }
+
+ if ( ! creatorAtomStrings.creatorTool.empty() ) {
+ xmpObj.SetProperty ( kXMP_NS_XMP, "CreatorTool", creatorAtomStrings.creatorTool, 0 );
+ }
+
+ return ok;
+
+}
+
+// -------------------------------------------------------------------------------------------------
+
+#define EnsureFinalNul(buffer) buffer [ sizeof(buffer) - 1 ] = 0
+
+static bool CreatorAtom_Update ( SXMPMeta& xmpObj,
+ UserData& movieUserData )
+{
+
+ // Get Creator Atom XMP values.
+ bool found = false;
+ std::string posixPathString, uncPathString;
+ if ( xmpObj.GetStructField ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "posixProjectPath", &posixPathString, 0 ) ) found = true;
+ if ( xmpObj.GetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "uncProjectPath", &uncPathString, 0 ) ) found = true;
+
+ std::string applicationCodeString, invocationAppleEventString, extensionString, invocationFlagsString, creatorToolString;
+ if ( xmpObj.GetStructField ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "applicationCode", &applicationCodeString, 0 ) ) found = true;
+ if ( xmpObj.GetStructField ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "invocationAppleEvent", &invocationAppleEventString, 0 ) ) found = true;
+ if ( xmpObj.GetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "extension", &extensionString, 0 ) ) found = true;
+ if ( xmpObj.GetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "invocationFlags", &invocationFlagsString, 0 ) ) found = true;
+ if ( xmpObj.GetProperty ( kXMP_NS_XMP, "CreatorTool", &creatorToolString, 0 ) ) found = true;
+
+ // If no Creator Atom information found, don't write anything.
+ if ( ! found ) return false;
+
+ // Read Legacy Creator Atom.
+ unsigned long creatorAtomSize = 0;
+ CR8R_CreatorAtom creatorAtomLegacy;
+ CreatorAtom_Initialize ( creatorAtomLegacy );
+ bool ok = Mov_ReadCreatorAtom ( movieUserData, &creatorAtomLegacy );
+
+ // Generate new Creator Atom from XMP.
+ CR8R_CreatorAtom creatorAtomViaXMP;
+ CreatorAtom_Initialize ( creatorAtomViaXMP );
+
+ if ( ! applicationCodeString.empty() ) {
+ creatorAtomViaXMP.creator_codeLu = strtoul ( applicationCodeString.c_str(), 0, 0 );
+ }
+ if ( ! invocationAppleEventString.empty() ) {
+ creatorAtomViaXMP.creator_eventLu = strtoul ( invocationAppleEventString.c_str(), 0, 0 );
+ }
+ if ( ! extensionString.empty() ) {
+ strncpy ( creatorAtomViaXMP.creator_extAC, extensionString.c_str(), sizeof(creatorAtomViaXMP.creator_extAC) );
+ EnsureFinalNul ( creatorAtomViaXMP.creator_extAC );
+ }
+ if ( ! invocationFlagsString.empty() ) {
+ strncpy ( creatorAtomViaXMP.creator_flagAC, invocationFlagsString.c_str(), sizeof(creatorAtomViaXMP.creator_flagAC) );
+ EnsureFinalNul ( creatorAtomViaXMP.creator_flagAC );
+ }
+ if ( ! creatorToolString.empty() ) {
+ strncpy ( creatorAtomViaXMP.creator_nameAC, creatorToolString.c_str(), sizeof(creatorAtomViaXMP.creator_nameAC) );
+ EnsureFinalNul ( creatorAtomViaXMP.creator_nameAC );
+ }
+
+ // Write Creator Atom.
+ if ( ok ) {
+ // If there's legacy, update if atom generated from XMP doesn't match legacy.
+ if ( memcmp ( &creatorAtomViaXMP, &creatorAtomLegacy, sizeof(CR8R_CreatorAtom) ) != 0 ) {
+ ok = Mov_WriteCreatorAtom ( movieUserData, creatorAtomViaXMP, true );
+ }
+ } else {
+ // Write completely new atom from XMP.
+ ok = Mov_WriteCreatorAtom ( movieUserData, creatorAtomViaXMP, false );
+ }
+
+ return ok;
+
+}
+
+// =================================================================================================
+
+#endif // XMP_64 || XMP_UNIXBuild
diff --git a/source/XMPFiles/FileHandlers/MOV_Handler.hpp b/source/XMPFiles/FileHandlers/MOV_Handler.hpp
index 9c7f8c3..4d398ce 100644
--- a/source/XMPFiles/FileHandlers/MOV_Handler.hpp
+++ b/source/XMPFiles/FileHandlers/MOV_Handler.hpp
@@ -3,13 +3,16 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
// of the Adobe license agreement accompanying it.
// =================================================================================================
+#include "XMP_Environment.h" // ! This must be the first include.
+#if ! ( XMP_64 || XMP_UNIXBuild) // Closes at very bottom.
+
#include "XMPFiles_Impl.hpp"
// Include these first to prevent collision with CIcon
@@ -53,10 +56,24 @@ public:
~MOV_MetaHandler();
void CacheFileData();
+ void ProcessXMP();
void UpdateFile ( bool doSafeUpdate );
void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath );
+ struct CreatorAtomStrings {
+ std::string posixProjectPath;
+ std::string uncProjectPath;
+ std::string projectRefType;
+ std::string applicationCode;
+ std::string invocationAppleEvent;
+ std::string extension;
+ std::string invocationFlags;
+ std::string creatorTool;
+ };
+
+ CreatorAtomStrings mCreatorAtomStrings; // ! Public so utility code can muck with them.
+
protected:
bool mQTInit;
@@ -73,4 +90,5 @@ protected:
// =================================================================================================
+#endif // XMP_64 || XMP_UNIXBuild
#endif /* __MOV_Handler_hpp__ */
diff --git a/source/XMPFiles/FileHandlers/MP3_Handler.cpp b/source/XMPFiles/FileHandlers/MP3_Handler.cpp
index 56dcf09..f906900 100644
--- a/source/XMPFiles/FileHandlers/MP3_Handler.cpp
+++ b/source/XMPFiles/FileHandlers/MP3_Handler.cpp
@@ -7,6 +7,9 @@
// of the Adobe license agreement accompanying it.
// =================================================================================================
+#include "XMP_Environment.h" // ! This must be the first include.
+#if ! XMP_UNIXBuild // Closes at very bottom. Disabled on UNIX until legacy-as-local is fixed.
+
#include "MP3_Handler.hpp"
#include "ID3_Support.hpp"
@@ -136,7 +139,7 @@ void MP3_MetaHandler::UpdateFile ( bool doSafeUpdate )
bool fReconciliate = !(this->parent->openFlags & kXMPFiles_OpenOnlyXMP);
XMP_StringPtr packetStr = xmpPacket.c_str();
- XMP_StringLen packetLen = xmpPacket.size();
+ XMP_StringLen packetLen = (XMP_StringLen)xmpPacket.size();
if ( packetLen == 0 ) return;
LFA_FileRef fileRef ( this->parent->fileRef );
@@ -159,42 +162,42 @@ void MP3_MetaHandler::UpdateFile ( bool doSafeUpdate )
std::string strTitle;
this->xmpObj.GetLocalizedText ( kXMP_NS_DC, kTitle, "", "x-default", 0, &strTitle, 0 );
ID3_Support::AddXMPTagToID3Buffer ( buffer, &dwCurOffset, bufferSize, bVersion,
- mp3TitleChunk, strTitle.c_str(), strTitle.size() );
+ mp3TitleChunk, strTitle.c_str(), (unsigned long)strTitle.size() );
std::string strDate;
this->xmpObj.GetProperty ( kXMP_NS_XMP, kCreateDate, &strDate, 0 );
if ( bVersion == 4 ) {
ID3_Support::AddXMPTagToID3Buffer ( buffer, &dwCurOffset, bufferSize, bVersion,
- mp3CreateDateChunk4, strDate.c_str(), strDate.size() );
+ mp3CreateDateChunk4, strDate.c_str(), (unsigned long)strDate.size() );
} else {
ID3_Support::AddXMPTagToID3Buffer ( buffer, &dwCurOffset, bufferSize, bVersion,
- mp3CreateDateChunk3, strDate.c_str(), strDate.size() );
+ mp3CreateDateChunk3, strDate.c_str(), (unsigned long)strDate.size() );
}
std::string strArtist;
this->xmpObj.GetProperty ( kXMP_NS_DM, kArtist, &strArtist, 0 );
ID3_Support::AddXMPTagToID3Buffer ( buffer, &dwCurOffset, bufferSize, bVersion, mp3ArtistChunk,
- strArtist.c_str(), strArtist.size() );
+ strArtist.c_str(), (unsigned long)strArtist.size() );
std::string strAlbum;
this->xmpObj.GetProperty ( kXMP_NS_DM, kAlbum, &strAlbum, 0 );
ID3_Support::AddXMPTagToID3Buffer ( buffer, &dwCurOffset, bufferSize, bVersion,
- mp3AlbumChunk, strAlbum.c_str(), strAlbum.size() );
+ mp3AlbumChunk, strAlbum.c_str(), (unsigned long)strAlbum.size() );
std::string strGenre;
this->xmpObj.GetProperty ( kXMP_NS_DM, kGenre, &strGenre, 0 );
ID3_Support::AddXMPTagToID3Buffer ( buffer, &dwCurOffset, bufferSize, bVersion,
- mp3GenreChunk, strGenre.c_str(), strGenre.size() );
+ mp3GenreChunk, strGenre.c_str(), (unsigned long)strGenre.size() );
std::string strComment;
this->xmpObj.GetProperty ( kXMP_NS_DM, kLogComment, &strComment, 0 );
ID3_Support::AddXMPTagToID3Buffer ( buffer, &dwCurOffset, bufferSize, bVersion,
- mp3CommentChunk, strComment.c_str(), strComment.size() );
+ mp3CommentChunk, strComment.c_str(), (unsigned long)strComment.size() );
std::string strTrack;
this->xmpObj.GetProperty ( kXMP_NS_DM, kTrack, &strTrack, 0 );
ID3_Support::AddXMPTagToID3Buffer ( buffer, &dwCurOffset, bufferSize, bVersion,
- mp3TrackChunk, strTrack.c_str(), strTrack.size() );
+ mp3TrackChunk, strTrack.c_str(), (unsigned long)strTrack.size() );
}
@@ -257,7 +260,7 @@ void MP3_MetaHandler::CacheFileData()
this->packetInfo.offset = xmpOffset;
this->packetInfo.length = bufferSize;
this->xmpPacket.assign(buffer.data(), bufferSize);
- this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), this->xmpPacket.size() );
+ this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() );
this->containsXMP = true;
}
@@ -337,3 +340,7 @@ bool MP3_MetaHandler::LoadPropertyFromID3 ( LFA_FileRef inFileRef, char * strFra
return false;
} // WAV_MetaHandler::LoadPropertyFromID3
+
+// =================================================================================================
+
+#endif // XMP_UNIXBuild
diff --git a/source/XMPFiles/FileHandlers/MP3_Handler.hpp b/source/XMPFiles/FileHandlers/MP3_Handler.hpp
index f9aa46d..8a321e6 100644
--- a/source/XMPFiles/FileHandlers/MP3_Handler.hpp
+++ b/source/XMPFiles/FileHandlers/MP3_Handler.hpp
@@ -10,6 +10,9 @@
// of the Adobe license agreement accompanying it.
// =================================================================================================
+#include "XMP_Environment.h" // ! This must be the first include.
+#if ! XMP_UNIXBuild // Closes at very bottom. Disabled on UNIX until legacy-as-local is fixed.
+
#include "XMPFiles_Impl.hpp"
// =================================================================================================
@@ -53,4 +56,5 @@ private:
// =================================================================================================
+#endif // XMP_UNIXBuild
#endif /* __MP3_Handler_hpp__ */
diff --git a/source/XMPFiles/FileHandlers/MPEG_Handler.cpp b/source/XMPFiles/FileHandlers/MPEG2_Handler.cpp
index 674c5e3..9c2eb48 100644
--- a/source/XMPFiles/FileHandlers/MPEG_Handler.cpp
+++ b/source/XMPFiles/FileHandlers/MPEG2_Handler.cpp
@@ -7,19 +7,19 @@
// of the Adobe license agreement accompanying it.
// =================================================================================================
-#if WIN_ENV
+#if XMP_WinBuild
#pragma warning ( disable : 4996 ) // '...' was declared deprecated
#endif
-#include "MPEG_Handler.hpp"
+#include "MPEG2_Handler.hpp"
using namespace std;
// =================================================================================================
-/// \file MPEG_Handler.cpp
-/// \brief File format handler for MPEG.
+/// \file MPEG2_Handler.cpp
+/// \brief File format handler for MPEG2.
///
-/// BLECH! YUCK! GAG! MPEG is done using a sidecar and recognition only by file extension! BARF!!!!!
+/// BLECH! YUCK! GAG! MPEG-2 is done using a sidecar and recognition only by file extension! BARF!!!!!
///
// =================================================================================================
@@ -46,64 +46,64 @@ static inline XMP_StringPtr FindFileExtension ( XMP_StringPtr filePath )
} // FindFileExtension
// =================================================================================================
-// MPEG_MetaHandlerCTor
-// ====================
+// MPEG2_MetaHandlerCTor
+// =====================
-XMPFileHandler * MPEG_MetaHandlerCTor ( XMPFiles * parent )
+XMPFileHandler * MPEG2_MetaHandlerCTor ( XMPFiles * parent )
{
- return new MPEG_MetaHandler ( parent );
+ return new MPEG2_MetaHandler ( parent );
-} // MPEG_MetaHandlerCTor
+} // MPEG2_MetaHandlerCTor
// =================================================================================================
-// MPEG_CheckFormat
-// ================
+// MPEG2_CheckFormat
+// =================
-// The MPEG handler uses just the file extension, not the file content. Worse yet, it also uses a
+// The MPEG-2 handler uses just the file extension, not the file content. Worse yet, it also uses a
// sidecar file for the XMP. This works better if the handler owns the file, we open the sidecar
-// instead of the actual MPEG file.
+// instead of the actual MPEG-2 file.
-bool MPEG_CheckFormat ( XMP_FileFormat format,
+bool MPEG2_CheckFormat ( XMP_FileFormat format,
XMP_StringPtr filePath,
LFA_FileRef fileRef,
XMPFiles * parent )
{
IgnoreParam(format); IgnoreParam(filePath); IgnoreParam(fileRef);
- XMP_Assert ( format == kXMP_MPEGFile );
+ XMP_Assert ( (format == kXMP_MPEGFile) || (format == kXMP_MPEG2File) );
XMP_Assert ( fileRef == 0 );
- return ( parent->format == kXMP_MPEGFile ); // ! Just use the first call's format hint.
+ return ( (parent->format == kXMP_MPEGFile) || (parent->format == kXMP_MPEGFile) ); // ! Just use the first call's format hint.
-} // MPEG_CheckFormat
+} // MPEG2_CheckFormat
// =================================================================================================
-// MPEG_MetaHandler::MPEG_MetaHandler
-// ==================================
+// MPEG2_MetaHandler::MPEG2_MetaHandler
+// ====================================
-MPEG_MetaHandler::MPEG_MetaHandler ( XMPFiles * _parent )
+MPEG2_MetaHandler::MPEG2_MetaHandler ( XMPFiles * _parent )
{
this->parent = _parent;
- this->handlerFlags = kMPEG_HandlerFlags;
+ this->handlerFlags = kMPEG2_HandlerFlags;
this->stdCharForm = kXMP_Char8Bit;
-} // MPEG_MetaHandler::MPEG_MetaHandler
+} // MPEG2_MetaHandler::MPEG2_MetaHandler
// =================================================================================================
-// MPEG_MetaHandler::~MPEG_MetaHandler
-// ===================================
+// MPEG2_MetaHandler::~MPEG2_MetaHandler
+// =====================================
-MPEG_MetaHandler::~MPEG_MetaHandler()
+MPEG2_MetaHandler::~MPEG2_MetaHandler()
{
// Nothing to do.
-} // MPEG_MetaHandler::~MPEG_MetaHandler
+} // MPEG2_MetaHandler::~MPEG2_MetaHandler
// =================================================================================================
-// MPEG_MetaHandler::CacheFileData
-// ===============================
+// MPEG2_MetaHandler::CacheFileData
+// ================================
-void MPEG_MetaHandler::CacheFileData()
+void MPEG2_MetaHandler::CacheFileData()
{
bool readOnly = (! (this->parent->openFlags & kXMPFiles_OpenForUpdate));
@@ -111,7 +111,7 @@ void MPEG_MetaHandler::CacheFileData()
this->processedXMP = true; // Whatever we do here is all that we do for XMPFiles::OpenFile.
// Try to open the sidecar XMP file. Tolerate an open failure, there might not be any XMP.
- // Note that MPEG_CheckFormat can't save the sidecar path because the handler doesn't exist then.
+ // Note that MPEG2_CheckFormat can't save the sidecar path because the handler doesn't exist then.
XMP_StringPtr filePath = this->parent->filePath.c_str();
XMP_StringPtr extPtr = FindFileExtension ( filePath );
@@ -139,7 +139,7 @@ void MPEG_MetaHandler::CacheFileData()
// Try to create a file if it does not yet exist.
// *** Could someday check for a permission failure versus no .xmp file.
this->parent->fileRef = LFA_Create ( this->sidecarPath.c_str() );
- if ( this->parent->fileRef == 0 ) XMP_Throw ( "Can't create MPEG sidecar", kXMPErr_ExternalFailure );
+ if ( this->parent->fileRef == 0 ) XMP_Throw ( "Can't create MPEG-2 sidecar", kXMPErr_ExternalFailure );
}
}
@@ -158,18 +158,18 @@ void MPEG_MetaHandler::CacheFileData()
this->parent->fileRef = 0;
}
- this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), this->xmpPacket.size() );
+ this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() );
this->containsXMP = true;
}
-} // MPEG_MetaHandler::CacheFileData
+} // MPEG2_MetaHandler::CacheFileData
// =================================================================================================
-// MPEG_MetaHandler::UpdateFile
-// ============================
+// MPEG2_MetaHandler::UpdateFile
+// =============================
-void MPEG_MetaHandler::UpdateFile ( bool doSafeUpdate )
+void MPEG2_MetaHandler::UpdateFile ( bool doSafeUpdate )
{
if ( ! this->needsUpdate ) return;
@@ -177,7 +177,7 @@ void MPEG_MetaHandler::UpdateFile ( bool doSafeUpdate )
XMP_Assert ( fileRef != 0 );
XMP_StringPtr packetStr = this->xmpPacket.c_str();
- XMP_StringLen packetLen = this->xmpPacket.size();
+ XMP_StringLen packetLen = (XMP_StringLen)this->xmpPacket.size();
if ( ! doSafeUpdate ) {
@@ -218,17 +218,17 @@ void MPEG_MetaHandler::UpdateFile ( bool doSafeUpdate )
this->needsUpdate = false;
-} // MPEG_MetaHandler::UpdateFile
+} // MPEG2_MetaHandler::UpdateFile
// =================================================================================================
-// MPEG_MetaHandler::WriteFile
-// ===========================
+// MPEG2_MetaHandler::WriteFile
+// ============================
-void MPEG_MetaHandler::WriteFile ( LFA_FileRef sourceRef,
+void MPEG2_MetaHandler::WriteFile ( LFA_FileRef sourceRef,
const std::string & sourcePath )
{
IgnoreParam(sourceRef); IgnoreParam(sourcePath);
- XMP_Throw ( "MPEG_MetaHandler::WriteFile: Should never be called", kXMPErr_Unavailable );
+ XMP_Throw ( "MPEG2_MetaHandler::WriteFile: Should never be called", kXMPErr_Unavailable );
-} // MPEG_MetaHandler::WriteFile
+} // MPEG2_MetaHandler::WriteFile
diff --git a/source/XMPFiles/FileHandlers/MPEG_Handler.hpp b/source/XMPFiles/FileHandlers/MPEG2_Handler.hpp
index 21484ce..8bb0464 100644
--- a/source/XMPFiles/FileHandlers/MPEG_Handler.hpp
+++ b/source/XMPFiles/FileHandlers/MPEG2_Handler.hpp
@@ -1,5 +1,5 @@
-#ifndef __MPEG_Handler_hpp__
-#define __MPEG_Handler_hpp__ 1
+#ifndef __MPEG2_Handler_hpp__
+#define __MPEG2_Handler_hpp__ 1
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
@@ -13,45 +13,45 @@
#include "XMPFiles_Impl.hpp"
// =================================================================================================
-/// \file MPEG_Handler.hpp
-/// \brief File format handler for MPEG.
+/// \file MPEG2_Handler.hpp
+/// \brief File format handler for MPEG2.
///
/// This header ...
///
// =================================================================================================
-extern XMPFileHandler * MPEG_MetaHandlerCTor ( XMPFiles * parent );
+extern XMPFileHandler * MPEG2_MetaHandlerCTor ( XMPFiles * parent );
-extern bool MPEG_CheckFormat ( XMP_FileFormat format,
+extern bool MPEG2_CheckFormat ( XMP_FileFormat format,
XMP_StringPtr filePath,
LFA_FileRef fileRef,
XMPFiles * parent);
-static const XMP_OptionBits kMPEG_HandlerFlags = ( kXMPFiles_CanInjectXMP |
- kXMPFiles_CanExpand |
- kXMPFiles_CanRewrite |
- kXMPFiles_AllowsOnlyXMP |
- kXMPFiles_ReturnsRawPacket |
- kXMPFiles_HandlerOwnsFile |
- kXMPFiles_AllowsSafeUpdate |
- kXMPFiles_UsesSidecarXMP );
+static const XMP_OptionBits kMPEG2_HandlerFlags = ( kXMPFiles_CanInjectXMP |
+ kXMPFiles_CanExpand |
+ kXMPFiles_CanRewrite |
+ kXMPFiles_AllowsOnlyXMP |
+ kXMPFiles_ReturnsRawPacket |
+ kXMPFiles_HandlerOwnsFile |
+ kXMPFiles_AllowsSafeUpdate |
+ kXMPFiles_UsesSidecarXMP );
-class MPEG_MetaHandler : public XMPFileHandler
+class MPEG2_MetaHandler : public XMPFileHandler
{
public:
std::string sidecarPath;
- MPEG_MetaHandler ( XMPFiles * parent );
- ~MPEG_MetaHandler();
+ MPEG2_MetaHandler ( XMPFiles * parent );
+ ~MPEG2_MetaHandler();
void CacheFileData();
void UpdateFile ( bool doSafeUpdate );
void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath );
-}; // MPEG_MetaHandler
+}; // MPEG2_MetaHandler
// =================================================================================================
-#endif /* __MPEG_Handler_hpp__ */
+#endif /* __MPEG2_Handler_hpp__ */
diff --git a/source/XMPFiles/FileHandlers/MPEG4_Handler.cpp b/source/XMPFiles/FileHandlers/MPEG4_Handler.cpp
new file mode 100644
index 0000000..a3f92d6
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/MPEG4_Handler.cpp
@@ -0,0 +1,909 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2007 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "MPEG4_Handler.hpp"
+
+#include "UnicodeConversions.hpp"
+#include "MD5.h"
+
+#if XMP_WinBuild
+ #pragma warning ( disable : 4996 ) // '...' was declared deprecated
+#endif
+
+using namespace std;
+
+// =================================================================================================
+/// \file MPEG4_Handler.cpp
+/// \brief File format handler for MPEG-4, a flavor of the ISO Base Media File Format.
+///
+/// This handler ...
+///
+// =================================================================================================
+
+// File and box type codes as big endian 32-bit integers, allows faster comparisons.
+
+static XMP_Uns32 kBE_ftyp = MakeUns32BE ( 0x66747970UL ); // File header Box, no version/flags.
+
+static XMP_Uns32 kBE_mp41 = MakeUns32BE ( 0x6D703431UL ); // Compatibility codes
+static XMP_Uns32 kBE_mp42 = MakeUns32BE ( 0x6D703432UL );
+static XMP_Uns32 kBE_f4v = MakeUns32BE ( 0x66347620UL );
+
+static XMP_Uns32 kBE_moov = MakeUns32BE ( 0x6D6F6F76UL ); // Container Box, no version/flags.
+static XMP_Uns32 kBE_mvhd = MakeUns32BE ( 0x6D766864UL ); // Data FullBox, has version/flags.
+static XMP_Uns32 kBE_udta = MakeUns32BE ( 0x75647461UL ); // Container Box, no version/flags.
+static XMP_Uns32 kBE_cprt = MakeUns32BE ( 0x63707274UL ); // Data FullBox, has version/flags.
+static XMP_Uns32 kBE_uuid = MakeUns32BE ( 0x75756964UL ); // Data Box, no version/flags.
+static XMP_Uns32 kBE_free = MakeUns32BE ( 0x66726565UL ); // Free space Box, no version/flags.
+static XMP_Uns32 kBE_mdat = MakeUns32BE ( 0x6D646174UL ); // Media data Box, no version/flags.
+
+static XMP_Uns32 kBE_xmpUUID [4] = { MakeUns32BE ( 0xBE7ACFCBUL ),
+ MakeUns32BE ( 0x97A942E8UL ),
+ MakeUns32BE ( 0x9C719994UL ),
+ MakeUns32BE ( 0x91E3AFACUL ) };
+
+// ! The buffer and constants are both already big endian.
+#define Get4CharCode(buffPtr) (*((XMP_Uns32*)(buffPtr)))
+
+// =================================================================================================
+
+// Pairs of 3 letter ISO 639-2 codes mapped to 2 letter ISO 639-1 codes from:
+// http://www.loc.gov/standards/iso639-2/php/code_list.php
+// Would have to write an "==" operator to use std::map, must compare values not pointers.
+// ! Not fully sorted, do not use a binary search.
+static XMP_StringPtr kKnownLangs[] =
+ { "aar", "aa", "abk", "ab", "afr", "af", "aka", "ak", "alb", "sq", "sqi", "sq", "amh", "am",
+ "ara", "ar", "arg", "an", "arm", "hy", "hye", "hy", "asm", "as", "ava", "av", "ave", "ae",
+ "aym", "ay", "aze", "az", "bak", "ba", "bam", "bm", "baq", "eu", "eus", "eu", "bel", "be",
+ "ben", "bn", "bih", "bh", "bis", "bi", "bod", "bo", "tib", "bo", "bos", "bs", "bre", "br",
+ "bul", "bg", "bur", "my", "mya", "my", "cat", "ca", "ces", "cs", "cze", "cs", "cha", "ch",
+ "che", "ce", "chi", "zh", "zho", "zh", "chu", "cu", "chv", "cv", "cor", "kw", "cos", "co",
+ "cre", "cr", "cym", "cy", "wel", "cy", "cze", "cs", "ces", "cs", "dan", "da", "deu", "de",
+ "ger", "de", "div", "dv", "dut", "nl", "nld", "nl", "dzo", "dz", "ell", "el", "gre", "el",
+ "eng", "en", "epo", "eo", "est", "et", "eus", "eu", "baq", "eu", "ewe", "ee", "fao", "fo",
+ "fas", "fa", "per", "fa", "fij", "fj", "fin", "fi", "fra", "fr", "fre", "fr", "fre", "fr",
+ "fra", "fr", "fry", "fy", "ful", "ff", "geo", "ka", "kat", "ka", "ger", "de", "deu", "de",
+ "gla", "gd", "gle", "ga", "glg", "gl", "glv", "gv", "gre", "el", "ell", "el", "grn", "gn",
+ "guj", "gu", "hat", "ht", "hau", "ha", "heb", "he", "her", "hz", "hin", "hi", "hmo", "ho",
+ "hrv", "hr", "scr", "hr", "hun", "hu", "hye", "hy", "arm", "hy", "ibo", "ig", "ice", "is",
+ "isl", "is", "ido", "io", "iii", "ii", "iku", "iu", "ile", "ie", "ina", "ia", "ind", "id",
+ "ipk", "ik", "isl", "is", "ice", "is", "ita", "it", "jav", "jv", "jpn", "ja", "kal", "kl",
+ "kan", "kn", "kas", "ks", "kat", "ka", "geo", "ka", "kau", "kr", "kaz", "kk", "khm", "km",
+ "kik", "ki", "kin", "rw", "kir", "ky", "kom", "kv", "kon", "kg", "kor", "ko", "kua", "kj",
+ "kur", "ku", "lao", "lo", "lat", "la", "lav", "lv", "lim", "li", "lin", "ln", "lit", "lt",
+ "ltz", "lb", "lub", "lu", "lug", "lg", "mac", "mk", "mkd", "mk", "mah", "mh", "mal", "ml",
+ "mao", "mi", "mri", "mi", "mar", "mr", "may", "ms", "msa", "ms", "mkd", "mk", "mac", "mk",
+ "mlg", "mg", "mlt", "mt", "mol", "mo", "mon", "mn", "mri", "mi", "mao", "mi", "msa", "ms",
+ "may", "ms", "mya", "my", "bur", "my", "nau", "na", "nav", "nv", "nbl", "nr", "nde", "nd",
+ "ndo", "ng", "nep", "ne", "nld", "nl", "dut", "nl", "nno", "nn", "nob", "nb", "nor", "no",
+ "nya", "ny", "oci", "oc", "oji", "oj", "ori", "or", "orm", "om", "oss", "os", "pan", "pa",
+ "per", "fa", "fas", "fa", "pli", "pi", "pol", "pl", "por", "pt", "pus", "ps", "que", "qu",
+ "roh", "rm", "ron", "ro", "rum", "ro", "rum", "ro", "ron", "ro", "run", "rn", "rus", "ru",
+ "sag", "sg", "san", "sa", "scc", "sr", "srp", "sr", "scr", "hr", "hrv", "hr", "sin", "si",
+ "slk", "sk", "slo", "sk", "slo", "sk", "slk", "sk", "slv", "sl", "sme", "se", "smo", "sm",
+ "sna", "sn", "snd", "sd", "som", "so", "sot", "st", "spa", "es", "sqi", "sq", "alb", "sq",
+ "srd", "sc", "srp", "sr", "scc", "sr", "ssw", "ss", "sun", "su", "swa", "sw", "swe", "sv",
+ "tah", "ty", "tam", "ta", "tat", "tt", "tel", "te", "tgk", "tg", "tgl", "tl", "tha", "th",
+ "tib", "bo", "bod", "bo", "tir", "ti", "ton", "to", "tsn", "tn", "tso", "ts", "tuk", "tk",
+ "tur", "tr", "twi", "tw", "uig", "ug", "ukr", "uk", "urd", "ur", "uzb", "uz", "ven", "ve",
+ "vie", "vi", "vol", "vo", "wel", "cy", "cym", "cy", "wln", "wa", "wol", "wo", "xho", "xh",
+ "yid", "yi", "yor", "yo", "zha", "za", "zho", "zh", "chi", "zh", "zul", "zu",
+ 0, 0 };
+
+static XMP_StringPtr Lookup2LetterLang ( XMP_StringPtr lang3 )
+{
+
+ for ( size_t i = 0; kKnownLangs[i] != 0; i += 2 ) {
+ if ( XMP_LitMatch ( lang3, kKnownLangs[i] ) ) return kKnownLangs[i+1];
+ }
+
+ return lang3; // Not found, return the input.
+
+} // Lookup2LetterLang
+
+// =================================================================================================
+// MPEG4_CheckFormat
+// =================
+//
+// An MPEG-4 file is an instance of an ISO Base Media file, ISO 14496-12 and -14. An MPEG-4 file
+// must begin with an 'ftyp' box containing 'mp41', 'mp42', or 'f4v ' in the compatible brands.
+//
+// The 'ftyp' box structure is:
+//
+// 0 4 uns32 box size, 0 means "to EoF"
+// 4 4 uns32 box type, 'ftyp'
+// 8 8 uns64 box size, if uns32 size is 1
+// - 4 uns32 major brand
+// - 4 uns32 minor version
+// - * uns32 sequence of compatible brands, to the end of the box
+//
+// All integers are big endian.
+
+bool MPEG4_CheckFormat ( XMP_FileFormat format,
+ XMP_StringPtr filePath,
+ LFA_FileRef fileRef,
+ XMPFiles* parent )
+{
+ XMP_Uns8 buffer [4096];
+ XMP_Uns32 ioCount, brandCount, brandOffset, id;
+ XMP_Uns64 fileSize, boxSize;
+
+ // Do some basic header checks, figure out how many compatible brands are listed.
+
+ fileSize = LFA_Measure ( fileRef );
+
+ LFA_Seek ( fileRef, 0, SEEK_SET );
+ ioCount = LFA_Read ( fileRef, buffer, 16 ); // Read to the compatible brands, assuming a 32-bit size.
+ if ( ioCount < 16 ) return false;
+
+ id = Get4CharCode ( &buffer[4] ); // Is the first box an 'ftyp' box?
+ if ( id != kBE_ftyp ) return false;
+
+ boxSize = GetUns32BE ( &buffer[0] ); // Get the box length.
+ brandOffset = 16;
+
+ if ( boxSize == 0 ) {
+ boxSize = fileSize;
+ } else if ( boxSize == 1 ) {
+ boxSize = GetUns64BE ( &buffer[8] );
+ LFA_Seek ( fileRef, 24, SEEK_SET ); // Seek to the compatible brands.
+ brandOffset = 24;
+ }
+
+ if ( (boxSize < brandOffset) || (boxSize > fileSize) ||
+ ((boxSize & 0x3) != 0) || (boxSize > 4024) ) return false; // Sanity limit of 1000 brands.
+
+ // Look for the 'mp41', 'mp42', of 'f4v ' compatible brands.
+
+ brandCount = (XMP_Uns32)( (boxSize - brandOffset) / 4 );
+ while ( brandCount > 0 ) {
+
+ XMP_Uns32 clumpSize = brandCount * 4;
+ if ( clumpSize > sizeof(buffer) ) clumpSize = sizeof(buffer);
+ ioCount = LFA_Read ( fileRef, buffer, clumpSize );
+ if ( ioCount < clumpSize ) return false;
+
+ for ( XMP_Uns32 i = 0; i < clumpSize; i += 4 ) {
+ id = Get4CharCode ( &buffer[i] );
+ if ( (id == kBE_mp41) || (id == kBE_mp42) || (id == kBE_f4v) ) return true;
+ }
+
+ brandCount -= clumpSize/4;
+
+ }
+
+ return false;
+
+} // MPEG4_CheckFormat
+
+// =================================================================================================
+// MPEG4_MetaHandlerCTor
+// =====================
+
+XMPFileHandler * MPEG4_MetaHandlerCTor ( XMPFiles * parent )
+{
+
+ return new MPEG4_MetaHandler ( parent );
+
+} // MPEG4_MetaHandlerCTor
+
+// =================================================================================================
+// MPEG4_MetaHandler::MPEG4_MetaHandler
+// ====================================
+
+MPEG4_MetaHandler::MPEG4_MetaHandler ( XMPFiles * _parent ) : xmpBoxPos(0)
+{
+
+ this->parent = _parent; // Inherited, can't set in the prefix.
+ this->handlerFlags = kMPEG4_HandlerFlags;
+ this->stdCharForm = kXMP_Char8Bit;
+
+} // MPEG4_MetaHandler::MPEG4_MetaHandler
+
+// =================================================================================================
+// MPEG4_MetaHandler::~MPEG4_MetaHandler
+// =====================================
+
+MPEG4_MetaHandler::~MPEG4_MetaHandler()
+{
+
+ // Nothing to do yet.
+
+} // MPEG4_MetaHandler::~MPEG4_MetaHandler
+
+// =================================================================================================
+// GetBoxInfo
+// ==========
+//
+// Seek to the start of a box and extract the type and size, split the size into header and content
+// portions. Leave the file positioned at the first byte of content.
+
+// ! We're returning the content size, not the raw (full) MPEG-4 box size!
+
+static void GetBoxInfo ( LFA_FileRef fileRef, XMP_Uns64 fileSize, XMP_Uns64 boxPos,
+ XMP_Uns32 * boxType, XMP_Uns64 * headerSize, XMP_Uns64 * contentSize )
+{
+ XMP_Uns8 buffer [8];
+ XMP_Uns32 u32Size;
+
+ LFA_Seek ( fileRef, boxPos, SEEK_SET );
+ (void) LFA_Read ( fileRef, buffer, 8, kLFA_RequireAll );
+
+ u32Size = GetUns32BE ( &buffer[0] );
+ *boxType = Get4CharCode ( &buffer[4] );
+
+ if ( u32Size > 1 ) {
+ *headerSize = 8; // Normal explicit size case.
+ *contentSize = u32Size - 8;
+ } else if ( u32Size == 0 ) {
+ *headerSize = 8; // The box goes to EoF.
+ *contentSize = fileSize - (boxPos + 8);
+ } else {
+ XMP_Uns64 u64Size; // Have a 64-bit size.
+ (void) LFA_Read ( fileRef, &u64Size, 8, kLFA_RequireAll );
+ u64Size = MakeUns64BE ( u64Size );
+ *headerSize = 16;
+ *contentSize = u64Size - 16;
+ }
+
+} // GetBoxInfo
+
+// =================================================================================================
+// MPEG4_MetaHandler::CacheFileData
+// ================================
+//
+// The XMP in MPEG-4 is in a top level XMP 'uuid' box. Legacy metadata might be found in 2 places,
+// the 'moov'/'mvhd' box, and the 'moov'/'udta'/'cprt' boxes. There is at most 1 each of the 'moov',
+// 'mvhd' and 'udta' boxes. There are any number of 'cprt' boxes, including none. The 'udta' box can
+// be large, so don't cache all of it.
+
+void MPEG4_MetaHandler::CacheFileData()
+{
+ XMP_Assert ( (! this->containsXMP) && (! this->containsTNail) );
+
+ LFA_FileRef fileRef = this->parent->fileRef;
+
+ XMP_AbortProc abortProc = this->parent->abortProc;
+ void * abortArg = this->parent->abortArg;
+ const bool checkAbort = (abortProc != 0);
+
+ XMP_Uns64 fileSize = LFA_Measure ( fileRef );
+ XMP_Uns64 outerPos, outerSize, hSize, cSize;
+ XMP_Uns32 boxType;
+
+ // The outer loop looks for the top level 'moov' and 'uuid'/XMP boxes.
+
+ bool moovFound = false;
+ if ( this->parent->openFlags & kXMPFiles_OpenOnlyXMP ) moovFound = true; // Ignore legacy.
+
+ for ( outerPos = 0; (outerPos < fileSize) && ((! this->containsXMP) || (! moovFound)); outerPos += outerSize ) {
+
+ if ( checkAbort && abortProc(abortArg) ) {
+ XMP_Throw ( "MPEG4_MetaHandler::CacheFileData - User abort", kXMPErr_UserAbort );
+ }
+
+ GetBoxInfo ( fileRef, fileSize, outerPos, &boxType, &hSize, &cSize );
+ outerSize = hSize + cSize;
+
+ if ( (! this->containsXMP) && (boxType == kBE_uuid) ) {
+
+ XMP_Uns8 uuid [16];
+ LFA_Read ( fileRef, uuid, 16, kLFA_RequireAll );
+
+ if ( memcmp ( uuid, kBE_xmpUUID, 16 ) == 0 ) {
+
+ // Found the XMP, record the offset and size, read the packet.
+
+ this->containsXMP = true;
+ this->xmpBoxPos = outerPos;
+ this->packetInfo.offset = outerPos + hSize + 16;
+ this->packetInfo.length = (XMP_Int32) (cSize - 16);
+
+ this->xmpPacket.reserve ( this->packetInfo.length );
+ this->xmpPacket.assign ( this->packetInfo.length, ' ' );
+ LFA_Read ( fileRef, (void*)this->xmpPacket.data(), this->packetInfo.length, kLFA_RequireAll );
+
+ }
+
+ } else if ( (! moovFound) && (boxType == kBE_moov) ) {
+
+ // The middle loop loop looks for the 'moov'/'mvhd' and 'moov'/'udta' boxes.
+
+ moovFound = true;
+
+ XMP_Uns64 middleStart = outerPos + hSize;
+ XMP_Uns64 middleEnd = outerPos + outerSize;
+ XMP_Uns64 middlePos, middleSize;
+
+ bool mvhdFound = false, udtaFound = false;
+
+ for ( middlePos = middleStart; (middlePos < middleEnd) && ((! mvhdFound) || (! udtaFound)); middlePos += middleSize ) {
+
+ if ( checkAbort && abortProc(abortArg) ) {
+ XMP_Throw ( "MPEG4_MetaHandler::CacheFileData - User abort", kXMPErr_UserAbort );
+ }
+
+ GetBoxInfo ( fileRef, fileSize, middlePos, &boxType, &hSize, &cSize );
+ middleSize = hSize + cSize;
+
+ if ( (! mvhdFound) && (boxType == kBE_mvhd) ) {
+
+ // Save the entire 'moov'/'mvhd' box content, it isn't very big.
+ mvhdFound = true;
+ this->mvhdBox.reserve ( (size_t)cSize );
+ this->mvhdBox.assign ( (size_t)cSize, ' ' );
+ LFA_Read ( fileRef, (void*)this->mvhdBox.data(), (XMP_Int32)cSize, kLFA_RequireAll );
+
+ } else if ( (! udtaFound) && (boxType == kBE_udta) ) {
+
+ // The inner loop looks for the 'moov'/'udta'/'cprt' boxes.
+
+ udtaFound = true;
+ XMP_Uns64 innerStart = middlePos + hSize;
+ XMP_Uns64 innerEnd = middlePos + middleSize;
+ XMP_Uns64 innerPos, innerSize;
+
+ for ( innerPos = innerStart; innerPos < innerEnd; innerPos += innerSize ) {
+
+ if ( checkAbort && abortProc(abortArg) ) {
+ XMP_Throw ( "MPEG4_MetaHandler::CacheFileData - User abort", kXMPErr_UserAbort );
+ }
+
+ GetBoxInfo ( fileRef, fileSize, innerPos, &boxType, &hSize, &cSize );
+ innerSize = hSize + cSize;
+ if ( boxType != kBE_cprt ) continue;
+
+ // ! Actually capturing structured data - the 'cprt' box content.
+ this->cprtBoxes.push_back ( std::string() );
+ std::string & newCprt = this->cprtBoxes.back();
+ newCprt.reserve ( (size_t)cSize );
+ newCprt.assign ( (size_t)cSize, ' ' );
+ LFA_Read ( fileRef, (void*)newCprt.data(), (XMP_Int32)cSize, kLFA_RequireAll );
+
+ } // inner loop
+
+ } // 'moov'/'udta' box
+
+ } // middle loop
+
+ } // 'moov' box
+
+ } // outer loop
+
+} // MPEG4_MetaHandler::CacheFileData
+
+// =================================================================================================
+// MPEG4_MetaHandler::MakeLegacyDigest
+// ===================================
+
+// *** Will need updating if we process the 'ilst' metadata.
+
+#define kHexDigits "0123456789ABCDEF"
+
+void MPEG4_MetaHandler::MakeLegacyDigest ( std::string * digestStr )
+{
+ MD5_CTX context;
+ unsigned char digestBin [16];
+ MD5Init ( &context );
+
+ MD5Update ( &context, (XMP_Uns8*)this->mvhdBox.c_str(), (unsigned int) this->mvhdBox.size() );
+
+ for ( size_t i = 0, limit = this->cprtBoxes.size(); i < limit; ++i ) {
+ const std::string & currCprt = this->cprtBoxes[i];
+ MD5Update ( &context, (XMP_Uns8*)currCprt.c_str(), (unsigned int) currCprt.size() );
+ }
+
+ MD5Final ( digestBin, &context );
+
+ char buffer [40];
+ for ( int in = 0, out = 0; in < 16; in += 1, out += 2 ) {
+ XMP_Uns8 byte = digestBin[in];
+ buffer[out] = kHexDigits [ byte >> 4 ];
+ buffer[out+1] = kHexDigits [ byte & 0xF ];
+ }
+ buffer[32] = 0;
+ digestStr->erase();
+ digestStr->append ( buffer, 32 );
+
+} // MPEG4_MetaHandler::MakeLegacyDigest
+
+// =================================================================================================
+
+struct MVHD_v1 { // v1 v0 - offsets within the content portion of the 'mvhd' box
+ XMP_Uns8 version; // 0 0
+ XMP_Uns8 flags [3]; // 1 1
+ XMP_Uns64 creationTime; // 4 4 - Uns32 in v0
+ XMP_Uns64 modificationTime; // 12 8 - Uns32 in v0
+ XMP_Uns32 timescale; // 20 12
+ XMP_Uns64 duration; // 24 16 - Uns32 in v0
+ XMP_Int32 rate; // 32 20
+ XMP_Int16 volume; // 36 24
+ XMP_Uns16 pad_1; // 38 26
+ XMP_Uns32 pad_2, pad_3; // 40 28
+ XMP_Int32 matrix [9]; // 48 36
+ XMP_Uns32 preDef [6]; // 84 72
+ XMP_Uns32 nextTrackID; // 108 96
+}; // 112 100
+
+static void ExtractMVHD_v0 ( XMP_Uns8 * buffer, MVHD_v1 * mvhd ) // Always convert to the v1 form.
+{
+ mvhd->version = buffer[0];
+ mvhd->flags[0] = buffer[1];
+ mvhd->flags[1] = buffer[2];
+ mvhd->flags[2] = buffer[3];
+ mvhd->creationTime = GetUns32BE ( &buffer[ 4] );
+ mvhd->modificationTime = GetUns32BE ( &buffer[ 8] );
+ mvhd->timescale = GetUns32BE ( &buffer[12] );
+ mvhd->duration = GetUns32BE ( &buffer[16] );
+ mvhd->rate = GetUns32BE ( &buffer[20] );
+ mvhd->volume = GetUns16BE ( &buffer[24] );
+ mvhd->pad_1 = GetUns16BE ( &buffer[26] );
+ mvhd->pad_2 = GetUns32BE ( &buffer[28] );
+ mvhd->pad_3 = GetUns32BE ( &buffer[32] );
+ for ( int i = 0, j = 36; i < 9; ++i, j += 4 ) mvhd->matrix[i] = GetUns32BE ( &buffer[j] );
+ for ( int i = 0, j = 72; i < 6; ++i, j += 4 ) mvhd->preDef[i] = GetUns32BE ( &buffer[j] );
+ mvhd->nextTrackID = GetUns32BE ( &buffer[96] );
+}
+
+static void ExtractMVHD_v1 ( XMP_Uns8 * buffer, MVHD_v1 * mvhd )
+{
+ mvhd->version = buffer[0];
+ mvhd->flags[0] = buffer[1];
+ mvhd->flags[1] = buffer[2];
+ mvhd->flags[2] = buffer[3];
+ mvhd->creationTime = GetUns64BE ( &buffer[ 4] );
+ mvhd->modificationTime = GetUns64BE ( &buffer[12] );
+ mvhd->timescale = GetUns32BE ( &buffer[20] );
+ mvhd->duration = GetUns64BE ( &buffer[24] );
+ mvhd->rate = GetUns32BE ( &buffer[32] );
+ mvhd->volume = GetUns16BE ( &buffer[36] );
+ mvhd->pad_1 = GetUns16BE ( &buffer[38] );
+ mvhd->pad_2 = GetUns32BE ( &buffer[40] );
+ mvhd->pad_3 = GetUns32BE ( &buffer[44] );
+ for ( int i = 0, j = 48; i < 9; ++i, j += 4 ) mvhd->matrix[i] = GetUns32BE ( &buffer[j] );
+ for ( int i = 0, j = 84; i < 6; ++i, j += 4 ) mvhd->preDef[i] = GetUns32BE ( &buffer[j] );
+ mvhd->nextTrackID = GetUns32BE ( &buffer[108] );
+}
+
+// =================================================================================================
+// MPEG4_MetaHandler::ProcessXMP
+// =============================
+
+#define kAlmostMaxSeconds 0x7FFFFF00
+
+void MPEG4_MetaHandler::ProcessXMP()
+{
+ if ( this->processedXMP ) return;
+ this->processedXMP = true; // Make sure only called once.
+
+ if ( this->containsXMP ) {
+ FillPacketInfo ( this->xmpPacket, &this->packetInfo );
+ this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() );
+ }
+
+ if ( this->mvhdBox.empty() && this->cprtBoxes.empty() ) return; // No legacy, we're done.
+
+ std::string oldDigest;
+ bool oldDigestFound = this->xmpObj.GetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "MPEG-4", &oldDigest, 0 );
+
+ if ( oldDigestFound ) {
+ std::string newDigest;
+ this->MakeLegacyDigest ( &newDigest );
+ if ( oldDigest == newDigest ) return; // No legacy changes.
+ }
+
+ // If we get here we need to import the legacy metadata. Either there is no old digest in the
+ // XMP, or the digests differ. In the former case keep any existing XMP, in the latter case take
+ // new legacy values. So, oldDigestFound means digestsDiffer, else we would have returned.
+
+ // *** The "official" MPEG-4 metadata might not be very interesting. It looks like the 'ilst'
+ // *** metadata (invented by Apple?) is more interesting. There appears to be no official
+ // *** documentation.
+
+ if ( ! this->mvhdBox.empty() ) {
+
+ MVHD_v1 mvhd;
+ XMP_DateTime xmpDate;
+
+ if ( this->mvhdBox.size() == 100 ) { // *** Should check the version - extract to a static function.
+ ExtractMVHD_v0 ( (XMP_Uns8*)(this->mvhdBox.data()), &mvhd );
+ } else if ( this->mvhdBox.size() == 112 ) {
+ ExtractMVHD_v1 ( (XMP_Uns8*)(this->mvhdBox.data()), &mvhd );
+ }
+
+ if ( oldDigestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_XMP, "CreateDate" )) ) {
+ if ( (mvhd.creationTime >> 32) < 0xFF ) { // Sanity check for bogus date info.
+
+ memset ( &xmpDate, 0, sizeof(xmpDate) ); // AUDIT: Using sizeof(xmpDate) is safe.
+ xmpDate.year = 1904; // Start at midnight, January 1 1904, UTC
+ xmpDate.month = 1; // ! Note that the XMP binary fields are signed to allow
+ xmpDate.day = 1; // ! offsets and normalization in both directions.
+
+ while ( mvhd.creationTime > kAlmostMaxSeconds ) {
+ xmpDate.second += kAlmostMaxSeconds;
+ SXMPUtils::ConvertToUTCTime ( &xmpDate ); // ! For the normalization side effect.
+ mvhd.creationTime -= kAlmostMaxSeconds;
+ }
+ xmpDate.second += (XMP_Uns32)mvhd.creationTime;
+ SXMPUtils::ConvertToUTCTime ( &xmpDate ); // ! For the normalization side effect.
+
+ this->xmpObj.SetProperty_Date ( kXMP_NS_XMP, "CreateDate", xmpDate );
+ this->containsXMP = true;
+
+ }
+ }
+
+ if ( oldDigestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_XMP, "ModifyDate" )) ) {
+ if ( (mvhd.modificationTime >> 32) < 0xFF ) { // Sanity check for bogus date info.
+
+ memset ( &xmpDate, 0, sizeof(xmpDate) ); // AUDIT: Using sizeof(xmpDate) is safe.
+ xmpDate.year = 1904; // Start at midnight, January 1 1904, UTC
+ xmpDate.month = 1;
+ xmpDate.day = 1;
+
+ while ( mvhd.modificationTime > kAlmostMaxSeconds ) {
+ xmpDate.second += kAlmostMaxSeconds;
+ SXMPUtils::ConvertToUTCTime ( &xmpDate ); // ! For the normalization side effect.
+ mvhd.modificationTime -= kAlmostMaxSeconds;
+ }
+ xmpDate.second += (XMP_Uns32)mvhd.modificationTime;
+ SXMPUtils::ConvertToUTCTime ( &xmpDate ); // ! For the normalization side effect.
+
+ this->xmpObj.SetProperty_Date ( kXMP_NS_XMP, "ModifyDate", xmpDate );
+ this->containsXMP = true;
+
+ }
+ }
+
+ if ( oldDigestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DM, "duration" )) ) {
+ if ( mvhd.timescale != 0 ) { // Avoid 1/0 for the scale field.
+ char buffer [32]; // A 64-bit number is at most 20 digits.
+ this->xmpObj.DeleteProperty ( kXMP_NS_DM, "duration" ); // Delete the whole struct.
+ snprintf ( buffer, sizeof(buffer), "%llu", mvhd.duration ); // AUDIT: The buffer is big enough.
+ this->xmpObj.SetStructField ( kXMP_NS_DM, "duration", kXMP_NS_DM, "value", &buffer[0] );
+ snprintf ( buffer, sizeof(buffer), "1/%u", mvhd.timescale ); // AUDIT: The buffer is big enough.
+ this->xmpObj.SetStructField ( kXMP_NS_DM, "duration", kXMP_NS_DM, "scale", &buffer[0] );
+ this->containsXMP = true;
+ }
+ }
+
+ }
+
+ if ( oldDigestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DC, "rights" )) ) {
+
+ std::string tempStr;
+ char lang3 [4]; // The unpacked ISO-639-2/T language code.
+ lang3[3] = 0;
+
+ for ( size_t i = 0, limit = this->cprtBoxes.size(); i < limit; ++i ) {
+ if ( this->cprtBoxes[i].size() < 7 ) continue;
+
+ const XMP_Uns8 * currCprt = (XMP_Uns8*) (this->cprtBoxes[i].c_str()); // ! Actually structured data!
+ size_t rawLen = this->cprtBoxes[i].size() - 6;
+ if ( currCprt[0] != 0 ) continue; // Only proceed for version 0, ignore the flags.
+
+ XMP_Uns16 packedLang = GetUns16BE ( &currCprt[4] );
+ lang3[0] = (packedLang >> 10) | 0x60;
+ lang3[1] = ((packedLang >> 5) & 0x1F) | 0x60;
+ lang3[2] = (packedLang & 0x1F) | 0x60;
+
+ XMP_StringPtr xmpLang = Lookup2LetterLang ( lang3 );
+ XMP_StringPtr xmpValue = (XMP_StringPtr) &currCprt[6];
+
+ if ( (rawLen >= 8) && (GetUns16BE ( xmpValue ) == 0xFEFF) ) {
+ FromUTF16 ( (UTF16Unit*)xmpValue, rawLen/2, &tempStr, true /* big endian */ );
+ xmpValue = tempStr.c_str();
+ }
+
+ this->xmpObj.SetLocalizedText ( kXMP_NS_DC, "rights", xmpLang, "", xmpValue );
+ this->containsXMP = true;
+
+ }
+
+ }
+
+} // MPEG4_MetaHandler::ProcessXMP
+
+// =================================================================================================
+// MPEG4_MetaHandler::PickNewLocation
+// ==================================
+//
+// Pick a new location for the XMP. This is the first available 'free' space before any 'mdat' box,
+// otherwise the end of the file. Any existing XMP 'uuid' box has already been marked as 'free'.
+
+void MPEG4_MetaHandler::PickNewLocation()
+{
+ LFA_FileRef fileRef = this->parent->fileRef;
+ XMP_Uns64 fileSize = LFA_Measure ( fileRef );
+
+ XMP_Uns32 xmpBoxSize = 4+4+16 + (XMP_Uns32)this->xmpPacket.size();
+
+ XMP_Uns64 currPos, prevPos; // Info about the most recent 2 boxes.
+ XMP_Uns32 currType, prevType;
+ XMP_Uns64 currSize, prevSize, hSize, cSize;
+
+ XMP_Uns32 be32Size;
+ XMP_Uns64 be64Size;
+
+ XMP_AbortProc abortProc = this->parent->abortProc;
+ void * abortArg = this->parent->abortArg;
+ const bool checkAbort = (abortProc != 0);
+
+ bool pastMDAT = false;
+
+ currType = 0;
+ prevPos = prevSize = currSize = 0;
+ for ( currPos = 0; currPos < fileSize; currPos += currSize ) {
+
+ if ( checkAbort && abortProc(abortArg) ) {
+ XMP_Throw ( "MPEG4_MetaHandler::UpdateFile - User abort", kXMPErr_UserAbort );
+ }
+
+ prevPos += prevSize; // ! We'll go through at least once, the first box is 'ftyp'.
+ prevType = currType; // ! Care is needed to preserve the prevBox and currBox info when
+ prevSize = currSize; // ! the loop exits because it hits EoF.
+ XMP_Assert ( (prevPos + prevSize) == currPos );
+
+ GetBoxInfo ( fileRef, fileSize, currPos, &currType, &hSize, &cSize );
+ currSize = hSize + cSize;
+
+ if ( pastMDAT ) continue; // Keep scanning to the end of the file.
+ if ( currType == kBE_mdat ) pastMDAT = true;
+ if ( currType != kBE_free ) continue;
+ if ( currSize >= xmpBoxSize ) break;
+
+ if ( prevType == kBE_free ) {
+ // If we get here the prevBox and currBox are both 'free' and neither big enough alone.
+ // Pretend to combine them for this check and for possible following checks. We don't
+ // really compbine them, we just remember the start and total length.
+ currPos = prevPos;
+ currSize += prevSize;
+ prevSize = 0; // ! For the start of the next loop pass.
+ if ( currSize >= xmpBoxSize ) break;
+ }
+
+ }
+
+ if ( currPos < fileSize ) {
+
+ // Put the XMP at the start of the 'free' space. Increase the size of the XMP if the excess
+ // is less than 8 bytes, otherwise write a new 'free' box header.
+
+ this->xmpBoxPos = currPos;
+ XMP_Assert ( (currType == kBE_free) && (currSize >= xmpBoxSize) );
+
+ XMP_Uns64 excessSpace = currSize - xmpBoxSize;
+ if ( excessSpace < 8 ) {
+ this->xmpPacket.append ( (size_t)excessSpace, ' ' );
+ } else {
+ LFA_Seek ( fileRef, (currPos + xmpBoxSize), SEEK_SET );
+ if ( excessSpace <= 0xFFFFFFFFULL ) {
+ be32Size = MakeUns32BE ( (XMP_Uns32)excessSpace );
+ LFA_Write ( fileRef, &be32Size, 4 );
+ LFA_Write ( fileRef, &kBE_free, 4 );
+ } else {
+ be32Size = MakeUns32BE ( 1 );
+ be64Size = MakeUns64BE ( excessSpace );
+ LFA_Write ( fileRef, &be32Size, 4 );
+ LFA_Write ( fileRef, &kBE_free, 4 );
+ LFA_Write ( fileRef, &be64Size, 8 );
+ }
+ }
+
+ } else {
+
+ // Appending the XMP, make sure the current final box has an explicit size.
+
+ this->xmpBoxPos = fileSize;
+ XMP_Assert ( currPos == fileSize );
+
+ currPos -= currSize; // Move back to the final box's origin.
+ LFA_Seek ( fileRef, currPos, SEEK_SET );
+ LFA_Read ( fileRef, &be32Size, 4, kLFA_RequireAll );
+ be32Size = MakeUns32BE ( be32Size );
+
+ if ( be32Size == 0 ) {
+
+ // The current final box is "to-EoF", we need to write the actual size. If the size fits
+ // in 32 bits then we just set it in the leading Uns32 field instead of the "to-EoF"
+ // value. Otherwise we have to insert a 64-bit size. If the previous box is 'free' then
+ // we take 8 bytes from the end of it, shift the size/type parts of the final box up 8
+ // bytes, making space for the 64-bit size. Give up if the previous box is not 'free'.
+
+ if ( currSize <= 0xFFFFFFFFULL ) {
+
+ // The size fits in 32 bits, reuse the leading Uns32 size.
+ be32Size = MakeUns32BE ( (XMP_Uns32)currSize );
+ LFA_Seek ( fileRef, currPos, SEEK_SET );
+ LFA_Write ( fileRef, &be32Size, 4 );
+
+ } else if ( prevType != kBE_free ) {
+
+ // We need to insert a 64-bit size, but the previous box is not 'free'.
+ XMP_Throw ( "MPEG4_MetaHandler::PickNewLocation - Can't set box size", kXMPErr_ExternalFailure );
+
+ } else if ( prevSize == 8 ) {
+
+ // Absorb the whole free box.
+ LFA_Seek ( fileRef, prevPos, SEEK_SET );
+ be32Size = MakeUns32BE ( 1 );
+ LFA_Write ( fileRef, &be32Size, 4 );
+ LFA_Write ( fileRef, &currType, 4 );
+ be64Size = MakeUns64BE ( currSize );
+ LFA_Write ( fileRef, &be64Size, 8 );
+
+ } else {
+
+ // Trim 8 bytes off the end of the free box.
+
+ prevSize -= 8;
+
+ LFA_Seek ( fileRef, prevPos, SEEK_SET );
+ LFA_Read ( fileRef, &be32Size, 4, kLFA_RequireAll );
+ if ( be32Size != MakeUns32BE ( 1 ) ) {
+ be32Size = MakeUns32BE ( (XMP_Uns32)prevSize );
+ LFA_Seek ( fileRef, prevPos, SEEK_SET );
+ LFA_Write ( fileRef, &be32Size, 4 );
+ } else {
+ be64Size = MakeUns64BE ( prevSize );
+ LFA_Seek ( fileRef, (prevPos + 8), SEEK_SET );
+ LFA_Write ( fileRef, &be64Size, 8 );
+ }
+
+ LFA_Seek ( fileRef, (currPos - 8), SEEK_SET );
+ be32Size = MakeUns32BE ( 1 );
+ LFA_Write ( fileRef, &be32Size, 4 );
+ LFA_Write ( fileRef, &currType, 4 );
+ be64Size = MakeUns64BE ( currSize );
+ LFA_Write ( fileRef, &be64Size, 8 );
+
+ }
+
+ }
+
+ }
+
+} // MPEG4_MetaHandler::PickNewLocation
+
+// =================================================================================================
+// MPEG4_MetaHandler::UpdateFile
+// =============================
+
+// *** There are no writebacks to legacy metadata yet. We need to resolve the questions about
+// *** standard MPEG-4 metadata versus 'ilst' metadata.
+
+// *** The current logic for the XMP is simple. Use the existing XMP if it is big enough, next look
+// *** for 'free' space before any 'mdat' boxes, finally append to the end.
+
+// ! MPEG-4 can be indexed with absolute offsets, only the 'moov' and XMP 'uuid' boxes can be moved!
+
+void MPEG4_MetaHandler::UpdateFile ( bool doSafeUpdate )
+{
+ if ( ! this->needsUpdate ) return;
+ this->needsUpdate = false; // Make sure only called once.
+ XMP_Assert ( ! doSafeUpdate ); // This should only be called for "unsafe" updates.
+
+ XMP_AbortProc abortProc = this->parent->abortProc;
+ void * abortArg = this->parent->abortArg;
+ const bool checkAbort = (abortProc != 0);
+
+ LFA_FileRef fileRef = this->parent->fileRef;
+ XMP_Uns64 fileSize = LFA_Measure ( fileRef );
+
+ XMP_Uns32 be32Size;
+
+ // Make sure the XMP has a current legacy digest.
+ std::string newDigest;
+ this->MakeLegacyDigest ( &newDigest );
+ this->xmpObj.SetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "MPEG-4", newDigest.c_str(), kXMP_DeleteExisting );
+ XMP_StringLen xmpLen = (XMP_StringLen)this->xmpPacket.size();
+ try {
+ this->xmpObj.SerializeToBuffer ( &this->xmpPacket, (kXMP_UseCompactFormat | kXMP_ExactPacketLength), xmpLen );
+ } catch ( ... ) {
+ this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat );
+ }
+
+ #if XMP_DebugBuild // Sanity check that the XMP is where we think it is.
+
+ if ( this->xmpBoxPos != 0 ) {
+
+ XMP_Uns32 boxType;
+ XMP_Uns64 hSize, cSize;
+ XMP_Uns8 uuid [16];
+
+ GetBoxInfo ( fileRef, LFA_Measure ( fileRef ), this->xmpBoxPos, &boxType, &hSize, &cSize );
+ LFA_Read ( fileRef, uuid, 16, kLFA_RequireAll );
+
+ if ( ((this->xmpBoxPos + hSize + 16) != (XMP_Uns64)this->packetInfo.offset) ||
+ ((cSize - 16) != (XMP_Uns64)this->packetInfo.length) ||
+ (boxType != kBE_uuid) || (memcmp ( uuid, kBE_xmpUUID, 16 ) != 0) ) {
+ XMP_Throw ( "Inaccurate MPEG-4 packet info", kXMPErr_InternalFailure );
+ }
+
+ }
+
+ #endif
+
+ if ( (this->xmpBoxPos != 0) && (this->xmpPacket.size() <= (size_t)this->packetInfo.length) ) {
+
+ // Update existing XMP in-place.
+
+ if ( this->xmpPacket.size() < (size_t)this->packetInfo.length ) {
+ // They ought to match, cheap to be sure.
+ size_t extraSpace = (size_t)this->packetInfo.length - this->xmpPacket.size();
+ this->xmpPacket.append ( extraSpace, ' ' );
+ }
+
+ XMP_Assert ( this->xmpPacket.size() == (size_t)this->packetInfo.length );
+ LFA_Seek ( fileRef, this->packetInfo.offset, SEEK_SET );
+ LFA_Write ( fileRef, this->xmpPacket.data(), (XMP_Int32)this->xmpPacket.size() );
+
+ } else if ( (this->xmpBoxPos != 0) &&
+ ((XMP_Uns64)(this->packetInfo.offset + this->packetInfo.length) == fileSize) ) {
+
+ // The XMP is already at the end of the file, rewrite the whole 'uuid' box.
+
+ XMP_Assert ( this->xmpPacket.size() > (size_t)this->packetInfo.length );
+
+ LFA_Seek ( fileRef, this->xmpBoxPos, SEEK_SET );
+ be32Size = MakeUns32BE ( 4+4+16 + (XMP_Uns32)this->xmpPacket.size() ); // ! XMP must be 4GB or less!
+ LFA_Write ( fileRef, &be32Size, 4 );
+ LFA_Write ( fileRef, &kBE_uuid, 4 );
+ LFA_Write ( fileRef, &kBE_xmpUUID, 16 );
+ LFA_Write ( fileRef, this->xmpPacket.data(), (XMP_Int32)this->xmpPacket.size() );
+
+ } else {
+
+ // We are injecting first time XMP, or making the existing XMP larger. Pick a new location
+ // for the XMP. This is the first available space before any 'mdat' box, otherwise the end
+ // of the file. Available space can be any contiguous combination of 'free' space with the
+ // existing XMP. Mark any existing XMP as 'free' first, this simplifies the logic and we
+ // can't do it later since we might reuse the space.
+
+ if ( this->xmpBoxPos != 0 ) {
+ LFA_Seek ( fileRef, (this->xmpBoxPos + 4), SEEK_SET );
+ LFA_Write ( fileRef, "free", 4 );
+ }
+
+ this->PickNewLocation(); // ! Might increase the size of the XMP packet.
+
+ LFA_Seek ( fileRef, this->xmpBoxPos, SEEK_SET );
+ be32Size = MakeUns32BE ( 4+4+16 + (XMP_Uns32)this->xmpPacket.size() ); // ! XMP must be 4GB or less!
+ LFA_Write ( fileRef, &be32Size, 4 );
+ LFA_Write ( fileRef, &kBE_uuid, 4 );
+ LFA_Write ( fileRef, &kBE_xmpUUID, 16 );
+ LFA_Write ( fileRef, this->xmpPacket.data(), (XMP_Int32)this->xmpPacket.size() );
+
+ }
+
+} // MPEG4_MetaHandler::UpdateFile
+
+// =================================================================================================
+// MPEG4_MetaHandler::WriteFile
+// ============================
+//
+// Since the XMP and legacy is probably a miniscule part of the entire file, and since we can't
+// change the offset of most of the boxes, just copy the entire source file to the dest file, then
+// do an in-place update to the destination file.
+
+void MPEG4_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath )
+{
+ XMP_Assert ( this->needsUpdate );
+
+ LFA_FileRef destRef = this->parent->fileRef;
+
+ LFA_Seek ( sourceRef, 0, SEEK_SET );
+ LFA_Seek ( destRef, 0, SEEK_SET );
+ LFA_Copy ( sourceRef, destRef, LFA_Measure ( sourceRef ),
+ this->parent->abortProc, this->parent->abortArg );
+
+ this->UpdateFile ( false );
+
+} // MPEG4_MetaHandler::WriteFile
+
+// =================================================================================================
diff --git a/source/XMPFiles/FileHandlers/MPEG4_Handler.hpp b/source/XMPFiles/FileHandlers/MPEG4_Handler.hpp
new file mode 100644
index 0000000..9da2741
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/MPEG4_Handler.hpp
@@ -0,0 +1,69 @@
+#ifndef __MPEG4_Handler_hpp__
+#define __MPEG4_Handler_hpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2007 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XMPFiles_Impl.hpp"
+
+// ================================================================================================
+/// \file MPEG4_Handler.hpp
+/// \brief File format handler for MPEG-4.
+///
+/// This header ...
+///
+// ================================================================================================
+
+extern XMPFileHandler * MPEG4_MetaHandlerCTor ( XMPFiles * parent );
+
+extern bool MPEG4_CheckFormat ( XMP_FileFormat format,
+ XMP_StringPtr filePath,
+ LFA_FileRef fileRef,
+ XMPFiles * parent );
+
+static const XMP_OptionBits kMPEG4_HandlerFlags = ( kXMPFiles_CanInjectXMP |
+ kXMPFiles_CanExpand |
+ kXMPFiles_CanRewrite |
+ kXMPFiles_PrefersInPlace |
+ kXMPFiles_CanReconcile |
+ kXMPFiles_AllowsOnlyXMP |
+ kXMPFiles_ReturnsRawPacket |
+ kXMPFiles_AllowsSafeUpdate
+ );
+
+class MPEG4_MetaHandler : public XMPFileHandler
+{
+public:
+
+ void CacheFileData();
+ void ProcessXMP();
+
+ void UpdateFile ( bool doSafeUpdate );
+ void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath );
+
+ MPEG4_MetaHandler ( XMPFiles * _parent );
+ virtual ~MPEG4_MetaHandler();
+
+private:
+
+ MPEG4_MetaHandler() : xmpBoxPos(0) {}; // Hidden on purpose.
+
+ void MakeLegacyDigest ( std::string * digestStr );
+ void PickNewLocation();
+
+ XMP_Uns64 xmpBoxPos; // The file offset of the XMP box (the size field, not the content).
+
+ std::string mvhdBox; // ! Both contain binary data, but std::string is handy.
+ std::vector<std::string> cprtBoxes;
+
+}; // MPEG4_MetaHandler
+
+// =================================================================================================
+
+#endif // __MPEG4_Handler_hpp__
diff --git a/source/XMPFiles/FileHandlers/P2_Handler.cpp b/source/XMPFiles/FileHandlers/P2_Handler.cpp
new file mode 100644
index 0000000..eac0edf
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/P2_Handler.cpp
@@ -0,0 +1,1203 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "P2_Handler.hpp"
+
+#include "MD5.h"
+
+using namespace std;
+
+// =================================================================================================
+/// \file P2_Handler.cpp
+/// \brief Folder format handler for P2.
+///
+/// This handler is for the P2 video format. This is a pseudo-package, visible files but with a very
+/// well-defined layout and naming rules. A typical P2 example looks like:
+///
+/// .../MyMovie
+/// CONTENTS/
+/// CLIP/
+/// 0001AB.XML
+/// 0001AB.XMP
+/// 0002CD.XML
+/// 0002CD.XMP
+/// VIDEO/
+/// 0001AB.MXF
+/// 0002CD.MXF
+/// AUDIO/
+/// 0001AB00.MXF
+/// 0001AB01.MXF
+/// 0002CD00.MXF
+/// 0002CD01.MXF
+/// ICON/
+/// 0001AB.BMP
+/// 0002CD.BMP
+/// VOICE/
+/// 0001AB.WAV
+/// 0002CD.WAV
+/// PROXY/
+/// 0001AB.MP4
+/// 0002CD.MP4
+///
+/// From the user's point of view, .../MyMovie contains P2 stuff, in this case 2 clips whose raw
+/// names are 0001AB and 0002CD. There may be mapping information for nicer clip names to the raw
+/// names, but that can be ignored for now. Each clip is stored as a collection of files, each file
+/// holding some specific aspect of the clip's data.
+///
+/// The P2 handler operates on clips. The path from the client of XMPFiles can be either a logical
+/// clip path, like ".../MyMovie/0001AB", or a full path to one of the files. In the latter case the
+/// handler must figure out the intended clip, it must not blindly use the named file.
+///
+/// Once the P2 structure and intended clip are identified, the handler only deals with the .XMP and
+/// .XML files in the CLIP folder. The .XMP file, if present, contains the XMP for the clip. The .XML
+/// file must be present to define the existance of the clip. It contains a variety of information
+/// about the clip, including some legacy metadata.
+///
+// =================================================================================================
+
+static const char * kContentFolderNames[] = { "CLIP", "VIDEO", "AUDIO", "ICON", "VOICE", "PROXY", 0 };
+static int kNumRequiredContentFolders = 6; // All 6 of the above.
+
+static inline bool CheckContentFolderName ( const std::string & folderName )
+{
+ for ( int i = 0; kContentFolderNames[i] != 0; ++i ) {
+ if ( folderName == kContentFolderNames[i] ) return true;
+ }
+ return false;
+}
+
+// =================================================================================================
+// InternalMakeClipFilePath
+// ========================
+//
+// P2_CheckFormat can't use the member function.
+
+static void InternalMakeClipFilePath ( std::string * path,
+ const std::string & rootPath,
+ const std::string & clipName,
+ XMP_StringPtr suffix )
+{
+
+ *path = rootPath;
+ *path += kDirChar;
+ *path += "CONTENTS";
+ *path += kDirChar;
+ *path += "CLIP";
+ *path += kDirChar;
+ *path += clipName;
+ *path += suffix;
+
+} // InternalMakeClipFilePath
+
+// =================================================================================================
+// P2_CheckFormat
+// ==============
+//
+// This version does fairly simple checks. The top level folder (.../MyMovie) must a child folder
+// called CONTENTS. This must have a subfolder called CLIP. It may also have subfolders called
+// VIDEO, AUDIO, ICON, VOICE, and PROXY. Any mixture of these additional folders is allowed, but no
+// other children are allowed in CONTENTS. The CLIP folder must contain a .XML file for the desired
+// clip. The name checks are case insensitive.
+//
+// The state of the string parameters depends on the form of the path passed by the client. If the
+// client passed a logical clip path, like ".../MyMovie/0001AB", the parameters are:
+// rootPath - ".../MyMovie"
+// gpName - empty
+// parentName - empty
+// leafName - "0001AB"
+// If the client passed a full file path, like ".../MyMovie/CONTENTS/VOICE/0001AB.WAV", they are:
+// rootPath - ".../MyMovie"
+// gpName - "CONTENTS"
+// parentName - "VOICE"
+// leafName - "0001AB"
+//
+// For most of the content files the base file name is the raw clip name. Files in the AUDIO and
+// VOICE folders have an extra 2 digits appended to the raw clip name. These must be trimmed.
+
+// ! The common code has shifted the gpName, parentName, and leafName strings to upper case. It has
+// ! also made sure that for a logical clip path the rootPath is an existing folder, and that the
+// ! file exists for a full file path.
+
+bool P2_CheckFormat ( XMP_FileFormat format,
+ const std::string & rootPath,
+ const std::string & gpName,
+ const std::string & parentName,
+ const std::string & leafName,
+ XMPFiles * parent )
+{
+ XMP_FolderInfo folderInfo;
+ std::string tempPath, childName;
+
+ std::string clipName = leafName;
+
+ // Do some basic checks on the gpName and parentName.
+
+ if ( gpName.empty() != parentName.empty() ) return false; // Must be both empty or both non-empty.
+
+ if ( ! gpName.empty() ) {
+
+ if ( gpName != "CONTENTS" ) return false;
+ if ( ! CheckContentFolderName ( parentName ) ) return false;
+
+ if ( (parentName == "AUDIO") | (parentName == "VOICE") ) {
+ if ( clipName.size() < 3 ) return false;
+ clipName.erase ( clipName.size() - 2 );
+ }
+
+ }
+
+ tempPath = rootPath;
+ tempPath += kDirChar;
+ tempPath += "CONTENTS";
+ if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFolder ) return false;
+
+ folderInfo.Open ( tempPath.c_str() );
+ int numChildrenFound = 0;
+ while ( ( folderInfo.GetNextChild ( &childName ) && ( numChildrenFound < kNumRequiredContentFolders ) ) ) { // Make sure the children of CONTENTS are legit.
+ if ( CheckContentFolderName ( childName ) ) {
+ folderInfo.GetFolderPath ( &tempPath );
+ tempPath += kDirChar;
+ tempPath += childName;
+ if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFolder ) return false;
+ ++numChildrenFound;
+ }
+ }
+ folderInfo.Close();
+
+ // Make sure the clip's .XML file exists.
+
+ InternalMakeClipFilePath ( &tempPath, rootPath, clipName, ".XML" );
+ if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFile ) return false;
+
+ // Make a bogus path to pass the root path and clip name to the handler. A bit of a hack, but
+ // the only way to get info from here to there.
+
+
+ tempPath = rootPath;
+ tempPath += kDirChar;
+ tempPath += clipName;
+
+ size_t pathLen = tempPath.size() + 1; // Include a terminating nul.
+ parent->handlerTemp = malloc ( pathLen );
+ if ( parent->handlerTemp == 0 ) XMP_Throw ( "No memory for P2 clip path", kXMPErr_NoMemory );
+ memcpy ( parent->handlerTemp, tempPath.c_str(), pathLen ); // AUDIT: Safe, allocated above.
+
+ return true;
+
+} // P2_CheckFormat
+
+// =================================================================================================
+// P2_MetaHandlerCTor
+// ==================
+
+XMPFileHandler * P2_MetaHandlerCTor ( XMPFiles * parent )
+{
+ return new P2_MetaHandler ( parent );
+
+} // P2_MetaHandlerCTor
+
+// =================================================================================================
+// P2_MetaHandler::P2_MetaHandler
+// ==============================
+
+P2_MetaHandler::P2_MetaHandler ( XMPFiles * _parent ) : expat(0), clipMetadata(0), clipContent(0)
+{
+
+ this->parent = _parent; // Inherited, can't set in the prefix.
+ this->handlerFlags = kP2_HandlerFlags;
+ this->stdCharForm = kXMP_Char8Bit;
+
+ // Extract the root path and clip name from handlerTemp.
+
+ XMP_Assert ( this->parent->handlerTemp != 0 );
+ this->rootPath = (char*)this->parent->handlerTemp;
+ free ( this->parent->handlerTemp );
+ this->parent->handlerTemp = 0;
+
+ SplitLeafName ( &this->rootPath, &this->clipName );
+
+} // P2_MetaHandler::P2_MetaHandler
+
+// =================================================================================================
+// P2_MetaHandler::~P2_MetaHandler
+// ===============================
+
+P2_MetaHandler::~P2_MetaHandler()
+{
+
+ this->CleanupLegacyXML();
+ if ( this->parent->handlerTemp != 0 ) {
+ free ( this->parent->handlerTemp );
+ this->parent->handlerTemp = 0;
+ }
+
+} // P2_MetaHandler::~P2_MetaHandler
+
+// =================================================================================================
+// P2_MetaHandler::MakeClipFilePath
+// ================================
+
+void P2_MetaHandler::MakeClipFilePath ( std::string * path, XMP_StringPtr suffix )
+{
+
+ InternalMakeClipFilePath ( path, this->rootPath, this->clipName, suffix );
+
+} // P2_MetaHandler::MakeClipFilePath
+
+// =================================================================================================
+// P2_MetaHandler::CleanupLegacyXML
+// ================================
+
+void P2_MetaHandler::CleanupLegacyXML()
+{
+
+ if ( ! this->defaultNS.empty() ) {
+ SXMPMeta::DeleteNamespace ( this->defaultNS.c_str() );
+ this->defaultNS.erase();
+ }
+
+ if ( this->expat != 0 ) { delete ( this->expat ); this->expat = 0; }
+
+ clipMetadata = 0; // ! Was a pointer into the expat tree.
+ clipContent = 0; // ! Was a pointer into the expat tree.
+
+} // P2_MetaHandler::CleanupLegacyXML
+
+// =================================================================================================
+// P2_MetaHandler::DigestLegacyItem
+// ================================
+
+void P2_MetaHandler::DigestLegacyItem ( MD5_CTX & md5Context, XML_NodePtr legacyContext, XMP_StringPtr legacyPropName )
+{
+ XML_NodePtr legacyProp = legacyContext->GetNamedElement ( this->p2NS.c_str(), legacyPropName );
+
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() && (! legacyProp->content.empty()) ) {
+ const XML_Node * xmlValue = legacyProp->content[0];
+ MD5Update ( &md5Context, (XMP_Uns8*)xmlValue->value.c_str(), (unsigned int)xmlValue->value.size() );
+ }
+
+} // P2_MetaHandler::DigestLegacyItem
+
+// =================================================================================================
+// P2_MetaHandler::DigestLegacyRelations
+// =====================================
+
+void P2_MetaHandler::DigestLegacyRelations ( MD5_CTX & md5Context )
+{
+ XMP_StringPtr p2NS = this->p2NS.c_str();
+ XML_Node * legacyContext = this->clipContent->GetNamedElement ( p2NS, "Relation" );
+
+ if ( legacyContext != 0 ) {
+
+ this->DigestLegacyItem ( md5Context, legacyContext, "GlobalShotID" );
+ XML_Node * legacyConnectionContext = legacyContext = this->clipContent->GetNamedElement ( p2NS, "Connection" );
+
+ if ( legacyConnectionContext != 0 ) {
+
+ legacyContext = legacyConnectionContext->GetNamedElement ( p2NS, "Top" );
+
+ if ( legacyContext != 0 ) {
+ this->DigestLegacyItem ( md5Context, legacyContext, "GlobalClipID" );
+ }
+
+ legacyContext = legacyConnectionContext->GetNamedElement ( p2NS, "Previous" );
+
+ if ( legacyContext != 0 ) {
+ this->DigestLegacyItem ( md5Context, legacyContext, "GlobalClipID" );
+ }
+
+ legacyContext = legacyConnectionContext->GetNamedElement ( p2NS, "Next" );
+
+ if ( legacyContext != 0 ) {
+ this->DigestLegacyItem ( md5Context, legacyContext, "GlobalClipID" );
+ }
+
+ }
+
+ }
+
+} // P2_MetaHandler::DigestLegacyRelations
+
+// =================================================================================================
+// P2_MetaHandler::SetXMPPropertyFromLegacyXML
+// ===========================================
+
+void P2_MetaHandler::SetXMPPropertyFromLegacyXML ( bool digestFound,
+ XML_NodePtr legacyContext,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr legacyPropName,
+ bool isLocalized )
+{
+
+ if ( digestFound || (! this->xmpObj.DoesPropertyExist ( schemaNS, propName )) ) {
+
+ XMP_StringPtr p2NS = this->p2NS.c_str();
+ XML_NodePtr legacyProp = legacyContext->GetNamedElement ( p2NS, legacyPropName );
+
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) {
+ if ( isLocalized ) {
+ this->xmpObj.SetLocalizedText ( schemaNS, propName, "", "x-default", legacyProp->GetLeafContentValue(), kXMP_DeleteExisting );
+ } else {
+ this->xmpObj.SetProperty ( schemaNS, propName, legacyProp->GetLeafContentValue(), kXMP_DeleteExisting );
+ }
+ this->containsXMP = true;
+ }
+
+ }
+
+} // P2_MetaHandler::SetXMPPropertyFromLegacyXML
+
+// =================================================================================================
+// P2_MetaHandler::SetRelationsFromLegacyXML
+// =========================================
+
+void P2_MetaHandler::SetRelationsFromLegacyXML ( bool digestFound )
+{
+ XMP_StringPtr p2NS = this->p2NS.c_str();
+ XML_NodePtr legacyRelationContext = this->clipContent->GetNamedElement ( p2NS, "Relation" );
+
+ // P2 Relation blocks are optional -- they're only present when a clip is part of a multi-clip shot.
+
+ if ( legacyRelationContext != 0 ) {
+
+ if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DC, "relation" )) ) {
+
+ XML_NodePtr legacyProp = legacyRelationContext->GetNamedElement ( p2NS, "GlobalShotID" );
+ std::string relationString;
+
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) {
+
+ this->xmpObj.DeleteProperty ( kXMP_NS_DC, "relation" );
+ relationString = std::string("globalShotID:") + legacyProp->GetLeafContentValue();
+ this->xmpObj.AppendArrayItem ( kXMP_NS_DC, "relation", kXMP_PropArrayIsUnordered, relationString );
+ this->containsXMP = true;
+
+ XML_NodePtr legacyConnectionContext = legacyRelationContext->GetNamedElement ( p2NS, "Connection" );
+
+ if ( legacyConnectionContext != 0 ) {
+
+ XML_NodePtr legacyContext = legacyConnectionContext->GetNamedElement ( p2NS, "Top" );
+
+ if ( legacyContext != 0 ) {
+ legacyProp = legacyContext->GetNamedElement ( p2NS, "GlobalClipID" );
+
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) {
+ relationString = std::string("topGlobalClipID:") + legacyProp->GetLeafContentValue();
+ this->xmpObj.AppendArrayItem ( kXMP_NS_DC, "relation", kXMP_PropArrayIsUnordered, relationString );
+ }
+ }
+
+ legacyContext = legacyConnectionContext->GetNamedElement ( p2NS, "Previous" );
+
+ if ( legacyContext != 0 ) {
+ legacyProp = legacyContext->GetNamedElement ( p2NS, "GlobalClipID" );
+
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) {
+ relationString = std::string("previousGlobalClipID:") + legacyProp->GetLeafContentValue();
+ this->xmpObj.AppendArrayItem ( kXMP_NS_DC, "relation", kXMP_PropArrayIsUnordered, relationString );
+ }
+ }
+
+ legacyContext = legacyConnectionContext->GetNamedElement ( p2NS, "Next" );
+
+ if ( legacyContext != 0 ) {
+ legacyProp = legacyContext->GetNamedElement ( p2NS, "GlobalClipID" );
+
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) {
+ relationString = std::string("nextGlobalClipID:") + legacyProp->GetLeafContentValue();
+ this->xmpObj.AppendArrayItem ( kXMP_NS_DC, "relation", kXMP_PropArrayIsUnordered, relationString );
+ }
+ }
+
+ }
+
+ }
+
+ }
+
+ }
+
+} // P2_MetaHandler::SetRelationsFromLegacyXML
+
+// =================================================================================================
+// P2_MetaHandler::SetAudioInfoFromLegacyXML
+// =========================================
+
+void P2_MetaHandler::SetAudioInfoFromLegacyXML ( bool digestFound )
+{
+ XMP_StringPtr p2NS = this->p2NS.c_str();
+ XML_NodePtr legacyAudioContext = this->clipContent->GetNamedElement ( p2NS, "EssenceList" );
+
+ if ( legacyAudioContext != 0 ) {
+
+ legacyAudioContext = legacyAudioContext->GetNamedElement ( p2NS, "Audio" );
+
+ if ( legacyAudioContext != 0 ) {
+
+ this->SetXMPPropertyFromLegacyXML ( digestFound, legacyAudioContext, kXMP_NS_DM, "audioSampleRate", "SamplingRate", false );
+
+ if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DM, "audioSampleType" )) ) {
+ XML_NodePtr legacyProp = legacyAudioContext->GetNamedElement ( p2NS, "BitsPerSample" );
+
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) {
+
+ const std::string p2BitsPerSample = legacyProp->GetLeafContentValue();
+ std::string dmSampleType;
+
+ if ( p2BitsPerSample == "16" ) {
+ dmSampleType = "16Int";
+ } else if ( p2BitsPerSample == "24" ) {
+ dmSampleType = "32Int";
+ }
+
+ if ( ! dmSampleType.empty() ) {
+ this->xmpObj.SetProperty ( kXMP_NS_DM, "audioSampleType", dmSampleType, kXMP_DeleteExisting );
+ this->containsXMP = true;
+ }
+
+ }
+
+ }
+
+ }
+
+ }
+
+} // P2_MetaHandler::SetAudioInfoFromLegacyXML
+
+// =================================================================================================
+// P2_MetaHandler::SetVideoInfoFromLegacyXML
+// =========================================
+
+void P2_MetaHandler::SetVideoInfoFromLegacyXML ( bool digestFound )
+{
+ XMP_StringPtr p2NS = this->p2NS.c_str();
+ XML_NodePtr legacyVideoContext = this->clipContent->GetNamedElement ( p2NS, "EssenceList" );
+
+ if ( legacyVideoContext != 0 ) {
+
+ legacyVideoContext = legacyVideoContext->GetNamedElement ( p2NS, "Video" );
+
+ if ( legacyVideoContext != 0 ) {
+ this->SetVideoFrameInfoFromLegacyXML ( legacyVideoContext, digestFound );
+ this->SetStartTimecodeFromLegacyXML ( legacyVideoContext, digestFound );
+ this->SetXMPPropertyFromLegacyXML ( digestFound, legacyVideoContext, kXMP_NS_DM, "videoFrameRate", "FrameRate", false );
+ }
+
+ }
+
+} // P2_MetaHandler::SetVideoInfoFromLegacyXML
+
+// =================================================================================================
+// P2_MetaHandler::SetDurationFromLegacyXML
+// ========================================
+
+void P2_MetaHandler::SetDurationFromLegacyXML ( bool digestFound )
+{
+
+ if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DM, "duration" )) ) {
+
+ XMP_StringPtr p2NS = this->p2NS.c_str();
+ XML_NodePtr legacyDurationProp = this->clipContent->GetNamedElement ( p2NS, "Duration" );
+ XML_NodePtr legacyEditUnitProp = this->clipContent->GetNamedElement ( p2NS, "EditUnit" );
+
+ if ( (legacyDurationProp != 0) && ( legacyEditUnitProp != 0 ) &&
+ legacyDurationProp->IsLeafContentNode() && legacyEditUnitProp->IsLeafContentNode() ) {
+
+ this->xmpObj.DeleteProperty ( kXMP_NS_DM, "duration" );
+ this->xmpObj.SetStructField ( kXMP_NS_DM, "duration",
+ kXMP_NS_DM, "value", legacyDurationProp->GetLeafContentValue() );
+
+ this->xmpObj.SetStructField ( kXMP_NS_DM, "duration",
+ kXMP_NS_DM, "scale", legacyEditUnitProp->GetLeafContentValue() );
+ this->containsXMP = true;
+
+ }
+
+ }
+
+} // P2_MetaHandler::SetDurationFromLegacyXML
+
+// =================================================================================================
+// P2_MetaHandler::SetVideoFrameInfoFromLegacyXML
+// ==============================================
+
+void P2_MetaHandler::SetVideoFrameInfoFromLegacyXML ( XML_NodePtr legacyVideoContext, bool digestFound )
+{
+
+ // Map the P2 Codec field to various dynamic media schema fields.
+ if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DM, "videoFrameSize" )) ) {
+
+ XMP_StringPtr p2NS = this->p2NS.c_str();
+ XML_NodePtr legacyProp = legacyVideoContext->GetNamedElement ( p2NS, "Codec" );
+
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) {
+
+ const std::string p2Codec = legacyProp->GetLeafContentValue();
+ std::string dmPixelAspectRatio, dmVideoCompressor, dmWidth, dmHeight;
+
+ if ( p2Codec == "DV25_411" ) {
+ dmWidth = "720";
+ dmVideoCompressor = "DV25 4:1:1";
+ } else if ( p2Codec == "DV25_420" ) {
+ dmWidth = "720";
+ dmVideoCompressor = "DV25 4:2:0";
+ } else if ( p2Codec == "DV50_422" ) {
+ dmWidth = "720";
+ dmVideoCompressor = "DV50 4:2:2";
+ } else if ( ( p2Codec == "DV100_1080/59.94i" ) || ( p2Codec == "DV100_1080/50i" ) ) {
+ dmVideoCompressor = "DV100";
+ dmHeight = "1080";
+
+ if ( p2Codec == "DV100_1080/59.94i" ) {
+ dmWidth = "1280";
+ dmPixelAspectRatio = "3/2";
+ } else {
+ dmWidth = "1440";
+ dmPixelAspectRatio = "1920/1440";
+ }
+ } else if ( ( p2Codec == "DV100_720/59.94p" ) || ( p2Codec == "DV100_720/50p" ) ) {
+ dmVideoCompressor = "DV100";
+ dmHeight = "720";
+ dmWidth = "960";
+ dmPixelAspectRatio = "1920/1440";
+ } else if ( ( p2Codec == "AVC-I_1080/59.94i" ) ||
+ ( p2Codec == "AVC-I_1080/50i" ) ||
+ ( p2Codec == "AVC-I_1080/29.97p" ) ||
+ ( p2Codec == "AVC-I_1080/25p" ) ||
+ ( p2Codec == "AVC-I_720/59.94p" ) ||
+ ( p2Codec == "AVC-I_720/50p" ) ) {
+ // There are two "flavors" of the AVC-Intra codec that compress to different widths (and, therefore
+ // different pixel aspect ratios), but no way I can find to distinguish between them in the
+ // legacy XML. Until this is resolved we'll just report the codec name.
+ dmVideoCompressor = "AVC-Intra";
+ }
+
+ if ( dmWidth == "720" ) {
+
+ // This is SD footage -- calculate the frame height and pixel aspect ratio using the legacy P2
+ // FrameRate and AspectRatio fields.
+
+ legacyProp = legacyVideoContext->GetNamedElement ( p2NS, "FrameRate" );
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) {
+
+ const std::string p2FrameRate = legacyProp->GetLeafContentValue();
+
+ legacyProp = legacyVideoContext->GetNamedElement ( p2NS, "AspectRatio" );
+
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) {
+ const std::string p2AspectRatio = legacyProp->GetLeafContentValue();
+
+ if ( p2FrameRate == "50i" ) {
+ // Standard Definition PAL.
+ dmHeight = "576";
+ if ( p2AspectRatio == "4:3" ) {
+ dmPixelAspectRatio = "768/702";
+ } else if ( p2AspectRatio == "16:9" ) {
+ dmPixelAspectRatio = "1024/702";
+ }
+ } else if ( p2FrameRate == "59.94i" ) {
+ // Standard Definition NTSC.
+ dmHeight = "480";
+ if ( p2AspectRatio == "4:3" ) {
+ dmPixelAspectRatio = "10/11";
+ } else if ( p2AspectRatio == "16:9" ) {
+ dmPixelAspectRatio = "40/33";
+ }
+ }
+
+ }
+ }
+ }
+
+ if ( ! dmPixelAspectRatio.empty() ) {
+ this->xmpObj.SetProperty ( kXMP_NS_DM, "videoPixelAspectRatio", dmPixelAspectRatio, kXMP_DeleteExisting );
+ this->containsXMP = true;
+ }
+
+ if ( ! dmVideoCompressor.empty() ) {
+ this->xmpObj.SetProperty ( kXMP_NS_DM, "videoCompressor", dmVideoCompressor, kXMP_DeleteExisting );
+ this->containsXMP = true;
+ }
+
+ if ( ( ! dmWidth.empty() ) && ( ! dmHeight.empty() ) ) {
+ this->xmpObj.SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "w", dmWidth, 0 );
+ this->xmpObj.SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "h", dmHeight, 0 );
+ this->xmpObj.SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "unit", "pixel", 0 );
+ this->containsXMP = true;
+ }
+
+ }
+
+ }
+
+} // P2_MetaHandler::SetVideoFrameInfoFromLegacyXML
+
+// =================================================================================================
+// P2_MetaHandler::SetStartTimecodeFromLegacyXML
+// =============================================
+
+void P2_MetaHandler::SetStartTimecodeFromLegacyXML ( XML_NodePtr legacyVideoContext, bool digestFound )
+{
+
+ // Translate start timecode to the format specified by the dynamic media schema.
+ if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DM, "startTimecode" )) ) {
+
+ XMP_StringPtr p2NS = this->p2NS.c_str();
+ XML_NodePtr legacyProp = legacyVideoContext->GetNamedElement ( p2NS, "StartTimecode" );
+
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) {
+
+ std::string p2StartTimecode = legacyProp->GetLeafContentValue();
+
+ legacyProp = legacyVideoContext->GetNamedElement ( p2NS, "FrameRate" );
+
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) {
+
+ const std::string p2FrameRate = legacyProp->GetLeafContentValue();
+ const XMP_StringPtr p2DropFrameFlag = legacyProp->GetAttrValue ( "DropFrameFlag" );
+ std::string dmTimeFormat;
+
+ if ( ( p2FrameRate == "50i" ) || ( p2FrameRate == "25p" ) ) {
+
+ dmTimeFormat = "25Timecode";
+
+ } else if ( p2FrameRate == "23.98p" ) {
+
+ dmTimeFormat = "23976Timecode";
+
+ } else if ( p2FrameRate == "50p" ) {
+
+ dmTimeFormat = "50Timecode";
+
+ } else if ( p2FrameRate == "59.94p" ) {
+
+ if ( p2DropFrameFlag == "true" ) {
+ dmTimeFormat = "5994DropTimecode";
+ } else if ( p2DropFrameFlag == "false" ) {
+ dmTimeFormat = "5994NonDropTimecode";
+ }
+
+ } else if ( ( p2FrameRate == "59.94i" ) || ( p2FrameRate == "29.97p" ) ) {
+
+ if ( p2DropFrameFlag != 0 ) {
+
+ if ( std::strcmp ( p2DropFrameFlag, "false" ) == 0 ) {
+
+ dmTimeFormat = "2997NonDropTimecode";
+
+ } else if ( std::strcmp ( p2DropFrameFlag, "true" ) == 0 ) {
+
+ // Drop frame NTSC timecode uses semicolons instead of colons as separators.
+ std::string::iterator currCharIt = p2StartTimecode.begin();
+ const std::string::iterator charsEndIt = p2StartTimecode.end();
+
+ for ( ; currCharIt != charsEndIt; ++currCharIt ) {
+ if ( *currCharIt == ':' ) *currCharIt = ';';
+ }
+
+ dmTimeFormat = "2997DropTimecode";
+
+ }
+
+ }
+
+ }
+
+ if ( ( ! p2StartTimecode.empty() ) && ( ! dmTimeFormat.empty() ) ) {
+ this->xmpObj.SetStructField ( kXMP_NS_DM, "startTimecode", kXMP_NS_DM, "timeValue", p2StartTimecode, 0 );
+ this->xmpObj.SetStructField ( kXMP_NS_DM, "startTimecode", kXMP_NS_DM, "timeFormat", dmTimeFormat, 0 );
+ this->containsXMP = true;
+ }
+
+ }
+
+ }
+
+ }
+
+} // P2_MetaHandler::SetStartTimecodeFromLegacyXML
+
+// =================================================================================================
+// P2_MetaHandler::ForceChildElement
+// =================================
+
+XML_Node * P2_MetaHandler::ForceChildElement ( XML_Node * parent, XMP_StringPtr localName, int indent /* = 0 */ )
+{
+ XML_Node * wsNode;
+ XML_Node * childNode = parent->GetNamedElement ( this->p2NS.c_str(), localName );
+
+ if ( childNode == 0 ) {
+
+ // The indenting is a hack, assuming existing 2 spaces per level.
+
+ wsNode = new XML_Node ( parent, "", kCDataNode );
+ wsNode->value = " "; // Add 2 spaces to the existing WS before the parent's close tag.
+ parent->content.push_back ( wsNode );
+
+ childNode = new XML_Node ( parent, localName, kElemNode );
+ childNode->ns = parent->ns;
+ childNode->nsPrefixLen = parent->nsPrefixLen;
+ childNode->name.insert ( 0, parent->name, 0, parent->nsPrefixLen );
+ parent->content.push_back ( childNode );
+
+ wsNode = new XML_Node ( parent, "", kCDataNode );
+ wsNode->value = '\n';
+ for ( ; indent > 1; --indent ) wsNode->value += " "; // Indent less 1, to "outdent" the parent's close.
+ parent->content.push_back ( wsNode );
+
+ }
+
+ return childNode;
+
+} // P2_MetaHandler::ForceChildElement
+
+// =================================================================================================
+// P2_MetaHandler::MakeLegacyDigest
+// =================================
+
+// *** Early hack version.
+
+#define kHexDigits "0123456789ABCDEF"
+
+void P2_MetaHandler::MakeLegacyDigest ( std::string * digestStr )
+{
+ digestStr->erase();
+ if ( this->clipMetadata == 0 ) return; // Bail if we don't have any legacy XML.
+ XMP_Assert ( this->expat != 0 );
+
+ XMP_StringPtr p2NS = this->p2NS.c_str();
+ XML_NodePtr legacyContext;
+ MD5_CTX md5Context;
+ unsigned char digestBin [16];
+ MD5Init ( &md5Context );
+
+ legacyContext = this->clipContent;
+ this->DigestLegacyItem ( md5Context, legacyContext, "ClipName" );
+ this->DigestLegacyItem ( md5Context, legacyContext, "GlobalClipID" );
+ this->DigestLegacyItem ( md5Context, legacyContext, "Duration" );
+ this->DigestLegacyItem ( md5Context, legacyContext, "EditUnit" );
+ this->DigestLegacyRelations ( md5Context );
+
+ legacyContext = this->clipContent->GetNamedElement ( p2NS, "EssenceList" );
+
+ if ( legacyContext != 0 ) {
+
+ XML_NodePtr videoContext = legacyContext->GetNamedElement ( p2NS, "Video" );
+
+ if ( videoContext != 0 ) {
+ this->DigestLegacyItem ( md5Context, videoContext, "AspectRatio" );
+ this->DigestLegacyItem ( md5Context, videoContext, "Codec" );
+ this->DigestLegacyItem ( md5Context, videoContext, "FrameRate" );
+ this->DigestLegacyItem ( md5Context, videoContext, "StartTimecode" );
+ }
+
+ XML_NodePtr audioContext = legacyContext->GetNamedElement ( p2NS, "Audio" );
+
+ if ( audioContext != 0 ) {
+ this->DigestLegacyItem ( md5Context, audioContext, "SamplingRate" );
+ this->DigestLegacyItem ( md5Context, audioContext, "BitsPerSample" );
+ }
+
+ }
+
+ legacyContext = this->clipMetadata;
+ this->DigestLegacyItem ( md5Context, legacyContext, "UserClipName" );
+ this->DigestLegacyItem ( md5Context, legacyContext, "ShotMark" );
+
+ legacyContext = this->clipMetadata->GetNamedElement ( p2NS, "Access" );
+ if ( legacyContext == 0 ) return;
+
+ this->DigestLegacyItem ( md5Context, legacyContext, "Creator" );
+ this->DigestLegacyItem ( md5Context, legacyContext, "CreationDate" );
+ this->DigestLegacyItem ( md5Context, legacyContext, "LastUpdateDate" );
+
+ MD5Final ( digestBin, &md5Context );
+
+ char buffer [40];
+ for ( int in = 0, out = 0; in < 16; in += 1, out += 2 ) {
+ XMP_Uns8 byte = digestBin[in];
+ buffer[out] = kHexDigits [ byte >> 4 ];
+ buffer[out+1] = kHexDigits [ byte & 0xF ];
+ }
+ buffer[32] = 0;
+ digestStr->append ( buffer );
+
+} // P2_MetaHandler::MakeLegacyDigest
+
+// =================================================================================================
+// P2_MetaHandler::CacheFileData
+// =============================
+
+void P2_MetaHandler::CacheFileData()
+{
+ XMP_Assert ( (! this->containsXMP) && (! this->containsTNail) );
+
+ // Make sure the clip's .XMP file exists.
+
+ std::string xmpPath;
+ this->MakeClipFilePath ( &xmpPath, ".XMP" );
+
+ if ( GetFileMode ( xmpPath.c_str() ) != kFMode_IsFile ) return; // No XMP.
+
+ // Read the entire .XMP file.
+
+ bool openForUpdate = XMP_OptionIsSet ( this->parent->openFlags, kXMPFiles_OpenForUpdate );
+ char openMode = 'r';
+ if ( openForUpdate ) openMode = 'w';
+
+ LFA_FileRef xmpFile = LFA_Open ( xmpPath.c_str(), openMode );
+ if ( xmpFile == 0 ) return; // The open failed.
+
+ XMP_Int64 xmpLen = LFA_Measure ( xmpFile );
+ if ( xmpLen > 100*1024*1024 ) {
+ XMP_Throw ( "P2 XMP is outrageously large", kXMPErr_InternalFailure ); // Sanity check.
+ }
+
+ this->xmpPacket.erase();
+ this->xmpPacket.reserve ( (size_t)xmpLen );
+ this->xmpPacket.append ( (size_t)xmpLen, ' ' );
+
+ XMP_Int32 ioCount = LFA_Read ( xmpFile, (void*)this->xmpPacket.data(), (XMP_Int32)xmpLen, kLFA_RequireAll );
+ XMP_Assert ( ioCount == xmpLen );
+
+ this->packetInfo.offset = 0;
+ this->packetInfo.length = (XMP_Int32)xmpLen;
+ FillPacketInfo ( this->xmpPacket, &this->packetInfo );
+
+ XMP_Assert ( this->parent->fileRef == 0 );
+ if ( openMode == 'r' ) {
+ LFA_Close ( xmpFile );
+ } else {
+ this->parent->fileRef = xmpFile;
+ }
+
+ this->containsXMP = true;
+
+} // P2_MetaHandler::CacheFileData
+
+// =================================================================================================
+// P2_MetaHandler::ProcessXMP
+// ==========================
+
+void P2_MetaHandler::ProcessXMP()
+{
+
+ // Some versions of gcc can't tolerate goto's across declarations.
+ // *** Better yet, avoid this cruft with self-cleaning objects.
+ #define CleanupAndExit \
+ { \
+ bool openForUpdate = XMP_OptionIsSet ( this->parent->openFlags, kXMPFiles_OpenForUpdate ); \
+ if ( ! openForUpdate ) this->CleanupLegacyXML(); \
+ return; \
+ }
+
+ if ( this->processedXMP ) return;
+ this->processedXMP = true; // Make sure only called once.
+
+ if ( this->containsXMP ) {
+ this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() );
+ }
+
+ // --------------------------------------------------------------
+ // *** This is a minimal Q&D example of legacy metadata handling.
+ // *** Hack: Special case trickery to detect and clean up default XML namespace usage.
+
+ bool haveDefaultNS = SXMPMeta::GetNamespaceURI ( "_dflt_", 0 ); // Is there already a default namespace?
+
+ std::string xmlPath;
+ this->MakeClipFilePath ( &xmlPath, ".XML" );
+
+ AutoFile xmlFile;
+ xmlFile.fileRef = LFA_Open ( xmlPath.c_str(), 'r' );
+ if ( xmlFile.fileRef == 0 ) return; // The open failed.
+
+ this->expat = XMP_NewExpatAdapter();
+ if ( this->expat == 0 ) XMP_Throw ( "P2_MetaHandler: Can't create Expat adapter", kXMPErr_NoMemory );
+
+ XMP_Uns8 buffer [64*1024];
+ while ( true ) {
+ XMP_Int32 ioCount = LFA_Read ( xmlFile.fileRef, buffer, sizeof(buffer) );
+ if ( ioCount == 0 ) break;
+ this->expat->ParseBuffer ( buffer, ioCount, false /* not the end */ );
+ }
+ this->expat->ParseBuffer ( 0, 0, true ); // End the parse.
+
+ LFA_Close ( xmlFile.fileRef );
+ xmlFile.fileRef = 0;
+
+ if ( ! haveDefaultNS ) {
+ // No prior default XML namespace. If there is one now, remember it and delete it when done.
+ haveDefaultNS = SXMPMeta::GetNamespaceURI ( "_dflt_", &this->defaultNS );
+ XMP_Assert ( haveDefaultNS == (! this->defaultNS.empty()) );
+ }
+
+ // The root element should be P2Main in some namespace. At least 2 different namespaces are in
+ // use (ending in "v3.0" and "v3.1"). Take whatever this file uses.
+
+ XML_Node & xmlTree = this->expat->tree;
+ XML_NodePtr rootElem = 0;
+
+ for ( size_t i = 0, limit = xmlTree.content.size(); i < limit; ++i ) {
+ if ( xmlTree.content[i]->kind == kElemNode ) {
+ rootElem = xmlTree.content[i];
+ }
+ }
+
+ if ( rootElem == 0 ) CleanupAndExit
+ XMP_StringPtr rootLocalName = rootElem->name.c_str() + rootElem->nsPrefixLen;
+ if ( ! XMP_LitMatch ( rootLocalName, "P2Main" ) ) CleanupAndExit
+
+ this->p2NS = rootElem->ns;
+
+ // Now find ClipMetadata element and check the legacy digest.
+
+ XMP_StringPtr p2NS = this->p2NS.c_str();
+ XML_NodePtr legacyContext, legacyProp;
+
+ legacyContext = rootElem->GetNamedElement ( p2NS, "ClipContent" );
+ if ( legacyContext == 0 ) CleanupAndExit
+
+ this->clipContent = legacyContext; // ! Save the ClipContext pointer for other use.
+
+ legacyContext = legacyContext->GetNamedElement ( p2NS, "ClipMetadata" );
+ if ( legacyContext == 0 ) CleanupAndExit
+
+ this->clipMetadata = legacyContext; // ! Save the ClipMetadata pointer for other use.
+
+ std::string oldDigest, newDigest;
+ bool digestFound = this->xmpObj.GetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "P2", &oldDigest, 0 );
+ if ( digestFound ) {
+ this->MakeLegacyDigest ( &newDigest );
+ if ( oldDigest == newDigest ) CleanupAndExit
+ }
+
+ // If we get here we need find and import the actual legacy elements using the current namespace.
+ // Either there is no old digest in the XMP, or the digests differ. In the former case keep any
+ // existing XMP, in the latter case take new legacy values.
+ this->SetXMPPropertyFromLegacyXML ( digestFound, this->clipContent, kXMP_NS_DC, "title", "ClipName", true );
+ this->SetXMPPropertyFromLegacyXML ( digestFound, this->clipContent, kXMP_NS_DC, "identifier", "GlobalClipID", false );
+ this->SetDurationFromLegacyXML (digestFound );
+ this->SetRelationsFromLegacyXML ( digestFound );
+ this->SetXMPPropertyFromLegacyXML ( digestFound, this->clipMetadata, kXMP_NS_DM, "shotName", "UserClipName", false );
+ this->SetAudioInfoFromLegacyXML ( digestFound );
+ this->SetVideoInfoFromLegacyXML ( digestFound );
+
+ legacyContext = this->clipMetadata->GetNamedElement ( p2NS, "Access" );
+ if ( legacyContext == 0 ) CleanupAndExit
+
+ if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DC, "creator" )) ) {
+ legacyProp = legacyContext->GetNamedElement ( p2NS, "Creator" );
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) {
+ this->xmpObj.DeleteProperty ( kXMP_NS_DC, "creator" );
+ this->xmpObj.AppendArrayItem ( kXMP_NS_DC, "creator", kXMP_PropArrayIsUnordered,
+ legacyProp->GetLeafContentValue() );
+ this->containsXMP = true;
+ }
+ }
+
+ this->SetXMPPropertyFromLegacyXML ( digestFound, legacyContext, kXMP_NS_XMP, "CreateDate", "CreationDate", false );
+ this->SetXMPPropertyFromLegacyXML ( digestFound, legacyContext, kXMP_NS_XMP, "ModifyDate", "LastUpdateDate", false );
+
+ if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_XMP, "Rating" )) ) {
+ legacyProp = legacyContext->GetNamedElement ( p2NS, "ShotMark" );
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) {
+ XMP_StringPtr markValue = legacyProp->GetLeafContentValue();
+
+ // Translate "marked" clips as having a rating of 1 and "unmarked" clips as having a rating of 0
+ if ((markValue == 0) || (strcmp(markValue, "false") == 0) || (strcmp(markValue, "0") == 0)) {
+ this->xmpObj.SetProperty ( kXMP_NS_XMP, "Rating", "0", kXMP_DeleteExisting );
+ this->containsXMP = true;
+ } else if ((strcmp(markValue, "true") == 0) || (strcmp(markValue, "1") == 0)) {
+ this->xmpObj.SetProperty ( kXMP_NS_XMP, "Rating", "1", kXMP_DeleteExisting );
+ this->containsXMP = true;
+ }
+ }
+ }
+
+ legacyContext = this->clipMetadata->GetNamedElement ( p2NS, "Location" );
+
+ if ( legacyContext != 0 ) {
+ this->SetXMPPropertyFromLegacyXML ( digestFound, legacyContext, kXMP_NS_DM, "shotLocation", "PlaceName", false );
+ }
+
+ CleanupAndExit
+ #undef CleanupAndExit
+
+} // P2_MetaHandler::ProcessXMP
+
+// =================================================================================================
+// P2_MetaHandler::UpdateFile
+// ==========================
+//
+// Note that UpdateFile is only called from XMPFiles::CloseFile, so it is OK to close the file here.
+
+void P2_MetaHandler::UpdateFile ( bool doSafeUpdate )
+{
+ if ( ! this->needsUpdate ) return;
+ this->needsUpdate = false; // Make sure only called once.
+
+ LFA_FileRef oldFile = 0;
+ std::string filePath, tempPath;
+
+ // Update the internal legacy XML tree if we have one, and set the digest in the XMP.
+ // *** This is just a minimal prototype.
+
+ bool updateLegacyXML = false;
+
+ if ( this->clipMetadata != 0 ) {
+
+ XMP_Assert ( this->expat != 0 );
+
+ bool xmpFound;
+ std::string xmpValue;
+ XML_Node * xmlNode;
+
+ xmpFound = this->xmpObj.GetLocalizedText ( kXMP_NS_DC, "title", "", "x-default", 0, &xmpValue, 0 );
+
+ if ( xmpFound ) {
+
+ xmlNode = this->ForceChildElement ( this->clipContent, "ClipName", 3 );
+
+ if ( xmpValue != xmlNode->GetLeafContentValue() ) {
+ xmlNode->SetLeafContentValue ( xmpValue.c_str() );
+ updateLegacyXML = true;
+ }
+
+ }
+
+ xmpFound = this->xmpObj.GetArrayItem ( kXMP_NS_DC, "creator", 1, &xmpValue, 0 );
+
+ if ( xmpFound ) {
+ xmlNode = this->ForceChildElement ( this->clipMetadata, "Access", 3 );
+ xmlNode = this->ForceChildElement ( xmlNode, "Creator", 4 );
+ if ( xmpValue != xmlNode->GetLeafContentValue() ) {
+ xmlNode->SetLeafContentValue ( xmpValue.c_str() );
+ updateLegacyXML = true;
+ }
+ }
+
+ }
+
+ std::string newDigest;
+ this->MakeLegacyDigest ( &newDigest );
+ this->xmpObj.SetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "P2", newDigest.c_str(), kXMP_DeleteExisting );
+
+ this->xmpObj.SerializeToBuffer ( &this->xmpPacket, this->GetSerializeOptions() );
+
+ // Update the legacy XML file if necessary.
+
+ if ( updateLegacyXML ) {
+
+ std::string legacyXML;
+ this->expat->tree.Serialize ( &legacyXML );
+
+ this->MakeClipFilePath ( &filePath, ".XML" );
+ oldFile = LFA_Open ( filePath.c_str(), 'w' );
+
+ if ( oldFile == 0 ) {
+
+ // The XML does not exist yet.
+
+ this->MakeClipFilePath ( &filePath, ".XML" );
+ oldFile = LFA_Create ( filePath.c_str() );
+ if ( oldFile == 0 ) XMP_Throw ( "Failure creating P2 legacy XML file", kXMPErr_ExternalFailure );
+ LFA_Write ( oldFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() );
+ LFA_Close ( oldFile );
+
+ } else if ( ! doSafeUpdate ) {
+
+ // Over write the existing XML file.
+
+ LFA_Seek ( oldFile, 0, SEEK_SET );
+ LFA_Truncate ( oldFile, 0 );
+ LFA_Write ( oldFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() );
+ LFA_Close ( oldFile );
+
+ } else {
+
+ // Do a safe update.
+
+ // *** We really need an LFA_SwapFiles utility.
+
+ this->MakeClipFilePath ( &filePath, ".XML" );
+
+ CreateTempFile ( filePath, &tempPath );
+ LFA_FileRef tempFile = LFA_Open ( tempPath.c_str(), 'w' );
+ LFA_Write ( tempFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() );
+ LFA_Close ( tempFile );
+
+ LFA_Close ( oldFile );
+ LFA_Delete ( filePath.c_str() );
+ LFA_Rename ( tempPath.c_str(), filePath.c_str() );
+
+ }
+
+ }
+
+ // Update the XMP file.
+
+ oldFile = this->parent->fileRef;
+
+ if ( oldFile == 0 ) {
+
+ // The XMP does not exist yet.
+
+ this->MakeClipFilePath ( &filePath, ".XMP" );
+ oldFile = LFA_Create ( filePath.c_str() );
+ if ( oldFile == 0 ) XMP_Throw ( "Failure creating P2 XMP file", kXMPErr_ExternalFailure );
+ LFA_Write ( oldFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() );
+ LFA_Close ( oldFile );
+
+ } else if ( ! doSafeUpdate ) {
+
+ // Over write the existing XMP file.
+
+ LFA_Seek ( oldFile, 0, SEEK_SET );
+ LFA_Truncate ( oldFile, 0 );
+ LFA_Write ( oldFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() );
+ LFA_Close ( oldFile );
+
+ } else {
+
+ // Do a safe update.
+
+ // *** We really need an LFA_SwapFiles utility.
+
+ this->MakeClipFilePath ( &filePath, ".XMP" );
+
+ CreateTempFile ( filePath, &tempPath );
+ LFA_FileRef tempFile = LFA_Open ( tempPath.c_str(), 'w' );
+ LFA_Write ( tempFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() );
+ LFA_Close ( tempFile );
+
+ LFA_Close ( oldFile );
+ LFA_Delete ( filePath.c_str() );
+ LFA_Rename ( tempPath.c_str(), filePath.c_str() );
+
+ }
+
+ this->parent->fileRef = 0;
+
+} // P2_MetaHandler::UpdateFile
+
+// =================================================================================================
+// P2_MetaHandler::WriteFile
+// =========================
+
+void P2_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath )
+{
+
+ // ! WriteFile is not supposed to be called for handlers that own the file.
+ XMP_Throw ( "P2_MetaHandler::WriteFile should not be called", kXMPErr_InternalFailure );
+
+} // P2_MetaHandler::WriteFile
+
+// =================================================================================================
diff --git a/source/XMPFiles/FileHandlers/P2_Handler.hpp b/source/XMPFiles/FileHandlers/P2_Handler.hpp
new file mode 100644
index 0000000..8581fbd
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/P2_Handler.hpp
@@ -0,0 +1,106 @@
+#ifndef __P2_Handler_hpp__
+#define __P2_Handler_hpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XMP_Environment.h" // ! This must be the first include.
+
+#include "XMPFiles_Impl.hpp"
+
+#include "ExpatAdapter.hpp"
+
+#include "MD5.h"
+
+// =================================================================================================
+/// \file P2_Handler.hpp
+/// \brief Folder format handler for P2.
+///
+/// This header ...
+///
+// =================================================================================================
+
+// *** Could derive from Basic_Handler - buffer file tail in a temp file.
+
+extern XMPFileHandler * P2_MetaHandlerCTor ( XMPFiles * parent );
+
+extern bool P2_CheckFormat ( XMP_FileFormat format,
+ const std::string & rootPath,
+ const std::string & gpName,
+ const std::string & parentName,
+ const std::string & leafName,
+ XMPFiles * parent );
+
+static const XMP_OptionBits kP2_HandlerFlags = (kXMPFiles_CanInjectXMP |
+ kXMPFiles_CanExpand |
+ kXMPFiles_CanRewrite |
+ kXMPFiles_PrefersInPlace |
+ kXMPFiles_CanReconcile |
+ kXMPFiles_AllowsOnlyXMP |
+ kXMPFiles_ReturnsRawPacket |
+ kXMPFiles_HandlerOwnsFile |
+ kXMPFiles_AllowsSafeUpdate |
+ kXMPFiles_UsesSidecarXMP |
+ kXMPFiles_FolderBasedFormat);
+
+class P2_MetaHandler : public XMPFileHandler
+{
+public:
+
+ void CacheFileData();
+ void ProcessXMP();
+
+ XMP_OptionBits GetSerializeOptions() // *** These should be standard for standalone XMP files.
+ { return (kXMP_UseCompactFormat | kXMP_OmitPacketWrapper); };
+
+ void UpdateFile ( bool doSafeUpdate );
+ void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath );
+
+ P2_MetaHandler ( XMPFiles * _parent );
+ virtual ~P2_MetaHandler();
+
+private:
+
+ P2_MetaHandler() : expat(0), clipMetadata(0), clipContent(0) {}; // Hidden on purpose.
+
+ void MakeClipFilePath ( std::string * path, XMP_StringPtr suffix );
+ void MakeLegacyDigest ( std::string * digestStr );
+ void CleanupLegacyXML();
+
+ void DigestLegacyItem ( MD5_CTX & md5Context, XML_NodePtr legacyContext, XMP_StringPtr legacyPropName );
+ void DigestLegacyRelations ( MD5_CTX & md5Context );
+
+ void SetXMPPropertyFromLegacyXML ( bool digestFound,
+ XML_NodePtr legacyContext,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr legacyPropName,
+ bool isLocalized );
+
+ void SetRelationsFromLegacyXML ( bool digestFound );
+ void SetAudioInfoFromLegacyXML ( bool digestFound );
+ void SetVideoInfoFromLegacyXML ( bool digestFound );
+ void SetDurationFromLegacyXML ( bool digestFound );
+
+ void SetVideoFrameInfoFromLegacyXML ( XML_NodePtr legacyVideoContext, bool digestFound );
+ void SetStartTimecodeFromLegacyXML ( XML_NodePtr legacyVideoContext, bool digestFound );
+
+ XML_Node * ForceChildElement ( XML_Node * parent, XMP_StringPtr localName, int indent = 0 );
+
+ std::string rootPath, clipName, p2NS, defaultNS;
+
+ ExpatAdapter * expat;
+ XML_Node * clipMetadata; // ! Don't delete, points into the Expat tree.
+ XML_Node * clipContent; // ! Don't delete, points into the Expat tree.
+
+}; // P2_MetaHandler
+
+// =================================================================================================
+
+#endif /* __P2_Handler_hpp__ */
diff --git a/source/XMPFiles/FileHandlers/PNG_Handler.cpp b/source/XMPFiles/FileHandlers/PNG_Handler.cpp
index 44a08dd..7e82eaa 100644
--- a/source/XMPFiles/FileHandlers/PNG_Handler.cpp
+++ b/source/XMPFiles/FileHandlers/PNG_Handler.cpp
@@ -138,7 +138,7 @@ void PNG_MetaHandler::ProcessXMP()
XMP_Assert ( this->containsXMP );
XMP_StringPtr packetStr = this->xmpPacket.c_str();
- XMP_StringLen packetLen = this->xmpPacket.size();
+ XMP_StringLen packetLen = (XMP_StringLen)this->xmpPacket.size();
this->xmpObj.ParseFromBuffer ( packetStr, packetLen );
@@ -160,7 +160,7 @@ void PNG_MetaHandler::UpdateFile ( bool doSafeUpdate )
if ( doSafeUpdate ) XMP_Throw ( "PNG_MetaHandler::UpdateFile: Safe update not supported", kXMPErr_Unavailable );
XMP_StringPtr packetStr = xmpPacket.c_str();
- XMP_StringLen packetLen = xmpPacket.size();
+ XMP_StringLen packetLen = (XMP_StringLen)xmpPacket.size();
if ( packetLen == 0 ) return;
LFA_FileRef fileRef(this->parent->fileRef);
@@ -227,7 +227,7 @@ void PNG_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sou
if (PNG_Support::CheckIHDRChunkHeader(chunk))
{
XMP_StringPtr packetStr = xmpPacket.c_str();
- XMP_StringLen packetLen = xmpPacket.size();
+ XMP_StringLen packetLen = (XMP_StringLen)xmpPacket.size();
PNG_Support::WriteXMPChunk(destRef, packetLen, packetStr );
}
diff --git a/source/XMPFiles/FileHandlers/PSD_Handler.cpp b/source/XMPFiles/FileHandlers/PSD_Handler.cpp
index 6d9523e..600be29 100644
--- a/source/XMPFiles/FileHandlers/PSD_Handler.cpp
+++ b/source/XMPFiles/FileHandlers/PSD_Handler.cpp
@@ -1,6 +1,6 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -249,7 +249,12 @@ void PSD_MetaHandler::ProcessXMP()
this->iptcMgr = new IPTC_Reader();
this->exifMgr = new TIFF_MemoryReader();
} else {
- this->iptcMgr = new IPTC_Writer();
+ #if ! XMP_UNIXBuild
+ this->iptcMgr = new IPTC_Writer(); // ! Parse it later.
+ #else
+ // ! Hack until the legacy-as-local issues are resolved for generic UNIX.
+ this->iptcMgr = new IPTC_Reader(); // ! Import IPTC but don't export it.
+ #endif
this->exifMgr = new TIFF_FileWriter();
}
@@ -287,7 +292,7 @@ void PSD_MetaHandler::ProcessXMP()
XMP_Assert ( this->containsXMP );
// Common code takes care of packetInfo.charForm, .padSize, and .writeable.
XMP_StringPtr packetStr = this->xmpPacket.c_str();
- XMP_StringLen packetLen = this->xmpPacket.size();
+ XMP_StringLen packetLen = (XMP_StringLen)this->xmpPacket.size();
try {
this->xmpObj.ParseFromBuffer ( packetStr, packetLen );
} catch ( ... ) {
@@ -327,14 +332,20 @@ void PSD_MetaHandler::UpdateFile ( bool doSafeUpdate )
if ( oldPacketOffset == kXMPFiles_UnknownOffset ) oldPacketOffset = 0; // ! Simplify checks.
if ( oldPacketLength == kXMPFiles_UnknownLength ) oldPacketLength = 0;
- bool doInPlace = (oldPacketOffset != 0) && (oldPacketLength != 0); // ! Has old packet and new packet fits.
- if ( doInPlace && (this->psirMgr.IsLegacyChanged()) ) doInPlace = false;
+ bool doInPlace = (this->xmpPacket.size() <= (size_t)this->packetInfo.length);
+ if ( this->psirMgr.IsLegacyChanged() ) doInPlace = false;
if ( doInPlace ) {
#if GatherPerformanceData
sAPIPerf->back().extraInfo += ", PSD in-place update";
#endif
+
+ if ( this->xmpPacket.size() < (size_t)this->packetInfo.length ) {
+ // They ought to match, cheap to be sure.
+ size_t extraSpace = (size_t)this->packetInfo.length - this->xmpPacket.size();
+ this->xmpPacket.append ( extraSpace, ' ' );
+ }
LFA_FileRef liveFile = this->parent->fileRef;
@@ -343,7 +354,7 @@ void PSD_MetaHandler::UpdateFile ( bool doSafeUpdate )
// printf ( "PSD_MetaHandler::UpdateFile - XMP in-place packet offset %lld (0x%llX), size %d\n",
// oldPacketOffset, oldPacketOffset, this->xmpPacket.size() );
LFA_Seek ( liveFile, oldPacketOffset, SEEK_SET );
- LFA_Write ( liveFile, this->xmpPacket.c_str(), this->xmpPacket.size() );
+ LFA_Write ( liveFile, this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() );
} else {
@@ -418,10 +429,10 @@ void PSD_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sou
this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat );
this->packetInfo.offset = kXMPFiles_UnknownOffset;
- this->packetInfo.length = this->xmpPacket.size();
- this->packetInfo.padSize = GetPacketPadSize ( this->xmpPacket.c_str(), this->xmpPacket.size() );
+ this->packetInfo.length = (XMP_StringLen)this->xmpPacket.size();
+ FillPacketInfo ( this->xmpPacket, &this->packetInfo );
- this->psirMgr.SetImgRsrc ( kPSIR_XMP, this->xmpPacket.c_str(), this->xmpPacket.size() );
+ this->psirMgr.SetImgRsrc ( kPSIR_XMP, this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() );
// Copy the file header and color mode section, then write the updated image resource section,
// and copy the tail of the source file (layer and mask section to EOF).
diff --git a/source/XMPFiles/FileHandlers/PostScript_Handler.cpp b/source/XMPFiles/FileHandlers/PostScript_Handler.cpp
index 316b37c..2b74646 100644
--- a/source/XMPFiles/FileHandlers/PostScript_Handler.cpp
+++ b/source/XMPFiles/FileHandlers/PostScript_Handler.cpp
@@ -23,7 +23,7 @@ using namespace std;
// =================================================================================================
static const char * kPSFileTag = "%!PS-Adobe-";
-static const int kPSFileTagLen = strlen ( kPSFileTag );
+static const size_t kPSFileTagLen = strlen ( kPSFileTag );
// =================================================================================================
// PostScript_MetaHandlerCTor
@@ -193,10 +193,10 @@ PostScript_MetaHandler::~PostScript_MetaHandler()
// the XMP marker is found, look for the MainFirst/MainLast/NoMain options.
static const char * kPSContainsXMPString = "%ADO_ContainsXMP:";
-static const int kPSContainsXMPLength = strlen ( kPSContainsXMPString );
+static const size_t kPSContainsXMPLength = strlen ( kPSContainsXMPString );
static const char * kPSEndCommentString = "%%EndComments"; // ! Assumed shorter than kPSContainsXMPString.
-static const int kPSEndCommentLength = strlen ( kPSEndCommentString );
+static const size_t kPSEndCommentLength = strlen ( kPSEndCommentString );
int PostScript_MetaHandler::FindPostScriptHint()
{
@@ -430,7 +430,7 @@ bool PostScript_MetaHandler::FindLastPacket()
LFA_Seek ( fileRef, 0, SEEK_SET ); // Seek back to the beginning of the file.
- for ( bufPos = 0; bufPos < fileLen; bufPos += bufLen ) {
+ for ( bufPos = 0; bufPos < (size_t)fileLen; bufPos += bufLen ) {
if ( checkAbort && abortProc(abortArg) ) {
XMP_Throw ( "PostScript_MetaHandler::FindLastPacket - User abort", kXMPErr_UserAbort );
}
diff --git a/source/XMPFiles/FileHandlers/SWF_Handler.cpp b/source/XMPFiles/FileHandlers/SWF_Handler.cpp
new file mode 100644
index 0000000..100f79e
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/SWF_Handler.cpp
@@ -0,0 +1,397 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2007 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "SWF_Handler.hpp"
+
+#include "SWF_Support.hpp"
+
+
+using namespace std;
+
+// =================================================================================================
+/// \file SWF_Handler.hpp
+/// \brief File format handler for SWF.
+///
+/// This handler ...
+///
+// =================================================================================================
+
+// =================================================================================================
+// SWF_MetaHandlerCTor
+// ====================
+
+XMPFileHandler * SWF_MetaHandlerCTor ( XMPFiles * parent )
+{
+ return new SWF_MetaHandler ( parent );
+
+} // SWF_MetaHandlerCTor
+
+// =================================================================================================
+// SWF_CheckFormat
+// ===============
+
+bool SWF_CheckFormat ( XMP_FileFormat format,
+ XMP_StringPtr filePath,
+ LFA_FileRef fileRef,
+ XMPFiles * parent )
+{
+ IgnoreParam(format); IgnoreParam(fileRef); IgnoreParam(parent);
+ XMP_Assert ( format == kXMP_SWFFile );
+
+ IOBuffer ioBuf;
+
+ LFA_Seek ( fileRef, 0, SEEK_SET );
+ if ( ! CheckFileSpace ( fileRef, &ioBuf, SWF_SIGNATURE_LEN ) ) return false;
+
+ if ( !(CheckBytes ( ioBuf.ptr, SWF_F_SIGNATURE_DATA, SWF_SIGNATURE_LEN ) ||
+ CheckBytes(ioBuf.ptr, SWF_C_SIGNATURE_DATA, SWF_SIGNATURE_LEN)) )
+ return false;
+
+ return true;
+
+} // SWF_CheckFormat
+
+// =================================================================================================
+// SWF_MetaHandler::SWF_MetaHandler
+// ==================================
+
+SWF_MetaHandler::SWF_MetaHandler ( XMPFiles * _parent )
+{
+ this->parent = _parent;
+ this->handlerFlags = kSWF_HandlerFlags;
+ this->stdCharForm = kXMP_Char8Bit;
+
+}
+
+// =================================================================================================
+// SWF_MetaHandler::~SWF_MetaHandler
+// ===================================
+
+SWF_MetaHandler::~SWF_MetaHandler()
+{
+}
+
+// =================================================================================================
+// SWF_MetaHandler::CacheFileData
+// ===============================
+
+void SWF_MetaHandler::CacheFileData()
+{
+
+ this->containsXMP = false;
+
+ LFA_FileRef fileRef ( this->parent->fileRef );
+ if ( fileRef == 0) return;
+
+ SWF_Support::FileInfo fileInfo(fileRef, this->parent->filePath);
+ IO::InputStream * is = NULL;
+ if(fileInfo.IsCompressed())
+ {
+ XMP_Uns32 fileSize = fileInfo.GetSize();
+ is = new IO::ZIP::DeflateInputStream(fileRef, fileSize);
+
+ IO::ZIP::DeflateInputStream * in = dynamic_cast<IO::ZIP::DeflateInputStream*>(is);
+ in->Skip(SWF_COMPRESSION_BEGIN, IO::ZIP::DEFLATE_NO);
+ }
+ else
+ {
+ is = new IO::FileInputStream(fileRef);
+ is->Skip(SWF_COMPRESSION_BEGIN);
+ }
+
+ SWF_Support::TagState tagState;
+ //important flag to stop iteration over all tags when xmp flag within FileAttributeTag isn't set
+ tagState.cachingFile = true;
+
+ long numTags = SWF_Support::OpenSWF ( is, tagState );
+
+ is->Close();
+ delete is;
+
+ if ( numTags == 0 ) return;
+
+ if (tagState.hasXMP && tagState.xmpLen != 0)
+ {
+ this->xmpPacket.assign(tagState.xmpPacket);
+ this->containsXMP = true;
+ }
+ else
+ {
+ // no XMP
+ }
+
+
+} // SWF_MetaHandler::CacheFileData
+
+// =================================================================================================
+// SWF_MetaHandler::ProcessTNail
+// ==============================
+
+void SWF_MetaHandler::ProcessTNail()
+{
+
+ XMP_Throw ( "SWF_MetaHandler::ProcessTNail isn't implemented yet", kXMPErr_Unimplemented );
+
+} // SWF_MetaHandler::ProcessTNail
+
+// =================================================================================================
+// SWF_MetaHandler::ProcessXMP
+// ============================
+//
+// Process the raw XMP and legacy metadata that was previously cached.
+
+void SWF_MetaHandler::ProcessXMP()
+{
+
+ this->processedXMP = true; // Make sure we only come through here once.
+
+ // Process the XMP packet.
+
+ if ( ! this->xmpPacket.empty() ) {
+
+ XMP_Assert ( this->containsXMP );
+ XMP_StringPtr packetStr = this->xmpPacket.c_str();
+ XMP_StringLen packetLen = (XMP_StringLen)this->xmpPacket.size();
+
+ this->xmpObj.ParseFromBuffer ( packetStr, packetLen );
+
+ this->containsXMP = true;
+
+ }
+
+} // SWF_MetaHandler::ProcessXMP
+
+
+// =================================================================================================
+// XMPFileHandler::GetSerializeOptions
+// ===================================
+//
+// Override default implementation to ensure omitting xmp wrapper
+//
+XMP_OptionBits SWF_MetaHandler::GetSerializeOptions()
+{
+ return (kXMP_OmitPacketWrapper | kXMP_OmitAllFormatting | kXMP_OmitXMPMetaElement);
+} // XMPFileHandler::GetSerializeOptions
+
+
+// =================================================================================================
+// SWF_MetaHandler::UpdateFile
+// ============================
+
+void SWF_MetaHandler::UpdateFile ( bool doSafeUpdate )
+{
+ bool updated = false;
+
+ if ( ! this->needsUpdate ) return;
+ if ( doSafeUpdate ) XMP_Throw ( "SWF_MetaHandler::UpdateFile: Safe update not supported", kXMPErr_Unavailable );
+
+ LFA_FileRef sourceRef = this->parent->fileRef;
+ std::string sourcePath = this->parent->filePath;
+
+ SWF_Support::FileInfo fileInfo(sourceRef, sourcePath);
+
+ if(fileInfo.IsCompressed())
+ sourceRef = fileInfo.Decompress();
+
+ IO::InputStream * is = new IO::FileInputStream(sourceRef);
+ //processing SWF starts after byte SWF_COMPRESSION_BEGIN - currently 8 bytes
+ is->Skip(SWF_COMPRESSION_BEGIN);
+
+ SWF_Support::TagState tagState;
+
+ long numTags = SWF_Support::OpenSWF ( is, tagState );
+
+ //clean objects
+ is->Close();
+ delete is;
+
+ bool foundTag = false;
+ SWF_Support::TailBufferDef tailBuffer;
+
+
+ //find end position to measure tail buffer
+ tailBuffer.tailEndPosition = LFA_Seek(sourceRef, 0, SEEK_END);
+
+ SWF_Support::TagIterator curPos = tagState.tags.begin();
+ SWF_Support::TagIterator endPos = tagState.tags.end();
+
+ for( ;(curPos != endPos) && ! foundTag; ++curPos)
+ {
+ SWF_Support::TagData tag = *curPos;
+
+ //write XMP Tag at the beginning of the file
+ if(! tagState.hasXMP && ! tagState.hasFileAttrTag)
+ {
+ tailBuffer.tailStartPosition = tag.pos;
+ tailBuffer.writePosition = tag.pos;
+ foundTag = true;
+ }
+ //update existing XMP Tag
+ if(tagState.hasXMP && (tagState.xmpTag.pos == tag.pos))
+ {
+ ++curPos;
+ SWF_Support::TagData nextTag = *curPos;
+ tailBuffer.tailStartPosition = nextTag.pos;
+ tailBuffer.writePosition = tagState.xmpTag.pos;
+ foundTag = true;
+ }
+ //write XMP Tag after FileAttribute Tag
+ else if(! tagState.hasXMP && (tag.id == SWF_TAG_ID_FILEATTRIBUTES))
+ {
+ ++curPos;
+ SWF_Support::TagData nextTag = *curPos;
+ tailBuffer.tailStartPosition = nextTag.pos;
+ tailBuffer.writePosition = nextTag.pos;
+ foundTag = true;
+ }
+ }
+
+ //cache tail of file
+ XMP_Assert(tailBuffer.tailEndPosition > tailBuffer.tailStartPosition);
+ XMP_Uns32 tailSize = tailBuffer.GetTailSize();
+ XMP_Uns8 * buffer = new XMP_Uns8[tailSize];
+ SWF_Support::ReadBuffer(sourceRef, tailBuffer.tailStartPosition, tailSize, buffer);
+
+ //write new XMP packet
+ XMP_StringPtr packetStr = xmpPacket.c_str();
+ XMP_StringLen packetLen = (XMP_StringLen)xmpPacket.size();
+
+ LFA_Seek(sourceRef, tailBuffer.writePosition, SEEK_SET);
+ SWF_Support::WriteXMPTag(sourceRef, packetLen, packetStr);
+
+ // truncate to minimal size
+ LFA_Truncate(sourceRef, LFA_Tell(sourceRef));
+
+ //move tail of the file
+ LFA_Write(sourceRef, buffer, tailSize);
+
+ //cleaning buffer
+ delete [] buffer;
+
+ //update FileAttribute Tag if exists
+ if(tagState.hasFileAttrTag)
+ SWF_Support::UpdateFileAttrTag(sourceRef, tagState.fileAttrTag, tagState);
+
+
+ //update File Size
+ SWF_Support::UpdateHeader(sourceRef);
+
+ //compress file after writing XMP
+ if(fileInfo.IsCompressed())
+ {
+ fileInfo.Compress(sourceRef, this->parent->fileRef);
+ fileInfo.Clean();
+ }
+
+
+ if ( ! updated )return; // If there's an error writing the chunk, bail.
+
+ this->needsUpdate = false;
+
+} // SWF_MetaHandler::UpdateFile
+
+// =================================================================================================
+// SWF_MetaHandler::WriteFile
+// ===========================
+
+void SWF_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath )
+{
+
+ LFA_FileRef destRef = this->parent->fileRef;
+
+ SWF_Support::TagState tagState;
+
+ LFA_FileRef origRef(destRef);
+ std::string updatePath;
+
+
+ SWF_Support::FileInfo fileInfo(sourceRef, sourcePath);
+
+ if(fileInfo.IsCompressed())
+ {
+ sourceRef = fileInfo.Decompress();
+ CreateTempFile ( sourcePath, &updatePath, kCopyMacRsrc );
+ destRef = LFA_Open ( updatePath.c_str(), 'w' );
+ }
+
+ IO::InputStream * is = NULL;
+
+ is = new IO::FileInputStream(sourceRef);
+ is->Skip(SWF_COMPRESSION_BEGIN);
+
+ long numTags = SWF_Support::OpenSWF( is, tagState );
+
+ is->Close();
+ delete is;
+
+ if ( numTags == 0 ) return;
+
+ LFA_Truncate(destRef, 0);
+ SWF_Support::CopyHeader(sourceRef, destRef, tagState);
+
+ SWF_Support::TagIterator curPos = tagState.tags.begin();
+ SWF_Support::TagIterator endPos = tagState.tags.end();
+
+ XMP_StringPtr packetStr = xmpPacket.c_str();
+ XMP_StringLen packetLen = (XMP_StringLen)xmpPacket.size();
+
+ bool copying = true;
+ bool isXMPTagWritten = false;
+
+ for (; (curPos != endPos); ++curPos)
+ {
+ SWF_Support::TagData tag = *curPos;
+
+ // write XMP tag right after FileAttribute Tag if no XMP tag exists
+ if (! tagState.hasXMP && (tag.id == SWF_TAG_ID_FILEATTRIBUTES))
+ SWF_Support::WriteXMPTag(destRef, packetLen, packetStr );
+
+ //no FileAttribute Tag and no XMP tag write XMP Tag at the beginning of the file
+ if(!tagState.hasXMP && !tagState.hasFileAttrTag && ! isXMPTagWritten)
+ {
+ isXMPTagWritten = true;
+ SWF_Support::WriteXMPTag(destRef, packetLen, packetStr );
+ }
+
+ // write XMP tag where old XMP exists
+ if(tagState.hasXMP && (tag.pos == tagState.xmpTag.pos))
+ {
+ copying = false;
+ SWF_Support::WriteXMPTag(destRef, packetLen, packetStr );
+ }
+
+ // copy any other chunk
+ if(copying)
+ SWF_Support::CopyTag(sourceRef, destRef, tag);
+
+ copying = true;
+ }
+
+ // update FileAttribute Tag in new file
+ if(tagState.hasFileAttrTag)
+ SWF_Support::UpdateFileAttrTag(destRef, tagState.fileAttrTag, tagState);
+
+
+ // update file header by measuring new file size
+ SWF_Support::UpdateHeader(origRef);
+
+ //compress re-written file
+ if(fileInfo.IsCompressed())
+ {
+ fileInfo.Compress(destRef, origRef);
+ fileInfo.Clean();
+ LFA_Close(destRef);
+ LFA_Delete(updatePath.c_str());
+ }
+
+
+
+
+} // SWF_MetaHandler::WriteFile
+
diff --git a/source/XMPFiles/FileHandlers/SWF_Handler.hpp b/source/XMPFiles/FileHandlers/SWF_Handler.hpp
new file mode 100644
index 0000000..511ddd6
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/SWF_Handler.hpp
@@ -0,0 +1,65 @@
+#ifndef __SWF_Handler_hpp__
+#define __SWF_Handler_hpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2007 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+//#include "XMP_Environment.h" // ! This must be the first include.
+
+#include "XMPFiles_Impl.hpp"
+
+//#include "SWF_Support.hpp"
+
+// =================================================================================================
+/// \file SWF_Handler.hpp
+/// \brief File format handler for SWF.
+///
+/// This header ...
+///
+// =================================================================================================
+
+// *** Could derive from Basic_Handler - buffer file tail in a temp file.
+
+extern XMPFileHandler* SWF_MetaHandlerCTor ( XMPFiles* parent );
+
+extern bool SWF_CheckFormat ( XMP_FileFormat format,
+ XMP_StringPtr filePath,
+ LFA_FileRef fileRef,
+ XMPFiles* parent );
+
+static const XMP_OptionBits kSWF_HandlerFlags = ( kXMPFiles_CanInjectXMP |
+ kXMPFiles_CanExpand |
+ kXMPFiles_PrefersInPlace |
+ kXMPFiles_AllowsOnlyXMP |
+ kXMPFiles_ReturnsRawPacket
+ );
+
+class SWF_MetaHandler : public XMPFileHandler
+{
+public:
+
+ void CacheFileData();
+ void ProcessTNail();
+ void ProcessXMP();
+
+ XMP_OptionBits GetSerializeOptions();
+
+ void UpdateFile ( bool doSafeUpdate );
+ void WriteFile ( LFA_FileRef sourceRef, const std::string& sourcePath );
+
+ SWF_MetaHandler ( XMPFiles* parent );
+ virtual ~SWF_MetaHandler();
+
+
+
+}; // SWF_MetaHandler
+
+// =================================================================================================
+
+#endif /* __SWF_Handler_hpp__ */
diff --git a/source/XMPFiles/FileHandlers/Scanner_Handler.cpp b/source/XMPFiles/FileHandlers/Scanner_Handler.cpp
index 8d704a6..4959ca0 100644
--- a/source/XMPFiles/FileHandlers/Scanner_Handler.cpp
+++ b/source/XMPFiles/FileHandlers/Scanner_Handler.cpp
@@ -76,7 +76,7 @@ PickMainPacket ( std::vector<CandidateInfo>& candidates, bool beLenient )
int main = -1; // Assume the worst.
XMP_OptionBits options;
- int metaCount = candidates.size();
+ int metaCount = (int)candidates.size();
if ( metaCount == 0 ) return -1;
if ( metaCount == 1 ) return 0;
@@ -281,10 +281,10 @@ void Scanner_MetaHandler::CacheFileData()
try {
for ( bufPos = 0; bufPos < snips[pkt].fLength; bufPos += bufLen ) {
bufLen = kBufferSize;
- if ( (bufPos + bufLen) > snips[pkt].fLength ) bufLen = size_t ( snips[pkt].fLength - bufPos );
- (void) LFA_Read ( fileRef, buffer, bufLen, kLFA_RequireAll );
+ if ( (bufPos + bufLen) > (size_t)snips[pkt].fLength ) bufLen = size_t ( snips[pkt].fLength - bufPos );
+ (void) LFA_Read ( fileRef, buffer, (XMP_Int32)bufLen, kLFA_RequireAll );
xmpPacket.append ( (const char *)buffer, bufLen );
- newMeta->ParseFromBuffer ( (char *)buffer, bufLen, kXMP_ParseMoreBuffers );
+ newMeta->ParseFromBuffer ( (char *)buffer, (XMP_StringLen)bufLen, kXMP_ParseMoreBuffers );
}
newMeta->ParseFromBuffer ( 0, 0, kXMP_NoOptions );
} catch ( ... ) {
diff --git a/source/XMPFiles/FileHandlers/SonyHDV_Handler.cpp b/source/XMPFiles/FileHandlers/SonyHDV_Handler.cpp
new file mode 100644
index 0000000..2dca918
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/SonyHDV_Handler.cpp
@@ -0,0 +1,782 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "SonyHDV_Handler.hpp"
+
+#include "MD5.h"
+
+#if XMP_WinBuild
+ #pragma warning ( disable : 4996 ) // '...' was declared deprecated
+#endif
+
+using namespace std;
+
+// =================================================================================================
+/// \file SonyHDV_Handler.cpp
+/// \brief Folder format handler for Sony HDV.
+///
+/// This handler is for the Sony HDV video format. This is a pseudo-package, visible files but with
+/// a very well-defined layout and naming rules.
+///
+/// A typical Sony HDV layout looks like:
+///
+/// .../MyMovie/
+/// VIDEO/
+/// HDV/
+/// 00_0001_2007-08-06_165555.IDX
+/// 00_0001_2007-08-06_165555.M2T
+/// 00_0001_2007-08-06_171740.M2T
+/// 00_0001_2007-08-06_171740.M2T.ese
+/// tracks.dat
+///
+/// The logical clip name can be "00_0001" or "00_0001_" plus anything. We'll find the .IDX file,
+/// which defines the existence of the clip. Full file names as input will pull out the camera/clip
+/// parts and match in the same way. The .XMP file will use the date/time suffix from the .IDX file.
+// =================================================================================================
+
+// =================================================================================================
+// SonyHDV_CheckFormat
+// ===================
+//
+// This version does fairly simple checks. The top level folder (.../MyMovie) must contain the
+// VIDEO/HVR subtree. The HVR folder must contain a .IDX file for the desired clip. The name checks
+// are case insensitive.
+//
+// The state of the string parameters depends on the form of the path passed by the client. If the
+// client passed a logical clip path, like ".../MyMovie/00_0001", the parameters are:
+// rootPath - ".../MyMovie"
+// gpName - empty
+// parentName - empty
+// leafName - "00_0001"
+//
+// If the client passed a full file path, like ".../MyMovie/VIDEO/HVR/00_0001_2007-08-06_165555.M2T",
+// they are:
+// rootPath - ".../MyMovie"
+// gpName - "VIDEO"
+// parentName - "HVR"
+// leafName - "00_0001_2007-08-06_165555.M2T"
+//
+// The logical clip name can be short like "00_0001", or long like "00_0001_2007-08-06_165555". We
+// only key off of the portion before a second underscore.
+
+// ! The common code has shifted the gpName, parentName, and leafName strings to upper case. It has
+// ! also made sure that for a logical clip path the rootPath is an existing folder, and that the
+// ! file exists for a full file path.
+
+bool SonyHDV_CheckFormat ( XMP_FileFormat format,
+ const std::string & rootPath,
+ const std::string & gpName,
+ const std::string & parentName,
+ const std::string & leafName,
+ XMPFiles * parent )
+{
+ // Do some basic checks on the root path and component names.
+
+ if ( gpName.empty() != parentName.empty() ) return false; // Must be both empty or both non-empty.
+
+ std::string tempPath = rootPath;
+ tempPath += kDirChar;
+ tempPath += "VIDEO";
+
+ if ( gpName.empty() ) {
+ // This is the logical clip path case. Look for VIDEO/HVR subtree.
+ if ( GetChildMode ( tempPath, "HVR" ) != kFMode_IsFolder ) return false;
+ } else {
+ // This is the existing file case. Check the parent and grandparent names.
+ if ( (gpName != "VIDEO") || (parentName != "HVR") ) return false;
+ }
+
+ // Look for the clip's .IDX file. If found use that as the full clip name.
+
+ tempPath += kDirChar;
+ tempPath += "HVR";
+
+ std::string clipName = leafName;
+ int usCount = 0;
+ size_t i, limit = leafName.size();
+ for ( i = 0; i < limit; ++i ) {
+ if ( clipName[i] == '_' ) {
+ ++usCount;
+ if ( usCount == 2 ) break;
+ }
+ }
+ if ( i < limit ) clipName.erase ( i );
+ clipName += '_'; // Make sure a final '_' is there for the search comparisons.
+
+ XMP_FolderInfo folderInfo;
+ std::string childName;
+ bool found = false;
+
+ folderInfo.Open ( tempPath.c_str() );
+ while ( (! found) && folderInfo.GetNextChild ( &childName ) ) {
+ size_t childLen = childName.size();
+ if ( childLen < 4 ) continue;
+ MakeUpperCase ( &childName );
+ if ( childName.compare ( childLen-4, 4, ".IDX" ) != 0 ) continue;
+ if ( childName.compare ( 0, clipName.size(), clipName ) == 0 ) {
+ found = true;
+ clipName = childName;
+ clipName.erase ( childLen-4 );
+ }
+ }
+ if ( ! found ) return false;
+
+
+ // Disabled until Sony HDV clip spanning is supported.
+ // Since segments of spanned clips are currently considered separate entities,
+ // information such as frame count needs to be considered on a per segment basis. JPM
+ clipName = leafName;
+
+ // Set tempPath to <root>/<clip-name>, e.g. ".../MyMovie/00_0001_2007-08-06_165555". This is
+ // passed to the handler via the handlerTemp hackery.
+
+ tempPath = rootPath;
+ tempPath += kDirChar;
+ tempPath += clipName;
+
+ size_t pathLen = tempPath.size() + 1; // Include a terminating nul.
+ parent->handlerTemp = malloc ( pathLen );
+ if ( parent->handlerTemp == 0 ) XMP_Throw ( "No memory for SonyHDV clip info", kXMPErr_NoMemory );
+ memcpy ( parent->handlerTemp, tempPath.c_str(), pathLen ); // AUDIT: Safe, allocated above.
+
+ return true;
+
+} // SonyHDV_CheckFormat
+
+// =================================================================================================
+// ReadIDXFile
+// ===========
+
+#define ExtractTimeCodeByte(ch,mask) ( (((ch & mask) >> 4) * 10) + (ch & 0xF) )
+
+static bool ReadIDXFile ( const std::string& idxPath,
+ const std::string& clipName,
+ SXMPMeta* xmpObj,
+ bool& containsXMP,
+ MD5_CTX* md5Context,
+ bool digestFound )
+{
+ bool result = true;
+ containsXMP = false;
+
+ if ( clipName.size() != 25 ) return false;
+
+ try {
+
+
+ AutoFile idxFile;
+ idxFile.fileRef = LFA_Open ( idxPath.c_str(), 'r' );
+ if ( idxFile.fileRef == 0 ) return false; // The open failed.
+
+ struct SHDV_HeaderBlock
+ {
+ char mHeader[8];
+ unsigned char mValidFlag;
+ unsigned char mReserved;
+ unsigned char mECCTB;
+ unsigned char mSignalMode;
+ unsigned char mFileThousands;
+ unsigned char mFileHundreds;
+ unsigned char mFileTens;
+ unsigned char mFileUnits;
+ };
+
+ SHDV_HeaderBlock hdvHeaderBlock;
+ memset ( &hdvHeaderBlock, 0, sizeof(SHDV_HeaderBlock) );
+
+ LFA_Read ( idxFile.fileRef, hdvHeaderBlock.mHeader, 8 );
+ LFA_Read ( idxFile.fileRef, &hdvHeaderBlock.mValidFlag, 1 );
+ LFA_Read ( idxFile.fileRef, &hdvHeaderBlock.mReserved, 1 );
+ LFA_Read ( idxFile.fileRef, &hdvHeaderBlock.mECCTB, 1 );
+ LFA_Read ( idxFile.fileRef, &hdvHeaderBlock.mSignalMode, 1 );
+ LFA_Read ( idxFile.fileRef, &hdvHeaderBlock.mFileThousands, 1 );
+ LFA_Read ( idxFile.fileRef, &hdvHeaderBlock.mFileHundreds, 1 );
+ LFA_Read ( idxFile.fileRef, &hdvHeaderBlock.mFileTens, 1 );
+ LFA_Read ( idxFile.fileRef, &hdvHeaderBlock.mFileUnits, 1 );
+
+ const int fileCount = (hdvHeaderBlock.mFileThousands - '0') * 1000 +
+ (hdvHeaderBlock.mFileHundreds - '0') * 100 +
+ (hdvHeaderBlock.mFileTens - '0') * 10 +
+ (hdvHeaderBlock.mFileUnits - '0');
+
+ // Read file info block.
+ struct SHDV_FileBlock
+ {
+ char mDT[2];
+ unsigned char mFileNameYear;
+ unsigned char mFileNameMonth;
+ unsigned char mFileNameDay;
+ unsigned char mFileNameHour;
+ unsigned char mFileNameMinute;
+ unsigned char mFileNameSecond;
+ unsigned char mStartTimeCode[4];
+ unsigned char mTotalFrame[4];
+ };
+
+ SHDV_FileBlock hdvFileBlock;
+ memset ( &hdvFileBlock, 0, sizeof(SHDV_FileBlock) );
+
+ char filenameBuffer[256];
+ std::string fileDateAndTime = clipName.substr(8);
+
+ bool foundFileBlock = false;
+
+ for ( int i=0; ((i < fileCount) && (! foundFileBlock)); ++i ) {
+
+ LFA_Read ( idxFile.fileRef, hdvFileBlock.mDT, 2 );
+ LFA_Read ( idxFile.fileRef, &hdvFileBlock.mFileNameYear, 1 );
+ LFA_Read ( idxFile.fileRef, &hdvFileBlock.mFileNameMonth, 1 );
+ LFA_Read ( idxFile.fileRef, &hdvFileBlock.mFileNameDay, 1 );
+ LFA_Read ( idxFile.fileRef, &hdvFileBlock.mFileNameHour, 1 );
+ LFA_Read ( idxFile.fileRef, &hdvFileBlock.mFileNameMinute, 1 );
+ LFA_Read ( idxFile.fileRef, &hdvFileBlock.mFileNameSecond, 1 );
+ LFA_Read ( idxFile.fileRef, &hdvFileBlock.mStartTimeCode, 4 );
+ LFA_Read ( idxFile.fileRef, &hdvFileBlock.mTotalFrame, 4 );
+
+ // Compose file name we expect from file contents and break out on match.
+ sprintf ( filenameBuffer, "%02d-%02d-%02d_%02d%02d%02d",
+ hdvFileBlock.mFileNameYear + 2000,
+ hdvFileBlock.mFileNameMonth,
+ hdvFileBlock.mFileNameDay,
+ hdvFileBlock.mFileNameHour,
+ hdvFileBlock.mFileNameMinute,
+ hdvFileBlock.mFileNameSecond );
+
+ foundFileBlock = (fileDateAndTime==filenameBuffer);
+
+ }
+
+ LFA_Close ( idxFile.fileRef );
+ idxFile.fileRef = 0;
+
+ if ( ! foundFileBlock ) return false;
+
+ // If digest calculation requested, calculate it and return.
+ if ( md5Context != 0 ) {
+ MD5Update ( md5Context, (XMP_Uns8*)(&hdvHeaderBlock), sizeof(SHDV_HeaderBlock) );
+ MD5Update ( md5Context, (XMP_Uns8*)(&hdvFileBlock), sizeof(SHDV_FileBlock) );
+ }
+
+ // The xmpObj parameter must be provided in order to extract XMP
+ if ( xmpObj == 0 ) return (md5Context != 0);
+
+ // Standard def?
+ const bool isSD = ((hdvHeaderBlock.mSignalMode == 0x80) || (hdvHeaderBlock.mSignalMode == 0));
+
+ // Progressive vs interlaced extracted from high bit of ECCTB byte
+ const bool clipIsProgressive = ((hdvHeaderBlock.mECCTB & 0x80) != 0);
+
+ // Lowest three bits contain frame rate information
+ const int sfr = (hdvHeaderBlock.mECCTB & 7) + (clipIsProgressive ? 0 : 8);
+
+ // Sample scale and sample size.
+ int clipSampleScale = 0;
+ int clipSampleSize = 0;
+ std::string frameRate;
+
+ // Frame rate
+ switch ( sfr ) {
+ case 0 : break; // Not valid in spec, but it's happening in test files.
+ case 1 : clipSampleScale = 24000; clipSampleSize = 1001; frameRate = "23.98p"; break;
+ case 3 : clipSampleScale = 25; clipSampleSize = 1; frameRate = "25p"; break;
+ case 4 : clipSampleScale = 30000; clipSampleSize = 1001; frameRate = "29.97p"; break;
+ case 11 : clipSampleScale = 25; clipSampleSize = 1; frameRate = "50i"; break;
+ case 12 : clipSampleScale = 30000; clipSampleSize = 1001; frameRate = "59.94i"; break;
+ }
+
+ containsXMP = true;
+
+ // Frame size and PAR for HD (not clear on SD yet).
+ std::string xmpString;
+ XMP_StringPtr xmpValue = 0;
+
+ if ( ! isSD ) {
+
+ if ( digestFound || (! xmpObj->DoesPropertyExist ( kXMP_NS_DM, "videoFrameSize" )) ) {
+
+ xmpValue = "1440";
+ xmpObj->GetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_DM, "w", &xmpString, 0 );
+ if ( xmpString != xmpValue ) {
+ xmpObj->SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "w", xmpValue, 0 );
+ }
+
+ xmpValue = "1080";
+ xmpObj->GetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_DM, "h", &xmpString, 0 );
+ if ( xmpString != xmpValue ) {
+ xmpObj->SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "h", xmpValue, 0 );
+ }
+
+ xmpValue = "pixels";
+ xmpObj->GetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_DM, "unit", &xmpString, 0 );
+ if ( xmpString != xmpValue ) {
+ xmpObj->SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "unit", xmpValue, 0 );
+ }
+ }
+
+ xmpValue = "4/3";
+ if ( digestFound || (! xmpObj->DoesPropertyExist ( kXMP_NS_DM, "videoPixelAspectRatio" )) ) {
+ xmpObj->SetProperty ( kXMP_NS_DM, "videoPixelAspectRatio", xmpValue, kXMP_DeleteExisting );
+ }
+
+ }
+
+ // Sample size and scale.
+ if ( clipSampleScale != 0 ) {
+
+ char buffer[255];
+
+ if ( digestFound || (! xmpObj->DoesPropertyExist ( kXMP_NS_DM, "startTimeScale" )) ) {
+ sprintf(buffer, "%d", clipSampleScale);
+ xmpValue = buffer;
+ xmpObj->SetProperty ( kXMP_NS_DM, "startTimeScale", xmpValue, kXMP_DeleteExisting );
+ }
+
+ if ( digestFound || (! xmpObj->DoesPropertyExist ( kXMP_NS_DM, "startTimeSampleSize" )) ) {
+ sprintf(buffer, "%d", clipSampleSize);
+ xmpValue = buffer;
+ xmpObj->SetProperty ( kXMP_NS_DM, "startTimeSampleSize", xmpValue, kXMP_DeleteExisting );
+ }
+
+ if ( digestFound || (! xmpObj->DoesPropertyExist ( kXMP_NS_DM, "duration" )) ) {
+
+ const int frameCount = (hdvFileBlock.mTotalFrame[0] << 24) + (hdvFileBlock.mTotalFrame[1] << 16) +
+ (hdvFileBlock.mTotalFrame[2] << 8) + hdvFileBlock.mTotalFrame[3];
+
+ sprintf ( buffer, "%d", frameCount );
+ xmpValue = buffer;
+ xmpObj->SetStructField ( kXMP_NS_DM, "duration", kXMP_NS_DM, "value", xmpValue, 0 );
+
+ sprintf ( buffer, "%d/%d", clipSampleSize, clipSampleScale );
+ xmpValue = buffer;
+ xmpObj->SetStructField ( kXMP_NS_DM, "duration", kXMP_NS_DM, "scale", xmpValue, 0 );
+
+ }
+
+ }
+
+ // Time Code.
+ if ( digestFound || (! xmpObj->DoesPropertyExist ( kXMP_NS_DM, "startTimecode" )) ) {
+
+ if ( (clipSampleScale != 0) && (clipSampleSize != 0) ) {
+
+ const bool dropFrame = ( (0x40 & hdvFileBlock.mStartTimeCode[0]) != 0 ) && ( sfr == 4 || sfr == 12 );
+ const char chDF = dropFrame ? ';' : ':';
+ const int tcFrames = ExtractTimeCodeByte ( hdvFileBlock.mStartTimeCode[0], 0x30 );
+ const int tcSeconds = ExtractTimeCodeByte ( hdvFileBlock.mStartTimeCode[1], 0x70 );
+ const int tcMinutes = ExtractTimeCodeByte ( hdvFileBlock.mStartTimeCode[2], 0x70 );
+ const int tcHours = ExtractTimeCodeByte ( hdvFileBlock.mStartTimeCode[3], 0x30 );
+
+ // HH:MM:SS:FF or HH;MM;SS;FF
+ char timecode[256];
+ sprintf ( timecode, "%02d%c%02d%c%02d%c%02d", tcHours, chDF, tcMinutes, chDF, tcSeconds, chDF, tcFrames );
+ std::string sonyTimeString = timecode;
+
+ xmpObj->GetStructField ( kXMP_NS_DM, "startTimecode", kXMP_NS_DM, "timeValue", &xmpString, 0 );
+ if ( xmpString != sonyTimeString ) {
+
+ xmpObj->SetStructField ( kXMP_NS_DM, "startTimecode", kXMP_NS_DM, "timeValue", sonyTimeString, 0 );
+
+ std::string timeFormat;
+ if ( clipSampleSize == 1 ) {
+
+ // 24, 25, 40, 50, 60
+ switch ( clipSampleScale ) {
+ case 24 : timeFormat = "24"; break;
+ case 25 : timeFormat = "25"; break;
+ case 50 : timeFormat = "50"; break;
+ default : XMP_Assert ( false );
+ }
+
+ timeFormat += "Timecode";
+
+ } else {
+
+ // 23.976, 29.97, 59.94
+ XMP_Assert ( clipSampleSize == 1001 );
+ switch ( clipSampleScale ) {
+ case 24000 : timeFormat = "23976"; break;
+ case 30000 : timeFormat = "2997"; break;
+ case 60000 : timeFormat = "5994"; break;
+ default : XMP_Assert( false ); break;
+ }
+
+ timeFormat += dropFrame ? "DropTimecode" : "NonDropTimecode";
+
+ }
+
+ xmpObj->SetStructField ( kXMP_NS_DM, "startTimecode", kXMP_NS_DM, "timeFormat", timeFormat, 0 );
+
+ }
+
+ }
+
+ }
+
+ if ( digestFound || (! xmpObj->DoesPropertyExist ( kXMP_NS_DM, "CreateDate" )) ) {
+
+ // Clip has date and time in the case of DT (otherwise date and time haven't been set).
+ bool clipHasDate = ((hdvFileBlock.mDT[0] == 'D') && (hdvFileBlock.mDT[1] == 'T'));
+
+ // Creation date
+ if ( clipHasDate ) {
+
+ // YYYY-MM-DDThh:mm:ssZ
+ char date[256];
+ sprintf ( date, "%4d-%02d-%02dT%02d:%02d:%02dZ",
+ hdvFileBlock.mFileNameYear + 2000,
+ hdvFileBlock.mFileNameMonth,
+ hdvFileBlock.mFileNameDay,
+ hdvFileBlock.mFileNameHour,
+ hdvFileBlock.mFileNameMinute,
+ hdvFileBlock.mFileNameSecond );
+
+ XMP_StringPtr xmpDate = date;
+ xmpObj->SetProperty ( kXMP_NS_XMP, "CreateDate", xmpDate, kXMP_DeleteExisting );
+
+ }
+
+ }
+
+ // Frame rate.
+ if ( digestFound || (! xmpObj->DoesPropertyExist ( kXMP_NS_DM, "videoFrameRate" )) ) {
+
+ if ( frameRate.size() != 0 ) {
+ xmpString = frameRate;
+ xmpObj->SetProperty ( kXMP_NS_DM, "videoFrameRate", xmpString, kXMP_DeleteExisting );
+ }
+
+ }
+
+ } catch ( ... ) {
+
+ result = false;
+
+ }
+
+ return result;
+
+} // ReadIDXFile
+
+// =================================================================================================
+// SonyHDV_MetaHandlerCTor
+// =======================
+
+XMPFileHandler * SonyHDV_MetaHandlerCTor ( XMPFiles * parent )
+{
+ return new SonyHDV_MetaHandler ( parent );
+
+} // SonyHDV_MetaHandlerCTor
+
+// =================================================================================================
+// SonyHDV_MetaHandler::SonyHDV_MetaHandler
+// ========================================
+
+SonyHDV_MetaHandler::SonyHDV_MetaHandler ( XMPFiles * _parent )
+{
+
+ this->parent = _parent; // Inherited, can't set in the prefix.
+ this->handlerFlags = kSonyHDV_HandlerFlags;
+ this->stdCharForm = kXMP_Char8Bit;
+
+ // Extract the root path and clip name.
+
+ XMP_Assert ( this->parent->handlerTemp != 0 );
+
+ this->rootPath.assign ( (char*) this->parent->handlerTemp );
+ free ( this->parent->handlerTemp );
+ this->parent->handlerTemp = 0;
+
+ SplitLeafName ( &this->rootPath, &this->clipName );
+
+} // SonyHDV_MetaHandler::SonyHDV_MetaHandler
+
+// =================================================================================================
+// SonyHDV_MetaHandler::~SonyHDV_MetaHandler
+// =========================================
+
+SonyHDV_MetaHandler::~SonyHDV_MetaHandler()
+{
+
+ if ( this->parent->handlerTemp != 0 ) {
+ free ( this->parent->handlerTemp );
+ this->parent->handlerTemp = 0;
+ }
+
+} // SonyHDV_MetaHandler::~SonyHDV_MetaHandler
+
+// =================================================================================================
+// SonyHDV_MetaHandler::MakeClipFilePath
+// =====================================
+
+void SonyHDV_MetaHandler::MakeClipFilePath ( std::string * path, XMP_StringPtr suffix )
+{
+
+ *path = this->rootPath;
+ *path += kDirChar;
+ *path += "VIDEO";
+ *path += kDirChar;
+ *path += "HVR";
+ *path += kDirChar;
+ *path += this->clipName;
+ *path += suffix;
+
+} // SonyHDV_MetaHandler::MakeClipFilePath
+
+// =================================================================================================
+// SonyHDV_MetaHandler::MakeIndexFilePath
+// ======================================
+
+bool SonyHDV_MetaHandler::MakeIndexFilePath ( std::string& idxPath, const std::string& rootPath, const std::string& leafName )
+{
+ std::string tempPath;
+ tempPath = rootPath;
+ tempPath += kDirChar;
+ tempPath += "VIDEO";
+ tempPath += kDirChar;
+ tempPath += "HVR";
+
+ idxPath = tempPath;
+ idxPath += kDirChar;
+ idxPath += leafName;
+ idxPath += ".IDX";
+
+ // Default case
+ if ( GetFileMode ( idxPath.c_str() ) == kFMode_IsFile ) return true;
+
+ // Spanned clip case
+
+ // Scanning code taken from SonyHDV_CheckFormat
+ // Can be isolated to a separate function.
+
+ std::string clipName = leafName;
+ int usCount = 0;
+ size_t i, limit = leafName.size();
+
+ for ( i = 0; i < limit; ++i ) {
+ if ( clipName[i] == '_' ) {
+ ++usCount;
+ if ( usCount == 2 ) break;
+ }
+ }
+
+ if ( i < limit ) clipName.erase ( i );
+ clipName += '_'; // Make sure a final '_' is there for the search comparisons.
+
+ XMP_FolderInfo folderInfo;
+ std::string childName;
+ bool found = false;
+
+ folderInfo.Open ( tempPath.c_str() );
+ while ( (! found) && folderInfo.GetNextChild ( &childName ) ) {
+ size_t childLen = childName.size();
+ if ( childLen < 4 ) continue;
+ MakeUpperCase ( &childName );
+ if ( childName.compare ( childLen-4, 4, ".IDX" ) != 0 ) continue;
+ if ( childName.compare ( 0, clipName.size(), clipName ) == 0 ) {
+ found = true;
+ clipName = childName;
+ clipName.erase ( childLen-4 );
+ }
+ }
+ if ( ! found ) return false;
+
+ idxPath = tempPath;
+ idxPath += kDirChar;
+ idxPath += clipName;
+ idxPath += ".IDX";
+
+ return true;
+}
+
+// =================================================================================================
+// SonyHDV_MetaHandler::MakeLegacyDigest
+// =====================================
+
+#define kHexDigits "0123456789ABCDEF"
+
+void SonyHDV_MetaHandler::MakeLegacyDigest ( std::string * digestStr )
+{
+ std::string idxPath;
+ if ( ! this->MakeIndexFilePath ( idxPath, this->rootPath, this->clipName ) ) return;
+
+ MD5_CTX context;
+ unsigned char digestBin [16];
+ bool dummy = false;
+ MD5Init ( &context );
+ ReadIDXFile ( idxPath, this->clipName, 0, dummy, &context, false );
+ MD5Final ( digestBin, &context );
+
+ char buffer [40];
+ for ( int in = 0, out = 0; in < 16; in += 1, out += 2 ) {
+ XMP_Uns8 byte = digestBin[in];
+ buffer[out] = kHexDigits [ byte >> 4 ];
+ buffer[out+1] = kHexDigits [ byte & 0xF ];
+ }
+ buffer[32] = 0;
+ digestStr->erase();
+ digestStr->append ( buffer, 32 );
+
+} // MakeLegacyDigest
+
+// =================================================================================================
+// SonyHDV_MetaHandler::CacheFileData
+// ==================================
+
+void SonyHDV_MetaHandler::CacheFileData()
+{
+ XMP_Assert ( (! this->containsXMP) && (! this->containsTNail) );
+
+ // See if the clip's .XMP file exists.
+
+ std::string xmpPath;
+ this->MakeClipFilePath ( &xmpPath, ".XMP" );
+ if ( GetFileMode ( xmpPath.c_str() ) != kFMode_IsFile ) return; // No XMP.
+
+ // Read the entire .XMP file.
+
+ char openMode = 'r';
+ if ( this->parent->openFlags & kXMPFiles_OpenForUpdate ) openMode = 'w';
+
+ LFA_FileRef xmpFile = LFA_Open ( xmpPath.c_str(), openMode );
+ if ( xmpFile == 0 ) return; // The open failed.
+
+ XMP_Int64 xmpLen = LFA_Measure ( xmpFile );
+ if ( xmpLen > 100*1024*1024 ) {
+ XMP_Throw ( "SonyHDV XMP is outrageously large", kXMPErr_InternalFailure ); // Sanity check.
+ }
+
+ this->xmpPacket.erase();
+ this->xmpPacket.reserve ( (size_t)xmpLen );
+ this->xmpPacket.append ( (size_t)xmpLen, ' ' );
+
+ XMP_Int32 ioCount = LFA_Read ( xmpFile, (void*)this->xmpPacket.data(), (XMP_Int32)xmpLen, kLFA_RequireAll );
+ XMP_Assert ( ioCount == xmpLen );
+
+ this->packetInfo.offset = 0;
+ this->packetInfo.length = (XMP_Int32)xmpLen;
+ FillPacketInfo ( this->xmpPacket, &this->packetInfo );
+
+ XMP_Assert ( this->parent->fileRef == 0 );
+ if ( openMode == 'r' ) {
+ LFA_Close ( xmpFile );
+ } else {
+ this->parent->fileRef = xmpFile;
+ }
+
+ this->containsXMP = true;
+
+} // SonyHDV_MetaHandler::CacheFileData
+
+// =================================================================================================
+// SonyHDV_MetaHandler::ProcessXMP
+// ===============================
+
+void SonyHDV_MetaHandler::ProcessXMP()
+{
+ if ( this->processedXMP ) return;
+ this->processedXMP = true; // Make sure only called once.
+
+ if ( this->containsXMP ) {
+ this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() );
+ }
+
+ // Check the legacy digest.
+ std::string oldDigest, newDigest;
+ bool digestFound;
+ digestFound = this->xmpObj.GetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "SonyHDV", &oldDigest, 0 );
+ if ( digestFound ) {
+ this->MakeLegacyDigest ( &newDigest );
+ if ( oldDigest == newDigest ) return;
+ }
+
+ // Read the IDX legacy.
+ std::string idxPath;
+ if ( ! this->MakeIndexFilePath ( idxPath, this->rootPath, this->clipName ) ) return;
+ ReadIDXFile ( idxPath, this->clipName, &this->xmpObj, this->containsXMP, 0, digestFound );
+
+} // SonyHDV_MetaHandler::ProcessXMP
+
+// =================================================================================================
+// SonyHDV_MetaHandler::UpdateFile
+// ===============================
+//
+// Note that UpdateFile is only called from XMPFiles::CloseFile, so it is OK to close the file here.
+
+void SonyHDV_MetaHandler::UpdateFile ( bool doSafeUpdate )
+{
+ if ( ! this->needsUpdate ) return;
+ this->needsUpdate = false; // Make sure only called once.
+
+ std::string newDigest;
+ this->MakeLegacyDigest ( &newDigest );
+ this->xmpObj.SetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "SonyHDV", newDigest.c_str(), kXMP_DeleteExisting );
+
+ LFA_FileRef oldFile = this->parent->fileRef;
+
+ this->xmpObj.SerializeToBuffer ( &this->xmpPacket, this->GetSerializeOptions() );
+
+ if ( oldFile == 0 ) {
+
+ // The XMP does not exist yet.
+
+ std::string xmpPath;
+ this->MakeClipFilePath ( &xmpPath, ".XMP" );
+
+ LFA_FileRef xmpFile = LFA_Create ( xmpPath.c_str() );
+ if ( xmpFile == 0 ) XMP_Throw ( "Failure creating SonyHDV XMP file", kXMPErr_ExternalFailure );
+ LFA_Write ( xmpFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() );
+ LFA_Close ( xmpFile );
+
+ } else if ( ! doSafeUpdate ) {
+
+ // Over write the existing XMP file.
+
+ LFA_Seek ( oldFile, 0, SEEK_SET );
+ LFA_Truncate ( oldFile, 0 );
+ LFA_Write ( oldFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() );
+ LFA_Close ( oldFile );
+
+ } else {
+
+ // Do a safe update.
+
+ // *** We really need an LFA_SwapFiles utility.
+
+ std::string xmpPath, tempPath;
+
+ this->MakeClipFilePath ( &xmpPath, ".XMP" );
+
+ CreateTempFile ( xmpPath, &tempPath );
+ LFA_FileRef tempFile = LFA_Open ( tempPath.c_str(), 'w' );
+ LFA_Write ( tempFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() );
+ LFA_Close ( tempFile );
+
+ LFA_Close ( oldFile );
+ LFA_Delete ( xmpPath.c_str() );
+ LFA_Rename ( tempPath.c_str(), xmpPath.c_str() );
+
+ }
+
+ this->parent->fileRef = 0;
+
+} // SonyHDV_MetaHandler::UpdateFile
+
+// =================================================================================================
+// SonyHDV_MetaHandler::WriteFile
+// ==============================
+
+void SonyHDV_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath )
+{
+
+ // ! WriteFile is not supposed to be called for handlers that own the file.
+ XMP_Throw ( "SonyHDV_MetaHandler::WriteFile should not be called", kXMPErr_InternalFailure );
+
+} // SonyHDV_MetaHandler::WriteFile
+
+// =================================================================================================
diff --git a/source/XMPFiles/FileHandlers/SonyHDV_Handler.hpp b/source/XMPFiles/FileHandlers/SonyHDV_Handler.hpp
new file mode 100644
index 0000000..a69f0dc
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/SonyHDV_Handler.hpp
@@ -0,0 +1,77 @@
+#ifndef __SonyHDV_Handler_hpp__
+#define __SonyHDV_Handler_hpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XMP_Environment.h" // ! This must be the first include.
+
+#include "XMPFiles_Impl.hpp"
+
+#include "ExpatAdapter.hpp"
+
+// =================================================================================================
+/// \file SonyHDV_Handler.hpp
+/// \brief Folder format handler for SonyHDV.
+///
+/// This header ...
+///
+// =================================================================================================
+
+extern XMPFileHandler * SonyHDV_MetaHandlerCTor ( XMPFiles * parent );
+
+extern bool SonyHDV_CheckFormat ( XMP_FileFormat format,
+ const std::string & rootPath,
+ const std::string & gpName,
+ const std::string & parentName,
+ const std::string & leafName,
+ XMPFiles * parent );
+
+static const XMP_OptionBits kSonyHDV_HandlerFlags = (kXMPFiles_CanInjectXMP |
+ kXMPFiles_CanExpand |
+ kXMPFiles_CanRewrite |
+ kXMPFiles_PrefersInPlace |
+ kXMPFiles_CanReconcile |
+ kXMPFiles_AllowsOnlyXMP |
+ kXMPFiles_ReturnsRawPacket |
+ kXMPFiles_HandlerOwnsFile |
+ kXMPFiles_AllowsSafeUpdate |
+ kXMPFiles_FolderBasedFormat);
+
+class SonyHDV_MetaHandler : public XMPFileHandler
+{
+public:
+
+ void CacheFileData();
+ void ProcessXMP();
+
+ XMP_OptionBits GetSerializeOptions() // *** These should be standard for standalone XMP files.
+ { return (kXMP_UseCompactFormat | kXMP_OmitPacketWrapper); };
+
+ void UpdateFile ( bool doSafeUpdate );
+ void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath );
+
+ SonyHDV_MetaHandler ( XMPFiles * _parent );
+ virtual ~SonyHDV_MetaHandler();
+
+private:
+
+ SonyHDV_MetaHandler() {}; // Hidden on purpose.
+
+ void MakeClipFilePath ( std::string * path, XMP_StringPtr suffix );
+ bool MakeIndexFilePath ( std::string& idxPath, const std::string& rootPath, const std::string& leafName );
+ void MakeLegacyDigest ( std::string * digestStr );
+
+ std::string rootPath, clipName;
+
+}; // SonyHDV_MetaHandler
+
+// =================================================================================================
+
+#endif /* __SonyHDV_Handler_hpp__ */
diff --git a/source/XMPFiles/FileHandlers/TIFF_Handler.cpp b/source/XMPFiles/FileHandlers/TIFF_Handler.cpp
index e63b28c..a12e718 100644
--- a/source/XMPFiles/FileHandlers/TIFF_Handler.cpp
+++ b/source/XMPFiles/FileHandlers/TIFF_Handler.cpp
@@ -1,6 +1,6 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -120,6 +120,22 @@ void TIFF_MetaHandler::CacheFileData()
this->tiffMgr.ParseFileStream ( fileRef );
+ TIFF_Manager::TagInfo dngInfo;
+ if ( this->tiffMgr.GetTag ( kTIFF_PrimaryIFD, kTIFF_DNGVersion, &dngInfo ) ) {
+
+ // Reject DNG files that are version 2.0 or beyond, this is being written at the time of
+ // DNG version 1.2. The DNG team says it is OK to use 2.0, not strictly 1.2. Use the
+ // DNGBackwardVersion if it is present, else the DNGVersion. Note that the version value is
+ // supposed to be type BYTE, so the file order is always essentially big endian.
+
+ XMP_Uns8 majorVersion = *((XMP_Uns8*)dngInfo.dataPtr); // Start with DNGVersion.
+ if ( this->tiffMgr.GetTag ( kTIFF_PrimaryIFD, kTIFF_DNGBackwardVersion, &dngInfo ) ) {
+ majorVersion = *((XMP_Uns8*)dngInfo.dataPtr); // Use DNGBackwardVersion if possible.
+ }
+ if ( majorVersion > 1 ) XMP_Throw ( "DNG version beyond 1.x", kXMPErr_BadTIFF );
+
+ }
+
TIFF_Manager::TagInfo xmpInfo;
bool found = this->tiffMgr.GetTag ( kTIFF_PrimaryIFD, kTIFF_XMP, &xmpInfo );
@@ -198,7 +214,12 @@ void TIFF_MetaHandler::ProcessXMP()
this->iptcMgr = new IPTC_Reader();
} else {
this->psirMgr = new PSIR_FileWriter();
- this->iptcMgr = new IPTC_Writer();
+ #if ! XMP_UNIXBuild
+ this->iptcMgr = new IPTC_Writer(); // ! Parse it later.
+ #else
+ // ! Hack until the legacy-as-local issues are resolved for generic UNIX.
+ this->iptcMgr = new IPTC_Reader(); // ! Import IPTC but don't export it.
+ #endif
}
TIFF_Manager & tiff = this->tiffMgr; // Give the compiler help in recognizing non-aliases.
@@ -264,7 +285,7 @@ void TIFF_MetaHandler::ProcessXMP()
XMP_Assert ( this->containsXMP );
// Common code takes care of packetInfo.charForm, .padSize, and .writeable.
XMP_StringPtr packetStr = this->xmpPacket.c_str();
- XMP_StringLen packetLen = this->xmpPacket.size();
+ XMP_StringLen packetLen = (XMP_StringLen)this->xmpPacket.size();
try {
this->xmpObj.ParseFromBuffer ( packetStr, packetLen );
} catch ( ... ) {
@@ -312,21 +333,27 @@ void TIFF_MetaHandler::UpdateFile ( bool doSafeUpdate )
if ( oldPacketOffset == kXMPFiles_UnknownOffset ) oldPacketOffset = 0; // ! Simplify checks.
if ( oldPacketLength == kXMPFiles_UnknownLength ) oldPacketLength = 0;
- bool doInPlace = (oldPacketOffset != 0) && (oldPacketLength != 0); // ! Has old packet and new packet fits.
- if ( doInPlace && (this->tiffMgr.IsLegacyChanged()) ) doInPlace = false;
+ bool doInPlace = (this->xmpPacket.size() <= (size_t)this->packetInfo.length);
+ if ( this->tiffMgr.IsLegacyChanged() ) doInPlace = false;
if ( doInPlace ) {
#if GatherPerformanceData
sAPIPerf->back().extraInfo += ", TIFF in-place update";
#endif
+
+ if ( this->xmpPacket.size() < (size_t)this->packetInfo.length ) {
+ // They ought to match, cheap to be sure.
+ size_t extraSpace = (size_t)this->packetInfo.length - this->xmpPacket.size();
+ this->xmpPacket.append ( extraSpace, ' ' );
+ }
LFA_FileRef liveFile = this->parent->fileRef;
XMP_Assert ( this->xmpPacket.size() == (size_t)oldPacketLength ); // ! Done by common PutXMP logic.
LFA_Seek ( liveFile, oldPacketOffset, SEEK_SET );
- LFA_Write ( liveFile, this->xmpPacket.c_str(), this->xmpPacket.size() );
+ LFA_Write ( liveFile, this->xmpPacket.c_str(), (XMP_Int32)this->xmpPacket.size() );
} else {
@@ -337,10 +364,10 @@ void TIFF_MetaHandler::UpdateFile ( bool doSafeUpdate )
// Reserialize the XMP to get standard padding, PutXMP has probably done an in-place serialize.
this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat );
this->packetInfo.offset = kXMPFiles_UnknownOffset;
- this->packetInfo.length = this->xmpPacket.size();
- this->packetInfo.padSize = GetPacketPadSize ( this->xmpPacket.c_str(), this->xmpPacket.size() );
+ this->packetInfo.length = (XMP_Int32)this->xmpPacket.size();
+ FillPacketInfo ( this->xmpPacket, &this->packetInfo );
- this->tiffMgr.SetTag ( kTIFF_PrimaryIFD, kTIFF_XMP, kTIFF_UndefinedType, this->xmpPacket.size(), this->xmpPacket.c_str() );
+ this->tiffMgr.SetTag ( kTIFF_PrimaryIFD, kTIFF_XMP, kTIFF_UndefinedType, (XMP_Uns32)this->xmpPacket.size(), this->xmpPacket.c_str() );
this->tiffMgr.UpdateFileStream ( destRef );
diff --git a/source/XMPFiles/FileHandlers/UCF_Handler.cpp b/source/XMPFiles/FileHandlers/UCF_Handler.cpp
new file mode 100644
index 0000000..e9c2219
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/UCF_Handler.cpp
@@ -0,0 +1,846 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// ===============================================================================================
+
+#if XMP_WinBuild
+ #pragma warning ( disable : 4996 ) // '...' was declared deprecated
+#endif
+
+#include "UCF_Handler.hpp"
+
+#include "zlib.h"
+
+#include <time.h>
+
+#ifdef DYNAMIC_CRC_TABLE
+ #error "unexpectedly DYNAMIC_CRC_TABLE defined."
+ //Must implement get_crc_table prior to any multi-threading (see notes there)
+#endif
+
+using namespace std;
+
+// =================================================================================================
+/// \file UCF_Handler.cpp
+/// \brief UCF handler class
+// =================================================================================================
+const XMP_Uns16 xmpFilenameLen = 21;
+const char* xmpFilename = "META-INF/metadata.xml";
+
+// =================================================================================================
+// UCF_MetaHandlerCTor
+// ====================
+XMPFileHandler* UCF_MetaHandlerCTor ( XMPFiles * parent )
+{
+ return new UCF_MetaHandler ( parent );
+} // UCF_MetaHandlerCTor
+
+// =================================================================================================
+// UCF_CheckFormat
+// ================
+// * lenght must at least be 114 bytes
+// * first bytes must be \x50\x4B\x03\x04 for *any* zip file
+// * at offset 30 it must spell "mimetype"
+
+#define MIN_UCF_LENGTH 114
+// zip minimum considerations:
+// the shortest legal zip is 100 byte:
+// 30+1* bytes file header
+//+ 0 byte content file (uncompressed)
+//+ 46+1* bytes central directory file header
+//+ 22 byte end of central directory record
+//-------
+//100 bytes
+//
+//1 byte is the shortest legal filename. anything below is no valid zip.
+//
+//==> the mandatory+first "mimetype" content file has a filename length of 8 bytes,
+// thus even if empty (arguably incorrect but tolerable),
+// the shortest legal UCF is 114 bytes (30 + 8 + 0 + 46 + 8 + 22 )
+// anything below is with certainty not a valid ucf.
+
+bool UCF_CheckFormat ( XMP_FileFormat format,
+ XMP_StringPtr filePath,
+ LFA_FileRef fileRef,
+ XMPFiles * parent )
+{
+ // *not* using buffer functionality here, all we need
+ // to detect UCF securely is in the first 38 bytes...
+ IgnoreParam(filePath); IgnoreParam(parent); //suppress warnings
+ XMP_Assert ( format == kXMP_UCFFile ); //standard assert
+
+ XMP_Uns8 buffer[MIN_UCF_LENGTH];
+
+ LFA_Seek ( fileRef, 0, SEEK_SET );
+ if ( MIN_UCF_LENGTH != LFA_Read ( fileRef, buffer, MIN_UCF_LENGTH) ) //NO requireall (->no throw), just return false
+ return false;
+ if ( !CheckBytes ( &buffer[0], "\x50\x4B\x03\x04", 4 ) ) // "PK 03 04"
+ return false;
+ // UCF spec says: there must be a content file mimetype, and be first and be uncompressed...
+ if ( !CheckBytes ( &buffer[30], "mimetype", 8 ) )
+ return false;
+
+ //////////////////////////////////////////////////////////////////////////////
+ //figure out mimetype, decide on writeability
+ // grab mimetype
+ LFA_Seek( fileRef, 18, SEEK_SET );
+ XMP_Uns32 mimeLength = LFA_ReadUns32_LE ( fileRef );
+ XMP_Uns32 mimeCompressedLength = LFA_ReadUns32_LE ( fileRef ); // must be same since uncompressed
+
+ XMP_Validate( mimeLength == mimeCompressedLength,
+ "mimetype compressed and uncompressed length differ",
+ kXMPErr_BadFileFormat );
+
+ XMP_Validate( mimeLength != 0, "0-byte mimetype", kXMPErr_BadFileFormat );
+
+ // determine writability based on mimetype
+ LFA_Seek( fileRef, 30 + 8, SEEK_SET );
+ char* mimetype = new char[ mimeLength + 1 ];
+ LFA_Read( fileRef, mimetype, mimeLength, true );
+ mimetype[mimeLength] = '\0';
+
+ bool okMimetype;
+
+ // be lenient on extraneous CR (0xA) [non-XMP bug #16980028]
+ if ( mimeLength > 0 ) //avoid potential crash (will properly fail below anyhow)
+ if ( mimetype[mimeLength-1] == 0xA )
+ mimetype[mimeLength-1] = '\0';
+
+ if (
+ XMP_LitMatch( mimetype, "application/vnd.adobe.xfl" ) || //Flash Diesel team
+ XMP_LitMatch( mimetype, "application/vnd.adobe.xfl+zip") || //Flash Diesel team
+ XMP_LitMatch( mimetype, "application/vnd.adobe.x-mars" ) || //Mars plugin(labs only), Acrobat8
+ XMP_LitMatch( mimetype, "application/vnd.adobe.pdfxml" ) || //Mars plugin(labs only), Acrobat 9
+ XMP_LitMatch( mimetype, "vnd.adobe.x-asnd" ) || //Adobe Sound Document (Soundbooth Team)
+ XMP_LitMatch( mimetype, "application/vnd.adobe.indesign-idml-package" ) ) //inCopy (inDesign) IDML Document
+
+ // *** ==> unknown are also treated as not acceptable
+ okMimetype = true;
+ else
+ okMimetype = false;
+
+ // not accepted (neither read nor write
+ //.air - Adobe Air Files
+ //application/vnd.adobe.air-application-installer-package+zip
+ //.airi - temporary Adobe Air Files
+ //application/vnd.adobe.air-application-intermediate-package+zip
+
+ delete mimetype;
+ return okMimetype;
+
+} // UCF_CheckFormat
+
+// =================================================================================================
+// UCF_MetaHandler::UCF_MetaHandler
+// ==================================
+
+UCF_MetaHandler::UCF_MetaHandler ( XMPFiles * _parent )
+{
+ this->parent = _parent;
+ this->handlerFlags = kUCF_HandlerFlags;
+ this->stdCharForm = kXMP_Char8Bit;
+} // UCF_MetaHandler::UCF_MetaHandler
+
+// =================================================================================================
+// UCF_MetaHandler::~UCF_MetaHandler
+// =====================================
+
+UCF_MetaHandler::~UCF_MetaHandler()
+{
+ // nothing
+}
+
+// =================================================================================================
+// UCF_MetaHandler::CacheFileData
+// ===============================
+//
+void UCF_MetaHandler::CacheFileData()
+{
+ //*** abort procedures
+ this->containsXMP = false; //assume no XMP for now (beware of exceptions...)
+ LFA_FileRef file = this->parent->fileRef;
+ XMP_PacketInfo &packetInfo = this->packetInfo;
+
+ // clear file positioning info ---------------------------------------------------
+ b=0;b2=0;x=0;x2=0;cd=0;cd2=0;cdx=0;cdx2=0;h=0;h2=0,fl=0;f2l=0;
+ al=0;bl=0;xl=0;x2l=0;cdl=0;cd2l=0;cdxl=0;cdx2l=0;hl=0,z=0,z2=0,z2l=0;
+ numCF=0;numCF2=0;
+ wasCompressed = false;
+
+ // -------------------------------------------------------------------------------
+ fl=LFA_Measure( file );
+ if ( fl < MIN_UCF_LENGTH ) XMP_Throw("file too short, can't be correct UCF",kXMPErr_Unimplemented);
+
+ //////////////////////////////////////////////////////////////////////////////
+ // find central directory before optional comment
+ // things have to go bottom-up, since description headers are allowed in UCF
+ // "scan backwards" until feasible field found (plus sig sanity check)
+ // OS buffering should be smart enough, so not doing anything on top
+ // plus almost all comments will be zero or rather short
+
+ //no need to check anything but the 21 chars of "METADATA-INF/metadata.xml"
+ char filenameToTest[22];
+ filenameToTest[21]='\0';
+
+ XMP_Int32 zipCommentLen = 0;
+ for ( ; zipCommentLen <= EndOfDirectory::COMMENT_MAX; zipCommentLen++ )
+ {
+ LFA_Seek( file, -zipCommentLen -2, SEEK_END );
+ if ( LFA_ReadUns16_LE( file ) == zipCommentLen ) //found it?
+ {
+ //double check, might just look like comment length (actually be 'evil' comment)
+ LFA_Seek( file , - EndOfDirectory::FIXED_SIZE, SEEK_CUR );
+ if ( LFA_ReadUns32_LE( file ) == EndOfDirectory::ID ) break; //heureka, directory ID
+ // 'else': pretend nothing happended, just go on
+ }
+ }
+ //was it a break or just not found ?
+ if ( zipCommentLen > EndOfDirectory::COMMENT_MAX ) XMP_Throw( "zip broken near end or invalid comment" , kXMPErr_BadFileFormat );
+
+ ////////////////////////////////////////////////////////////////////////////
+ //read central directory
+ hl = zipCommentLen + EndOfDirectory::FIXED_SIZE;
+ h = fl - hl;
+ LFA_Seek( file , h , SEEK_SET );
+
+ if ( LFA_ReadUns32_LE( file ) != EndOfDirectory::ID )
+ XMP_Throw("directory header id not found. or broken comment",kXMPErr_BadFileFormat);
+ if ( LFA_ReadUns16_LE( file ) != 0 )
+ XMP_Throw("UCF must be 'first' zip volume",kXMPErr_BadFileFormat);
+ if ( LFA_ReadUns16_LE( file ) != 0 )
+ XMP_Throw("UCF must be single-volume zip",kXMPErr_BadFileFormat);
+
+ numCF = LFA_ReadUns16_LE( file ); //number of content files
+ if ( numCF != LFA_ReadUns16_LE( file ) )
+ XMP_Throw( "per volume and total number of dirs differ" , kXMPErr_BadFileFormat );
+ cdl = LFA_ReadUns32_LE( file );
+ cd = LFA_ReadUns32_LE( file );
+ LFA_Seek( file, 2,SEEK_CUR ); //skip comment len, needed since next LFA is SEEK_CUR !
+
+ //////////////////////////////////////////////////////////////////////////////
+ // check for zip64-end-of-CD-locator/ zip64-end-of-CD
+ // to to central directory
+ if ( cd == 0xffffffff )
+ { // deal with zip 64, otherwise continue
+ XMP_Int64 tmp = LFA_Seek( file,
+ - EndOfDirectory::FIXED_SIZE - Zip64Locator::TOTAL_SIZE,
+ SEEK_CUR ); //go to begining of zip64 locator
+ //relative movement , absolute would imho only require another -zipCommentLen
+
+ if ( Zip64Locator::ID == LFA_ReadUns32_LE(file) ) // prevent 'coincidental length' ffffffff
+ {
+ XMP_Validate( 0 == LFA_ReadUns32_LE(file),
+ "zip64 CD disk must be 0", kXMPErr_BadFileFormat );
+
+ z = LFA_ReadUns64_LE(file);
+ XMP_Validate( z < 0xffffffffffffLL, "file in terrabyte range?", kXMPErr_BadFileFormat ); // 3* ffff, sanity test
+
+ XMP_Uns32 totalNumOfDisks = LFA_ReadUns32_LE(file);
+ /* tolerated while pkglib bug #1742179 */
+ XMP_Validate( totalNumOfDisks == 0 || totalNumOfDisks == 1,
+ "zip64 total num of disks must be 0", kXMPErr_BadFileFormat );
+
+ ///////////////////////////////////////////////
+ /// on to end-of-CD itself
+ LFA_Seek( file, z, SEEK_SET );
+ XMP_Validate( Zip64EndOfDirectory::ID == LFA_ReadUns32_LE(file),
+ "invalid zip64 end of CD sig", kXMPErr_BadFileFormat );
+
+ XMP_Int64 sizeOfZip64EOD = LFA_ReadUns64_LE(file);
+ LFA_Seek(file, 12, SEEK_CUR );
+ //yes twice "total" and "per disk"
+ XMP_Int64 tmp64 = LFA_ReadUns64_LE(file);
+ XMP_Validate( tmp64 == numCF, "num of content files differs to zip64 (1)", kXMPErr_BadFileFormat );
+ tmp64 = LFA_ReadUns64_LE(file);
+ XMP_Validate( tmp64 == numCF, "num of content files differs to zip64 (2)", kXMPErr_BadFileFormat );
+ // cd length verification
+ tmp64 = LFA_ReadUns64_LE(file);
+ XMP_Validate( tmp64 == cdl, "CD length differs in zip64", kXMPErr_BadFileFormat );
+
+ cd = LFA_ReadUns64_LE(file); // wipe out invalid 0xffffffff with the real thing
+ //ignoring "extensible data sector (would need fullLength - fixed length) for now
+ }
+ } // of zip64 fork
+ /////////////////////////////////////////////////////////////////////////////
+ // parse central directory
+ // 'foundXMP' <=> cdx != 0
+
+ LFA_Seek( file, cd, SEEK_SET );
+ XMP_Int64 cdx_suspect=0;
+ XMP_Int64 cdxl_suspect=0;
+ CDFileHeader curCDHeader;
+
+ for ( XMP_Uns16 entryNum=1 ; entryNum <= numCF ; entryNum++ )
+ {
+ cdx_suspect = LFA_Tell( file ); //just suspect for now
+ curCDHeader.read( file );
+
+ if ( GetUns32LE( &curCDHeader.fields[CDFileHeader::o_sig] ) != 0x02014b50 )
+ XMP_Throw("&invalid file header",kXMPErr_BadFileFormat);
+
+ cdxl_suspect = curCDHeader.FIXED_SIZE +
+ GetUns16LE(&curCDHeader.fields[CDFileHeader::o_fileNameLength]) +
+ GetUns16LE(&curCDHeader.fields[CDFileHeader::o_extraFieldLength]) +
+ GetUns16LE(&curCDHeader.fields[CDFileHeader::o_commentLength]);
+
+ // we only look 21 characters, that's META-INF/metadata.xml, no \0 attached
+ if ( curCDHeader.filenameLen == xmpFilenameLen /*21*/ )
+ if( XMP_LitNMatch( curCDHeader.filename , "META-INF/metadata.xml", 21 ) )
+ {
+ cdx = cdx_suspect;
+ cdxl = cdxl_suspect;
+ break;
+ }
+ //hop to next
+ LFA_Seek( file, cdx_suspect + cdxl_suspect , SEEK_SET );
+ } //for-loop, iterating *all* central directory headers (also beyond found)
+
+ if ( !cdx ) // not found xmp
+ {
+ // b and bl remain 0, x and xl remain 0
+ // ==> a is everything before directory
+ al = cd;
+ return;
+ }
+
+ // from here is if-found-only
+ //////////////////////////////////////////////////////////////////////////////
+ //CD values needed, most serve counter-validation purposes (below) only
+ // read whole object (incl. all 3 fields) again properly
+ // to get extra Fields, etc
+ LFA_Seek( file, cdx, SEEK_SET );
+ xmpCDHeader.read( file );
+
+ XMP_Validate( xmpFilenameLen == GetUns16LE( &xmpCDHeader.fields[CDFileHeader::o_fileNameLength]),
+ "content file length not ok", kXMPErr_BadFileFormat );
+
+ XMP_Uns16 CD_compression = GetUns16LE( &xmpCDHeader.fields[CDFileHeader::o_compression] );
+ XMP_Validate(( CD_compression == 0 || CD_compression == 0x08),
+ "illegal compression, must be flate or none", kXMPErr_BadFileFormat );
+ XMP_Uns16 CD_flags = GetUns16LE( &xmpCDHeader.fields[CDFileHeader::o_flags] );
+ XMP_Uns32 CD_crc = GetUns32LE( &xmpCDHeader.fields[CDFileHeader::o_crc32] );
+
+ // parse (actual, non-CD!) file header ////////////////////////////////////////////////
+ x = xmpCDHeader.offsetLocalHeader;
+ LFA_Seek( file , x ,SEEK_SET);
+ xmpFileHeader.read( file );
+ xl = xmpFileHeader.sizeHeader() + xmpCDHeader.sizeCompressed;
+
+ //values needed
+ XMP_Uns16 fileNameLength = GetUns16LE( &xmpFileHeader.fields[FileHeader::o_fileNameLength] );
+ XMP_Uns16 extraFieldLength = GetUns16LE( &xmpFileHeader.fields[FileHeader::o_extraFieldLength] );
+ XMP_Uns16 compression = GetUns16LE( &xmpFileHeader.fields[FileHeader::o_compression] );
+ XMP_Uns32 sig = GetUns32LE( &xmpFileHeader.fields[FileHeader::o_sig] );
+ XMP_Uns16 flags = GetUns16LE( &xmpFileHeader.fields[FileHeader::o_flags] );
+ XMP_Uns32 sizeCompressed = GetUns32LE( &xmpFileHeader.fields[FileHeader::o_sizeCompressed] );
+ XMP_Uns32 sizeUncompressed = GetUns32LE( &xmpFileHeader.fields[FileHeader::o_sizeUncompressed] );
+ XMP_Uns32 crc = GetUns32LE( &xmpFileHeader.fields[FileHeader::o_crc32] );
+
+ // check filename
+ XMP_Validate( fileNameLength == 21, "filename size contradiction" , kXMPErr_BadFileFormat );
+ XMP_Enforce ( xmpFileHeader.filename != 0 );
+ XMP_Validate( !memcmp( "META-INF/metadata.xml", xmpFileHeader.filename , xmpFilenameLen ) , "filename is cf header is not META-INF/metadata.xml" , kXMPErr_BadFileFormat );
+
+ // deal with data descriptor if needed
+ if ( flags & FileHeader::kdataDescriptorFlag )
+ {
+ if ( sizeCompressed!=0 || sizeUncompressed!=0 || crc!=0 ) XMP_Throw("data descriptor must mean 3x zero",kXMPErr_BadFileFormat);
+ LFA_Seek( file, xmpCDHeader.sizeCompressed + fileNameLength + xmpCDHeader.extraFieldLen, SEEK_CUR); //skip actual data to get to descriptor
+ crc = LFA_ReadUns32_LE( file );
+ if ( crc == 0x08074b50 ) //data descriptor may or may not have signature (see spec)
+ {
+ crc = LFA_ReadUns32_LE( file ); //if it does, re-read
+ }
+ sizeCompressed = LFA_ReadUns32_LE( file );
+ sizeUncompressed = LFA_ReadUns32_LE( file );
+ // *** cater for zip64 plus 'streamed' data-descriptor stuff
+ }
+
+ // more integrity checks (post data descriptor handling)
+ if ( sig != 0x04034b50 ) XMP_Throw("invalid content file header",kXMPErr_BadFileFormat);
+ if ( compression != CD_compression ) XMP_Throw("compression contradiction",kXMPErr_BadFileFormat);
+ if ( sizeUncompressed != xmpCDHeader.sizeUncompressed ) XMP_Throw("contradicting uncompressed lengths",kXMPErr_BadFileFormat);
+ if ( sizeCompressed != xmpCDHeader.sizeCompressed ) XMP_Throw("contradicting compressed lengths",kXMPErr_BadFileFormat);
+ if ( sizeUncompressed == 0 ) XMP_Throw("0-byte uncompressed size", kXMPErr_BadFileFormat );
+
+ ////////////////////////////////////////////////////////////////////
+ // packet Info
+ this->packetInfo.charForm = stdCharForm;
+ this->packetInfo.writeable = false;
+ this->packetInfo.offset = kXMPFiles_UnknownOffset; // checksum!, hide position to not give funny ideas
+ this->packetInfo.length = kXMPFiles_UnknownLength;
+
+ ////////////////////////////////////////////////////////////////////
+ // prepare packet (compressed or not)
+ this->xmpPacket.erase();
+ this->xmpPacket.reserve( sizeUncompressed );
+ this->xmpPacket.append( sizeUncompressed, ' ' );
+ XMP_StringPtr packetStr = XMP_StringPtr ( xmpPacket.c_str() ); // only set after reserving the space!
+
+ // go to packet offset
+ LFA_Seek ( file, x + xmpFileHeader.FIXED_SIZE + fileNameLength + extraFieldLength , SEEK_SET);
+
+ // compression fork --------------------------------------------------
+ switch (compression)
+ {
+ case 0x8: // FLATE
+ {
+ wasCompressed = true;
+ XMP_Uns32 bytesRead = 0;
+ XMP_Uns32 bytesWritten = 0; // for writing into packetString
+ const unsigned int CHUNK = 16384;
+
+ int ret;
+ unsigned int have; //added type
+ z_stream strm;
+ unsigned char in[CHUNK];
+ unsigned char out[CHUNK];
+ // does need this intermediate stage, no direct compressio to packetStr possible,
+ // since also partially filled buffers must be picked up. That's how it works.
+ // in addition: internal zlib variables might have 16 bit limits...
+
+ /* allocate inflate state */
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ strm.avail_in = 0;
+ strm.next_in = Z_NULL;
+
+ /* must use windowBits = -15, for raw inflate, no zlib header */
+ ret = inflateInit2(&strm,-MAX_WBITS);
+
+ if (ret != Z_OK)
+ XMP_Throw("zlib error ",kXMPErr_ExternalFailure);
+
+ /* decompress until deflate stream ends or end of file */
+ do {
+ // must take care here not to read too much, thus whichever is smaller:
+ XMP_Int32 bytesRemaining = sizeCompressed - bytesRead;
+ if ( (XMP_Int32)CHUNK < bytesRemaining ) bytesRemaining = (XMP_Int32)CHUNK;
+ strm.avail_in=LFA_Read( file , in , bytesRemaining , true );
+ bytesRead += strm.avail_in; // NB: avail_in is "unsigned_int", so might be 16 bit (not harmfull)
+
+ if (strm.avail_in == 0) break;
+ strm.next_in = in;
+
+ do {
+ strm.avail_out = CHUNK;
+ strm.next_out = out;
+ ret = inflate(&strm, Z_NO_FLUSH);
+ XMP_Assert( ret != Z_STREAM_ERROR ); /* state not clobbered */
+ switch (ret)
+ {
+ case Z_NEED_DICT:
+ (void)inflateEnd(&strm);
+ XMP_Throw("zlib error: Z_NEED_DICT",kXMPErr_ExternalFailure);
+ case Z_DATA_ERROR:
+ (void)inflateEnd(&strm);
+ XMP_Throw("zlib error: Z_DATA_ERROR",kXMPErr_ExternalFailure);
+ case Z_MEM_ERROR:
+ (void)inflateEnd(&strm);
+ XMP_Throw("zlib error: Z_MEM_ERROR",kXMPErr_ExternalFailure);
+ }
+
+ have = CHUNK - strm.avail_out;
+ memcpy( (unsigned char*) packetStr + bytesWritten , out , have );
+ bytesWritten += have;
+
+ } while (strm.avail_out == 0);
+
+ /* it's done when inflate() says it's done */
+ } while (ret != Z_STREAM_END);
+
+ /* clean up and return */
+ (void)inflateEnd(&strm);
+ if (ret != Z_STREAM_END)
+ XMP_Throw("zlib error ",kXMPErr_ExternalFailure);
+ break;
+ }
+ case 0x0: // no compression - read directly into the right place
+ {
+ wasCompressed = false;
+ XMP_Enforce( LFA_Read ( file, (char*)packetStr, sizeUncompressed, kLFA_RequireAll ) );
+ break;
+ }
+ default:
+ {
+ XMP_Throw("illegal zip compression method (not none, not flate)",kXMPErr_BadFileFormat);
+ }
+ }
+ this->containsXMP = true; // do this last, after all possible failure/execptions
+}
+
+
+// =================================================================================================
+// UCF_MetaHandler::ProcessXMP
+// ============================
+
+void UCF_MetaHandler::ProcessXMP()
+{
+ // we have no legacy, CacheFileData did all that was needed
+ // ==> default implementation is fine
+ XMPFileHandler::ProcessXMP();
+}
+
+// =================================================================================================
+// UCF_MetaHandler::UpdateFile
+// =============================
+
+// TODO: xmp packet with data descriptor
+
+void UCF_MetaHandler::UpdateFile ( bool doSafeUpdate )
+{
+ //sanity
+ XMP_Enforce( (x!=0) == (cdx!=0) );
+ if (!cdx)
+ xmpCDHeader.setXMPFilename(); //if new, set filename (impacts length, thus before computation)
+ if ( ! this->needsUpdate )
+ return;
+
+ // ***
+ if ( doSafeUpdate ) XMP_Throw ( "UCF_MetaHandler::UpdateFile: Safe update not supported", kXMPErr_Unavailable );
+
+ LFA_FileRef file = this->parent->fileRef;
+
+ // final may mean compressed or not, whatever is to-be-embedded
+ uncomprPacketStr = xmpPacket.c_str();
+ uncomprPacketLen = (XMP_StringLen) xmpPacket.size();
+ finalPacketStr = uncomprPacketStr; // will be overriden if compressedXMP==true
+ finalPacketLen = uncomprPacketLen;
+ std::string compressedPacket; // moot if non-compressed, still here for scope reasons (having to keep a .c_str() alive)
+
+ if ( !x ) // if new XMP...
+ {
+ xmpFileHeader.clear();
+ xmpFileHeader.setXMPFilename();
+ // ZIP64 TODO: extra Fields, impact on cdxl2 and x2l
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////
+ // COMPRESSION DECISION
+
+ // for large files compression is bad:
+ // a) size of XMP becomes irrelevant on large files ==> why worry over compression ?
+ // b) more importantly: no such thing as padding possible, compression == ever changing sizes
+ // => never in-place rewrites, *ugly* performance impact on large files
+ inPlacePossible = false; //assume for now
+
+ if ( !x ) // no prior XMP? -> decide on filesize
+ compressXMP = ( fl > 1024*50 /* 100 kB */ ) ? false : true;
+ else
+ compressXMP = wasCompressed; // don't change a thing
+
+ if ( !wasCompressed && !compressXMP &&
+ ( GetUns32LE( &xmpFileHeader.fields[FileHeader::o_sizeUncompressed] ) == uncomprPacketLen ))
+ {
+ inPlacePossible = true;
+ }
+ ////////////////////////////////////////////////////////////////////////////////////////////////
+ // COMPRESS XMP
+ if ( compressXMP )
+ {
+ const unsigned int CHUNK = 16384;
+ int ret, flush;
+ unsigned int have;
+ z_stream strm;
+ unsigned char out[CHUNK];
+
+ /* allocate deflate state */
+ strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL;
+ if ( deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -MAX_WBITS, 8 /*memlevel*/, Z_DEFAULT_STRATEGY) )
+ XMP_Throw("zlib error ",kXMPErr_ExternalFailure);
+
+ //write at once, since we got it in mem anyway:
+ strm.avail_in = uncomprPacketLen;
+ flush = Z_FINISH; // that's all, folks
+ strm.next_in = (unsigned char*) uncomprPacketStr;
+
+ do {
+ strm.avail_out = CHUNK;
+ strm.next_out = out;
+
+ ret = deflate(&strm, flush); /* no bad return value (!=0 acceptable) */
+ XMP_Enforce(ret != Z_STREAM_ERROR); /* state not clobbered */
+ //fwrite(buffer,size,count,file)
+ have = CHUNK - strm.avail_out;
+ compressedPacket.append( (const char*) out, have);
+ } while (strm.avail_out == 0);
+
+ if (ret != Z_STREAM_END)
+ XMP_Throw("zlib stream incomplete ",kXMPErr_ExternalFailure);
+ XMP_Enforce(strm.avail_in == 0); // all input will be used
+ (void)deflateEnd(&strm); //clean up (do prior to checks)
+
+ finalPacketStr = compressedPacket.c_str();
+ finalPacketLen = (XMP_StringLen)compressedPacket.size();
+ }
+
+ PutUns32LE ( uncomprPacketLen, &xmpFileHeader.fields[FileHeader::o_sizeUncompressed] );
+ PutUns32LE ( finalPacketLen, &xmpFileHeader.fields[FileHeader::o_sizeCompressed] );
+ PutUns16LE ( compressXMP ? 8:0, &xmpFileHeader.fields[FileHeader::o_compression] );
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////
+ // CRC (always of uncompressed data)
+ XMP_Uns32 crc = crc32( 0 , (Bytef*)uncomprPacketStr, uncomprPacketLen );
+ PutUns32LE( crc, &xmpFileHeader.fields[FileHeader::o_crc32] );
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////
+ // TIME calculation for timestamp
+ // will be applied both to xmp content file and CD header
+ XMP_Uns16 lastModTime, lastModDate;
+ XMP_DateTime time;
+ SXMPUtils::CurrentDateTime( &time );
+
+ if ( (time.year - 1900) < 80)
+ {
+ lastModTime = 0; // 1.1.1980 00:00h
+ lastModDate = 21;
+ }
+
+ // typedef unsigned short ush; //2 bytes
+ lastModDate = (XMP_Uns16) (((time.year) - 1980 ) << 9 | ((time.month) << 5) | time.day);
+ lastModTime = ((XMP_Uns16)time.hour << 11) | ((XMP_Uns16)time.minute << 5) | ((XMP_Uns16)time.second >> 1);
+
+ PutUns16LE ( lastModDate, &xmpFileHeader.fields[FileHeader::o_lastmodDate] );
+ PutUns16LE ( lastModTime, &xmpFileHeader.fields[FileHeader::o_lastmodTime] );
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////
+ // adjustments depending on 4GB Border,
+ // decisions on in-place update
+ // so far only z, zl have been determined
+
+ // Zip64 related assurances, see (15)
+ XMP_Enforce(!z2);
+ XMP_Enforce(h+hl == fl );
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////
+ // COMPUTE MISSING VARIABLES
+ // A - based on xmp existence
+ //
+ // already known: x, xl, cd
+ // most left side vars,
+ //
+ // finalPacketStr, finalPacketLen
+
+ if ( x ) // previous xmp?
+ {
+ al = x;
+ b = x + xl;
+ bl = cd - b;
+ }
+ else
+ {
+ al = cd;
+ //b,bl left at zero
+ }
+
+ if ( inPlacePossible )
+ { // leave xmp right after A
+ x2 = al;
+ x2l = xmpFileHeader.sizeTotalCF(); //COULDDO: assert (x2l == xl)
+ if (b) b2 = x2 + x2l; // b follows x as last content part
+ cd2 = b2 + bl; // CD follows B2
+ }
+ else
+ { // move xmp to end
+ if (b) b2 = al; // b follows
+ // x follows as last content part (B existing or not)
+ x2 = al + bl;
+ x2l = xmpFileHeader.sizeTotalCF();
+ cd2 = x2 + x2l; // CD follows X
+ }
+
+ /// create new XMP header ///////////////////////////////////////////////////
+ // written into actual fields + generation of extraField at .write()-time...
+ // however has impact on .size() computation -- thus enter before cdx2l computation
+ xmpCDHeader.sizeUncompressed = uncomprPacketLen;
+ xmpCDHeader.sizeCompressed = finalPacketLen;
+ xmpCDHeader.offsetLocalHeader = x2;
+ PutUns32LE ( crc, &xmpCDHeader.fields[CDFileHeader::o_crc32] );
+ PutUns16LE ( compressXMP ? 8:0, &xmpCDHeader.fields[CDFileHeader::o_compression] );
+ PutUns16LE ( lastModDate, &xmpCDHeader.fields[CDFileHeader::o_lastmodDate] );
+ PutUns16LE ( lastModTime, &xmpCDHeader.fields[CDFileHeader::o_lastmodTime] );
+
+ // for
+ if ( inPlacePossible )
+ {
+ cdx2 = cdx; //same, same
+ writeOut( file, file, false, true );
+ return;
+ }
+
+ ////////////////////////////////////////////////////////////////////////
+ // temporarily store (those few, small) trailing things that might not survive the move around:
+ LFA_Seek(file, cd, SEEK_SET); // seek to central directory
+ cdEntries.clear(); //mac precaution
+
+ //////////////////////////////////////////////////////////////////////////////
+ // parse headers
+ // * stick together output header list
+ cd2l = 0; //sum up below
+
+ CDFileHeader tempHeader;
+ for( XMP_Uns16 pos=1 ; pos <= numCF ; pos++ )
+ {
+ if ( (cdx) && (LFA_Tell( file ) == cdx) )
+ {
+ tempHeader.read( file ); //read, even if not use, to advance file pointer
+ }
+ else
+ {
+ tempHeader.read( file );
+ // adjust b2 offset for files that were behind the xmp:
+ // may (if xmp moved to back)
+ // or may not (inPlace Update) make a difference
+ if ( (x) && ( tempHeader.offsetLocalHeader > x) ) // if xmp existed before and this was a file behind it
+ tempHeader.offsetLocalHeader += b2 - b;
+ cd2l += tempHeader.size(); // prior offset change might have impact
+ cdEntries.push_back( tempHeader );
+ }
+ }
+
+ //push in XMP packet as last one (new or not)
+ cdEntries.push_back( xmpCDHeader );
+ cdx2l = xmpCDHeader.size();
+ cd2l += cdx2l; // true, no matter which order
+
+ //OLD cd2l = : cdl - cdxl + cdx2l; // (NB: cdxl might be 0)
+ numCF2 = numCF + ( (cdx)?0:1 ); //xmp packet for the first time? -> add one more CF
+
+ XMP_Validate( numCF2 > 0, "no content files", kXMPErr_BadFileFormat );
+ XMP_Validate( numCF2 <= 0xFFFE, "max number of 0xFFFE entries reached", kXMPErr_BadFileFormat );
+
+ cdx2 = cd2 + cd2l - cdx2l; // xmp content entry comes last (since beyond inPlace Update)
+
+ // zip64 decision
+ if ( ( cd2 + cd2l + hl ) > 0xffffffff ) // predict non-zip size ==> do we need a zip-64?
+ {
+ z2 = cd2 + cd2l;
+ z2l = Zip64EndOfDirectory::FIXED_SIZE + Zip64Locator::TOTAL_SIZE;
+ }
+
+ // header and output length,
+ h2 = cd2 + cd2l + z2l; // (z2l might be 0)
+ f2l = h2 + hl;
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////
+ // read H (endOfCD), correct offset
+ LFA_Seek(file, h, SEEK_SET);
+
+ endOfCD.read( file );
+ if ( cd2 <= 0xffffffff )
+ PutUns32LE( (XMP_Int32) cd2 , &endOfCD.fields[ endOfCD.o_CdOffset ] );
+ else
+ PutUns32LE( 0xffffffff , &endOfCD.fields[ endOfCD.o_CdOffset ] );
+ PutUns16LE( numCF2, &endOfCD.fields[ endOfCD.o_CdNumEntriesDisk ] );
+ PutUns16LE( numCF2, &endOfCD.fields[ endOfCD.o_CdNumEntriesTotal ] );
+
+ XMP_Enforce( cd2l <= 0xffffffff ); // _size_ of directory itself certainly under 4GB
+ PutUns32LE( (XMP_Uns32)cd2l, &endOfCD.fields[ endOfCD.o_CdSize ] );
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////
+ // MOVING
+ writeOut( file, file, false, false );
+
+ this->needsUpdate = false; //do last for safety reasons
+} // UCF_MetaHandler::UpdateFile
+
+// =================================================================================================
+// UCF_MetaHandler::WriteFile
+// ============================
+void UCF_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath )
+{
+ IgnoreParam ( sourcePath );
+ XMP_Throw ( "UCF_MetaHandler::WriteFile: TO BE IMPLEMENTED", kXMPErr_Unimplemented );
+}
+
+// =================================================================================================
+// own approach to unify Update and WriteFile:
+// ============================
+
+void UCF_MetaHandler::writeOut( LFA_FileRef sourceFile, LFA_FileRef targetFile, bool isRewrite, bool isInPlace)
+{
+ // isInPlace is only possible when it's not a complete rewrite
+ XMP_Enforce( (!isInPlace) || (!isRewrite) );
+
+ /////////////////////////////////////////////////////////
+ // A
+ if (isRewrite) //move over A block
+ LFA_Move( sourceFile , 0 , targetFile, 0 , al );
+
+ /////////////////////////////////////////////////////////
+ // B / X (not necessarily in this order)
+ if ( !isInPlace ) // B does not change a thing (important optimization)
+ {
+ LFA_Seek( targetFile , b2 , SEEK_SET );
+ LFA_Move( sourceFile , b , targetFile, b2 , bl );
+ }
+
+ LFA_Seek( targetFile , x2 , SEEK_SET );
+ xmpFileHeader.write( targetFile );
+ LFA_Write( targetFile, finalPacketStr, finalPacketLen );
+ //TODO: cover reverse case / inplace ...
+
+ /////////////////////////////////////////////////////////
+ // CD
+ // No Seek here on purpose.
+ // This assert must still be valid
+
+ // if inPlace, the only thing that needs still correction is the CRC in CDX:
+ if ( isInPlace )
+ {
+ XMP_Uns32 crc; //TEMP, not actually needed
+ crc = GetUns32LE( &xmpFileHeader.fields[FileHeader::o_crc32] );
+
+ // go there,
+ // do the job (take value directly from (non-CD-)fileheader),
+ // end of story.
+ LFA_Seek( targetFile , cdx2 + CDFileHeader::o_crc32 , SEEK_SET );
+ LFA_Write( targetFile, &xmpFileHeader.fields[FileHeader::o_crc32], 4);
+
+ return;
+ }
+
+ LFA_Seek( targetFile , cd2 , SEEK_SET );
+
+ std::vector<CDFileHeader>::iterator iter;
+ int tmptmp=1;
+ for( iter = cdEntries.begin(); iter != cdEntries.end(); iter++ ) {
+ CDFileHeader* p=&(*iter);
+ XMP_Int64 before = LFA_Tell(targetFile);
+ p->write( targetFile );
+ XMP_Int64 total = LFA_Tell(targetFile) - before;
+ XMP_Int64 tmpSize = p->size();
+ tmptmp++;
+ }
+
+ /////////////////////////////////////////////////////////
+ // Z
+ if ( z2 ) // yes, that simple
+ {
+ XMP_Assert( z2 == LFA_Tell(targetFile));
+ LFA_Seek( targetFile , z2 , SEEK_SET );
+
+ //no use in copying, always construct from scratch
+ Zip64EndOfDirectory zip64EndOfDirectory( cd2, cd2l, numCF2) ;
+ Zip64Locator zip64Locator( z2 );
+
+ zip64EndOfDirectory.write( targetFile );
+ zip64Locator.write( targetFile );
+ }
+
+ /////////////////////////////////////////////////////////
+ // H
+ XMP_Assert( h2 == LFA_Tell(targetFile));
+ endOfCD.write( targetFile );
+
+ XMP_Assert( f2l == LFA_Tell(targetFile));
+ if ( f2l< fl)
+ LFA_Truncate(targetFile,f2l); //file may have shrunk
+}
+
+
diff --git a/source/XMPFiles/FileHandlers/UCF_Handler.hpp b/source/XMPFiles/FileHandlers/UCF_Handler.hpp
new file mode 100644
index 0000000..ec60f86
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/UCF_Handler.hpp
@@ -0,0 +1,716 @@
+#ifndef __UCF_Handler_hpp__
+#define __UCF_Handler_hpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XMPFiles_Impl.hpp"
+
+// =================================================================================================
+/// \file UCF_Handler.hpp
+//
+// underlying math:
+// __ 0 ______ 0 ______ __
+// | A | | A |
+// | | | |
+// al | | (a2l)| |
+// x |------| b2 |------|
+// xl | X | | B |_
+// b |------| (b2l)| | |
+// | B | x2 |------| | B2 could also be
+// bl | | x2l | X2 | | _after_ X2
+// cd |------| cd2 |------|<'
+// |//CD//| |//CD2/|
+// cdx |------| cdx2 |------|
+// cdxl|------| cdx2l|------|
+// cdl|//////| cd2l|//////|
+// z |------| z2|------|
+// | | | |
+// [zl]| Z | z2l | Z2 |
+// h |------| h2 |------|
+// fl | H | | H2 | f2l
+// __ hl |______| (h2l)|______| __
+//
+// fl file length pre (2 = post)
+// numCf number of content files prior to injection
+// numCf2 " post
+//
+//
+// l length variable, all else offset
+// [ ] variable is not needed
+// ( ) variable is identical to left
+// a content files prior to xmp (possibly: all)
+// b content files behind xmp (possibly: 0)
+// x xmp packet (possibly: 0)
+// cd central directory
+// h end of central directory
+//
+// z zip64 record and locator (if existing)
+//
+// general rules:
+// the bigger A, the less rewrite effort.
+// (also within the CD)
+// putting XMP at the end maximizes A.
+//
+// bool previousXMP == x!=0
+//
+// (x==0) == (cdx==0) == (xl==0) == (cdxl==0)
+//
+// std::vector<XMP_Uns32> cdOffsetsPre;
+//
+// -----------------
+// asserts:
+//( 1) a == a2 == 0, making these variables obsolete
+//( 2) a2l == al, this block is not touched
+//( 3) b2 <= b, b is only moved closer to the beginning of file
+//( 4) b2l == bl, b does not change in size
+//( 5) x2 >= x, b is only moved further down in the file
+//
+//( 6) x != 0, x2l != 0, cd != 0, cdl != 0
+// none of these blocks is at the beginning ('mimetype' by spec),
+// nor is any of them zero byte long
+//( 7) h!=0, hl >= 22 header is not at the beginning, minimum size 22
+//
+// file size computation:
+//( 8) al + bl + xl +cdl +hl = fl
+//( 9) al + bl + x2l+cd2l+hl = fl2
+//
+//(10) ( x==0 ) <=> ( cdx == 0 )
+// if there's a packet in the pre-file, or there isn't
+//(11) (x==0) => xl=0
+//(12) (cdx==0)=> cdx=0
+//
+//(13) x==0 ==> b,bl,b2,b2l==0
+// if there is no pre-xmp, B does not exist
+//(14) x!=0 ==> al:=x, b:=x+xl, bl:=cd-b
+//
+// zip 64:
+//(15) zl and z2l are basically equal, except _one_ of them is 0 :
+//
+//(16) b2l is indeed never different t
+//
+// FIXED_SIZE means the fixed (minimal) portion of a struct
+// TOTAL_SIZE indicates, that this struct indeed has a fixed, known total length
+//
+// =================================================================================================
+
+extern XMPFileHandler* UCF_MetaHandlerCTor ( XMPFiles * parent );
+
+extern bool UCF_CheckFormat ( XMP_FileFormat format,
+ XMP_StringPtr filePath,
+ LFA_FileRef fileRef,
+ XMPFiles * parent );
+
+static const XMP_OptionBits kUCF_HandlerFlags = (
+ kXMPFiles_CanInjectXMP |
+ kXMPFiles_CanExpand |
+ kXMPFiles_CanRewrite |
+ /* kXMPFiles_PrefersInPlace | removed, only reasonable for formats where difference is significant */
+ kXMPFiles_AllowsOnlyXMP |
+ kXMPFiles_ReturnsRawPacket |
+ // *** kXMPFiles_AllowsSafeUpdate |
+ kXMPFiles_NeedsReadOnlyPacket //UCF/zip has checksums...
+ );
+
+enum { // data descriptor
+ // may or may not have a signature: 0x08074b50
+ kUCF_DD_crc32 = 0,
+ kUCF_DD_sizeCompressed = 4,
+ kUCF_DD_sizeUncompressed = 8,
+};
+
+class UCF_MetaHandler : public XMPFileHandler
+{
+public:
+ UCF_MetaHandler ( XMPFiles * _parent );
+ ~UCF_MetaHandler();
+
+ void CacheFileData();
+ void ProcessXMP();
+
+ void UpdateFile ( bool doSafeUpdate );
+ void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath );
+
+protected:
+ const static XMP_Uns16 xmpFilenameLen = 21;
+ const static char* xmpFilename;
+
+private:
+ class Zip64EndOfDirectory {
+ private:
+
+ public:
+ const static XMP_Uns16 o_sig = 0; // 0x06064b50
+ const static XMP_Uns16 o_size = 4; // of this, excluding leading 12 bytes
+ // == FIXED_SIZE -12, since we're never creating the extensible data sector...
+ const static XMP_Uns16 o_VersionMade = 12;
+ const static XMP_Uns16 o_VersionNeededExtr = 14;
+ const static XMP_Uns16 o_numDisk = 16; // force 0
+ const static XMP_Uns16 o_numCDDisk = 20; // force 0
+ const static XMP_Uns16 o_numCFsThisDisk = 24;
+ const static XMP_Uns16 o_numCFsTotal = 32; // force equal
+ const static XMP_Uns16 o_sizeOfCD = 40; // (regular one, not Z64)
+ const static XMP_Uns16 o_offsetCD = 48; // "
+
+ const static XMP_Int32 FIXED_SIZE = 56;
+ char fields[FIXED_SIZE];
+
+ const static XMP_Uns32 ID = 0x06064b50;
+
+ Zip64EndOfDirectory( XMP_Int64 offsetCD, XMP_Int64 sizeOfCD, XMP_Uns64 numCFs )
+ {
+ memset(fields,'\0',FIXED_SIZE);
+
+ PutUns32LE(ID ,&fields[o_sig] );
+ PutUns64LE(FIXED_SIZE - 12, &fields[o_size] ); //see above
+ PutUns16LE( 45 ,&fields[o_VersionMade] );
+ PutUns16LE( 45 ,&fields[o_VersionNeededExtr] );
+ // fine at 0: o_numDisk
+ // fine at 0: o_numCDDisk
+ PutUns64LE( numCFs, &fields[o_numCFsThisDisk] );
+ PutUns64LE( numCFs, &fields[o_numCFsTotal] );
+ PutUns64LE( sizeOfCD, &fields[o_sizeOfCD] );
+ PutUns64LE( offsetCD, &fields[o_offsetCD] );
+ }
+
+ void write(LFA_FileRef file)
+ {
+ XMP_Validate( ID == GetUns32LE( &this->fields[o_sig] ), "invalid header on write", kXMPErr_BadFileFormat );
+ LFA_Write( file , fields , FIXED_SIZE );
+ }
+
+ };
+
+ class Zip64Locator {
+ public:
+ const static XMP_Uns16 o_sig = 0; // 0x07064b50
+ const static XMP_Uns16 o_numDiskZ64CD = 4; // force 0
+ const static XMP_Uns16 o_offsZ64EOD = 8;
+ const static XMP_Uns16 o_numDisks = 16; // set 1, tolerate 0
+
+ const static XMP_Int32 TOTAL_SIZE = 20;
+ char fields[TOTAL_SIZE];
+
+ const static XMP_Uns32 ID = 0x07064b50;
+
+ Zip64Locator( XMP_Int64 offsetZ64EOD )
+ {
+ memset(fields,'\0',TOTAL_SIZE);
+ PutUns32LE(ID, &fields[Zip64Locator::o_sig] );
+ PutUns32LE(0, &fields[Zip64Locator::o_numDiskZ64CD] );
+ PutUns64LE(offsetZ64EOD, &fields[Zip64Locator::o_offsZ64EOD] );
+ PutUns32LE(1, &fields[Zip64Locator::o_numDisks] );
+ }
+
+ // writes structure to file (starting at current position)
+ void write(LFA_FileRef file)
+ {
+ XMP_Validate( ID == GetUns32LE( &this->fields[o_sig] ), "invalid header on write", kXMPErr_BadFileFormat );
+ LFA_Write( file , fields , TOTAL_SIZE );
+ }
+ };
+
+ struct EndOfDirectory {
+ public:
+ const static XMP_Int32 FIXED_SIZE = 22; //32 bit type is important to not overrun on maxcomment
+ const static XMP_Uns32 ID = 0x06054b50;
+ const static XMP_Int32 COMMENT_MAX = 0xFFFF;
+ //offsets
+ const static XMP_Int32 o_CentralDirectorySize = 12;
+ const static XMP_Int32 o_CentralDirectoryOffset = 16;
+ };
+
+ class FileHeader {
+ private:
+ //TODO intergrate in clear()
+ void release() // avoid terminus free() since subject to a #define (mem-leak-check)
+ {
+ if (filename) delete filename;
+ if (extraField) delete extraField;
+ filename=0;
+ extraField=0;
+ }
+
+ public:
+ const static XMP_Uns32 SIG = 0x04034b50;
+ const static XMP_Uns16 kdataDescriptorFlag = 0x8;
+
+ const static XMP_Uns16 o_sig = 0;
+ const static XMP_Uns16 o_extractVersion = 4;
+ const static XMP_Uns16 o_flags = 6;
+ const static XMP_Uns16 o_compression = 8;
+ const static XMP_Uns16 o_lastmodTime = 10;
+ const static XMP_Uns16 o_lastmodDate = 12;
+ const static XMP_Uns16 o_crc32 = 14;
+ const static XMP_Uns16 o_sizeCompressed = 18;
+ const static XMP_Uns16 o_sizeUncompressed = 22;
+ const static XMP_Uns16 o_fileNameLength = 26;
+ const static XMP_Uns16 o_extraFieldLength = 28;
+ // total 30
+
+ const static int FIXED_SIZE = 30;
+ char fields[FIXED_SIZE];
+
+ char* filename;
+ char* extraField;
+ XMP_Uns16 filenameLen;
+ XMP_Uns16 extraFieldLen;
+
+ void clear()
+ {
+ this->release();
+ memset(fields,'\0',FIXED_SIZE);
+ //arm with minimal default values:
+ PutUns32LE(0x04034b50, &fields[FileHeader::o_sig] );
+ PutUns16LE(0x14, &fields[FileHeader::o_extractVersion] );
+ }
+
+ FileHeader() : filename(0),filenameLen(0),extraField(0),extraFieldLen(0)
+ {
+ clear();
+ };
+
+ // reads entire *FileHeader* structure from file (starting at current position)
+ void read(LFA_FileRef file)
+ {
+ this->release();
+
+ LFA_Read( file , fields , FIXED_SIZE , true );
+
+ XMP_Uns32 tmp32 = GetUns32LE( &this->fields[FileHeader::o_sig] );
+ XMP_Validate( SIG == tmp32, "invalid header", kXMPErr_BadFileFormat );
+ filenameLen = GetUns16LE( &this->fields[FileHeader::o_fileNameLength] );
+ extraFieldLen = GetUns16LE( &this->fields[FileHeader::o_extraFieldLength] );
+
+ // nb unlike the CDFileHeader the FileHeader will in practice never have
+ // extra fields. Reasoning: File headers never carry (their own) offsets,
+ // (un)compressed size of XMP will hardly ever reach 4 GB
+
+ if (filenameLen) {
+ filename = new char[filenameLen];
+ LFA_Read(file,filename,filenameLen,true);
+ }
+ if (extraFieldLen) {
+ extraField = new char[extraFieldLen];
+ LFA_Read(file,extraField,extraFieldLen,true);
+ // *** NB: this WOULD need parsing for content files that are
+ // compressed or uncompressed >4GB (VERY unlikely for XMP)
+ }
+ }
+
+ // writes structure to file (starting at current position)
+ void write(LFA_FileRef file)
+ {
+ XMP_Validate( SIG == GetUns32LE( &this->fields[FileHeader::o_sig] ), "invalid header on write", kXMPErr_BadFileFormat );
+
+ filenameLen = GetUns16LE( &this->fields[FileHeader::o_fileNameLength] );
+ extraFieldLen = GetUns16LE( &this->fields[FileHeader::o_extraFieldLength] );
+
+ LFA_Write( file , fields , FIXED_SIZE );
+ if (filenameLen) LFA_Write( file, filename, filenameLen );
+ if (extraFieldLen) LFA_Write( file, extraField,extraFieldLen );
+ }
+
+ void transfer(const FileHeader &orig)
+ {
+ memcpy(fields,orig.fields,FIXED_SIZE);
+ if (orig.extraField)
+ {
+ extraFieldLen=orig.extraFieldLen;
+ extraField = new char[extraFieldLen];
+ memcpy(extraField,orig.extraField,extraFieldLen);
+ }
+ if (orig.filename)
+ {
+ filenameLen=orig.filenameLen;
+ filename = new char[filenameLen];
+ memcpy(filename,orig.filename,filenameLen);
+ }
+ };
+
+ void setXMPFilename()
+ {
+ // only needed for fresh structs, thus enforcing rather than catering to memory issues
+ XMP_Enforce( (filenameLen==0) && (extraFieldLen == 0) );
+ filenameLen = xmpFilenameLen;
+ PutUns16LE(filenameLen, &fields[FileHeader::o_fileNameLength] );
+ filename = new char[xmpFilenameLen];
+ memcpy(filename,"META-INF/metadata.xml",xmpFilenameLen);
+ }
+
+ XMP_Uns32 sizeHeader()
+ {
+ return this->FIXED_SIZE + this->filenameLen + this->extraFieldLen;
+ }
+
+ XMP_Uns32 sizeTotalCF()
+ {
+ //*** not zip64 bit safe yet, use only for non-large xmp packet
+ return this->sizeHeader() + GetUns32LE( &fields[FileHeader::o_sizeCompressed] );
+ }
+
+ ~FileHeader()
+ {
+ this->release();
+ };
+
+ }; //class FileHeader
+
+ ////// yes, this needs an own class
+ ////// offsets must be extracted, added, modified,
+ ////// come&go depending on being >0xffffff
+ ////class extraField {
+ //// private:
+
+
+ class CDFileHeader {
+ private:
+ void release() //*** needed or can go?
+ {
+ if (filename) delete filename;
+ if (extraField) delete extraField;
+ if (comment) delete comment;
+ filename=0; filenameLen=0;
+ extraField=0; extraFieldLen=0;
+ comment=0; commentLen=0;
+ }
+
+ const static XMP_Uns32 SIG = 0x02014b50;
+
+ public:
+ const static XMP_Uns16 o_sig = 0; //0x02014b50
+ const static XMP_Uns16 o_versionMadeBy = 4;
+ const static XMP_Uns16 o_extractVersion = 6;
+ const static XMP_Uns16 o_flags = 8;
+ const static XMP_Uns16 o_compression = 10;
+ const static XMP_Uns16 o_lastmodTime = 12;
+ const static XMP_Uns16 o_lastmodDate = 14;
+ const static XMP_Uns16 o_crc32 = 16;
+ const static XMP_Uns16 o_sizeCompressed = 20; // 16bit stub
+ const static XMP_Uns16 o_sizeUncompressed = 24; // 16bit stub
+ const static XMP_Uns16 o_fileNameLength = 28;
+ const static XMP_Uns16 o_extraFieldLength = 30;
+ const static XMP_Uns16 o_commentLength = 32;
+ const static XMP_Uns16 o_diskNo = 34;
+ const static XMP_Uns16 o_internalAttribs = 36;
+ const static XMP_Uns16 o_externalAttribs = 38;
+ const static XMP_Uns16 o_offsetLocalHeader = 42; // 16bit stub
+ // total size is 4+12+12+10+8=46
+
+ const static int FIXED_SIZE = 46;
+ char fields[FIXED_SIZE];
+
+ // do not bet on any zero-freeness,
+ // certainly no zero termination (pascal strings),
+ // treat as data blocks
+ char* filename;
+ char* extraField;
+ char* comment;
+ XMP_Uns16 filenameLen;
+ XMP_Uns16 extraFieldLen;
+ XMP_Uns16 commentLen;
+
+ // full, real, parsed 64 bit values
+ XMP_Int64 sizeUncompressed;
+ XMP_Int64 sizeCompressed;
+ XMP_Int64 offsetLocalHeader;
+
+ CDFileHeader() : filename(0),extraField(0),comment(0),filenameLen(0),
+ extraFieldLen(0),commentLen(0),sizeUncompressed(0),sizeCompressed(0),offsetLocalHeader(0)
+ {
+ memset(fields,'\0',FIXED_SIZE);
+ //already arm with appropriate values where applicable:
+ PutUns32LE(0x02014b50, &fields[CDFileHeader::o_sig] );
+ PutUns16LE(0x14, &fields[CDFileHeader::o_extractVersion] );
+ };
+
+ // copy constructor
+ CDFileHeader(const CDFileHeader& orig) : filename(0),extraField(0),comment(0),filenameLen(0),
+ extraFieldLen(0),commentLen(0),sizeUncompressed(0),sizeCompressed(0),offsetLocalHeader(0)
+ {
+ memcpy(fields,orig.fields,FIXED_SIZE);
+ if (orig.extraField)
+ {
+ extraFieldLen=orig.extraFieldLen;
+ extraField = new char[extraFieldLen];
+ memcpy(extraField , orig.extraField , extraFieldLen);
+ }
+ if (orig.filename)
+ {
+ filenameLen=orig.filenameLen;
+ filename = new char[filenameLen];
+ memcpy(filename , orig.filename , filenameLen);
+ }
+ if (orig.comment)
+ {
+ commentLen=orig.commentLen;
+ comment = new char[commentLen];
+ memcpy(comment , orig.comment , commentLen);
+ }
+
+ filenameLen = orig.filenameLen;
+ extraFieldLen = orig.extraFieldLen;
+ commentLen = orig.commentLen;
+
+ sizeUncompressed = orig.sizeUncompressed;
+ sizeCompressed = orig.sizeCompressed;
+ offsetLocalHeader = orig.offsetLocalHeader;
+ }
+
+ // Assignment operator
+ CDFileHeader& operator=(const CDFileHeader& obj)
+ {
+ XMP_Throw("not supported",kXMPErr_Unimplemented);
+ }
+
+ // reads entire structure from file (starting at current position)
+ void read(LFA_FileRef file)
+ {
+ this->release();
+
+ LFA_Read(file,fields,FIXED_SIZE,true);
+ XMP_Validate( SIG == GetUns32LE( &this->fields[CDFileHeader::o_sig] ), "invalid header", kXMPErr_BadFileFormat );
+
+ filenameLen = GetUns16LE( &this->fields[CDFileHeader::o_fileNameLength] );
+ extraFieldLen = GetUns16LE( &this->fields[CDFileHeader::o_extraFieldLength] );
+ commentLen = GetUns16LE( &this->fields[CDFileHeader::o_commentLength] );
+
+ if (filenameLen) {
+ filename = new char[filenameLen];
+ LFA_Read(file,filename,filenameLen,true);
+ }
+ if (extraFieldLen) {
+ extraField = new char[extraFieldLen];
+ LFA_Read(file,extraField,extraFieldLen,true);
+ }
+ if (commentLen) {
+ comment = new char[commentLen];
+ LFA_Read(file,comment,commentLen,true);
+ }
+
+ ////// GET ACTUAL 64 BIT VALUES //////////////////////////////////////////////
+ // get 32bit goodies first, correct later
+ sizeUncompressed = GetUns32LE( &fields[o_sizeUncompressed] );
+ sizeCompressed = GetUns32LE( &fields[o_sizeCompressed] );
+ offsetLocalHeader = GetUns32LE( &fields[o_offsetLocalHeader] );
+
+ XMP_Int32 offset = 0;
+ while ( offset < extraFieldLen )
+ {
+ XMP_Validate( (extraFieldLen - offset) >= 4, "need 4 bytes for next header ID+len", kXMPErr_BadFileFormat);
+ XMP_Uns16 headerID = GetUns16LE( &extraField[offset] );
+ XMP_Uns16 dataSize = GetUns16LE( &extraField[offset+2] );
+ offset += 4;
+
+ XMP_Validate( (extraFieldLen - offset) <= dataSize,
+ "actual field lenght not given", kXMPErr_BadFileFormat);
+ if ( headerID == 0x1 ) //we only care about "Zip64 extended information extra field"
+ {
+ XMP_Validate( offset < extraFieldLen, "extra field too short", kXMPErr_BadFileFormat);
+ if (sizeUncompressed == 0xffffffff)
+ {
+ sizeUncompressed = GetUns64LE( &extraField[offset] );
+ offset += 8;
+ }
+ if (sizeCompressed == 0xffffffff)
+ {
+ sizeCompressed = GetUns64LE( &extraField[offset] );
+ offset += 8;
+ }
+ if (offsetLocalHeader == 0xffffffff)
+ {
+ offsetLocalHeader = GetUns64LE( &extraField[offset] );
+ offset += 8;
+ }
+ }
+ else
+ {
+ offset += dataSize;
+ } // if
+ } // while
+ } // read()
+
+ // writes structure to file (starting at current position)
+ void write(LFA_FileRef file)
+ {
+ //// WRITE BACK REAL 64 BIT VALUES, CREATE EXTRA FIELD ///////////////
+ //may only wipe extra field after obtaining all Info from it
+ if (extraField) delete extraField;
+ extraFieldLen=0;
+
+ if ( ( sizeUncompressed > 0xffffffff ) ||
+ ( sizeCompressed > 0xffffffff ) ||
+ ( offsetLocalHeader > 0xffffffff ) )
+ {
+ extraField = new char[64]; // actual maxlen is 32
+ extraFieldLen = 4; //first fields are for ID, size
+ if ( sizeUncompressed > 0xffffffff )
+ {
+ PutUns64LE( sizeUncompressed, &extraField[extraFieldLen] );
+ extraFieldLen += 8;
+ sizeUncompressed = 0xffffffff;
+ }
+ if ( sizeCompressed > 0xffffffff )
+ {
+ PutUns64LE( sizeCompressed, &extraField[extraFieldLen] );
+ extraFieldLen += 8;
+ sizeCompressed = 0xffffffff;
+ }
+ if ( offsetLocalHeader > 0xffffffff )
+ {
+ PutUns64LE( offsetLocalHeader, &extraField[extraFieldLen] );
+ extraFieldLen += 8;
+ offsetLocalHeader = 0xffffffff;
+ }
+
+ //write ID, dataSize
+ PutUns16LE( 0x0001, &extraField[0] );
+ PutUns16LE( extraFieldLen-4, &extraField[2] );
+ //extraFieldSize
+ PutUns16LE( extraFieldLen, &this->fields[CDFileHeader::o_extraFieldLength] );
+ }
+
+ // write out 32-bit ('ff-stubs' or not)
+ PutUns32LE( (XMP_Uns32)sizeUncompressed, &fields[o_sizeUncompressed] );
+ PutUns32LE( (XMP_Uns32)sizeCompressed, &fields[o_sizeCompressed] );
+ PutUns32LE( (XMP_Uns32)offsetLocalHeader, &fields[o_offsetLocalHeader] );
+
+ /// WRITE /////////////////////////////////////////////////////////////////
+ XMP_Enforce( SIG == GetUns32LE( &this->fields[CDFileHeader::o_sig] ) );
+
+ LFA_Write( file , fields , FIXED_SIZE );
+ if (filenameLen) LFA_Write( file, filename , filenameLen );
+ if (extraFieldLen) LFA_Write( file, extraField , extraFieldLen );
+ if (commentLen) LFA_Write( file, extraField , extraFieldLen );
+ }
+
+ void setXMPFilename()
+ {
+ if (filename) delete filename;
+ filenameLen = xmpFilenameLen;
+ filename = new char[xmpFilenameLen];
+ PutUns16LE(filenameLen, &fields[CDFileHeader::o_fileNameLength] );
+ memcpy(filename,"META-INF/metadata.xml",xmpFilenameLen);
+ }
+
+ XMP_Int64 size()
+ {
+ XMP_Int64 r = this->FIXED_SIZE + this->filenameLen + this->commentLen;
+ // predict serialization size
+ if ( (sizeUncompressed > 0xffffffff)||(sizeCompressed > 0xffffffff)||(offsetLocalHeader>0xffffffff) )
+ {
+ r += 4; //extra fields necessary
+ if (sizeUncompressed > 0xffffffff) r += 8;
+ if (sizeCompressed > 0xffffffff) r += 8;
+ if (offsetLocalHeader > 0xffffffff) r += 8;
+ }
+ return r;
+ }
+
+ ~CDFileHeader()
+ {
+ this->release();
+ };
+ }; // class CDFileHeader
+
+ class EndOfCD {
+ private:
+ const static XMP_Uns32 SIG = 0x06054b50;
+ void UCFECD_Free()
+ {
+ if(commentLen) delete comment;
+ commentLen = 0;
+ }
+ public:
+ const static XMP_Int32 o_Sig = 0;
+ const static XMP_Int32 o_CdNumEntriesDisk = 8; // same-same for UCF, since single-volume
+ const static XMP_Int32 o_CdNumEntriesTotal = 10;// must update both
+ const static XMP_Int32 o_CdSize = 12;
+ const static XMP_Int32 o_CdOffset = 16;
+ const static XMP_Int32 o_CommentLen = 20;
+
+ const static int FIXED_SIZE = 22;
+ char fields[FIXED_SIZE];
+
+ char* comment;
+ XMP_Uns16 commentLen;
+
+ EndOfCD() : comment(0), commentLen(0)
+ {
+ //nothing
+ };
+
+ void read (LFA_FileRef file)
+ {
+ UCFECD_Free();
+
+ LFA_Read(file,fields,FIXED_SIZE,true);
+ XMP_Validate( this->SIG == GetUns32LE( &this->fields[o_Sig] ), "invalid header", kXMPErr_BadFileFormat );
+
+ commentLen = GetUns16LE( &this->fields[o_CommentLen] );
+ if(commentLen)
+ {
+ comment = new char[commentLen];
+ LFA_Read(file,comment,commentLen,true);
+ }
+ };
+
+ void write(LFA_FileRef file)
+ {
+ XMP_Enforce( this->SIG == GetUns32LE( &this->fields[o_Sig] ) );
+ commentLen = GetUns16LE( &this->fields[o_CommentLen] );
+ LFA_Write( file , fields , FIXED_SIZE );
+ if (commentLen)
+ LFA_Write ( file, comment, commentLen );
+ }
+
+ ~EndOfCD()
+ {
+ if (comment) delete comment;
+ };
+ }; //class EndOfCD
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // EMBEDDING MATH
+ //
+ // a = content files before xmp (always 0 thus ommited)
+ // b/b2 = content files behind xmp (before/after injection)
+ // x/x2 = offset xmp content header + content file (before/after injection)
+ // cd/cd = central directory
+ // h/h2 = end of central directory record
+ XMP_Int64 b,b2,x,x2,cd,cd2,cdx,cdx2,z,z2,h,h2,
+ // length thereof ('2' only where possibly different)
+ // using XMP_Int64 here also for length (not XMP_Int32),
+ // to be prepared for zip64, our LFA functions might need things in multiple chunks...
+ al,bl,xl,x2l,cdl,cd2l,cdxl,cdx2l,z2l,hl,fl,f2l;
+ XMP_Uns16 numCF,numCF2;
+
+ bool wasCompressed; // ..before, false if no prior xmp
+ bool compressXMP; // compress this time?
+ bool inPlacePossible;
+ /* bool isZip64; <=> z2 != 0 */
+
+ FileHeader xmpFileHeader;
+ CDFileHeader xmpCDHeader;
+
+ XMP_StringPtr uncomprPacketStr;
+ XMP_StringLen uncomprPacketLen;
+ XMP_StringPtr finalPacketStr;
+ XMP_StringLen finalPacketLen;
+ std::vector<CDFileHeader> cdEntries;
+ EndOfCD endOfCD;
+ void writeOut( LFA_FileRef sourceFile, LFA_FileRef targetFile, bool isRewrite, bool isInPlace);
+
+}; // UCF_MetaHandler
+
+// =================================================================================================
+
+#endif /* __UCF_Handler_hpp__ */
+
+
diff --git a/source/XMPFiles/FileHandlers/WAV_Handler.cpp b/source/XMPFiles/FileHandlers/WAV_Handler.cpp
index 1cd5eb7..6820d01 100644
--- a/source/XMPFiles/FileHandlers/WAV_Handler.cpp
+++ b/source/XMPFiles/FileHandlers/WAV_Handler.cpp
@@ -1,13 +1,16 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
// of the Adobe license agreement accompanying it.
// =================================================================================================
-#if WIN_ENV
+#include "XMP_Environment.h" // ! This must be the first include.
+#if ! XMP_UNIXBuild // Closes at very bottom. Disabled on UNIX until legacy-as-local is fixed.
+
+#if XMP_WinBuild
#pragma warning ( disable : 4996 ) // '...' was declared deprecated
#endif
@@ -103,7 +106,7 @@ using namespace std;
static inline int GetStringRiffSize ( const std::string & str )
{
- int l = strlen ( const_cast<char *> (str.data()) );
+ int l = (int)strlen ( const_cast<char *> (str.data()) );
if ( l & 1 ) ++l;
return l;
}
@@ -194,7 +197,7 @@ void WAV_MetaHandler::UpdateFile ( bool doSafeUpdate )
std::string strTitle, strArtist, strComment, strCopyright, strCreateDate,
strEngineer, strGenre, strAlbum, strSoftware;
-
+
if ( fReconciliate ) {
// Get the legacy item values, create the new digest, and add the digest to the XMP. The
@@ -227,7 +230,7 @@ void WAV_MetaHandler::UpdateFile ( bool doSafeUpdate )
PrepareLegacyExport ( kXMP_NS_DM, kGenre, wavInfoGenreChunk, &strGenre, &digestStr, &md5Ctx );
PrepareLegacyExport ( kXMP_NS_DM, kAlbum, wavInfoAlbumChunk, &strAlbum, &digestStr, &md5Ctx );
PrepareLegacyExport ( kXMP_NS_XMP, kSoftware, wavInfoSoftwareChunk, &strSoftware, &digestStr, &md5Ctx );
-
+
// Finish the digest and add it to the XMP.
MD5Final ( md5Val, &md5Ctx );
@@ -239,10 +242,11 @@ void WAV_MetaHandler::UpdateFile ( bool doSafeUpdate )
digestStr += hexDigits [byte & 0xF];
}
- XMP_StringLen oldLen = this->xmpPacket.size();
+ XMP_StringLen oldLen = (XMP_StringLen)this->xmpPacket.size();
this->xmpObj.SetProperty ( kXMP_NS_WAV, "NativeDigest", digestStr.c_str() );
try {
- this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_ExactPacketLength, oldLen );
+ this->xmpObj.SerializeToBuffer ( &this->xmpPacket, (kXMP_UseCompactFormat | kXMP_ExactPacketLength),
+ oldLen );
} catch ( ... ) {
this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat );
}
@@ -250,29 +254,33 @@ void WAV_MetaHandler::UpdateFile ( bool doSafeUpdate )
}
XMP_StringPtr packetStr = this->xmpPacket.c_str();
- XMP_StringLen packetLen = this->xmpPacket.size();
+ XMP_StringLen packetLen = (XMP_StringLen)this->xmpPacket.size();
if ( packetLen == 0 ) return;
// Make sure we're writing an even number of bytes as required by the RIFF specification
- if ( (this->xmpPacket.size() & 1) == 1 ) this->xmpPacket.push_back (' ');
+ if ( (this->xmpPacket.size() & 1) == 1 )
+ this->xmpPacket.push_back (' ');
XMP_Assert ( (this->xmpPacket.size() & 1) == 0 );
packetStr = this->xmpPacket.c_str(); // ! Make sure they are current.
- packetLen = this->xmpPacket.size();
+ packetLen = (XMP_StringLen)this->xmpPacket.size();
LFA_FileRef fileRef ( this->parent->fileRef );
if ( fileRef == 0 ) return;
RIFF_Support::RiffState riffState;
- long numTags = RIFF_Support::OpenRIFF(fileRef, riffState);
+ long numTags = RIFF_Support::OpenRIFF ( fileRef, riffState );
if ( numTags == 0 ) return;
ok = RIFF_Support::PutChunk ( fileRef, riffState, formtypeWAVE, kXMPUserDataType, (char*)packetStr, packetLen );
if ( ! ok ) return;
+ ok = CreatorAtom::Update ( this->xmpObj, fileRef, formtypeWAVE, riffState );
+ if ( ! ok ) return;
+
// If needed, reconciliate the XMP data back into the native metadata.
if ( fReconciliate ) {
- PutChunk ( fileRef, riffState, wavWaveTag, wavWaveTitleChunk, strTitle.c_str(), strTitle.size() );
+ PutChunk ( fileRef, riffState, wavWaveTag, wavWaveTitleChunk, strTitle.c_str(), (XMP_Int32)strTitle.size() );
// Pad the old tags
RIFF_Support::MarkChunkAsPadding ( fileRef, riffState, 0, wavInfoCreateDateChunk, 0 );
@@ -360,14 +368,14 @@ static void AddDigestItem ( XMP_Uns32 legacyID, std::string & legacyStr, std::st
{
XMP_Uns32 leID = MakeUns32LE ( legacyID );
- XMP_Uns32 leLen = MakeUns32LE (legacyStr.size());
+ XMP_Uns32 leLen = MakeUns32LE ( (XMP_Uns32)legacyStr.size());
digestStr->append ( (char*)(&leID), 4 );
digestStr->append ( "," );
MD5Update ( md5, (XMP_Uns8*)&leID, 4 );
MD5Update ( md5, (XMP_Uns8*)&leLen, 4 );
- MD5Update ( md5, (XMP_Uns8*)legacyStr.c_str(), legacyStr.size() );
+ MD5Update ( md5, (XMP_Uns8*)legacyStr.c_str(), (XMP_Int32)legacyStr.size() );
} // AddDigestItem
@@ -409,7 +417,7 @@ static void CreateCurrentDigest ( LFA_FileRef fileRef, RIFF_Support::RiffState r
AddCurrentDigestItem ( fileRef, riffState, wavInfoGenreChunk, wavInfoTag, digestStr, &md5Ctx );
AddCurrentDigestItem ( fileRef, riffState, wavInfoAlbumChunk, wavInfoTag, digestStr, &md5Ctx );
AddCurrentDigestItem ( fileRef, riffState, wavInfoSoftwareChunk, wavInfoTag, digestStr, &md5Ctx );
-
+
MD5Final ( md5Val, &md5Ctx );
(*digestStr)[digestStr->size()-1] = ';';
@@ -434,15 +442,47 @@ void WAV_MetaHandler::CacheFileData()
bool keepExistingXMP = false; // By default an import will replace existing XMP.
bool haveLegacyItem, haveXMPItem;
- LFA_FileRef fileRef ( this->parent->fileRef );
+ LFA_FileRef fileRef ( this->parent->fileRef ); //*** simplify to assignment
+
+ bool updateFile = XMP_OptionIsSet ( this->parent->openFlags, kXMPFiles_OpenForUpdate );
+ if ( updateFile ) {
+
+ // Workaround for bad files in the field that have a bad size in the outermost RIFF chunk.
+ // Repair the cases where the length is too long (beyond EOF). Don't repair a length that is
+ // less than EOF, we don't know if there actually are multiple top level chunks. There is
+ // also a check and "runtime repair" inside ReadTag, needed for read-only file access.
+
+ XMP_Int64 fileLen = LFA_Measure ( fileRef );
+ XMP_Uns32 riffLen;
+
+ LFA_Seek ( fileRef, 4, SEEK_SET );
+ LFA_Read ( fileRef, &riffLen, 4 );
+ riffLen = GetUns32LE ( &riffLen );
+
+ if ( (fileLen >= 8) && ((XMP_Int64)riffLen > (fileLen - 8)) ) { // Is the initial chunk too long?
+
+ bool repairFile = XMP_OptionIsSet ( this->parent->openFlags, kXMPFiles_OpenRepairFile );
+ if ( ! repairFile ) {
+ XMP_Throw ( "Initial RIFF tag exceeds file length", kXMPErr_BadValue );
+ } else {
+ riffLen = MakeUns32LE ( (XMP_Uns32)fileLen - 8 );
+ LFA_Seek ( fileRef, 4, SEEK_SET );
+ LFA_Write ( fileRef, &riffLen, 4 );
+ }
+
+ }
+
+ }
+
+ // Contnue with normal processing.
RIFF_Support::RiffState riffState;
long numTags = RIFF_Support::OpenRIFF ( fileRef, riffState );
- if ( numTags == 0 ) return;
+ if ( numTags == 0 ) return; //*** shouldn't we throw ? XMP_Throw("invalid file format") or such?
// Determine the size of the metadata
unsigned long bufferSize(0);
- haveLegacyItem = RIFF_Support::GetRIFFChunk ( fileRef, riffState, kXMPUserDataType, 0, 0, 0, &bufferSize );
+ haveLegacyItem = RIFF_Support::GetRIFFChunk ( fileRef, riffState, kXMPUserDataType /* _PMX, the xmp packet */, 0, 0, 0, &bufferSize );
if ( ! haveLegacyItem ) {
@@ -455,12 +495,13 @@ void WAV_MetaHandler::CacheFileData()
this->xmpPacket.assign(bufferSize, ' ');
// Get the metadata
- haveLegacyItem = RIFF_Support::GetRIFFChunk ( fileRef, riffState, kXMPUserDataType, 0, 0,
- const_cast<char *>(this->xmpPacket.data()), &bufferSize );
+ XMP_Uns64 xmpPacketPosition;
+ haveLegacyItem = RIFF_Support::GetRIFFChunk ( fileRef, riffState, kXMPUserDataType /* _PMX, the xmp packet */, 0, 0,
+ const_cast<char *>(this->xmpPacket.data()), &bufferSize, &xmpPacketPosition );
if ( haveLegacyItem ) {
- this->packetInfo.offset = kXMPFiles_UnknownOffset;
+ this->packetInfo.offset = xmpPacketPosition;
this->packetInfo.length = bufferSize;
- this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), this->xmpPacket.size() );
+ this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() );
this->containsXMP = true;
}
@@ -502,10 +543,24 @@ void WAV_MetaHandler::CacheFileData()
}
+ CreatorAtom::Import ( this->xmpObj, fileRef, riffState );
+
// Update the xmpPacket, as the xmpObj might have been updated with legacy info
- this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat );
- this->packetInfo.offset = kXMPFiles_UnknownOffset;
- this->packetInfo.length = this->xmpPacket.size();
+ if ( this->packetInfo.length == kXMPFiles_UnknownLength )
+ {
+ // kXMPFiles_UnknownLength <=> no prior packet, thus do not attempt
+ // to put in place (creates several seconds of delay
+ this->xmpObj.SerializeToBuffer ( &this->xmpPacket, (kXMP_UseCompactFormat ) );
+ }
+ else
+ {
+ try {
+ this->xmpObj.SerializeToBuffer ( &this->xmpPacket,
+ (kXMP_UseCompactFormat | kXMP_ExactPacketLength) , this->packetInfo.length );
+ } catch ( XMP_Error ) {
+ this->xmpObj.SerializeToBuffer ( &this->xmpPacket, (kXMP_UseCompactFormat ) );
+ }
+ }
this->processedXMP = this->containsXMP;
@@ -646,3 +701,7 @@ void WAV_MetaHandler::ImportLegacyItem ( RIFF_Support::RiffState & inOutRiffStat
}
} // WAV_MetaHandler::LoadPropertyFromRIFF
+
+// =================================================================================================
+
+#endif // XMP_UNIXBuild
diff --git a/source/XMPFiles/FileHandlers/WAV_Handler.hpp b/source/XMPFiles/FileHandlers/WAV_Handler.hpp
index a84f46b..4bd9aae 100644
--- a/source/XMPFiles/FileHandlers/WAV_Handler.hpp
+++ b/source/XMPFiles/FileHandlers/WAV_Handler.hpp
@@ -3,13 +3,16 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
// of the Adobe license agreement accompanying it.
// =================================================================================================
+#include "XMP_Environment.h" // ! This must be the first include.
+#if ! XMP_UNIXBuild // Closes at very bottom. Disabled on UNIX until legacy-as-local is fixed.
+
#include "XMPFiles_Impl.hpp"
#include "MD5.h"
@@ -68,4 +71,5 @@ private:
// =================================================================================================
-#endif /* __WAV_Handler_hpp__ */
+#endif // XMP_UNIXBuild
+#endif // __WAV_Handler_hpp__
diff --git a/source/XMPFiles/FileHandlers/XDCAMEX_Handler.cpp b/source/XMPFiles/FileHandlers/XDCAMEX_Handler.cpp
new file mode 100644
index 0000000..47c0851
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/XDCAMEX_Handler.cpp
@@ -0,0 +1,824 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XDCAMEX_Handler.hpp"
+#include "XDCAM_Support.hpp"
+#include "MD5.h"
+
+using namespace std;
+
+// =================================================================================================
+/// \file XDCAMEX_Handler.cpp
+/// \brief Folder format handler for XDCAMEX.
+///
+/// This handler is for the XDCAMEX video format.
+///
+/// .../MyMovie/
+/// BPAV/
+/// MEDIAPRO.XML
+/// MEDIAPRO.BUP
+/// CLPR/
+/// 709_001_01/
+/// 709_001_01.SMI
+/// 709_001_01.MP4
+/// 709_001_01M01.XML
+/// 709_001_01R01.BIM
+/// 709_001_01I01.PPN
+/// 709_001_02/
+/// 709_002_01/
+/// 709_003_01/
+/// TAKR/
+/// 709_001/
+/// 709_001.SMI
+/// 709_001M01.XML
+///
+/// The Backup files (.BUP) are optional. No files or directories other than those listed are
+/// allowed in the BPAV directory. The CLPR (clip root) directory may contain only clip directories,
+/// which may only contain the clip files listed. The TAKR (take root) direcory may contail only
+/// take directories, which may only contain take files. The take root directory can be empty.
+/// MEDIPRO.XML contains information on clip and take management.
+///
+/// Each clip directory contains a media file (.MP4), a clip info file (.SMI), a real time metadata
+/// file (.BIM), a non real time metadata file (.XML), and a picture pointer file (.PPN). A take
+/// directory conatins a take info and non real time take metadata files.
+// =================================================================================================
+
+// =================================================================================================
+// XDCAMEX_CheckFormat
+// ===================
+//
+// This version checks for the presence of a top level BPAV directory, and the required files and
+// directories immediately within it. The CLPR and TAKR subfolders are required, as is MEDIAPRO.XML.
+//
+// The state of the string parameters depends on the form of the path passed by the client. If the
+// client passed a logical clip path, like ".../MyMovie/012_3456_01", the parameters are:
+// rootPath - ".../MyMovie"
+// gpName - empty
+// parentName - empty
+// leafName - "012_3456_01"
+// If the client passed a full file path, like ".../MyMovie/BPAV/CLPR/012_3456_01/012_3456_01M01.XML", they are:
+// rootPath - ".../MyMovie/BPAV"
+// gpName - "CLPR"
+// parentName - "012_3456_01"
+// leafName - "012_3456_01M01"
+
+// ! The common code has shifted the gpName, parentName, and leafName strings to upper case. It has
+// ! also made sure that for a logical clip path the rootPath is an existing folder, and that the
+// ! file exists for a full file path.
+
+// ! Using explicit '/' as a separator when creating paths, it works on Windows.
+
+bool XDCAMEX_CheckFormat ( XMP_FileFormat format,
+ const std::string & _rootPath,
+ const std::string & gpName,
+ const std::string & parentName,
+ const std::string & _leafName,
+ XMPFiles * parent )
+{
+ std::string rootPath = _rootPath;
+ std::string clipName = _leafName;
+ std::string grandGPName;
+
+ std::string bpavPath ( rootPath );
+
+ // Do some initial checks on the gpName and parentName.
+
+ if ( gpName.empty() != parentName.empty() ) return false; // Must be both empty or both non-empty.
+
+ if ( gpName.empty() ) {
+
+ // This is the logical clip path case. Make sure .../MyMovie/BPAV/CLPR is a folder.
+ bpavPath += kDirChar; // The rootPath was just ".../MyMovie".
+ bpavPath += "BPAV";
+ if ( GetChildMode ( bpavPath, "CLPR" ) != kFMode_IsFolder ) return false;
+
+ } else {
+
+ // This is the explicit file case. Make sure the ancestry is OK. Set the clip name from the
+ // parent folder name.
+
+ if ( gpName != "CLPR" ) return false;
+ SplitLeafName ( &rootPath, &grandGPName );
+ MakeUpperCase ( &grandGPName );
+ if ( grandGPName != "BPAV" ) return false;
+ if ( ! XMP_LitNMatch ( parentName.c_str(), clipName.c_str(), parentName.size() ) ) return false;
+
+ clipName = parentName;
+
+ }
+
+ // Check the rest of the required general structure.
+ if ( GetChildMode ( bpavPath, "TAKR" ) != kFMode_IsFolder ) return false;
+ if ( GetChildMode ( bpavPath, "MEDIAPRO.XML" ) != kFMode_IsFile ) return false;
+
+ // Make sure the clip's .MP4 and .SMI files exist.
+ std::string tempPath ( bpavPath );
+ tempPath += kDirChar;
+ tempPath += "CLPR";
+ tempPath += kDirChar;
+ tempPath += clipName;
+ tempPath += kDirChar;
+ tempPath += clipName;
+ tempPath += ".MP4";
+ if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFile ) return false;
+ tempPath.erase ( tempPath.size()-3 );
+ tempPath += "SMI";
+ if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFile ) return false;
+
+ // And now save the psuedo path for the handler object.
+ tempPath = rootPath;
+ tempPath += kDirChar;
+ tempPath += clipName;
+ size_t pathLen = tempPath.size() + 1; // Include a terminating nul.
+ parent->handlerTemp = malloc ( pathLen );
+ if ( parent->handlerTemp == 0 ) XMP_Throw ( "No memory for XDCAMEX clip info", kXMPErr_NoMemory );
+ memcpy ( parent->handlerTemp, tempPath.c_str(), pathLen );
+
+ return true;
+
+} // XDCAMEX_CheckFormat
+
+// =================================================================================================
+// XDCAMEX_MetaHandlerCTor
+// =======================
+
+XMPFileHandler * XDCAMEX_MetaHandlerCTor ( XMPFiles * parent )
+{
+ return new XDCAMEX_MetaHandler ( parent );
+
+} // XDCAMEX_MetaHandlerCTor
+
+// =================================================================================================
+// XDCAMEX_MetaHandler::XDCAMEX_MetaHandler
+// ========================================
+
+XDCAMEX_MetaHandler::XDCAMEX_MetaHandler ( XMPFiles * _parent ) : expat(0)
+{
+ this->parent = _parent; // Inherited, can't set in the prefix.
+ this->handlerFlags = kXDCAMEX_HandlerFlags;
+ this->stdCharForm = kXMP_Char8Bit;
+
+ // Extract the root path and clip name from handlerTemp.
+
+ XMP_Assert ( this->parent->handlerTemp != 0 );
+
+ this->rootPath.assign ( (char*) this->parent->handlerTemp );
+ free ( this->parent->handlerTemp );
+ this->parent->handlerTemp = 0;
+
+ SplitLeafName ( &this->rootPath, &this->clipName );
+
+} // XDCAMEX_MetaHandler::XDCAMEX_MetaHandler
+
+// =================================================================================================
+// XDCAMEX_MetaHandler::~XDCAMEX_MetaHandler
+// =========================================
+
+XDCAMEX_MetaHandler::~XDCAMEX_MetaHandler()
+{
+
+ this->CleanupLegacyXML();
+ if ( this->parent->handlerTemp != 0 ) {
+ free ( this->parent->handlerTemp );
+ this->parent->handlerTemp = 0;
+ }
+
+} // XDCAMEX_MetaHandler::~XDCAMEX_MetaHandler
+
+// =================================================================================================
+// XDCAMEX_MetaHandler::MakeClipFilePath
+// =====================================
+
+void XDCAMEX_MetaHandler::MakeClipFilePath ( std::string * path, XMP_StringPtr suffix )
+{
+
+ *path = this->rootPath;
+ *path += kDirChar;
+ *path += "BPAV";
+ *path += kDirChar;
+ *path += "CLPR";
+ *path += kDirChar;
+ *path += this->clipName;
+ *path += kDirChar;
+ *path += this->clipName;
+ *path += suffix;
+
+} // XDCAMEX_MetaHandler::MakeClipFilePath
+
+// =================================================================================================
+// XDCAMEX_MetaHandler::MakeLegacyDigest
+// =====================================
+
+// *** Early hack version.
+
+#define kHexDigits "0123456789ABCDEF"
+
+void XDCAMEX_MetaHandler::MakeLegacyDigest ( std::string * digestStr )
+{
+ digestStr->erase();
+ if ( this->clipMetadata == 0 ) return; // Bail if we don't have any legacy XML.
+ XMP_Assert ( this->expat != 0 );
+
+ XMP_StringPtr xdcNS = this->xdcNS.c_str();
+ XML_NodePtr legacyContext, legacyProp;
+
+ legacyContext = this->clipMetadata->GetNamedElement ( xdcNS, "Access" );
+ if ( legacyContext == 0 ) return;
+
+ MD5_CTX context;
+ unsigned char digestBin [16];
+ MD5Init ( &context );
+
+ legacyProp = legacyContext->GetNamedElement ( xdcNS, "Creator" );
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() && (! legacyProp->content.empty()) ) {
+ const XML_Node * xmlValue = legacyProp->content[0];
+ MD5Update ( &context, (XMP_Uns8*)xmlValue->value.c_str(), (unsigned int)xmlValue->value.size() );
+ }
+
+ legacyProp = legacyContext->GetNamedElement ( xdcNS, "CreationDate" );
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() && (! legacyProp->content.empty()) ) {
+ const XML_Node * xmlValue = legacyProp->content[0];
+ MD5Update ( &context, (XMP_Uns8*)xmlValue->value.c_str(), (unsigned int)xmlValue->value.size() );
+ }
+
+ legacyProp = legacyContext->GetNamedElement ( xdcNS, "LastUpdateDate" );
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() && (! legacyProp->content.empty()) ) {
+ const XML_Node * xmlValue = legacyProp->content[0];
+ MD5Update ( &context, (XMP_Uns8*)xmlValue->value.c_str(), (unsigned int)xmlValue->value.size() );
+ }
+
+ MD5Final ( digestBin, &context );
+
+ char buffer [40];
+ for ( int in = 0, out = 0; in < 16; in += 1, out += 2 ) {
+ XMP_Uns8 byte = digestBin[in];
+ buffer[out] = kHexDigits [ byte >> 4 ];
+ buffer[out+1] = kHexDigits [ byte & 0xF ];
+ }
+ buffer[32] = 0;
+ digestStr->append ( buffer );
+
+} // XDCAMEX_MetaHandler::MakeLegacyDigest
+
+// =================================================================================================
+// XDCAMEX_MetaHandler::CleanupLegacyXML
+// =====================================
+
+void XDCAMEX_MetaHandler::CleanupLegacyXML()
+{
+
+ if ( ! this->defaultNS.empty() ) {
+ SXMPMeta::DeleteNamespace ( this->defaultNS.c_str() );
+ this->defaultNS.erase();
+ }
+
+ if ( this->expat != 0 ) { delete ( this->expat ); this->expat = 0; }
+
+ clipMetadata = 0; // ! Was a pointer into the expat tree.
+
+} // XDCAMEX_MetaHandler::CleanupLegacyXML
+
+// =================================================================================================
+// XDCAMEX_MetaHandler::CacheFileData
+// ==================================
+
+void XDCAMEX_MetaHandler::CacheFileData()
+{
+ XMP_Assert ( (! this->containsXMP) && (! this->containsTNail) );
+
+ // See if the clip's .XMP file exists.
+
+ std::string xmpPath;
+ this->MakeClipFilePath ( &xmpPath, "M01.XMP" );
+ if ( GetFileMode ( xmpPath.c_str() ) != kFMode_IsFile ) return; // No XMP.
+
+ // Read the entire .XMP file.
+
+ char openMode = 'r';
+ if ( this->parent->openFlags & kXMPFiles_OpenForUpdate ) openMode = 'w';
+
+ LFA_FileRef xmpFile = LFA_Open ( xmpPath.c_str(), openMode );
+ if ( xmpFile == 0 ) return; // The open failed.
+
+ XMP_Int64 xmpLen = LFA_Measure ( xmpFile );
+ if ( xmpLen > 100*1024*1024 ) {
+ XMP_Throw ( "XDCAMEX XMP is outrageously large", kXMPErr_InternalFailure ); // Sanity check.
+ }
+
+ this->xmpPacket.erase();
+ this->xmpPacket.reserve ( (size_t)xmpLen );
+ this->xmpPacket.append ( (size_t)xmpLen, ' ' );
+
+ XMP_Int32 ioCount = LFA_Read ( xmpFile, (void*)this->xmpPacket.data(), (XMP_Int32)xmpLen, kLFA_RequireAll );
+ XMP_Assert ( ioCount == xmpLen );
+
+ this->packetInfo.offset = 0;
+ this->packetInfo.length = (XMP_Int32)xmpLen;
+ FillPacketInfo ( this->xmpPacket, &this->packetInfo );
+
+ XMP_Assert ( this->parent->fileRef == 0 );
+ if ( openMode == 'r' ) {
+ LFA_Close ( xmpFile );
+ } else {
+ this->parent->fileRef = xmpFile;
+ }
+
+ this->containsXMP = true;
+
+} // XDCAMEX_MetaHandler::CacheFileData
+
+// =================================================================================================
+// XDCAMEX_MetaHandler::GetTakeDuration
+// ====================================
+
+void XDCAMEX_MetaHandler::GetTakeDuration ( const std::string & takeURI, std::string & duration )
+{
+
+ // Some versions of gcc can't tolerate goto's across declarations.
+ // *** Better yet, avoid this cruft with self-cleaning objects.
+ #define CleanupAndExit \
+ { \
+ if (expat != 0) delete expat; \
+ if (takeXMLFile.fileRef != 0) LFA_Close ( takeXMLFile.fileRef ); \
+ return; \
+ }
+
+ duration.clear();
+
+ // Build a directory string to the take .xml file.
+
+ std::string takeDir ( takeURI );
+ takeDir.erase ( 0, 1 ); // Change the leading "//" to "/", then all '/' to kDirChar.
+ if ( kDirChar != '/' ) {
+ for ( size_t i = 0, limit = takeDir.size(); i < limit; ++i ) {
+ if ( takeDir[i] == '/' ) takeDir[i] = kDirChar;
+ }
+ }
+
+ std::string takePath ( this->rootPath );
+ takePath += kDirChar;
+ takePath += "BPAV";
+ takePath += takeDir;
+
+ // Replace .SMI with M01.XML.
+ if ( takePath.size() > 4 ) {
+ takePath.erase ( takePath.size() - 4, 4 );
+ takePath += "M01.XML";
+ }
+
+ // Parse MEDIAPRO.XML
+
+ XML_NodePtr takeRootElem = 0;
+ XML_NodePtr context = 0;
+ AutoFile takeXMLFile;
+
+ takeXMLFile.fileRef = LFA_Open ( takePath.c_str(), 'r' );
+ if ( takeXMLFile.fileRef == 0 ) return; // The open failed.
+
+ ExpatAdapter * expat = XMP_NewExpatAdapter();
+ if ( this->expat == 0 ) return;
+
+ XMP_Uns8 buffer [64*1024];
+ while ( true ) {
+ XMP_Int32 ioCount = LFA_Read ( takeXMLFile.fileRef, buffer, sizeof(buffer) );
+ if ( ioCount == 0 ) break;
+ expat->ParseBuffer ( buffer, ioCount, false /* not the end */ );
+ }
+
+ expat->ParseBuffer ( 0, 0, true ); // End the parse.
+ LFA_Close ( takeXMLFile.fileRef );
+ takeXMLFile.fileRef = 0;
+
+ // Get the root node of the XML tree.
+
+ XML_Node & mediaproXMLTree = expat->tree;
+ for ( size_t i = 0, limit = mediaproXMLTree.content.size(); i < limit; ++i ) {
+ if ( mediaproXMLTree.content[i]->kind == kElemNode ) {
+ takeRootElem = mediaproXMLTree.content[i];
+ }
+ }
+ if ( takeRootElem == 0 ) CleanupAndExit
+
+ XMP_StringPtr rlName = takeRootElem->name.c_str() + takeRootElem->nsPrefixLen;
+ if ( ! XMP_LitMatch ( rlName, "NonRealTimeMeta" ) ) CleanupAndExit
+
+ // MediaProfile, Contents
+ XMP_StringPtr ns = takeRootElem->ns.c_str();
+ context = takeRootElem->GetNamedElement ( ns, "Duration" );
+ if ( context != 0 ) {
+ XMP_StringPtr durationValue = context->GetAttrValue ( "value" );
+ if ( durationValue != 0 ) duration = durationValue;
+ }
+
+ CleanupAndExit
+ #undef CleanupAndExit
+
+}
+
+// =================================================================================================
+// XDCAMEX_MetaHandler::GetTakeUMID
+// ================================
+
+void XDCAMEX_MetaHandler::GetTakeUMID ( const std::string& clipUMID,
+ std::string& takeUMID,
+ std::string& takeXMLURI )
+{
+
+ // Some versions of gcc can't tolerate goto's across declarations.
+ // *** Better yet, avoid this cruft with self-cleaning objects.
+ #define CleanupAndExit \
+ { \
+ if (expat != 0) delete expat; \
+ if (mediaproXMLFile.fileRef != 0) LFA_Close ( mediaproXMLFile.fileRef ); \
+ return; \
+ }
+
+ takeUMID.clear();
+ takeXMLURI.clear();
+
+ // Build a directory string to the MEDIAPRO file.
+
+ std::string mediapropath ( this->rootPath );
+ mediapropath += kDirChar;
+ mediapropath += "BPAV";
+ mediapropath += kDirChar;
+ mediapropath += "MEDIAPRO.XML";
+
+ // Parse MEDIAPRO.XML.
+
+ XML_NodePtr mediaproRootElem = 0;
+ XML_NodePtr contentContext = 0, materialContext = 0;
+
+ AutoFile mediaproXMLFile;
+ mediaproXMLFile.fileRef = LFA_Open ( mediapropath.c_str(), 'r' );
+ if ( mediaproXMLFile.fileRef == 0 ) return; // The open failed.
+
+ ExpatAdapter * expat = XMP_NewExpatAdapter();
+ if ( this->expat == 0 ) return;
+
+ XMP_Uns8 buffer [64*1024];
+ while ( true ) {
+ XMP_Int32 ioCount = LFA_Read ( mediaproXMLFile.fileRef, buffer, sizeof(buffer) );
+ if ( ioCount == 0 ) break;
+ expat->ParseBuffer ( buffer, ioCount, false /* not the end */ );
+ }
+
+ expat->ParseBuffer ( 0, 0, true ); // End the parse.
+ LFA_Close ( mediaproXMLFile.fileRef );
+ mediaproXMLFile.fileRef = 0;
+
+ // Get the root node of the XML tree.
+
+ XML_Node & mediaproXMLTree = expat->tree;
+ for ( size_t i = 0, limit = mediaproXMLTree.content.size(); i < limit; ++i ) {
+ if ( mediaproXMLTree.content[i]->kind == kElemNode ) {
+ mediaproRootElem = mediaproXMLTree.content[i];
+ }
+ }
+
+ if ( mediaproRootElem == 0 ) CleanupAndExit
+ XMP_StringPtr rlName = mediaproRootElem->name.c_str() + mediaproRootElem->nsPrefixLen;
+ if ( ! XMP_LitMatch ( rlName, "MediaProfile" ) ) CleanupAndExit
+
+ // MediaProfile, Contents
+
+ XMP_StringPtr ns = mediaproRootElem->ns.c_str();
+ contentContext = mediaproRootElem->GetNamedElement ( ns, "Contents" );
+
+ if ( contentContext != 0 ) {
+
+ size_t numMaterialElems = contentContext->CountNamedElements ( ns, "Material" );
+
+ for ( size_t i = 0; i < numMaterialElems; ++i ) { // Iterate over Material tags.
+
+ XML_NodePtr materialElement = contentContext->GetNamedElement ( ns, "Material", i );
+ XMP_Assert ( materialElement != 0 );
+
+ XMP_StringPtr umid = materialElement->GetAttrValue ( "umid" );
+ XMP_StringPtr uri = materialElement->GetAttrValue ( "uri" );
+
+ if ( umid == 0 ) umid = "";
+ if ( uri == 0 ) uri = "";
+
+ size_t numComponents = materialElement->CountNamedElements ( ns, "Component" );
+
+ for ( size_t j = 0; j < numComponents; ++j ) {
+
+ XML_NodePtr componentElement = materialElement->GetNamedElement ( ns, "Component", j );
+ XMP_Assert ( componentElement != 0 );
+
+ XMP_StringPtr compUMID = componentElement->GetAttrValue ( "umid" );
+
+ if ( (compUMID != 0) && (compUMID == clipUMID) ) {
+ takeUMID = umid;
+ takeXMLURI = uri;
+ break;
+ }
+
+ }
+
+ if ( ! takeUMID.empty() ) break;
+
+ }
+
+ }
+
+ CleanupAndExit
+ #undef CleanupAndExit
+
+}
+
+// =================================================================================================
+// XDCAMEX_MetaHandler::ProcessXMP
+// ===============================
+
+void XDCAMEX_MetaHandler::ProcessXMP()
+{
+
+ // Some versions of gcc can't tolerate goto's across declarations.
+ // *** Better yet, avoid this cruft with self-cleaning objects.
+ #define CleanupAndExit \
+ { \
+ bool openForUpdate = XMP_OptionIsSet ( this->parent->openFlags, kXMPFiles_OpenForUpdate ); \
+ if ( ! openForUpdate ) this->CleanupLegacyXML(); \
+ return; \
+ }
+
+ if ( this->processedXMP ) return;
+ this->processedXMP = true; // Make sure only called once.
+
+ if ( this->containsXMP ) {
+ this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() );
+ }
+
+ // NonRealTimeMeta -> XMP by schema.
+ std::string thisUMID, takeUMID, takeXMLURI, takeDuration;
+ std::string xmlPath;
+ this->MakeClipFilePath ( &xmlPath, "M01.XML" );
+
+ // *** Hack: Special case trickery to detect and clean up default XML namespace usage.
+
+ bool haveDefaultNS = SXMPMeta::GetNamespaceURI ( "_dflt_", 0 ); // Is there already a default namespace?
+
+ AutoFile xmlFile;
+ xmlFile.fileRef = LFA_Open ( xmlPath.c_str(), 'r' );
+ if ( xmlFile.fileRef == 0 ) return; // The open failed.
+
+ this->expat = XMP_NewExpatAdapter();
+ if ( this->expat == 0 ) XMP_Throw ( "XDCAMEX_MetaHandler: Can't create Expat adapter", kXMPErr_NoMemory );
+
+ XMP_Uns8 buffer [64*1024];
+ while ( true ) {
+ XMP_Int32 ioCount = LFA_Read ( xmlFile.fileRef, buffer, sizeof(buffer) );
+ if ( ioCount == 0 ) break;
+ this->expat->ParseBuffer ( buffer, ioCount, false /* not the end */ );
+ }
+ this->expat->ParseBuffer ( 0, 0, true ); // End the parse.
+
+ LFA_Close ( xmlFile.fileRef );
+ xmlFile.fileRef = 0;
+
+ if ( ! haveDefaultNS ) {
+ // No prior default XML namespace. If there is one now, remember it and delete it when done.
+ haveDefaultNS = SXMPMeta::GetNamespaceURI ( "_dflt_", &this->defaultNS );
+ XMP_Assert ( haveDefaultNS == (! this->defaultNS.empty()) );
+ }
+
+ // The root element should be NonRealTimeMeta in some namespace. Take whatever this file uses.
+
+ XML_Node & xmlTree = this->expat->tree;
+ XML_NodePtr rootElem = 0;
+
+ for ( size_t i = 0, limit = xmlTree.content.size(); i < limit; ++i ) {
+ if ( xmlTree.content[i]->kind == kElemNode ) rootElem = xmlTree.content[i];
+ }
+
+ if ( rootElem == 0 ) CleanupAndExit
+ XMP_StringPtr rootLocalName = rootElem->name.c_str() + rootElem->nsPrefixLen;
+ if ( ! XMP_LitMatch ( rootLocalName, "NonRealTimeMeta" ) ) CleanupAndExit
+
+ this->legacyNS = rootElem->ns;
+
+ // Check the legacy digest.
+
+ XMP_StringPtr legacyNS = this->legacyNS.c_str();
+ this->clipMetadata = rootElem; // ! Save the NonRealTimeMeta pointer for other use.
+
+ std::string oldDigest, newDigest;
+ bool digestFound = this->xmpObj.GetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "XDCAMEX", &oldDigest, 0 );
+ if ( digestFound ) {
+ this->MakeLegacyDigest ( &newDigest );
+ if ( oldDigest == newDigest ) CleanupAndExit
+ }
+
+ // If we get here we need find and import the actual legacy elements using the current namespace.
+ // Either there is no old digest in the XMP, or the digests differ. In the former case keep any
+ // existing XMP, in the latter case take new legacy values.
+ this->containsXMP = XDCAM_Support::GetLegacyMetaData ( &this->xmpObj, rootElem, legacyNS, digestFound, thisUMID );
+
+ // If this clip is part of a take, add the take number to the relation field, and get the
+ // duration from the take metadata.
+ GetTakeUMID ( thisUMID, takeUMID, takeXMLURI );
+
+ // If this clip is part of a take, update the duration to reflect the take duration rather than
+ // the clip duration, and add the take name as a shot name.
+
+ if ( ! takeXMLURI.empty() ) {
+
+ // Update duration. This property already exists from clip legacy metadata.
+ GetTakeDuration ( takeXMLURI, takeDuration );
+ if ( ! takeDuration.empty() ) {
+ this->xmpObj.SetStructField ( kXMP_NS_DM, "duration", kXMP_NS_DM, "value", takeDuration );
+ containsXMP = true;
+ }
+
+ if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DM, "shotName" )) ) {
+
+ std::string takeName;
+ SplitLeafName ( &takeXMLURI, &takeName );
+
+ // Check for the xml suffix, and delete if it exists.
+ size_t pos = takeName.rfind(".SMI");
+ if ( pos != std::string::npos ) {
+
+ takeName.erase ( pos );
+
+ // delete the take number suffix if it exists.
+ if ( takeName.size() > 3 ) {
+
+ size_t suffix = takeName.size() - 3;
+ char c1 = takeName[suffix];
+ char c2 = takeName[suffix+1];
+ char c3 = takeName[suffix+2];
+ if ( ('U' == c1) && ('0' <= c2) && (c2 <= '9') && ('0' <= c3) && (c3 <= '9') ) {
+ takeName.erase ( suffix );
+ }
+
+ this->xmpObj.SetProperty ( kXMP_NS_DM, "shotName", takeName, kXMP_DeleteExisting );
+ containsXMP = true;
+
+ }
+
+ }
+
+ }
+
+ }
+
+ if ( (! takeUMID.empty()) &&
+ (digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DC, "relation" ))) ) {
+ this->xmpObj.DeleteProperty ( kXMP_NS_DC, "relation" );
+ this->xmpObj.AppendArrayItem ( kXMP_NS_DC, "relation", kXMP_PropArrayIsUnordered, takeUMID );
+ this->containsXMP = true;
+ }
+
+ CleanupAndExit
+ #undef CleanupAndExit
+
+} // XDCAMEX_MetaHandler::ProcessXMP
+
+
+// =================================================================================================
+// XDCAMEX_MetaHandler::UpdateFile
+// ===============================
+//
+// Note that UpdateFile is only called from XMPFiles::CloseFile, so it is OK to close the file here.
+
+void XDCAMEX_MetaHandler::UpdateFile ( bool doSafeUpdate )
+{
+ if ( ! this->needsUpdate ) return;
+ this->needsUpdate = false; // Make sure only called once.
+
+ LFA_FileRef oldFile = 0;
+ std::string filePath, tempPath;
+
+ // Update the internal legacy XML tree if we have one, and set the digest in the XMP.
+
+ bool updateLegacyXML = false;
+
+ if ( this->clipMetadata != 0 ) {
+ updateLegacyXML = XDCAM_Support::SetLegacyMetaData ( this->clipMetadata, &this->xmpObj, this->legacyNS.c_str());
+ }
+
+ std::string newDigest;
+ this->MakeLegacyDigest ( &newDigest );
+ this->xmpObj.SetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "XDCAMEX", newDigest.c_str(), kXMP_DeleteExisting );
+ this->xmpObj.SerializeToBuffer ( &this->xmpPacket, this->GetSerializeOptions() );
+
+ // Update the legacy XML file if necessary.
+
+ if ( updateLegacyXML ) {
+
+ std::string legacyXML;
+ this->expat->tree.Serialize ( &legacyXML );
+
+ this->MakeClipFilePath ( &filePath, "M01.XML" );
+ oldFile = LFA_Open ( filePath.c_str(), 'w' );
+
+ if ( oldFile == 0 ) {
+
+ // The XML does not exist yet.
+
+ this->MakeClipFilePath ( &filePath, "M01.XML" );
+ oldFile = LFA_Create ( filePath.c_str() );
+ if ( oldFile == 0 ) XMP_Throw ( "Failure creating XDCAMEX legacy XML file", kXMPErr_ExternalFailure );
+ LFA_Write ( oldFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() );
+ LFA_Close ( oldFile );
+
+ } else if ( ! doSafeUpdate ) {
+
+ // Over write the existing XML file.
+
+ LFA_Seek ( oldFile, 0, SEEK_SET );
+ LFA_Truncate ( oldFile, 0 );
+ LFA_Write ( oldFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() );
+ LFA_Close ( oldFile );
+
+ } else {
+
+ // Do a safe update.
+
+ // *** We really need an LFA_SwapFiles utility.
+
+ this->MakeClipFilePath ( &filePath, "M01.XML" );
+
+ CreateTempFile ( filePath, &tempPath );
+ LFA_FileRef tempFile = LFA_Open ( tempPath.c_str(), 'w' );
+ LFA_Write ( tempFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() );
+ LFA_Close ( tempFile );
+
+ LFA_Close ( oldFile );
+ LFA_Delete ( filePath.c_str() );
+ LFA_Rename ( tempPath.c_str(), filePath.c_str() );
+
+ }
+
+ }
+
+ oldFile = this->parent->fileRef;
+
+ if ( oldFile == 0 ) {
+
+ // The XMP does not exist yet.
+
+ std::string xmpPath;
+ this->MakeClipFilePath ( &xmpPath, "M01.XMP" );
+
+ LFA_FileRef xmpFile = LFA_Create ( xmpPath.c_str() );
+ if ( xmpFile == 0 ) XMP_Throw ( "Failure creating XDCAMEX XMP file", kXMPErr_ExternalFailure );
+ LFA_Write ( xmpFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() );
+ LFA_Close ( xmpFile );
+
+ } else if ( ! doSafeUpdate ) {
+
+ // Over write the existing XMP file.
+
+ LFA_Seek ( oldFile, 0, SEEK_SET );
+ LFA_Truncate ( oldFile, 0 );
+ LFA_Write ( oldFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() );
+ LFA_Close ( oldFile );
+
+ } else {
+
+ // Do a safe update.
+
+ // *** We really need an LFA_SwapFiles utility.
+
+ std::string xmpPath, tempPath;
+
+ this->MakeClipFilePath ( &xmpPath, "M01.XMP" );
+
+ CreateTempFile ( xmpPath, &tempPath );
+ LFA_FileRef tempFile = LFA_Open ( tempPath.c_str(), 'w' );
+ LFA_Write ( tempFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() );
+ LFA_Close ( tempFile );
+
+ LFA_Close ( oldFile );
+ LFA_Delete ( xmpPath.c_str() );
+ LFA_Rename ( tempPath.c_str(), xmpPath.c_str() );
+
+ }
+
+ this->parent->fileRef = 0;
+
+} // XDCAMEX_MetaHandler::UpdateFile
+
+// =================================================================================================
+// XDCAMEX_MetaHandler::WriteFile
+// ==============================
+
+void XDCAMEX_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath )
+{
+
+ // ! WriteFile is not supposed to be called for handlers that own the file.
+ XMP_Throw ( "XDCAMEX_MetaHandler::WriteFile should not be called", kXMPErr_InternalFailure );
+
+} // XDCAMEX_MetaHandler::WriteFile
+
+// =================================================================================================
diff --git a/source/XMPFiles/FileHandlers/XDCAMEX_Handler.hpp b/source/XMPFiles/FileHandlers/XDCAMEX_Handler.hpp
new file mode 100644
index 0000000..63852b5
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/XDCAMEX_Handler.hpp
@@ -0,0 +1,81 @@
+#ifndef __XDCAMEX_Handler_hpp__
+#define __XDCAMEX_Handler_hpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XMP_Environment.h" // ! This must be the first include.
+
+#include "XMPFiles_Impl.hpp"
+
+#include "ExpatAdapter.hpp"
+
+// =================================================================================================
+/// \file XDCAMEX_Handler.hpp
+/// \brief Folder format handler for XDCAMEX.
+// =================================================================================================
+
+extern XMPFileHandler * XDCAMEX_MetaHandlerCTor ( XMPFiles * parent );
+
+extern bool XDCAMEX_CheckFormat ( XMP_FileFormat format,
+ const std::string & rootPath,
+ const std::string & gpName,
+ const std::string & parentName,
+ const std::string & leafName,
+ XMPFiles * parent );
+
+static const XMP_OptionBits kXDCAMEX_HandlerFlags = (kXMPFiles_CanInjectXMP |
+ kXMPFiles_CanExpand |
+ kXMPFiles_CanRewrite |
+ kXMPFiles_PrefersInPlace |
+ kXMPFiles_CanReconcile |
+ kXMPFiles_AllowsOnlyXMP |
+ kXMPFiles_ReturnsRawPacket |
+ kXMPFiles_HandlerOwnsFile |
+ kXMPFiles_AllowsSafeUpdate |
+ kXMPFiles_FolderBasedFormat);
+
+class XDCAMEX_MetaHandler : public XMPFileHandler
+{
+public:
+
+ void CacheFileData();
+ void ProcessXMP();
+
+ XMP_OptionBits GetSerializeOptions() // *** These should be standard for standalone XMP files.
+ { return (kXMP_UseCompactFormat | kXMP_OmitPacketWrapper); };
+
+ void UpdateFile ( bool doSafeUpdate );
+ void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath );
+
+ XDCAMEX_MetaHandler ( XMPFiles * _parent );
+ virtual ~XDCAMEX_MetaHandler();
+
+private:
+
+ XDCAMEX_MetaHandler() : expat(0) {}; // Hidden on purpose.
+
+ void MakeClipFilePath ( std::string * path, XMP_StringPtr suffix );
+ void MakeLegacyDigest ( std::string * digestStr );
+
+ void GetTakeUMID( const std::string& clipUMID, std::string& takeUMID, std::string& takeXMLURI );
+ void GetTakeDuration( const std::string& takeUMID, std::string& duration );
+
+ void CleanupLegacyXML();
+
+ std::string rootPath, clipName, defaultNS, xdcNS, legacyNS, clipUMID;
+
+ ExpatAdapter * expat;
+ XML_Node * clipMetadata;
+
+}; // XDCAMEX_MetaHandler
+
+// =================================================================================================
+
+#endif /* __XDCAMEX_Handler_hpp__ */
diff --git a/source/XMPFiles/FileHandlers/XDCAM_Handler.cpp b/source/XMPFiles/FileHandlers/XDCAM_Handler.cpp
new file mode 100644
index 0000000..6ccfcab
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/XDCAM_Handler.cpp
@@ -0,0 +1,726 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XDCAM_Handler.hpp"
+#include "XDCAM_Support.hpp"
+#include "MD5.h"
+
+using namespace std;
+
+// =================================================================================================
+/// \file XDCAM_Handler.cpp
+/// \brief Folder format handler for XDCAM.
+///
+/// This handler is for the XDCAM video format. This is a pseudo-package, visible files but with a very
+/// well-defined layout and naming rules. There are 2 different layouts for XDCAM, called FAM and SAM.
+/// The FAM layout is used by "normal" XDCAM devices. The SAM layout is used by XDCAM-EX devices.
+///
+/// A typical FAM layout looks like:
+///
+/// .../MyMovie/
+/// INDEX.XML
+/// DISCMETA.XML
+/// MEDIAPRO.XML
+/// GENERAL/
+/// unknown files
+/// CLIP/
+/// C0001.MXF
+/// C0001M01.XML
+/// C0001M01.XMP
+/// C0002.MXF
+/// C0002M01.XML
+/// C0002M01.XMP
+/// SUB/
+/// C0001S01.MXF
+/// C0002S01.MXF
+/// EDIT/
+/// E0001E01.SMI
+/// E0001M01.XML
+/// E0002E01.SMI
+/// E0002M01.XML
+///
+/// A typical SAM layout looks like:
+///
+/// .../MyMovie/
+/// GENERAL/
+/// unknown files
+/// PROAV/
+/// INDEX.XML
+/// INDEX.BUP
+/// DISCMETA.XML
+/// DISCINFO.XML
+/// DISCINFO.BUP
+/// CLPR/
+/// C0001/
+/// C0001C01.SMI
+/// C0001V01.MXF
+/// C0001A01.MXF
+/// C0001A02.MXF
+/// C0001R01.BIM
+/// C0001I01.PPN
+/// C0001M01.XML
+/// C0001M01.XMP
+/// C0001S01.MXF
+/// C0002/
+/// ...
+/// EDTR/
+/// E0001/
+/// E0001E01.SMI
+/// E0001M01.XML
+/// E0002/
+/// ...
+///
+/// Note that the Sony documentation uses the folder names "General", "Clip", "Sub", and "Edit". We
+/// use all caps here. Common code has already shifted the names, we want to be case insensitive.
+///
+/// From the user's point of view, .../MyMovie contains XDCAM stuff, in this case 2 clips whose raw
+/// names are C0001 and C0002. There may be mapping information for nicer clip names to the raw
+/// names, but that can be ignored for now. Each clip is stored as a collection of files, each file
+/// holding some specific aspect of the clip's data.
+///
+/// The XDCAM handler operates on clips. The path from the client of XMPFiles can be either a logical
+/// clip path, like ".../MyMovie/C0001", or a full path to one of the files. In the latter case the
+/// handler must figure out the intended clip, it must not blindly use the named file.
+///
+/// Once the XDCAM structure and intended clip are identified, the handler only deals with the .XMP
+/// and .XML files in the CLIP or CLPR/<clip> folders. The .XMP file, if present, contains the XMP
+/// for the clip. The .XML file must be present to define the existance of the clip. It contains a
+/// variety of information about the clip, including some legacy metadata.
+///
+// =================================================================================================
+
+// =================================================================================================
+// XDCAM_CheckFormat
+// =================
+//
+// This version does fairly simple checks. The top level folder (.../MyMovie) must have exactly 1
+// child, a folder called CONTENTS. This must have a subfolder called CLIP. It may also have
+// subfolders called VIDEO, AUDIO, ICON, VOICE, and PROXY. Any mixture of these additional folders
+// is allowed, but no other children are allowed in CONTENTS. The CLIP folder must contain a .XML
+// file for the desired clip. The name checks are case insensitive.
+//
+// The state of the string parameters depends on the form of the path passed by the client. If the
+// client passed a logical clip path, like ".../MyMovie/C0001", the parameters are:
+// rootPath - ".../MyMovie"
+// gpName - empty
+// parentName - empty
+// leafName - "C0001"
+//
+// If the client passed a FAM file path, like ".../MyMovie/EDIT/E0001E01.SMI", they are:
+// rootPath - "..."
+// gpName - "MyMovie"
+// parentName - "EDIT"
+// leafName - "E0001E01"
+//
+// If the client passed a SAM file path, like ".../MyMovie/PROAV/CLPR/C0001/C0001A02.MXF", they are:
+// rootPath - ".../MyMovie/PROAV"
+// gpName - "CLPR"
+// parentName - "C0001"
+// leafName - "C0001A02"
+//
+// For both FAM and SAM the leading character of the leafName for an existing file might be coerced
+// to 'C' to form the logical clip name. And suffix such as "M01" must be removed for FAM. We don't
+// need to worry about that for SAM, that uses the <clip> folder name.
+
+// ! The FAM format supports general clip file names through an ALIAS.XML mapping file. The simple
+// ! existence check has an edge case bug, left to be fixed later. If the ALIAS.XML file exists, but
+// ! some of the clips still have "raw" names, and we're passed an existing file path in the EDIT
+// ! folder, we will fail to do the leading 'E' to 'C' coercion. We might also erroneously remove a
+// ! suffix from a mapped essence file with a name like ClipX01.MXF.
+
+// ! The common code has shifted the gpName, parentName, and leafName strings to upper case. It has
+// ! also made sure that for a logical clip path the rootPath is an existing folder, and that the
+// ! file exists for a full file path.
+
+bool XDCAM_CheckFormat ( XMP_FileFormat format,
+ const std::string & _rootPath,
+ const std::string & _gpName,
+ const std::string & parentName,
+ const std::string & leafName,
+ XMPFiles * parent )
+{
+ std::string rootPath = _rootPath; // ! Need tweaking in the existing file cases (FAM and SAM).
+ std::string gpName = _gpName;
+
+ bool isFAM = false;
+
+ std::string tempPath, childName;
+ XMP_FolderInfo folderInfo;
+
+ std::string clipName = leafName;
+
+ // Do some basic checks on the root path and component names. Decide if this is FAM or SAM.
+
+ if ( gpName.empty() != parentName.empty() ) return false; // Must be both empty or both non-empty.
+
+ if ( gpName.empty() ) {
+
+ // This is the logical clip path case. Just look for PROAV to see if this is FAM or SAM.
+ if ( GetChildMode ( rootPath, "PROAV" ) != kFMode_IsFolder ) isFAM = true;
+
+ } else {
+
+ // This is the existing file case. See if this is FAM or SAM, tweak the clip name as needed.
+
+ if ( (parentName == "CLIP") || (parentName == "EDIT") || (parentName == "SUB") ) {
+ isFAM = true;
+ } else if ( (gpName != "CLPR") && (gpName != "EDTR") ) {
+ return false;
+ }
+
+ if ( isFAM ) {
+
+ // Put the proper root path together. Clean up the clip name if needed.
+
+ if ( ! rootPath.empty() ) rootPath += kDirChar;
+ rootPath += gpName;
+ gpName.erase();
+
+ if ( GetChildMode ( rootPath, "ALIAS.XML" ) != kFMode_IsFile ) {
+ clipName[0] = 'C'; // ! See notes above about pending bug.
+ }
+
+ if ( clipName.size() > 3 ) {
+ size_t clipMid = clipName.size() - 3;
+ char c1 = clipName[clipMid];
+ char c2 = clipName[clipMid+1];
+ char c3 = clipName[clipMid+2];
+ if ( ('A' <= c1) && (c1 <= 'Z') &&
+ ('0' <= c2) && (c2 <= '9') && ('0' <= c3) && (c3 <= '9') ) {
+ clipName.erase ( clipMid );
+ }
+ }
+
+ } else {
+
+ // Fix the clip name. Check for and strip the "PROAV" suffix on the root path.
+
+ clipName = parentName; // ! We have a folder with the (almost) exact clip name.
+ clipName[0] = 'C';
+
+ std::string proav;
+ SplitLeafName ( &rootPath, &proav );
+ MakeUpperCase ( &proav );
+ if ( (rootPath.empty()) || (proav != "PROAV") ) return false;
+
+ }
+
+ }
+
+ // Make sure the general XDCAM package structure is legit. Set tempPath as a bogus path of the
+ // form <root>/<FAM-or-SAM>/<clip>, e.g. ".../MyMovie/FAM/C0001". This is passed the handler via
+ // the handlerTemp hackery.
+
+ if ( isFAM ) {
+
+ if ( (format != kXMP_XDCAM_FAMFile) && (format != kXMP_UnknownFile) ) return false;
+
+ tempPath = rootPath;
+
+ if ( GetChildMode ( tempPath, "INDEX.XML" ) != kFMode_IsFile ) return false;
+ if ( GetChildMode ( tempPath, "DISCMETA.XML" ) != kFMode_IsFile ) return false;
+ if ( GetChildMode ( tempPath, "MEDIAPRO.XML" ) != kFMode_IsFile ) return false;
+
+ tempPath += kDirChar;
+ tempPath += "CLIP";
+ tempPath += kDirChar;
+ tempPath += clipName;
+ tempPath += "M01.XML";
+ if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFile ) return false;
+
+ tempPath = rootPath;
+ tempPath += kDirChar;
+ tempPath += "FAM";
+ tempPath += kDirChar;
+ tempPath += clipName;
+
+ } else {
+
+ if ( (format != kXMP_XDCAM_SAMFile) && (format != kXMP_UnknownFile) ) return false;
+
+ // We already know about the PROAV folder, just check below it.
+
+ tempPath = rootPath;
+ tempPath += kDirChar;
+ tempPath += "PROAV";
+
+ if ( GetChildMode ( tempPath, "INDEX.XML" ) != kFMode_IsFile ) return false;
+ if ( GetChildMode ( tempPath, "DISCMETA.XML" ) != kFMode_IsFile ) return false;
+ if ( GetChildMode ( tempPath, "DISCINFO.XML" ) != kFMode_IsFile ) return false;
+ if ( GetChildMode ( tempPath, "CLPR" ) != kFMode_IsFolder ) return false;
+
+ tempPath += kDirChar;
+ tempPath += "CLPR";
+ tempPath += kDirChar;
+ tempPath += clipName;
+ if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFolder ) return false;
+
+ tempPath += kDirChar;
+ tempPath += clipName;
+ tempPath += "M01.XML";
+ if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFile ) return false;
+
+ tempPath = rootPath;
+ tempPath += kDirChar;
+ tempPath += "SAM";
+ tempPath += kDirChar;
+ tempPath += clipName;
+
+ }
+
+ // Save the pseudo-path for the handler object. A bit of a hack, but the only way to get info
+ // from here to there.
+
+ size_t pathLen = tempPath.size() + 1; // Include a terminating nul.
+ parent->handlerTemp = malloc ( pathLen );
+ if ( parent->handlerTemp == 0 ) XMP_Throw ( "No memory for XDCAM clip info", kXMPErr_NoMemory );
+ memcpy ( parent->handlerTemp, tempPath.c_str(), pathLen ); // AUDIT: Safe, allocated above.
+
+ return true;
+
+} // XDCAM_CheckFormat
+
+// =================================================================================================
+// XDCAM_MetaHandlerCTor
+// =====================
+
+XMPFileHandler * XDCAM_MetaHandlerCTor ( XMPFiles * parent )
+{
+ return new XDCAM_MetaHandler ( parent );
+
+} // XDCAM_MetaHandlerCTor
+
+// =================================================================================================
+// XDCAM_MetaHandler::XDCAM_MetaHandler
+// ====================================
+
+XDCAM_MetaHandler::XDCAM_MetaHandler ( XMPFiles * _parent ) : isFAM(false), expat(0)
+{
+
+ this->parent = _parent; // Inherited, can't set in the prefix.
+ this->handlerFlags = kXDCAM_HandlerFlags;
+ this->stdCharForm = kXMP_Char8Bit;
+
+ // Extract the root path, clip name, and FAM/SAM flag from handlerTemp.
+
+ XMP_Assert ( this->parent->handlerTemp != 0 );
+
+ this->rootPath.assign ( (char*) this->parent->handlerTemp );
+ free ( this->parent->handlerTemp );
+ this->parent->handlerTemp = 0;
+
+ SplitLeafName ( &this->rootPath, &this->clipName );
+
+ std::string temp;
+ SplitLeafName ( &this->rootPath, &temp );
+ XMP_Assert ( (temp == "FAM") || (temp == "SAM") );
+ if ( temp == "FAM" ) this->isFAM = true;
+ XMP_Assert ( this->isFAM ? (this->parent->format == kXMP_XDCAM_FAMFile) : (this->parent->format == kXMP_XDCAM_SAMFile) );
+
+} // XDCAM_MetaHandler::XDCAM_MetaHandler
+
+// =================================================================================================
+// XDCAM_MetaHandler::~XDCAM_MetaHandler
+// =====================================
+
+XDCAM_MetaHandler::~XDCAM_MetaHandler()
+{
+
+ this->CleanupLegacyXML();
+ if ( this->parent->handlerTemp != 0 ) {
+ free ( this->parent->handlerTemp );
+ this->parent->handlerTemp = 0;
+ }
+
+} // XDCAM_MetaHandler::~XDCAM_MetaHandler
+
+// =================================================================================================
+// XDCAM_MetaHandler::MakeClipFilePath
+// ===================================
+
+void XDCAM_MetaHandler::MakeClipFilePath ( std::string * path, XMP_StringPtr suffix )
+{
+
+ *path = this->rootPath;
+ *path += kDirChar;
+
+ if ( this->isFAM ) {
+ *path += "CLIP";
+ } else {
+ *path += "PROAV";
+ *path += kDirChar;
+ *path += "CLPR";
+ *path += kDirChar;
+ *path += this->clipName;
+ }
+
+ *path += kDirChar;
+ *path += this->clipName;
+ *path += suffix;
+
+} // XDCAM_MetaHandler::MakeClipFilePath
+
+// =================================================================================================
+// XDCAM_MetaHandler::MakeLegacyDigest
+// ===================================
+
+// *** Early hack version.
+
+#define kHexDigits "0123456789ABCDEF"
+
+void XDCAM_MetaHandler::MakeLegacyDigest ( std::string * digestStr )
+{
+ digestStr->erase();
+ if ( this->clipMetadata == 0 ) return; // Bail if we don't have any legacy XML.
+ XMP_Assert ( this->expat != 0 );
+
+ XMP_StringPtr xdcNS = this->xdcNS.c_str();
+ XML_NodePtr legacyContext, legacyProp;
+
+ legacyContext = this->clipMetadata->GetNamedElement ( xdcNS, "Access" );
+ if ( legacyContext == 0 ) return;
+
+ MD5_CTX context;
+ unsigned char digestBin [16];
+ MD5Init ( &context );
+
+ legacyProp = legacyContext->GetNamedElement ( xdcNS, "Creator" );
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() && (! legacyProp->content.empty()) ) {
+ const XML_Node * xmlValue = legacyProp->content[0];
+ MD5Update ( &context, (XMP_Uns8*)xmlValue->value.c_str(), (unsigned int)xmlValue->value.size() );
+ }
+
+ legacyProp = legacyContext->GetNamedElement ( xdcNS, "CreationDate" );
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() && (! legacyProp->content.empty()) ) {
+ const XML_Node * xmlValue = legacyProp->content[0];
+ MD5Update ( &context, (XMP_Uns8*)xmlValue->value.c_str(), (unsigned int)xmlValue->value.size() );
+ }
+
+ legacyProp = legacyContext->GetNamedElement ( xdcNS, "LastUpdateDate" );
+ if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() && (! legacyProp->content.empty()) ) {
+ const XML_Node * xmlValue = legacyProp->content[0];
+ MD5Update ( &context, (XMP_Uns8*)xmlValue->value.c_str(), (unsigned int)xmlValue->value.size() );
+ }
+
+ MD5Final ( digestBin, &context );
+
+ char buffer [40];
+ for ( int in = 0, out = 0; in < 16; in += 1, out += 2 ) {
+ XMP_Uns8 byte = digestBin[in];
+ buffer[out] = kHexDigits [ byte >> 4 ];
+ buffer[out+1] = kHexDigits [ byte & 0xF ];
+ }
+ buffer[32] = 0;
+ digestStr->append ( buffer );
+
+} // XDCAM_MetaHandler::MakeLegacyDigest
+
+// =================================================================================================
+// P2_MetaHandler::CleanupLegacyXML
+// ================================
+
+void XDCAM_MetaHandler::CleanupLegacyXML()
+{
+
+ if ( ! this->defaultNS.empty() ) {
+ SXMPMeta::DeleteNamespace ( this->defaultNS.c_str() );
+ this->defaultNS.erase();
+ }
+
+ if ( this->expat != 0 ) { delete ( this->expat ); this->expat = 0; }
+
+ clipMetadata = 0; // ! Was a pointer into the expat tree.
+
+} // XDCAM_MetaHandler::CleanupLegacyXML
+
+// =================================================================================================
+// XDCAM_MetaHandler::CacheFileData
+// ================================
+
+void XDCAM_MetaHandler::CacheFileData()
+{
+ XMP_Assert ( (! this->containsXMP) && (! this->containsTNail) );
+
+ // See if the clip's .XMP file exists.
+
+ std::string xmpPath;
+ this->MakeClipFilePath ( &xmpPath, "M01.XMP" );
+ if ( GetFileMode ( xmpPath.c_str() ) != kFMode_IsFile ) return; // No XMP.
+
+ // Read the entire .XMP file.
+
+ char openMode = 'r';
+ if ( this->parent->openFlags & kXMPFiles_OpenForUpdate ) openMode = 'w';
+
+ LFA_FileRef xmpFile = LFA_Open ( xmpPath.c_str(), openMode );
+ if ( xmpFile == 0 ) return; // The open failed.
+
+ XMP_Int64 xmpLen = LFA_Measure ( xmpFile );
+ if ( xmpLen > 100*1024*1024 ) {
+ XMP_Throw ( "XDCAM XMP is outrageously large", kXMPErr_InternalFailure ); // Sanity check.
+ }
+
+ this->xmpPacket.erase();
+ this->xmpPacket.reserve ( (size_t)xmpLen );
+ this->xmpPacket.append ( (size_t)xmpLen, ' ' );
+
+ XMP_Int32 ioCount = LFA_Read ( xmpFile, (void*)this->xmpPacket.data(), (XMP_Int32)xmpLen, kLFA_RequireAll );
+ XMP_Assert ( ioCount == xmpLen );
+
+ this->packetInfo.offset = 0;
+ this->packetInfo.length = (XMP_Int32)xmpLen;
+ FillPacketInfo ( this->xmpPacket, &this->packetInfo );
+
+ XMP_Assert ( this->parent->fileRef == 0 );
+ if ( openMode == 'r' ) {
+ LFA_Close ( xmpFile );
+ } else {
+ this->parent->fileRef = xmpFile;
+ }
+
+ this->containsXMP = true;
+
+} // XDCAM_MetaHandler::CacheFileData
+
+// =================================================================================================
+// XDCAM_MetaHandler::ProcessXMP
+// =============================
+
+void XDCAM_MetaHandler::ProcessXMP()
+{
+
+ // Some versions of gcc can't tolerate goto's across declarations.
+ // *** Better yet, avoid this cruft with self-cleaning objects.
+ #define CleanupAndExit \
+ { \
+ bool openForUpdate = XMP_OptionIsSet ( this->parent->openFlags, kXMPFiles_OpenForUpdate ); \
+ if ( ! openForUpdate ) this->CleanupLegacyXML(); \
+ return; \
+ }
+
+ if ( this->processedXMP ) return;
+ this->processedXMP = true; // Make sure only called once.
+
+ if ( this->containsXMP ) {
+ this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() );
+ }
+
+ // NonRealTimeMeta -> XMP by schema
+ std::string xmlPath, umid;
+ this->MakeClipFilePath ( &xmlPath, "M01.XML" );
+
+ // --------------------------------------------------------------
+ // *** This is a minimal Q&D example of legacy metadata handling.
+ // *** Hack: Special case trickery to detect and clean up default XML namespace usage.
+
+ bool haveDefaultNS = SXMPMeta::GetNamespaceURI ( "_dflt_", 0 ); // Is there already a default namespace?
+
+ AutoFile xmlFile;
+ xmlFile.fileRef = LFA_Open ( xmlPath.c_str(), 'r' );
+ if ( xmlFile.fileRef == 0 ) return; // The open failed.
+
+ this->expat = XMP_NewExpatAdapter();
+ if ( this->expat == 0 ) XMP_Throw ( "XDCAM_MetaHandler: Can't create Expat adapter", kXMPErr_NoMemory );
+
+ XMP_Uns8 buffer [64*1024];
+ while ( true ) {
+ XMP_Int32 ioCount = LFA_Read ( xmlFile.fileRef, buffer, sizeof(buffer) );
+ if ( ioCount == 0 ) break;
+ this->expat->ParseBuffer ( buffer, ioCount, false /* not the end */ );
+ }
+ this->expat->ParseBuffer ( 0, 0, true ); // End the parse.
+
+ LFA_Close ( xmlFile.fileRef );
+ xmlFile.fileRef = 0;
+
+ if ( ! haveDefaultNS ) {
+ // No prior default XML namespace. If there is one now, remember it and delete it when done.
+ haveDefaultNS = SXMPMeta::GetNamespaceURI ( "_dflt_", &this->defaultNS );
+ XMP_Assert ( haveDefaultNS == (! this->defaultNS.empty()) );
+ }
+
+ // The root element should be NonRealTimeMeta in some namespace. Take whatever this file uses.
+
+ XML_Node & xmlTree = this->expat->tree;
+ XML_NodePtr rootElem = 0;
+
+ for ( size_t i = 0, limit = xmlTree.content.size(); i < limit; ++i ) {
+ if ( xmlTree.content[i]->kind == kElemNode ) {
+ rootElem = xmlTree.content[i];
+ }
+ }
+
+ if ( rootElem == 0 ) CleanupAndExit
+ XMP_StringPtr rootLocalName = rootElem->name.c_str() + rootElem->nsPrefixLen;
+ if ( ! XMP_LitMatch ( rootLocalName, "NonRealTimeMeta" ) ) CleanupAndExit
+
+ this->legacyNS = rootElem->ns;
+
+ // Check the legacy digest.
+
+ XMP_StringPtr legacyNS = this->legacyNS.c_str();
+
+ this->clipMetadata = rootElem; // ! Save the NonRealTimeMeta pointer for other use.
+
+ std::string oldDigest, newDigest;
+ bool digestFound = this->xmpObj.GetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "XDCAM", &oldDigest, 0 );
+ if ( digestFound ) {
+ this->MakeLegacyDigest ( &newDigest );
+ if ( oldDigest == newDigest ) CleanupAndExit
+ }
+
+ // If we get here we need find and import the actual legacy elements using the current namespace.
+ // Either there is no old digest in the XMP, or the digests differ. In the former case keep any
+ // existing XMP, in the latter case take new legacy values.
+
+ this->containsXMP = XDCAM_Support::GetLegacyMetaData ( &this->xmpObj, rootElem, legacyNS, digestFound, umid );
+
+ CleanupAndExit
+ #undef CleanupAndExit
+
+} // XDCAM_MetaHandler::ProcessXMP
+
+// =================================================================================================
+// XDCAM_MetaHandler::UpdateFile
+// =============================
+//
+// Note that UpdateFile is only called from XMPFiles::CloseFile, so it is OK to close the file here.
+
+void XDCAM_MetaHandler::UpdateFile ( bool doSafeUpdate )
+{
+ if ( ! this->needsUpdate ) return;
+ this->needsUpdate = false; // Make sure only called once.
+
+ LFA_FileRef oldFile = 0;
+ std::string filePath, tempPath;
+
+ // Update the internal legacy XML tree if we have one, and set the digest in the XMP.
+
+ bool updateLegacyXML = false;
+
+ if ( this->clipMetadata != 0 ) {
+ updateLegacyXML = XDCAM_Support::SetLegacyMetaData ( this->clipMetadata, &this->xmpObj, this->legacyNS.c_str());
+ }
+
+ std::string newDigest;
+ this->MakeLegacyDigest ( &newDigest );
+ this->xmpObj.SetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "XDCAM", newDigest.c_str(), kXMP_DeleteExisting );
+ this->xmpObj.SerializeToBuffer ( &this->xmpPacket, this->GetSerializeOptions() );
+
+ // Update the legacy XML file if necessary.
+
+ if ( updateLegacyXML ) {
+
+ std::string legacyXML;
+ this->expat->tree.Serialize ( &legacyXML );
+
+ this->MakeClipFilePath ( &filePath, "M01.XML" );
+ oldFile = LFA_Open ( filePath.c_str(), 'w' );
+
+ if ( oldFile == 0 ) {
+
+ // The XML does not exist yet.
+
+ this->MakeClipFilePath ( &filePath, "M01.XML" );
+ oldFile = LFA_Create ( filePath.c_str() );
+ if ( oldFile == 0 ) XMP_Throw ( "Failure creating XDCAMEX legacy XML file", kXMPErr_ExternalFailure );
+ LFA_Write ( oldFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() );
+ LFA_Close ( oldFile );
+
+ } else if ( ! doSafeUpdate ) {
+
+ // Over write the existing XML file.
+
+ LFA_Seek ( oldFile, 0, SEEK_SET );
+ LFA_Truncate ( oldFile, 0 );
+ LFA_Write ( oldFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() );
+ LFA_Close ( oldFile );
+
+ } else {
+
+ // Do a safe update.
+
+ // *** We really need an LFA_SwapFiles utility.
+
+ this->MakeClipFilePath ( &filePath, "M01.XML" );
+
+ CreateTempFile ( filePath, &tempPath );
+ LFA_FileRef tempFile = LFA_Open ( tempPath.c_str(), 'w' );
+ LFA_Write ( tempFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() );
+ LFA_Close ( tempFile );
+
+ LFA_Close ( oldFile );
+ LFA_Delete ( filePath.c_str() );
+ LFA_Rename ( tempPath.c_str(), filePath.c_str() );
+
+ }
+
+ }
+
+ oldFile = this->parent->fileRef;
+
+ if ( oldFile == 0 ) {
+
+ // The XMP does not exist yet.
+
+ std::string xmpPath;
+ this->MakeClipFilePath ( &xmpPath, "M01.XMP" );
+
+ LFA_FileRef xmpFile = LFA_Create ( xmpPath.c_str() );
+ if ( xmpFile == 0 ) XMP_Throw ( "Failure creating XDCAM XMP file", kXMPErr_ExternalFailure );
+ LFA_Write ( xmpFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() );
+ LFA_Close ( xmpFile );
+
+ } else if ( ! doSafeUpdate ) {
+
+ // Over write the existing XMP file.
+
+ LFA_Seek ( oldFile, 0, SEEK_SET );
+ LFA_Truncate ( oldFile, 0 );
+ LFA_Write ( oldFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() );
+ LFA_Close ( oldFile );
+
+ } else {
+
+ // Do a safe update.
+
+ // *** We really need an LFA_SwapFiles utility.
+
+ std::string xmpPath, tempPath;
+
+ this->MakeClipFilePath ( &xmpPath, "M01.XMP" );
+
+ CreateTempFile ( xmpPath, &tempPath );
+ LFA_FileRef tempFile = LFA_Open ( tempPath.c_str(), 'w' );
+ LFA_Write ( tempFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() );
+ LFA_Close ( tempFile );
+
+ LFA_Close ( oldFile );
+ LFA_Delete ( xmpPath.c_str() );
+ LFA_Rename ( tempPath.c_str(), xmpPath.c_str() );
+
+ }
+
+ this->parent->fileRef = 0;
+
+} // XDCAM_MetaHandler::UpdateFile
+
+// =================================================================================================
+// XDCAM_MetaHandler::WriteFile
+// ============================
+
+void XDCAM_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath )
+{
+
+ // ! WriteFile is not supposed to be called for handlers that own the file.
+ XMP_Throw ( "XDCAM_MetaHandler::WriteFile should not be called", kXMPErr_InternalFailure );
+
+} // XDCAM_MetaHandler::WriteFile
+
+// =================================================================================================
diff --git a/source/XMPFiles/FileHandlers/XDCAM_Handler.hpp b/source/XMPFiles/FileHandlers/XDCAM_Handler.hpp
new file mode 100644
index 0000000..abd861b
--- /dev/null
+++ b/source/XMPFiles/FileHandlers/XDCAM_Handler.hpp
@@ -0,0 +1,82 @@
+#ifndef __XDCAM_Handler_hpp__
+#define __XDCAM_Handler_hpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XMP_Environment.h" // ! This must be the first include.
+
+#include "XMPFiles_Impl.hpp"
+
+#include "ExpatAdapter.hpp"
+
+// =================================================================================================
+/// \file XDCAM_Handler.hpp
+/// \brief Folder format handler for XDCAM.
+///
+/// This header ...
+///
+// =================================================================================================
+
+extern XMPFileHandler * XDCAM_MetaHandlerCTor ( XMPFiles * parent );
+
+extern bool XDCAM_CheckFormat ( XMP_FileFormat format,
+ const std::string & rootPath,
+ const std::string & gpName,
+ const std::string & parentName,
+ const std::string & leafName,
+ XMPFiles * parent );
+
+static const XMP_OptionBits kXDCAM_HandlerFlags = (kXMPFiles_CanInjectXMP |
+ kXMPFiles_CanExpand |
+ kXMPFiles_CanRewrite |
+ kXMPFiles_PrefersInPlace |
+ kXMPFiles_CanReconcile |
+ kXMPFiles_AllowsOnlyXMP |
+ kXMPFiles_ReturnsRawPacket |
+ kXMPFiles_HandlerOwnsFile |
+ kXMPFiles_AllowsSafeUpdate |
+ kXMPFiles_FolderBasedFormat);
+
+class XDCAM_MetaHandler : public XMPFileHandler
+{
+public:
+
+ void CacheFileData();
+ void ProcessXMP();
+
+ XMP_OptionBits GetSerializeOptions() // *** These should be standard for standalone XMP files.
+ { return (kXMP_UseCompactFormat | kXMP_OmitPacketWrapper); };
+
+ void UpdateFile ( bool doSafeUpdate );
+ void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath );
+
+ XDCAM_MetaHandler ( XMPFiles * _parent );
+ virtual ~XDCAM_MetaHandler();
+
+private:
+
+ XDCAM_MetaHandler() : isFAM(false), expat(0), clipMetadata(0) {}; // Hidden on purpose.
+
+ void MakeClipFilePath ( std::string * path, XMP_StringPtr suffix );
+ void MakeLegacyDigest ( std::string * digestStr );
+ void CleanupLegacyXML();
+
+ std::string rootPath, clipName, defaultNS, xdcNS, legacyNS;
+
+ bool isFAM;
+
+ ExpatAdapter * expat;
+ XML_Node * clipMetadata; // ! Don't delete, points into the Expat tree.
+
+}; // XDCAM_MetaHandler
+
+// =================================================================================================
+
+#endif /* __XDCAM_Handler_hpp__ */
diff --git a/source/XMPFiles/FormatSupport/ASF_Support.cpp b/source/XMPFiles/FormatSupport/ASF_Support.cpp
new file mode 100644
index 0000000..3baa7d0
--- /dev/null
+++ b/source/XMPFiles/FormatSupport/ASF_Support.cpp
@@ -0,0 +1,1434 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "ASF_Support.hpp"
+#include "UnicodeConversions.hpp"
+
+#if XMP_WinBuild
+ #define snprintf _snprintf
+ #pragma warning ( disable : 4996 ) // '...' was declared deprecated
+ #pragma warning ( disable : 4267 ) // *** conversion (from size_t), possible loss of date (many 64 bit related)
+#endif
+
+// =============================================================================================
+
+// Platforms other than Win
+#if ! XMP_WinBuild
+int IsEqualGUID ( const GUID& guid1, const GUID& guid2 )
+{
+ return (memcmp ( &guid1, &guid2, sizeof(GUID) ) == 0);
+}
+#endif
+
+ASF_Support::ASF_Support() : legacyManager(0), posFileSizeInfo(0) {}
+
+ASF_Support::ASF_Support ( ASF_LegacyManager* _legacyManager ) : posFileSizeInfo(0)
+{
+ legacyManager = _legacyManager;
+}
+
+ASF_Support::~ASF_Support()
+{
+ legacyManager = 0;
+}
+
+// =============================================================================================
+
+long ASF_Support::OpenASF ( LFA_FileRef fileRef, ObjectState & inOutObjectState )
+{
+ XMP_Uns64 pos = 0;
+ XMP_Uns64 len;
+
+ try {
+ pos = LFA_Seek ( fileRef, 0, SEEK_SET );
+ } catch ( ... ) {}
+
+ if ( pos != 0 ) return 0;
+
+ // read first and following chunks
+ while ( ReadObject ( fileRef, inOutObjectState, &len, pos) ) {}
+
+ return inOutObjectState.objects.size();
+
+}
+
+// =============================================================================================
+
+bool ASF_Support::ReadObject ( LFA_FileRef fileRef, ObjectState & inOutObjectState, XMP_Uns64 * objectLength, XMP_Uns64 & inOutPosition )
+{
+
+ try {
+
+ XMP_Uns64 startPosition = inOutPosition;
+ long bytesRead;
+ ASF_ObjectBase objectBase;
+
+ bytesRead = LFA_Read ( fileRef, &objectBase, kASF_ObjectBaseLen, true );
+ if ( bytesRead != kASF_ObjectBaseLen ) return false;
+
+ *objectLength = GetUns64LE ( &objectBase.size );
+ inOutPosition += *objectLength;
+
+ ObjectData newObject;
+
+ newObject.pos = startPosition;
+ newObject.len = *objectLength;
+ newObject.guid = objectBase.guid;
+
+ // xmpIsLastObject indicates, that the XMP-object is the last top-level object
+ // reset here, if any another object is read
+ inOutObjectState.xmpIsLastObject = false;
+
+ if ( IsEqualGUID ( ASF_Header_Object, newObject.guid ) ) {
+
+ // header object ?
+ this->ReadHeaderObject ( fileRef, inOutObjectState, newObject );
+
+ } else if ( IsEqualGUID ( ASF_XMP_Metadata, newObject.guid ) ) {
+
+ // check object for XMP GUID
+ inOutObjectState.xmpPos = newObject.pos + kASF_ObjectBaseLen;
+ inOutObjectState.xmpLen = newObject.len - kASF_ObjectBaseLen;
+ inOutObjectState.xmpIsLastObject = true;
+ inOutObjectState.xmpObject = newObject;
+ newObject.xmp = true;
+
+ }
+
+ inOutObjectState.objects.push_back ( newObject );
+
+ LFA_Seek ( fileRef, inOutPosition, SEEK_SET );
+
+ } catch ( ... ) {
+
+ return false;
+
+ }
+
+ return true;
+
+}
+
+// =============================================================================================
+
+bool ASF_Support::ReadHeaderObject ( LFA_FileRef fileRef, ObjectState& inOutObjectState, const ObjectData& newObject )
+{
+ if ( ! IsEqualGUID ( ASF_Header_Object, newObject.guid) || (! legacyManager ) ) return false;
+
+ std::string buffer;
+
+ legacyManager->SetPadding(0);
+
+ try {
+
+ // read header-object structure
+ XMP_Uns64 pos = newObject.pos;
+ XMP_Uns32 bufferSize = kASF_ObjectBaseLen + 6;
+
+ buffer.clear();
+ buffer.reserve ( bufferSize );
+ buffer.assign ( bufferSize, ' ' );
+ LFA_Seek ( fileRef, pos, SEEK_SET );
+ LFA_Read ( fileRef, const_cast<char*>(buffer.data()), bufferSize, true );
+
+ XMP_Uns64 read = bufferSize;
+ pos += bufferSize;
+
+ // read contained header objects
+ XMP_Uns32 numberOfHeaders = GetUns32LE ( &buffer[24] );
+ ASF_ObjectBase objectBase;
+
+ while ( read < newObject.len ) {
+
+ LFA_Seek ( fileRef, pos, SEEK_SET );
+ if ( kASF_ObjectBaseLen != LFA_Read ( fileRef, &objectBase, kASF_ObjectBaseLen, true ) ) break;
+
+ LFA_Seek ( fileRef, pos, SEEK_SET );
+ objectBase.size = GetUns64LE ( &objectBase.size );
+
+ if ( IsEqualGUID ( ASF_File_Properties_Object, objectBase.guid) && (objectBase.size >= 104 ) ) {
+
+ buffer.clear();
+ buffer.reserve ( XMP_Uns32( objectBase.size ) );
+ buffer.assign ( XMP_Uns32( objectBase.size ), ' ' );
+ LFA_Read ( fileRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true );
+
+ // save position of filesize-information
+ posFileSizeInfo = (pos + 40);
+
+ // creation date
+ std::string sub ( buffer.substr ( 48, 8 ) );
+ legacyManager->SetField ( ASF_LegacyManager::fieldCreationDate, sub );
+
+ // broadcast flag set ?
+ XMP_Uns32 flags = GetUns32LE ( &buffer[88] );
+ inOutObjectState.broadcast = (flags & 1);
+ legacyManager->SetBroadcast ( inOutObjectState.broadcast );
+
+ legacyManager->SetObjectExists ( ASF_LegacyManager::objectFileProperties );
+
+ } else if ( IsEqualGUID ( ASF_Content_Description_Object, objectBase.guid) && (objectBase.size >= 34 ) ) {
+
+ buffer.clear();
+ buffer.reserve ( XMP_Uns32( objectBase.size ) );
+ buffer.assign ( XMP_Uns32( objectBase.size ), ' ' );
+ LFA_Read ( fileRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true );
+
+ XMP_Uns16 titleLen = GetUns16LE ( &buffer[24] );
+ XMP_Uns16 authorLen = GetUns16LE ( &buffer[26] );
+ XMP_Uns16 copyrightLen = GetUns16LE ( &buffer[28] );
+ XMP_Uns16 descriptionLen = GetUns16LE ( &buffer[30] );
+ XMP_Uns16 ratingLen = GetUns16LE ( &buffer[32] );
+
+ XMP_Uns16 fieldPos = 34;
+
+ std::string titleStr = buffer.substr ( fieldPos, titleLen );
+ fieldPos += titleLen;
+ legacyManager->SetField ( ASF_LegacyManager::fieldTitle, titleStr );
+
+ std::string authorStr = buffer.substr ( fieldPos, authorLen );
+ fieldPos += authorLen;
+ legacyManager->SetField ( ASF_LegacyManager::fieldAuthor, authorStr );
+
+ std::string copyrightStr = buffer.substr ( fieldPos, copyrightLen );
+ fieldPos += copyrightLen;
+ legacyManager->SetField ( ASF_LegacyManager::fieldCopyright, copyrightStr );
+
+ std::string descriptionStr = buffer.substr ( fieldPos, descriptionLen );
+ fieldPos += descriptionLen;
+ legacyManager->SetField ( ASF_LegacyManager::fieldDescription, descriptionStr );
+
+ /* rating is currently not part of reconciliation
+ std::string ratingStr = buffer.substr ( fieldPos, ratingLen );
+ fieldPos += ratingLen;
+ legacyData.append ( titleStr );
+ */
+
+ legacyManager->SetObjectExists ( ASF_LegacyManager::objectContentDescription );
+
+ } else if ( IsEqualGUID ( ASF_Content_Branding_Object, objectBase.guid ) ) {
+
+ buffer.clear();
+ buffer.reserve ( XMP_Uns32( objectBase.size ) );
+ buffer.assign ( XMP_Uns32( objectBase.size ), ' ' );
+ LFA_Read ( fileRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true );
+
+ XMP_Uns32 fieldPos = 28;
+
+ // copyright URL is 3. element with variable size
+ for ( int i = 1; i <= 3 ; ++i ) {
+ XMP_Uns32 len = GetUns32LE ( &buffer[fieldPos] );
+ if ( i == 3 ) {
+ std::string copyrightURLStr = buffer.substr ( fieldPos + 4, len );
+ legacyManager->SetField ( ASF_LegacyManager::fieldCopyrightURL, copyrightURLStr );
+ }
+ fieldPos += (len + 4);
+ }
+
+ legacyManager->SetObjectExists ( ASF_LegacyManager::objectContentBranding );
+
+#if ! Exclude_LicenseURL_Recon
+
+ } else if ( IsEqualGUID ( ASF_Content_Encryption_Object, objectBase.guid ) ) {
+
+ buffer.clear();
+ buffer.reserve ( XMP_Uns32( objectBase.size ) );
+ buffer.assign ( XMP_Uns32( objectBase.size ), ' ' );
+ LFA_Read ( fileRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true );
+
+ XMP_Uns32 fieldPos = 24;
+
+ // license URL is 4. element with variable size
+ for ( int i = 1; i <= 4 ; ++i ) {
+ XMP_Uns32 len = GetUns32LE ( &buffer[fieldPos] );
+ if ( i == 4 ) {
+ std::string licenseURLStr = buffer.substr ( fieldPos + 4, len );
+ legacyManager->SetField ( ASF_LegacyManager::fieldLicenseURL, licenseURLStr );
+ }
+ fieldPos += (len + 4);
+ }
+
+ legacyManager->SetObjectExists ( objectContentEncryption );
+
+#endif
+
+ } else if ( IsEqualGUID ( ASF_Padding_Object, objectBase.guid ) ) {
+
+ legacyManager->SetPadding ( legacyManager->GetPadding() + (objectBase.size - 24) );
+
+ } else if ( IsEqualGUID ( ASF_Header_Extension_Object, objectBase.guid ) ) {
+
+ this->ReadHeaderExtensionObject ( fileRef, inOutObjectState, pos, objectBase );
+
+ }
+
+ pos += objectBase.size;
+ read += objectBase.size;
+ }
+
+ } catch ( ... ) {
+
+ return false;
+
+ }
+
+ legacyManager->ComputeDigest();
+
+ return true;
+}
+
+// =============================================================================================
+
+bool ASF_Support::WriteHeaderObject ( LFA_FileRef sourceRef, LFA_FileRef destRef, const ObjectData& object, ASF_LegacyManager& _legacyManager, bool usePadding )
+{
+ if ( ! IsEqualGUID ( ASF_Header_Object, object.guid ) ) return false;
+
+ bool ret = false;
+
+ std::string buffer;
+ XMP_Uns16 valueUns16LE;
+ XMP_Uns32 valueUns32LE;
+ XMP_Uns64 valueUns64LE;
+
+ try {
+
+ // read header-object structure
+ XMP_Uns64 pos = object.pos;
+ XMP_Uns32 bufferSize = kASF_ObjectBaseLen + 6;
+
+ buffer.clear();
+ buffer.reserve ( bufferSize );
+ buffer.assign ( bufferSize, ' ' );
+ LFA_Seek ( sourceRef, pos, SEEK_SET );
+ LFA_Read ( sourceRef, const_cast<char*>(buffer.data()), bufferSize, true );
+
+ XMP_Uns64 read = bufferSize;
+ pos += bufferSize;
+
+ // read contained header objects
+ XMP_Uns32 numberOfHeaders = GetUns32LE ( &buffer[24] );
+ ASF_ObjectBase objectBase;
+
+ // prepare new header in memory
+ std::string header;
+
+ int changedObjects = _legacyManager.changedObjects();
+ int exportedObjects = 0;
+ int writtenObjects = 0;
+
+ header.append ( buffer.c_str(), bufferSize );
+
+ while ( read < object.len ) {
+
+ LFA_Seek ( sourceRef, pos, SEEK_SET );
+ if ( kASF_ObjectBaseLen != LFA_Read ( sourceRef, &objectBase, kASF_ObjectBaseLen, true ) ) break;
+
+ LFA_Seek ( sourceRef, pos, SEEK_SET );
+ objectBase.size = GetUns64LE ( &objectBase.size );
+
+ int headerStartPos = header.size();
+
+ // save position of filesize-information
+ if ( IsEqualGUID ( ASF_File_Properties_Object, objectBase.guid ) ) {
+ posFileSizeInfo = (headerStartPos + 40);
+ }
+
+ // write objects
+ if ( IsEqualGUID ( ASF_File_Properties_Object, objectBase.guid ) &&
+ (objectBase.size >= 104) && (changedObjects & ASF_LegacyManager::objectFileProperties) ) {
+
+ // copy object and replace creation-date
+ buffer.reserve ( XMP_Uns32 ( objectBase.size ) );
+ buffer.assign ( XMP_Uns32 ( objectBase.size ), ' ' );
+ LFA_Read ( sourceRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true );
+ header.append ( buffer, 0, XMP_Uns32( objectBase.size ) );
+
+ if ( ! _legacyManager.GetBroadcast() ) {
+ buffer = _legacyManager.GetField ( ASF_LegacyManager::fieldCreationDate );
+ ReplaceString ( header, buffer, (headerStartPos + 48), 8 );
+ }
+
+ exportedObjects |= ASF_LegacyManager::objectFileProperties;
+
+ } else if ( IsEqualGUID ( ASF_Content_Description_Object, objectBase.guid ) &&
+ (objectBase.size >= 34) && (changedObjects & ASF_LegacyManager::objectContentDescription) ) {
+
+ // re-create object with xmp-data
+ buffer.reserve ( XMP_Uns32( objectBase.size ) );
+ buffer.assign ( XMP_Uns32( objectBase.size ), ' ' );
+ LFA_Read ( sourceRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true );
+ // write header only
+ header.append ( buffer, 0, XMP_Uns32( kASF_ObjectBaseLen ) );
+
+ // write length fields
+
+ XMP_Uns16 titleLen = _legacyManager.GetField ( ASF_LegacyManager::fieldTitle).size( );
+ valueUns16LE = MakeUns16LE ( titleLen );
+ header.append ( (const char*)&valueUns16LE, 2 );
+
+ XMP_Uns16 authorLen = _legacyManager.GetField ( ASF_LegacyManager::fieldAuthor).size( );
+ valueUns16LE = MakeUns16LE ( authorLen );
+ header.append ( (const char*)&valueUns16LE, 2 );
+
+ XMP_Uns16 copyrightLen = _legacyManager.GetField ( ASF_LegacyManager::fieldCopyright).size( );
+ valueUns16LE = MakeUns16LE ( copyrightLen );
+ header.append ( (const char*)&valueUns16LE, 2 );
+
+ XMP_Uns16 descriptionLen = _legacyManager.GetField ( ASF_LegacyManager::fieldDescription).size( );
+ valueUns16LE = MakeUns16LE ( descriptionLen );
+ header.append ( (const char*)&valueUns16LE, 2 );
+
+ // retrieve existing overall length of preceding fields
+ XMP_Uns16 precedingLen = 0;
+ precedingLen += GetUns16LE ( &buffer[24] ); // Title
+ precedingLen += GetUns16LE ( &buffer[26] ); // Author
+ precedingLen += GetUns16LE ( &buffer[28] ); // Copyright
+ precedingLen += GetUns16LE ( &buffer[30] ); // Description
+ // retrieve existing 'Rating' length
+ XMP_Uns16 ratingLen = GetUns16LE ( &buffer[32] ); // Rating
+ valueUns16LE = MakeUns16LE ( ratingLen );
+ header.append ( (const char*)&valueUns16LE, 2 );
+
+ // write field contents
+
+ header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldTitle ) );
+ header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldAuthor ) );
+ header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldCopyright ) );
+ header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldDescription ) );
+ header.append ( buffer, (34 + precedingLen), ratingLen );
+
+ // update new object size
+ valueUns64LE = MakeUns64LE ( header.size() - headerStartPos );
+ std::string newSize ( (const char*)&valueUns64LE, 8 );
+ ReplaceString ( header, newSize, (headerStartPos + 16), 8 );
+
+ exportedObjects |= ASF_LegacyManager::objectContentDescription;
+
+ } else if ( IsEqualGUID ( ASF_Content_Branding_Object, objectBase.guid ) &&
+ (changedObjects & ASF_LegacyManager::objectContentBranding) ) {
+
+ // re-create object with xmp-data
+ buffer.reserve ( XMP_Uns32( objectBase.size ) );
+ buffer.assign ( XMP_Uns32( objectBase.size ), ' ' );
+ LFA_Read ( sourceRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true );
+
+ // calculate size of fields coming before 'Copyright URL'
+ XMP_Uns32 length = 28;
+ length += (GetUns32LE ( &buffer[length] ) + 4); // Banner Image Data
+ length += (GetUns32LE ( &buffer[length] ) + 4); // Banner Image URL
+
+ // write first part of header
+ header.append ( buffer, 0, length );
+
+ // copyright URL
+ length = _legacyManager.GetField ( ASF_LegacyManager::fieldCopyrightURL).size( );
+ valueUns32LE = MakeUns32LE ( length );
+ header.append ( (const char*)&valueUns32LE, 4 );
+ header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldCopyrightURL ) );
+
+ // update new object size
+ valueUns64LE = MakeUns64LE ( header.size() - headerStartPos );
+ std::string newSize ( (const char*)&valueUns64LE, 8 );
+ ReplaceString ( header, newSize, (headerStartPos + 16), 8 );
+
+ exportedObjects |= ASF_LegacyManager::objectContentBranding;
+
+#if ! Exclude_LicenseURL_Recon
+
+ } else if ( IsEqualGUID ( ASF_Content_Encryption_Object, objectBase.guid ) &&
+ (changedObjects & ASF_LegacyManager::objectContentEncryption) ) {
+
+ // re-create object with xmp-data
+ buffer.reserve ( XMP_Uns32( objectBase.size ) );
+ buffer.assign ( XMP_Uns32( objectBase.size ), ' ' );
+ LFA_Read ( sourceRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true );
+
+ // calculate size of fields coming before 'License URL'
+ XMP_Uns32 length = 24;
+ length += (GetUns32LE ( &buffer[length] ) + 4); // Secret Data
+ length += (GetUns32LE ( &buffer[length] ) + 4); // Protection Type
+ length += (GetUns32LE ( &buffer[length] ) + 4); // Key ID
+
+ // write first part of header
+ header.append ( buffer, 0, length );
+
+ // License URL
+ length = _legacyManager.GetField ( ASF_LegacyManager::fieldLicenseURL).size( );
+ valueUns32LE = MakeUns32LE ( length );
+ header.append ( (const char*)&valueUns32LE, 4 );
+ header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldLicenseURL ) );
+
+ // update new object size
+ valueUns64LE = MakeUns64LE ( header.size() - headerStartPos );
+ std::string newSize ( (const char*)&valueUns64LE, 8 );
+ ReplaceString ( header, newSize, (headerStartPos + 16), 8 );
+
+ exportedObjects |= ASF_LegacyManager::objectContentEncryption;
+
+#endif
+
+ } else if ( IsEqualGUID ( ASF_Header_Extension_Object, objectBase.guid ) && usePadding ) {
+
+ // re-create object if padding needs to be used
+ buffer.reserve ( XMP_Uns32( objectBase.size ) );
+ buffer.assign ( XMP_Uns32( objectBase.size ), ' ' );
+ LFA_Read ( sourceRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true );
+
+ ASF_Support::WriteHeaderExtensionObject ( buffer, &header, objectBase, 0 );
+
+ } else if ( IsEqualGUID ( ASF_Padding_Object, objectBase.guid ) && usePadding ) {
+
+ // eliminate padding (will be created as last object)
+
+ } else {
+
+ // simply copy all other objects
+ buffer.reserve ( XMP_Uns32( objectBase.size ) );
+ buffer.assign ( XMP_Uns32( objectBase.size ), ' ' );
+ LFA_Read ( sourceRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true );
+
+ header.append ( buffer, 0, XMP_Uns32( objectBase.size ) );
+
+ }
+
+ pos += objectBase.size;
+ read += objectBase.size;
+
+ writtenObjects ++;
+
+ }
+
+ // any objects to create ?
+ int newObjects = (changedObjects ^ exportedObjects);
+
+ if ( newObjects ) {
+
+ // create new objects with xmp-data
+ int headerStartPos;
+ ASF_ObjectBase newObjectBase;
+ XMP_Uns32 length;
+
+ if ( newObjects & ASF_LegacyManager::objectContentDescription ) {
+
+ headerStartPos = header.size();
+ newObjectBase.guid = ASF_Content_Description_Object;
+ newObjectBase.size = 0;
+
+ // write object header
+ header.append ( (const char*)&newObjectBase, kASF_ObjectBaseLen );
+
+ XMP_Uns16 titleLen = _legacyManager.GetField ( ASF_LegacyManager::fieldTitle).size( );
+ valueUns16LE = MakeUns16LE ( titleLen );
+ header.append ( (const char*)&valueUns16LE, 2 );
+
+ XMP_Uns16 authorLen = _legacyManager.GetField ( ASF_LegacyManager::fieldAuthor).size( );
+ valueUns16LE = MakeUns16LE ( authorLen );
+ header.append ( (const char*)&valueUns16LE, 2 );
+
+ XMP_Uns16 copyrightLen = _legacyManager.GetField ( ASF_LegacyManager::fieldCopyright).size( );
+ valueUns16LE = MakeUns16LE ( copyrightLen );
+ header.append ( (const char*)&valueUns16LE, 2 );
+
+ XMP_Uns16 descriptionLen = _legacyManager.GetField ( ASF_LegacyManager::fieldDescription).size( );
+ valueUns16LE = MakeUns16LE ( descriptionLen );
+ header.append ( (const char*)&valueUns16LE, 2 );
+
+ XMP_Uns16 ratingLen = 0;
+ valueUns16LE = MakeUns16LE ( ratingLen );
+ header.append ( (const char*)&valueUns16LE, 2 );
+
+ // write field contents
+
+ header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldTitle ) );
+ header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldAuthor ) );
+ header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldCopyright ) );
+ header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldDescription ) );
+
+ // update new object size
+ valueUns64LE = MakeUns64LE ( header.size() - headerStartPos );
+ std::string newSize ( (const char*)&valueUns64LE, 8 );
+ ReplaceString ( header, newSize, (headerStartPos + 16), 8 );
+
+ newObjects &= ~ASF_LegacyManager::objectContentDescription;
+
+ writtenObjects ++;
+
+ }
+
+ if ( newObjects & ASF_LegacyManager::objectContentBranding ) {
+
+ headerStartPos = header.size();
+ newObjectBase.guid = ASF_Content_Branding_Object;
+ newObjectBase.size = 0;
+
+ // write object header
+ header.append ( (const char*)&newObjectBase, kASF_ObjectBaseLen );
+
+ // write 'empty' fields
+ header.append ( 12, '\0' );
+
+ // copyright URL
+ length = _legacyManager.GetField ( ASF_LegacyManager::fieldCopyrightURL).size( );
+ valueUns32LE = MakeUns32LE ( length );
+ header.append ( (const char*)&valueUns32LE, 4 );
+ header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldCopyrightURL ) );
+
+ // update new object size
+ valueUns64LE = MakeUns64LE ( header.size() - headerStartPos );
+ std::string newSize ( (const char*)&valueUns64LE, 8 );
+ ReplaceString ( header, newSize, (headerStartPos + 16), 8 );
+
+ newObjects &= ~ASF_LegacyManager::objectContentBranding;
+
+ writtenObjects ++;
+
+ }
+
+#if ! Exclude_LicenseURL_Recon
+
+ if ( newObjects & ASF_LegacyManager::objectContentEncryption ) {
+
+ headerStartPos = header.size();
+ newObjectBase.guid = ASF_Content_Encryption_Object;
+ newObjectBase.size = 0;
+
+ // write object header
+ header.append ( (const char*)&newObjectBase, kASF_ObjectBaseLen );
+
+ // write 'empty' fields
+ header.append ( 12, '\0' );
+
+ // License URL
+ length = _legacyManager.GetField ( ASF_LegacyManager::fieldLicenseURL).size( );
+ valueUns32LE = MakeUns32LE ( length );
+ header.append ( (const char*)&valueUns32LE, 4 );
+ header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldLicenseURL ) );
+
+ // update new object size
+ valueUns64LE = MakeUns64LE ( header.size() - headerStartPos );
+ std::string newSize ( (const char*)&valueUns64LE, 8 );
+ ReplaceString ( header, newSize, (headerStartPos + 16), 8 );
+
+ newObjects &= ~ASF_LegacyManager::objectContentEncryption;
+
+ writtenObjects ++;
+
+ }
+
+#endif
+
+ }
+
+ // create padding object ?
+ if ( usePadding && (header.size ( ) < object.len ) ) {
+ ASF_Support::CreatePaddingObject ( &header, (object.len - header.size()) );
+ writtenObjects ++;
+ }
+
+ // update new header-object size
+ valueUns64LE = MakeUns64LE ( header.size() );
+ std::string newValue ( (const char*)&valueUns64LE, 8 );
+ ReplaceString ( header, newValue, 16, 8 );
+
+ // update new number of Header objects
+ valueUns32LE = MakeUns32LE ( writtenObjects );
+ newValue = std::string ( (const char*)&valueUns32LE, 4 );
+ ReplaceString ( header, newValue, 24, 4 );
+
+ // if we are operating on the same file (in-place update), place pointer before writing
+ if ( sourceRef == destRef ) LFA_Seek ( destRef, object.pos, SEEK_SET );
+
+ // write header
+ LFA_Write ( destRef, header.c_str(), header.size() );
+
+ } catch ( ... ) {
+
+ ret = false;
+
+ }
+
+ return ret;
+
+}
+
+// =============================================================================================
+
+bool ASF_Support::UpdateHeaderObject ( LFA_FileRef fileRef, const ObjectData& object, ASF_LegacyManager& _legacyManager )
+{
+ return ASF_Support::WriteHeaderObject ( fileRef, fileRef, object, _legacyManager, true );
+}
+
+// =============================================================================================
+
+bool ASF_Support::UpdateFileSize ( LFA_FileRef fileRef )
+{
+ if ( fileRef == 0 ) return false;
+
+ XMP_Uns64 posCurrent = LFA_Seek ( fileRef, 0, SEEK_CUR );
+ XMP_Uns64 newSizeLE = MakeUns64LE ( LFA_Measure ( fileRef ) );
+
+ if ( this->posFileSizeInfo != 0 ) {
+
+ LFA_Seek ( fileRef, this->posFileSizeInfo, SEEK_SET );
+
+ } else {
+
+ // The position of the file size field is not known, find it.
+
+ ASF_ObjectBase objHeader;
+
+ // Read the Header object at the start of the file.
+
+ LFA_Seek ( fileRef, 0, SEEK_SET );
+ LFA_Read ( fileRef, &objHeader, kASF_ObjectBaseLen, kLFA_RequireAll );
+ if ( ! IsEqualGUID ( ASF_Header_Object, objHeader.guid ) ) return false;
+
+ XMP_Uns32 childCount;
+ LFA_Read ( fileRef, &childCount, 4, kLFA_RequireAll );
+ childCount = GetUns32LE ( &childCount );
+
+ LFA_Seek ( fileRef, 2, SEEK_CUR ); // Skip the 2 reserved bytes.
+
+ // Look for the File Properties object in the Header's children.
+
+ for ( ; childCount > 0; --childCount ) {
+ LFA_Read ( fileRef, &objHeader, kASF_ObjectBaseLen, kLFA_RequireAll );
+ if ( IsEqualGUID ( ASF_File_Properties_Object, objHeader.guid ) ) break;
+ XMP_Uns64 dataLen = GetUns64LE ( &objHeader.size ) - 24;
+ LFA_Seek ( fileRef, dataLen, SEEK_CUR ); // Skip this object's data.
+ }
+ if ( childCount == 0 ) return false;
+
+ // Seek to the file size field.
+
+ XMP_Uns64 fpoSize = GetUns64LE ( &objHeader.size );
+ if ( fpoSize < (16+8+16+8) ) return false;
+ LFA_Seek ( fileRef, 16, SEEK_CUR ); // Skip to the file size field.
+
+ }
+
+ LFA_Write ( fileRef, &newSizeLE, 8 ); // Write the new file size.
+
+ LFA_Seek ( fileRef, posCurrent, SEEK_SET );
+ return true;
+
+}
+
+// =============================================================================================
+
+bool ASF_Support::ReadHeaderExtensionObject ( LFA_FileRef fileRef, ObjectState& inOutObjectState, const XMP_Uns64& _pos, const ASF_ObjectBase& _objectBase )
+{
+ if ( ! IsEqualGUID ( ASF_Header_Extension_Object, _objectBase.guid) || (! legacyManager ) ) return false;
+
+ try {
+
+ // read extended header-object structure beginning at the data part (offset = 46)
+ const XMP_Uns64 offset = 46;
+ XMP_Uns64 read = 0;
+ XMP_Uns64 data = (_objectBase.size - offset);
+ XMP_Uns64 pos = (_pos + offset);
+
+ ASF_ObjectBase objectBase;
+
+ while ( read < data ) {
+
+ LFA_Seek ( fileRef, pos, SEEK_SET );
+ if ( kASF_ObjectBaseLen != LFA_Read ( fileRef, &objectBase, kASF_ObjectBaseLen, true ) ) break;
+
+ objectBase.size = GetUns64LE ( &objectBase.size );
+
+ if ( IsEqualGUID ( ASF_Padding_Object, objectBase.guid ) ) {
+ legacyManager->SetPadding ( legacyManager->GetPadding() + (objectBase.size - 24) );
+ }
+
+ pos += objectBase.size;
+ read += objectBase.size;
+
+ }
+
+ } catch ( ... ) {
+
+ return false;
+
+ }
+
+ return true;
+
+}
+
+// =============================================================================================
+
+bool ASF_Support::WriteHeaderExtensionObject ( const std::string& buffer, std::string* header, const ASF_ObjectBase& _objectBase, const int /*reservePadding*/ )
+{
+ if ( ! IsEqualGUID ( ASF_Header_Extension_Object, _objectBase.guid ) || (! header) || (buffer.size() < 46) ) return false;
+
+ const XMP_Uns64 offset = 46;
+ int startPos = header->size();
+
+ // copy header base
+ header->append ( buffer, 0, offset );
+
+ // read extended header-object structure beginning at the data part (offset = 46)
+ XMP_Uns64 read = 0;
+ XMP_Uns64 data = (_objectBase.size - offset);
+ XMP_Uns64 pos = offset;
+
+ ASF_ObjectBase objectBase;
+
+ while ( read < data ) {
+
+ memcpy ( &objectBase, &buffer[int(pos)], kASF_ObjectBaseLen );
+ objectBase.size = GetUns64LE ( &objectBase.size );
+
+ if ( IsEqualGUID ( ASF_Padding_Object, objectBase.guid ) ) {
+ // eliminate
+ } else {
+ // copy other objects
+ header->append ( buffer, XMP_Uns32(pos), XMP_Uns32(objectBase.size) );
+ }
+
+ pos += objectBase.size;
+ read += objectBase.size;
+
+ }
+
+ // update header extension data size
+ XMP_Uns32 valueUns32LE = MakeUns32LE ( header->size() - startPos - offset );
+ std::string newDataSize ( (const char*)&valueUns32LE, 4 );
+ ReplaceString ( *header, newDataSize, (startPos + 42), 4 );
+
+ // update new object size
+ XMP_Uns64 valueUns64LE = MakeUns64LE ( header->size() - startPos );
+ std::string newObjectSize ( (const char*)&valueUns64LE, 8 );
+ ReplaceString ( *header, newObjectSize, (startPos + 16), 8 );
+
+ return true;
+
+}
+
+// =============================================================================================
+
+bool ASF_Support::CreatePaddingObject ( std::string* header, const XMP_Uns64 size )
+{
+ if ( ( ! header) || (size < 24) ) return false;
+
+ ASF_ObjectBase newObjectBase;
+
+ newObjectBase.guid = ASF_Padding_Object;
+ newObjectBase.size = MakeUns64LE ( size );
+
+ // write object header
+ header->append ( (const char*)&newObjectBase, kASF_ObjectBaseLen );
+
+ // write 'empty' padding
+ header->append ( XMP_Uns32 ( size - 24 ), '\0' );
+
+ return true;
+
+}
+
+// =============================================================================================
+
+bool ASF_Support::WriteXMPObject ( LFA_FileRef fileRef, XMP_Uns32 len, const char* inBuffer )
+{
+ bool ret = false;
+
+ ASF_ObjectBase objectBase = { ASF_XMP_Metadata, 0 };
+ objectBase.size = MakeUns64LE ( len + kASF_ObjectBaseLen );
+
+ try {
+ LFA_Write ( fileRef, &objectBase, kASF_ObjectBaseLen );
+ LFA_Write ( fileRef, inBuffer, len );
+ ret = true;
+ } catch ( ... ) {}
+
+ return ret;
+
+}
+
+// =============================================================================================
+
+bool ASF_Support::UpdateXMPObject ( LFA_FileRef fileRef, const ObjectData& object, XMP_Uns32 len, const char * inBuffer )
+{
+ bool ret = false;
+
+ ASF_ObjectBase objectBase = { ASF_XMP_Metadata, 0 };
+ objectBase.size = MakeUns64LE ( len + kASF_ObjectBaseLen );
+
+ try {
+ LFA_Seek ( fileRef, object.pos, SEEK_SET );
+ LFA_Write ( fileRef, &objectBase, kASF_ObjectBaseLen );
+ LFA_Write ( fileRef, inBuffer, len );
+ ret = true;
+ } catch ( ... ) {}
+
+ return ret;
+
+}
+
+// =============================================================================================
+
+bool ASF_Support::CopyObject ( LFA_FileRef sourceRef, LFA_FileRef destRef, const ObjectData& object )
+{
+ try {
+ LFA_Seek ( sourceRef, object.pos, SEEK_SET );
+ LFA_Copy ( sourceRef, destRef, object.len );
+ } catch ( ... ) {
+ return false;
+ }
+
+ return true;
+
+}
+
+// =============================================================================================
+
+bool ASF_Support::ReadBuffer ( LFA_FileRef fileRef, XMP_Uns64 & pos, XMP_Uns64 len, char * outBuffer )
+{
+ try {
+
+ if ( (fileRef == 0) || (outBuffer == 0) ) return false;
+
+ LFA_Seek (fileRef, pos, SEEK_SET );
+ long bytesRead = LFA_Read ( fileRef, outBuffer, XMP_Int32(len), true );
+ if ( XMP_Uns32 ( bytesRead ) != len ) return false;
+
+ return true;
+
+ } catch ( ... ) {}
+
+ return false;
+
+}
+
+// =============================================================================================
+
+bool ASF_Support::WriteBuffer ( LFA_FileRef fileRef, XMP_Uns64 & pos, XMP_Uns32 len, const char * inBuffer )
+{
+ try {
+
+ if ( (fileRef == 0) || (inBuffer == 0) ) return false;
+
+ LFA_Seek (fileRef, pos, SEEK_SET );
+ LFA_Write( fileRef, inBuffer, len );
+
+ return true;
+
+ } catch ( ... ) {}
+
+ return false;
+
+}
+
+// =================================================================================================
+
+std::string ASF_Support::ReplaceString ( std::string& operand, std::string& str, int offset, int count )
+{
+ std::basic_string<char>::iterator iterF1, iterL1, iterF2, iterL2;
+
+ iterF1 = operand.begin() + offset;
+ iterL1 = operand.begin() + offset + count;
+ iterF2 = str.begin();
+ iterL2 = str.begin() + count;
+
+ return operand.replace ( iterF1, iterL1, iterF2, iterL2 );
+
+}
+
+// =================================================================================================
+
+ASF_LegacyManager::ASF_LegacyManager() : fields(fieldLast), broadcastSet(false), digestComputed(false),
+ imported(false), objectsExisting(0), objectsToExport(0), legacyDiff(0), padding(0)
+{
+ // Nothing more to do.
+}
+
+// =================================================================================================
+
+ASF_LegacyManager::~ASF_LegacyManager()
+{
+ // Nothing to do.
+}
+
+// =================================================================================================
+
+bool ASF_LegacyManager::SetField ( fieldType field, const std::string& value )
+{
+ if ( field >= fieldLast ) return false;
+
+ unsigned int maxSize = this->GetFieldMaxSize ( field );
+
+ if (value.size ( ) <= maxSize ) {
+ fields[field] = value;
+ } else {
+ fields[field] = value.substr ( 0, maxSize );
+ }
+
+ if ( field == fieldCopyrightURL ) NormalizeStringDisplayASCII ( fields[field] );
+
+ #if ! Exclude_LicenseURL_Recon
+ if ( field == fieldLicenseURL ) NormalizeStringDisplayASCII ( fields[field] );
+ #endif
+
+ return true;
+
+}
+
+// =================================================================================================
+
+std::string ASF_LegacyManager::GetField ( fieldType field )
+{
+ if ( field >= fieldLast ) return std::string();
+ return fields[field];
+}
+
+// =================================================================================================
+
+unsigned int ASF_LegacyManager::GetFieldMaxSize ( fieldType field )
+{
+ unsigned int maxSize = 0;
+
+ switch ( field ) {
+
+ case fieldCreationDate :
+ maxSize = 8;
+ break;
+
+ case fieldTitle :
+ case fieldAuthor :
+ case fieldCopyright :
+ case fieldDescription :
+ maxSize = 0xFFFF;
+ break;
+
+ case fieldCopyrightURL :
+#if ! Exclude_LicenseURL_Recon
+ case fieldLicenseURL :
+#endif
+ maxSize = 0xFFFFFFFF;
+ break;
+
+ default:
+ break;
+
+ }
+
+ return maxSize;
+
+}
+
+// =================================================================================================
+
+void ASF_LegacyManager::SetObjectExists ( objectType object )
+{
+ objectsExisting |= object;
+}
+
+// =================================================================================================
+
+void ASF_LegacyManager::SetBroadcast ( const bool broadcast )
+{
+ broadcastSet = broadcast;
+}
+
+// =================================================================================================
+
+bool ASF_LegacyManager::GetBroadcast()
+{
+ return broadcastSet;
+}
+
+// =================================================================================================
+
+void ASF_LegacyManager::ComputeDigest()
+{
+ MD5_CTX context;
+ MD5_Digest digest;
+ char buffer[40];
+
+ MD5Init ( &context );
+ digestStr.clear();
+ digestStr.reserve ( 160 );
+
+ for ( int type=0; type < fieldLast; ++type ) {
+
+ if (fields[type].size ( ) > 0 ) {
+ snprintf ( buffer, sizeof(buffer), "%d,", type );
+ digestStr.append ( buffer );
+ MD5Update ( &context, (XMP_Uns8*)fields[type].data(), fields[type].size() );
+ }
+
+ }
+
+ digestStr[digestStr.size()-1] = ';';
+
+ MD5Final ( digest, &context );
+
+ size_t in, out;
+ for ( in = 0, out = 0; in < 16; in += 1, out += 2 ) {
+ XMP_Uns8 byte = digest[in];
+ buffer[out] = ReconcileUtils::kHexDigits [ byte >> 4 ];
+ buffer[out+1] = ReconcileUtils::kHexDigits [ byte & 0xF ];
+ }
+ buffer[32] = 0;
+
+ digestStr.append ( buffer );
+
+ digestComputed = true;
+
+}
+
+// =================================================================================================
+
+bool ASF_LegacyManager::CheckDigest ( const SXMPMeta& xmp )
+{
+ bool ret = false;
+
+ if ( ! digestComputed ) this->ComputeDigest();
+
+ std::string oldDigest;
+
+ if ( xmp.GetProperty ( kXMP_NS_ASF, "NativeDigest", &oldDigest, 0 ) ) {
+ ret = (digestStr == oldDigest);
+ }
+
+ return ret;
+
+}
+
+// =================================================================================================
+
+void ASF_LegacyManager::SetDigest ( SXMPMeta* xmp )
+{
+ if ( ! digestComputed ) this->ComputeDigest();
+
+ xmp->SetProperty ( kXMP_NS_ASF, "NativeDigest", digestStr.c_str() );
+
+}
+
+// =================================================================================================
+
+void ASF_LegacyManager::ImportLegacy ( SXMPMeta* xmp )
+{
+ std::string utf8;
+
+ if ( ! broadcastSet ) {
+ ConvertMSDateToISODate ( fields[fieldCreationDate], &utf8 );
+ xmp->SetProperty ( kXMP_NS_XMP, "CreateDate", utf8.c_str(), kXMP_DeleteExisting );
+ }
+
+ FromUTF16 ( (UTF16Unit*)fields[fieldTitle].c_str(), (fields[fieldTitle].size() / 2), &utf8, false );
+ xmp->SetLocalizedText ( kXMP_NS_DC, "title", "", "x-default", utf8.c_str(), kXMP_DeleteExisting );
+
+ xmp->DeleteProperty ( kXMP_NS_DC, "creator" );
+ FromUTF16 ( (UTF16Unit*)fields[fieldAuthor].c_str(), (fields[fieldAuthor].size() / 2), &utf8, false );
+ SXMPUtils::SeparateArrayItems ( xmp, kXMP_NS_DC, "creator", kXMPUtil_AllowCommas, utf8.c_str() );
+
+ FromUTF16 ( (UTF16Unit*)fields[fieldCopyright].c_str(), (fields[fieldCopyright].size() / 2), &utf8, false );
+ xmp->SetLocalizedText ( kXMP_NS_DC, "rights", "", "x-default", utf8.c_str(), kXMP_DeleteExisting );
+
+ FromUTF16 ( (UTF16Unit*)fields[fieldDescription].c_str(), (fields[fieldDescription].size() / 2), &utf8, false );
+ xmp->SetLocalizedText ( kXMP_NS_DC, "description", "", "x-default", utf8.c_str(), kXMP_DeleteExisting );
+
+ xmp->SetProperty ( kXMP_NS_XMP_Rights, "WebStatement", fields[fieldCopyrightURL].c_str(), kXMP_DeleteExisting );
+
+#if ! Exclude_LicenseURL_Recon
+ xmp->SetProperty ( kXMP_NS_XMP_Rights, "Certificate", fields[fieldLicenseURL].c_str(), kXMP_DeleteExisting );
+#endif
+
+ imported = true;
+
+}
+
+// =================================================================================================
+
+int ASF_LegacyManager::ExportLegacy ( const SXMPMeta& xmp )
+{
+ int changed = 0;
+ objectsToExport = 0;
+ legacyDiff = 0;
+
+ std::string utf8;
+ std::string utf16;
+ XMP_OptionBits flags;
+
+ if ( ! broadcastSet ) {
+ if ( xmp.GetProperty ( kXMP_NS_XMP, "CreateDate", &utf8, &flags ) ) {
+ std::string date;
+ ConvertISODateToMSDate ( utf8, &date );
+ if ( fields[fieldCreationDate] != date ) {
+ legacyDiff += date.size();
+ legacyDiff -= fields[fieldCreationDate].size();
+ this->SetField ( fieldCreationDate, date );
+ objectsToExport |= objectFileProperties;
+ changed ++;
+ }
+ }
+ }
+
+ if ( xmp.GetLocalizedText ( kXMP_NS_DC, "title", "", "x-default", 0, &utf8, &flags ) ) {
+ NormalizeStringTrailingNull ( utf8 );
+ ToUTF16 ( (const UTF8Unit*)utf8.data(), utf8.size(), &utf16, false );
+ if ( fields[fieldTitle] != utf16 ) {
+ legacyDiff += utf16.size();
+ legacyDiff -= fields[fieldTitle].size();
+ this->SetField ( fieldTitle, utf16 );
+ objectsToExport |= objectContentDescription;
+ changed ++;
+ }
+ }
+
+ utf8.clear();
+ SXMPUtils::CatenateArrayItems ( xmp, kXMP_NS_DC, "creator", 0, 0, kXMPUtil_AllowCommas, &utf8 );
+ if ( ! utf8.empty() ) {
+ NormalizeStringTrailingNull ( utf8 );
+ ToUTF16 ( (const UTF8Unit*)utf8.data(), utf8.size(), &utf16, false );
+ if ( fields[fieldAuthor] != utf16 ) {
+ legacyDiff += utf16.size();
+ legacyDiff -= fields[fieldAuthor].size();
+ this->SetField ( fieldAuthor, utf16 );
+ objectsToExport |= objectContentDescription;
+ changed ++;
+ }
+ }
+
+ if ( xmp.GetLocalizedText ( kXMP_NS_DC, "rights", "", "x-default", 0, &utf8, &flags ) ) {
+ NormalizeStringTrailingNull ( utf8 );
+ ToUTF16 ( (const UTF8Unit*)utf8.data(), utf8.size(), &utf16, false );
+ if ( fields[fieldCopyright] != utf16 ) {
+ legacyDiff += utf16.size();
+ legacyDiff -= fields[fieldCopyright].size();
+ this->SetField ( fieldCopyright, utf16 );
+ objectsToExport |= objectContentDescription;
+ changed ++;
+ }
+ }
+
+ if ( xmp.GetLocalizedText ( kXMP_NS_DC, "description", "", "x-default", 0, &utf8, &flags ) ) {
+ NormalizeStringTrailingNull ( utf8 );
+ ToUTF16 ( (const UTF8Unit*)utf8.data(), utf8.size(), &utf16, false );
+ if ( fields[fieldDescription] != utf16 ) {
+ legacyDiff += utf16.size();
+ legacyDiff -= fields[fieldDescription].size();
+ this->SetField ( fieldDescription, utf16 );
+ objectsToExport |= objectContentDescription;
+ changed ++;
+ }
+ }
+
+ if ( xmp.GetProperty ( kXMP_NS_XMP_Rights, "WebStatement", &utf8, &flags ) ) {
+ NormalizeStringTrailingNull ( utf8 );
+ if ( fields[fieldCopyrightURL] != utf8 ) {
+ legacyDiff += utf8.size();
+ legacyDiff -= fields[fieldCopyrightURL].size();
+ this->SetField ( fieldCopyrightURL, utf8 );
+ objectsToExport |= objectContentBranding;
+ changed ++;
+ }
+ }
+
+#if ! Exclude_LicenseURL_Recon
+ if ( xmp.GetProperty ( kXMP_NS_XMP_Rights, "Certificate", &utf8, &flags ) ) {
+ NormalizeStringTrailingNull ( utf8 );
+ if ( fields[fieldLicenseURL] != utf8 ) {
+ legacyDiff += utf8.size();
+ legacyDiff -= fields[fieldLicenseURL].size();
+ this->SetField ( fieldLicenseURL, utf8 );
+ objectsToExport |= objectContentEncryption;
+ changed ++;
+ }
+ }
+#endif
+
+ // find objects, that would need to be created on legacy export
+ int newObjects = (objectsToExport & !objectsExisting);
+
+ // calculate minimum storage for new objects, that might be created on export
+ if ( newObjects & objectContentDescription )
+ legacyDiff += sizeContentDescription;
+ if ( newObjects & objectContentBranding )
+ legacyDiff += sizeContentBranding;
+ if ( newObjects & objectContentEncryption )
+ legacyDiff += sizeContentEncryption;
+
+ ComputeDigest();
+
+ return changed;
+
+}
+
+// =================================================================================================
+
+bool ASF_LegacyManager::hasLegacyChanged()
+{
+ return (objectsToExport != 0);
+}
+
+// =================================================================================================
+
+XMP_Int64 ASF_LegacyManager::getLegacyDiff()
+{
+ return (this->hasLegacyChanged() ? legacyDiff : 0);
+}
+
+// =================================================================================================
+
+int ASF_LegacyManager::changedObjects()
+{
+ return objectsToExport;
+}
+
+// =================================================================================================
+
+void ASF_LegacyManager::SetPadding ( XMP_Int64 _padding )
+{
+ padding = _padding;
+}
+
+// =================================================================================================
+
+XMP_Int64 ASF_LegacyManager::GetPadding()
+{
+ return padding;
+}
+
+// =================================================================================================
+
+std::string ASF_LegacyManager::NormalizeStringDisplayASCII ( std::string& operand )
+{
+ std::basic_string<char>::iterator current = operand.begin();
+ std::basic_string<char>::iterator end = operand.end();;
+
+ for ( ; (current != end); ++current ) {
+ char element = *current;
+ if ( ( (element < 0x21) && (element != 0x00)) || (element > 0x7e) ) {
+ *current = '?';
+ }
+ }
+
+ return operand;
+
+}
+
+// =================================================================================================
+
+std::string ASF_LegacyManager::NormalizeStringTrailingNull ( std::string& operand )
+{
+ if ( ( operand.size() > 0) && (operand[operand.size() - 1] != '\0') ) {
+ operand.append ( 1, '\0' );
+ }
+
+ return operand;
+
+}
+
+// =================================================================================================
+
+int ASF_LegacyManager::DaysInMonth ( XMP_Int32 year, XMP_Int32 month )
+{
+
+ static short daysInMonth[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+ // Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
+
+ int days = daysInMonth [ month ];
+ if ( (month == 2) && IsLeapYear ( year ) ) days += 1;
+
+ return days;
+
+}
+
+// =================================================================================================
+
+bool ASF_LegacyManager::IsLeapYear ( long year )
+{
+
+ if ( year < 0 ) year = -year + 1; // Fold the negative years, assuming there is a year 0.
+
+ if ( (year % 4) != 0 ) return false; // Not a multiple of 4.
+ if ( (year % 100) != 0 ) return true; // A multiple of 4 but not a multiple of 100.
+ if ( (year % 400) == 0 ) return true; // A multiple of 400.
+
+ return false; // A multiple of 100 but not a multiple of 400.
+
+}
+
+// =================================================================================================
+
+void ASF_LegacyManager::ConvertMSDateToISODate ( std::string& source, std::string* dest )
+{
+
+ XMP_Int64 creationDate = GetUns64LE ( source.c_str() );
+ XMP_Int64 totalSecs = creationDate / (10*1000*1000);
+ XMP_Int32 nanoSec = ( ( XMP_Int32) (creationDate - (totalSecs * 10*1000*1000)) ) * 100;
+
+ XMP_Int32 days = (XMP_Int32) (totalSecs / 86400);
+ totalSecs -= ( ( XMP_Int64)days * 86400 );
+
+ XMP_Int32 hour = (XMP_Int32) (totalSecs / 3600);
+ totalSecs -= ( ( XMP_Int64)hour * 3600 );
+
+ XMP_Int32 minute = (XMP_Int32) (totalSecs / 60);
+ totalSecs -= ( ( XMP_Int64)minute * 60 );
+
+ XMP_Int32 second = (XMP_Int32)totalSecs;
+
+ // A little more simple code converts this to an XMP date string:
+
+ XMP_DateTime date;
+ memset ( &date, 0, sizeof ( date ) );
+
+ date.year = 1601; // The MS date origin.
+ date.month = 1;
+ date.day = 1;
+
+ date.day += days; // Add in the delta.
+ date.hour = hour;
+ date.minute = minute;
+ date.second = second;
+ date.nanoSecond = nanoSec;
+
+ SXMPUtils::ConvertToUTCTime ( &date ); // Normalize the date/time.
+ SXMPUtils::ConvertFromDate ( date, dest ); // Convert to an ISO 8601 string.
+
+}
+
+// =================================================================================================
+
+void ASF_LegacyManager::ConvertISODateToMSDate ( std::string& source, std::string* dest )
+{
+ XMP_DateTime date;
+ SXMPUtils::ConvertToDate ( source, &date );
+ SXMPUtils::ConvertToUTCTime ( &date );
+
+ XMP_Int64 creationDate;
+ creationDate = date.nanoSecond / 100;
+ creationDate += (XMP_Int64 ( date.second) * (10*1000*1000) );
+ creationDate += (XMP_Int64 ( date.minute) * 60 * (10*1000*1000) );
+ creationDate += (XMP_Int64 ( date.hour) * 3600 * (10*1000*1000) );
+
+ XMP_Int32 days = (date.day - 1);
+
+ --date.month;
+ while ( date.month >= 1 ) {
+ days += DaysInMonth ( date.year, date.month );
+ --date.month;
+ }
+
+ --date.year;
+ while ( date.year >= 1601 ) {
+ days += (IsLeapYear ( date.year) ? 366 : 365 );
+ --date.year;
+ }
+
+ creationDate += (XMP_Int64 ( days) * 86400 * (10*1000*1000) );
+
+ creationDate = GetUns64LE ( &creationDate );
+ dest->assign ( (const char*)&creationDate, 8 );
+
+}
diff --git a/source/XMPFiles/FormatSupport/ASF_Support.hpp b/source/XMPFiles/FormatSupport/ASF_Support.hpp
new file mode 100644
index 0000000..5260cb3
--- /dev/null
+++ b/source/XMPFiles/FormatSupport/ASF_Support.hpp
@@ -0,0 +1,224 @@
+#ifndef __ASF_Support_hpp__
+#define __ASF_Support_hpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XMP_Environment.h" // ! This must be the first include.
+
+#include "XMPFiles_Impl.hpp"
+#include "Reconcile_Impl.hpp"
+
+// currently exclude LicenseURL from reconciliation
+#define Exclude_LicenseURL_Recon 1
+#define EXCLUDE_LICENSEURL_RECON 1
+
+// Defines for platforms other than Win
+#if ! XMP_WinBuild
+
+ typedef struct _GUID
+ {
+ XMP_Uns32 Data1;
+ XMP_Uns16 Data2;
+ XMP_Uns16 Data3;
+ XMP_Uns8 Data4[8];
+ } GUID;
+
+ int IsEqualGUID ( const GUID& guid1, const GUID& guid2 );
+
+ static const GUID GUID_NULL = { 0x0, 0x0, 0x0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } };
+
+#endif
+
+// header object
+static const GUID ASF_Header_Object = { MakeUns32LE(0x75b22630), MakeUns16LE(0x668e), MakeUns16LE(0x11cf), { 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c } };
+// contains ...
+static const GUID ASF_File_Properties_Object = { MakeUns32LE(0x8cabdca1), MakeUns16LE(0xa947), MakeUns16LE(0x11cf), { 0x8e, 0xe4, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65 } };
+static const GUID ASF_Content_Description_Object = { MakeUns32LE(0x75b22633), MakeUns16LE(0x668e), MakeUns16LE(0x11cf), { 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c } };
+static const GUID ASF_Content_Branding_Object = { MakeUns32LE(0x2211b3fa), MakeUns16LE(0xbd23), MakeUns16LE(0x11d2), { 0xb4, 0xb7, 0x00, 0xa0, 0xc9, 0x55, 0xfc, 0x6e } };
+static const GUID ASF_Content_Encryption_Object = { MakeUns32LE(0x2211b3fb), MakeUns16LE(0xbd23), MakeUns16LE(0x11d2), { 0xb4, 0xb7, 0x00, 0xa0, 0xc9, 0x55, 0xfc, 0x6e } };
+// padding
+// Remark: regarding to Microsofts spec only the ASF_Header_Object contains a ASF_Padding_Object
+// Real world files show, that the ASF_Header_Extension_Object contains a ASF_Padding_Object
+static const GUID ASF_Header_Extension_Object = { MakeUns32LE(0x5fbf03b5), MakeUns16LE(0xa92e), MakeUns16LE(0x11cf), { 0x8e, 0xe3, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65 } };
+static const GUID ASF_Padding_Object = { MakeUns32LE(0x1806d474), MakeUns16LE(0xcadf), MakeUns16LE(0x4509), { 0xa4, 0xba, 0x9a, 0xab, 0xcb, 0x96, 0xaa, 0xe8 } };
+
+// data object
+static const GUID ASF_Data_Object = { MakeUns32LE(0x75b22636), MakeUns16LE(0x668e), MakeUns16LE(0x11cf), { 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c } };
+
+// XMP object
+static const GUID ASF_XMP_Metadata = { MakeUns32LE(0xbe7acfcb), MakeUns16LE(0x97a9), MakeUns16LE(0x42e8), { 0x9c, 0x71, 0x99, 0x94, 0x91, 0xe3, 0xaf, 0xac } };
+
+static const int guidLen = sizeof(GUID);
+
+typedef struct _ASF_ObjectBase
+{
+ GUID guid;
+ XMP_Uns64 size;
+
+} ASF_ObjectBase;
+
+static const int kASF_ObjectBaseLen = sizeof(ASF_ObjectBase);
+
+// =================================================================================================
+
+class ASF_LegacyManager {
+public:
+
+ enum objectType {
+ objectFileProperties = 1 << 0,
+ objectContentDescription = 1 << 1,
+ objectContentBranding = 1 << 2,
+ objectContentEncryption = 1 << 3
+ };
+
+ enum minObjectSize {
+ sizeContentDescription = 34,
+ sizeContentBranding = 40,
+ sizeContentEncryption = 40
+ };
+
+ enum fieldType {
+ // File_Properties_Object
+ fieldCreationDate = 0,
+ // Content_Description_Object
+ fieldTitle,
+ fieldAuthor,
+ fieldCopyright,
+ fieldDescription,
+ // Content_Branding_Object
+ fieldCopyrightURL,
+ #if ! Exclude_LicenseURL_Recon
+ // Content_Encryption_Object
+ fieldLicenseURL,
+ #endif
+ // last
+ fieldLast
+ };
+
+ ASF_LegacyManager();
+ virtual ~ASF_LegacyManager();
+
+ bool SetField ( fieldType field, const std::string& value );
+ std::string GetField ( fieldType field );
+ unsigned int GetFieldMaxSize ( fieldType field );
+
+ void SetObjectExists ( objectType object );
+
+ void SetBroadcast ( const bool broadcast );
+ bool GetBroadcast();
+
+ void ComputeDigest();
+ bool CheckDigest ( const SXMPMeta& xmp );
+ void SetDigest ( SXMPMeta* xmp );
+
+ void ImportLegacy ( SXMPMeta* xmp );
+ int ExportLegacy ( const SXMPMeta& xmp );
+ bool hasLegacyChanged();
+ XMP_Int64 getLegacyDiff();
+ int changedObjects();
+
+ void SetPadding ( XMP_Int64 padding );
+ XMP_Int64 GetPadding();
+
+private:
+
+ typedef std::vector<std::string> TFields;
+ TFields fields;
+ bool broadcastSet;
+
+ std::string digestStr;
+ bool digestComputed;
+
+ bool imported;
+ int objectsExisting;
+ int objectsToExport;
+ XMP_Int64 legacyDiff;
+ XMP_Int64 padding;
+
+ static std::string NormalizeStringDisplayASCII ( std::string& operand );
+ static std::string NormalizeStringTrailingNull ( std::string& operand );
+
+ static void ConvertMSDateToISODate ( std::string& source, std::string* dest );
+ static void ConvertISODateToMSDate ( std::string& source, std::string* dest );
+
+ static int DaysInMonth ( XMP_Int32 year, XMP_Int32 month );
+ static bool IsLeapYear ( long year );
+
+}; // class ASF_LegacyManager
+
+// =================================================================================================
+
+class ASF_Support {
+public:
+
+ class ObjectData {
+ public:
+ ObjectData() : pos(0), len(0), guid(GUID_NULL), xmp(false) {}
+ virtual ~ObjectData() {}
+ XMP_Uns64 pos; // file offset of object
+ XMP_Uns64 len; // length of object data
+ GUID guid; // object GUID
+ bool xmp; // object with XMP ?
+ };
+
+ typedef std::vector<ObjectData> ObjectVector;
+ typedef ObjectVector::iterator ObjectIterator;
+
+ class ObjectState {
+
+ public:
+ ObjectState() : xmpPos(0), xmpLen(0), xmpIsLastObject(false), broadcast(false) {}
+ virtual ~ObjectState() {}
+ XMP_Uns64 xmpPos;
+ XMP_Uns64 xmpLen;
+ bool xmpIsLastObject;
+ bool broadcast;
+ ObjectData xmpObject;
+ ObjectVector objects;
+ };
+
+ ASF_Support();
+ ASF_Support ( ASF_LegacyManager* legacyManager );
+ virtual ~ASF_Support();
+
+ long OpenASF ( LFA_FileRef fileRef, ObjectState & inOutObjectState );
+
+ bool ReadObject ( LFA_FileRef fileRef, ObjectState & inOutObjectState, XMP_Uns64 * objectLength, XMP_Uns64 & inOutPosition );
+
+ bool ReadHeaderObject ( LFA_FileRef fileRef, ObjectState& inOutObjectState, const ObjectData& newObject );
+ bool WriteHeaderObject ( LFA_FileRef sourceRef, LFA_FileRef destRef, const ObjectData& object, ASF_LegacyManager& legacyManager, bool usePadding );
+ bool UpdateHeaderObject ( LFA_FileRef fileRef, const ObjectData& object, ASF_LegacyManager& legacyManager );
+
+ bool UpdateFileSize ( LFA_FileRef fileRef );
+
+ bool ReadHeaderExtensionObject ( LFA_FileRef fileRef, ObjectState& inOutObjectState, const XMP_Uns64& pos, const ASF_ObjectBase& objectBase );
+ static bool WriteHeaderExtensionObject ( const std::string& buffer, std::string* header, const ASF_ObjectBase& objectBase, const int reservePadding );
+
+ static bool CreatePaddingObject ( std::string* header, const XMP_Uns64 size );
+
+ static bool WriteXMPObject ( LFA_FileRef fileRef, XMP_Uns32 len, const char* inBuffer );
+ static bool UpdateXMPObject ( LFA_FileRef fileRef, const ObjectData& object, XMP_Uns32 len, const char * inBuffer );
+ static bool CopyObject ( LFA_FileRef sourceRef, LFA_FileRef destRef, const ObjectData& object );
+
+ static bool ReadBuffer ( LFA_FileRef fileRef, XMP_Uns64 & pos, XMP_Uns64 len, char * outBuffer );
+ static bool WriteBuffer ( LFA_FileRef fileRef, XMP_Uns64 & pos, XMP_Uns32 len, const char * inBuffer );
+
+private:
+
+ ASF_LegacyManager* legacyManager;
+ XMP_Uns64 posFileSizeInfo;
+
+ static std::string ReplaceString ( std::string& operand, std::string& str, int offset, int count );
+
+}; // class ASF_Support
+
+// =================================================================================================
+
+#endif // __ASF_Support_hpp__
diff --git a/source/XMPFiles/FormatSupport/ID3_Support.cpp b/source/XMPFiles/FormatSupport/ID3_Support.cpp
index 793f925..ee8c008 100644
--- a/source/XMPFiles/FormatSupport/ID3_Support.cpp
+++ b/source/XMPFiles/FormatSupport/ID3_Support.cpp
@@ -1,6 +1,6 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -8,6 +8,8 @@
// =================================================================================================
#include "XMP_Environment.h" // ! This must be the first include.
+#if ! XMP_UNIXBuild // Closes at very bottom. Disabled on UNIX until legacy-as-local is fixed.
+
#include "XMP_Const.h"
#include "ID3_Support.hpp"
@@ -15,6 +17,8 @@
#include "UnicodeConversions.hpp"
#include "Reconcile_Impl.hpp"
+#include <stdio.h>
+
#if XMP_WinBuild
#pragma warning ( disable : 4996 ) // '...' was declared deprecated
#endif
@@ -164,7 +168,7 @@ namespace ID3_Support {
static bool GetFrameInfo(LFA_FileRef inFileRef, XMP_Uns8 bVersion, char *strFrameID, XMP_Uns8 &cflag1, XMP_Uns8 &cflag2, unsigned long &dwSize);
static bool ReadSize(LFA_FileRef inFileRef, XMP_Uns8 bVersion, unsigned long &dwSize);
static unsigned long CalculateSize(XMP_Uns8 bVersion, unsigned long dwSizeIn);
- static bool LoadTagHeaderAndUnknownFrames(LFA_FileRef inFileRef, char *strBuffer, bool fRecon, unsigned long &posPad);
+ static bool LoadTagHeaderAndUnknownFrames(LFA_FileRef inFileRef, char *strBuffer, size_t strBufferLen, bool fRecon, unsigned long &posPad);
#define GetFilePosition(file) LFA_Seek ( file, 0, SEEK_CUR )
@@ -293,6 +297,8 @@ bool FindFrame ( LFA_FileRef inFileRef, char* strFrame, XMP_Int64 & posFrame, un
while ( posCur < posEnd ) {
+ if ( (posEnd - posCur) < k_dwTagHeaderSize ) break; // Not enough room for a header, must be padding.
+
char szFrameID[5] = {"xxxx"};
unsigned long dwFrameSize = 0;
XMP_Uns8 cflag1 = 0, cflag2 = 0;
@@ -380,7 +386,7 @@ bool GetFrameData ( LFA_FileRef inFileRef, char* strFrame, char* buffer, unsigne
unsigned long dwOffset = 3; // Skip the 3 byte language code.
if ( (bEncoding == 0) || (bEncoding == 3) ) {
- dwOffset += (strlen ( &strData[3] ) + 1); // Skip the descriptor and nul.
+ dwOffset += (unsigned long)(strlen ( &strData[3] ) + 1); // Skip the descriptor and nul.
} else {
UTF16Unit* u16Ptr = (UTF16Unit*) (&strData[3]);
for ( ; *u16Ptr != 0; ++u16Ptr ) dwOffset += 2; // Skip the descriptor.
@@ -518,7 +524,7 @@ bool AddXMPTagToID3Buffer ( char * strCur, unsigned long * pdwCurOffset, unsigne
snprintf ( strGenre, sizeof(strGenre), "(%d)", iFound ); // AUDIT: Using sizeof(strGenre) is safe.
strXMPTag = strGenre;
- dwXMPLength = strlen(strXMPTag);
+ dwXMPLength = (long)strlen(strXMPTag);
}
@@ -535,13 +541,13 @@ bool AddXMPTagToID3Buffer ( char * strCur, unsigned long * pdwCurOffset, unsigne
bEncoding = 1; // Will convert to UTF-16 later.
} else {
strXMPTag = tempLatin1.c_str(); // Use the Latin-1 encoding for output.
- dwXMPLength = tempLatin1.size();
+ dwXMPLength = (long)tempLatin1.size();
}
std::string strUTF16;
if ( bEncoding == 1 ) {
ToUTF16 ( (UTF8Unit*)strXMPTag, dwXMPLength, &strUTF16, false /* little endian */ );
- dwXMPLength = strUTF16.size() + 2; // ! Include the (to be inserted) BOM in the count.
+ dwXMPLength = (long)strUTF16.size() + 2; // ! Include the (to be inserted) BOM in the count.
}
// Frame Structure
@@ -737,7 +743,7 @@ bool SetMetaData ( LFA_FileRef inFileRef, char* strXMPPacket, unsigned long dwXM
return false;
}
- LoadTagHeaderAndUnknownFrames ( inFileRef, szID3Buffer, fRecon, id3BufferLen );
+ LoadTagHeaderAndUnknownFrames ( inFileRef, szID3Buffer, sizeof(szID3Buffer), fRecon, id3BufferLen );
unsigned long spareLen = (k_dwFrameHeaderSize + dwOldID3ContentSize) - id3BufferLen;
@@ -812,7 +818,7 @@ bool SetMetaData ( LFA_FileRef inFileRef, char* strXMPPacket, unsigned long dwXM
// =================================================================================================
-bool LoadTagHeaderAndUnknownFrames ( LFA_FileRef inFileRef, char * strBuffer, bool fRecon, unsigned long & posPad )
+bool LoadTagHeaderAndUnknownFrames ( LFA_FileRef inFileRef, char * strBuffer, size_t strBufferLen, bool fRecon, unsigned long & posPad )
{
LFA_Seek ( inFileRef, 3ULL, SEEK_SET ); // Point after the "ID3"
@@ -826,6 +832,7 @@ bool LoadTagHeaderAndUnknownFrames ( LFA_FileRef inFileRef, char * strBuffer, bo
unsigned long dwExtendedTag = SkipExtendedHeader ( inFileRef, v1, flags );
LFA_Seek ( inFileRef, 0ULL, SEEK_SET );
+ XMP_Assert ( strBufferLen >= k_dwTagHeaderSize );
LFA_Read ( inFileRef, strBuffer, k_dwTagHeaderSize );
dwOffset += k_dwTagHeaderSize;
@@ -841,6 +848,9 @@ bool LoadTagHeaderAndUnknownFrames ( LFA_FileRef inFileRef, char * strBuffer, bo
XMP_Int64 posEnd = posCur + dwTagSize;
while ( posCur < posEnd ) {
+
+ XMP_Assert ( k_dwTagHeaderSize == 10 );
+ if ( (posEnd - posCur) < k_dwTagHeaderSize ) break; // Not enough room for a header, must be padding.
char szFrameID[5] = {"xxxx"};
unsigned long dwFrameSize = 0;
@@ -890,7 +900,10 @@ bool LoadTagHeaderAndUnknownFrames ( LFA_FileRef inFileRef, char * strBuffer, bo
} else {
// Unknown frame, let's copy it
LFA_Seek ( inFileRef, -(long)k_dwFrameHeaderSize, SEEK_CUR );
- LFA_Read ( inFileRef, strBuffer+dwOffset, dwFrameSize+k_dwFrameHeaderSize );
+ if ( (dwOffset > strBufferLen) || ((dwFrameSize + k_dwFrameHeaderSize) > (strBufferLen - dwOffset)) ) {
+ XMP_Throw ( "Avoiding I/O buffer overflow", kXMPErr_InternalFailure );
+ }
+ LFA_Read ( inFileRef, (strBuffer + dwOffset), (dwFrameSize + k_dwFrameHeaderSize) );
dwOffset += dwFrameSize+k_dwFrameHeaderSize;
}
@@ -984,6 +997,8 @@ static bool FindXMPFrame ( LFA_FileRef inFileRef, XMP_Int64 & posXMP, XMP_Int64
while ( posCur < posEnd ) {
+ if ( (posEnd - posCur) < k_dwTagHeaderSize ) break; // Not enough room for a header, must be padding.
+
char szFrameID[5] = {"xxxx"};
unsigned long dwFrameSize = 0;
XMP_Uns8 cflag1 = 0, cflag2 = 0;
@@ -1135,3 +1150,7 @@ static unsigned long CalculateSize ( XMP_Uns8 bVersion, unsigned long dwSizeIn )
}
} // namespace ID3_Support
+
+// =================================================================================================
+
+#endif // XMP_UNIXBuild
diff --git a/source/XMPFiles/FormatSupport/ID3_Support.hpp b/source/XMPFiles/FormatSupport/ID3_Support.hpp
index 17970cc..975ccf4 100644
--- a/source/XMPFiles/FormatSupport/ID3_Support.hpp
+++ b/source/XMPFiles/FormatSupport/ID3_Support.hpp
@@ -11,6 +11,7 @@
// =================================================================================================
#include "XMP_Environment.h" // ! This must be the first include.
+#if ! XMP_UNIXBuild // Closes at very bottom. Disabled on UNIX until legacy-as-local is fixed.
#include <vector>
@@ -36,4 +37,5 @@ namespace ID3_Support
} // namespace ID3_Support
+#endif // XMP_UNIXBuild
#endif // __ID3_Support_hpp__
diff --git a/source/XMPFiles/FormatSupport/IPTC_Support.cpp b/source/XMPFiles/FormatSupport/IPTC_Support.cpp
index e6e80ef..48e0309 100644
--- a/source/XMPFiles/FormatSupport/IPTC_Support.cpp
+++ b/source/XMPFiles/FormatSupport/IPTC_Support.cpp
@@ -1,6 +1,6 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2006-2007 Adobe Systems Incorporated
+// Copyright 2006-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -226,11 +226,11 @@ void IPTC_Manager::ParseMemoryDataSets ( const void* data, XMP_Uns32 length, boo
if ( recNum == 2 ) {
if ( ! foundRec2 ) {
foundRec2 = true;
- this->rec2Offset = dsPtr - this->iptcContent;
+ this->rec2Offset = (XMP_Uns32) (dsPtr - this->iptcContent);
this->rec2Length = this->iptcLength - this->rec2Offset; // ! In case there are no other records.
}
} else {
- this->rec2Length = dsPtr - (this->iptcContent + this->rec2Offset);
+ this->rec2Length = (XMP_Uns32) (dsPtr - (this->iptcContent + this->rec2Offset));
break; // The records are in ascending order, done.
}
@@ -298,7 +298,13 @@ size_t IPTC_Manager::GetDataSet_UTF8 ( XMP_Uns8 id, std::string * utf8Str, size_
if ( this->utf8Encoding ) {
utf8Str->assign ( (char*)dsInfo.dataPtr, dsInfo.dataLen );
} else {
- ReconcileUtils::LocalToUTF8 ( dsInfo.dataPtr, dsInfo.dataLen, utf8Str );
+ #if ! XMP_UNIXBuild
+ ReconcileUtils::LocalToUTF8 ( dsInfo.dataPtr, dsInfo.dataLen, utf8Str );
+ #else
+ // ! Hack until legacy-as-local issues are resolved for generic UNIX.
+ if ( ! ReconcileUtils::IsUTF8 ( dsInfo.dataPtr, dsInfo.dataLen ) ) return 0;
+ utf8Str->assign ( (char*)dsInfo.dataPtr, dsInfo.dataLen );
+ #endif
}
}
@@ -333,6 +339,8 @@ void IPTC_Manager::DisposeLooseValue ( DataSetInfo & dsInfo )
// =================================================================================================
// =================================================================================================
+#if ! XMP_UNIXBuild // ! Disable IPTC output for generic UNIX until the legacy-as-local issues are resolved.
+
// =================================================================================================
// IPTC_Writer::~IPTC_Writer
// =========================
@@ -381,7 +389,7 @@ void IPTC_Writer::SetDataSet_UTF8 ( XMP_Uns8 id, const void* utf8Ptr, XMP_Uns32
// It round-tripped without loss, keep local encoding.
tempPtr = (XMP_Uns8*) localStr.data();
- dataLen = localStr.size();
+ dataLen = (XMP_Uns32)localStr.size();
// } else {
@@ -401,7 +409,7 @@ void IPTC_Writer::SetDataSet_UTF8 ( XMP_Uns8 id, const void* utf8Ptr, XMP_Uns32
// Back up to just before a byte with 11 in the high order 2 bits.
if ( dataLen > knownDS->maxLen ) {
- dataLen = knownDS->maxLen;
+ dataLen = (XMP_Uns32)knownDS->maxLen;
if ( this->utf8Encoding && ((tempPtr[dataLen] >> 6) == 2) ) {
for ( ; (dataLen > 0) && ((tempPtr[dataLen] >> 6) != 3); --dataLen ) {}
}
@@ -591,7 +599,7 @@ XMP_Uns32 IPTC_Writer::UpdateMemoryDataSets ( void** dataPtr )
this->ParseMemoryDataSets ( newContent, newLength, false ); // Don't make another copy of the content.
XMP_Assert ( this->iptcLength == newLength );
- this->ownedContent = true; // We really do own the new content.
+ this->ownedContent = (newLength > 0); // We really do own the new content, if not empty.
// Done.
@@ -700,4 +708,8 @@ bool IPTC_Writer::CheckRoundTripLoss()
} // IPTC_Writer::CheckRoundTripLoss
-#endif
+#endif // Round-trip loss checking
+
+// =================================================================================================
+
+#endif // ! XMP_UNIXBuild
diff --git a/source/XMPFiles/FormatSupport/IPTC_Support.hpp b/source/XMPFiles/FormatSupport/IPTC_Support.hpp
index 11ff28e..25ac9c2 100644
--- a/source/XMPFiles/FormatSupport/IPTC_Support.hpp
+++ b/source/XMPFiles/FormatSupport/IPTC_Support.hpp
@@ -269,6 +269,8 @@ private:
// IPTC_Writer
// ===========
+#if ! XMP_UNIXBuild // ! Disable IPTC output for generic UNIX until the legacy-as-local issues are resolved.
+
class IPTC_Writer : public IPTC_Manager {
public:
@@ -297,6 +299,8 @@ private:
}; // IPTC_Writer
+#endif // ! XMP_UNIXBuild
+
// =================================================================================================
#endif // __IPTC_Support_hpp__
diff --git a/source/XMPFiles/FormatSupport/PNG_Support.cpp b/source/XMPFiles/FormatSupport/PNG_Support.cpp
index ed55dc6..f074729 100644
--- a/source/XMPFiles/FormatSupport/PNG_Support.cpp
+++ b/source/XMPFiles/FormatSupport/PNG_Support.cpp
@@ -6,8 +6,8 @@
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
// of the Adobe license agreement accompanying it.
// =================================================================================================
-
#include "PNG_Support.hpp"
+#include <string.h>
typedef std::basic_string<unsigned char> filebuffer;
@@ -114,7 +114,7 @@ namespace PNG_Support
// read first and following chunks
while ( ReadChunk ( fileRef, inOutChunkState, &name, &len, pos) ) {}
- return inOutChunkState.chunks.size();
+ return (long)inOutChunkState.chunks.size();
}
diff --git a/source/XMPFiles/FormatSupport/PSIR_FileWriter.cpp b/source/XMPFiles/FormatSupport/PSIR_FileWriter.cpp
index c1acfdf..f8e6290 100644
--- a/source/XMPFiles/FormatSupport/PSIR_FileWriter.cpp
+++ b/source/XMPFiles/FormatSupport/PSIR_FileWriter.cpp
@@ -1,6 +1,6 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2006-2007 Adobe Systems Incorporated
+// Copyright 2006-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -10,6 +10,8 @@
#include "PSIR_Support.hpp"
#include "EndianUtils.hpp"
+#include <string.h>
+
// =================================================================================================
/// \file PSIR_FileWriter.cpp
/// \brief Implementation of the file-based or read-write form of PSIR_Manager.
@@ -64,7 +66,8 @@ void PSIR_FileWriter::DeleteExistingInfo()
this->memContent = 0;
this->memLength = 0;
- this->changed = false;
+ this->changed = false;
+ this->legacyDeleted = false;
this->memParsed = false;
this->fileParsed = false;
this->ownedContent = false;
@@ -74,10 +77,6 @@ void PSIR_FileWriter::DeleteExistingInfo()
// =================================================================================================
// PSIR_FileWriter::~PSIR_FileWriter
// =================================
-//
-// The InternalRsrcInfo destructor will deallocate the data for changed image resources. It does not
-// know whether they are memory-parsed or file-parsed though, so it won't deallocate captured but
-// unchanged file-parsed resources. Mark those as changed to make the destructor deallocate them.
PSIR_FileWriter::~PSIR_FileWriter()
{
@@ -87,15 +86,6 @@ PSIR_FileWriter::~PSIR_FileWriter()
XMP_Assert ( this->memContent != 0 );
free ( this->memContent );
}
-
- if ( this->fileParsed ) {
- InternalRsrcMap::iterator irPos = this->imgRsrcs.begin();
- InternalRsrcMap::iterator irEnd = this->imgRsrcs.end();
- for ( ; irPos != irEnd; ++irPos ) {
- if ( irPos->second.dataPtr != 0 ) irPos->second.changed = true;
- }
- }
-
} // PSIR_FileWriter::~PSIR_FileWriter
@@ -127,35 +117,35 @@ bool PSIR_FileWriter::GetImgRsrc ( XMP_Uns16 id, ImgRsrcInfo* info ) const
void PSIR_FileWriter::SetImgRsrc ( XMP_Uns16 id, const void* clientPtr, XMP_Uns32 length )
{
+ InternalRsrcInfo* rsrcPtr = 0;
InternalRsrcMap::iterator rsrcPos = this->imgRsrcs.find ( id );
-
- if ( (rsrcPos != this->imgRsrcs.end()) &&
- (length == rsrcPos->second.dataLen) &&
- (memcmp ( rsrcPos->second.dataPtr, clientPtr, length ) == 0) ) {
- return; // ! The value is unchanged, exit.
- }
-
- void* dataPtr = malloc ( length );
- if ( dataPtr == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory );
- memcpy ( dataPtr, clientPtr, length ); // AUDIT: Safe, malloc'ed length bytes above.
if ( rsrcPos == this->imgRsrcs.end() ) {
// This resource is not yet in the map, create the map entry.
- InternalRsrcInfo newRsrc ( id, length, dataPtr, (XMP_Uns32)(-1) );
- newRsrc.changed = true;
- this->imgRsrcs[id] = newRsrc;
-
- } else {
-
- // This resource is in the map, update the existing map entry.
- InternalRsrcInfo* rsrcInfo = &rsrcPos->second;
- if ( rsrcInfo->changed && (rsrcInfo->dataPtr != 0) ) free ( rsrcInfo->dataPtr );
- rsrcInfo->dataPtr = dataPtr;
- rsrcInfo->dataLen = length;
- rsrcInfo->changed = true;
+ InternalRsrcMap::value_type mapValue ( id, InternalRsrcInfo ( id, length, this->fileParsed ) );
+ rsrcPos = this->imgRsrcs.insert ( rsrcPos, mapValue );
+ rsrcPtr = &rsrcPos->second;
+ } else {
+
+ rsrcPtr = &rsrcPos->second;
+
+ // The resource already exists, make sure the value is actually changing.
+ if ( (length == rsrcPtr->dataLen) &&
+ (memcmp ( rsrcPtr->dataPtr, clientPtr, length ) == 0) ) {
+ return;
+ }
+
+ rsrcPtr->FreeData(); // Release any existing data allocation.
+ rsrcPtr->dataLen = length; // And this might be changing.
+
}
+
+ rsrcPtr->changed = true;
+ rsrcPtr->dataPtr = malloc ( length );
+ if ( rsrcPtr->dataPtr == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory );
+ memcpy ( rsrcPtr->dataPtr, clientPtr, length ); // AUDIT: Safe, malloc'ed length bytes above.
this->changed = true;
@@ -172,6 +162,7 @@ void PSIR_FileWriter::DeleteImgRsrc ( XMP_Uns16 id )
this->imgRsrcs.erase ( id );
this->changed = true;
+ if ( id != kPSIR_XMP ) this->legacyDeleted = true;
} // PSIR_FileWriter::DeleteImgRsrc
@@ -183,6 +174,7 @@ bool PSIR_FileWriter::IsLegacyChanged()
{
if ( ! this->changed ) return false;
+ if ( this->legacyDeleted ) return true;
InternalRsrcMap::iterator irPos = this->imgRsrcs.begin();
InternalRsrcMap::iterator irEnd = this->imgRsrcs.end();
@@ -242,18 +234,21 @@ void PSIR_FileWriter::ParseMemoryResources ( const void* data, XMP_Uns32 length,
XMP_Uns32 dataLen = GetUns32BE(psirPtr);
psirPtr += 4; // Advance to the resource data.
- XMP_Uns32 dataOffset = psirPtr - this->memContent;
+ XMP_Uns32 dataOffset = (XMP_Uns32) ( psirPtr - this->memContent );
XMP_Uns8* nextRsrc = psirPtr + ((dataLen + 1) & 0xFFFFFFFEUL); // ! Round up to an even offset.
if ( (dataLen > length) || (psirPtr > psirEnd-dataLen) ) break; // Bad image resource. Throw instead?
if ( type == k8BIM ) {
- InternalRsrcInfo newRsrc ( id, dataLen, psirPtr, dataOffset );
- this->imgRsrcs[id] = newRsrc;
- if ( nameLen != 0 ) this->imgRsrcs[id].rsrcName = namePtr;
+ InternalRsrcMap::value_type mapValue ( id, InternalRsrcInfo ( id, dataLen, kIsMemoryBased ) );
+ InternalRsrcMap::iterator rsrcPos = this->imgRsrcs.insert ( this->imgRsrcs.end(), mapValue );
+ InternalRsrcInfo* rsrcPtr = &rsrcPos->second;
+ rsrcPtr->dataPtr = psirPtr;
+ rsrcPtr->origOffset = dataOffset;
+ if ( nameLen != 0 ) rsrcPtr->rsrcName = namePtr;
} else {
- XMP_Uns32 rsrcOffset = origin - this->memContent;
- XMP_Uns32 rsrcLength = nextRsrc - origin; // Includes trailing pad.
+ XMP_Uns32 rsrcOffset = XMP_Uns32( origin - this->memContent );
+ XMP_Uns32 rsrcLength = XMP_Uns32( nextRsrc - origin ); // Includes trailing pad.
XMP_Assert ( (rsrcLength & 1) == 0 );
this->otherRsrcs.push_back ( OtherRsrcInfo ( rsrcOffset, rsrcLength ) );
}
@@ -282,9 +277,10 @@ void PSIR_FileWriter::ParseFileResources ( LFA_FileRef fileRef, XMP_Uns32 length
ioBuf.filePos = LFA_Seek ( fileRef, 0, SEEK_CUR );
XMP_Int64 psirOrigin = ioBuf.filePos; // Need this to determine the resource data offsets.
-
XMP_Int64 fileEnd = ioBuf.filePos + length;
+ std::string rsrcPName;
+
while ( (ioBuf.filePos + (ioBuf.ptr - ioBuf.data)) < fileEnd ) {
ok = CheckFileSpace ( fileRef, &ioBuf, 12 ); // The minimal image resource takes 12 bytes.
@@ -296,12 +292,14 @@ void PSIR_FileWriter::ParseFileResources ( LFA_FileRef fileRef, XMP_Uns32 length
XMP_Uns16 id = GetUns16BE(ioBuf.ptr+4);
ioBuf.ptr += 6; // Advance to the resource name.
- XMP_Uns16 nameLen = ioBuf.ptr[0]; // ! The length for the Pascal string, w/ room for "+2".
- nameLen = (nameLen + 2) & 0xFFFE; // ! Round up to an even total. Yes, +2!
- ok = CheckFileSpace ( fileRef, &ioBuf, nameLen+4 ); // Get the name and data length.
+ XMP_Uns16 nameLen = ioBuf.ptr[0]; // ! The length for the Pascal string.
+ XMP_Uns16 paddedLen = (nameLen + 2) & 0xFFFE; // ! Round up to an even total. Yes, +2!
+ ok = CheckFileSpace ( fileRef, &ioBuf, paddedLen+4 ); // Get the name text and the data length.
if ( ! ok ) break; // Bad image resource. Throw instead?
+
+ if ( nameLen > 0 ) rsrcPName.assign ( (char*)(ioBuf.ptr), paddedLen ); // ! Include the length byte and pad.
- ioBuf.ptr += nameLen; // Move to the data length.
+ ioBuf.ptr += paddedLen; // Move to the data length.
XMP_Uns32 dataLen = GetUns32BE(ioBuf.ptr);
XMP_Uns32 dataTotal = ((dataLen + 1) & 0xFFFFFFFEUL); // Round up to an even total.
ioBuf.ptr += 4; // Advance to the resource data.
@@ -316,39 +314,37 @@ void PSIR_FileWriter::ParseFileResources ( LFA_FileRef fileRef, XMP_Uns32 length
continue;
}
- InternalRsrcInfo newRsrc ( id, dataLen, 0, (XMP_Uns32)thisDataPos );
- this->imgRsrcs[id] = newRsrc;
+ InternalRsrcMap::value_type mapValue ( id, InternalRsrcInfo ( id, dataLen, kIsFileBased ) );
+ InternalRsrcMap::iterator newRsrc = this->imgRsrcs.insert ( this->imgRsrcs.end(), mapValue );
+ InternalRsrcInfo* rsrcPtr = &newRsrc->second;
+
+ rsrcPtr->origOffset = (XMP_Uns32)thisDataPos;
+
+ if ( nameLen > 0 ) {
+ rsrcPtr->rsrcName = (XMP_Uns8*) malloc ( paddedLen );
+ if ( rsrcPtr->rsrcName == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory );
+ memcpy ( (void*)rsrcPtr->rsrcName, rsrcPName.c_str(), paddedLen ); // AUDIT: Safe, allocated enough bytes above.
+ }
if ( ! IsMetadataImgRsrc ( id ) ) {
MoveToOffset ( fileRef, nextRsrcPos, &ioBuf );
continue;
}
- newRsrc.dataPtr = malloc ( dataLen );
- if ( newRsrc.dataPtr == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory );
-
- try {
-
- if ( dataTotal <= kIOBufferSize ) {
- // The image resource data fits within the I/O buffer.
- ok = CheckFileSpace ( fileRef, &ioBuf, dataTotal );
- if ( ! ok ) break; // Bad image resource. Throw instead?
- memcpy ( (void*)newRsrc.dataPtr, ioBuf.ptr, dataLen ); // AUDIT: Safe, malloc'ed dataLen bytes above.
- ioBuf.ptr += dataTotal; // ! Add the rounded length.
- } else {
- // The image resource data is bigger than the I/O buffer.
- LFA_Seek ( fileRef, (ioBuf.filePos + (ioBuf.ptr - ioBuf.data)), SEEK_SET );
- LFA_Read ( fileRef, (void*)newRsrc.dataPtr, dataLen );
- FillBuffer ( fileRef, nextRsrcPos, &ioBuf );
- }
-
- this->imgRsrcs[id].dataPtr = newRsrc.dataPtr;
-
- } catch ( ... ) {
-
- free ( (void*)newRsrc.dataPtr );
- throw;
+ rsrcPtr->dataPtr = malloc ( dataLen ); // ! Allocate after the IsMetadataImgRsrc check.
+ if ( rsrcPtr->dataPtr == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory );
+ if ( dataTotal <= kIOBufferSize ) {
+ // The image resource data fits within the I/O buffer.
+ ok = CheckFileSpace ( fileRef, &ioBuf, dataTotal );
+ if ( ! ok ) break; // Bad image resource. Throw instead?
+ memcpy ( (void*)rsrcPtr->dataPtr, ioBuf.ptr, dataLen ); // AUDIT: Safe, malloc'ed dataLen bytes above.
+ ioBuf.ptr += dataTotal; // ! Add the rounded length.
+ } else {
+ // The image resource data is bigger than the I/O buffer.
+ LFA_Seek ( fileRef, (ioBuf.filePos + (ioBuf.ptr - ioBuf.data)), SEEK_SET );
+ LFA_Read ( fileRef, (void*)rsrcPtr->dataPtr, dataLen );
+ FillBuffer ( fileRef, nextRsrcPos, &ioBuf );
}
}
@@ -461,7 +457,7 @@ XMP_Uns32 PSIR_FileWriter::UpdateMemoryResources ( void** dataPtr )
// Parse the rebuilt image resource block. This is the easiest way to reconstruct the map.
this->ParseMemoryResources ( newContent, newLength, false );
- this->ownedContent = true; // ! We really do own it.
+ this->ownedContent = (newLength > 0); // ! We really do own the new content, if not empty.
if ( dataPtr != 0 ) *dataPtr = newContent;
return newLength;
@@ -476,16 +472,15 @@ XMP_Uns32 PSIR_FileWriter::UpdateFileResources ( LFA_FileRef sourceRef, LFA_File
IOBuffer * ioBuf, XMP_AbortProc abortProc, void * abortArg )
{
IgnoreParam(ioBuf);
+ const XMP_Uns32 zero32 = 0;
const bool checkAbort = (abortProc != 0);
struct RsrcHeader {
XMP_Uns32 type;
XMP_Uns16 id;
- XMP_Uns16 name;
- XMP_Uns32 dataLen;
};
- XMP_Assert ( sizeof(RsrcHeader) == 12 );
+ XMP_Assert ( (offsetof(RsrcHeader,type) == 0) && (offsetof(RsrcHeader,id) == 4) );
if ( this->memParsed ) XMP_Throw ( "Not file based", kXMPErr_EnforceFailure );
@@ -509,12 +504,10 @@ XMP_Uns32 PSIR_FileWriter::UpdateFileResources ( LFA_FileRef sourceRef, LFA_File
#endif
// First write all of the '8BIM' resources from the map. Use the internal data if present, else
- // copy the data from the file. We don't preserve names for these resources, but then Photoshop
- // itself tosses out all resource names and has no plans to ever support them.
+ // copy the data from the file.
- RsrcHeader outRsrc;
- outRsrc.type = MakeUns32BE ( k8BIM );
- outRsrc.name = 0;
+ RsrcHeader outHeader;
+ outHeader.type = MakeUns32BE ( k8BIM );
InternalRsrcMap::iterator rsrcPos = this->imgRsrcs.begin();
InternalRsrcMap::iterator rsrcEnd = this->imgRsrcs.end();
@@ -524,9 +517,23 @@ XMP_Uns32 PSIR_FileWriter::UpdateFileResources ( LFA_FileRef sourceRef, LFA_File
InternalRsrcInfo& currRsrc = rsrcPos->second;
- outRsrc.id = MakeUns16BE ( currRsrc.id );
- outRsrc.dataLen = MakeUns32BE ( currRsrc.dataLen );
- LFA_Write ( destRef, &outRsrc, sizeof(RsrcHeader) );
+ outHeader.id = MakeUns16BE ( currRsrc.id );
+ LFA_Write ( destRef, &outHeader, 6 );
+ destLength += 6;
+
+ if ( currRsrc.rsrcName == 0 ) {
+ LFA_Write ( destRef, &zero32, 2 );
+ destLength += 2;
+ } else {
+ XMP_Assert ( currRsrc.rsrcName[0] != 0 );
+ XMP_Uns16 nameLen = currRsrc.rsrcName[0]; // ! Include room for +1.
+ XMP_Uns16 paddedLen = (nameLen + 2) & 0xFFFE; // ! Round up to an even total. Yes, +2!
+ LFA_Write ( destRef, currRsrc.rsrcName, paddedLen );
+ destLength += paddedLen;
+ }
+
+ XMP_Uns32 dataLen = MakeUns32BE ( currRsrc.dataLen );
+ LFA_Write ( destRef, &dataLen, 4 );
// printf ( " #%d, offset %d (0x%X), dataLen %d\n", currRsrc.id, destLength, destLength, currRsrc.dataLen );
if ( currRsrc.dataPtr != 0 ) {
@@ -536,10 +543,10 @@ XMP_Uns32 PSIR_FileWriter::UpdateFileResources ( LFA_FileRef sourceRef, LFA_File
LFA_Copy ( sourceRef, destRef, currRsrc.dataLen );
}
- destLength += sizeof(RsrcHeader) + currRsrc.dataLen;
+ destLength += 4 + currRsrc.dataLen;
if ( (currRsrc.dataLen & 1) != 0 ) {
- LFA_Write ( destRef, &outRsrc.name, 1 ); // ! The name contains zero.
+ LFA_Write ( destRef, &zero32, 1 ); // ! Pad the data to an even length.
++destLength;
}
diff --git a/source/XMPFiles/FormatSupport/PSIR_MemoryReader.cpp b/source/XMPFiles/FormatSupport/PSIR_MemoryReader.cpp
index 027162c..592f3e2 100644
--- a/source/XMPFiles/FormatSupport/PSIR_MemoryReader.cpp
+++ b/source/XMPFiles/FormatSupport/PSIR_MemoryReader.cpp
@@ -10,6 +10,8 @@
#include "PSIR_Support.hpp"
#include "EndianUtils.hpp"
+#include <string.h>
+
// =================================================================================================
/// \file PSIR_MemoryReader.cpp
/// \brief Implementation of the memory-based read-only form of PSIR_Manager.
@@ -79,7 +81,7 @@ void PSIR_MemoryReader::ParseMemoryResources ( const void* data, XMP_Uns32 lengt
XMP_Uns32 dataLen = GetUns32BE(psirPtr);
psirPtr += 4; // Advance to the resource data.
- XMP_Uns32 psirOffset = psirPtr - this->psirContent;
+ XMP_Uns32 psirOffset = (XMP_Uns32) (psirPtr - this->psirContent);
if ( (dataLen > length) || (psirPtr > psirEnd-dataLen) ) break; // Bad image resource. Throw instead?
diff --git a/source/XMPFiles/FormatSupport/PSIR_Support.hpp b/source/XMPFiles/FormatSupport/PSIR_Support.hpp
index 91d064b..a651bef 100644
--- a/source/XMPFiles/FormatSupport/PSIR_Support.hpp
+++ b/source/XMPFiles/FormatSupport/PSIR_Support.hpp
@@ -3,7 +3,7 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2006-2007 Adobe Systems Incorporated
+// Copyright 2006-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -187,6 +187,10 @@ public:
private:
+ // Memory usage notes: PSIR_MemoryReader is for memory-based read-only usage (both apply). There
+ // is no need to ever allocate separate blocks of memory, everything is used directly from the
+ // PSIR stream.
+
bool ownedContent;
XMP_Uns32 psirLength;
@@ -229,33 +233,63 @@ public:
XMP_Uns32 UpdateFileResources ( LFA_FileRef sourceRef, LFA_FileRef destRef,
IOBuffer * ioBuf, XMP_AbortProc abortProc, void * abortArg );
- PSIR_FileWriter() : changed(false), memParsed(false), fileParsed(false),
+ PSIR_FileWriter() : changed(false), legacyDeleted(false), memParsed(false), fileParsed(false),
ownedContent(false), memLength(0), memContent(0) {};
virtual ~PSIR_FileWriter();
+ // Memory usage notes: PSIR_FileWriter is for file-based OR read/write usage. For memory-based
+ // streams the dataPtr and rsrcName are initially into the stream, they become a separate
+ // allocation if changed. For file-based streams they are always a separate allocation.
+
+ // ! The working data values are always big endian, no matter where stored. It is the client's
+ // ! responsibility to flip them as necessary.
+
+ static const bool kIsFileBased = true; // For use in the InternalRsrcInfo constructor.
+ static const bool kIsMemoryBased = false;
+
struct InternalRsrcInfo {
+ public:
+
bool changed;
+ bool fileBased;
XMP_Uns16 id;
XMP_Uns32 dataLen;
- void* dataPtr; // ! The data is read-only! Null if the value is not captured!
+ void* dataPtr; // ! Null if the value is not captured!
XMP_Uns32 origOffset; // The offset (at parse time) of the resource data.
- XMP_Uns8* rsrcName; // ! A Pascal string. Only in the map for memory-based resources.
- InternalRsrcInfo() : changed(false), id(0), dataLen(0), dataPtr(0), origOffset(0), rsrcName(0) {};
- InternalRsrcInfo ( XMP_Uns16 _id, XMP_Uns32 _dataLen, void* _dataPtr, XMP_Uns32 _origOffset )
- : changed(false), id(_id), dataLen(_dataLen), dataPtr(_dataPtr), origOffset(_origOffset), rsrcName(0) {};
- ~InternalRsrcInfo()
- {
- if ( this->changed && (this->dataPtr != 0) ) free ( this->dataPtr );
- };
+ XMP_Uns8* rsrcName; // ! A Pascal string, leading length byte, no nul terminator!
+
+ inline void FreeData() {
+ if ( this->fileBased || this->changed ) {
+ if ( this->dataPtr != 0 ) { free ( this->dataPtr ); this->dataPtr = 0; }
+ }
+ }
+
+ inline void FreeName() {
+ if ( this->fileBased || this->changed ) {
+ if ( this->rsrcName != 0 ) { free ( this->rsrcName ); this->rsrcName = 0; }
+ }
+ }
+
+ InternalRsrcInfo ( XMP_Uns16 _id, XMP_Uns32 _dataLen, bool _fileBased )
+ : changed(false), fileBased(_fileBased), id(_id), dataLen(_dataLen), dataPtr(0),
+ origOffset(0), rsrcName(0) {};
+ ~InternalRsrcInfo() { this->FreeData(); this->FreeName(); };
+
void operator= ( const InternalRsrcInfo & in )
- { // ! Hack to transfer ownership of the data block.
- this->changed = in.changed;
- this->id = in.id;
- this->dataLen = in.dataLen; this->dataPtr = in.dataPtr;
- this->origOffset = in.origOffset; this->rsrcName = in.rsrcName;
- *((void**)&in.dataPtr) = 0;
+ {
+ // ! Gag! Transfer ownership of the dataPtr and rsrcName!
+ this->FreeData();
+ memcpy ( this, &in, sizeof(*this) ); // AUDIT: Use of sizeof(InternalRsrcInfo) is safe.
+ *((void**)&in.dataPtr) = 0; // The pointer is now owned by "this".
+ *((void**)&in.rsrcName) = 0; // The pointer is now owned by "this".
};
+
+ private:
+
+ InternalRsrcInfo() // Hidden on purpose, fileBased must be properly set.
+ : changed(false), fileBased(false), id(0), dataLen(0), dataPtr(0), origOffset(0), rsrcName(0) {};
+
};
// The origOffset is the absolute file offset for file parses, the memory block offset for
@@ -263,7 +297,7 @@ public:
private:
- bool changed;
+ bool changed, legacyDeleted;
bool memParsed, fileParsed;
bool ownedContent;
diff --git a/source/XMPFiles/FormatSupport/QuickTime_Support.cpp b/source/XMPFiles/FormatSupport/QuickTime_Support.cpp
index 259a9dc..8ba1221 100644
--- a/source/XMPFiles/FormatSupport/QuickTime_Support.cpp
+++ b/source/XMPFiles/FormatSupport/QuickTime_Support.cpp
@@ -1,6 +1,6 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -8,6 +8,8 @@
// =================================================================================================
#include "XMP_Environment.h"
+#if ! ( XMP_64 || XMP_UNIXBuild) // Closes at very bottom.
+
#include "QuickTime_Support.hpp"
#if XMP_MacBuild
@@ -24,10 +26,15 @@ namespace QuickTime_Support
// =============================================================================================
- bool MainInitialize()
+ bool MainInitialize ( bool ignoreInit )
{
OSStatus err = noErr;
-
+
+ if ( ignoreInit ) {
+ sMainInitOK = true;
+ return true;
+ }
+
#if XMP_WinBuild
err = ::InitializeQTML ( 0 );
#endif
@@ -41,8 +48,11 @@ namespace QuickTime_Support
// =============================================================================================
- void MainTerminate()
+ void MainTerminate ( bool ignoreInit )
{
+
+ if ( ignoreInit ) return;
+
::ExitMovies();
#if XMP_WinBuild
@@ -77,3 +87,5 @@ namespace QuickTime_Support
} // ThreadTerminate
} // namespace QuickTime_Support
+
+#endif
diff --git a/source/XMPFiles/FormatSupport/QuickTime_Support.hpp b/source/XMPFiles/FormatSupport/QuickTime_Support.hpp
index fc265ab..24f903d 100644
--- a/source/XMPFiles/FormatSupport/QuickTime_Support.hpp
+++ b/source/XMPFiles/FormatSupport/QuickTime_Support.hpp
@@ -10,18 +10,20 @@
// of the Adobe license agreement accompanying it.
// =================================================================================================
-#include "XMP_Environment.h" // ! This must be the first include.
+#include "XMP_Environment.h" // ! This must be the first include.
+#if ! ( XMP_64 || XMP_UNIXBuild) // Closes at very bottom.
namespace QuickTime_Support
{
extern bool sMainInitOK;
- bool MainInitialize(); // For the main thread.
- void MainTerminate();
+ bool MainInitialize ( bool ignoreInit ); // For the main thread.
+ void MainTerminate ( bool ignoreInit );
bool ThreadInitialize(); // For background threads.
void ThreadTerminate();
} // namespace QuickTime_Support
+#endif // XMP_64 || XMP_UNIXBuild
#endif // __QuickTime_Support_hpp__
diff --git a/source/XMPFiles/FormatSupport/RIFF_Support.cpp b/source/XMPFiles/FormatSupport/RIFF_Support.cpp
index 3b25568..9574119 100644
--- a/source/XMPFiles/FormatSupport/RIFF_Support.cpp
+++ b/source/XMPFiles/FormatSupport/RIFF_Support.cpp
@@ -1,6 +1,6 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -9,6 +9,10 @@
#include "RIFF_Support.hpp"
+#if XMP_WinBuild
+ #pragma warning ( disable : 4996 ) // '...' was declared deprecated
+#endif
+
namespace RIFF_Support {
#define ckidPremierePadding MakeFourCC ('J','U','N','Q')
@@ -27,7 +31,7 @@ namespace RIFF_Support {
} atag;
// Local function declarations
- static bool ReadTag ( LFA_FileRef inFileRef, long * outTag, UInt32 * outLength, long * subtype, UInt64 & inOutPosition );
+ static bool ReadTag ( LFA_FileRef inFileRef, long * outTag, UInt32 * outLength, long * subtype, UInt64 & inOutPosition, UInt64 maxOffset );
static void AddTag ( RiffState & inOutRiffState, long tag, UInt32 len, UInt64 & inOutPosition, long parentID, long parentnum, long subtypeID );
static long SubRead ( LFA_FileRef inFileRef, RiffState & inOutRiffState, long parentid, UInt32 parentlen, UInt64 & inOutPosition );
static bool ReadChunk ( LFA_FileRef inFileRef, UInt64 & pos, UInt32 len, char * outBuffer );
@@ -225,6 +229,13 @@ namespace RIFF_Support {
LFA_Seek ( inFileRef, 0, SEEK_END );
pos = GetFilePosition ( inFileRef );
+
+ if ( (pos & 1) == 1 ) {
+ // The file length is odd, need a pad byte.
+ XMP_Uns8 pad = 0;
+ LFA_Write ( inFileRef, &pad, 1 );
+ ++pos;
+ }
if ( avail < len ) {
@@ -283,79 +294,115 @@ namespace RIFF_Support {
UInt64 pos = 0;
long tag, subtype;
UInt32 len;
-
+
+ const XMP_Int64 fileLen = LFA_Measure ( inFileRef );
+ if ( fileLen < 8 ) return 0;
+
LFA_Seek ( inFileRef, 0, SEEK_SET );
- // read first tag (always RIFFtype)
- while ( ReadTag ( inFileRef, &tag, &len, &subtype, pos) ) {
+ while ( ReadTag ( inFileRef, &tag, &len, &subtype, pos, fileLen ) ) {
if ( tag != FOURCC_RIFF ) break;
AddTag ( inOutRiffState, tag, len, pos, 0, 0, subtype );
if ( subtype != 0 ) SubRead ( inFileRef, inOutRiffState, subtype, len, pos );
}
- return inOutRiffState.tags.size();
+ return (long) inOutRiffState.tags.size();
}
// =============================================================================================
- static bool ReadTag ( LFA_FileRef inFileRef, long * outTag, UInt32 * outLength, long * subtype, UInt64 & inOutPosition )
+ static bool ReadTag ( LFA_FileRef inFileRef, long * outTag, UInt32 * outLength, long * subtype, UInt64 & inOutPosition, UInt64 maxOffset )
{
UInt32 realLength;
- try {
+ long bytesRead;
+ bytesRead = LFA_Read ( inFileRef, outTag, 4 );
+ if ( bytesRead != 4 ) return false;
+ *outTag = GetUns32LE ( outTag );
+
+ bytesRead = LFA_Read ( inFileRef, outLength, 4 );
+ if ( bytesRead != 4 ) return false;
+ *outLength = GetUns32LE ( outLength );
+
+ realLength = *outLength;
+ realLength += (realLength & 1); // Round up to an even value.
+
+ inOutPosition = GetFilePosition ( inFileRef ); // The file offset of the data portion.
+ UInt64 maxLength = maxOffset - inOutPosition;
+
+ if ( (inOutPosition > maxOffset) || ((UInt64)(*outLength) > maxLength) ) {
+
+ bool ignoreLastPad = true; // Ignore cases where a final pad byte is missing.
+ UInt64 fileLen = LFA_Measure ( inFileRef );
+ if ( inOutPosition > (maxOffset + 1) ) ignoreLastPad = false;
+ if ( (UInt64)(*outLength) > (maxLength + 1) ) ignoreLastPad = false;
+
+ if ( ! ignoreLastPad ) {
+
+ // Workaround for bad files in the field that have a bad size in the outermost RIFF
+ // chunk. Do a "runtime repair" of cases where the length is too long (beyond EOF).
+ // This handles read-only usage, update usage is repaired (or not) in the handler.
+
+ bool oversizeRIFF = (inOutPosition == 8) && // Is this the initial 'RIFF' chunk?
+ (fileLen >= 8); // Is the file at least of the minimal size?
+
+ if ( ! oversizeRIFF ) {
+ XMP_Throw ( "RIFF tag exceeds maximum length", kXMPErr_BadValue );
+ } else {
+ *outLength = (UInt32)(fileLen) - 8;
+ realLength = *outLength;
+ realLength += (realLength & 1); // Round up to an even value.
+ }
- long bytesRead;
- bytesRead = LFA_Read ( inFileRef, outTag, 4 );
- if ( bytesRead == 0 ) return false;
- *outTag = GetUns32LE ( outTag );
-
- bytesRead = LFA_Read ( inFileRef, outLength, 4 );
- if ( bytesRead == 0 ) return false;
- *outLength = GetUns32LE ( outLength );
-
- realLength = *outLength;
- realLength += (realLength & 1); // round up to words
-
- *subtype = 0;
-
- if ( (*outTag != FOURCC_LIST) && (*outTag != FOURCC_RIFF) ) {
+ }
- inOutPosition = GetFilePosition ( inFileRef );
- UInt64 tempPos = inOutPosition + realLength;
+ }
+
+ *subtype = 0;
+
+ if ( (*outTag != FOURCC_LIST) && (*outTag != FOURCC_RIFF) ) {
+
+ UInt64 tempPos = inOutPosition + realLength;
+ if ( tempPos <= maxOffset ) {
LFA_Seek ( inFileRef, tempPos, SEEK_SET );
+ } else if ( (tempPos == (maxOffset + 1)) && (maxOffset == (UInt64)LFA_Measure(inFileRef)) ) {
+ LFA_Seek ( inFileRef, 0, SEEK_END ); // Hack to tolerate a missing final pad byte.
+ } else {
+ XMP_Throw ( "Bad RIFF offset", kXMPErr_BadValue );
+ }
- } else {
+ } else {
- bytesRead = LFA_Read ( inFileRef, subtype, 4 );
- if ( bytesRead == 0 ) return false;
- *subtype = GetUns32LE ( subtype );
+ bytesRead = LFA_Read ( inFileRef, subtype, 4 );
+ if ( bytesRead != 4 ) return false;
+ *subtype = GetUns32LE ( subtype );
- *outLength -= 4;
- realLength -= 4;
-
- // Special case:
- // Since the 'movi' chunk can contain billions of subchunks, skip over the 'movi' subchunk.
- //
- // The 'movi' subtype is added to the list as the TAG.
- // The subtype is returned empty so nobody will try to parse the subchunks.
+ *outLength -= 4;
+ realLength -= 4;
- if ( *subtype == listtypeAVIMOVIE ) {
- inOutPosition = GetFilePosition ( inFileRef );
- UInt64 tempPos = inOutPosition + realLength;
- LFA_Seek ( inFileRef, tempPos, SEEK_SET );
- *outLength += 4;
- *outTag = *subtype;
- *subtype = 0;
- }
+ // Special case:
+ // Since the 'movi' chunk can contain billions of subchunks, skip over the 'movi' subchunk.
+ //
+ // The 'movi' subtype is added to the list as the TAG.
+ // The subtype is returned empty so nobody will try to parse the subchunks.
+ if ( *subtype == listtypeAVIMOVIE ) {
inOutPosition = GetFilePosition ( inFileRef );
-
+ UInt64 tempPos = inOutPosition + realLength;
+ if ( tempPos <= maxOffset ) {
+ LFA_Seek ( inFileRef, tempPos, SEEK_SET );
+ } else if ( (tempPos == (maxOffset + 1)) && (maxOffset == (UInt64)LFA_Measure(inFileRef)) ) {
+ LFA_Seek ( inFileRef, 0, SEEK_END ); // Hack to tolerate a missing final pad byte.
+ } else {
+ XMP_Throw ( "Bad RIFF offset", kXMPErr_BadValue );
+ }
+ *outLength += 4;
+ *outTag = *subtype;
+ *subtype = 0;
}
- } catch ( ... ) {
-
- return false;
+ inOutPosition = GetFilePosition ( inFileRef );
}
@@ -396,14 +443,16 @@ namespace RIFF_Support {
UInt64 oldpos;
total = 0;
- parentnum = inOutRiffState.tags.size() - 1;
+ parentnum = (long) inOutRiffState.tags.size() - 1;
+
+ UInt64 maxOffset = inOutPosition + parentlen;
while ( parentlen > 0 ) {
oldpos = inOutPosition;
- ReadTag ( inFileRef, &tag, &len, &subtype, inOutPosition );
+ ReadTag ( inFileRef, &tag, &len, &subtype, inOutPosition, maxOffset );
AddTag ( inOutRiffState, tag, len, inOutPosition, parentid, parentnum, subtype );
- len += (len & 1);
+ len += (len & 1); //padding byte
if ( subtype == 0 ) {
childlen = 8 + len;
@@ -424,7 +473,8 @@ namespace RIFF_Support {
// =============================================================================================
bool GetRIFFChunk ( LFA_FileRef inFileRef, RiffState & inOutRiffState, long tagID,
- long parentID, long subtypeID, char * outBuffer, unsigned long * outBufferSize )
+ long parentID, long subtypeID, char * outBuffer, unsigned long * outBufferSize,
+ UInt64* posPtr )
{
UInt32 len;
UInt64 pos;
@@ -432,16 +482,19 @@ namespace RIFF_Support {
bool found = FindChunk ( inOutRiffState, tagID, parentID, subtypeID, 0, &len, &pos );
if ( ! found ) return false;
+ if ( posPtr != 0 )
+ *posPtr = pos; // return position CBR
+
if ( outBuffer == 0 ) {
*outBufferSize = (unsigned long)len;
return true; // Found, but not wanted.
}
- if ( len > *outBufferSize ) len = *outBufferSize;
-
+ if ( len > *outBufferSize )
+ len = *outBufferSize;
found = ReadChunk ( inFileRef, pos, len, outBuffer );
- return found;
-
+
+ return found;
}
// =============================================================================================
@@ -489,3 +542,310 @@ namespace RIFF_Support {
}
} // namespace RIFF_Support
+
+// =================================================================================================
+
+// *** Could be moved to a separate header
+
+#pragma pack(push,1)
+
+// [TODO] Can we switch to using just a full path here?
+struct FSSpecLegacy
+{
+ short vRefNum;
+ long parID;
+ char name[260]; // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/naming_a_file.asp -- 260 is "old school", 32000 is "new school".
+};
+
+struct CR8R_CreatorAtom
+{
+ unsigned long magicLu;
+
+ long atom_sizeL; // Size of this structure.
+ short atom_vers_majorS; // Major atom version.
+ short atom_vers_minorS; // Minor atom version.
+
+ // mac
+ unsigned long creator_codeLu; // Application code on MacOS.
+ unsigned long creator_eventLu; // Invocation appleEvent.
+
+ // windows
+ char creator_extAC[16]; // Extension allowing registry search to app.
+ char creator_flagAC[16]; // Flag passed to app at invocation time.
+
+ char creator_nameAC[32]; // Name of the creator application.
+};
+
+typedef CR8R_CreatorAtom** CR8R_CreatorAtomHandle;
+
+#define PR_PROJECT_LINK_MAGIC 0x600DF00D // GoodFood
+
+typedef enum
+{
+ Embed_ExportTypeMovie = 0,
+ Embed_ExportTypeStill,
+ Embed_ExportTypeAudio,
+ Embed_ExportTypeCustom
+}
+Embed_ExportType;
+
+
+struct Embed_ProjectLinkAtom
+{
+ unsigned long magicLu;
+ long atom_sizeL;
+ short atom_vers_apiS;
+ short atom_vers_codeS;
+ unsigned long exportType; // See enum. The type of export that generated the file
+ FSSpecLegacy fullPath; // Full path of the project file
+};
+
+#pragma pack(pop)
+
+// -------------------------------------------------------------------------------------------------
+
+#define kCreatorTool "CreatorTool"
+#define AdobeCreatorAtomVersion_Major 1
+#define AdobeCreatorAtomVersion_Minor 0
+#define AdobeCreatorAtom_Magic 0xBEEFCAFE
+
+#define myCreatorAtom MakeFourCC ( 'C','r','8','r' )
+
+static void CreatorAtom_Initialize ( CR8R_CreatorAtom& creatorAtom )
+{
+ memset ( &creatorAtom, 0, sizeof(CR8R_CreatorAtom) );
+ creatorAtom.magicLu = AdobeCreatorAtom_Magic;
+ creatorAtom.atom_vers_majorS = AdobeCreatorAtomVersion_Major;
+ creatorAtom.atom_vers_minorS = AdobeCreatorAtomVersion_Minor;
+ creatorAtom.atom_sizeL = sizeof(CR8R_CreatorAtom);
+}
+
+// -------------------------------------------------------------------------------------------------
+
+static void CreatorAtom_MakeValid ( CR8R_CreatorAtom * creator_atomP )
+{
+ // If already valid, no conversion is needed.
+ if ( creator_atomP->magicLu == AdobeCreatorAtom_Magic ) return;
+
+ Flip4 ( &creator_atomP->magicLu );
+ Flip2 ( &creator_atomP->atom_vers_majorS );
+ Flip2 ( &creator_atomP->atom_vers_minorS );
+
+ Flip4 ( &creator_atomP->atom_sizeL );
+ Flip4 ( &creator_atomP->creator_codeLu );
+ Flip4 ( &creator_atomP->creator_eventLu );
+
+ XMP_Assert ( creator_atomP->magicLu == AdobeCreatorAtom_Magic );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+static void CreatorAtom_ToBE ( CR8R_CreatorAtom * creator_atomP )
+{
+ creator_atomP->atom_vers_majorS = MakeUns16BE ( creator_atomP->atom_vers_majorS );
+ creator_atomP->atom_vers_minorS = MakeUns16BE ( creator_atomP->atom_vers_minorS );
+
+ creator_atomP->magicLu = MakeUns32BE ( creator_atomP->magicLu );
+ creator_atomP->atom_sizeL = MakeUns32BE ( creator_atomP->atom_sizeL );
+ creator_atomP->creator_codeLu = MakeUns32BE ( creator_atomP->creator_codeLu );
+ creator_atomP->creator_eventLu = MakeUns32BE ( creator_atomP->creator_eventLu );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+static void ProjectLinkAtom_MakeValid ( Embed_ProjectLinkAtom * link_atomP )
+{
+ // If already valid, no conversion is needed.
+ if ( link_atomP->magicLu == PR_PROJECT_LINK_MAGIC ) return;
+
+ // do the header
+ Flip4 ( &link_atomP->magicLu );
+ Flip4 ( &link_atomP->atom_sizeL );
+ Flip2 ( &link_atomP->atom_vers_apiS );
+ Flip2 ( &link_atomP->atom_vers_codeS );
+
+ // do the FSSpec data
+ Flip2 ( &link_atomP->fullPath.vRefNum );
+ Flip4 ( &link_atomP->fullPath.parID );
+
+ XMP_Assert ( link_atomP->magicLu == PR_PROJECT_LINK_MAGIC );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+static std::string CharsToString ( const char* buffer, int maxBuffer )
+{
+ // convert possibly non-zero terminated char buffer to std::string
+ std::string result;
+
+ char bufferz[256];
+ XMP_Assert ( maxBuffer < 256 );
+ if ( maxBuffer >= 256 ) return result;
+
+ memcpy ( bufferz, buffer, maxBuffer );
+ bufferz[maxBuffer] = 0;
+
+ result = bufferz;
+ return result;
+
+}
+
+// -------------------------------------------------------------------------------------------------
+
+bool CreatorAtom::Import ( SXMPMeta& xmpObj,
+ LFA_FileRef fileRef,
+ RIFF_Support::RiffState& riffState )
+{
+ static const long myProjectLink = MakeFourCC ( 'P','r','m','L' );
+
+ unsigned long projectLinkSize;
+ bool ok = RIFF_Support::GetRIFFChunk ( fileRef, riffState, myProjectLink, 0, 0, 0, &projectLinkSize );
+ if ( ok ) {
+
+ Embed_ProjectLinkAtom epla;
+
+ std::string projectPathString;
+ RIFF_Support::GetRIFFChunk ( fileRef, riffState, myProjectLink, 0, 0, (char*) &epla, &projectLinkSize );
+ if ( ok ) {
+ ProjectLinkAtom_MakeValid ( &epla );
+ projectPathString = epla.fullPath.name;
+ }
+
+ if ( ! projectPathString.empty() ) {
+
+ if ( projectPathString[0] == '/' ) {
+ xmpObj.SetStructField ( kXMP_NS_CreatorAtom, "macAtom",
+ kXMP_NS_CreatorAtom, "posixProjectPath", projectPathString, 0 );
+ } else if ( projectPathString.substr(0,4) == std::string("\\\\?\\") ) {
+ xmpObj.SetStructField ( kXMP_NS_CreatorAtom, "windowsAtom",
+ kXMP_NS_CreatorAtom, "uncProjectPath", projectPathString, 0 );
+ }
+
+ std::string projectTypeString;
+ switch ( epla.exportType ) {
+ case Embed_ExportTypeMovie : projectTypeString = "movie"; break;
+ case Embed_ExportTypeStill : projectTypeString = "still"; break;
+ case Embed_ExportTypeAudio : projectTypeString = "audio"; break;
+ case Embed_ExportTypeCustom : projectTypeString = "custom"; break;
+ }
+
+ if ( ! projectTypeString.empty() ) {
+ xmpObj.SetStructField ( kXMP_NS_DM, "projectRef", kXMP_NS_DM, "type", projectTypeString.c_str() );
+ }
+
+ }
+
+ }
+
+ unsigned long creatorAtomSize = 0;
+ ok = RIFF_Support::GetRIFFChunk ( fileRef, riffState, myCreatorAtom, 0, 0, 0, &creatorAtomSize );
+ if ( ok ) {
+
+ CR8R_CreatorAtom creatorAtom;
+ ok = RIFF_Support::GetRIFFChunk ( fileRef, riffState, myCreatorAtom, 0, 0, (char*) &creatorAtom, &creatorAtomSize );
+
+ if ( ok ) {
+
+ CreatorAtom_MakeValid ( &creatorAtom );
+
+ char buffer[256];
+ std::string xmpString;
+
+ sprintf ( buffer, "%d", creatorAtom.creator_codeLu );
+ xmpString = buffer;
+ xmpObj.SetStructField ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "applicationCode", xmpString, 0 );
+
+ sprintf ( buffer, "%d", creatorAtom.creator_eventLu );
+ xmpString = buffer;
+ xmpObj.SetStructField ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "invocationAppleEvent", xmpString, 0 );
+
+ xmpString = CharsToString ( creatorAtom.creator_extAC, sizeof(creatorAtom.creator_extAC) );
+ xmpObj.SetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "extension", xmpString, 0 );
+
+ xmpString = CharsToString ( creatorAtom.creator_flagAC, sizeof(creatorAtom.creator_flagAC) );
+ xmpObj.SetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "invocationFlags", xmpString, 0 );
+
+ xmpString = CharsToString ( creatorAtom.creator_nameAC, sizeof(creatorAtom.creator_nameAC) );
+ xmpObj.SetProperty ( kXMP_NS_XMP, "CreatorTool", xmpString, 0 );
+
+ }
+
+ }
+
+ return ok;
+
+}
+
+// -------------------------------------------------------------------------------------------------
+
+// *** Not in C library:
+#ifndef min
+ #define min(a,b) ( (a < b) ? a : b )
+#endif
+
+#define EnsureFinalNul(buffer) buffer [ sizeof(buffer) - 1 ] = 0
+
+bool CreatorAtom::Update ( SXMPMeta& xmpObj,
+ LFA_FileRef fileRef,
+ long riffType,
+ RIFF_Support::RiffState& riffState )
+{
+
+ // Creator Atom related values.
+ bool found = false;
+ std::string posixPathString, uncPathString;
+ if ( xmpObj.GetStructField ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "posixProjectPath", &posixPathString, 0 ) ) found = true;
+ if ( xmpObj.GetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "uncProjectPath", &uncPathString, 0 ) ) found = true;
+
+ std::string applicationCodeString, invocationAppleEventString, extensionString, invocationFlagsString, creatorToolString;
+ if ( xmpObj.GetStructField ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "applicationCode", &applicationCodeString, 0 ) ) found = true;
+ if ( xmpObj.GetStructField ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "invocationAppleEvent", &invocationAppleEventString, 0 ) ) found = true;
+ if ( xmpObj.GetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "extension", &extensionString, 0 ) ) found = true;
+ if ( xmpObj.GetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "invocationFlags", &invocationFlagsString, 0 ) ) found = true;
+ if ( xmpObj.GetProperty ( kXMP_NS_XMP, "CreatorTool", &creatorToolString, 0 ) ) found = true;
+
+ // No Creator Atom information present.
+ if ( ! found ) return true;
+
+ // Read Legacy Creator Atom.
+ unsigned long creatorAtomSize = 0;
+ CR8R_CreatorAtom creatorAtomLegacy;
+ CreatorAtom_Initialize ( creatorAtomLegacy );
+ bool ok = RIFF_Support::GetRIFFChunk ( fileRef, riffState, myCreatorAtom, 0, 0, 0, &creatorAtomSize );
+ if ( ok ) {
+ XMP_Assert ( creatorAtomSize == sizeof(CR8R_CreatorAtom) );
+ ok = RIFF_Support::GetRIFFChunk ( fileRef, riffState, myCreatorAtom, 0, 0, (char*) &creatorAtomLegacy, &creatorAtomSize );
+ CreatorAtom_MakeValid ( &creatorAtomLegacy );
+ }
+
+ // Generate new Creator Atom from XMP.
+ CR8R_CreatorAtom creatorAtomViaXMP;
+ CreatorAtom_Initialize ( creatorAtomViaXMP );
+ if ( ! applicationCodeString.empty() ) {
+ creatorAtomViaXMP.creator_codeLu = strtoul ( applicationCodeString.c_str(), 0, 0 );
+ }
+ if ( ! invocationAppleEventString.empty() ) {
+ creatorAtomViaXMP.creator_eventLu = strtoul ( invocationAppleEventString.c_str(), 0, 0 );
+ }
+ if ( ! extensionString.empty() ) {
+ strncpy ( creatorAtomViaXMP.creator_extAC, extensionString.c_str(), sizeof(creatorAtomViaXMP.creator_extAC) );
+ EnsureFinalNul ( creatorAtomViaXMP.creator_extAC );
+ }
+ if ( ! invocationFlagsString.empty() ) {
+ strncpy ( creatorAtomViaXMP.creator_flagAC, invocationFlagsString.c_str(), sizeof(creatorAtomViaXMP.creator_flagAC) );
+ EnsureFinalNul ( creatorAtomViaXMP.creator_flagAC );
+ }
+ if ( ! creatorToolString.empty() ) {
+ strncpy ( creatorAtomViaXMP.creator_nameAC, creatorToolString.c_str(), sizeof(creatorAtomViaXMP.creator_nameAC) );
+ EnsureFinalNul ( creatorAtomViaXMP.creator_nameAC );
+ }
+
+ // Write new Creator Atom, if necessary.
+ if ( memcmp ( &creatorAtomViaXMP, &creatorAtomLegacy, sizeof(CR8R_CreatorAtom) ) != 0 ) {
+ CreatorAtom_ToBE ( &creatorAtomViaXMP );
+ ok = RIFF_Support::PutChunk ( fileRef, riffState, riffType, myCreatorAtom, (char*)&creatorAtomViaXMP, sizeof(CR8R_CreatorAtom) );
+ }
+
+ return ok;
+
+}
diff --git a/source/XMPFiles/FormatSupport/RIFF_Support.hpp b/source/XMPFiles/FormatSupport/RIFF_Support.hpp
index bb63070..8065e38 100644
--- a/source/XMPFiles/FormatSupport/RIFF_Support.hpp
+++ b/source/XMPFiles/FormatSupport/RIFF_Support.hpp
@@ -116,9 +116,11 @@ namespace RIFF_Support
** will contain the field size if true if returned.
**
** Returns true if the chunk is found.
+ **
+ ** position of chunk _contents_ is returned in postPtr
*/
bool GetRIFFChunk ( LFA_FileRef inFileRef, RiffState & inOutRiffState, long tagID, long parentID,
- long subtypeID, char * outBuffer, unsigned long * outBufferSize );
+ long subtypeID, char * outBuffer, unsigned long * outBufferSize, UInt64* posPtr = 0);
/**
@@ -169,4 +171,23 @@ namespace RIFF_Support
} // namespace RIFF_Support
+// =================================================================================================
+
+// *** Could be moved to a separate header
+
+namespace CreatorAtom {
+
+ bool Import ( SXMPMeta& xmpObj,
+ LFA_FileRef fileRef,
+ RIFF_Support::RiffState& riffState );
+
+ bool Update ( SXMPMeta& xmpObj,
+ LFA_FileRef fileRef,
+ long riffType,
+ RIFF_Support::RiffState& riffState );
+
+}
+
+// =================================================================================================
+
#endif // __RIFF_Support_hpp__
diff --git a/source/XMPFiles/FormatSupport/ReconcileIPTC.cpp b/source/XMPFiles/FormatSupport/ReconcileIPTC.cpp
index d04dbea..a81e8af 100644
--- a/source/XMPFiles/FormatSupport/ReconcileIPTC.cpp
+++ b/source/XMPFiles/FormatSupport/ReconcileIPTC.cpp
@@ -11,6 +11,8 @@
#include "Reconcile_Impl.hpp"
+#include <stdio.h>
+
#if XMP_WinBuild
#pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning)
#pragma warning ( disable : 4996 ) // '...' was declared deprecated
@@ -474,9 +476,17 @@ void ReconcileUtils::ImportPSIR ( const PSIR_Manager & psir, SXMPMeta * xmp, int
import = psir.GetImgRsrc ( kPSIR_CopyrightURL, &rsrcInfo );
if ( import ) import = (! xmp->DoesPropertyExist ( kXMP_NS_XMP_Rights, "WebStatement" ));
if ( import ) {
- std::string utf8;
- ReconcileUtils::LocalToUTF8 ( rsrcInfo.dataPtr, rsrcInfo.dataLen, &utf8 );
- xmp->SetProperty ( kXMP_NS_XMP_Rights, "WebStatement", utf8.c_str() );
+ #if ! XMP_UNIXBuild
+ std::string utf8;
+ ReconcileUtils::LocalToUTF8 ( rsrcInfo.dataPtr, rsrcInfo.dataLen, &utf8 );
+ xmp->SetProperty ( kXMP_NS_XMP_Rights, "WebStatement", utf8.c_str() );
+ #else
+ // ! Hack until legacy-as-local issues are resolved for generic UNIX.
+ if ( ReconcileUtils::IsUTF8 ( rsrcInfo.dataPtr, rsrcInfo.dataLen ) ) {
+ std::string utf8 ( (char*)rsrcInfo.dataPtr, rsrcInfo.dataLen );
+ xmp->SetProperty ( kXMP_NS_XMP_Rights, "WebStatement", utf8.c_str() );
+ }
+ #endif
}
} catch ( ... ) {
// Do nothing, let other imports proceed.
@@ -511,7 +521,7 @@ static void ExportIPTC_Simple ( SXMPMeta * xmp, IPTC_Manager * iptc,
size_t iptcCount = iptc->GetDataSet ( id, 0 );
if ( iptcCount > 1 ) iptc->DeleteDataSet ( id );
- iptc->SetDataSet_UTF8 ( id, value.c_str(), value.size(), 0 ); // ! Don't append a 2nd DataSet!
+ iptc->SetDataSet_UTF8 ( id, value.c_str(), (XMP_Uns32)value.size(), 0 ); // ! Don't append a 2nd DataSet!
} // ExportIPTC_Simple
@@ -544,7 +554,7 @@ static void ExportIPTC_LangAlt ( SXMPMeta * xmp, IPTC_Manager * iptc,
size_t iptcCount = iptc->GetDataSet ( id, 0 );
if ( iptcCount > 1 ) iptc->DeleteDataSet ( id );
- iptc->SetDataSet_UTF8 ( id, value.c_str(), value.size(), 0 ); // ! Don't append a 2nd DataSet!
+ iptc->SetDataSet_UTF8 ( id, value.c_str(), (XMP_Uns32)value.size(), 0 ); // ! Don't append a 2nd DataSet!
} // ExportIPTC_LangAlt
@@ -570,19 +580,19 @@ static void ExportIPTC_Array ( SXMPMeta * xmp, IPTC_Manager * iptc,
if ( ! XMP_PropIsArray ( xmpFlags ) ) return; // ? Complain? Delete the DataSet?
- size_t xmpCount = xmp->CountArrayItems ( xmpNS, xmpProp );
- size_t iptcCount = iptc->GetDataSet ( id, 0 );
+ XMP_Index xmpCount = xmp->CountArrayItems ( xmpNS, xmpProp );
+ XMP_Index iptcCount = (XMP_Index) iptc->GetDataSet ( id, 0 );
if ( xmpCount != iptcCount ) iptc->DeleteDataSet ( id );
- for ( size_t ds = 0; ds < xmpCount; ++ds ) { // ! XMP arrays are indexed from 1, IPTC from 0.
+ for ( XMP_Index ds = 0; ds < xmpCount; ++ds ) { // ! XMP arrays are indexed from 1, IPTC from 0.
(void) xmp->GetArrayItem ( xmpNS, xmpProp, ds+1, &value, &xmpFlags );
if ( ! XMP_PropIsSimple ( xmpFlags ) ) continue; // ? Complain?
NormalizeToCR ( &value );
- iptc->SetDataSet_UTF8 ( id, value.c_str(), value.size(), ds ); // ! Appends if necessary.
+ iptc->SetDataSet_UTF8 ( id, value.c_str(), (XMP_Uns32)value.size(), ds ); // ! Appends if necessary.
}
@@ -627,7 +637,7 @@ static void ExportIPTC_IntellectualGenre ( SXMPMeta * xmp, IPTC_Manager * iptc,
size_t iptcCount = iptc->GetDataSet ( kIPTC_IntellectualGenre, 0 );
if ( iptcCount > 1 ) iptc->DeleteDataSet ( kIPTC_IntellectualGenre );
- iptc->SetDataSet_UTF8 ( kIPTC_IntellectualGenre, iimValue.c_str(), iimValue.size(), 0 ); // ! Don't append a 2nd DataSet!
+ iptc->SetDataSet_UTF8 ( kIPTC_IntellectualGenre, iimValue.c_str(), (XMP_Uns32)iimValue.size(), 0 ); // ! Don't append a 2nd DataSet!
} // ExportIPTC_IntellectualGenre
@@ -654,12 +664,12 @@ static void ExportIPTC_SubjectCode ( SXMPMeta * xmp, IPTC_Manager * iptc,
if ( ! XMP_PropIsArray ( xmpFlags ) ) return; // ? Complain? Delete the DataSet?
- size_t xmpCount = xmp->CountArrayItems ( xmpNS, xmpProp );
- size_t iptcCount = iptc->GetDataSet ( kIPTC_SubjectCode, 0 );
+ XMP_Index xmpCount = xmp->CountArrayItems ( xmpNS, xmpProp );
+ XMP_Index iptcCount = (XMP_Index) iptc->GetDataSet ( kIPTC_SubjectCode, 0 );
if ( xmpCount != iptcCount ) iptc->DeleteDataSet ( kIPTC_SubjectCode );
- for ( size_t ds = 0; ds < xmpCount; ++ds ) { // ! XMP arrays are indexed from 1, IPTC from 0.
+ for ( XMP_Index ds = 0; ds < xmpCount; ++ds ) { // ! XMP arrays are indexed from 1, IPTC from 0.
(void) xmp->GetArrayItem ( xmpNS, xmpProp, ds+1, &xmpValue, &xmpFlags );
if ( ! XMP_PropIsSimple ( xmpFlags ) ) continue; // ? Complain?
@@ -669,7 +679,7 @@ static void ExportIPTC_SubjectCode ( SXMPMeta * xmp, IPTC_Manager * iptc,
iimValue += xmpValue;
iimValue += ":::"; // Add the separating colons for the empty name portions.
- iptc->SetDataSet_UTF8 ( kIPTC_SubjectCode, iimValue.c_str(), iimValue.size(), ds ); // ! Appends if necessary.
+ iptc->SetDataSet_UTF8 ( kIPTC_SubjectCode, iimValue.c_str(), (XMP_Uns32)iimValue.size(), ds ); // ! Appends if necessary.
}
@@ -739,6 +749,10 @@ static void ExportIPTC_DateCreated ( SXMPMeta * xmp, IPTC_Manager * iptc,
void ReconcileUtils::ExportIPTC ( SXMPMeta * xmp, IPTC_Manager * iptc )
{
+
+ #if XMP_UNIXBuild
+ return; // ! Hack until the legacy-as-local issues are resolved for generic UNIX.
+ #endif
for ( size_t i = 0; kKnownDataSets[i].id != 255; ++i ) {
@@ -817,9 +831,14 @@ void ReconcileUtils::ExportPSIR ( const SXMPMeta & xmp, PSIR_Manager * psir )
if ( ! found ) {
psir->DeleteImgRsrc ( kPSIR_CopyrightURL );
} else {
- std::string localValue;
- ReconcileUtils::UTF8ToLocal ( utf8Value.c_str(), utf8Value.size(), &localValue );
- psir->SetImgRsrc ( kPSIR_CopyrightURL, localValue.c_str(), localValue.size() );
+ #if ! XMP_UNIXBuild
+ std::string localValue;
+ ReconcileUtils::UTF8ToLocal ( utf8Value.c_str(), utf8Value.size(), &localValue );
+ psir->SetImgRsrc ( kPSIR_CopyrightURL, localValue.c_str(), (XMP_Uns32)localValue.size() );
+ #else
+ // ! Hack until legacy-as-local issues are resolved for generic UNIX.
+ psir->DeleteImgRsrc ( kPSIR_CopyrightURL );
+ #endif
}
} catch ( ... ) {
// Do nothing, let other exports proceed.
diff --git a/source/XMPFiles/FormatSupport/ReconcileLegacy.cpp b/source/XMPFiles/FormatSupport/ReconcileLegacy.cpp
index 00649c9..7c9f1f4 100644
--- a/source/XMPFiles/FormatSupport/ReconcileLegacy.cpp
+++ b/source/XMPFiles/FormatSupport/ReconcileLegacy.cpp
@@ -121,6 +121,16 @@ void ExportXMPtoJTP ( XMP_FileFormat destFormat,
{
XMP_Assert ( xmp != 0 );
XMP_Assert ( (destFormat == kXMP_JPEGFile) || (destFormat == kXMP_TIFFFile) || (destFormat == kXMP_PhotoshopFile) );
+
+ #if XMP_UNIXBuild
+ // ! Hack until the legacy-as-local issues are resolved for generic UNIX.
+ iptc = 0; // Strip IIM from the file.
+ if ( tiff != 0 ) tiff->DeleteTag ( kTIFF_PrimaryIFD, kTIFF_IPTC );
+ if ( psir != 0 ) {
+ psir->DeleteImgRsrc ( kPSIR_IPTC );
+ psir->DeleteImgRsrc ( kPSIR_IPTCDigest );
+ }
+ #endif
// Save the IPTC changed flag specially. SetIPTCDigest will call UpdateMemoryDataSets, which
// will clear the IsChanged flag. Also, UpdateMemoryDataSets can be called twice, once for the
@@ -128,6 +138,19 @@ void ExportXMPtoJTP ( XMP_FileFormat destFormat,
bool iptcChanged = false;
+ // Do not write legacy IPTC (IIM) or PSIR in DNG files (which are a variant of TIFF).
+
+ if ( (destFormat == kXMP_TIFFFile) && (tiff != 0) &&
+ tiff->GetTag ( kTIFF_PrimaryIFD, kTIFF_DNGVersion, 0 ) ) {
+
+ iptc = 0; // These prevent calls to ExportIPTC and ExportPSIR.
+ psir = 0;
+
+ tiff->DeleteTag ( kTIFF_PrimaryIFD, kTIFF_IPTC ); // These remove any existing IPTC and PSIR.
+ tiff->DeleteTag ( kTIFF_PrimaryIFD, kTIFF_PSIR );
+
+ }
+
// Export the individual metadata items to the legacy forms. The PSIR and IPTC must be done
// before the TIFF and Exif. The PSIR and IPTC have side effects that can modify the XMP, and
// thus the values written to TIFF and Exif. The side effects are the CR<->LF normalization that
diff --git a/source/XMPFiles/FormatSupport/ReconcileTIFF.cpp b/source/XMPFiles/FormatSupport/ReconcileTIFF.cpp
index 5dbca57..4ae7564 100644
--- a/source/XMPFiles/FormatSupport/ReconcileTIFF.cpp
+++ b/source/XMPFiles/FormatSupport/ReconcileTIFF.cpp
@@ -1,6 +1,6 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2006-2007 Adobe Systems Incorporated
+// Copyright 2006-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -491,7 +491,11 @@ ImportSingleTIFF_ASCII ( const TIFF_Manager::TagInfo & tagInfo,
if ( isUTF8 ) {
strValue.assign ( chPtr, tagInfo.dataLen );
} else {
- ReconcileUtils::LocalToUTF8 ( chPtr, tagInfo.dataLen, &strValue );
+ #if ! XMP_UNIXBuild
+ ReconcileUtils::LocalToUTF8 ( chPtr, tagInfo.dataLen, &strValue );
+ #else
+ return; // ! Hack until legacy-as-local issues are resolved for generic UNIX.
+ #endif
}
xmp->SetProperty ( xmpNS, xmpProp, strValue.c_str() );
}
@@ -865,7 +869,11 @@ ImportArrayTIFF_ASCII ( const TIFF_Manager::TagInfo & tagInfo,
if ( isUTF8 ) {
strValue.assign ( chPtr, tagInfo.dataLen );
} else {
- ReconcileUtils::LocalToUTF8 ( chPtr, tagInfo.dataLen, &strValue );
+ #if ! XMP_UNIXBuild
+ ReconcileUtils::LocalToUTF8 ( chPtr, tagInfo.dataLen, &strValue );
+ #else
+ return; // ! Hack until legacy-as-local issues are resolved for generic UNIX.
+ #endif
}
chPtr = strValue.c_str();
chEnd = chPtr + strValue.size();
@@ -1333,7 +1341,11 @@ ImportTIFF_LocTextASCII ( const TIFF_Manager & tiff, XMP_Uns8 ifd, XMP_Uns16 tag
if ( isUTF8 ) {
strValue.assign ( chPtr, tagInfo.dataLen );
} else {
- ReconcileUtils::LocalToUTF8 ( chPtr, tagInfo.dataLen, &strValue );
+ #if ! XMP_UNIXBuild
+ ReconcileUtils::LocalToUTF8 ( chPtr, tagInfo.dataLen, &strValue );
+ #else
+ return; // ! Hack until legacy-as-local issues are resolved for generic UNIX.
+ #endif
}
xmp->SetLocalizedText ( xmpNS, xmpProp, "", "x-default", strValue.c_str() );
}
@@ -1351,14 +1363,20 @@ ImportTIFF_LocTextASCII ( const TIFF_Manager & tiff, XMP_Uns8 ifd, XMP_Uns16 tag
static void
ImportTIFF_EncodedString ( const TIFF_Manager & tiff, const TIFF_Manager::TagInfo & tagInfo,
- SXMPMeta * xmp, const char * xmpNS, const char * xmpProp )
+ SXMPMeta * xmp, const char * xmpNS, const char * xmpProp, bool isLangAlt = false )
{
try { // Don't let errors with one stop the others.
std::string strValue;
bool ok = tiff.DecodeString ( tagInfo.dataPtr, tagInfo.dataLen, &strValue );
- if ( ok ) xmp->SetProperty ( xmpNS, xmpProp, strValue.c_str() );
+ if ( ! ok ) return;
+
+ if ( ! isLangAlt ) {
+ xmp->SetProperty ( xmpNS, xmpProp, strValue.c_str() );
+ } else {
+ xmp->SetLocalizedText ( xmpNS, xmpProp, "", "x-default", strValue.c_str() );
+ }
} catch ( ... ) {
// Do nothing, let other imports proceed.
@@ -1438,12 +1456,12 @@ ImportTIFF_OECFTable ( const TIFF_Manager::TagInfo & tagInfo, bool nativeEndian,
bytePtr += 4; // Move to the list of names.
for ( size_t i = columns; i > 0; --i ) {
size_t nameLen = strlen((XMP_StringPtr)bytePtr) + 1; // ! Include the terminating nul.
- if ( (bytePtr + nameLen) > byteEnd ) goto BadExif;
+ if ( (bytePtr + nameLen) > byteEnd ) { xmp->DeleteProperty ( xmpNS, xmpProp ); return; };
xmp->AppendArrayItem ( xmpNS, arrayPath.c_str(), kXMP_PropArrayIsOrdered, (XMP_StringPtr)bytePtr );
bytePtr += nameLen;
}
- if ( (byteEnd - bytePtr) != (8 * columns * rows) ) goto BadExif; // Make sure the values are present.
+ if ( (byteEnd - bytePtr) != (8 * columns * rows) ) { xmp->DeleteProperty ( xmpNS, xmpProp ); return; }; // Make sure the values are present.
SXMPUtils::ComposeStructFieldPath ( xmpNS, xmpProp, kXMP_NS_EXIF, "Values", &arrayPath );
XMP_Int32 * binPtr = (XMP_Int32*)bytePtr;
@@ -1463,10 +1481,6 @@ ImportTIFF_OECFTable ( const TIFF_Manager::TagInfo & tagInfo, bool nativeEndian,
}
return;
-
- BadExif: // Ignore the tag if the table is ill-formed.
- xmp->DeleteProperty ( xmpNS, xmpProp );
- return;
} catch ( ... ) {
// Do nothing, let other imports proceed.
@@ -1512,12 +1526,12 @@ ImportTIFF_SFRTable ( const TIFF_Manager::TagInfo & tagInfo, bool nativeEndian,
bytePtr += 4; // Move to the list of names.
for ( size_t i = columns; i > 0; --i ) {
size_t nameLen = strlen((XMP_StringPtr)bytePtr) + 1; // ! Include the terminating nul.
- if ( (bytePtr + nameLen) > byteEnd ) goto BadExif;
+ if ( (bytePtr + nameLen) > byteEnd ) { xmp->DeleteProperty ( xmpNS, xmpProp ); return; };
xmp->AppendArrayItem ( xmpNS, arrayPath.c_str(), kXMP_PropArrayIsOrdered, (XMP_StringPtr)bytePtr );
bytePtr += nameLen;
}
- if ( (byteEnd - bytePtr) != (8 * columns * rows) ) goto BadExif; // Make sure the values are present.
+ if ( (byteEnd - bytePtr) != (8 * columns * rows) ) { xmp->DeleteProperty ( xmpNS, xmpProp ); return; }; // Make sure the values are present.
SXMPUtils::ComposeStructFieldPath ( xmpNS, xmpProp, kXMP_NS_EXIF, "Values", &arrayPath );
XMP_Uns32 * binPtr = (XMP_Uns32*)bytePtr;
@@ -1537,10 +1551,6 @@ ImportTIFF_SFRTable ( const TIFF_Manager::TagInfo & tagInfo, bool nativeEndian,
}
return;
-
- BadExif: // Ignore the tag if the table is ill-formed.
- xmp->DeleteProperty ( xmpNS, xmpProp );
- return;
} catch ( ... ) {
// Do nothing, let other imports proceed.
@@ -1912,7 +1922,7 @@ ReconcileUtils::ImportExif ( const TIFF_Manager & tiff, SXMPMeta * xmp, int dige
ok = ImportTIFF_VerifyImport ( tiff, xmp, digestState, kTIFF_ExifIFD, kTIFF_UserComment,
kXMP_NS_EXIF, "UserComment", &tagInfo );
if ( ok ) {
- ImportTIFF_EncodedString ( tiff, tagInfo, xmp, kXMP_NS_EXIF, "UserComment" );
+ ImportTIFF_EncodedString ( tiff, tagInfo, xmp, kXMP_NS_EXIF, "UserComment", true /* isLangAlt */ );
}
// 36867 DateTimeOriginal is a date master with 37521 SubSecTimeOriginal.
@@ -1921,6 +1931,11 @@ ReconcileUtils::ImportExif ( const TIFF_Manager & tiff, SXMPMeta * xmp, int dige
if ( ok && (tagInfo.type == kTIFF_ASCIIType) && (tagInfo.count == 20) ) {
ImportTIFF_Date ( tiff, tagInfo, kTIFF_SubSecTimeOriginal, xmp, kXMP_NS_EXIF, "DateTimeOriginal" );
}
+ if ( ! xmp->DoesPropertyExist ( kXMP_NS_XMP, "CreateDate" ) ) {
+ std::string exifDate;
+ ok = xmp->GetProperty ( kXMP_NS_EXIF, "DateTimeOriginal", &exifDate, 0 );
+ if ( ok ) xmp->SetProperty ( kXMP_NS_XMP, "CreateDate", exifDate.c_str() );
+ }
// 36868 DateTimeDigitized is a date master with 37522 SubSecTimeDigitized.
ok = ImportTIFF_VerifyImport ( tiff, xmp, digestState, kTIFF_ExifIFD, kTIFF_DateTimeDigitized,
@@ -2156,7 +2171,7 @@ ExportSingleTIFF_ASCII ( const SXMPMeta & xmp, const char * xmpNS, const char *
if ( ! XMP_PropIsSimple ( xmpFlags ) ) return; // ? Complain? Delete the tag?
- tiff->SetTag ( ifd, id, kTIFF_ASCIIType, xmpValue.size()+1, xmpValue.c_str() );
+ tiff->SetTag ( ifd, id, kTIFF_ASCIIType, (XMP_Uns32)( xmpValue.size()+1 ), xmpValue.c_str() );
} catch ( ... ) {
// Do nothing, let other exports proceed.
@@ -2190,13 +2205,13 @@ ExportArrayTIFF_ASCII ( const SXMPMeta & xmp, const char * xmpNS, const char * x
size_t count = xmp.CountArrayItems ( xmpNS, xmpProp );
for ( size_t i = 1; i <= count; ++i ) { // ! XMP arrays are indexed from 1.
- (void) xmp.GetArrayItem ( xmpNS, xmpProp, i, &itemValue, &xmpFlags );
+ (void) xmp.GetArrayItem ( xmpNS, xmpProp, (XMP_Index)i, &itemValue, &xmpFlags );
if ( ! XMP_PropIsSimple ( xmpFlags ) ) continue; // ? Complain?
fullValue.append ( itemValue );
fullValue.append ( 1, '\x0' );
}
- tiff->SetTag ( ifd, id, kTIFF_ASCIIType, fullValue.size(), fullValue.c_str() ); // ! Already have trailing nul.
+ tiff->SetTag ( ifd, id, kTIFF_ASCIIType, (XMP_Uns32)fullValue.size(), fullValue.c_str() ); // ! Already have trailing nul.
} catch ( ... ) {
// Do nothing, let other exports proceed.
@@ -2273,7 +2288,7 @@ ExportTIFF_LocTextASCII ( const SXMPMeta & xmp, const char * xmpNS, const char *
return;
}
- tiff->SetTag ( ifd, id, kTIFF_ASCIIType, xmpValue.size()+1, xmpValue.c_str() );
+ tiff->SetTag ( ifd, id, kTIFF_ASCIIType, (XMP_Uns32)( xmpValue.size()+1 ), xmpValue.c_str() );
} catch ( ... ) {
// Do nothing, let other exports proceed.
@@ -2288,7 +2303,7 @@ ExportTIFF_LocTextASCII ( const SXMPMeta & xmp, const char * xmpNS, const char *
static void
ExportTIFF_EncodedString ( const SXMPMeta & xmp, const char * xmpNS, const char * xmpProp,
- TIFF_Manager * tiff, XMP_Uns8 ifd, XMP_Uns16 id )
+ TIFF_Manager * tiff, XMP_Uns8 ifd, XMP_Uns16 id, bool isLangAlt = false )
{
try { // Don't let errors with one stop the others.
@@ -2301,7 +2316,13 @@ ExportTIFF_EncodedString ( const SXMPMeta & xmp, const char * xmpNS, const char
return;
}
- if ( ! XMP_PropIsSimple ( xmpFlags ) ) return; // ? Complain? Delete the tag?
+ if ( ! isLangAlt ) {
+ if ( ! XMP_PropIsSimple ( xmpFlags ) ) return; // ? Complain? Delete the tag?
+ } else {
+ if ( ! XMP_ArrayIsAltText ( xmpFlags ) ) return; // ? Complain? Delete the tag?
+ bool ok = xmp.GetLocalizedText ( xmpNS, xmpProp, "", "x-default", 0, &xmpValue, 0 );
+ if ( ! ok ) return; // ? Complain? Delete the tag?
+ }
XMP_Uns8 encoding = kTIFF_EncodeASCII;
for ( size_t i = 0; i < xmpValue.size(); ++i ) {
@@ -2321,6 +2342,93 @@ ExportTIFF_EncodedString ( const SXMPMeta & xmp, const char * xmpNS, const char
} // ExportTIFF_EncodedString
// =================================================================================================
+// ExportTIFF_GPSCoordinate
+// ========================
+//
+// The XMP format is either "deg,min,secR" or "deg,min.fracR", where 'R' is the reference direction,
+// 'N', 'S', 'E', or 'W'. The location gets output as ( deg/1, min/1, sec/1 ) for the first form,
+// and ( deg/1, minFrac/denom, 0/1 ) for the second form.
+
+// ! We arbitrarily limit the number of fractional minute digits to 6 to avoid overflow in the
+// ! combined numerator. But we don't otherwise check for overflow or range errors.
+
+static void
+ExportTIFF_GPSCoordinate ( const SXMPMeta & xmp, const char * xmpNS, const char * xmpProp,
+ TIFF_Manager * tiff, XMP_Uns8 ifd, XMP_Uns16 _id )
+{
+ XMP_Uns16 refID = _id-1; // ! The GPS refs and locations are all tag N-1 and N pairs.
+ XMP_Uns16 locID = _id;
+
+ XMP_Assert ( (locID & 1) == 0 );
+
+ try { // Don't let errors with one stop the others.
+
+ std::string xmpValue;
+ XMP_OptionBits xmpFlags;
+
+ bool foundXMP = xmp.GetProperty ( xmpNS, xmpProp, &xmpValue, &xmpFlags );
+ if ( ! foundXMP ) {
+ tiff->DeleteTag ( ifd, refID );
+ tiff->DeleteTag ( ifd, locID );
+ return;
+ }
+
+ if ( ! XMP_PropIsSimple ( xmpFlags ) ) return;
+
+ const char * chPtr = xmpValue.c_str();
+
+ XMP_Uns32 deg=0, minNum=0, minDenom=1, sec=0;
+
+ for ( ; ('0' <= *chPtr) && (*chPtr <= '9'); ++chPtr ) deg = deg*10 + (*chPtr - '0');
+ if ( *chPtr != ',' ) return; // Bad XMP string.
+ ++chPtr; // Skip the comma.
+
+ for ( ; ('0' <= *chPtr) && (*chPtr <= '9'); ++chPtr ) minNum = minNum*10 + (*chPtr - '0');
+ if ( (*chPtr != ',') && (*chPtr != '.') ) return; // Bad XMP string.
+
+ if ( *chPtr == ',' ) {
+
+ ++chPtr; // Skip the comma.
+ for ( ; ('0' <= *chPtr) && (*chPtr <= '9'); ++chPtr ) sec = sec*10 + (*chPtr - '0');
+
+ } else {
+
+ XMP_Assert ( *chPtr == '.' );
+ ++chPtr; // Skip the period.
+ for ( ; ('0' <= *chPtr) && (*chPtr <= '9'); ++chPtr ) {
+ if ( minDenom > 100*1000 ) continue; // Don't accumulate any more digits.
+ minDenom *= 10;
+ minNum = minNum*10 + (*chPtr - '0');
+ }
+
+ }
+
+ if ( *(chPtr+1) != 0 ) return; // Bad XMP string.
+
+ char ref[2];
+ ref[0] = *chPtr;
+ ref[1] = 0;
+
+ tiff->SetTag ( ifd, refID, kTIFF_ASCIIType, 2, &ref[0] );
+
+ XMP_Uns32 loc[6];
+ tiff->PutUns32 ( deg, &loc[0] );
+ tiff->PutUns32 ( 1, &loc[1] );
+ tiff->PutUns32 ( minNum, &loc[2] );
+ tiff->PutUns32 ( minDenom, &loc[3] );
+ tiff->PutUns32 ( sec, &loc[4] );
+ tiff->PutUns32 ( 1, &loc[5] );
+
+ tiff->SetTag ( ifd, locID, kTIFF_RationalType, 3, &loc[0] );
+
+ } catch ( ... ) {
+ // Do nothing, let other exports proceed.
+ // ? Notify client?
+ }
+
+} // ExportTIFF_GPSCoordinate
+
+// =================================================================================================
// =================================================================================================
// =================================================================================================
@@ -2378,12 +2486,17 @@ ReconcileUtils::ExportTIFF ( const SXMPMeta & xmp, TIFF_Manager * tiff )
// ReconcileUtils::ExportExif
// ==========================
//
-// Only a few tags are written back from XMP to the Exif IFD, they are each handled explicitly.
-// The writeback tags are:
+// Only a few tags are written back from XMP to the Exif and GPS IFDs, they are each handled
+// explicitly. The Exif writeback tags are:
// 36867 - DateTimeOriginal (plus 37521 SubSecTimeOriginal)
// 36868 - DateTimeDigitized (plus 37522 SubSecTimeDigitized)
// 37510 - UserComment
// 40964 - RelatedSoundFile
+// The GPS writeback tags are:
+// 1 - GPSLatitudeRef
+// 2 - GPSLatitude
+// 3 - GPSLongitudeRef
+// 4 - GPSLongitude
// ! Older versions of Photoshop did not import the UserComment or RelatedSoundFile tags. Don't
// ! export the current XMP unless the original XMP had the tag or the current XMP has the tag.
@@ -2405,7 +2518,7 @@ ReconcileUtils::ExportExif ( const SXMPMeta & xmp, TIFF_Manager * tiff )
if ( tiff->xmpHadUserComment || xmp.DoesPropertyExist ( kXMP_NS_EXIF, "UserComment" ) ) {
ExportTIFF_EncodedString ( xmp, kXMP_NS_EXIF, "UserComment",
- tiff, kTIFF_ExifIFD, kTIFF_UserComment );
+ tiff, kTIFF_ExifIFD, kTIFF_UserComment, true /* isLangAlt */ );
}
if ( tiff->xmpHadRelatedSoundFile || xmp.DoesPropertyExist ( kXMP_NS_EXIF, "RelatedSoundFile" ) ) {
@@ -2413,4 +2526,12 @@ ReconcileUtils::ExportExif ( const SXMPMeta & xmp, TIFF_Manager * tiff )
tiff, kTIFF_ExifIFD, kTIFF_RelatedSoundFile );
}
+ if ( xmp.DoesPropertyExist ( kXMP_NS_EXIF, "GPSLatitude" ) ) {
+ ExportTIFF_GPSCoordinate ( xmp, kXMP_NS_EXIF, "GPSLatitude", tiff, kTIFF_GPSInfoIFD, kTIFF_GPSLatitude );
+ }
+
+ if ( xmp.DoesPropertyExist ( kXMP_NS_EXIF, "GPSLongitude" ) ) {
+ ExportTIFF_GPSCoordinate ( xmp, kXMP_NS_EXIF, "GPSLongitude", tiff, kTIFF_GPSInfoIFD, kTIFF_GPSLongitude );
+ }
+
} // ReconcileUtils::ExportExif;
diff --git a/source/XMPFiles/FormatSupport/Reconcile_Impl.cpp b/source/XMPFiles/FormatSupport/Reconcile_Impl.cpp
index 99339d2..1f06083 100644
--- a/source/XMPFiles/FormatSupport/Reconcile_Impl.cpp
+++ b/source/XMPFiles/FormatSupport/Reconcile_Impl.cpp
@@ -107,10 +107,10 @@ bool ReconcileUtils::IsUTF8 ( const void * utf8Ptr, size_t utf8Len )
LPCWSTR utf16Ptr = (LPCWSTR) utf16.c_str();
size_t utf16Len = utf16.size() / 2;
- int hostLen = WideCharToMultiByte ( codePage, 0, utf16Ptr, utf16Len, 0, 0, 0, 0 );
+ int hostLen = WideCharToMultiByte ( codePage, 0, utf16Ptr, (int)utf16Len, 0, 0, 0, 0 );
host->assign ( hostLen, ' ' ); // Allocate space for the results.
- (void) WideCharToMultiByte ( codePage, 0, utf16Ptr, utf16Len, (LPSTR)host->data(), hostLen, 0, 0 );
+ (void) WideCharToMultiByte ( codePage, 0, utf16Ptr, (int)utf16Len, (LPSTR)host->data(), hostLen, 0, 0 );
XMP_Assert ( hostLen == host->size() );
} // UTF8ToWinEncoding
@@ -167,9 +167,8 @@ bool ReconcileUtils::IsUTF8 ( const void * utf8Ptr, size_t utf8Len )
#elif XMP_UNIXBuild
- #error "UTF8ToHostEncoding is not implemented for UNIX"
- // *** A nice definition of Windows 1252 is at http://www.microsoft.com/globaldev/reference/sbcs/1252.mspx
- // *** We should code our own conversions for this, and use it for UNIX - unless better POSIX routines exist.
+ // ! Does not exist, must not be called, for Generic UNIX builds. It is not clear at this time
+ // ! what notion of local encoding should be used for generic UNIX, especially in a server product.
#endif
@@ -177,6 +176,10 @@ bool ReconcileUtils::IsUTF8 ( const void * utf8Ptr, size_t utf8Len )
// ReconcileUtils::UTF8ToLocal
// ===========================
+#if ! XMP_UNIXBuild
+// ! Does not exist, must not be called, for Generic UNIX builds. It is not clear at this time
+// ! what notion of local encoding should be used for generic UNIX, especially in a server product.
+
void ReconcileUtils::UTF8ToLocal ( const void * _utf8Ptr, size_t utf8Len, std::string * local )
{
const XMP_Uns8* utf8Ptr = (XMP_Uns8*)_utf8Ptr;
@@ -205,18 +208,24 @@ void ReconcileUtils::UTF8ToLocal ( const void * _utf8Ptr, size_t utf8Len, std::s
#elif XMP_UNIXBuild
- #error "UTF8ToLocal is not implemented for UNIX"
+ #error "No generic UNIX implementation"
#endif
} // ReconcileUtils::UTF8ToLocal
+#endif
+
// =================================================================================================
// ReconcileUtils::UTF8ToLatin1
// ============================
//
// Actually to the Windows code page 1252 superset of 8859-1.
+#if ! XMP_UNIXBuild
+// ! Does not exist, must not be called, for Generic UNIX builds. At some point we could consider
+// ! creating our own private implementation. So far only needed for the ID3 legacy in MP3 files.
+
void ReconcileUtils::UTF8ToLatin1 ( const void * _utf8Ptr, size_t utf8Len, std::string * latin1 )
{
const XMP_Uns8* utf8Ptr = (XMP_Uns8*)_utf8Ptr;
@@ -242,12 +251,14 @@ void ReconcileUtils::UTF8ToLatin1 ( const void * _utf8Ptr, size_t utf8Len, std::
#elif XMP_UNIXBuild
- #error "UTF8ToLatin1 is not implemented for UNIX"
+ #error "No generic UNIX implementation"
#endif
} // ReconcileUtils::UTF8ToLatin1
+#endif
+
// =================================================================================================
// HostEncodingToUTF8
// ==================
@@ -258,11 +269,11 @@ void ReconcileUtils::UTF8ToLatin1 ( const void * _utf8Ptr, size_t utf8Len, std::
const XMP_Uns8 * hostPtr, size_t hostLen, std::string * utf8 )
{
- size_t utf16Len = MultiByteToWideChar ( codePage, 0, (LPCSTR)hostPtr, hostLen, 0, 0 );
+ int utf16Len = MultiByteToWideChar ( codePage, 0, (LPCSTR)hostPtr, (int)hostLen, 0, 0 );
std::vector<UTF16Unit> utf16 ( utf16Len, 0 ); // MultiByteToWideChar returns native UTF-16.
- (void) MultiByteToWideChar ( codePage, 0, (LPCSTR)hostPtr, hostLen, (LPWSTR)&utf16[0], utf16Len );
- FromUTF16Native ( &utf16[0], utf16Len, utf8 );
+ (void) MultiByteToWideChar ( codePage, 0, (LPCSTR)hostPtr, (int)hostLen, (LPWSTR)&utf16[0], utf16Len );
+ FromUTF16Native ( &utf16[0], (int)utf16Len, utf8 );
} // WinEncodingToUTF8
@@ -316,7 +327,8 @@ void ReconcileUtils::UTF8ToLatin1 ( const void * _utf8Ptr, size_t utf8Len, std::
#elif XMP_UNIXBuild
- #error "HostEncodingToUTF8 is not implemented for UNIX"
+ // ! Does not exist, must not be called, for Generic UNIX builds. It is not clear at this time
+ // ! what notion of local encoding should be used for generic UNIX, especially in a server product.
#endif
@@ -324,6 +336,10 @@ void ReconcileUtils::UTF8ToLatin1 ( const void * _utf8Ptr, size_t utf8Len, std::
// ReconcileUtils::LocalToUTF8
// ===========================
+#if ! XMP_UNIXBuild
+// ! Does not exist, must not be called, for Generic UNIX builds. It is not clear at this time
+// ! what notion of local encoding should be used for generic UNIX, especially in a server product.
+
void ReconcileUtils::LocalToUTF8 ( const void * _localPtr, size_t localLen, std::string * utf8 )
{
const XMP_Uns8* localPtr = (XMP_Uns8*)_localPtr;
@@ -351,18 +367,24 @@ void ReconcileUtils::LocalToUTF8 ( const void * _localPtr, size_t localLen, std:
#elif XMP_UNIXBuild
- #error "LocalToUTF8 is not implemented for UNIX"
+ #error "No generic UNIX implementation"
#endif
} // ReconcileUtils::LocalToUTF8
+#endif
+
// =================================================================================================
// ReconcileUtils::Latin1ToUTF8
// ============================
//
// Actually from the Windows code page 1252 superset of 8859-1.
+#if ! XMP_UNIXBuild
+// ! Does not exist, must not be called, for Generic UNIX builds. At some point we could consider
+// ! creating our own private implementation. So far only needed for the ID3 legacy in MP3 files.
+
void ReconcileUtils::Latin1ToUTF8 ( const void * _latin1Ptr, size_t latin1Len, std::string * utf8 )
{
const XMP_Uns8* latin1Ptr = (XMP_Uns8*)_latin1Ptr;
@@ -388,8 +410,10 @@ void ReconcileUtils::Latin1ToUTF8 ( const void * _latin1Ptr, size_t latin1Len, s
#elif XMP_UNIXBuild
- #error "Latin1ToUTF8 is not implemented for UNIX"
+ #error "No generic UNIX implementation"
#endif
} // ReconcileUtils::Latin1ToUTF8
+
+#endif
diff --git a/source/XMPFiles/FormatSupport/Reconcile_Impl.hpp b/source/XMPFiles/FormatSupport/Reconcile_Impl.hpp
index 6795d78..5fe59a7 100644
--- a/source/XMPFiles/FormatSupport/Reconcile_Impl.hpp
+++ b/source/XMPFiles/FormatSupport/Reconcile_Impl.hpp
@@ -34,11 +34,14 @@ namespace ReconcileUtils {
static const char * kHexDigits = "0123456789ABCDEF";
bool IsUTF8 ( const void * _utf8Ptr, size_t utf8Len );
- void UTF8ToLocal ( const void * _utf8Ptr, size_t utf8Len, std::string * local );
- void UTF8ToLatin1 ( const void * _utf8Ptr, size_t utf8Len, std::string * latin1 );
- void LocalToUTF8 ( const void * _localPtr, size_t localLen, std::string * utf8 );
- void Latin1ToUTF8 ( const void * _latin1Ptr, size_t latin1Len, std::string * utf8 );
- // *** These ought to be with the Unicode conversions.
+
+ #if ! XMP_UNIXBuild // Remove from generic UNIX until legacy-as-local issues are resolved.
+ void UTF8ToLocal ( const void * _utf8Ptr, size_t utf8Len, std::string * local );
+ void UTF8ToLatin1 ( const void * _utf8Ptr, size_t utf8Len, std::string * latin1 );
+ void LocalToUTF8 ( const void * _localPtr, size_t localLen, std::string * utf8 );
+ void Latin1ToUTF8 ( const void * _latin1Ptr, size_t latin1Len, std::string * utf8 );
+ // *** These ought to be with the Unicode conversions.
+ #endif
int CheckIPTCDigest ( IPTC_Manager * iptc, const PSIR_Manager & psir );
int CheckTIFFDigest ( const TIFF_Manager & tiff, const SXMPMeta & xmp );
diff --git a/source/XMPFiles/FormatSupport/SWF_Support.cpp b/source/XMPFiles/FormatSupport/SWF_Support.cpp
new file mode 100644
index 0000000..0a22cf0
--- /dev/null
+++ b/source/XMPFiles/FormatSupport/SWF_Support.cpp
@@ -0,0 +1,844 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2007 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "SWF_Support.hpp"
+#include "zlib.h"
+
+
+namespace SWF_Support
+{
+
+ // =============================================================================================
+
+ int CalcHeaderSize ( IO::InputStream* inputStream )
+ {
+ int size = 0;
+
+ try {
+
+ XMP_Uns8 buffer[1];
+ long bytesRead = inputStream->Read ( buffer, 1 );
+ if ( bytesRead != 1 ) return 0;
+
+ // The RECT datatype has a variable size depending on the packed bit-values -> rectDatatypeSize = size in bytes
+ int bits = int(buffer[0] >> 3);
+ int bytes = ((5 + (4 * bits)) / 8) + 1;
+
+ size = 12 + bytes;
+
+ } catch ( ... ) {
+
+ return 0;
+ }
+
+ inputStream->Skip ( size - inputStream->GetCurrentPos() );
+ return size;
+
+ } // CalcHeaderSize
+
+ // =============================================================================================
+
+ unsigned long CheckTag ( IO::InputStream* inputStream, TagState& inOutTagState, TagData& inOutTagData )
+ {
+ unsigned long ret = 0;
+ XMP_Uns8 * buffer = 0;
+
+ try {
+
+ if ( inOutTagData.id == SWF_TAG_ID_METADATA ) {
+
+ buffer = new XMP_Uns8[inOutTagData.len];
+ XMP_Uns32 bytes = inputStream->Read ( buffer, inOutTagData.len );
+
+ XMP_Assert ( bytes == inOutTagData.len );
+
+ inOutTagState.xmpPos = inOutTagData.pos + inOutTagData.offset;
+ inOutTagState.xmpLen = inOutTagData.len;
+ inOutTagData.xmp = true;
+
+ inOutTagState.xmpPacket.assign ( (char*)buffer, inOutTagData.len );
+
+ delete[] buffer;
+ buffer = 0;
+ ret = inOutTagState.xmpLen;
+
+ }
+
+ } catch ( ... ) {
+
+ if ( buffer != 0 ) {
+ delete[] buffer;
+ buffer = 0;
+ }
+
+ }
+
+ if ( buffer != 0 ) {
+ delete[] buffer;
+ buffer = 0;
+ }
+
+ return ret;
+
+ } // CheckTag
+
+ // =============================================================================================
+
+ bool HasMetadata ( IO::InputStream* inputStream, TagState& tagState )
+ {
+
+ XMP_Uns32 flags = ReadFileAttrFlags ( inputStream );
+ tagState.fileAttrFlags = flags;
+ return ((flags & SWF_METADATA_FLAG) == SWF_METADATA_FLAG);
+
+ } // HasMetadata
+
+ // =============================================================================================
+
+ XMP_Uns32 ReadFileAttrFlags ( IO::InputStream* inputStream )
+ {
+ XMP_Uns8 buffer[4];
+
+ XMP_Uns32 bytes = inputStream->Read ( buffer, 4 );
+ XMP_Assert ( bytes == 4 );
+
+ return GetUns32LE ( buffer );
+
+ } // ReadFileAttrFlags
+
+ // =============================================================================================
+
+ long OpenSWF ( IO::InputStream *inputStream, TagState & inOutTagState )
+ {
+ XMP_Uns64 pos = 0;
+ long name;
+ XMP_Uns32 len;
+
+ inOutTagState.headerSize = CalcHeaderSize ( inputStream );
+ pos = inOutTagState.headerSize;
+
+ // read first and following chunks
+ bool running = true;
+ while ( running ) {
+ running = ReadTag ( inputStream, inOutTagState, &name, &len, pos );
+ if ( inOutTagState.cachingFile ) {
+ if ( (! inOutTagState.hasXMP) || (inOutTagState.xmpLen > 0) ) running = false;
+ }
+ }
+
+ return (long) inOutTagState.tags.size();
+
+ } // OpenSWF
+
+ // =============================================================================================
+
+ bool ReadTag ( IO::InputStream* inputStream, TagState & inOutTagState,
+ long* tagType, XMP_Uns32* tagLength, XMP_Uns64& inOutPosition )
+ {
+
+ try {
+
+ XMP_Uns64 startPosition = inOutPosition;
+ long bytesRead;
+ XMP_Uns8 buffer[4];
+
+ bytesRead = inputStream->Read ( buffer, 2 );
+ if ( bytesRead != 2 ) return false;
+
+ inOutPosition += 2;
+ XMP_Uns16 code = GetUns16LE ( buffer );
+ *tagType = code >> 6;
+ *tagLength = code & 0x3f;
+
+ bool longTag = false;
+
+ if ( *tagLength == 0x3f ) {
+ longTag = true;
+ bytesRead = inputStream->Read ( buffer, 4 );
+ if ( bytesRead != 4 ) return false;
+ inOutPosition += 4;
+ *tagLength = GetUns32LE ( buffer );
+ }
+
+ inOutPosition += *tagLength;
+
+ TagData newTag;
+
+ newTag.pos = startPosition;
+ newTag.len = *tagLength;
+ newTag.id = *tagType;
+ newTag.offset = ( (! longTag) ? 2 : 6 );
+
+ // we cannot check valid XMP within the handler
+ // provide validating XMP by invoking XMPCore
+ // check tag for XMP
+ if ( newTag.id == SWF_TAG_ID_METADATA ) {
+ newTag.xmp = true;
+ inOutTagState.xmpTag = newTag;
+ CheckTag ( inputStream, inOutTagState, newTag );
+ if ( ! inOutTagState.hasFileAttrTag ) inOutTagState.hasXMP = true;
+ }
+
+ //store FileAttribute Tag
+ if ( newTag.id == SWF_TAG_ID_FILEATTRIBUTES ) {
+ inOutTagState.hasFileAttrTag = true;
+ inOutTagState.fileAttrTag = newTag;
+ inOutTagState.hasXMP = HasMetadata ( inputStream, inOutTagState );
+ //decreasing since stream moved on within HasMetadata function
+ *tagLength -= 4;
+ }
+
+ //store tag in vector to process later
+ inOutTagState.tags.push_back ( newTag );
+
+ //seek to next tag
+ if ( ! newTag.xmp ) inputStream->Skip ( *tagLength );
+ if ( inputStream->IsEOF() ) return false;
+
+ } catch ( ... ) {
+
+ return false;
+
+ }
+
+ return true;
+
+ } // ReadTag
+
+ // =============================================================================================
+
+ bool WriteXMPTag ( LFA_FileRef fileRef, XMP_Uns32 len, const char* inBuffer )
+ {
+ bool ret = false;
+
+ XMP_Uns16 code = MakeUns16LE ( (SWF_TAG_ID_METADATA << 6) | 0x3F );
+ XMP_Uns32 length = MakeUns32LE ( len );
+
+ try {
+ LFA_Write (fileRef, &code, 2 );
+ LFA_Write (fileRef, &length, 4 );
+ LFA_Write (fileRef, inBuffer, len );
+ ret = true;
+ } catch ( ... ) {}
+
+ return ret;
+
+ } // WriteXMPTag
+
+ // =============================================================================================
+
+ bool CopyHeader ( LFA_FileRef sourceRef, LFA_FileRef destRef, const TagState& tagState )
+ {
+ try {
+ int headerSize = tagState.headerSize;
+ LFA_Seek ( sourceRef, 0, SEEK_SET );
+ LFA_Copy ( sourceRef, destRef, headerSize );
+ return true;
+ } catch ( ... ) {}
+
+ return false;
+
+ } // CopyHeader
+
+ // =============================================================================================
+
+ bool UpdateHeader ( LFA_FileRef fileRef )
+ {
+
+ try {
+
+ XMP_Int64 length64 = LFA_Measure ( fileRef );
+ if ( (length64 < 8) || (length64 > (XMP_Int64)0xFFFFFFFFULL) ) return false;
+
+ XMP_Uns32 length32 = MakeUns32LE ( (XMP_Uns32)length64 );
+
+ LFA_Seek ( fileRef, 4, SEEK_SET );
+ LFA_Write ( fileRef, &length32, 4 );
+
+ return true;
+
+ } catch ( ... ) {}
+
+ return false;
+
+ } // UpdateHeader
+
+ // =============================================================================================
+
+ bool CopyTag ( LFA_FileRef sourceRef, LFA_FileRef destRef, TagData& tag )
+ {
+
+ try {
+ LFA_Seek ( sourceRef, tag.pos, SEEK_SET );
+ LFA_Copy ( sourceRef, destRef, (tag.len + tag.offset) );
+ return true;
+ } catch ( ... ) {}
+
+ return false;
+
+ } // CopyTag
+
+ // =============================================================================================
+
+ bool ReadBuffer ( LFA_FileRef fileRef, XMP_Uns64& pos, XMP_Uns32 len, XMP_Uns8* outBuffer )
+ {
+
+ try {
+ if ( (fileRef == 0) || (outBuffer == 0) ) return false;
+ LFA_Seek ( fileRef, pos, SEEK_SET );
+ long bytesRead = LFA_Read ( fileRef, outBuffer, len );
+ return ( (XMP_Uns32)bytesRead == len );
+ } catch ( ... ) {}
+
+ return false;
+
+ } // ReadBuffer
+
+ // =============================================================================================
+
+ bool WriteBuffer ( LFA_FileRef fileRef, XMP_Uns64& pos, XMP_Uns32 len, const char* inBuffer )
+ {
+
+ try {
+ if ( (fileRef == 0) || (inBuffer == 0) ) return false;
+ LFA_Seek ( fileRef, pos, SEEK_SET );
+ LFA_Write ( fileRef, inBuffer, len );
+ return true;
+ }
+ catch ( ... ) {}
+
+ return false;
+
+ } // WriteBuffer
+
+ // =============================================================================================
+
+ bool UpdateFileAttrTag ( LFA_FileRef fileRef, const TagData& fileAttrTag, const TagState& tagState )
+ {
+
+ try {
+ XMP_Uns32 flags = tagState.fileAttrFlags;
+ flags |= SWF_METADATA_FLAG;
+ return WriteFileAttrFlags ( fileRef, fileAttrTag, flags );
+ } catch ( ... ) {}
+
+ return false;
+
+ } // UpdateFileAttrTag
+
+ // =============================================================================================
+
+
+ bool WriteFileAttrFlags ( LFA_FileRef fileRef, const TagData& fileAttrTag, XMP_Uns32 flags )
+ {
+
+ try {
+ XMP_Uns32 bitMask = MakeUns32LE ( flags );
+ LFA_Seek ( fileRef, fileAttrTag.pos + fileAttrTag.offset, SEEK_SET );
+ LFA_Write ( fileRef, &bitMask, 4 );
+ return true;
+ } catch ( ... ) {}
+
+ return false;
+
+ } // WriteFileAttrFlags
+
+ // =============================================================================================
+ // =============================================================================================
+
+ FileInfo::FileInfo ( LFA_FileRef fileRef, const std::string& origPath )
+ {
+
+ this->compressedFile = false;
+ this->iSize = 0;
+ this->CheckFormat ( fileRef );
+ this->origFilePath.assign ( origPath );
+ this->fileRef = fileRef;
+
+ } // FileInfo::FileInfo
+
+ // =============================================================================================
+
+ void FileInfo::CheckFormat ( LFA_FileRef fileRef )
+ {
+ IOBuffer ioBuf;
+
+ LFA_Seek ( fileRef, 0, SEEK_SET );
+
+ if ( CheckFileSpace ( fileRef, &ioBuf, SWF_SIGNATURE_LEN ) ) {
+
+ if ( CheckBytes ( ioBuf.ptr, SWF_F_SIGNATURE_DATA, SWF_SIGNATURE_LEN ) ) {
+ this->compressedFile = false;
+ } else if ( CheckBytes ( ioBuf.ptr, SWF_C_SIGNATURE_DATA, SWF_SIGNATURE_LEN ) ) {
+ this->compressedFile = true;
+ }
+
+ LFA_Seek ( fileRef, 4, SEEK_SET );
+ XMP_Uns8 buffer[4];
+ LFA_Read ( fileRef, buffer, 4 );
+ iSize = GetUns32LE ( buffer );
+
+ }
+
+ LFA_Seek ( fileRef, 0, SEEK_SET );
+
+ } // FileInfo::CheckFormat
+
+ // =============================================================================================
+
+ bool FileInfo::IsCompressed()
+ {
+
+ return this->compressedFile;
+
+ } // FileInfo::IsCompressed
+
+ // =============================================================================================
+
+ LFA_FileRef FileInfo::Decompress()
+ {
+
+ if ( ! this->IsCompressed() ) return this->fileRef;
+
+ LFA_FileRef updateRef = 0;
+ std::string updatePath;
+
+ try {
+
+ CreateTempFile ( this->origFilePath, &updatePath, kCopyMacRsrc );
+ updateRef = LFA_Open ( updatePath.c_str(), 'w' );
+ this->tmpFilePath.assign ( updatePath );
+
+ int ret = this->Encode ( this->fileRef, updateRef, FWS, Inf );
+ this->tmpFileRef = updateRef;
+ if ( ret != Z_OK ) XMP_Throw ( "zstream error occured", kXMPErr_ExternalFailure );
+
+ return this->tmpFileRef;
+
+ } catch ( ... ) {
+
+ LFA_Close ( updateRef );
+ LFA_Delete ( updatePath.c_str() );
+ return this->fileRef;
+
+ }
+
+ } // FileInfo::Decompress
+
+ // =============================================================================================
+
+ void FileInfo::Compress ( LFA_FileRef sourceRef, LFA_FileRef destRef )
+ {
+
+ if ( this->IsCompressed() ) this->Encode ( sourceRef, destRef, CWS, Def );
+
+ } // FileInfo::Compress
+
+ // =============================================================================================
+
+ void FileInfo::Clean()
+ {
+
+ if ( this->tmpFileRef != 0 ) LFA_Close ( this->tmpFileRef );
+ this->tmpFileRef = 0;
+ this->CleanTempFiles();
+
+ } // FileInfo::Clean
+
+ // =============================================================================================
+
+ void FileInfo::CleanTempFiles()
+ {
+
+ if ( ! this->tmpFilePath.empty() ) {
+ LFA_Delete ( this->tmpFilePath.c_str() );
+ this->tmpFilePath.erase();
+ }
+
+ } // FileInfo::CleanTempFiles
+
+ // =============================================================================================
+
+ int FileInfo::Encode ( LFA_FileRef fileRef, LFA_FileRef updateRef, SWF_MODE swfMode, CompressionFnc cmpFnc )
+ {
+
+ LFA_Seek ( updateRef, 0, SEEK_SET );
+
+ if ( swfMode == CWS ) {
+ LFA_Write ( updateRef, SWF_C_SIGNATURE_DATA, SWF_SIGNATURE_LEN );
+ } else {
+ XMP_Assert ( swfMode == FWS );
+ LFA_Write ( updateRef, SWF_F_SIGNATURE_DATA, SWF_SIGNATURE_LEN );
+ }
+
+ LFA_Seek ( fileRef, SWF_SIGNATURE_LEN, SEEK_SET );
+ LFA_Seek ( updateRef, SWF_SIGNATURE_LEN, SEEK_SET );
+ LFA_Copy ( fileRef, updateRef, 5 );
+
+ int ret = cmpFnc ( fileRef, updateRef );
+ LFA_Flush ( updateRef );
+
+ return ret;
+
+ } // FileInfo::Encode
+
+ // =============================================================================================
+
+ int FileInfo::Inf ( LFA_FileRef source, LFA_FileRef dest )
+ {
+ int ret;
+ unsigned have;
+ z_stream strm;
+ unsigned char in[CHUNK];
+ unsigned char out[CHUNK];
+
+ XMP_Uns64 allBytes = 0;
+
+ // allocate inflate state
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ strm.avail_in = 0;
+ strm.next_in = Z_NULL;
+
+ ret = inflateInit ( &strm );
+
+ if ( ret != Z_OK ) return ret;
+
+ // decompress until deflate stream ends or end of file
+
+ LFA_Seek ( source, SWF_COMPRESSION_BEGIN, SEEK_SET );
+ XMP_Uns64 outPos = SWF_COMPRESSION_BEGIN;
+
+ try {
+
+ do {
+
+ strm.avail_in = LFA_Read ( source, in, CHUNK );
+ if ( strm.avail_in == 0 ) {
+ ret = Z_STREAM_END;
+ break;
+ }
+
+ strm.next_in = in;
+
+ // run inflate() on input until output buffer not full
+ do {
+
+ strm.avail_out = CHUNK;
+ strm.next_out = out;
+ ret = inflate ( &strm, Z_NO_FLUSH );
+ XMP_Assert ( ret != Z_STREAM_ERROR ); // state not clobbered
+
+ switch ( ret ) {
+ case Z_NEED_DICT: ret = Z_DATA_ERROR; // and fall through
+ case Z_DATA_ERROR:
+ case Z_MEM_ERROR: inflateEnd ( &strm );
+ return ret;
+ }
+
+ have = CHUNK - strm.avail_out;
+ LFA_Seek ( dest, outPos, SEEK_SET );
+ LFA_Write ( dest, out, have );
+
+ outPos += have;
+
+ } while ( strm.avail_out == 0 );
+
+ // done when inflate() says it's done
+
+ } while ( ret != Z_STREAM_END );
+
+ } catch ( ... ) {
+
+ inflateEnd ( &strm );
+ return Z_ERRNO;
+
+ }
+
+ // clean up and return
+ inflateEnd ( &strm );
+ return ( (ret == Z_STREAM_END) ? Z_OK : Z_DATA_ERROR );
+
+ } // FileInfo::Inf
+
+ // =============================================================================================
+
+ int FileInfo::Def ( LFA_FileRef source, LFA_FileRef dest )
+ {
+ int ret, flush;
+ unsigned have;
+ z_stream strm;
+ unsigned char in[CHUNK];
+ unsigned char out[CHUNK];
+
+ // allocate deflate state
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ ret = deflateInit ( &strm, SWF_DEFAULT_COMPRESSION_LEVEL );
+ if ( ret != Z_OK ) return ret;
+
+ // compress until end of file
+
+ LFA_Seek ( source, SWF_COMPRESSION_BEGIN, SEEK_SET );
+ XMP_Uns64 outPos = SWF_COMPRESSION_BEGIN;
+
+ try {
+
+ do {
+
+ strm.avail_in = LFA_Read ( source, in, CHUNK );
+
+ flush = ( (strm.avail_in < CHUNK) ? Z_FINISH : Z_NO_FLUSH );
+
+ strm.next_in = in;
+
+ // run deflate() on input until output buffer not full, finish
+ // compression if all of source has been read in
+ do {
+
+ strm.avail_out = CHUNK;
+ strm.next_out = out;
+ ret = deflate ( &strm, flush ); // no bad return value
+ XMP_Assert ( ret != Z_STREAM_ERROR ); // state not clobbered
+ have = CHUNK - strm.avail_out;
+
+ LFA_Seek ( dest, outPos, SEEK_SET );
+ LFA_Write ( dest, out, have );
+ outPos += have;
+
+ } while ( strm.avail_out == 0 );
+ XMP_Assert ( strm.avail_in == 0 ); // all input will be used
+
+ // done when last data in file processed
+
+ } while ( flush != Z_FINISH );
+ XMP_Assert ( ret == Z_STREAM_END ); // stream will be complete
+
+ } catch ( ... ) {
+
+ deflateEnd ( &strm );
+ return Z_ERRNO;
+
+ }
+
+ /* clean up and return */
+ deflateEnd ( &strm );
+ return Z_OK;
+
+ } // FileInfo::Def
+
+ // =============================================================================================
+
+} // namespace SWF_Support
+
+// =================================================================================================
+// =================================================================================================
+
+namespace IO
+{
+
+ // =============================================================================================
+
+ void FileInputStream::InitStream()
+ {
+
+ iEndPos = LFA_Seek ( iFile, 0, SEEK_END );
+ iPos = LFA_Seek ( iFile, 0, SEEK_SET );
+
+ } // FileInputStream::InitStream
+
+ // =============================================================================================
+
+ XMP_Int32 FileInputStream::Read ( XMP_Uns8* ioBuf, XMP_Int32 len )
+ {
+ if ( IsEOF() ) throw new IOException ( IO::STATUS_EOF );
+
+ XMP_Int32 bytes = LFA_Read ( iFile, ioBuf, len );
+ iPos += bytes;
+
+ return bytes;
+
+ } // FileInputStream::Read
+
+ // =============================================================================================
+
+ XMP_Int64 FileInputStream::Skip ( XMP_Int64 len )
+ {
+
+ if ( IsEOF() ) return 0;
+
+ iPos += len;
+ XMP_Int64 bytes = LFA_Seek ( iFile, iPos, SEEK_SET );
+ return bytes;
+
+ } // FileInputStream::Skip
+
+ // =============================================================================================
+
+ void FileInputStream::Reset()
+ {
+
+ iPos = LFA_Seek ( iFile, 0, SEEK_SET );
+
+ } // FileInputStream::Reset
+
+ // =============================================================================================
+
+ bool FileInputStream::IsEOF()
+ {
+
+ return (iPos >= iEndPos);
+
+ } // FileInputStream::IsEOF
+
+ // =============================================================================================
+ // =============================================================================================
+
+ namespace ZIP
+ {
+
+ // =========================================================================================
+
+ DeflateInputStream::DeflateInputStream ( LFA_FileRef file, XMP_Int32 bufferLength )
+ : FileInputStream(file), iStatus(0), iBufferLength(bufferLength)
+ {
+
+ InitStream();
+ iBuffer = new XMP_Uns8[bufferLength];
+
+ } // DeflateInputStream::DeflateInputStream
+
+ // =========================================================================================
+
+ DeflateInputStream::~DeflateInputStream()
+ {
+
+ inflateEnd ( &iStream );
+ delete[] iBuffer;
+ iBuffer = NULL;
+
+ } // DeflateInputStream::~DeflateInputStream
+
+ // =========================================================================================
+
+ void DeflateInputStream::InitStream()
+ {
+
+ iStream.zalloc = Z_NULL;
+ iStream.zfree = Z_NULL;
+ iStream.opaque = Z_NULL;
+ iStream.avail_in = 0;
+ iStream.next_in = Z_NULL;
+ iStream.avail_out = 1;
+
+ iStatus = inflateInit ( &iStream );
+ if ( iStatus != Z_OK ) throw new ZIPException ( iStatus );
+
+ } // DeflateInputStream::InitStream
+
+ // =========================================================================================
+
+ XMP_Int32 DeflateInputStream::Read ( XMP_Uns8* ioBuf, XMP_Int32 len )
+ {
+
+ // *** if ( len > iBufferLength ) throw new IOException ( STATUS_BUFFER_OVERFLOW );
+
+ if( iStream.avail_out != 0 ) {
+ XMP_Int64 pos = GetCurrentPos();
+ iStream.avail_in = FileInputStream::Read ( iBuffer, iBufferLength );
+ iPos = pos + len;
+ iStream.next_in = iBuffer;
+ }
+
+ iStream.avail_out = len;
+ iStream.next_out = ioBuf;
+
+ iStatus = inflate ( &iStream, Z_NO_FLUSH );
+
+ if ( iStatus == Z_MEM_ERROR ) {
+ inflateEnd ( &iStream );
+ throw new ZIPException ( Z_MEM_ERROR );
+ }
+
+ return (len - iStream.avail_out);
+
+ } // DeflateInputStream::Read
+
+ // =========================================================================================
+
+ XMP_Int32 DeflateInputStream::Read ( XMP_Uns8* ioBuf )
+ {
+
+ return Read ( ioBuf, iBufferLength );
+
+ } // DeflateInputStream::Read
+
+ // =========================================================================================
+
+ void DeflateInputStream::Close()
+ {
+
+ inflateEnd ( &iStream );
+ iPos = 0;
+
+ } // DeflateInputStream::Close
+
+ // =========================================================================================
+
+ bool DeflateInputStream::IsEOF()
+ {
+
+ return (iStatus == Z_STREAM_END);
+
+ } // DeflateInputStream::IsEOF
+
+ // =========================================================================================
+
+ XMP_Int64 DeflateInputStream::Skip ( XMP_Int64 len )
+ {
+
+ return Skip ( len, DEFLATE );
+
+ } // DeflateInputStream::Skip
+
+ // =========================================================================================
+
+ XMP_Int64 DeflateInputStream::Skip ( XMP_Int64 len, EDeflate deflate )
+ {
+
+ switch ( deflate ) {
+
+ case DEFLATE:
+ {
+ XMP_Uns8 * buffer = new XMP_Uns8 [ (XMP_Uns32)len ];
+ XMP_Int64 bytes = Read ( buffer, (XMP_Uns32)len );
+ delete[] buffer;
+ return bytes;
+ }
+ break;
+
+ case DEFLATE_NO:
+ return FileInputStream::Skip ( len );
+
+ default:
+ throw new IOException ( STATUS_SKIP );
+
+ }
+
+ } // DeflateInputStream::Skip
+
+ // =========================================================================================
+
+ } // namespace ZIP
+
+ // =============================================================================================
+
+} // namespace IO
diff --git a/source/XMPFiles/FormatSupport/SWF_Support.hpp b/source/XMPFiles/FormatSupport/SWF_Support.hpp
new file mode 100644
index 0000000..ca301b9
--- /dev/null
+++ b/source/XMPFiles/FormatSupport/SWF_Support.hpp
@@ -0,0 +1,254 @@
+#ifndef __SWF_Support_hpp__
+#define __SWF_Support_hpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+//#include "XMP_Environment.h" // ! This must be the first include.
+
+#include "XMPFiles_Impl.hpp"
+
+#define SWF_SIGNATURE_LEN 3
+#define SWF_C_SIGNATURE_DATA "\x43\x57\x53"
+#define SWF_F_SIGNATURE_DATA "\x46\x57\x53"
+
+#define SWF_TAG_ID_FILEATTRIBUTES 69
+#define SWF_TAG_ID_METADATA 77
+#define SWF_TAG_ID_ENDTAG 0
+
+#define SWF_METADATA_FLAG 0x10
+#define SWF_DEFAULT_COMPRESSION_LEVEL Z_DEFAULT_COMPRESSION
+
+#define SWF_COMPRESSION_BEGIN 8
+
+#define CHUNK 16384
+
+#include "zlib.h"
+
+namespace IO
+{
+ //------------------------------------------------------------------
+ //input/output stream declaration
+ typedef enum {FLUSH, FLUSH_NO} EFlush;
+
+ class InputStream
+ {
+ public:
+ virtual ~InputStream() {};
+ virtual XMP_Int32 Read(XMP_Uns8 * ioBuf, XMP_Int32 len) = 0;
+ virtual XMP_Int64 Skip(XMP_Int64 len) = 0;
+ virtual void Reset(void) = 0;
+ virtual void Close(void) = 0;
+ virtual bool IsEOF(void) = 0;
+ virtual XMP_Int64 GetCurrentPos(void) = 0;
+ };
+
+
+ class FileInputStream : public InputStream
+ {
+ public:
+ FileInputStream(LFA_FileRef file) : iFile(file), iPos(0), iEndPos(0) { InitStream(); };
+ virtual ~FileInputStream() {};
+
+ virtual XMP_Int32 Read(XMP_Uns8 * ioBuf, XMP_Int32 len);
+ virtual XMP_Int64 Skip(XMP_Int64 len);
+ virtual void Reset(void);
+ virtual void Close(void) {};
+ virtual bool IsEOF(void);
+ virtual XMP_Int64 GetCurrentPos(void) { return iPos; };
+
+ protected:
+ void InitStream(void);
+
+ LFA_FileRef iFile;
+ XMP_Int64 iPos;
+ XMP_Int64 iEndPos;
+ };
+
+ typedef enum {
+ STATUS_WRITE,
+ STATUS_READ,
+ STATUS_EOF,
+ STATUS_BUFFER_OVERFLOW,
+ STATUS_SKIP
+ } EStatus;
+
+ class IOException
+ {
+ public:
+ IOException(EStatus status) : iStatus(status) {};
+ ~IOException(void) {};
+ EStatus GetErrorCode(void) { return iStatus; };
+ protected:
+ EStatus iStatus;
+
+ };
+
+ namespace ZIP
+ {
+ typedef enum {DEFLATE, DEFLATE_NO} EDeflate;
+
+ class DeflateInputStream : public FileInputStream
+ {
+ public:
+ DeflateInputStream(LFA_FileRef file, XMP_Int32 bufferLength);
+ virtual ~DeflateInputStream();
+
+ virtual XMP_Int32 Read(XMP_Uns8 * ioBuf, XMP_Int32 len);
+ virtual XMP_Int32 Read(XMP_Uns8 * ioBuf);
+ virtual void Close(void);
+ virtual bool IsEOF(void);
+ virtual XMP_Int64 Skip(XMP_Int64 len);
+ virtual XMP_Int64 Skip(XMP_Int64 len, EDeflate deflate);
+ virtual XMP_Int64 GetCurrentPos(void) { return iPos; };
+
+
+ protected:
+ void InitStream(void);
+ z_stream iStream;
+ XMP_Int32 iStatus;
+ XMP_Uns8 * iBuffer;
+ XMP_Int32 iBufferLength;
+
+ };
+
+ class ZIPException
+ {
+ public:
+ ZIPException(XMP_Int32 err) : iErrorCode(err) {};
+ ~ZIPException(void) {};
+
+ XMP_Int32 GetErrorCode(void) { return iErrorCode; };
+
+ protected:
+ XMP_Int32 iErrorCode;
+
+ };
+
+
+ } // namespace zip
+
+} // namespace IO
+
+namespace SWF_Support
+{
+ class TagData
+ {
+ public:
+ TagData() : pos(0), len(0), id(0), offset(0), xmp(false) {}
+ virtual ~TagData() {}
+
+ // Short tag:
+ // | code/length | data |
+ // | 2 | val(length) |
+ // Long tag (data > 63):
+ // | code/length | length | data |
+ // | 2 | 4 | val(length) |
+ XMP_Uns64 pos; // file offset of tag
+ XMP_Uns32 len; // length of tag data
+ long id; // tag ID
+ long offset; // offset of data in tag (short vs. long tag)
+ bool xmp; // tag with XMP ?
+ };
+
+ typedef std::vector<TagData> TagVector;
+ typedef TagVector::iterator TagIterator;
+
+ class TagState
+ {
+ public:
+ TagState() : xmpPos(0), xmpLen(0), headerSize(0),hasFileAttrTag(false), cachingFile(false),
+ hasXMP(false), xmpPacket(""), fileAttrFlags(0) {}
+ virtual ~TagState() {}
+
+ XMP_Uns64 xmpPos;
+ XMP_Uns32 xmpLen;
+ TagData xmpTag;
+ TagVector tags;
+ XMP_Uns32 headerSize;
+ TagData fileAttrTag;
+ XMP_Uns32 fileAttrFlags;
+ bool hasFileAttrTag;
+ bool cachingFile;
+ bool hasXMP;
+ std::string xmpPacket;
+ };
+
+ //compression related data types
+
+ typedef enum swf_mode { CWS, FWS } SWF_MODE;
+ typedef int (*CompressionFnc)(LFA_FileRef source, LFA_FileRef dest);
+
+ class FileInfo
+ {
+ public:
+ FileInfo(LFA_FileRef fileRef, const std::string & origPath);
+ virtual ~FileInfo() {}
+
+ bool IsCompressed();
+ LFA_FileRef Decompress();
+ void Compress(LFA_FileRef sourceRef, LFA_FileRef destRef);
+ void Clean();
+ inline XMP_Uns32 GetSize() { return iSize; }
+
+ private:
+ std::string tmpFilePath;
+ std::string origFilePath;
+ LFA_FileRef fileRef;
+ bool compressedFile;
+ XMP_Uns32 iSize;
+
+ //tmp Data
+ LFA_FileRef tmpFileRef;
+
+
+ void CheckFormat(LFA_FileRef fileRef);
+ void CleanTempFiles();
+
+ int Encode ( LFA_FileRef fileRef, LFA_FileRef updateRef, SWF_MODE swfMode, CompressionFnc cmpFnc );
+
+ static int Inf ( LFA_FileRef source, LFA_FileRef dest );
+ static int Def ( LFA_FileRef source, LFA_FileRef dest );
+
+ };
+
+ long OpenSWF ( IO::InputStream *inputStream, TagState & inOutTagState );
+ bool ReadTag ( IO::InputStream * inputStream, TagState & inOutTagState, long * tagType,
+ XMP_Uns32 * tagLength, XMP_Uns64 & inOutPosition );
+ unsigned long CheckTag ( IO::InputStream * inputStream, const TagState& inOutTagState, const TagData& inOutTagData );
+ bool HasMetadata(IO::InputStream * inputStream, TagState& tagState);
+ XMP_Uns32 ReadFileAttrFlags(IO::InputStream * inputStream);
+
+ bool WriteXMPTag ( LFA_FileRef fileRef, XMP_Uns32 len, const char* inBuffer );
+ bool CopyHeader ( LFA_FileRef sourceRef, LFA_FileRef destRef, const TagState & tagState );
+ bool UpdateHeader ( LFA_FileRef fileRef );
+ bool CopyTag ( LFA_FileRef sourceRef, LFA_FileRef destRef, TagData& tag );
+
+ bool UpdateFileAttrTag(LFA_FileRef fileRef, const TagData& fileAttrTag, const TagState& tagState);
+ bool WriteFileAttrFlags(LFA_FileRef fileRef, const TagData& fileAttrTag, XMP_Uns32 flags);
+
+ bool ReadBuffer ( LFA_FileRef fileRef, XMP_Uns64& pos, XMP_Uns32 len, XMP_Uns8* outBuffer );
+ bool WriteBuffer ( LFA_FileRef fileRef, XMP_Uns64& pos, XMP_Uns32 len, const char* inBuffer );
+
+
+ typedef struct TailBufferDef
+ {
+ XMP_Uns64 tailStartPosition;
+ XMP_Uns64 writePosition;
+ XMP_Uns64 tailEndPosition;
+
+ TailBufferDef() : tailStartPosition(0), writePosition(0), tailEndPosition(0) {};
+ XMP_Uns32 GetTailSize(void) { return static_cast<XMP_Uns32>(tailEndPosition - tailStartPosition); }
+ } TailBufferDef;
+
+
+
+} // namespace SWF_Support
+
+#endif // __SWF_Support_hpp__
diff --git a/source/XMPFiles/FormatSupport/TIFF_FileWriter.cpp b/source/XMPFiles/FormatSupport/TIFF_FileWriter.cpp
index fc8029d..05372b8 100644
--- a/source/XMPFiles/FormatSupport/TIFF_FileWriter.cpp
+++ b/source/XMPFiles/FormatSupport/TIFF_FileWriter.cpp
@@ -1,6 +1,6 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2006-2007 Adobe Systems Incorporated
+// Copyright 2006-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -28,8 +28,8 @@
// Parsing will reset them to the proper endianness for the stream. Big endian is a good default
// since JPEG and PSD files are big endian overall.
-TIFF_FileWriter::TIFF_FileWriter()
- : changed(false), memParsed(false), fileParsed(false), ownedStream(false), memStream(0), tiffLength(0)
+TIFF_FileWriter::TIFF_FileWriter() : changed(false), legacyDeleted(false), memParsed(false),
+ fileParsed(false), ownedStream(false), memStream(0), tiffLength(0)
{
XMP_Uns8 bogusTIFF [kEmptyTIFFLength];
@@ -47,10 +47,6 @@ TIFF_FileWriter::TIFF_FileWriter()
// =================================================================================================
// TIFF_FileWriter::~TIFF_FileWriter
// =================================
-//
-// The InternalTagInfo destructor will deallocate the data for changed tags. It does not know
-// whether they are memory-based or file-based though, so it won't deallocate captured but unchanged
-// file-based tags. Mark those as changed here to make the destructor deallocate them.
TIFF_FileWriter::~TIFF_FileWriter()
{
@@ -62,17 +58,6 @@ TIFF_FileWriter::~TIFF_FileWriter()
free ( this->memStream );
}
- if ( this->fileParsed ) {
- for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) {
- InternalTagMap& currTagMap ( this->containedIFDs[ifd].tagMap );
- InternalTagMap::iterator tagPos = currTagMap.begin();
- InternalTagMap::iterator tagEnd = currTagMap.end();
- for ( ; tagPos != tagEnd; ++tagPos ) {
- if ( tagPos->second.dataPtr != 0 ) tagPos->second.changed = true;
- }
- }
- }
-
} // TIFF_FileWriter::~TIFF_FileWriter
// =================================================================================================
@@ -90,6 +75,7 @@ void TIFF_FileWriter::DeleteExistingInfo()
for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) this->containedIFDs[ifd].clear();
this->changed = false;
+ this->legacyDeleted = false;
this->memParsed = false;
this->fileParsed = false;
this->ownedStream = false;
@@ -161,9 +147,9 @@ bool TIFF_FileWriter::GetIFD ( XMP_Uns8 ifd, TagInfoMap* ifdMap ) const
XMP_Uns32 TIFF_FileWriter::GetValueOffset ( XMP_Uns8 ifd, XMP_Uns16 id ) const
{
const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id );
- if ( (thisTag == 0) || (thisTag->origLen == 0) ) return 0;
+ if ( (thisTag == 0) || (thisTag->origDataLen == 0) ) return 0;
- return thisTag->origOffset;
+ return thisTag->origDataOffset;
} // TIFF_FileWriter::GetValueOffset
@@ -180,7 +166,7 @@ bool TIFF_FileWriter::GetTag ( XMP_Uns8 ifd, XMP_Uns16 id, TagInfo* info ) const
info->id = thisTag->id;
info->type = thisTag->type;
- info->count = thisTag->dataLen / kTIFF_TypeSizes[thisTag->type];
+ info->count = thisTag->dataLen / (XMP_Uns32)kTIFF_TypeSizes[thisTag->type];
info->dataLen = thisTag->dataLen;
info->dataPtr = (const void*)(thisTag->dataPtr);
@@ -203,35 +189,57 @@ void TIFF_FileWriter::SetTag ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns16 type, XMP_U
ifd = PickIFD ( ifd, id );
InternalTagMap& currIFD = this->containedIFDs[ifd].tagMap;
+ InternalTagInfo* tagPtr = 0;
InternalTagMap::iterator tagPos = currIFD.find ( id );
- if ( (tagPos != currIFD.end()) &&
- (type == tagPos->second.type) &&
- (count == tagPos->second.count) &&
- (memcmp ( clientPtr, tagPos->second.dataPtr, tagPos->second.dataLen ) == 0) ) {
- return; // ! The value is unchanged, exit.
- }
- InternalTagInfo newTag ( id, type, count );
- newTag.changed = true;
- newTag.dataLen = count * typeSize;
-
- if ( newTag.dataLen <= 4 ) {
- // The data is less than 4 bytes, store it in the dataOrOffset field. Numbers are already flipped.
- XMP_Assert ( sizeof ( newTag.dataOrOffset ) == 4 );
- memcpy ( &newTag.dataOrOffset, clientPtr, newTag.dataLen ); // AUDIT: Safe, the length is <= 4.
+ if ( tagPos == currIFD.end() ) {
+
+ // The tag does not yet exist, add it.
+ InternalTagMap::value_type mapValue ( id, InternalTagInfo ( id, type, count, this->fileParsed ) );
+ tagPos = currIFD.insert ( tagPos, mapValue );
+ tagPtr = &tagPos->second;
+
} else {
- // The data is more than 4 bytes, make a copy.
- newTag.dataPtr = (XMP_Uns8*) malloc ( newTag.dataLen );
- if ( newTag.dataPtr == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory );
- memcpy ( newTag.dataPtr, clientPtr, newTag.dataLen ); // AUDIT: Safe, malloc'ed newTag.dataLen bytes above.
+
+ tagPtr = &tagPos->second;
+
+ // The tag already exists, make sure the value is actually changing.
+ if ( (type == tagPtr->type) && (count == tagPtr->count) &&
+ (memcmp ( clientPtr, tagPtr->dataPtr, tagPtr->dataLen ) == 0) ) {
+ return; // ! The value is unchanged, exit.
+ }
+
+ tagPtr->FreeData(); // Release any existing data allocation.
+
+ tagPtr->type = type; // These might be changing also.
+ tagPtr->count = count;
+
}
- if ( tagPos == currIFD.end() ) {
- currIFD[id] = newTag;
+ tagPtr->changed = true;
+ tagPtr->dataLen = (XMP_Uns32)fullSize;
+
+ if ( fullSize <= 4 ) {
+ // The data is less than 4 bytes, store it in the smallValue field using native endianness.
+ tagPtr->dataPtr = (XMP_Uns8*) &tagPtr->smallValue;
} else {
- newTag.origLen = tagPos->second.origLen;
- newTag.origOffset = tagPos->second.origOffset;
- tagPos->second = newTag; // ! The InternalTagInfo assign operator transfers dataPtr ownership.
+ // The data is more than 4 bytes, make a copy.
+ tagPtr->dataPtr = (XMP_Uns8*) malloc ( fullSize );
+ if ( tagPtr->dataPtr == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory );
+ }
+ memcpy ( tagPtr->dataPtr, clientPtr, fullSize ); // AUDIT: Safe, space guaranteed to be fullSize.
+
+ if ( ! this->nativeEndian ) {
+ if ( typeSize == 2 ) {
+ XMP_Uns16* flipPtr = (XMP_Uns16*) tagPtr->dataPtr;
+ for ( XMP_Uns32 i = 0; i < count; ++i ) Flip2 ( flipPtr[i] );
+ } else if ( typeSize == 4 ) {
+ XMP_Uns32* flipPtr = (XMP_Uns32*) tagPtr->dataPtr;
+ for ( XMP_Uns32 i = 0; i < count; ++i ) Flip4 ( flipPtr[i] );
+ } else if ( typeSize == 8 ) {
+ XMP_Uns64* flipPtr = (XMP_Uns64*) tagPtr->dataPtr;
+ for ( XMP_Uns32 i = 0; i < count; ++i ) Flip8 ( flipPtr[i] );
+ }
}
this->containedIFDs[ifd].changed = true;
@@ -254,6 +262,7 @@ void TIFF_FileWriter::DeleteTag ( XMP_Uns8 ifd, XMP_Uns16 id )
currIFD.erase ( tagPos );
this->containedIFDs[ifd].changed = true;
this->changed = true;
+ if ( (ifd != kTIFF_PrimaryIFD) || (id != kTIFF_XMP) ) this->legacyDeleted = true;
} // TIFF_FileWriter::DeleteTag
@@ -265,17 +274,17 @@ bool TIFF_FileWriter::GetTag_Integer ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32* da
{
const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id );
if ( thisTag == 0 ) return false;
+ if ( thisTag->count != 1 ) return false;
- if ( data != 0 ) {
- if ( thisTag->type == kTIFF_ShortType ) {
- if ( thisTag->dataLen != 2 ) return false; // Wrong count.
- *data = this->GetUns16 ( thisTag->dataPtr );
- } else if ( thisTag->type == kTIFF_LongType ) {
- if ( thisTag->dataLen != 4 ) return false; // Wrong count.
- *data = this->GetUns32 ( thisTag->dataPtr );
- } else {
- return false;
- }
+ static XMP_Uns32 voidValue;
+ if ( data == 0 ) data = &voidValue;
+
+ if ( thisTag->type == kTIFF_ShortType ) {
+ *data = this->GetUns16 ( thisTag->dataPtr );
+ } else if ( thisTag->type == kTIFF_LongType ) {
+ *data = this->GetUns32 ( thisTag->dataPtr );
+ } else {
+ return false;
}
return true;
@@ -293,7 +302,6 @@ bool TIFF_FileWriter::GetTag_Byte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns8* data )
if ( (thisTag->type != kTIFF_ByteType) || (thisTag->dataLen != 1) ) return false;
if ( data != 0 ) *data = *thisTag->dataPtr;
-
return true;
} // TIFF_FileWriter::GetTag_Byte
@@ -309,7 +317,6 @@ bool TIFF_FileWriter::GetTag_SByte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int8* data
if ( (thisTag->type != kTIFF_SByteType) || (thisTag->dataLen != 1) ) return false;
if ( data != 0 ) *data = *thisTag->dataPtr;
-
return true;
} // TIFF_FileWriter::GetTag_SByte
@@ -324,10 +331,7 @@ bool TIFF_FileWriter::GetTag_Short ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns16* data
if ( thisTag == 0 ) return false;
if ( (thisTag->type != kTIFF_ShortType) || (thisTag->dataLen != 2) ) return false;
- if ( data != 0 ) {
- *data = this->GetUns16 ( thisTag->dataPtr );
- }
-
+ if ( data != 0 ) *data = this->GetUns16 ( thisTag->dataPtr );
return true;
} // TIFF_FileWriter::GetTag_Short
@@ -342,10 +346,7 @@ bool TIFF_FileWriter::GetTag_SShort ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int16* dat
if ( thisTag == 0 ) return false;
if ( (thisTag->type != kTIFF_SShortType) || (thisTag->dataLen != 2) ) return false;
- if ( data != 0 ) {
- *data = (XMP_Int16) this->GetUns16 ( thisTag->dataPtr );
- }
-
+ if ( data != 0 ) *data = (XMP_Int16) this->GetUns16 ( thisTag->dataPtr );
return true;
} // TIFF_FileWriter::GetTag_SShort
@@ -360,10 +361,7 @@ bool TIFF_FileWriter::GetTag_Long ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32* data
if ( thisTag == 0 ) return false;
if ( (thisTag->type != kTIFF_LongType) || (thisTag->dataLen != 4) ) return false;
- if ( data != 0 ) {
- *data = this->GetUns32 ( thisTag->dataPtr );
- }
-
+ if ( data != 0 ) *data = this->GetUns32 ( thisTag->dataPtr );
return true;
} // TIFF_FileWriter::GetTag_Long
@@ -378,10 +376,7 @@ bool TIFF_FileWriter::GetTag_SLong ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int32* data
if ( thisTag == 0 ) return false;
if ( (thisTag->type != kTIFF_SLongType) || (thisTag->dataLen != 4) ) return false;
- if ( data != 0 ) {
- *data = (XMP_Int32) this->GetUns32 ( thisTag->dataPtr );
- }
-
+ if ( data != 0 ) *data = (XMP_Int32) this->GetUns32 ( thisTag->dataPtr );
return true;
} // TIFF_FileWriter::GetTag_SLong
@@ -398,7 +393,7 @@ bool TIFF_FileWriter::GetTag_Rational ( XMP_Uns8 ifd, XMP_Uns16 id, Rational* da
if ( data != 0 ) {
XMP_Uns32* dataPtr = (XMP_Uns32*)thisTag->dataPtr;
- data->num = this->GetUns32 ( dataPtr );
+ data->num = this->GetUns32 ( dataPtr );
data->denom = this->GetUns32 ( dataPtr+1 );
}
@@ -418,7 +413,7 @@ bool TIFF_FileWriter::GetTag_SRational ( XMP_Uns8 ifd, XMP_Uns16 id, SRational*
if ( data != 0 ) {
XMP_Uns32* dataPtr = (XMP_Uns32*)thisTag->dataPtr;
- data->num = (XMP_Int32) this->GetUns32 ( dataPtr );
+ data->num = (XMP_Int32) this->GetUns32 ( dataPtr );
data->denom = (XMP_Int32) this->GetUns32 ( dataPtr+1 );
}
@@ -436,10 +431,7 @@ bool TIFF_FileWriter::GetTag_Float ( XMP_Uns8 ifd, XMP_Uns16 id, float* data ) c
if ( thisTag == 0 ) return false;
if ( (thisTag->type != kTIFF_FloatType) || (thisTag->dataLen != 4) ) return false;
- if ( data != 0 ) {
- *data = this->GetFloat ( thisTag->dataPtr );
- }
-
+ if ( data != 0 ) *data = this->GetFloat ( thisTag->dataPtr );
return true;
} // TIFF_FileWriter::GetTag_Float
@@ -454,11 +446,7 @@ bool TIFF_FileWriter::GetTag_Double ( XMP_Uns8 ifd, XMP_Uns16 id, double* data )
if ( (thisTag == 0) || (thisTag->dataPtr == 0) ) return false;
if ( (thisTag->type != kTIFF_DoubleType) || (thisTag->dataLen != 8) ) return false;
- if ( data != 0 ) {
- double* dataPtr = (double*)thisTag->dataPtr;
- *data = this->GetDouble ( dataPtr );
- }
-
+ if ( data != 0 ) *data = this->GetDouble ( thisTag->dataPtr );
return true;
} // TIFF_FileWriter::GetTag_Double
@@ -517,6 +505,7 @@ bool TIFF_FileWriter::IsLegacyChanged()
{
if ( ! this->changed ) return false;
+ if ( this->legacyDeleted ) return true;
for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) {
@@ -557,6 +546,7 @@ void TIFF_FileWriter::ParseMemoryStream ( const void* data, XMP_Uns32 length, bo
this->memStream = (XMP_Uns8*) malloc(length);
if ( this->memStream == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory );
memcpy ( this->memStream, data, length ); // AUDIT: Safe, malloc'ed length bytes above.
+ this->ownedStream = true;
}
this->tiffLength = length;
@@ -569,19 +559,19 @@ void TIFF_FileWriter::ParseMemoryStream ( const void* data, XMP_Uns32 length, bo
const InternalTagInfo* exifIFDTag = this->FindTagInIFD ( kTIFF_PrimaryIFD, kTIFF_ExifIFDPointer );
if ( (exifIFDTag != 0) && (exifIFDTag->type == kTIFF_LongType) && (exifIFDTag->dataLen == 4) ) {
- XMP_Uns32 exifOffset = this->GetUns32 ( &exifIFDTag->dataOrOffset );
+ XMP_Uns32 exifOffset = this->GetUns32 ( exifIFDTag->dataPtr );
(void) this->ProcessMemoryIFD ( exifOffset, kTIFF_ExifIFD );
}
const InternalTagInfo* gpsIFDTag = this->FindTagInIFD ( kTIFF_PrimaryIFD, kTIFF_GPSInfoIFDPointer );
if ( (gpsIFDTag != 0) && (gpsIFDTag->type == kTIFF_LongType) && (gpsIFDTag->dataLen == 4) ) {
- XMP_Uns32 gpsOffset = this->GetUns32 ( &gpsIFDTag->dataOrOffset );
+ XMP_Uns32 gpsOffset = this->GetUns32 ( gpsIFDTag->dataPtr );
(void) this->ProcessMemoryIFD ( gpsOffset, kTIFF_GPSInfoIFD );
}
const InternalTagInfo* interopIFDTag = this->FindTagInIFD ( kTIFF_ExifIFD, kTIFF_InteroperabilityIFDPointer );
if ( (interopIFDTag != 0) && (interopIFDTag->type == kTIFF_LongType) && (interopIFDTag->dataLen == 4) ) {
- XMP_Uns32 interopOffset = this->GetUns32 ( &interopIFDTag->dataOrOffset );
+ XMP_Uns32 interopOffset = this->GetUns32 ( interopIFDTag->dataPtr );
(void) this->ProcessMemoryIFD ( interopOffset, kTIFF_InteropIFD );
}
@@ -592,7 +582,7 @@ void TIFF_FileWriter::ParseMemoryStream ( const void* data, XMP_Uns32 length, bo
(void) this->ProcessMemoryIFD ( tnailIFDOffset, kTIFF_TNailIFD );
const InternalTagInfo* jpegInfo = FindTagInIFD ( kTIFF_TNailIFD, kTIFF_JPEGInterchangeFormat );
if ( jpegInfo != 0 ) {
- XMP_Uns32 tnailImageOffset = this->GetUns32 ( &jpegInfo->dataOrOffset );
+ XMP_Uns32 tnailImageOffset = this->GetUns32 ( jpegInfo->dataPtr );
this->jpegTNailPtr = (XMP_Uns8*)this->memStream + tnailImageOffset;
}
}
@@ -604,13 +594,13 @@ void TIFF_FileWriter::ParseMemoryStream ( const void* data, XMP_Uns32 length, bo
InternalIFDInfo & thisIFD = this->containedIFDs[ifd];
printf ( "\n IFD %d, count %d, mapped %d, offset %d (0x%X), next IFD %d (0x%X)\n",
ifd, thisIFD.origCount, thisIFD.tagMap.size(),
- thisIFD.origOffset, thisIFD.origOffset, thisIFD.origNextIFD, thisIFD.origNextIFD );
+ thisIFD.origDataOffset, thisIFD.origDataOffset, thisIFD.origNextIFD, thisIFD.origNextIFD );
InternalTagMap::iterator tagPos;
InternalTagMap::iterator tagEnd = thisIFD.tagMap.end();
for ( tagPos = thisIFD.tagMap.begin(); tagPos != tagEnd; ++tagPos ) {
InternalTagInfo & thisTag = tagPos->second;
- printf ( " Tag %d, dataOrOffset 0x%X, origLen %d, origOffset %d (0x%X)\n",
- thisTag.id, thisTag.dataOrOffset, thisTag.origLen, thisTag.origOffset, thisTag.origOffset );
+ printf ( " Tag %d, smallValue 0x%X, origDataLen %d, origDataOffset %d (0x%X)\n",
+ thisTag.id, thisTag.smallValue, thisTag.origDataLen, thisTag.origDataOffset, thisTag.origDataOffset );
}
}
printf ( "\n" );
@@ -638,27 +628,32 @@ XMP_Uns32 TIFF_FileWriter::ProcessMemoryIFD ( XMP_Uns32 ifdOffset, XMP_Uns8 ifd
if ( tagCount >= 0x8000 ) XMP_Throw ( "Outrageous IFD count", kXMPErr_BadTIFF );
if ( (ifdOffset + 2 + tagCount*12 + 4) > this->tiffLength ) XMP_Throw ( "Out of bounds IFD", kXMPErr_BadTIFF );
- ifdInfo.origOffset = ifdOffset;
+ ifdInfo.origIFDOffset = ifdOffset;
ifdInfo.origCount = tagCount;
for ( size_t i = 0; i < tagCount; ++i ) {
- RawIFDEntry* rawTag = &ifdEntries[i];
- InternalTagInfo mapTag ( this->GetUns16(&rawTag->id), this->GetUns16(&rawTag->type), this->GetUns32(&rawTag->count) );
- if ( (mapTag.type < kTIFF_ByteType) || (mapTag.type > kTIFF_LastType) ) continue; // Bad type, skip this tag.
+ RawIFDEntry* rawTag = &ifdEntries[i];
+ XMP_Uns16 tagType = this->GetUns16 ( &rawTag->type );
+ if ( (tagType < kTIFF_ByteType) || (tagType > kTIFF_LastType) ) continue; // Bad type, skip this tag.
+
+ XMP_Uns16 tagID = this->GetUns16 ( &rawTag->id );
+ XMP_Uns32 tagCount = this->GetUns32 ( &rawTag->count );
- mapTag.dataLen = mapTag.origLen = mapTag.count * kTIFF_TypeSizes[mapTag.type];
- mapTag.dataOrOffset = rawTag->dataOrOffset; // Keep the value or offset in stream byte ordering.
+ InternalTagMap::value_type mapValue ( tagID, InternalTagInfo ( tagID, tagType, tagCount, kIsMemoryBased ) );
+ InternalTagMap::iterator newPos = ifdInfo.tagMap.insert ( ifdInfo.tagMap.end(), mapValue );
+ InternalTagInfo& mapTag = newPos->second;
+
+ mapTag.dataLen = mapTag.origDataLen = mapTag.count * (XMP_Uns32)kTIFF_TypeSizes[mapTag.type];
+ mapTag.smallValue = rawTag->dataOrOffset; // Keep the value or offset in stream byte ordering.
if ( mapTag.dataLen <= 4 ) {
- mapTag.dataPtr = (XMP_Uns8*) &mapTag.dataOrOffset;
- mapTag.origOffset = ifdOffset + 2 + (12 * i); // Compute the data offset.
+ mapTag.origDataOffset = ifdOffset + 2 + (12 * (XMP_Uns32)i) + 8; // Compute the data offset.
} else {
- mapTag.origOffset = this->GetUns32 ( &rawTag->dataOrOffset ); // Extract the data offset.
- mapTag.dataPtr = this->memStream + mapTag.origOffset;
+ mapTag.origDataOffset = this->GetUns32 ( &rawTag->dataOrOffset ); // Extract the data offset.
// printf ( "FW_ProcessMemoryIFD tag %d large value @ %.8X\n", mapTag.id, mapTag.dataPtr );
}
- ifdInfo.tagMap[mapTag.id] = mapTag;
+ mapTag.dataPtr = this->memStream + mapTag.origDataOffset;
}
@@ -748,19 +743,19 @@ void TIFF_FileWriter::ParseFileStream ( LFA_FileRef fileRef )
const InternalTagInfo* exifIFDTag = this->FindTagInIFD ( kTIFF_PrimaryIFD, kTIFF_ExifIFDPointer );
if ( (exifIFDTag != 0) && (exifIFDTag->type == kTIFF_LongType) && (exifIFDTag->count == 1) ) {
- XMP_Uns32 exifOffset = this->GetUns32 ( &exifIFDTag->dataOrOffset );
+ XMP_Uns32 exifOffset = this->GetUns32 ( exifIFDTag->dataPtr );
(void) this->ProcessFileIFD ( kTIFF_ExifIFD, exifOffset, fileRef, &ioBuf );
}
const InternalTagInfo* gpsIFDTag = this->FindTagInIFD ( kTIFF_PrimaryIFD, kTIFF_GPSInfoIFDPointer );
if ( (gpsIFDTag != 0) && (gpsIFDTag->type == kTIFF_LongType) && (gpsIFDTag->count == 1) ) {
- XMP_Uns32 gpsOffset = this->GetUns32 ( &gpsIFDTag->dataOrOffset );
+ XMP_Uns32 gpsOffset = this->GetUns32 ( gpsIFDTag->dataPtr );
(void) this->ProcessFileIFD ( kTIFF_GPSInfoIFD, gpsOffset, fileRef, &ioBuf );
}
const InternalTagInfo* interopIFDTag = this->FindTagInIFD ( kTIFF_ExifIFD, kTIFF_InteroperabilityIFDPointer );
if ( (interopIFDTag != 0) && (interopIFDTag->type == kTIFF_LongType) && (interopIFDTag->dataLen == 4) ) {
- XMP_Uns32 interopOffset = this->GetUns32 ( &interopIFDTag->dataOrOffset );
+ XMP_Uns32 interopOffset = this->GetUns32 ( interopIFDTag->dataPtr );
(void) this->ProcessFileIFD ( kTIFF_InteropIFD, interopOffset, fileRef, &ioBuf );
}
@@ -779,13 +774,13 @@ void TIFF_FileWriter::ParseFileStream ( LFA_FileRef fileRef )
InternalIFDInfo & thisIFD = this->containedIFDs[ifd];
printf ( "\n IFD %d, count %d, mapped %d, offset %d (0x%X), next IFD %d (0x%X)\n",
ifd, thisIFD.origCount, thisIFD.tagMap.size(),
- thisIFD.origOffset, thisIFD.origOffset, thisIFD.origNextIFD, thisIFD.origNextIFD );
+ thisIFD.origDataOffset, thisIFD.origDataOffset, thisIFD.origNextIFD, thisIFD.origNextIFD );
InternalTagMap::iterator tagPos;
InternalTagMap::iterator tagEnd = thisIFD.tagMap.end();
for ( tagPos = thisIFD.tagMap.begin(); tagPos != tagEnd; ++tagPos ) {
InternalTagInfo & thisTag = tagPos->second;
- printf ( " Tag %d, dataOrOffset 0x%X, origLen %d, origOffset %d (0x%X)\n",
- thisTag.id, thisTag.dataOrOffset, thisTag.origLen, thisTag.origOffset, thisTag.origOffset );
+ printf ( " Tag %d, smallValue 0x%X, origDataLen %d, origDataOffset %d (0x%X)\n",
+ thisTag.id, thisTag.smallValue, thisTag.origDataLen, thisTag.origDataOffset, thisTag.origDataOffset );
}
}
printf ( "\n" );
@@ -811,7 +806,7 @@ XMP_Uns32 TIFF_FileWriter::ProcessFileIFD ( XMP_Uns8 ifd, XMP_Uns32 ifdOffset, L
if ( tagCount >= 0x8000 ) XMP_Throw ( "Outrageous IFD count", kXMPErr_BadTIFF );
if ( (ifdOffset + 2 + tagCount*12 + 4) > this->tiffLength ) XMP_Throw ( "Out of bounds IFD", kXMPErr_BadTIFF );
- ifdInfo.origOffset = ifdOffset;
+ ifdInfo.origIFDOffset = ifdOffset;
ifdInfo.origCount = tagCount;
// ---------------------------------------------------------------------------------------------
@@ -826,20 +821,26 @@ XMP_Uns32 TIFF_FileWriter::ProcessFileIFD ( XMP_Uns8 ifd, XMP_Uns32 ifdOffset, L
if ( ! CheckFileSpace ( fileRef, ioBuf, 12 ) ) XMP_Throw ( "EOF within IFD", kXMPErr_BadTIFF );
- RawIFDEntry* rawTag = (RawIFDEntry*)ioBuf->ptr;
- InternalTagInfo mapTag ( this->GetUns16(&rawTag->id), this->GetUns16(&rawTag->type), this->GetUns32(&rawTag->count) );
- if ( (mapTag.type < kTIFF_ByteType) || (mapTag.type > kTIFF_LastType) ) continue; // Bad type, skip this tag.
+ RawIFDEntry* rawTag = (RawIFDEntry*)ioBuf->ptr;
+ XMP_Uns16 tagType = this->GetUns16 ( &rawTag->type );
+ if ( (tagType < kTIFF_ByteType) || (tagType > kTIFF_LastType) ) continue; // Bad type, skip this tag.
+
+ XMP_Uns16 tagID = this->GetUns16 ( &rawTag->id );
+ XMP_Uns32 tagCount = this->GetUns32 ( &rawTag->count );
- mapTag.dataLen = mapTag.origLen = mapTag.count * kTIFF_TypeSizes[mapTag.type];
- mapTag.dataOrOffset = rawTag->dataOrOffset; // Keep the value or offset in stream byte ordering.
+ InternalTagMap::value_type mapValue ( tagID, InternalTagInfo ( tagID, tagType, tagCount, kIsFileBased ) );
+ InternalTagMap::iterator newPos = ifdInfo.tagMap.insert ( ifdInfo.tagMap.end(), mapValue );
+ InternalTagInfo& mapTag = newPos->second;
+
+ mapTag.dataLen = mapTag.origDataLen = mapTag.count * (XMP_Uns32)kTIFF_TypeSizes[mapTag.type];
+ mapTag.smallValue = rawTag->dataOrOffset; // Keep the value or offset in stream byte ordering.
if ( mapTag.dataLen <= 4 ) {
- mapTag.dataPtr = (XMP_Uns8*) &mapTag.dataOrOffset;
- mapTag.origOffset = ifdOffset + 2 + (12 * i); // Compute the data offset.
+ mapTag.dataPtr = (XMP_Uns8*) &mapTag.smallValue;
+ mapTag.origDataOffset = ifdOffset + 2 + (12 * i) + 8; // Compute the data offset.
} else {
- mapTag.origOffset = this->GetUns32 ( &rawTag->dataOrOffset ); // Extract the data offset.
+ mapTag.origDataOffset = this->GetUns32 ( &rawTag->dataOrOffset ); // Extract the data offset.
}
- ifdInfo.tagMap[mapTag.id] = mapTag;
}
@@ -860,20 +861,20 @@ XMP_Uns32 TIFF_FileWriter::ProcessFileIFD ( XMP_Uns8 ifd, XMP_Uns32 ifdOffset, L
const XMP_Uns16* knownTagPtr = sKnownTags[ifd]; // Points into the ordered recognized tag list.
XMP_Uns32 bufBegin = (XMP_Uns32)ioBuf->filePos; // TIFF stream bounds for the current buffer.
- XMP_Uns32 bufEnd = bufBegin + ioBuf->len;
+ XMP_Uns32 bufEnd = bufBegin + (XMP_Uns32)ioBuf->len;
for ( ; tagPos != tagEnd; ++tagPos ) {
InternalTagInfo* currTag = &tagPos->second;
- if ( currTag->dataLen <= 4 ) continue; // Short values are already in the dataOrOffset field.
+ if ( currTag->dataLen <= 4 ) continue; // Short values are already in the smallValue field.
while ( *knownTagPtr < currTag->id ) ++knownTagPtr;
if ( *knownTagPtr != currTag->id ) continue; // Skip unrecognized tags.
if ( currTag->dataLen > 1024*1024 ) XMP_Throw ( "Outrageous data length", kXMPErr_BadTIFF );
- if ( (bufBegin <= currTag->origOffset) && ((currTag->origOffset + currTag->dataLen) <= bufEnd) ) {
+ if ( (bufBegin <= currTag->origDataOffset) && ((currTag->origDataOffset + currTag->dataLen) <= bufEnd) ) {
// This value is already fully within the current I/O buffer, copy it.
- MoveToOffset ( fileRef, currTag->origOffset, ioBuf );
+ MoveToOffset ( fileRef, currTag->origDataOffset, ioBuf );
currTag->dataPtr = (XMP_Uns8*) malloc ( currTag->dataLen );
if ( currTag->dataPtr == 0 ) XMP_Throw ( "No data block", kXMPErr_NoMemory );
memcpy ( currTag->dataPtr, ioBuf->ptr, currTag->dataLen ); // AUDIT: Safe, malloc'ed currTag->dataLen bytes above.
@@ -899,15 +900,15 @@ XMP_Uns32 TIFF_FileWriter::ProcessFileIFD ( XMP_Uns8 ifd, XMP_Uns32 ifdOffset, L
currTag->dataPtr = (XMP_Uns8*) malloc ( currTag->dataLen );
if ( currTag->dataPtr == 0 ) XMP_Throw ( "No data block", kXMPErr_NoMemory );
-
+
if ( currTag->dataLen > kIOBufferSize ) {
// This value is bigger than the I/O buffer, read it directly and restore the file position.
- LFA_Seek ( fileRef, currTag->origOffset, SEEK_SET );
+ LFA_Seek ( fileRef, currTag->origDataOffset, SEEK_SET );
LFA_Read ( fileRef, currTag->dataPtr, currTag->dataLen, kLFA_RequireAll );
LFA_Seek ( fileRef, (ioBuf->filePos + ioBuf->len), SEEK_SET );
} else {
// This value can fit in the I/O buffer, so use that.
- MoveToOffset ( fileRef, currTag->origOffset, ioBuf );
+ MoveToOffset ( fileRef, currTag->origDataOffset, ioBuf );
ok = CheckFileSpace ( fileRef, ioBuf, currTag->dataLen );
if ( ! ok ) XMP_Throw ( "EOF in data block", kXMPErr_BadTIFF );
memcpy ( currTag->dataPtr, ioBuf->ptr, currTag->dataLen ); // AUDIT: Safe, malloc'ed currTag->dataLen bytes above.
@@ -930,7 +931,7 @@ XMP_Uns32 TIFF_FileWriter::ProcessFileIFD ( XMP_Uns8 ifd, XMP_Uns32 ifdOffset, L
void TIFF_FileWriter::IntegrateFromPShop6 ( const void * buriedPtr, size_t buriedLen )
{
TIFF_MemoryReader buriedExif;
- buriedExif.ParseMemoryStream ( buriedPtr, buriedLen );
+ buriedExif.ParseMemoryStream ( buriedPtr, (XMP_Uns32) buriedLen );
this->ProcessPShop6IFD ( buriedExif, kTIFF_PrimaryIFD );
this->ProcessPShop6IFD ( buriedExif, kTIFF_TNailIFD );
@@ -949,27 +950,27 @@ void TIFF_FileWriter::IntegrateFromPShop6 ( const void * buriedPtr, size_t burie
void* TIFF_FileWriter::CopyTagToMasterIFD ( const TagInfo & ps6Tag, InternalIFDInfo * masterIFD )
{
- InternalTagInfo newTag ( ps6Tag.id, ps6Tag.type, ps6Tag.count );
+ InternalTagMap::value_type mapValue ( ps6Tag.id, InternalTagInfo ( ps6Tag.id, ps6Tag.type, ps6Tag.count, this->fileParsed ) );
+ InternalTagMap::iterator newPos = masterIFD->tagMap.insert ( masterIFD->tagMap.end(), mapValue );
+ InternalTagInfo& newTag = newPos->second;
newTag.dataLen = ps6Tag.dataLen;
if ( newTag.dataLen <= 4 ) {
- newTag.dataPtr = (XMP_Uns8*) &newTag.dataOrOffset;
- newTag.dataOrOffset = *((XMP_Uns32*)ps6Tag.dataPtr);
+ newTag.dataPtr = (XMP_Uns8*) &newTag.smallValue;
+ newTag.smallValue = *((XMP_Uns32*)ps6Tag.dataPtr);
} else {
- XMP_Assert ( newTag.dataOrOffset == 0 );
newTag.dataPtr = (XMP_Uns8*) malloc ( newTag.dataLen );
if ( newTag.dataPtr == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory );
memcpy ( newTag.dataPtr, ps6Tag.dataPtr, newTag.dataLen ); // AUDIT: Safe, malloc'ed dataLen bytes above.
}
newTag.changed = true; // ! See comments with ProcessPShop6IFD.
- XMP_Assert ( (newTag.origLen == 0) && (newTag.origOffset == 0) );
+ XMP_Assert ( (newTag.origDataLen == 0) && (newTag.origDataOffset == 0) );
- masterIFD->tagMap[newTag.id] = newTag;
masterIFD->changed = true;
- return masterIFD->tagMap[newTag.id].dataPtr; // ! Return the address within the map entry for small values.
+ return newPos->second.dataPtr; // ! Return the address within the map entry for small values.
} // TIFF_FileWriter::CopyTagToMasterIFD
@@ -1098,7 +1099,7 @@ void TIFF_FileWriter::ProcessPShop6IFD ( const TIFF_MemoryReader& buriedExif, XM
(ps6Tag.id == kTIFF_JPEGInterchangeFormat) ||
(ps6Tag.id == kTIFF_InteroperabilityIFDPointer) ) continue;
- void* voidPtr = CopyTagToMasterIFD ( ps6Tag, masterIFD );
+ void* voidPtr = this->CopyTagToMasterIFD ( ps6Tag, masterIFD );
if ( needsFlipping ) {
switch ( ps6Tag.type ) {
@@ -1187,9 +1188,9 @@ XMP_Uns32 TIFF_FileWriter::DetermineAppendInfo ( XMP_Uns32 appendedOrigin,
printf ( "\nEntering TIFF_FileWriter::DetermineAppendInfo%s\n", (appendAll ? ", append all" : "") );
for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) {
InternalIFDInfo & thisIFD = this->containedIFDs[ifd];
- printf ( "\n IFD %d, origCount %d, map.size %d, origOffset %d (0x%X), origNextIFD %d (0x%X)",
+ printf ( "\n IFD %d, origCount %d, map.size %d, origIFDOffset %d (0x%X), origNextIFD %d (0x%X)",
ifd, thisIFD.origCount, thisIFD.tagMap.size(),
- thisIFD.origOffset, thisIFD.origOffset, thisIFD.origNextIFD, thisIFD.origNextIFD );
+ thisIFD.origIFDOffset, thisIFD.origIFDOffset, thisIFD.origNextIFD, thisIFD.origNextIFD );
if ( thisIFD.changed ) printf ( ", changed" );
if ( thisIFD.origCount < thisIFD.tagMap.size() ) printf ( ", should get appended" );
printf ( "\n" );
@@ -1197,10 +1198,10 @@ XMP_Uns32 TIFF_FileWriter::DetermineAppendInfo ( XMP_Uns32 appendedOrigin,
InternalTagMap::iterator tagEnd = thisIFD.tagMap.end();
for ( tagPos = thisIFD.tagMap.begin(); tagPos != tagEnd; ++tagPos ) {
InternalTagInfo & thisTag = tagPos->second;
- printf ( " Tag %d, dataOrOffset 0x%X, origLen %d, origOffset %d (0x%X)",
- thisTag.id, thisTag.dataOrOffset, thisTag.origLen, thisTag.origOffset, thisTag.origOffset );
+ printf ( " Tag %d, smallValue 0x%X, origDataLen %d, origDataOffset %d (0x%X)",
+ thisTag.id, thisTag.smallValue, thisTag.origDataLen, thisTag.origDataOffset, thisTag.origDataOffset );
if ( thisTag.changed ) printf ( ", changed" );
- if ( (thisTag.dataLen > thisTag.origLen) && (thisTag.dataLen > 4) ) printf ( ", should get appended" );
+ if ( (thisTag.dataLen > thisTag.origDataLen) && (thisTag.dataLen > 4) ) printf ( ", should get appended" );
printf ( "\n" );
}
}
@@ -1254,10 +1255,10 @@ XMP_Uns32 TIFF_FileWriter::DetermineAppendInfo ( XMP_Uns32 appendedOrigin,
if ( ! (appendAll | ifdInfo.changed) ) continue;
if ( tagCount == 0 ) continue;
- newIFDOffsets[ifd] = ifdInfo.origOffset;
+ newIFDOffsets[ifd] = ifdInfo.origIFDOffset;
if ( appendedIFDs[ifd] ) {
newIFDOffsets[ifd] = appendedOrigin + appendedLength;
- appendedLength += 6 + (12 * tagCount);
+ appendedLength += (XMP_Uns32)( 6 + (12 * tagCount) );
}
InternalTagMap::iterator tagPos = ifdInfo.tagMap.begin();
@@ -1268,10 +1269,10 @@ XMP_Uns32 TIFF_FileWriter::DetermineAppendInfo ( XMP_Uns32 appendedOrigin,
InternalTagInfo & currTag ( tagPos->second );
if ( (! (appendAll | currTag.changed)) || (currTag.dataLen <= 4) ) continue;
- if ( (currTag.dataLen <= currTag.origLen) && (! appendAll) ) {
- this->PutUns32 ( currTag.origOffset, &currTag.dataOrOffset ); // Reuse the old space.
+ if ( (currTag.dataLen <= currTag.origDataLen) && (! appendAll) ) {
+ this->PutUns32 ( currTag.origDataOffset, &currTag.smallValue ); // Reuse the old space.
} else {
- this->PutUns32 ( (appendedOrigin + appendedLength), &currTag.dataOrOffset ); // Set the appended offset.
+ this->PutUns32 ( (appendedOrigin + appendedLength), &currTag.smallValue ); // Set the appended offset.
appendedLength += ((currTag.dataLen + 1) & 0xFFFFFFFEUL); // Round to an even size.
}
@@ -1296,9 +1297,9 @@ XMP_Uns32 TIFF_FileWriter::DetermineAppendInfo ( XMP_Uns32 appendedOrigin,
printf ( "Exiting TIFF_FileWriter::DetermineAppendInfo\n" );
for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) {
InternalIFDInfo & thisIFD = this->containedIFDs[ifd];
- printf ( "\n IFD %d, origCount %d, map.size %d, origOffset %d (0x%X), origNextIFD %d (0x%X)",
+ printf ( "\n IFD %d, origCount %d, map.size %d, origIFDOffset %d (0x%X), origNextIFD %d (0x%X)",
ifd, thisIFD.origCount, thisIFD.tagMap.size(),
- thisIFD.origOffset, thisIFD.origOffset, thisIFD.origNextIFD, thisIFD.origNextIFD );
+ thisIFD.origIFDOffset, thisIFD.origIFDOffset, thisIFD.origNextIFD, thisIFD.origNextIFD );
if ( thisIFD.changed ) printf ( ", changed" );
if ( appendedIFDs[ifd] ) printf ( ", will be appended at %d (0x%X)", newIFDOffsets[ifd], newIFDOffsets[ifd] );
printf ( "\n" );
@@ -1306,11 +1307,11 @@ XMP_Uns32 TIFF_FileWriter::DetermineAppendInfo ( XMP_Uns32 appendedOrigin,
InternalTagMap::iterator tagEnd = thisIFD.tagMap.end();
for ( tagPos = thisIFD.tagMap.begin(); tagPos != tagEnd; ++tagPos ) {
InternalTagInfo & thisTag = tagPos->second;
- printf ( " Tag %d, dataOrOffset 0x%X, origLen %d, origOffset %d (0x%X)",
- thisTag.id, thisTag.dataOrOffset, thisTag.origLen, thisTag.origOffset, thisTag.origOffset );
+ printf ( " Tag %d, smallValue 0x%X, origDataLen %d, origDataOffset %d (0x%X)",
+ thisTag.id, thisTag.smallValue, thisTag.origDataLen, thisTag.origDataOffset, thisTag.origDataOffset );
if ( thisTag.changed ) printf ( ", changed" );
- if ( (thisTag.dataLen > thisTag.origLen) && (thisTag.dataLen > 4) ) {
- XMP_Uns32 newOffset = this->GetUns32 ( &thisTag.dataOrOffset );
+ if ( (thisTag.dataLen > thisTag.origDataLen) && (thisTag.dataLen > 4) ) {
+ XMP_Uns32 newOffset = this->GetUns32 ( &thisTag.smallValue );
printf ( ", will be appended at %d (0x%X)", newOffset, newOffset );
}
printf ( "\n" );
@@ -1383,7 +1384,7 @@ void TIFF_FileWriter::UpdateMemByAppend ( XMP_Uns8** newStream_out, XMP_Uns32* n
if ( appendedIFDs[ifd] ) {
XMP_Assert ( newIFDOffsets[ifd] == appendedOffset );
- appendedOffset += 6 + (12 * tagCount);
+ appendedOffset += (XMP_Uns32)( 6 + (12 * tagCount) );
}
this->PutUns16 ( (XMP_Uns16)tagCount, ifdPtr );
@@ -1403,14 +1404,14 @@ void TIFF_FileWriter::UpdateMemByAppend ( XMP_Uns8** newStream_out, XMP_Uns32* n
this->PutUns32 ( currTag.count, ifdPtr );
ifdPtr += 4;
- *((XMP_Uns32*)ifdPtr) = currTag.dataOrOffset;
+ *((XMP_Uns32*)ifdPtr) = currTag.smallValue;
if ( (appendAll | currTag.changed) && (currTag.dataLen > 4) ) {
- XMP_Uns32 valueOffset = this->GetUns32 ( &currTag.dataOrOffset );
+ XMP_Uns32 valueOffset = this->GetUns32 ( &currTag.smallValue );
- if ( (currTag.dataLen <= currTag.origLen) && (! appendAll) ) {
- XMP_Assert ( valueOffset == currTag.origOffset );
+ if ( (currTag.dataLen <= currTag.origDataLen) && (! appendAll) ) {
+ XMP_Assert ( valueOffset == currTag.origDataOffset );
} else {
XMP_Assert ( valueOffset == appendedOffset );
appendedOffset += ((currTag.dataLen + 1) & 0xFFFFFFFEUL);
@@ -1441,7 +1442,7 @@ void TIFF_FileWriter::UpdateMemByAppend ( XMP_Uns8** newStream_out, XMP_Uns32* n
if ( appendedIFDs[kTIFF_TNailIFD] ) {
size_t primaryIFDCount = this->containedIFDs[kTIFF_PrimaryIFD].tagMap.size();
- XMP_Uns32 tnailRefOffset = newIFDOffsets[kTIFF_PrimaryIFD] + 2 + (12 * primaryIFDCount);
+ XMP_Uns32 tnailRefOffset = newIFDOffsets[kTIFF_PrimaryIFD] + 2 + (12 * (XMP_Uns32)primaryIFDCount);
this->PutUns32 ( newIFDOffsets[kTIFF_TNailIFD], (newStream + tnailRefOffset) );
}
@@ -1471,7 +1472,7 @@ XMP_Uns32 TIFF_FileWriter::DetermineVisibleLength()
size_t tagCount = ifdInfo.tagMap.size();
if ( tagCount == 0 ) continue;
- visibleLength += 6 + (12 * tagCount);
+ visibleLength += (XMP_Uns32)( 6 + (12 * tagCount) );
InternalTagMap::iterator tagPos = ifdInfo.tagMap.begin();
InternalTagMap::iterator tagEnd = ifdInfo.tagMap.end();
@@ -1734,10 +1735,11 @@ XMP_Uns32 TIFF_FileWriter::UpdateMemoryStream ( void** dataPtr, bool condenseStr
// Parse the revised stream. This is the cleanest way to rebuild the tag map.
this->ParseMemoryStream ( newStream, newLength, kDoNotCopyData );
- this->ownedStream = true; // ! We really do own the stream.
+ XMP_Assert ( this->tiffLength == newLength );
+ this->ownedStream = (newLength > 0); // ! We really do own the new stream, if not empty.
if ( dataPtr != 0 ) *dataPtr = this->memStream;
- return this->tiffLength;
+ return newLength;
} // TIFF_FileWriter::UpdateMemoryStream
@@ -1772,8 +1774,8 @@ void TIFF_FileWriter::UpdateFileStream ( LFA_FileRef fileRef )
if ( this->memParsed ) XMP_Throw ( "Not file based", kXMPErr_EnforceFailure );
if ( ! this->changed ) return;
- XMP_Int64 origLength = LFA_Measure ( fileRef );
- if ( (origLength >> 32) != 0 ) XMP_Throw ( "TIFF files can't exceed 4GB", kXMPErr_BadTIFF );
+ XMP_Int64 origDataLength = LFA_Measure ( fileRef );
+ if ( (origDataLength >> 32) != 0 ) XMP_Throw ( "TIFF files can't exceed 4GB", kXMPErr_BadTIFF );
bool appendedIFDs[kTIFF_KnownIFDCount];
XMP_Uns32 newIFDOffsets[kTIFF_KnownIFDCount];
@@ -1782,7 +1784,7 @@ void TIFF_FileWriter::UpdateFileStream ( LFA_FileRef fileRef )
printf ( "\nStarting update of TIFF file stream\n" );
#endif
- XMP_Uns32 appendedOrigin = (XMP_Uns32)origLength;
+ XMP_Uns32 appendedOrigin = (XMP_Uns32)origDataLength;
if ( (appendedOrigin & 1) != 0 ) {
++appendedOrigin; // Start at an even offset.
LFA_Seek ( fileRef, 0, SEEK_END );
@@ -1808,9 +1810,9 @@ void TIFF_FileWriter::UpdateFileStream ( LFA_FileRef fileRef )
if ( ! appendedIFDs[ifd] ) {
#if Trace_UpdateFileStream
- printf ( " Updating IFD %d in-place at offset %d (0x%X)\n", ifd, thisIFD.origOffset, thisIFD.origOffset );
+ printf ( " Updating IFD %d in-place at offset %d (0x%X)\n", ifd, thisIFD.origIFDOffset, thisIFD.origIFDOffset );
#endif
- LFA_Seek ( fileRef, thisIFD.origOffset, SEEK_SET );
+ LFA_Seek ( fileRef, thisIFD.origIFDOffset, SEEK_SET );
this->WriteFileIFD ( fileRef, thisIFD );
}
@@ -1819,11 +1821,11 @@ void TIFF_FileWriter::UpdateFileStream ( LFA_FileRef fileRef )
for ( tagPos = thisIFD.tagMap.begin(); tagPos != tagEnd; ++tagPos ) {
InternalTagInfo & thisTag = tagPos->second;
- if ( (! thisTag.changed) || (thisTag.dataLen <= 4) || (thisTag.dataLen > thisTag.origLen) ) continue;
+ if ( (! thisTag.changed) || (thisTag.dataLen <= 4) || (thisTag.dataLen > thisTag.origDataLen) ) continue;
#if Trace_UpdateFileStream
- printf ( " Updating tag %d in IFD %d in-place at offset %d (0x%X)\n", thisTag.id, ifd, thisTag.origOffset, thisTag.origOffset );
+ printf ( " Updating tag %d in IFD %d in-place at offset %d (0x%X)\n", thisTag.id, ifd, thisTag.origDataOffset, thisTag.origDataOffset );
#endif
- LFA_Seek ( fileRef, thisTag.origOffset, SEEK_SET );
+ LFA_Seek ( fileRef, thisTag.origDataOffset, SEEK_SET );
LFA_Write ( fileRef, thisTag.dataPtr, thisTag.dataLen );
}
@@ -1852,12 +1854,12 @@ void TIFF_FileWriter::UpdateFileStream ( LFA_FileRef fileRef )
for ( tagPos = thisIFD.tagMap.begin(); tagPos != tagEnd; ++tagPos ) {
InternalTagInfo & thisTag = tagPos->second;
- if ( (! thisTag.changed) || (thisTag.dataLen <= 4) || (thisTag.dataLen <= thisTag.origLen) ) continue;
+ if ( (! thisTag.changed) || (thisTag.dataLen <= 4) || (thisTag.dataLen <= thisTag.origDataLen) ) continue;
#if Trace_UpdateFileStream
- XMP_Uns32 newOffset = this->GetUns32(&thisTag.dataOrOffset);
+ XMP_Uns32 newOffset = this->GetUns32(&thisTag.origDataOffset);
printf ( " Updating tag %d in IFD %d by append at offset %d (0x%X)\n", thisTag.id, ifd, newOffset, newOffset );
#endif
- XMP_Assert ( this->GetUns32(&thisTag.dataOrOffset) == LFA_Measure(fileRef) );
+ XMP_Assert ( this->GetUns32(&thisTag.smallValue) == LFA_Measure(fileRef) );
LFA_Write ( fileRef, thisTag.dataPtr, thisTag.dataLen );
if ( (thisTag.dataLen & 1) != 0 ) LFA_Write ( fileRef, "\0", 1 );
}
@@ -1880,10 +1882,10 @@ void TIFF_FileWriter::UpdateFileStream ( LFA_FileRef fileRef )
InternalIFDInfo & primaryIFD = this->containedIFDs[kTIFF_PrimaryIFD];
InternalIFDInfo & tnailIFD = this->containedIFDs[kTIFF_TNailIFD];
- if ( appendedIFDs[kTIFF_TNailIFD] && (primaryIFD.origNextIFD == tnailIFD.origOffset) ) {
+ if ( appendedIFDs[kTIFF_TNailIFD] && (primaryIFD.origNextIFD == tnailIFD.origIFDOffset) ) {
size_t primaryIFDCount = primaryIFD.tagMap.size();
- XMP_Uns32 tnailRefOffset = newIFDOffsets[kTIFF_PrimaryIFD] + 2 + (12 * primaryIFDCount);
+ XMP_Uns32 tnailRefOffset = newIFDOffsets[kTIFF_PrimaryIFD] + 2 + (12 * (XMP_Uns32)primaryIFDCount);
this->PutUns32 ( newIFDOffsets[kTIFF_TNailIFD], &newOffset );
#if TraceUpdateFileStream
@@ -1906,8 +1908,8 @@ void TIFF_FileWriter::UpdateFileStream ( LFA_FileRef fileRef )
if ( ! thisIFD.changed ) continue;
thisIFD.changed = false;
- thisIFD.origCount = thisIFD.tagMap.size();
- thisIFD.origOffset = newIFDOffsets[ifd];
+ thisIFD.origCount = (XMP_Uns16)( thisIFD.tagMap.size() );
+ thisIFD.origIFDOffset = newIFDOffsets[ifd];
InternalTagMap::iterator tagPos;
InternalTagMap::iterator tagEnd = thisIFD.tagMap.end();
@@ -1916,8 +1918,8 @@ void TIFF_FileWriter::UpdateFileStream ( LFA_FileRef fileRef )
InternalTagInfo & thisTag = tagPos->second;
if ( ! thisTag.changed ) continue;
thisTag.changed = false;
- thisTag.origLen = thisTag.dataLen;
- if ( thisTag.origLen > 4 ) thisTag.origOffset = this->GetUns32 ( &thisTag.dataOrOffset );
+ thisTag.origDataLen = thisTag.dataLen;
+ if ( thisTag.origDataLen > 4 ) thisTag.origDataOffset = this->GetUns32 ( &thisTag.smallValue );
}
}
@@ -1938,7 +1940,7 @@ void TIFF_FileWriter::UpdateFileStream ( LFA_FileRef fileRef )
void TIFF_FileWriter::WriteFileIFD ( LFA_FileRef fileRef, InternalIFDInfo & thisIFD )
{
XMP_Uns16 tagCount;
- this->PutUns16 ( thisIFD.tagMap.size(), &tagCount );
+ this->PutUns16 ( (XMP_Uns16)thisIFD.tagMap.size(), &tagCount );
LFA_Write ( fileRef, &tagCount, 2 );
InternalTagMap::iterator tagPos;
@@ -1952,7 +1954,7 @@ void TIFF_FileWriter::WriteFileIFD ( LFA_FileRef fileRef, InternalIFDInfo & this
this->PutUns16 ( thisTag.id, &ifdEntry.id );
this->PutUns16 ( thisTag.type, &ifdEntry.type );
this->PutUns32 ( thisTag.count, &ifdEntry.count );
- ifdEntry.dataOrOffset = thisTag.dataOrOffset; // ! Already in stream endianness.
+ ifdEntry.dataOrOffset = thisTag.smallValue; // ! Already in stream endianness.
LFA_Write ( fileRef, &ifdEntry, sizeof(ifdEntry) );
XMP_Assert ( sizeof(ifdEntry) == 12 );
diff --git a/source/XMPFiles/FormatSupport/TIFF_MemoryReader.cpp b/source/XMPFiles/FormatSupport/TIFF_MemoryReader.cpp
index d511083..4ca9cac 100644
--- a/source/XMPFiles/FormatSupport/TIFF_MemoryReader.cpp
+++ b/source/XMPFiles/FormatSupport/TIFF_MemoryReader.cpp
@@ -73,7 +73,7 @@ void TIFF_MemoryReader::SortIFD ( TweakedIFDInfo* thisIFD )
// Out of order, move this tag up, prevTag is unchanged. Might still be a duplicate!
XMP_Int32 j; // ! Need a signed value.
- for ( j = i-1; j >= 0; --j ) {
+ for ( j = (XMP_Int32)i-1; j >= 0; --j ) {
if ( ifdEntries[j].id <= thisTag ) break;
}
@@ -122,12 +122,8 @@ bool TIFF_MemoryReader::GetIFD ( XMP_Uns8 ifd, TagInfoMap* ifdMap ) const
TweakedIFDEntry* thisTag = &(thisIFD->entries[i]);
TagInfo info ( thisTag->id, thisTag->type, 0, 0, thisTag->bytes );
- info.count = info.dataLen / kTIFF_TypeSizes[info.type];
- if ( info.dataLen <= 4 ) {
- info.dataPtr = &(thisTag->dataOrPtr);
- } else {
- info.dataPtr = (const void*)(thisTag->dataOrPtr);
- }
+ info.count = info.dataLen / (XMP_Uns32)kTIFF_TypeSizes[info.type];
+ info.dataPtr = this->GetDataPtr ( thisTag );
(*ifdMap)[info.id] = info;
@@ -191,10 +187,9 @@ XMP_Uns32 TIFF_MemoryReader::GetValueOffset ( XMP_Uns8 ifd, XMP_Uns16 id ) const
const TweakedIFDEntry* thisTag = this->FindTagInIFD ( ifd, id );
if ( thisTag == 0 ) return 0;
- XMP_Uns8 * valuePtr = (XMP_Uns8*) thisTag->dataOrPtr;
- if ( thisTag->bytes <= 4 ) valuePtr = (XMP_Uns8*) &(thisTag->dataOrPtr);
+ XMP_Uns8 * valuePtr = (XMP_Uns8*) this->GetDataPtr ( thisTag );
- return (valuePtr - this->tiffStream);
+ return (XMP_Uns32)(valuePtr - this->tiffStream); // ! TIFF streams can't exceed 4GB.
} // TIFF_MemoryReader::GetValueOffset
@@ -211,14 +206,10 @@ bool TIFF_MemoryReader::GetTag ( XMP_Uns8 ifd, XMP_Uns16 id, TagInfo* info ) con
info->id = thisTag->id;
info->type = thisTag->type;
- info->count = thisTag->bytes / kTIFF_TypeSizes[thisTag->type];
+ info->count = thisTag->bytes / (XMP_Uns32)kTIFF_TypeSizes[thisTag->type];
info->dataLen = thisTag->bytes;
- if ( thisTag->bytes <= 4 ) {
- info->dataPtr = &(thisTag->dataOrPtr);
- } else {
- info->dataPtr = (const void*)(thisTag->dataOrPtr);
- }
+ info->dataPtr = this->GetDataPtr ( thisTag );
}
@@ -238,10 +229,10 @@ bool TIFF_MemoryReader::GetTag_Integer ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32*
if ( data != 0 ) {
if ( thisTag->type == kTIFF_ShortType ) {
if ( thisTag->bytes != 2 ) return false; // Wrong count.
- *data = this->GetUns16 ( &(thisTag->dataOrPtr) );
+ *data = this->GetUns16 ( this->GetDataPtr ( thisTag ) );
} else if ( thisTag->type == kTIFF_LongType ) {
if ( thisTag->bytes != 4 ) return false; // Wrong count.
- *data = this->GetUns32 ( &(thisTag->dataOrPtr) );
+ *data = this->GetUns32 ( this->GetDataPtr ( thisTag ) );
} else {
return false;
}
@@ -262,7 +253,7 @@ bool TIFF_MemoryReader::GetTag_Byte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns8* data
if ( (thisTag->type != kTIFF_ByteType) || (thisTag->bytes != 1) ) return false;
if ( data != 0 ) {
- *data = * ( (XMP_Uns8*) (&(thisTag->dataOrPtr)) );
+ *data = * ( (XMP_Uns8*) this->GetDataPtr ( thisTag ) );
}
return true;
@@ -280,7 +271,7 @@ bool TIFF_MemoryReader::GetTag_SByte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int8* dat
if ( (thisTag->type != kTIFF_SByteType) || (thisTag->bytes != 1) ) return false;
if ( data != 0 ) {
- *data = * ( (XMP_Int8*) (&(thisTag->dataOrPtr)) );
+ *data = * ( (XMP_Int8*) this->GetDataPtr ( thisTag ) );
}
return true;
@@ -298,7 +289,7 @@ bool TIFF_MemoryReader::GetTag_Short ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns16* da
if ( (thisTag->type != kTIFF_ShortType) || (thisTag->bytes != 2) ) return false;
if ( data != 0 ) {
- *data = this->GetUns16 ( &(thisTag->dataOrPtr) );
+ *data = this->GetUns16 ( this->GetDataPtr ( thisTag ) );
}
return true;
@@ -316,7 +307,7 @@ bool TIFF_MemoryReader::GetTag_SShort ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int16* d
if ( (thisTag->type != kTIFF_SShortType) || (thisTag->bytes != 2) ) return false;
if ( data != 0 ) {
- *data = (XMP_Int16) this->GetUns16 ( &(thisTag->dataOrPtr) );
+ *data = (XMP_Int16) this->GetUns16 ( this->GetDataPtr ( thisTag ) );
}
return true;
@@ -334,7 +325,7 @@ bool TIFF_MemoryReader::GetTag_Long ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32* dat
if ( (thisTag->type != kTIFF_LongType) || (thisTag->bytes != 4) ) return false;
if ( data != 0 ) {
- *data = this->GetUns32 ( &(thisTag->dataOrPtr) );
+ *data = this->GetUns32 ( this->GetDataPtr ( thisTag ) );
}
return true;
@@ -352,7 +343,7 @@ bool TIFF_MemoryReader::GetTag_SLong ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int32* da
if ( (thisTag->type != kTIFF_SLongType) || (thisTag->bytes != 4) ) return false;
if ( data != 0 ) {
- *data = (XMP_Int32) this->GetUns32 ( &(thisTag->dataOrPtr) );
+ *data = (XMP_Int32) this->GetUns32 ( this->GetDataPtr ( thisTag ) );
}
return true;
@@ -370,7 +361,7 @@ bool TIFF_MemoryReader::GetTag_Rational ( XMP_Uns8 ifd, XMP_Uns16 id, Rational*
if ( (thisTag->type != kTIFF_RationalType) || (thisTag->bytes != 8) ) return false;
if ( data != 0 ) {
- XMP_Uns32* dataPtr = (XMP_Uns32*)thisTag->dataOrPtr;
+ XMP_Uns32* dataPtr = (XMP_Uns32*) this->GetDataPtr ( thisTag );
data->num = this->GetUns32 ( dataPtr );
data->denom = this->GetUns32 ( dataPtr+1 );
}
@@ -390,7 +381,7 @@ bool TIFF_MemoryReader::GetTag_SRational ( XMP_Uns8 ifd, XMP_Uns16 id, SRational
if ( (thisTag->type != kTIFF_SRationalType) || (thisTag->bytes != 8) ) return false;
if ( data != 0 ) {
- XMP_Uns32* dataPtr = (XMP_Uns32*)thisTag->dataOrPtr;
+ XMP_Uns32* dataPtr = (XMP_Uns32*) this->GetDataPtr ( thisTag );
data->num = (XMP_Int32) this->GetUns32 ( dataPtr );
data->denom = (XMP_Int32) this->GetUns32 ( dataPtr+1 );
}
@@ -410,7 +401,7 @@ bool TIFF_MemoryReader::GetTag_Float ( XMP_Uns8 ifd, XMP_Uns16 id, float* data )
if ( (thisTag->type != kTIFF_FloatType) || (thisTag->bytes != 4) ) return false;
if ( data != 0 ) {
- *data = this->GetFloat ( &(thisTag->dataOrPtr) );
+ *data = this->GetFloat ( this->GetDataPtr ( thisTag ) );
}
return true;
@@ -428,7 +419,7 @@ bool TIFF_MemoryReader::GetTag_Double ( XMP_Uns8 ifd, XMP_Uns16 id, double* data
if ( (thisTag->type != kTIFF_DoubleType) || (thisTag->bytes != 8) ) return false;
if ( data != 0 ) {
- double* dataPtr = (double*)thisTag->dataOrPtr;
+ double* dataPtr = (double*) this->GetDataPtr ( thisTag );
*data = this->GetDouble ( dataPtr );
}
@@ -447,8 +438,7 @@ bool TIFF_MemoryReader::GetTag_ASCII ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_StringPtr
if ( thisTag->type != kTIFF_ASCIIType ) return false;
if ( dataPtr != 0 ) {
- *dataPtr = (XMP_StringPtr)thisTag->dataOrPtr;
- if ( thisTag->bytes <= 4 ) *dataPtr = (XMP_StringPtr)(&thisTag->dataOrPtr);
+ *dataPtr = (XMP_StringPtr) this->GetDataPtr ( thisTag );
}
if ( dataLen != 0 ) *dataLen = thisTag->bytes;
@@ -469,7 +459,7 @@ bool TIFF_MemoryReader::GetTag_EncodedString ( XMP_Uns8 ifd, XMP_Uns16 id, std::
if ( utf8Str == 0 ) return true; // Return true if the converted string is not wanted.
- bool ok = this->DecodeString ( (void*)thisTag->dataOrPtr, thisTag->bytes, utf8Str );
+ bool ok = this->DecodeString ( this->GetDataPtr ( thisTag ), thisTag->bytes, utf8Str );
return ok;
} // TIFF_MemoryReader::GetTag_EncodedString
@@ -520,19 +510,19 @@ void TIFF_MemoryReader::ParseMemoryStream ( const void* data, XMP_Uns32 length,
const TweakedIFDEntry* exifIFDTag = this->FindTagInIFD ( kTIFF_PrimaryIFD, kTIFF_ExifIFDPointer );
if ( (exifIFDTag != 0) && (exifIFDTag->type == kTIFF_LongType) && (exifIFDTag->bytes == 4) ) {
- XMP_Uns32 exifOffset = this->GetUns32 ( &exifIFDTag->dataOrPtr );
+ XMP_Uns32 exifOffset = this->GetUns32 ( &exifIFDTag->dataOrPos );
(void) this->ProcessOneIFD ( exifOffset, kTIFF_ExifIFD );
}
const TweakedIFDEntry* gpsIFDTag = this->FindTagInIFD ( kTIFF_PrimaryIFD, kTIFF_GPSInfoIFDPointer );
if ( (gpsIFDTag != 0) && (gpsIFDTag->type == kTIFF_LongType) && (gpsIFDTag->bytes == 4) ) {
- XMP_Uns32 gpsOffset = this->GetUns32 ( &gpsIFDTag->dataOrPtr );
+ XMP_Uns32 gpsOffset = this->GetUns32 ( &gpsIFDTag->dataOrPos );
(void) this->ProcessOneIFD ( gpsOffset, kTIFF_GPSInfoIFD );
}
const TweakedIFDEntry* interopIFDTag = this->FindTagInIFD ( kTIFF_ExifIFD, kTIFF_InteroperabilityIFDPointer );
if ( (interopIFDTag != 0) && (interopIFDTag->type == kTIFF_LongType) && (interopIFDTag->bytes == 4) ) {
- XMP_Uns32 interopOffset = this->GetUns32 ( &interopIFDTag->dataOrPtr );
+ XMP_Uns32 interopOffset = this->GetUns32 ( &interopIFDTag->dataOrPos );
(void) this->ProcessOneIFD ( interopOffset, kTIFF_InteropIFD );
}
@@ -543,7 +533,7 @@ void TIFF_MemoryReader::ParseMemoryStream ( const void* data, XMP_Uns32 length,
(void) this->ProcessOneIFD ( tnailIFDOffset, kTIFF_TNailIFD );
const TweakedIFDEntry* jpegInfo = FindTagInIFD ( kTIFF_TNailIFD, kTIFF_JPEGInterchangeFormat );
if ( jpegInfo != 0 ) {
- XMP_Uns32 tnailImageOffset = this->GetUns32 ( &jpegInfo->dataOrPtr );
+ XMP_Uns32 tnailImageOffset = this->GetUns32 ( &jpegInfo->dataOrPos );
this->jpegTNailPtr = (XMP_Uns8*)this->tiffStream + tnailImageOffset;
}
}
@@ -589,11 +579,10 @@ XMP_Uns32 TIFF_MemoryReader::ProcessOneIFD ( XMP_Uns32 ifdOffset, XMP_Uns8 ifd )
if ( (thisEntry->type < kTIFF_ByteType) || (thisEntry->type > kTIFF_LastType) ) continue; // Bad type, skip this tag.
- thisEntry->bytes *= kTIFF_TypeSizes[thisEntry->type];
+ thisEntry->bytes *= (XMP_Uns32)kTIFF_TypeSizes[thisEntry->type];
if ( thisEntry->bytes > this->tiffLength ) XMP_Throw ( "Bad TIFF data size", kXMPErr_BadTIFF );
if ( thisEntry->bytes > 4 ) {
- if ( ! this->nativeEndian ) Flip4 ( &thisEntry->dataOrPtr );
- thisEntry->dataOrPtr += (XMP_Uns32)this->tiffStream;
+ if ( ! this->nativeEndian ) Flip4 ( &thisEntry->dataOrPos );
}
}
diff --git a/source/XMPFiles/FormatSupport/TIFF_Support.cpp b/source/XMPFiles/FormatSupport/TIFF_Support.cpp
index 6d1698d..8aecc10 100644
--- a/source/XMPFiles/FormatSupport/TIFF_Support.cpp
+++ b/source/XMPFiles/FormatSupport/TIFF_Support.cpp
@@ -259,7 +259,7 @@ struct StreamRational { XMP_Uns32 num, denom; };
void TIFF_Manager::SetTag_ASCII ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_StringPtr data )
{
- this->SetTag ( ifd, id, kTIFF_ASCIIType, (strlen(data) + 1), data ); // ! Include trailing nul.
+ this->SetTag ( ifd, id, kTIFF_ASCIIType, (XMP_Uns32)(strlen(data) + 1), data ); // ! Include trailing nul.
} // TIFF_Manager::SetTag_ASCII
diff --git a/source/XMPFiles/FormatSupport/TIFF_Support.hpp b/source/XMPFiles/FormatSupport/TIFF_Support.hpp
index 171c12c..1394b99 100644
--- a/source/XMPFiles/FormatSupport/TIFF_Support.hpp
+++ b/source/XMPFiles/FormatSupport/TIFF_Support.hpp
@@ -3,7 +3,7 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2006-2007 Adobe Systems Incorporated
+// Copyright 2006-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -13,6 +13,8 @@
#include "XMP_Environment.h" // ! This must be the first include.
#include <map>
+#include <stdlib.h>
+#include <string.h>
#include "XMP_Const.h"
#include "XMPFiles_Impl.hpp"
@@ -139,6 +141,8 @@ enum {
kTIFF_PSIR = 34377,
kTIFF_ExifIFDPointer = 34665,
kTIFF_GPSInfoIFDPointer = 34853,
+ kTIFF_DNGVersion = 50706,
+ kTIFF_DNGBackwardVersion = 50707,
// Additional thumbnail IFD tags. We also care about 256, 257, and 259 in thumbnails.
kTIFF_JPEGInterchangeFormat = 513,
@@ -288,6 +292,8 @@ static const XMP_Uns16 sKnownPrimaryIFDTags[] =
kTIFF_PSIR, // 34377
kTIFF_ExifIFDPointer, // 34665
kTIFF_GPSInfoIFDPointer, // 34853
+ kTIFF_DNGVersion, // 50706
+ kTIFF_DNGBackwardVersion, // 50707
0xFFFF // Must be last as a sentinel.
};
@@ -704,12 +710,17 @@ private:
XMP_Uns8* tiffStream;
XMP_Uns32 tiffLength;
- struct TweakedIFDEntry {
+ // Memory usage notes: TIFF_MemoryReader is for memory-based read-only usage (both apply). There
+ // is no need to ever allocate separate blocks of memory, everything is used directly from the
+ // TIFF stream. Data pointers are computed on the fly, the offset field is 4 bytes and pointers
+ // will be 8 bytes for 64-bit platforms.
+
+ struct TweakedIFDEntry { // ! Most fields are in native byte order, dataOrPos is for offsets only.
XMP_Uns16 id;
XMP_Uns16 type;
XMP_Uns32 bytes;
- XMP_Uns32 dataOrPtr;
- TweakedIFDEntry() : id(0), type(0), bytes(0), dataOrPtr(0) {};
+ XMP_Uns32 dataOrPos;
+ TweakedIFDEntry() : id(0), type(0), bytes(0), dataOrPos(0) {};
};
struct TweakedIFDInfo {
@@ -725,6 +736,9 @@ private:
XMP_Uns32 ProcessOneIFD ( XMP_Uns32 ifdOffset, XMP_Uns8 ifd );
const TweakedIFDEntry* FindTagInIFD ( XMP_Uns8 ifd, XMP_Uns16 id ) const;
+
+ const inline void* GetDataPtr ( const TweakedIFDEntry* tifdEntry ) const
+ { if ( tifdEntry->bytes <= 4 ) return &tifdEntry->dataOrPos; else return (this->tiffStream + tifdEntry->dataOrPos); };
static inline void NotAppropriate() { XMP_Throw ( "Not appropriate for TIFF_Reader", kXMPErr_InternalFailure ); };
@@ -797,57 +811,85 @@ public:
private:
- bool changed;
+ bool changed, legacyDeleted;
bool memParsed, fileParsed;
bool ownedStream;
XMP_Uns8* memStream;
XMP_Uns32 tiffLength;
- struct InternalTagInfo {
+ // Memory usage notes: TIFF_FileWriter is for file-based OR read/write usage. For memory-based
+ // streams the dataPtr is initially into the stream, regardless of size. For file-based streams
+ // the dataPtr is initially a separate allocation for large values (over 4 bytes), and points to
+ // the smallValue field for small values. This is also the usage when a tag is changed (for both
+ // memory and file cases), the dataPtr is a separate allocation for large values (over 4 bytes),
+ // and points to the smallValue field for small values.
+
+ // ! The working data values are always stream endian, no matter where stored. They are flipped
+ // ! as necessary by GetTag and SetTag.
+
+ static const bool kIsFileBased = true; // For use in the InternalTagInfo constructor.
+ static const bool kIsMemoryBased = false;
+
+ class InternalTagInfo {
+ public:
+
XMP_Uns16 id;
XMP_Uns16 type;
XMP_Uns32 count;
XMP_Uns32 dataLen;
- XMP_Uns32 dataOrOffset; // Small value or large offset in stream endianness.
- XMP_Uns8* dataPtr; // Always set, even for small values.
- XMP_Uns32 origLen; // The original data length in bytes.
- XMP_Uns32 origOffset; // The original data offset, regardless of length.
+ XMP_Uns32 smallValue; // Small value in stream endianness, but "left" justified.
+ XMP_Uns8* dataPtr; // Parsing captures all small values, only large ones that we care about.
+ XMP_Uns32 origDataLen; // The original (parse time) data length in bytes.
+ XMP_Uns32 origDataOffset; // The original data offset, regardless of length.
bool changed;
- InternalTagInfo() : id(0), type(0), count(0), dataLen(0), dataOrOffset(0), dataPtr(0), origLen(0), origOffset(0), changed(false) {};
- InternalTagInfo ( XMP_Uns16 _id, XMP_Uns16 _type, XMP_Uns32 _count )
- : id(_id), type(_type), count(_count), dataLen(0), dataOrOffset(0), dataPtr(0), origLen(0), origOffset(0), changed(false) {};
- ~InternalTagInfo()
- {
- if ( this->changed && (this->dataLen > 4) && (this->dataPtr != 0) ) free ( this->dataPtr );
- };
+ bool fileBased;
+
+ inline void FreeData() {
+ if ( this->fileBased || this->changed ) {
+ if ( (this->dataLen > 4) && (this->dataPtr != 0) ) { free ( this->dataPtr ); this->dataPtr = 0; }
+ }
+ }
+
+ InternalTagInfo ( XMP_Uns16 _id, XMP_Uns16 _type, XMP_Uns32 _count, bool _fileBased )
+ : id(_id), type(_type), count(_count), dataLen(0), smallValue(0), dataPtr(0),
+ origDataLen(0), origDataOffset(0), changed(false), fileBased(_fileBased) {};
+ ~InternalTagInfo() { this->FreeData(); };
+
void operator= ( const InternalTagInfo & in )
{
// ! Gag! Transfer ownership of the dataPtr!
- if ( this->changed && (this->dataLen > 4) && (this->dataPtr != 0) ) free ( this->dataPtr );
- memcpy ( this, &in, sizeof ( InternalTagInfo ) ); // AUDIT: Use of sizeof(InternalTagInfo) is safe.
+ this->FreeData();
+ memcpy ( this, &in, sizeof(*this) ); // AUDIT: Use of sizeof(InternalTagInfo) is safe.
if ( this->dataLen <= 4 ) {
- this->dataPtr = (XMP_Uns8*) &this->dataOrOffset;
+ this->dataPtr = (XMP_Uns8*) &this->smallValue; // Don't use the copied pointer.
} else {
- *((XMP_Uns8**)&in.dataPtr) = 0; // ! Avoid double calls to free from the destructor!
+ *((XMP_Uns8**)&in.dataPtr) = 0; // The pointer is now owned by "this".
}
};
+
+ private:
+
+ InternalTagInfo() // Hidden on purpose, fileBased must be properly set.
+ : id(0), type(0), count(0), dataLen(0), smallValue(0), dataPtr(0),
+ origDataLen(0), origDataOffset(0), changed(false), fileBased(false) {};
+
};
typedef std::map<XMP_Uns16,InternalTagInfo> InternalTagMap;
struct InternalIFDInfo {
bool changed;
- XMP_Uns16 origCount; // Original number of IFD entries.
- XMP_Uns32 origOffset; // Original stream offset of the IFD.
- XMP_Uns32 origNextIFD; // Original stream offset of the following IFD.
+ XMP_Uns16 origCount; // Original number of IFD entries.
+ XMP_Uns32 origIFDOffset; // Original stream offset of the IFD.
+ XMP_Uns32 origNextIFD; // Original stream offset of the following IFD.
InternalTagMap tagMap;
- InternalIFDInfo() : changed(false), origCount(0), origOffset(0), origNextIFD(0) {};
- void clear()
+ InternalIFDInfo() : changed(false), origCount(0), origIFDOffset(0), origNextIFD(0) {};
+ inline void clear()
{
this->changed = false;
this->origCount = 0;
- this->origOffset = this->origNextIFD = 0;
+ this->origIFDOffset = this->origNextIFD = 0;
this->tagMap.clear();
};
};
@@ -864,7 +906,7 @@ private:
void ProcessPShop6IFD ( const TIFF_MemoryReader& buriedExif, XMP_Uns8 ifd );
- static void* CopyTagToMasterIFD ( const TagInfo& ps6Tag, InternalIFDInfo* masterIFD );
+ void* CopyTagToMasterIFD ( const TagInfo& ps6Tag, InternalIFDInfo* masterIFD );
void UpdateMemByAppend ( XMP_Uns8** newStream_out, XMP_Uns32* newLength_out,
bool appendAll = false, XMP_Uns32 extraSpace = 0 );
diff --git a/source/XMPFiles/FormatSupport/XDCAM_Support.cpp b/source/XMPFiles/FormatSupport/XDCAM_Support.cpp
new file mode 100644
index 0000000..ac0fe1e
--- /dev/null
+++ b/source/XMPFiles/FormatSupport/XDCAM_Support.cpp
@@ -0,0 +1,290 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2006-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XDCAM_Support.hpp"
+
+// =================================================================================================
+/// \file XDCAM_Support.cpp
+///
+// =================================================================================================
+
+namespace XDCAM_Support
+{
+
+// =================================================================================================
+// CreateChildElement
+// ==================
+
+namespace
+{
+XML_Node * CreateChildElement ( XML_Node * parent, XMP_StringPtr localName, XMP_StringPtr legacyNS, int indent /* = 0 */ )
+{
+ XML_Node * wsNode;
+ XML_Node * childNode = parent->GetNamedElement ( legacyNS, localName );
+
+ if ( childNode == 0 ) {
+
+ // The indenting is a hack, assuming existing 2 spaces per level.
+
+ wsNode = new XML_Node ( parent, "", kCDataNode );
+ wsNode->value = " "; // Add 2 spaces to the existing WS before the parent's close tag.
+ parent->content.push_back ( wsNode );
+
+ childNode = new XML_Node ( parent, localName, kElemNode );
+ childNode->ns = parent->ns;
+ childNode->nsPrefixLen = parent->nsPrefixLen;
+ childNode->name.insert ( 0, parent->name, 0, parent->nsPrefixLen );
+ parent->content.push_back ( childNode );
+
+ wsNode = new XML_Node ( parent, "", kCDataNode );
+ wsNode->value = '\n';
+ for ( ; indent > 1; --indent ) wsNode->value += " "; // Indent less 1, to "outdent" the parent's close.
+ parent->content.push_back ( wsNode );
+
+ }
+
+ return childNode;
+
+}
+}
+
+// =================================================================================================
+// XDCAM_Support::GetLegacyMetaData
+// =================================
+
+bool GetLegacyMetaData ( SXMPMeta * xmpObjPtr,
+ XML_NodePtr rootElem,
+ XMP_StringPtr legacyNS,
+ bool digestFound,
+ std::string& umid )
+{
+ bool containsXMP = false;
+
+ XML_NodePtr legacyContext = 0, legacyProp = 0;
+
+ // UMID
+ if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_DC, "identifier" )) ) {
+ legacyProp = rootElem->GetNamedElement ( legacyNS, "TargetMaterial" );
+ if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) {
+ XMP_StringPtr legacyValue = legacyProp->GetAttrValue ( "umidRef" );
+ if ( legacyValue != 0 ) {
+ umid = legacyValue;
+ xmpObjPtr->SetProperty ( kXMP_NS_DC, "identifier", legacyValue, kXMP_DeleteExisting );
+ containsXMP = true;
+ }
+ }
+ }
+
+ // Creation date
+ if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_XMP, "CreateDate" )) ) {
+ legacyProp = rootElem->GetNamedElement ( legacyNS, "CreationDate" );
+ if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) {
+ XMP_StringPtr legacyValue = legacyProp->GetAttrValue ( "value" );
+ if ( legacyValue != 0 ) {
+ xmpObjPtr->SetProperty ( kXMP_NS_XMP, "CreateDate", legacyValue, kXMP_DeleteExisting );
+ containsXMP = true;
+ }
+ }
+ }
+
+ // Modify Date
+ if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_XMP, "LastUpdate" )) ) {
+ legacyProp = rootElem->GetNamedElement ( legacyNS, "LastUpdate" );
+ if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) {
+ XMP_StringPtr legacyValue = legacyProp->GetAttrValue ( "value" );
+ if ( legacyValue != 0 ) {
+ xmpObjPtr->SetProperty ( kXMP_NS_XMP, "ModifyDate", legacyValue, kXMP_DeleteExisting );
+ containsXMP = true;
+ }
+ }
+ }
+
+ // Metadata Modify Date
+ if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_XMP, "lastUpdate" )) ) {
+ legacyProp = rootElem->GetNamedElement ( legacyNS, "lastUpdate" );
+ if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) {
+ XMP_StringPtr legacyValue = legacyProp->GetAttrValue ( "value" );
+ if ( legacyValue != 0 ) {
+ xmpObjPtr->SetProperty ( kXMP_NS_XMP, "MetadataDate", legacyValue, kXMP_DeleteExisting );
+ containsXMP = true;
+ }
+ }
+ }
+
+ legacyContext = rootElem->GetNamedElement ( legacyNS, "VideoFormat" );
+
+ if ( legacyContext != 0 ) {
+
+ // frame size
+ if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_DM, "videoFrameSize" )) ) {
+ legacyProp = legacyContext->GetNamedElement ( legacyNS, "VideoLayout" );
+ if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) {
+
+ XMP_StringPtr widthValue = legacyProp->GetAttrValue ( "pixel" );
+ XMP_StringPtr heightValue = legacyProp->GetAttrValue ( "numOfVerticalLine" );
+
+ if ( (widthValue != 0) && (heightValue != 0) ) {
+
+ xmpObjPtr->DeleteProperty ( kXMP_NS_DM, "videoFrameSize" );
+ xmpObjPtr->SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "w", widthValue );
+ xmpObjPtr->SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "h", heightValue );
+ xmpObjPtr->SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "unit", "pixels" );
+
+ containsXMP = true;
+
+ }
+
+ }
+ }
+
+ // Aspect ratio
+ if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_DM, "videoPixelAspectRatio" )) ) {
+ legacyProp = legacyContext->GetNamedElement ( legacyNS, "VideoLayout" );
+ if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) {
+ XMP_StringPtr aspectRatio = legacyProp->GetAttrValue ( "aspectRatio" );
+ if ( aspectRatio != 0 ) {
+ xmpObjPtr->SetProperty ( kXMP_NS_DM, "videoPixelAspectRatio", aspectRatio, kXMP_DeleteExisting );
+ containsXMP = true;
+ }
+ }
+ }
+
+ // Frame rate
+ if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_DM, "videoFrameRate" )) ) {
+ legacyProp = legacyContext->GetNamedElement ( legacyNS, "VideoFrame" );
+ if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) {
+ XMP_StringPtr prop = legacyProp->GetAttrValue ( "formatFps" );
+ if ( prop != 0 ) {
+ xmpObjPtr->SetProperty ( kXMP_NS_DM, "videoFrameRate", prop, kXMP_DeleteExisting );
+ containsXMP = true;
+ }
+ }
+ }
+
+ // Video codec
+ if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_DM, "videoCompressor" )) ) {
+ legacyProp = legacyContext->GetNamedElement ( legacyNS, "VideoFrame" );
+ if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) {
+ XMP_StringPtr prop = legacyProp->GetAttrValue ( "videoCodec" );
+ if ( prop != 0 ) {
+ xmpObjPtr->SetProperty ( kXMP_NS_DM, "videoCompressor", prop, kXMP_DeleteExisting );
+ containsXMP = true;
+ }
+ }
+ }
+
+ } // VideoFormat
+
+ legacyContext = rootElem->GetNamedElement ( legacyNS, "AudioFormat" );
+
+ if ( legacyContext != 0 ) {
+
+ // Audio codec
+ if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_DM, "audioCompressor" )) ) {
+ legacyProp = legacyContext->GetNamedElement ( legacyNS, "AudioRecPort" );
+ if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) {
+ XMP_StringPtr prop = legacyProp->GetAttrValue ( "audioCodec" );
+ if ( prop != 0 ) {
+ xmpObjPtr->SetProperty ( kXMP_NS_DM, "audioCompressor", prop, kXMP_DeleteExisting );
+ containsXMP = true;
+ }
+ }
+ }
+
+ } // AudioFormat
+
+ // Duration
+ if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_DM, "duration" )) ) {
+
+ std::string durationFrames, timecodeFPS;
+ legacyProp = rootElem->GetNamedElement ( legacyNS, "Duration" );
+ if ( legacyProp != 0 ) {
+ XMP_StringPtr durationValue = legacyProp->GetAttrValue ( "value" );
+ if ( durationValue != 0 ) durationFrames = durationValue;
+ }
+
+ legacyProp = rootElem->GetNamedElement ( legacyNS, "LtcChangeTable" );
+ if ( legacyProp != 0 ) {
+ // [TODO] Verify that this is the correct framerate to use from the legacy metadata. gemiller
+ XMP_StringPtr fps = legacyProp->GetAttrValue ( "tcFps" );
+ if ( fps != 0 ) {
+ timecodeFPS = "1/";
+ timecodeFPS += fps;
+ }
+ }
+
+ if ( (!timecodeFPS.empty()) && (!durationFrames.empty())) {
+ xmpObjPtr->DeleteProperty ( kXMP_NS_DM, "duration" );
+ xmpObjPtr->SetStructField ( kXMP_NS_DM, "duration", kXMP_NS_DM, "value", durationFrames );
+ xmpObjPtr->SetStructField ( kXMP_NS_DM, "duration", kXMP_NS_DM, "scale", timecodeFPS );
+ containsXMP = true;
+ }
+
+ }
+
+ return containsXMP;
+
+}
+
+// =================================================================================================
+// XDCAM_Support::SetLegacyMetaData
+// ================================
+
+bool SetLegacyMetaData ( XML_Node * clipMetadata,
+ SXMPMeta * xmpObj,
+ XMP_StringPtr legacyNS )
+{
+ bool updateLegacyXML = false;
+ bool xmpFound = false;
+ std::string xmpValue;
+ XML_Node * xmlNode = 0;
+
+ xmpFound = xmpObj->GetProperty ( kXMP_NS_DC, "title", &xmpValue, 0 );
+
+ if ( xmpFound ) {
+
+ xmlNode = CreateChildElement ( clipMetadata, "Title", legacyNS, 3 );
+ if ( xmpValue != xmlNode->GetLeafContentValue() ) {
+ xmlNode->SetLeafContentValue ( xmpValue.c_str() );
+ updateLegacyXML = true;
+ }
+
+ }
+
+ xmpFound = xmpObj->GetArrayItem ( kXMP_NS_DC, "creator", 1, &xmpValue, 0 );
+
+ if ( xmpFound ) {
+ xmlNode = CreateChildElement ( clipMetadata, "Creator", legacyNS, 3 );
+ XMP_StringPtr creatorName = xmlNode->GetAttrValue ( "name" );
+ if ( creatorName == 0 ) creatorName = "";
+ if ( xmpValue != creatorName ) {
+ xmlNode->SetAttrValue ( "name", xmpValue.c_str() );
+ updateLegacyXML = true;
+ }
+ }
+
+ xmpFound = xmpObj->GetProperty ( kXMP_NS_DC, "description", &xmpValue, 0 );
+
+ if ( xmpFound ) {
+ xmlNode = CreateChildElement ( clipMetadata, "Description", legacyNS, 3 );
+ if ( xmpValue != xmlNode->GetLeafContentValue() ) {
+ // description in non real time metadata is limited to 2047 bytes
+ if ( xmpValue.size() > 2047 ) xmpValue.resize ( 2047 );
+ xmlNode->SetLeafContentValue ( xmpValue.c_str() );
+ updateLegacyXML = true;
+ }
+ }
+
+ return updateLegacyXML;
+
+}
+
+// =================================================================================================
+
+} // namespace XDCAM_Support
diff --git a/source/XMPFiles/FormatSupport/XDCAM_Support.hpp b/source/XMPFiles/FormatSupport/XDCAM_Support.hpp
new file mode 100644
index 0000000..3fe1e65
--- /dev/null
+++ b/source/XMPFiles/FormatSupport/XDCAM_Support.hpp
@@ -0,0 +1,43 @@
+#ifndef __XDCAM_Support_hpp__
+#define __XDCAM_Support_hpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2006-2007 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XMP_Environment.h" // ! This must be the first include.
+#include "XMP_Const.h"
+#include "XMPFiles_Impl.hpp"
+#include "ExpatAdapter.hpp"
+
+// =================================================================================================
+/// \file XDCAM_Support.hpp
+/// \brief XMPFiles support for XDCAM streams.
+///
+// =================================================================================================
+
+namespace XDCAM_Support
+{
+ // Read XDCAM legacy XML metadata and translate to appropriate XMP.
+ bool GetLegacyMetaData ( SXMPMeta * xmpObjPtr,
+ XML_NodePtr rootElem,
+ XMP_StringPtr legacyNS,
+ bool digestFound,
+ std::string& umid );
+
+ // Write XMP metadata back to legacy XDCAM XML.
+ bool SetLegacyMetaData ( XML_Node * clipMetadata,
+ SXMPMeta * xmpObj,
+ XMP_StringPtr legacyNS );
+
+
+} // namespace XDCAM_Support
+
+// =================================================================================================
+
+#endif // __XDCAM_Support_hpp__
diff --git a/source/XMPFiles/FormatSupport/XMPScanner.cpp b/source/XMPFiles/FormatSupport/XMPScanner.cpp
index acfdce6..4396a25 100644
--- a/source/XMPFiles/FormatSupport/XMPScanner.cpp
+++ b/source/XMPFiles/FormatSupport/XMPScanner.cpp
@@ -10,8 +10,10 @@
// =================================================================================================
#if WIN32
- // The VC++ debugger can't handle long symbol names.
- #pragma warning ( disable : 4786 )
+ #pragma warning ( disable : 4127 ) // conditional expression is constant
+ #pragma warning ( disable : 4510 ) // default constructor could not be generated
+ #pragma warning ( disable : 4610 ) // user defined constructor required
+ #pragma warning ( disable : 4786 ) // debugger can't handle long symbol names
#endif
@@ -223,11 +225,11 @@ XMPScanner::PacketMachine::FindLessThan ( PacketMachine * ths, const char * whic
XMPScanner::PacketMachine::TriState
XMPScanner::PacketMachine::MatchString ( PacketMachine * ths, const char * literal )
{
- const int bytesPerChar = ths->fBytesPerChar;
- const char * litPtr = literal + ths->fPosition;
- const int charsToGo = strlen ( literal ) - ths->fPosition;
- int charsDone = 0;
-
+ const int bytesPerChar = ths->fBytesPerChar;
+ const char * litPtr = literal + ths->fPosition;
+ const XMP_Int32 charsToGo = (XMP_Int32) strlen ( literal ) - ths->fPosition;
+ int charsDone = 0;
+
while ( (charsDone < charsToGo) && (ths->fBufferPtr < ths->fBufferLimit) ) {
if ( *litPtr != *ths->fBufferPtr ) return eTriNo;
charsDone++;
@@ -347,7 +349,7 @@ XMPScanner::PacketMachine::CaptureAttrName ( PacketMachine * ths, const char * /
}
if ( ths->fBufferPtr < ths->fBufferLimit ) return eTriYes;
- ths->fPosition = ths->fAttrName.size(); // The name might span into the next buffer.
+ ths->fPosition = (long) ths->fAttrName.size(); // The name might span into the next buffer.
return eTriMaybe;
} // CaptureAttrName
@@ -670,7 +672,7 @@ XMPScanner::PacketMachine::RecordHeadAttr ( PacketMachine * ths, const char * /*
} else if ( ths->fAttrName == "bytes" ) {
long value = 0;
- int count = ths->fAttrValue.size();
+ int count = (int) ths->fAttrValue.size();
int i;
assert ( ths->fBytesAttr == -1 );
@@ -969,7 +971,7 @@ XMPScanner::PacketMachine::FindNextPacket ()
continue;
case eTriMaybe :
- fBufferOverrun = fBufferPtr - fBufferLimit;
+ fBufferOverrun = (unsigned char)(fBufferPtr - fBufferLimit);
return eTriMaybe; // Keep this recognizer intact, to be resumed later.
}
@@ -1118,7 +1120,7 @@ long
XMPScanner::GetSnipCount ()
{
- return fInternalSnips.size();
+ return (long)fInternalSnips.size();
} // GetSnipCount
@@ -1459,7 +1461,7 @@ XMPScanner::Scan ( const void * bufferOrigin, XMP_Int64 bufferOffset, XMP_Int64
void
XMPScanner::Report ( SnipInfoVector& snips )
{
- const int count = fInternalSnips.size();
+ const int count = (int)fInternalSnips.size();
InternalSnipIterator snipPos = fInternalSnips.begin();
int s;
diff --git a/source/XMPFiles/WXMPFiles.cpp b/source/XMPFiles/WXMPFiles.cpp
index 9ce4a47..5976b48 100644
--- a/source/XMPFiles/WXMPFiles.cpp
+++ b/source/XMPFiles/WXMPFiles.cpp
@@ -158,6 +158,30 @@ void WXMPFiles_GetFormatInfo_1 ( XMP_FileFormat format,
// =================================================================================================
+void WXMPFiles_CheckFileFormat_1 ( XMP_StringPtr filePath,
+ WXMP_Result * wResult )
+{
+ XMP_ENTER_WRAPPER ( "WXMPFiles_CheckFileFormat_1" )
+
+ wResult->int32Result = XMPFiles::CheckFileFormat ( filePath );
+
+ XMP_EXIT_WRAPPER
+}
+
+// =================================================================================================
+
+void WXMPFiles_CheckPackageFormat_1 ( XMP_StringPtr folderPath,
+ WXMP_Result * wResult )
+{
+ XMP_ENTER_WRAPPER ( "WXMPFiles_CheckPackageFormat_1" )
+
+ wResult->int32Result = XMPFiles::CheckPackageFormat ( folderPath );
+
+ XMP_EXIT_WRAPPER
+}
+
+// =================================================================================================
+
void WXMPFiles_OpenFile_1 ( XMPFilesRef xmpFilesRef,
XMP_StringPtr filePath,
XMP_FileFormat format,
diff --git a/source/XMPFiles/XMPFiles.cpp b/source/XMPFiles/XMPFiles.cpp
index 136feb3..8471675 100644
--- a/source/XMPFiles/XMPFiles.cpp
+++ b/source/XMPFiles/XMPFiles.cpp
@@ -1,6 +1,6 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2002-2007 Adobe Systems Incorporated
+// Copyright 2002-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -12,7 +12,6 @@
#include "XMPFiles_Impl.hpp"
#include "UnicodeConversions.hpp"
-#include "QuickTime_Support.hpp"
// These are the official, fully supported handlers.
#include "FileHandlers/JPEG_Handler.hpp"
@@ -21,12 +20,26 @@
#include "FileHandlers/InDesign_Handler.hpp"
#include "FileHandlers/PostScript_Handler.hpp"
#include "FileHandlers/Scanner_Handler.hpp"
-#include "FileHandlers/MOV_Handler.hpp"
-#include "FileHandlers/MPEG_Handler.hpp"
-#include "FileHandlers/MP3_Handler.hpp"
+#include "FileHandlers/MPEG2_Handler.hpp"
#include "FileHandlers/PNG_Handler.hpp"
#include "FileHandlers/AVI_Handler.hpp"
#include "FileHandlers/WAV_Handler.hpp"
+#include "FileHandlers/MP3_Handler.hpp"
+#include "FileHandlers/SWF_Handler.hpp"
+#include "FileHandlers/UCF_Handler.hpp"
+#include "FileHandlers/MPEG4_Handler.hpp"
+#include "FileHandlers/FLV_Handler.hpp"
+#include "FileHandlers/P2_Handler.hpp"
+#include "FileHandlers/SonyHDV_Handler.hpp"
+#include "FileHandlers/XDCAM_Handler.hpp"
+#include "FileHandlers/XDCAMEX_Handler.hpp"
+#include "FileHandlers/AVCHD_Handler.hpp"
+#include "FileHandlers/ASF_Handler.hpp"
+
+#if ! (XMP_64 || XMP_UNIXBuild)
+ #include "QuickTime_Support.hpp"
+ #include "FileHandlers/MOV_Handler.hpp" //old MOV handler
+#endif
// =================================================================================================
/// \file XMPFiles.cpp
@@ -65,26 +78,106 @@ const char * kXMPFiles_EmbeddedCopyright = kXMPFilesName " " kXMP_CopyrightStr;
// =================================================================================================
struct XMPFileHandlerInfo {
- XMP_FileFormat format;
- XMP_OptionBits flags;
- CheckFormatProc checkProc;
+ XMP_FileFormat format;
+ XMP_OptionBits flags;
+ void * checkProc;
XMPFileHandlerCTor handlerCTor;
XMPFileHandlerInfo() : format(0), flags(0), checkProc(0), handlerCTor(0) {};
XMPFileHandlerInfo ( XMP_FileFormat _format, XMP_OptionBits _flags,
- CheckFormatProc _checkProc, XMPFileHandlerCTor _handlerCTor )
- : format(_format), flags(_flags), checkProc(_checkProc), handlerCTor(_handlerCTor) {};
+ CheckFileFormatProc _checkProc, XMPFileHandlerCTor _handlerCTor )
+ : format(_format), flags(_flags), checkProc((void*)_checkProc), handlerCTor(_handlerCTor) {};
+ XMPFileHandlerInfo ( XMP_FileFormat _format, XMP_OptionBits _flags,
+ CheckFolderFormatProc _checkProc, XMPFileHandlerCTor _handlerCTor )
+ : format(_format), flags(_flags), checkProc((void*)_checkProc), handlerCTor(_handlerCTor) {};
};
-typedef std::vector <XMPFileHandlerInfo> XMPFileHandlerTable;
+// Don't use a map for the handler tables,
+typedef std::map <XMP_FileFormat, XMPFileHandlerInfo> XMPFileHandlerTable;
typedef XMPFileHandlerTable::iterator XMPFileHandlerTablePos;
+typedef std::pair <XMP_FileFormat, XMPFileHandlerInfo> XMPFileHandlerTablePair;
+
+static XMPFileHandlerTable * sFolderHandlers = 0; // The directory-oriented handlers.
+static XMPFileHandlerTable * sNormalHandlers = 0; // The normal file-oriented handlers.
+static XMPFileHandlerTable * sOwningHandlers = 0; // The file-oriented handlers that "own" the file.
+
+static XMPFileHandlerInfo kScannerHandlerInfo ( kXMP_UnknownFile, kScanner_HandlerFlags, (CheckFileFormatProc)0, Scanner_MetaHandlerCTor );
+
+// =================================================================================================
+
+static void
+RegisterFolderHandler ( XMP_FileFormat format,
+ XMP_OptionBits flags,
+ CheckFolderFormatProc checkProc,
+ XMPFileHandlerCTor handlerCTor )
+{
+ XMP_Assert ( format != kXMP_UnknownFile );
+ std::string noExt;
+
+ XMP_Assert ( flags & kXMPFiles_HandlerOwnsFile );
+ XMP_Assert ( flags & kXMPFiles_FolderBasedFormat );
+ XMP_Assert ( (flags & kXMPFiles_CanInjectXMP) ? (flags & kXMPFiles_CanExpand) : 1 );
+
+ XMP_Assert ( sFolderHandlers->find ( format ) == sFolderHandlers->end() );
+ XMP_Assert ( sNormalHandlers->find ( format ) == sNormalHandlers->end() );
+ XMP_Assert ( sOwningHandlers->find ( format ) == sOwningHandlers->end() );
+
+ XMPFileHandlerInfo handlerInfo ( format, flags, checkProc, handlerCTor );
+ sFolderHandlers->insert ( sFolderHandlers->end(), XMPFileHandlerTablePair ( format, handlerInfo ) );
+
+} // RegisterFolderHandler
+
+// =================================================================================================
+
+static void
+RegisterNormalHandler ( XMP_FileFormat format,
+ XMP_OptionBits flags,
+ CheckFileFormatProc checkProc,
+ XMPFileHandlerCTor handlerCTor )
+{
+ XMP_Assert ( format != kXMP_UnknownFile );
+ std::string noExt;
+
+ XMP_Assert ( ! (flags & kXMPFiles_HandlerOwnsFile) );
+ XMP_Assert ( ! (flags & kXMPFiles_FolderBasedFormat) );
+ XMP_Assert ( (flags & kXMPFiles_CanInjectXMP) ? (flags & kXMPFiles_CanExpand) : 1 );
+
+ XMP_Assert ( sFolderHandlers->find ( format ) == sFolderHandlers->end() );
+ XMP_Assert ( sNormalHandlers->find ( format ) == sNormalHandlers->end() );
+ XMP_Assert ( sOwningHandlers->find ( format ) == sOwningHandlers->end() );
+
+ XMPFileHandlerInfo handlerInfo ( format, flags, checkProc, handlerCTor );
+ sNormalHandlers->insert ( sNormalHandlers->end(), XMPFileHandlerTablePair ( format, handlerInfo ) );
+
+} // RegisterNormalHandler
+
+// =================================================================================================
+
+static void
+RegisterOwningHandler ( XMP_FileFormat format,
+ XMP_OptionBits flags,
+ CheckFileFormatProc checkProc,
+ XMPFileHandlerCTor handlerCTor )
+{
+ XMP_Assert ( format != kXMP_UnknownFile );
+ std::string noExt;
-static XMPFileHandlerTable * sRegisteredHandlers = 0; // ! Only smart handlers are registered!
+ XMP_Assert ( flags & kXMPFiles_HandlerOwnsFile );
+ XMP_Assert ( ! (flags & kXMPFiles_FolderBasedFormat) );
+ XMP_Assert ( (flags & kXMPFiles_CanInjectXMP) ? (flags & kXMPFiles_CanExpand) : 1 );
+
+ XMP_Assert ( sFolderHandlers->find ( format ) == sFolderHandlers->end() );
+ XMP_Assert ( sNormalHandlers->find ( format ) == sNormalHandlers->end() );
+ XMP_Assert ( sOwningHandlers->find ( format ) == sOwningHandlers->end() );
+
+ XMPFileHandlerInfo handlerInfo ( format, flags, checkProc, handlerCTor );
+ sOwningHandlers->insert ( sOwningHandlers->end(), XMPFileHandlerTablePair ( format, handlerInfo ) );
+
+} // RegisterOwningHandler
// =================================================================================================
-static XMPFileHandlerTablePos
-FindHandler ( XMP_FileFormat format,
- std::string & fileExt )
+static XMPFileHandlerInfo *
+PickDefaultHandler ( XMP_FileFormat format, const std::string & fileExt )
{
if ( (format == kXMP_UnknownFile) && (! fileExt.empty()) ) {
for ( int i = 0; kFileExtMap[i].format != 0; ++i ) {
@@ -95,39 +188,446 @@ FindHandler ( XMP_FileFormat format,
}
}
- if ( format == kXMP_UnknownFile ) return sRegisteredHandlers->end();
+ if ( format == kXMP_UnknownFile ) return 0;
+
+ XMPFileHandlerTablePos handlerPos;
+
+ handlerPos = sNormalHandlers->find ( format );
+ if ( handlerPos != sNormalHandlers->end() ) return &handlerPos->second;
+
+ handlerPos = sOwningHandlers->find ( format );
+ if ( handlerPos != sOwningHandlers->end() ) return &handlerPos->second;
+
+ handlerPos = sFolderHandlers->find ( format );
+ if ( handlerPos != sFolderHandlers->end() ) return &handlerPos->second;
+
+ return 0;
+
+} // PickDefaultHandler
+
+// =================================================================================================
+
+static const char * kP2ContentChildren[] = { "CLIP", "VIDEO", "AUDIO", "ICON", "VOICE", "PROXY", 0 };
- XMPFileHandlerTablePos handlerPos = sRegisteredHandlers->begin();
- for ( ; handlerPos != sRegisteredHandlers->end(); ++handlerPos ) {
- if ( handlerPos->format == format ) return handlerPos;
+static inline bool CheckP2ContentChild ( const std::string & folderName )
+{
+ for ( int i = 0; kP2ContentChildren[i] != 0; ++i ) {
+ if ( folderName == kP2ContentChildren[i] ) return true;
+ }
+ return false;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+static XMP_FileFormat
+CheckParentFolderNames ( const std::string & rootPath, const std::string & gpName,
+ const std::string & parentName, const std::string & leafName )
+{
+ IgnoreParam ( parentName );
+
+ // This is called when the input path to XMPFiles::OpenFile names an existing file. We need to
+ // quickly decide if this might be inside a folder-handler's structure. See if the containing
+ // folders might match any of the registered folder handlers. This check does not have to be
+ // precise, the handler will do that. This does have to be fast.
+ //
+ // Since we don't have many folder handlers, this is simple hardwired code. Note that the caller
+ // has already shifted the names to upper case.
+
+ // P2 .../MyMovie/CONTENTS/<group>/<file>.<ext> - check CONTENTS and <group>
+ if ( (gpName == "CONTENTS") && CheckP2ContentChild ( parentName ) ) return kXMP_P2File;
+
+ // XDCAMEX .../MyMovie/BPAV/CLPR/<clip>/<file>.<ext> - check for BPAV/CLPR
+ // ! This must be checked before XDCAM-SAM because both have a "CLPR" grandparent.
+ if ( gpName == "CLPR" ) {
+ std::string tempPath, greatGP;
+ tempPath = rootPath;
+ SplitLeafName ( &tempPath, &greatGP );
+ MakeUpperCase ( &greatGP );
+ if ( greatGP == "BPAV" ) return kXMP_XDCAM_EXFile;
}
+
+ // XDCAM-FAM .../MyMovie/<group>/<file>.<ext> - check that <group> is CLIP, or EDIT, or SUB
+ if ( (parentName == "CLIP") || (parentName == "EDIT") || (parentName == "SUB") ) return kXMP_XDCAM_FAMFile;
+
+ // XDCAM-SAM .../MyMovie/PROAV/<group>/<clip>/<file>.<ext> - check for PROAV and CLPR or EDTR
+ if ( (gpName == "CLPR") || (gpName == "EDTR") ) {
+ std::string tempPath, greatGP;
+ tempPath = rootPath;
+ SplitLeafName ( &tempPath, &greatGP );
+ MakeUpperCase ( &greatGP );
+ if ( greatGP == "PROAV" ) return kXMP_XDCAM_SAMFile;
+ }
+
+ // Sony HDV .../MyMovie/VIDEO/HVR/<file>.<ext> - check for VIDEO and HVR
+ if ( (gpName == "VIDEO") && (parentName == "HVR") ) return kXMP_SonyHDVFile;
- return sRegisteredHandlers->end();
+ // AVCHD .../MyMovie/BDMV/<group>/<file>.<ext> - check for BDMV and CLIPINF or STREAM
+ if ( (gpName == "BDMV") && ((parentName == "CLIPINF") || (parentName == "STREAM")) ) return kXMP_AVCHDFile;
-} // FindHandler
+ return kXMP_UnknownFile;
+
+} // CheckParentFolderNames
// =================================================================================================
-static void
-RegisterXMPFileHandler ( XMP_FileFormat format,
- XMP_OptionBits flags,
- CheckFormatProc checkProc,
- XMPFileHandlerCTor handlerCTor )
+static XMP_FileFormat
+CheckTopFolderName ( const std::string & rootPath )
{
- XMP_Assert ( format != kXMP_UnknownFile );
- std::string noExt;
+ // This is called when the input path to XMPFiles::OpenFile does not name an existing file (or
+ // existing anything). We need to quickly decide if this might be a logical path for a folder
+ // handler. See if the root contains the top content folder for any of the registered folder
+ // handlers. This check does not have to be precise, the handler will do that. This does have to
+ // be fast.
+ //
+ // Since we don't have many folder handlers, this is simple hardwired code.
+
+ std::string childPath = rootPath;
+ childPath += kDirChar;
+ size_t baseLen = childPath.size();
+
+ // P2 .../MyMovie/CONTENTS/<group>/... - only check for CONTENTS/CLIP
+ childPath += "CONTENTS";
+ childPath += kDirChar;
+ childPath += "CLIP";
+ if ( GetFileMode ( childPath.c_str() ) == kFMode_IsFolder ) return kXMP_P2File;
+ childPath.erase ( baseLen );
+
+ // XDCAM-FAM .../MyMovie/<group>/... - only check for CLIP and MEDIAPRO.XML
+ childPath += "CLIP";
+ if ( GetFileMode ( childPath.c_str() ) == kFMode_IsFolder ) {
+ childPath.erase ( baseLen );
+ childPath += "MEDIAPRO.XML";
+ if ( GetFileMode ( childPath.c_str() ) == kFMode_IsFile ) return kXMP_XDCAM_FAMFile;
+ }
+ childPath.erase ( baseLen );
+
+ // XDCAM-SAM .../MyMovie/PROAV/<group>/... - only check for PROAV/CLPR
+ childPath += "PROAV";
+ childPath += kDirChar;
+ childPath += "CLPR";
+ if ( GetFileMode ( childPath.c_str() ) == kFMode_IsFolder ) return kXMP_XDCAM_SAMFile;
+ childPath.erase ( baseLen );
+
+ // XDCAM-EX .../MyMovie/BPAV/<group>/... - check for BPAV/CLPR
+ childPath += "BPAV";
+ childPath += kDirChar;
+ childPath += "CLPR";
+ if ( GetFileMode ( childPath.c_str() ) == kFMode_IsFolder ) return kXMP_XDCAM_EXFile;
+ childPath.erase ( baseLen );
+
+ // Sony HDV .../MyMovie/VIDEO/HVR/<file>.<ext> - check for VIDEO/HVR
+ childPath += "VIDEO";
+ childPath += kDirChar;
+ childPath += "HVR";
+ if ( GetFileMode ( childPath.c_str() ) == kFMode_IsFolder ) return kXMP_SonyHDVFile;
+ childPath.erase ( baseLen );
+
+ // AVCHD .../MyMovie/BDMV/CLIPINF/<file>.<ext> - check for BDMV/CLIPINF
+ childPath += "BDMV";
+ childPath += kDirChar;
+ childPath += "CLIPINF";
+ if ( GetFileMode ( childPath.c_str() ) == kFMode_IsFolder ) return kXMP_AVCHDFile;
+ childPath.erase ( baseLen );
+
+ return kXMP_UnknownFile;
+
+} // CheckTopFolderName
+
+// =================================================================================================
+
+static XMPFileHandlerInfo *
+TryFolderHandlers ( XMP_FileFormat format,
+ const std::string & rootPath,
+ const std::string & gpName,
+ const std::string & parentName,
+ const std::string & _leafName,
+ XMPFiles * parentObj )
+{
+ bool foundHandler = false;
+ XMPFileHandlerInfo * handlerInfo = 0;
+ XMPFileHandlerTablePos handlerPos;
+
+ std::string leafName ( _leafName );
+ MakeUpperCase ( &leafName );
- if ( FindHandler ( format, noExt ) != sRegisteredHandlers->end() ) {
- XMP_Throw ( "Duplicate handler registration", kXMPErr_InternalFailure );
+ // We know we're in a possible context for a folder-oriented handler, so try them.
+
+ if ( format != kXMP_UnknownFile ) {
+
+ // Have an explicit format, pick that or nothing.
+ handlerPos = sFolderHandlers->find ( format );
+ if ( handlerPos != sFolderHandlers->end() ) {
+ handlerInfo = &handlerPos->second;
+ CheckFolderFormatProc CheckProc = (CheckFolderFormatProc) (handlerInfo->checkProc);
+ foundHandler = CheckProc ( handlerInfo->format, rootPath, gpName, parentName, leafName, parentObj );
+ XMP_Assert ( foundHandler || (parentObj->handlerTemp == 0) );
+ }
+
+ } else {
+
+ // Try all of the folder handlers.
+ for ( handlerPos = sFolderHandlers->begin(); handlerPos != sFolderHandlers->end(); ++handlerPos ) {
+ handlerInfo = &handlerPos->second;
+ CheckFolderFormatProc CheckProc = (CheckFolderFormatProc) (handlerInfo->checkProc);
+ foundHandler = CheckProc ( handlerInfo->format, rootPath, gpName, parentName, leafName, parentObj );
+ XMP_Assert ( foundHandler || (parentObj->handlerTemp == 0) );
+ if ( foundHandler ) break; // ! Exit before incrementing handlerPos.
+ }
+
}
- if ( (flags & kXMPFiles_CanInjectXMP) && (! (flags & kXMPFiles_CanExpand)) ) {
- XMP_Throw ( "Inconsistent handler flags", kXMPErr_InternalFailure );
+ if ( ! foundHandler ) handlerInfo = 0;
+ return handlerInfo;
+
+} // TryFolderHandlers
+
+// =================================================================================================
+
+static XMPFileHandlerInfo *
+SelectSmartHandler ( XMPFiles * thiz, XMP_StringPtr clientPath, XMP_FileFormat format, XMP_OptionBits openFlags )
+{
+
+ // There are 4 stages in finding a handler, ending at the first success:
+ // 1. If the client passes in a format, try that handler.
+ // 2. Try all of the folder-oriented handlers.
+ // 3. Try a file-oriented handler based on the file extension.
+ // 4. Try all of the file-oriented handlers.
+ //
+ // The most common case is almost certainly #3, so we want to get there quickly. Most of the
+ // time the client won't pass in a format, so #1 takes no time. The folder-oriented handler
+ // checks are preceded by minimal folder checks. These checks are meant to be fast in the
+ // failure case. The folder-oriented checks have to go before the general file-oriented checks
+ // because the client path might be to one of the inner files, and we might have a file-oriented
+ // handler for that kind of file, but we want to recognize the clip. More details are below.
+ //
+ // In brief, the folder-oriented formats use shallow trees with specific folder names and
+ // highly stylized file names. The user thinks of the tree as a collection of clips, each clip
+ // is stored as multiple files for video, audio, metadata, etc. The folder-oriented stage has
+ // to be first because there can be files in the structure that are also covered by a
+ // file-oriented handler.
+ //
+ // In the file-oriented case, the CheckProc should do as little as possible to determine the
+ // format, based on the actual file content. If that is not possible, use the format hint. The
+ // initial CheckProc calls (steps 1 and 3) has the presumed format in this->format, the later
+ // calls (step 4) have kXMP_UnknownFile there.
+ //
+ // The folder-oriented checks need to be well optimized since the formats are relatively rare,
+ // but have to go first and could require multiple file system calls to identify. We want to
+ // get to the first file-oriented guess as quickly as possible, that is the real handler most of
+ // the time.
+ //
+ // The folder-oriented handlers are for things like P2 and XDCAM that use files distributed in a
+ // well defined folder structure. Using a portion of P2 as an example:
+ // .../MyMovie
+ // CONTENTS
+ // CLIP
+ // 0001AB.XML
+ // 0002CD.XML
+ // VIDEO
+ // 0001AB.MXF
+ // 0002CD.MXF
+ // VOICE
+ // 0001AB.WAV
+ // 0002CD.WAV
+ //
+ // The user thinks of .../MyMovie as the container of P2 stuff, in this case containing 2 clips
+ // called 0001AB and 0002CD. The exact folder structure and file layout differs, but the basic
+ // concepts carry across all of the folder-oriented handlers.
+ //
+ // The client path can be a conceptual clip path like .../MyMovie/0001AB, or a full path to any
+ // of the contained files. For file paths we have to behave the same as the implied conceptual
+ // path, e.g. we don't want .../MyMovie/CONTENTS/VOICE/0001AB.WAV to invoke the WAV handler.
+ // There might also be a mapping from user friendly names to clip names (e.g. Intro to 0001AB).
+ // If so that is private to the handler and does not affect this code.
+ //
+ // In order to properly handle the file path input we have to look for the folder-oriented case
+ // before any of the file-oriented cases. And since these are relatively rare, hence fail most of
+ // the time, we have to get in and out fast in the not handled case. That is what we do here.
+ //
+ // The folder-oriented processing done here is roughly:
+ //
+ // 1. Get the state of the client path: does-not-exist, is-file, is-folder, is-other.
+ // 2. Reject is-folder and is-other, they can't possibly be a valid case.
+ // 3. For does-not-exist:
+ // 3a. Split the client path into a leaf component and root path.
+ // 3b. Make sure the root path names an existing folder.
+ // 3c. Make sure the root folder has a viable top level child folder (e.g. CONTENTS).
+ // 4. For is-file:
+ // 4a. Split the client path into a root path, grandparent folder, parent folder, and leaf name.
+ // 4b. Make sure the parent or grandparent has a viable name (e.g. CONTENTS).
+ // 5. Try the registered folder handlers.
+ //
+ // For the common case of "regular" files, we should only get as far as 3b. This is just 1 file
+ // system call to get the client path state and some string processing.
+
+ char openMode = 'r';
+ if ( openFlags & kXMPFiles_OpenForUpdate ) openMode = 'w';
+
+ XMPFileHandlerInfo * handlerInfo = 0;
+ bool foundHandler = false;
+
+ FileMode clientMode = GetFileMode ( clientPath );
+ if ( (clientMode == kFMode_IsFolder) || (clientMode == kFMode_IsOther) ) return 0;
+
+ // Extract some info from the clientPath, needed for various checks.
+
+ std::string rootPath, leafName, fileExt;
+
+ rootPath = clientPath;
+ SplitLeafName ( &rootPath, &leafName );
+ if ( leafName.empty() ) return 0;
+
+ size_t extPos = leafName.size();
+ for ( --extPos; extPos > 0; --extPos ) if ( leafName[extPos] == '.' ) break;
+ if ( leafName[extPos] == '.' ) {
+ fileExt.assign ( &leafName[extPos+1] );
+ MakeLowerCase ( &fileExt );
+ leafName.erase ( extPos );
+ }
+
+ thiz->format = kXMP_UnknownFile; // Make sure it is preset for later checks.
+ thiz->openFlags = openFlags;
+
+ // If the client passed in a format, try that first.
+
+ if ( format != kXMP_UnknownFile ) {
+
+ std::string emptyStr;
+ handlerInfo = PickDefaultHandler ( format, emptyStr ); // Picks based on just the format.
+
+ if ( handlerInfo != 0 ) {
+
+ if ( (thiz->fileRef == 0) && (! (handlerInfo->flags & kXMPFiles_HandlerOwnsFile)) ) {
+ thiz->fileRef = LFA_Open ( clientPath, openMode );
+ XMP_Assert ( thiz->fileRef != 0 ); // LFA_Open must either succeed or throw.
+ }
+ thiz->format = handlerInfo->format; // ! Hack to tell the CheckProc thiz is an initial call.
+
+ if ( ! (handlerInfo->flags & kXMPFiles_FolderBasedFormat) ) {
+ CheckFileFormatProc CheckProc = (CheckFileFormatProc) (handlerInfo->checkProc);
+ foundHandler = CheckProc ( handlerInfo->format, clientPath, thiz->fileRef, thiz );
+ } else {
+ // *** Don't try here yet. These are messy, needing existence checking and path processing.
+ // *** CheckFolderFormatProc CheckProc = (CheckFolderFormatProc) (handlerInfo->checkProc);
+ // *** foundHandler = CheckProc ( handlerInfo->format, rootPath, gpName, parentName, leafName, thiz );
+ // *** Don't let OpenStrictly cause an early exit:
+ if ( openFlags & kXMPFiles_OpenStrictly ) openFlags ^= kXMPFiles_OpenStrictly;
+ }
+
+ XMP_Assert ( foundHandler || (thiz->handlerTemp == 0) );
+ if ( foundHandler ) return handlerInfo;
+ handlerInfo = 0; // ! Clear again for later use.
+
+ }
+
+ if ( openFlags & kXMPFiles_OpenStrictly ) return 0;
+
}
- sRegisteredHandlers->push_back ( XMPFileHandlerInfo ( format, flags, checkProc, handlerCTor ) );
+ // Try the folder handlers if appropriate.
+
+ XMP_Assert ( handlerInfo == 0 );
+ XMP_Assert ( (clientMode == kFMode_IsFile) || (clientMode == kFMode_DoesNotExist) );
+
+ std::string gpName, parentName;
-} // RegisterXMPFileHandler
+ if ( clientMode == kFMode_DoesNotExist ) {
+
+ // 3. For does-not-exist:
+ // 3a. Split the client path into a leaf component and root path.
+ // 3b. Make sure the root path names an existing folder.
+ // 3c. Make sure the root folder has a viable top level child folder.
+
+ // ! This does "return 0" on failure, the file does not exist so a normal file handler can't apply.
+
+ if ( GetFileMode ( rootPath.c_str() ) != kFMode_IsFolder ) return 0;
+ thiz->format = CheckTopFolderName ( rootPath );
+ if ( thiz->format == kXMP_UnknownFile ) return 0;
+
+ handlerInfo = TryFolderHandlers ( thiz->format, rootPath, gpName, parentName, leafName, thiz ); // ! Parent and GP are empty.
+ return handlerInfo; // ! Return found handler or 0.
+
+ }
+
+ XMP_Assert ( clientMode == kFMode_IsFile );
+
+ // 4. For is-file:
+ // 4a. Split the client path into root, grandparent, parent, and leaf.
+ // 4b. Make sure the parent or grandparent has a viable name.
+
+ // ! Don't "return 0" on failure, this has to fall through to the normal file handlers.
+
+ SplitLeafName ( &rootPath, &parentName );
+ SplitLeafName ( &rootPath, &gpName );
+ std::string origGPName ( gpName ); // ! Save the original case for XDCAM-FAM.
+ MakeUpperCase ( &parentName );
+ MakeUpperCase ( &gpName );
+
+ thiz->format = CheckParentFolderNames ( rootPath, gpName, parentName, leafName );
+
+ if ( thiz->format != kXMP_UnknownFile ) {
+
+ if ( (thiz->format == kXMP_XDCAM_FAMFile) &&
+ ((parentName == "CLIP") || (parentName == "EDIT") || (parentName == "SUB")) ) {
+ gpName = origGPName; // ! XDCAM-FAM has just 1 level of inner folder, preserve the "MyMovie" case.
+ }
+
+ handlerInfo = TryFolderHandlers ( thiz->format, rootPath, gpName, parentName, leafName, thiz );
+ if ( handlerInfo != 0 ) return handlerInfo;
+
+ }
+
+ // Try an initial file-oriented handler based on the extension.
+
+ handlerInfo = PickDefaultHandler ( kXMP_UnknownFile, fileExt ); // Picks based on just the extension.
+
+ if ( handlerInfo != 0 ) {
+ if ( (thiz->fileRef == 0) && (! (handlerInfo->flags & kXMPFiles_HandlerOwnsFile)) ) {
+ thiz->fileRef = LFA_Open ( clientPath, openMode );
+ XMP_Assert ( thiz->fileRef != 0 ); // LFA_Open must either succeed or throw.
+ }
+ thiz->format = handlerInfo->format; // ! Hack to tell the CheckProc thiz is an initial call.
+ CheckFileFormatProc CheckProc = (CheckFileFormatProc) (handlerInfo->checkProc);
+ foundHandler = CheckProc ( handlerInfo->format, clientPath, thiz->fileRef, thiz );
+ XMP_Assert ( foundHandler || (thiz->handlerTemp == 0) );
+ if ( foundHandler ) return handlerInfo;
+ }
+
+ // Search the handlers that don't want to open the file themselves.
+
+ if ( thiz->fileRef == 0 ) thiz->fileRef = LFA_Open ( clientPath, openMode );
+ XMP_Assert ( thiz->fileRef != 0 ); // LFA_Open must either succeed or throw.
+ XMPFileHandlerTablePos handlerPos = sNormalHandlers->begin();
+
+ for ( ; handlerPos != sNormalHandlers->end(); ++handlerPos ) {
+ thiz->format = kXMP_UnknownFile; // ! Hack to tell the CheckProc this is not an initial call.
+ handlerInfo = &handlerPos->second;
+ CheckFileFormatProc CheckProc = (CheckFileFormatProc) (handlerInfo->checkProc);
+ foundHandler = CheckProc ( handlerInfo->format, clientPath, thiz->fileRef, thiz );
+ XMP_Assert ( foundHandler || (thiz->handlerTemp == 0) );
+ if ( foundHandler ) return handlerInfo;
+ }
+
+ // Search the handlers that do want to open the file themselves.
+
+ LFA_Close ( thiz->fileRef );
+ thiz->fileRef = 0;
+ handlerPos = sOwningHandlers->begin();
+
+ for ( ; handlerPos != sOwningHandlers->end(); ++handlerPos ) {
+ thiz->format = kXMP_UnknownFile; // ! Hack to tell the CheckProc this is not an initial call.
+ handlerInfo = &handlerPos->second;
+ CheckFileFormatProc CheckProc = (CheckFileFormatProc) (handlerInfo->checkProc);
+ foundHandler = CheckProc ( handlerInfo->format, clientPath, thiz->fileRef, thiz );
+ XMP_Assert ( foundHandler || (thiz->handlerTemp == 0) );
+ if ( foundHandler ) return handlerInfo;
+ }
+
+ // Failed to find a smart handler.
+
+ return 0;
+
+} // SelectSmartHandler
// =================================================================================================
@@ -149,7 +649,9 @@ XMPFiles::GetVersionInfo ( XMP_VersionInfo * info )
// =================================================================================================
-static bool sIgnoreQuickTime = false;
+#if ! (XMP_64 || XMP_UNIXBuild)
+ static bool sIgnoreQuickTime = false; // Not vital, but helps catching missing excludes elsewhere.
+#endif
/* class static */
bool
@@ -177,62 +679,68 @@ XMPFiles::Initialize ( XMP_OptionBits options /* = 0 */ )
XMP_Assert ( kUTF8_PacketHeaderLen == strlen ( "<?xpacket begin='xxx' id='W5M0MpCehiHzreSzNTczkc9d'" ) );
XMP_Assert ( kUTF8_PacketTrailerLen == strlen ( (const char *) kUTF8_PacketTrailer ) );
- sRegisteredHandlers = new XMPFileHandlerTable;
+ sFolderHandlers = new XMPFileHandlerTable;
+ sNormalHandlers = new XMPFileHandlerTable;
+ sOwningHandlers = new XMPFileHandlerTable;
+
sXMPFilesExceptionMessage = new XMP_VarString;
InitializeUnicodeConversions();
- sIgnoreQuickTime = XMP_OptionIsSet ( options, kXMPFiles_NoQuickTimeInit );
- if ( ! sIgnoreQuickTime ) {
- (void) QuickTime_Support::MainInitialize(); // Don't worry about failure, the MOV handler checks that.
- }
+ #if ! (XMP_64 || XMP_UNIXBuild)
+ sIgnoreQuickTime = XMP_OptionIsSet ( options, kXMPFiles_NoQuickTimeInit );
+ (void) QuickTime_Support::MainInitialize ( sIgnoreQuickTime ); // Don't worry about failure, the MOV handler checks that.
+ #endif
- // ----------------------------------------------------------------------------------
- // First register the handlers that don't want to open and close the file themselves.
-
- XMP_Assert ( ! (kJPEG_HandlerFlags & kXMPFiles_HandlerOwnsFile) );
- RegisterXMPFileHandler ( kXMP_JPEGFile, kJPEG_HandlerFlags, JPEG_CheckFormat, JPEG_MetaHandlerCTor );
-
- XMP_Assert ( ! (kTIFF_HandlerFlags & kXMPFiles_HandlerOwnsFile) );
- RegisterXMPFileHandler ( kXMP_TIFFFile, kTIFF_HandlerFlags, TIFF_CheckFormat, TIFF_MetaHandlerCTor );
+#if XMP_UNIXBuild
- XMP_Assert ( ! (kPSD_HandlerFlags & kXMPFiles_HandlerOwnsFile) );
- RegisterXMPFileHandler ( kXMP_PhotoshopFile, kPSD_HandlerFlags, PSD_CheckFormat, PSD_MetaHandlerCTor );
+ // *** For the time being only allow the JPEG smart handler for generic UNIX, not even packet scanning.
+ RegisterNormalHandler ( kXMP_JPEGFile, kJPEG_HandlerFlags, JPEG_CheckFormat, JPEG_MetaHandlerCTor );
- XMP_Assert ( ! (kInDesign_HandlerFlags & kXMPFiles_HandlerOwnsFile) );
- RegisterXMPFileHandler ( kXMP_InDesignFile, kInDesign_HandlerFlags, InDesign_CheckFormat, InDesign_MetaHandlerCTor );
-
- // ! EPS and PostScript have the same handler, EPS is a proper subset of PostScript.
- XMP_Assert ( ! (kPostScript_HandlerFlags & kXMPFiles_HandlerOwnsFile) );
- RegisterXMPFileHandler ( kXMP_EPSFile, kPostScript_HandlerFlags, PostScript_CheckFormat, PostScript_MetaHandlerCTor );
- RegisterXMPFileHandler ( kXMP_PostScriptFile, kPostScript_HandlerFlags, PostScript_CheckFormat, PostScript_MetaHandlerCTor );
-
- XMP_Assert ( ! (kPNG_HandlerFlags & kXMPFiles_HandlerOwnsFile) );
- RegisterXMPFileHandler ( kXMP_PNGFile, kPNG_HandlerFlags, PNG_CheckFormat, PNG_MetaHandlerCTor );
+#else
+
+ // -----------------------------------------
+ // Register the directory-oriented handlers.
- XMP_Assert ( ! (kAVI_HandlerFlags & kXMPFiles_HandlerOwnsFile) );
- RegisterXMPFileHandler ( kXMP_AVIFile, kAVI_HandlerFlags, AVI_CheckFormat, AVI_MetaHandlerCTor );
+ RegisterFolderHandler ( kXMP_P2File, kP2_HandlerFlags, P2_CheckFormat, P2_MetaHandlerCTor );
+ RegisterFolderHandler ( kXMP_SonyHDVFile, kSonyHDV_HandlerFlags, SonyHDV_CheckFormat, SonyHDV_MetaHandlerCTor );
+ RegisterFolderHandler ( kXMP_XDCAM_FAMFile, kXDCAM_HandlerFlags, XDCAM_CheckFormat, XDCAM_MetaHandlerCTor );
+ RegisterFolderHandler ( kXMP_XDCAM_SAMFile, kXDCAM_HandlerFlags, XDCAM_CheckFormat, XDCAM_MetaHandlerCTor );
+ RegisterFolderHandler ( kXMP_XDCAM_EXFile, kXDCAMEX_HandlerFlags, XDCAMEX_CheckFormat, XDCAMEX_MetaHandlerCTor );
+ RegisterFolderHandler ( kXMP_AVCHDFile, kAVCHD_HandlerFlags, AVCHD_CheckFormat, AVCHD_MetaHandlerCTor );
- XMP_Assert ( ! (kWAV_HandlerFlags & kXMPFiles_HandlerOwnsFile) );
- RegisterXMPFileHandler ( kXMP_WAVFile, kWAV_HandlerFlags, WAV_CheckFormat, WAV_MetaHandlerCTor );
+ // ------------------------------------------------------------------------------------------
+ // Register the file-oriented handlers that don't want to open and close the file themselves.
- XMP_Assert ( ! (kMP3_HandlerFlags & kXMPFiles_HandlerOwnsFile) );
- RegisterXMPFileHandler ( kXMP_MP3File, kMP3_HandlerFlags, MP3_CheckFormat, MP3_MetaHandlerCTor );
-
- #if XMP_WinBuild
-
- // Windows-only handlers.
+ RegisterNormalHandler ( kXMP_JPEGFile, kJPEG_HandlerFlags, JPEG_CheckFormat, JPEG_MetaHandlerCTor );
+ RegisterNormalHandler ( kXMP_TIFFFile, kTIFF_HandlerFlags, TIFF_CheckFormat, TIFF_MetaHandlerCTor );
+ RegisterNormalHandler ( kXMP_PhotoshopFile, kPSD_HandlerFlags, PSD_CheckFormat, PSD_MetaHandlerCTor );
+ RegisterNormalHandler ( kXMP_InDesignFile, kInDesign_HandlerFlags, InDesign_CheckFormat, InDesign_MetaHandlerCTor );
+ RegisterNormalHandler ( kXMP_PNGFile, kPNG_HandlerFlags, PNG_CheckFormat, PNG_MetaHandlerCTor );
+ // ! EPS and PostScript have the same handler, EPS is a proper subset of PostScript.
+ RegisterNormalHandler ( kXMP_EPSFile, kPostScript_HandlerFlags, PostScript_CheckFormat, PostScript_MetaHandlerCTor );
+ RegisterNormalHandler ( kXMP_PostScriptFile, kPostScript_HandlerFlags, PostScript_CheckFormat, PostScript_MetaHandlerCTor );
+ RegisterNormalHandler ( kXMP_WMAVFile, kASF_HandlerFlags, ASF_CheckFormat, ASF_MetaHandlerCTor );
+ RegisterNormalHandler ( kXMP_MP3File, kMP3_HandlerFlags, MP3_CheckFormat, MP3_MetaHandlerCTor );
+ RegisterNormalHandler ( kXMP_WAVFile, kWAV_HandlerFlags, WAV_CheckFormat, WAV_MetaHandlerCTor );
+ RegisterNormalHandler ( kXMP_AVIFile, kAVI_HandlerFlags, AVI_CheckFormat, AVI_MetaHandlerCTor );
+ RegisterNormalHandler ( kXMP_SWFFile, kSWF_HandlerFlags, SWF_CheckFormat, SWF_MetaHandlerCTor );
+ RegisterNormalHandler ( kXMP_UCFFile, kUCF_HandlerFlags, UCF_CheckFormat, UCF_MetaHandlerCTor );
+ RegisterNormalHandler ( kXMP_MPEG4File, kMPEG4_HandlerFlags, MPEG4_CheckFormat, MPEG4_MetaHandlerCTor );
+ RegisterNormalHandler ( kXMP_FLVFile, kFLV_HandlerFlags, FLV_CheckFormat, FLV_MetaHandlerCTor );
+
+ // ---------------------------------------------------------------------------------------
+ // Register the file-oriented handlers that do want to open and close the file themselves.
+
+ RegisterOwningHandler ( kXMP_MPEGFile, kMPEG2_HandlerFlags, MPEG2_CheckFormat, MPEG2_MetaHandlerCTor );
+ RegisterOwningHandler ( kXMP_MPEG2File, kMPEG2_HandlerFlags, MPEG2_CheckFormat, MPEG2_MetaHandlerCTor );
+
+ #if ! (XMP_64 || XMP_UNIXBuild)
+ RegisterOwningHandler ( kXMP_MOVFile, kMOV_HandlerFlags, MOV_CheckFormat, MOV_MetaHandlerCTor );
#endif
- // -----------------------------------------------------------------------------
- // Now register the handlers that do want to open and close the file themselves.
-
- XMP_Assert ( kMOV_HandlerFlags & kXMPFiles_HandlerOwnsFile );
- RegisterXMPFileHandler ( kXMP_MOVFile, kMOV_HandlerFlags, MOV_CheckFormat, MOV_MetaHandlerCTor );
-
- XMP_Assert ( kMPEG_HandlerFlags & kXMPFiles_HandlerOwnsFile );
- RegisterXMPFileHandler ( kXMP_MPEGFile, kMPEG_HandlerFlags, MPEG_CheckFormat, MPEG_MetaHandlerCTor );
+#endif // XMP_UNIXBuild, temporary exclusions
// Make sure the embedded info strings are referenced and kept.
if ( (kXMPFiles_EmbeddedVersion[0] == 0) || (kXMPFiles_EmbeddedCopyright[0] == 0) ) return false;
@@ -326,14 +834,19 @@ XMPFiles::Terminate()
--sXMPFilesInitCount;
if ( sXMPFilesInitCount != 0 ) return;
- if ( ! sIgnoreQuickTime ) QuickTime_Support::MainTerminate();
-
+ #if ! (XMP_64 || XMP_UNIXBuild)
+ QuickTime_Support::MainTerminate ( sIgnoreQuickTime );
+ #endif
+
#if GatherPerformanceData
ReportPerformanceData();
EliminateGlobal ( sAPIPerf );
#endif
- EliminateGlobal ( sRegisteredHandlers );
+ EliminateGlobal ( sFolderHandlers );
+ EliminateGlobal ( sNormalHandlers );
+ EliminateGlobal ( sOwningHandlers );
+
EliminateGlobal ( sXMPFilesExceptionMessage );
XMP_TermMutex ( sXMPFilesLock );
@@ -368,10 +881,13 @@ XMPFiles::~XMPFiles()
delete this->handler;
this->handler = 0;
}
+
if ( this->fileRef != 0 ) {
LFA_Close ( this->fileRef );
this->fileRef = 0;
}
+
+ if ( this->handlerTemp != 0 ) free ( this->handlerTemp ); // ! Must have been malloc-ed!
} // XMPFiles::~XMPFiles
@@ -417,12 +933,24 @@ XMPFiles::GetFormatInfo ( XMP_FileFormat format,
{
if ( flags == 0 ) flags = &voidOptionBits;
- XMPFileHandlerTablePos handlerPos = sRegisteredHandlers->begin();
- for ( ; handlerPos != sRegisteredHandlers->end(); ++handlerPos ) {
- if ( handlerPos->format == format ) {
- *flags = handlerPos->flags;
- return true;
- }
+ XMPFileHandlerTablePos handlerPos;
+
+ handlerPos = sFolderHandlers->find ( format );
+ if ( handlerPos != sFolderHandlers->end() ) {
+ *flags = handlerPos->second.flags;
+ return true;
+ }
+
+ handlerPos = sNormalHandlers->find ( format );
+ if ( handlerPos != sNormalHandlers->end() ) {
+ *flags = handlerPos->second.flags;
+ return true;
+ }
+
+ handlerPos = sOwningHandlers->find ( format );
+ if ( handlerPos != sOwningHandlers->end() ) {
+ *flags = handlerPos->second.flags;
+ return true;
}
return false;
@@ -431,145 +959,148 @@ XMPFiles::GetFormatInfo ( XMP_FileFormat format,
// =================================================================================================
+/* class static */
+XMP_FileFormat
+XMPFiles::CheckFileFormat ( XMP_StringPtr filePath )
+{
+ if ( (filePath == 0) || (*filePath == 0) ) return kXMP_UnknownFile;
+
+ XMPFiles bogus;
+ XMPFileHandlerInfo * handlerInfo = SelectSmartHandler ( &bogus, filePath, kXMP_UnknownFile, kXMPFiles_OpenForRead );
+ if ( handlerInfo == 0 ) return kXMP_UnknownFile;
+ return handlerInfo->format;
+
+} // XMPFiles::CheckFileFormat
+
+// =================================================================================================
+
+/* class static */
+XMP_FileFormat
+XMPFiles::CheckPackageFormat ( XMP_StringPtr folderPath )
+{
+ // This is called with a path to a folder, and checks to see if that folder is the top level of
+ // a "package" that should be recognized by one of the folder-oriented handlers. The checks here
+ // are not overly extensive, but hopefully enough to weed out false positives.
+ //
+ // Since we don't have many folder handlers, this is simple hardwired code.
+
+ FileMode folderMode = GetFileMode ( folderPath );
+ if ( folderMode != kFMode_IsFolder ) return kXMP_UnknownFile;
+
+ return CheckTopFolderName ( std::string ( folderPath ) );
+
+} // XMPFiles::CheckPackageFormat
+
+// =================================================================================================
+
bool
-XMPFiles::OpenFile ( XMP_StringPtr filePath,
+XMPFiles::OpenFile ( XMP_StringPtr clientPath,
XMP_FileFormat format /* = kXMP_UnknownFile */,
XMP_OptionBits openFlags /* = 0 */ )
{
- // *** Check consistency of the option bits, use of kXMPFiles_OpenUseSmartHandler.
-
+#if XMP_UNIXBuild
+ // *** For the time being only allow the JPEG smart handler for generic UNIX, not even packet scanning.
+ format = kXMP_JPEGFile;
+ openFlags |= (kXMPFiles_OpenUseSmartHandler | kXMPFiles_OpenStrictly);
+#endif
+
if ( this->handler != 0 ) XMP_Throw ( "File already open", kXMPErr_BadParam );
+ if ( this->fileRef != 0 ) { // ! Sanity check to prevent open file leaks.
+ LFA_Close ( this->fileRef );
+ this->fileRef = 0;
+ }
- // Select the file handler. Don't set the XMPFiles member variables until the end, leave them
- // clean in case something fails along the way. Use separate handler search loops, filtering on
- // whether the handler wants to open the file itself.
-
- // An initial handler is tried based on the format parameter, or the file extension if the
- // parameter is kXMP_UnknownFile. If that fails, all of the handlers are tried in registration
- // order. The CheckProc should do as little as possible to determine the format, based on the
- // actual file content. If that is not possible, use the format hint. The initial CheckProc call
- // has the presumed format in this->format, the later calls have kXMP_UnknownFile there.
-
- bool foundHandler = false;
- LFA_FileRef fileRef = 0;
+ this->format = kXMP_UnknownFile; // Make sure it is preset for later check.
+ this->openFlags = openFlags;
char openMode = 'r';
if ( openFlags & kXMPFiles_OpenForUpdate ) openMode = 'w';
- XMPFileHandlerTablePos handlerPos = sRegisteredHandlers->end();
-
- std::string fileExt;
- size_t extPos = strlen ( filePath );
- for ( --extPos; extPos > 0; --extPos ) if ( filePath[extPos] == '.' ) break;
- if ( filePath[extPos] == '.' ) {
- ++extPos;
- fileExt.assign ( &filePath[extPos] );
- for ( size_t i = 0; i < fileExt.size(); ++i ) {
- if ( ('A' <= fileExt[i]) && (fileExt[i] <= 'Z') ) fileExt[i] += 0x20;
- }
- }
+ FileMode clientMode = GetFileMode ( clientPath );
+ if ( (clientMode == kFMode_IsFolder) || (clientMode == kFMode_IsOther) ) return false;
+ XMP_Assert ( (clientMode == kFMode_IsFile) || (clientMode == kFMode_DoesNotExist) );
- this->format = kXMP_UnknownFile; // Make sure it is preset for later check.
- this->openFlags = openFlags; // ! The QuickTime support needs the InBackground bit.
+ std::string fileExt; // Used to check for camera raw files and OK to scan files.
- if ( ! (openFlags & kXMPFiles_OpenUsePacketScanning) ) {
+ if ( clientMode == kFMode_IsFile ) {
- // Try an initial handler based on the format or file extension.
- handlerPos = FindHandler ( format, fileExt );
- if ( handlerPos != sRegisteredHandlers->end() ) {
- if ( ! (handlerPos->flags & kXMPFiles_HandlerOwnsFile) ) fileRef = LFA_Open ( filePath, openMode );
- this->format = handlerPos->format; // ! Hack to tell the CheckProc this is the first call.
- foundHandler = handlerPos->checkProc ( handlerPos->format, filePath, fileRef, this );
+ // Find the file extension. OK to be "wrong" for something like "C:\My.dir\file". Any
+ // filtering looks for matches with real extensions, "dir\file" won't match any of these.
+ XMP_StringPtr extPos = clientPath + strlen ( clientPath );
+ for ( ; (extPos != clientPath) && (*extPos != '.'); --extPos ) {}
+ if ( *extPos == '.' ) {
+ fileExt.assign ( extPos+1 );
+ MakeLowerCase ( &fileExt );
}
- if ( (openFlags & kXMPFiles_OpenStrictly) && (format != kXMP_UnknownFile) && (! foundHandler) ) {
- return false;
- }
-
- // Search the handlers that don't want to open the file themselves. They must be registered first.
- if ( ! foundHandler ) {
- if ( fileRef == 0 ) fileRef = LFA_Open ( filePath, openMode );
- XMP_Assert ( fileRef != 0 ); // LFA_Open must either succeed or throw.
- for ( handlerPos = sRegisteredHandlers->begin(); handlerPos != sRegisteredHandlers->end(); ++handlerPos ) {
- if ( handlerPos->flags & kXMPFiles_HandlerOwnsFile ) break;
- this->format = kXMP_UnknownFile; // ! Hack to tell the CheckProc this is not the first call.
- foundHandler = handlerPos->checkProc ( handlerPos->format, filePath, fileRef, this );
- if ( foundHandler ) break; // ! Exit before incrementing handlerPos.
- }
- }
-
- // Search the handlers that do want to open the file themselves. They must be registered last.
- if ( ! foundHandler ) {
- LFA_Close ( fileRef );
- fileRef = 0;
- for ( ; handlerPos != sRegisteredHandlers->end(); ++handlerPos ) {
- XMP_Assert ( handlerPos->flags & kXMPFiles_HandlerOwnsFile );
- this->format = kXMP_UnknownFile; // ! Hack to tell the CheckProc this is not the first call.
- foundHandler = handlerPos->checkProc ( handlerPos->format, filePath, 0, this );
- if ( foundHandler ) break; // ! Exit before incrementing handlerPos.
- }
- }
-
- if ( (! foundHandler) && (openFlags & kXMPFiles_OpenUseSmartHandler) ) {
- return false;
+ // See if this file is one that XMPFiles should never process.
+ for ( size_t i = 0; kKnownRejectedFiles[i] != 0; ++i ) {
+ if ( fileExt == kKnownRejectedFiles[i] ) return false;
}
}
- // Create the handler object, fill in the XMPFiles member variables, cache the desired file data.
-
- XMPFileHandlerCTor handlerCTor = 0;
- XMP_OptionBits handlerFlags = 0;
-
- if ( foundHandler ) {
+ // Find the handler, fill in the XMPFiles member variables, cache the desired file data.
+
+ XMPFileHandlerInfo * handlerInfo = 0;
+ XMPFileHandlerCTor handlerCTor = 0;
+ XMP_OptionBits handlerFlags = 0;
- // Found a smart handler.
- format = handlerPos->format;
- handlerCTor = handlerPos->handlerCTor;
- handlerFlags = handlerPos->flags;
+ if ( ! (openFlags & kXMPFiles_OpenUsePacketScanning) ) {
+ handlerInfo = SelectSmartHandler ( this, clientPath, format, openFlags );
+ }
- } else {
+ if ( handlerInfo == 0 ) {
// No smart handler, packet scan if appropriate.
+
+ if ( clientMode != kFMode_IsFile ) return false;
+ if ( openFlags & kXMPFiles_OpenUseSmartHandler ) return false;
+
if ( openFlags & kXMPFiles_OpenLimitedScanning ) {
- size_t i;
- for ( i = 0; kKnownScannedFiles[i] != 0; ++i ) {
- if ( fileExt == kKnownScannedFiles[i] ) break;
+ bool scanningOK = false;
+ for ( size_t i = 0; kKnownScannedFiles[i] != 0; ++i ) {
+ if ( fileExt == kKnownScannedFiles[i] ) { scanningOK = true; break; }
}
- if ( kKnownScannedFiles[i] == 0 ) return false;
+ if ( ! scanningOK ) return false;
}
- format = kXMP_UnknownFile;
- handlerCTor = Scanner_MetaHandlerCTor;
- handlerFlags = kScanner_HandlerFlags;
- if ( fileRef == 0 ) fileRef = LFA_Open ( filePath, openMode );
+
+ handlerInfo = &kScannerHandlerInfo;
+ if ( fileRef == 0 ) fileRef = LFA_Open ( clientPath, openMode );
}
+
+ XMP_Assert ( handlerInfo != 0 );
+ format = handlerInfo->format;
+ handlerCTor = handlerInfo->handlerCTor;
+ handlerFlags = handlerInfo->flags;
- this->fileRef = fileRef;
- this->filePath = filePath;
+ this->filePath = clientPath;
- XMPFileHandler * handler = (*handlerCTor) ( this );
+ XMPFileHandler* handler = (*handlerCTor) ( this );
XMP_Assert ( handlerFlags == handler->handlerFlags );
this->handler = handler;
if ( this->format == kXMP_UnknownFile ) this->format = format; // ! The CheckProc might have set it.
- handler->CacheFileData();
+ try {
+ handler->CacheFileData();
+ } catch ( ... ) {
+ delete this->handler;
+ this->handler = 0;
+ if ( ! (handlerFlags & kXMPFiles_HandlerOwnsFile) ) {
+ LFA_Close ( this->fileRef );
+ this->fileRef = 0;
+ }
+ throw;
+ }
if ( ! (openFlags & kXMPFiles_OpenCacheTNail) ) {
handler->containsTNail = false; // Make sure GetThumbnail will cleanly return false.
handler->processedTNail = true;
}
- if ( handler->containsXMP ) {
- XMP_StringPtr packetStr = handler->xmpPacket.c_str();
- XMP_StringLen packetLen = handler->xmpPacket.size();
- if ( packetLen > 0 ) {
- handler->packetInfo.charForm = GetPacketCharForm ( packetStr, packetLen );
- handler->packetInfo.padSize = GetPacketPadSize ( packetStr, packetLen );
- handler->packetInfo.writeable = GetPacketRWMode ( packetStr, packetLen, XMP_GetCharSize ( handler->packetInfo.charForm ) );
- }
- }
+ if ( handler->containsXMP ) FillPacketInfo ( handler->xmpPacket, &handler->packetInfo );
if ( (! (openFlags & kXMPFiles_OpenForUpdate)) && (! (handlerFlags & kXMPFiles_HandlerOwnsFile)) ) {
// Close the disk file now if opened for read-only access.
@@ -621,7 +1152,7 @@ XMPFiles::CloseFile ( XMP_OptionBits closeFlags /* = 0 */ )
try {
- if ( (! doSafeUpdate) || (handlerFlags & kXMPFiles_HandlerOwnsFile) ) {
+ if ( (! doSafeUpdate) || (handlerFlags & kXMPFiles_HandlerOwnsFile) ) { // ! Includes no update case.
// Close the file without doing common crash-safe writing. The handler might do it.
@@ -651,6 +1182,7 @@ XMPFiles::CloseFile ( XMP_OptionBits closeFlags /* = 0 */ )
#endif
CreateTempFile ( origFilePath, &tempFilePath, kCopyMacRsrc );
+ XMP_Assert ( tempFileRef == 0 );
tempFileRef = LFA_Open ( tempFilePath.c_str(), 'w' );
this->fileRef = tempFileRef;
this->filePath = tempFilePath;
@@ -677,6 +1209,7 @@ XMPFiles::CloseFile ( XMP_OptionBits closeFlags /* = 0 */ )
#endif
CreateTempFile ( origFilePath, &copyFilePath, kCopyMacRsrc );
+ XMP_Assert ( copyFileRef == 0 );
copyFileRef = LFA_Open ( copyFilePath.c_str(), 'w' );
XMP_Int64 fileSize = LFA_Measure ( origFileRef );
LFA_Seek ( origFileRef, 0, SEEK_SET );
@@ -691,6 +1224,7 @@ XMPFiles::CloseFile ( XMP_OptionBits closeFlags /* = 0 */ )
LFA_Delete ( tempFilePath.c_str() ); // ! Slight risk of name being grabbed before rename.
LFA_Rename ( origFilePath.c_str(), tempFilePath.c_str() );
+ XMP_Assert ( tempFileRef == 0 );
tempFileRef = LFA_Open ( tempFilePath.c_str(), 'w' );
this->fileRef = tempFileRef;
@@ -774,6 +1308,7 @@ XMPFiles::GetFileInfo ( XMP_StringPtr * filePath /* = 0 */,
XMP_OptionBits * handlerFlags /* = 0 */ )
{
if ( this->handler == 0 ) return false;
+ XMPFileHandler * handler = this->handler;
if ( filePath == 0 ) filePath = &voidStringPtr;
if ( pathLen == 0 ) pathLen = &voidStringLen;
@@ -782,7 +1317,7 @@ XMPFiles::GetFileInfo ( XMP_StringPtr * filePath /* = 0 */,
if ( handlerFlags == 0 ) handlerFlags = &voidOptionBits;
*filePath = this->filePath.c_str();
- *pathLen = this->filePath.size();
+ *pathLen = (XMP_StringLen) this->filePath.size();
*openFlags = this->openFlags;
*format = this->format;
*handlerFlags = this->handler->handlerFlags;
@@ -800,11 +1335,36 @@ XMPFiles::SetAbortProc ( XMP_AbortProc abortProc,
this->abortProc = abortProc;
this->abortArg = abortArg;
- XMP_Assert ( (abortProc != (XMP_AbortProc)0) || (abortArg != (void*)0xDEADBEEF) ); // Hack to test the assert callback.
-
+ XMP_Assert ( (abortProc != (XMP_AbortProc)0) || (abortArg != (void*)(unsigned long long)0xDEADBEEFULL) ); // Hack to test the assert callback.
} // XMPFiles::SetAbortProc
// =================================================================================================
+// SetClientPacketInfo
+// ===================
+//
+// Set the packet info returned to the client. This is the internal packet info at first, which
+// tells what is in the file. But once the file needs update (PutXMP has been called), we return
+// info about the latest XMP. The internal packet info is left unchanged since it is needed when
+// the file is updated to locate the old packet in the file.
+
+static void
+SetClientPacketInfo ( XMP_PacketInfo * clientInfo, const XMP_PacketInfo & handlerInfo,
+ const std::string & xmpPacket, bool needsUpdate )
+{
+
+ if ( clientInfo == 0 ) return;
+
+ if ( ! needsUpdate ) {
+ *clientInfo = handlerInfo;
+ } else {
+ clientInfo->offset = kXMPFiles_UnknownOffset;
+ clientInfo->length = (XMP_Int32) xmpPacket.size();
+ FillPacketInfo ( xmpPacket, clientInfo );
+ }
+
+} // SetClientPacketInfo
+
+// =================================================================================================
bool
XMPFiles::GetXMP ( SXMPMeta * xmpObj /* = 0 */,
@@ -813,7 +1373,7 @@ XMPFiles::GetXMP ( SXMPMeta * xmpObj /* = 0 */,
XMP_PacketInfo * packetInfo /* = 0 */ )
{
if ( this->handler == 0 ) XMP_Throw ( "XMPFiles::GetXMP - No open file", kXMPErr_BadObject );
-
+
if ( ! this->handler->processedXMP ) {
try {
this->handler->ProcessXMP();
@@ -824,8 +1384,9 @@ XMPFiles::GetXMP ( SXMPMeta * xmpObj /* = 0 */,
SXMPUtils::AppendProperties ( this->handler->xmpObj, xmpObj, kXMPUtil_DoAllProperties );
}
if ( xmpPacket != 0 ) *xmpPacket = this->handler->xmpPacket.c_str();
- if ( xmpPacketLen != 0 ) *xmpPacketLen = this->handler->xmpPacket.size();
- if ( packetInfo != 0 ) *packetInfo = this->handler->packetInfo;
+ if ( xmpPacketLen != 0 ) *xmpPacketLen = (XMP_StringLen) this->handler->xmpPacket.size();
+ SetClientPacketInfo ( packetInfo, this->handler->packetInfo,
+ this->handler->xmpPacket, this->handler->needsUpdate );
throw;
}
}
@@ -842,8 +1403,9 @@ XMPFiles::GetXMP ( SXMPMeta * xmpObj /* = 0 */,
#endif
if ( xmpPacket != 0 ) *xmpPacket = this->handler->xmpPacket.c_str();
- if ( xmpPacketLen != 0 ) *xmpPacketLen = this->handler->xmpPacket.size();
- if ( packetInfo != 0 ) *packetInfo = this->handler->packetInfo;
+ if ( xmpPacketLen != 0 ) *xmpPacketLen = (XMP_StringLen) this->handler->xmpPacket.size();
+ SetClientPacketInfo ( packetInfo, this->handler->packetInfo,
+ this->handler->xmpPacket, this->handler->needsUpdate );
return true;
@@ -907,7 +1469,7 @@ DoPutXMP ( XMPFiles * thiz, const SXMPMeta & xmpObj, const bool doIt )
XMP_Uns8 charForm = handler->stdCharForm;
if ( charForm == kXMP_CharUnknown ) charForm = packetInfo.charForm;
- XMP_OptionBits options = kXMP_UseCompactFormat | XMP_CharToSerializeForm ( charForm );
+ XMP_OptionBits options = handler->GetSerializeOptions() | XMP_CharToSerializeForm ( charForm );
if ( handlerFlags & kXMPFiles_NeedsReadOnlyPacket ) options |= kXMP_ReadOnlyPacket;
if ( fileHasPacket && (thiz->format == kXMP_UnknownFile) && (! packetInfo.writeable) ) options |= kXMP_ReadOnlyPacket;
@@ -917,9 +1479,8 @@ DoPutXMP ( XMPFiles * thiz, const SXMPMeta & xmpObj, const bool doIt )
if ( handlerFlags & kXMPFiles_UsesSidecarXMP ) tryInPlace = false;
if ( tryInPlace ) {
- XMP_Assert ( handler->containsXMP && (oldPacketLength == xmpPacket.size()) );
try {
- xmpObj.SerializeToBuffer ( &xmpPacket, (options | kXMP_ExactPacketLength), oldPacketLength );
+ xmpObj.SerializeToBuffer ( &xmpPacket, (options | kXMP_ExactPacketLength), (XMP_StringLen) oldPacketLength );
XMP_Assert ( xmpPacket.size() == oldPacketLength );
} catch ( ... ) {
if ( preferInPlace ) {
@@ -939,12 +1500,8 @@ DoPutXMP ( XMPFiles * thiz, const SXMPMeta & xmpObj, const bool doIt )
throw;
}
}
-
+
if ( doIt ) {
- if ( ! tryInPlace ) packetInfo.offset = kXMPFiles_UnknownOffset;
- packetInfo.length = xmpPacket.size();
- packetInfo.padSize = GetPacketPadSize ( xmpPacket.c_str(), xmpPacket.size() );
- packetInfo.charForm = charForm;
handler->xmpObj = xmpObj.Clone();
handler->containsXMP = true;
handler->processedXMP = true;
@@ -981,6 +1538,7 @@ bool
XMPFiles::CanPutXMP ( const SXMPMeta & xmpObj )
{
if ( this->handler == 0 ) XMP_Throw ( "XMPFiles::CanPutXMP - No open file", kXMPErr_BadObject );
+
if ( ! (this->openFlags & kXMPFiles_OpenForUpdate) ) return false;
if ( this->handler->handlerFlags & kXMPFiles_CanInjectXMP ) return true;
diff --git a/source/XMPFiles/XMPFiles.hpp b/source/XMPFiles/XMPFiles.hpp
index 36c55f1..b76de70 100644
--- a/source/XMPFiles/XMPFiles.hpp
+++ b/source/XMPFiles/XMPFiles.hpp
@@ -173,6 +173,9 @@ public:
static bool GetFormatInfo ( XMP_FileFormat format,
XMP_OptionBits * flags = 0 );
+ static XMP_FileFormat CheckFileFormat ( XMP_StringPtr filePath );
+ static XMP_FileFormat CheckPackageFormat ( XMP_StringPtr folderPath );
+
bool OpenFile ( XMP_StringPtr filePath,
XMP_FileFormat format = kXMP_UnknownFile,
XMP_OptionBits openFlags = 0 );
diff --git a/source/XMPFiles/XMPFiles_Impl.cpp b/source/XMPFiles/XMPFiles_Impl.cpp
index 892c280..c07a82f 100644
--- a/source/XMPFiles/XMPFiles_Impl.cpp
+++ b/source/XMPFiles/XMPFiles_Impl.cpp
@@ -9,15 +9,7 @@
#include "XMPFiles_Impl.hpp"
-#if XMP_MacBuild
- #include <Files.h>
-#elif XMP_WinBuild
- #include <Windows.h>
-#elif XMP_UNIXBuild
- #include <fcntl.h>
- #include <sys/stat.h>
- #include <unistd.h>
-#endif
+#include "UnicodeConversions.hpp"
using namespace std;
@@ -54,15 +46,36 @@ using namespace std;
XMP_FileFormat voidFileFormat = 0; // Used as sink for unwanted output parameters.
XMP_Mutex sXMPFilesLock;
int sXMPFilesLockCount = 0;
-XMP_VarString * sXMPFilesExceptionMessage = 0;
+std::string * sXMPFilesExceptionMessage = 0;
#if TraceXMPCalls
FILE * xmpFilesOut = stderr;
#endif
+//only define in one non-public-source, non-header(.cpp) place
+void LFA_Throw ( const char* msg, int id )
+{
+ switch(id)
+ {
+ case kLFAErr_InternalFailure:
+ XMP_Throw(msg,kXMPErr_InternalFailure);
+ break;
+ case kLFAErr_ExternalFailure:
+ XMP_Throw(msg,kXMPErr_ExternalFailure);
+ break;
+ case kLFAErr_UserAbort:
+ XMP_Throw(msg,kXMPErr_UserAbort);
+ break;
+ default:
+ XMP_Throw(msg,kXMPErr_UnknownException);
+ break;
+ }
+}
+
// =================================================================================================
-const FileExtMapping kFileExtMap[] = // Add all known mappings, multiple mappings (tif, tiff) are OK.
+// Add all known mappings, multiple mappings (tif, tiff) are OK.
+const FileExtMapping kFileExtMap[] =
{ { "pdf", kXMP_PDFFile },
{ "ps", kXMP_PostScriptFile },
{ "eps", kXMP_EPSFile },
@@ -88,6 +101,9 @@ const FileExtMapping kFileExtMap[] = // Add all known mappings, multiple mapping
{ "wav", kXMP_WAVFile },
{ "mp3", kXMP_MP3File },
{ "mp4", kXMP_MPEG4File },
+ { "m4v", kXMP_MPEG4File },
+ { "m4a", kXMP_MPEG4File },
+ { "f4v", kXMP_MPEG4File },
{ "ses", kXMP_SESFile },
{ "cel", kXMP_CELFile },
{ "wma", kXMP_WMAVFile },
@@ -118,21 +134,29 @@ const FileExtMapping kFileExtMap[] = // Add all known mappings, multiple mapping
{ "indd", kXMP_InDesignFile },
{ "indt", kXMP_InDesignFile },
{ "aep", kXMP_AEProjectFile },
+ { "aepx", kXMP_AEProjectFile },
{ "aet", kXMP_AEProjTemplateFile },
{ "ffx", kXMP_AEFilterPresetFile },
{ "ncor", kXMP_EncoreProjectFile },
{ "prproj", kXMP_PremiereProjectFile },
{ "prtl", kXMP_PremiereTitleFile },
-
+ { "ucf", kXMP_UCFFile },
+ { "xfl", kXMP_UCFFile },
+ { "pdfxml", kXMP_UCFFile },
+ { "mars", kXMP_UCFFile },
+ { "idml", kXMP_UCFFile },
{ "", 0 } }; // ! Must be last as a sentinel.
-const char * kKnownScannedFiles[] = // Files known to contain XMP but have no smart handling, here or elsewhere.
+// Files known to contain XMP but have no smart handling, here or elsewhere.
+const char * kKnownScannedFiles[] =
{ "gif", // GIF, public format but no smart handler.
"ai", // Illustrator, actually a PDF file.
"ait", // Illustrator template, actually a PDF file.
"svg", // SVG, an XML file.
"aet", // After Effects template project file.
"ffx", // After Effects filter preset file.
+ "aep", // After Effects project file in proprietary format
+ "aepx", // After Effects project file in XML format
"inx", // InDesign interchange, an XML file.
"inds", // InDesign snippet, an XML file.
"inpk", // InDesign package for GoLive, a text file (not XML).
@@ -141,682 +165,39 @@ const char * kKnownScannedFiles[] = // Files known to contain XMP but have no sm
"incx", // InCopy interchange, an XML file.
"fm", // FrameMaker file, proprietary format.
"book", // FrameMaker book, proprietary format.
+ "icml", // an inCopy (inDesign) format
+ "icmt", // an inCopy (inDesign) format
+ "idms", // an inCopy (inDesign) format
0 }; // ! Keep a 0 sentinel at the end.
-// =================================================================================================
-
-// =================================================================================================
-
-// =================================================================================================
-// LFA implementations for Macintosh
-// =================================
-
-#if XMP_MacBuild
-
- // ---------------------------------------------------------------------------------------------
-
- // ! Can't use Apple's 64 bit POSIX functions because frigging MSL has type clashes.
-
- LFA_FileRef LFA_Open ( const char * fileName, char mode )
- {
- XMP_Assert ( (mode == 'r') || (mode == 'w') );
-
- FSRef fileRef;
- SInt8 perm = ( (mode == 'r') ? fsRdPerm : fsRdWrPerm );
- HFSUniStr255 dataForkName;
- SInt16 refNum;
-
- OSErr err = FSGetDataForkName ( &dataForkName );
- if ( err != noErr ) XMP_Throw ( "LFA_Open: FSGetDataForkName failure", kXMPErr_ExternalFailure );
-
- err = FSPathMakeRef ( (XMP_Uns8*)fileName, &fileRef, 0 );
- if ( err != noErr ) XMP_Throw ( "LFA_Open: FSPathMakeRef failure", kXMPErr_ExternalFailure );
-
- err = FSOpenFork ( &fileRef, dataForkName.length, dataForkName.unicode, perm, &refNum );
- if ( err != noErr ) XMP_Throw ( "LFA_Open: FSOpenFork failure", kXMPErr_ExternalFailure );
-
- return (LFA_FileRef)refNum;
-
- } // LFA_Open
-
- // ---------------------------------------------------------------------------------------------
-
- LFA_FileRef LFA_Create ( const char * fileName )
- {
- // *** Hack: Use fopen to avoid parent/child name separation needed by FSCreateFileUnicode.
-
- FILE * temp;
- temp = fopen ( fileName, "r" ); // Make sure the file does not exist.
- if ( temp != 0 ) {
- fclose ( temp );
- XMP_Throw ( "LFA_Create: file already exists", kXMPErr_ExternalFailure );
- }
-
- temp = fopen ( fileName, "w" );
- if ( temp == 0 ) XMP_Throw ( "LFA_Create: fopen failure", kXMPErr_ExternalFailure );
- fclose ( temp );
-
- return LFA_Open ( fileName, 'w' );
-
- } // LFA_Create
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Delete ( const char * fileName )
- {
- int err = remove ( fileName ); // *** Better to use an FS function.
- if ( err != 0 ) XMP_Throw ( "LFA_Delete: remove failure", kXMPErr_ExternalFailure );
-
- } // LFA_Delete
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Rename ( const char * oldName, const char * newName )
- {
- int err = rename ( oldName, newName ); // *** Better to use an FS function.
- if ( err != 0 ) XMP_Throw ( "LFA_Rename: rename failure", kXMPErr_ExternalFailure );
-
- } // LFA_Rename
-
- // ---------------------------------------------------------------------------------------------
-
- LFA_FileRef LFA_OpenRsrc ( const char * fileName, char mode )
- {
- XMP_Assert ( (mode == 'r') || (mode == 'w') );
-
- FSRef fileRef;
- SInt8 perm = ( (mode == 'r') ? fsRdPerm : fsRdWrPerm );
- HFSUniStr255 rsrcForkName;
- SInt16 refNum;
-
- OSErr err = FSGetResourceForkName ( &rsrcForkName );
- if ( err != noErr ) XMP_Throw ( "LFA_Open: FSGetResourceForkName failure", kXMPErr_ExternalFailure );
-
- err = FSPathMakeRef ( (XMP_Uns8*)fileName, &fileRef, 0 );
- if ( err != noErr ) XMP_Throw ( "LFA_Open: FSPathMakeRef failure", kXMPErr_ExternalFailure );
-
- err = FSOpenFork ( &fileRef, rsrcForkName.length, rsrcForkName.unicode, perm, &refNum );
- if ( err != noErr ) XMP_Throw ( "LFA_Open: FSOpenFork failure", kXMPErr_ExternalFailure );
-
- return (LFA_FileRef)refNum;
-
- } // LFA_OpenRsrc
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Close ( LFA_FileRef file )
- {
- if ( file == 0 ) return; // Can happen if LFA_Open throws an exception.
- long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
-
- OSErr err = FSCloseFork ( refNum );
- if ( err != noErr ) XMP_Throw ( "LFA_Close: FSCloseFork failure", kXMPErr_ExternalFailure );
-
- } // LFA_Close
-
- // ---------------------------------------------------------------------------------------------
-
- XMP_Int64 LFA_Seek ( LFA_FileRef file, XMP_Int64 offset, int mode, bool * okPtr )
- {
- long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
-
- UInt16 posMode;
- switch ( mode ) {
- case SEEK_SET :
- posMode = fsFromStart;
- break;
- case SEEK_CUR :
- posMode = fsFromMark;
- break;
- case SEEK_END :
- posMode = fsFromLEOF;
- break;
- default :
- XMP_Throw ( "Invalid seek mode", kXMPErr_InternalFailure );
- break;
- }
-
- OSErr err;
- XMP_Int64 newPos;
-
- err = FSSetForkPosition ( refNum, posMode, offset );
-
- if ( err == eofErr ) {
- // FSSetForkPosition does not implicitly grow the file. Grow then seek to the new EOF.
- err = FSSetForkSize ( refNum, posMode, offset );
- if ( err == noErr ) err = FSSetForkPosition ( refNum, fsFromLEOF, 0 );
- }
-
- if ( err == noErr ) err = FSGetForkPosition ( refNum, &newPos );
-
- if ( okPtr != 0 ) {
- *okPtr = (err == noErr);
- } else {
- if ( err != noErr ) XMP_Throw ( "LFA_Seek: FSSetForkPosition failure", kXMPErr_ExternalFailure );
- }
-
- return newPos;
-
- } // LFA_Seek
-
- // ---------------------------------------------------------------------------------------------
-
- XMP_Int32 LFA_Read ( LFA_FileRef file, void * buffer, XMP_Int32 bytes, bool requireAll )
- {
- long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
- ByteCount bytesRead;
-
- OSErr err = FSReadFork ( refNum, fsAtMark, 0, bytes, buffer, &bytesRead );
- if ( ((err != noErr) && (err != eofErr)) || (requireAll && (bytesRead != (ByteCount)bytes)) ) {
- // ! FSReadFork returns eofErr for a normal encounter with the end of file.
- XMP_Throw ( "LFA_Read: FSReadFork failure", kXMPErr_ExternalFailure );
- }
-
- return bytesRead;
-
- } // LFA_Read
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Write ( LFA_FileRef file, const void * buffer, XMP_Int32 bytes )
- {
- long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
- ByteCount bytesWritten;
-
- OSErr err = FSWriteFork ( refNum, fsAtMark, 0, bytes, buffer, &bytesWritten );
- if ( (err != noErr) | (bytesWritten != (ByteCount)bytes) ) XMP_Throw ( "LFA_Write: FSWriteFork failure", kXMPErr_ExternalFailure );
-
- } // LFA_Write
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Flush ( LFA_FileRef file )
- {
- long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
-
- OSErr err = FSFlushFork ( refNum );
- if ( err != noErr ) XMP_Throw ( "LFA_Flush: FSFlushFork failure", kXMPErr_ExternalFailure );
-
- } // LFA_Flush
-
- // ---------------------------------------------------------------------------------------------
-
- XMP_Int64 LFA_Measure ( LFA_FileRef file )
- {
- long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
- XMP_Int64 length;
-
- OSErr err = FSGetForkSize ( refNum, &length );
- if ( err != noErr ) XMP_Throw ( "LFA_Measure: FSSetForkSize failure", kXMPErr_ExternalFailure );
-
- return length;
-
- } // LFA_Measure
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Extend ( LFA_FileRef file, XMP_Int64 length )
- {
- long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
-
- OSErr err = FSSetForkSize ( refNum, fsFromStart, length );
- if ( err != noErr ) XMP_Throw ( "LFA_Extend: FSSetForkSize failure", kXMPErr_ExternalFailure );
-
- } // LFA_Extend
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Truncate ( LFA_FileRef file, XMP_Int64 length )
- {
- long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
-
- OSErr err = FSSetForkSize ( refNum, fsFromStart, length );
- if ( err != noErr ) XMP_Throw ( "LFA_Truncate: FSSetForkSize failure", kXMPErr_ExternalFailure );
-
- } // LFA_Truncate
-
- // ---------------------------------------------------------------------------------------------
-#endif // XMP_MacBuild
+// Extensions that XMPFiles never handles.
+const char * kKnownRejectedFiles[] =
+ {
+ // RAW files
+ "cr2", "erf", "fff", "dcr", "kdc", "mos", "mfw", "mef",
+ "raw", "nef", "orf", "pef", "arw", "sr2", "srf", "sti",
+ "3fr",
+ // not supported UCF subformats
+ "air",
+ 0 }; // ! Keep a 0 sentinel at the end.
// =================================================================================================
-// LFA implementations for Windows
-// ===============================
-
-#if XMP_WinBuild
-
- // ---------------------------------------------------------------------------------------------
-
- LFA_FileRef LFA_Open ( const char * fileName, char mode )
- {
- XMP_Assert ( (mode == 'r') || (mode == 'w') );
-
- DWORD access = GENERIC_READ; // Assume read mode.
- DWORD share = FILE_SHARE_READ;
-
- if ( mode == 'w' ) {
- access |= GENERIC_WRITE;
- share = 0;
- }
-
- std::string wideName;
- const size_t utf8Len = strlen(fileName);
- const size_t maxLen = 2 * (utf8Len+1);
-
- wideName.reserve ( maxLen );
- wideName.assign ( maxLen, ' ' );
- int wideLen = MultiByteToWideChar ( CP_UTF8, 0, fileName, -1, (LPWSTR)wideName.data(), maxLen );
- if ( wideLen == 0 ) XMP_Throw ( "LFA_Open: MultiByteToWideChar failure", kXMPErr_ExternalFailure );
-
- HANDLE fileHandle = CreateFileW ( (LPCWSTR)wideName.data(), access, share, 0, OPEN_EXISTING,
- (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS), 0 );
- if ( fileHandle == INVALID_HANDLE_VALUE ) XMP_Throw ( "LFA_Open: CreateFileW failure", kXMPErr_ExternalFailure );
-
- return (LFA_FileRef)fileHandle;
-
- } // LFA_Open
-
- // ---------------------------------------------------------------------------------------------
-
- LFA_FileRef LFA_Create ( const char * fileName )
- {
- std::string wideName;
- const size_t utf8Len = strlen(fileName);
- const size_t maxLen = 2 * (utf8Len+1);
-
- wideName.reserve ( maxLen );
- wideName.assign ( maxLen, ' ' );
- int wideLen = MultiByteToWideChar ( CP_UTF8, 0, fileName, -1, (LPWSTR)wideName.data(), maxLen );
- if ( wideLen == 0 ) XMP_Throw ( "LFA_Create: MultiByteToWideChar failure", kXMPErr_ExternalFailure );
-
- HANDLE fileHandle;
-
- fileHandle = CreateFileW ( (LPCWSTR)wideName.data(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING,
- (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS), 0 );
- if ( fileHandle != INVALID_HANDLE_VALUE ) {
- CloseHandle ( fileHandle );
- XMP_Throw ( "LFA_Create: file already exists", kXMPErr_ExternalFailure );
- }
-
- fileHandle = CreateFileW ( (LPCWSTR)wideName.data(), (GENERIC_READ | GENERIC_WRITE), 0, 0, CREATE_ALWAYS,
- (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS), 0 );
- if ( fileHandle == INVALID_HANDLE_VALUE ) XMP_Throw ( "LFA_Create: CreateFileW failure", kXMPErr_ExternalFailure );
-
- return (LFA_FileRef)fileHandle;
-
- } // LFA_Create
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Delete ( const char * fileName )
- {
- std::string wideName;
- const size_t utf8Len = strlen(fileName);
- const size_t maxLen = 2 * (utf8Len+1);
-
- wideName.reserve ( maxLen );
- wideName.assign ( maxLen, ' ' );
- int wideLen = MultiByteToWideChar ( CP_UTF8, 0, fileName, -1, (LPWSTR)wideName.data(), maxLen );
- if ( wideLen == 0 ) XMP_Throw ( "LFA_Delete: MultiByteToWideChar failure", kXMPErr_ExternalFailure );
-
- BOOL ok = DeleteFileW ( (LPCWSTR)wideName.data() );
- if ( ! ok ) XMP_Throw ( "LFA_Delete: DeleteFileW failure", kXMPErr_ExternalFailure );
-
- } // LFA_Delete
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Rename ( const char * oldName, const char * newName )
- {
- std::string wideOldName, wideNewName;
- size_t utf8Len = strlen(oldName);
- if ( utf8Len < strlen(newName) ) utf8Len = strlen(newName);
- const size_t maxLen = 2 * (utf8Len+1);
- int wideLen;
-
- wideOldName.reserve ( maxLen );
- wideOldName.assign ( maxLen, ' ' );
- wideLen = MultiByteToWideChar ( CP_UTF8, 0, oldName, -1, (LPWSTR)wideOldName.data(), maxLen );
- if ( wideLen == 0 ) XMP_Throw ( "LFA_Rename: MultiByteToWideChar failure", kXMPErr_ExternalFailure );
-
- wideNewName.reserve ( maxLen );
- wideNewName.assign ( maxLen, ' ' );
- wideLen = MultiByteToWideChar ( CP_UTF8, 0, newName, -1, (LPWSTR)wideNewName.data(), maxLen );
- if ( wideLen == 0 ) XMP_Throw ( "LFA_Rename: MultiByteToWideChar failure", kXMPErr_ExternalFailure );
-
- BOOL ok = MoveFileW ( (LPCWSTR)wideOldName.data(), (LPCWSTR)wideNewName.data() );
- if ( ! ok ) XMP_Throw ( "LFA_Rename: MoveFileW failure", kXMPErr_ExternalFailure );
-
- } // LFA_Rename
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Close ( LFA_FileRef file )
- {
- if ( file == 0 ) return; // Can happen if LFA_Open throws an exception.
- HANDLE fileHandle = (HANDLE)file;
-
- BOOL ok = CloseHandle ( fileHandle );
- if ( ! ok ) XMP_Throw ( "LFA_Close: CloseHandle failure", kXMPErr_ExternalFailure );
-
- } // LFA_Close
-
- // ---------------------------------------------------------------------------------------------
-
- XMP_Int64 LFA_Seek ( LFA_FileRef file, XMP_Int64 offset, int mode, bool * okPtr )
- {
- HANDLE fileHandle = (HANDLE)file;
-
- DWORD method;
- switch ( mode ) {
- case SEEK_SET :
- method = FILE_BEGIN;
- break;
- case SEEK_CUR :
- method = FILE_CURRENT;
- break;
- case SEEK_END :
- method = FILE_END;
- break;
- default :
- XMP_Throw ( "Invalid seek mode", kXMPErr_InternalFailure );
- break;
- }
-
- LARGE_INTEGER seekOffset, newPos;
- seekOffset.QuadPart = offset;
-
- BOOL ok = SetFilePointerEx ( fileHandle, seekOffset, &newPos, method );
- if ( okPtr != 0 ) {
- *okPtr = ok;
- } else {
- if ( ! ok ) XMP_Throw ( "LFA_Seek: SetFilePointerEx failure", kXMPErr_ExternalFailure );
- }
-
- return newPos.QuadPart;
-
- } // LFA_Seek
-
- // ---------------------------------------------------------------------------------------------
-
- XMP_Int32 LFA_Read ( LFA_FileRef file, void * buffer, XMP_Int32 bytes, bool requireAll )
- {
- HANDLE fileHandle = (HANDLE)file;
- DWORD bytesRead;
-
- BOOL ok = ReadFile ( fileHandle, buffer, bytes, &bytesRead, 0 );
- if ( (! ok) || (requireAll && (bytesRead != bytes)) ) XMP_Throw ( "LFA_Read: ReadFile failure", kXMPErr_ExternalFailure );
-
- return bytesRead;
-
- } // LFA_Read
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Write ( LFA_FileRef file, const void * buffer, XMP_Int32 bytes )
- {
- HANDLE fileHandle = (HANDLE)file;
- DWORD bytesWritten;
-
- BOOL ok = WriteFile ( fileHandle, buffer, bytes, &bytesWritten, 0 );
- if ( (! ok) || (bytesWritten != bytes) ) XMP_Throw ( "LFA_Write: WriteFile failure", kXMPErr_ExternalFailure );
-
- } // LFA_Write
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Flush ( LFA_FileRef file )
- {
- HANDLE fileHandle = (HANDLE)file;
-
- BOOL ok = FlushFileBuffers ( fileHandle );
- if ( ! ok ) XMP_Throw ( "LFA_Flush: FlushFileBuffers failure", kXMPErr_ExternalFailure );
-
- } // LFA_Flush
-
- // ---------------------------------------------------------------------------------------------
-
- XMP_Int64 LFA_Measure ( LFA_FileRef file )
- {
- HANDLE fileHandle = (HANDLE)file;
- LARGE_INTEGER length;
-
- BOOL ok = GetFileSizeEx ( fileHandle, &length );
- if ( ! ok ) XMP_Throw ( "LFA_Measure: GetFileSizeEx failure", kXMPErr_ExternalFailure );
-
- return length.QuadPart;
-
- } // LFA_Measure
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Extend ( LFA_FileRef file, XMP_Int64 length )
- {
- HANDLE fileHandle = (HANDLE)file;
-
- LARGE_INTEGER winLength;
- winLength.QuadPart = length;
-
- BOOL ok = SetFilePointerEx ( fileHandle, winLength, 0, FILE_BEGIN );
- if ( ! ok ) XMP_Throw ( "LFA_Extend: SetFilePointerEx failure", kXMPErr_ExternalFailure );
- ok = SetEndOfFile ( fileHandle );
- if ( ! ok ) XMP_Throw ( "LFA_Extend: SetEndOfFile failure", kXMPErr_ExternalFailure );
-
- } // LFA_Extend
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Truncate ( LFA_FileRef file, XMP_Int64 length )
- {
- HANDLE fileHandle = (HANDLE)file;
-
- LARGE_INTEGER winLength;
- winLength.QuadPart = length;
-
- BOOL ok = SetFilePointerEx ( fileHandle, winLength, 0, FILE_BEGIN );
- if ( ! ok ) XMP_Throw ( "LFA_Truncate: SetFilePointerEx failure", kXMPErr_ExternalFailure );
- ok = SetEndOfFile ( fileHandle );
- if ( ! ok ) XMP_Throw ( "LFA_Truncate: SetEndOfFile failure", kXMPErr_ExternalFailure );
-
- } // LFA_Truncate
-
- // ---------------------------------------------------------------------------------------------
-
-#endif // XMP_WinBuild
// =================================================================================================
-// LFA implementations for POSIX
-// =============================
-
-#if XMP_UNIXBuild
-
- // ---------------------------------------------------------------------------------------------
-
- // Make sure off_t is 64 bits and signed.
- static char check_off_t_size [ (sizeof(off_t) == 8) ? 1 : -1 ];
- // *** No std::numeric_limits? static char check_off_t_sign [ std::numeric_limits<off_t>::is_signed ? -1 : 1 ];
-
- // ---------------------------------------------------------------------------------------------
-
- LFA_FileRef LFA_Open ( const char * fileName, char mode )
- {
- XMP_Assert ( (mode == 'r') || (mode == 'w') );
-
- int flags = ((mode == 'r') ? O_RDONLY : O_RDWR); // *** Include O_EXLOCK?
-
- int descr = open ( fileName, flags, 0 );
- if ( descr == -1 ) XMP_Throw ( "LFA_Open: open failure", kXMPErr_ExternalFailure );
-
- return (LFA_FileRef)descr;
-
- } // LFA_Open
-
- // ---------------------------------------------------------------------------------------------
-
- LFA_FileRef LFA_Create ( const char * fileName )
- {
- int descr;
-
- descr = open ( fileName, O_RDONLY, 0 ); // Make sure the file does not exist yet.
- if ( descr != -1 ) {
- close ( descr );
- XMP_Throw ( "LFA_Create: file already exists", kXMPErr_ExternalFailure );
- }
-
- descr = open ( fileName, (O_CREAT | O_RDWR), 0 ); // *** Include O_EXCL? O_EXLOCK?
- if ( descr == -1 ) XMP_Throw ( "LFA_Create: open failure", kXMPErr_ExternalFailure );
-
- return (LFA_FileRef)descr;
-
- } // LFA_Create
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Delete ( const char * fileName )
- {
- int err = unlink ( fileName );
- if ( err != 0 ) XMP_Throw ( "LFA_Delete: unlink failure", kXMPErr_ExternalFailure );
-
- } // LFA_Delete
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Rename ( const char * oldName, const char * newName )
- {
- int err = rename ( oldName, newName ); // *** POSIX rename clobbers existing destination!
- if ( err != 0 ) XMP_Throw ( "LFA_Rename: rename failure", kXMPErr_ExternalFailure );
-
- } // LFA_Rename
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Close ( LFA_FileRef file )
- {
- if ( file == 0 ) return; // Can happen if LFA_Open throws an exception.
- int descr = (int)file;
-
- int err = close ( descr );
- if ( err != 0 ) XMP_Throw ( "LFA_Close: close failure", kXMPErr_ExternalFailure );
-
- } // LFA_Close
-
- // ---------------------------------------------------------------------------------------------
-
- XMP_Int64 LFA_Seek ( LFA_FileRef file, XMP_Int64 offset, int mode, bool * okPtr )
- {
- int descr = (int)file;
-
- off_t newPos = lseek ( descr, offset, mode );
- if ( okPtr != 0 ) {
- *okPtr = (newPos != -1);
- } else {
- if ( newPos == -1 ) XMP_Throw ( "LFA_Seek: lseek failure", kXMPErr_ExternalFailure );
- }
-
- return newPos;
-
- } // LFA_Seek
-
- // ---------------------------------------------------------------------------------------------
-
- XMP_Int32 LFA_Read ( LFA_FileRef file, void * buffer, XMP_Int32 bytes, bool requireAll )
- {
- int descr = (int)file;
-
- ssize_t bytesRead = read ( descr, buffer, bytes );
- if ( (bytesRead == -1) || (requireAll && (bytesRead != bytes)) ) XMP_Throw ( "LFA_Read: read failure", kXMPErr_ExternalFailure );
-
- return bytesRead;
-
- } // LFA_Read
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Write ( LFA_FileRef file, const void * buffer, XMP_Int32 bytes )
- {
- int descr = (int)file;
-
- ssize_t bytesWritten = write ( descr, buffer, bytes );
- if ( bytesWritten != bytes ) XMP_Throw ( "LFA_Write: write failure", kXMPErr_ExternalFailure );
-
- } // LFA_Write
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Flush ( LFA_FileRef file )
- {
- int descr = (int)file;
-
- int err = fsync ( descr );
- if ( err != 0 ) XMP_Throw ( "LFA_Flush: fsync failure", kXMPErr_ExternalFailure );
-
- } // LFA_Flush
-
- // ---------------------------------------------------------------------------------------------
-
- XMP_Int64 LFA_Measure ( LFA_FileRef file )
- {
- int descr = (int)file;
-
- off_t currPos = lseek ( descr, 0, SEEK_CUR );
- off_t length = lseek ( descr, 0, SEEK_END );
- if ( (currPos == -1) || (length == -1) ) XMP_Throw ( "LFA_Measure: lseek failure", kXMPErr_ExternalFailure );
- (void) lseek ( descr, currPos, SEEK_SET );
-
- return length;
-
- } // LFA_Measure
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Extend ( LFA_FileRef file, XMP_Int64 length )
- {
- int descr = (int)file;
-
- int err = ftruncate ( descr, length );
- if ( err != 0 ) XMP_Throw ( "LFA_Extend: ftruncate failure", kXMPErr_ExternalFailure );
-
- } // LFA_Extend
-
- // ---------------------------------------------------------------------------------------------
-
- void LFA_Truncate ( LFA_FileRef file, XMP_Int64 length )
- {
- int descr = (int)file;
-
- int err = ftruncate ( descr, length );
- if ( err != 0 ) XMP_Throw ( "LFA_Truncate: ftruncate failure", kXMPErr_ExternalFailure );
-
- } // LFA_Truncate
-
- // ---------------------------------------------------------------------------------------------
-
-#endif // XMP_UNIXBuild
// =================================================================================================
-void LFA_Copy ( LFA_FileRef sourceFile, LFA_FileRef destFile, XMP_Int64 length,
- XMP_AbortProc abortProc /* = 0 */, void * abortArg /* = 0 */ )
-{
- enum { kBufferLen = 64*1024 };
- XMP_Uns8 buffer [kBufferLen];
-
- const bool checkAbort = (abortProc != 0);
-
- while ( length > 0 ) {
- if ( checkAbort && abortProc(abortArg) ) {
- XMP_Throw ( "LFA_Copy - User abort", kXMPErr_UserAbort );
- }
- XMP_Int32 ioCount = kBufferLen;
- if ( length < kBufferLen ) ioCount = (XMP_Int32)length;
- LFA_Read ( sourceFile, buffer, ioCount, kLFA_RequireAll );
- LFA_Write ( destFile, buffer, ioCount );
- length -= ioCount;
+#if XMP_MacBuild | XMP_UNIXBuild
+ //copy from LargeFileAccess.cpp
+ static bool FileExists ( const char * filePath )
+ {
+ struct stat info;
+ int err = stat ( filePath, &info );
+ return (err == 0);
}
+#endif
-} // LFA_Copy
-
-// =================================================================================================
static bool CreateNewFile ( const char * newPath, const char * origPath, size_t filePos, bool copyMacRsrc )
{
@@ -824,29 +205,27 @@ static bool CreateNewFile ( const char * newPath, const char * origPath, size_t
// *** The ownership and permissions are not handled on all platforms.
#if XMP_MacBuild | XMP_UNIXBuild
- {
- FILE * temp = fopen ( newPath, "r" ); // Make sure the file does not exist.
- if ( temp != 0 ) {
- fclose ( temp );
- return false;
- }
- }
+
+ if ( FileExists ( newPath ) ) return false;
+
#elif XMP_WinBuild
- {
- std::string wideName;
- const size_t utf8Len = strlen(newPath);
- const size_t maxLen = 2 * (utf8Len+1);
- wideName.reserve ( maxLen );
- wideName.assign ( maxLen, ' ' );
- int wideLen = MultiByteToWideChar ( CP_UTF8, 0, newPath, -1, (LPWSTR)wideName.data(), maxLen );
- if ( wideLen == 0 ) return false;
- HANDLE temp = CreateFileW ( (LPCWSTR)wideName.data(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING,
- (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS), 0 );
- if ( temp != INVALID_HANDLE_VALUE ) {
- CloseHandle ( temp );
- return false;
+
+ {
+ std::string wideName;
+ const size_t utf8Len = strlen(newPath);
+ const size_t maxLen = 2 * (utf8Len+1);
+ wideName.reserve ( maxLen );
+ wideName.assign ( maxLen, ' ' );
+ int wideLen = MultiByteToWideChar ( CP_UTF8, 0, newPath, -1, (LPWSTR)wideName.data(), (int)maxLen );
+ if ( wideLen == 0 ) return false;
+ HANDLE temp = CreateFileW ( (LPCWSTR)wideName.data(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING,
+ (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS), 0 );
+ if ( temp != INVALID_HANDLE_VALUE ) {
+ CloseHandle ( temp );
+ return false;
+ }
}
- }
+
#endif
try {
@@ -881,7 +260,18 @@ static bool CreateNewFile ( const char * newPath, const char * origPath, size_t
err = FSGetCatalogInfo ( &origFSRef, kFSCatInfoGettableInfo, &catInfo, 0, 0, 0 );
if ( err != noErr ) XMP_Throw ( "CreateNewFile: FSGetCatalogInfo failure", kXMPErr_ExternalFailure );
err = FSSetCatalogInfo ( &newFSRef, kFSCatInfoSettableInfo, &catInfo );
- if ( err != noErr ) XMP_Throw ( "CreateNewFile: FSSetCatalogInfo failure", kXMPErr_ExternalFailure );
+
+ // *** [1841019] tolerate non mac filesystems, i.e. SMB mounts
+ // this measure helps under 10.5, albeit not reliably under 10.4
+ if ( err == afpAccessDenied )
+ copyMacRsrc = false;
+ else if ( err != noErr ) // all other errors are still an error
+ XMP_Throw ( "CreateNewFile: FSSetCatalogInfo failure", kXMPErr_ExternalFailure );
+
+ // *** [1841019] tolerate non mac filesystems, i.e. SMB mounts
+ // this measure helps under 10.4 (and besides might be an optimization)
+ if ( catInfo.rsrcLogicalSize == 0 )
+ copyMacRsrc = false;
if ( copyMacRsrc ) { // Copy the resource fork as a byte stream.
LFA_FileRef origRsrcRef = 0;
@@ -907,17 +297,15 @@ static bool CreateNewFile ( const char * newPath, const char * origPath, size_t
IgnoreParam(filePos); IgnoreParam(copyMacRsrc);
// *** Can't use on Mac because of frigging CW POSIX header problems!
+
+ // *** Don't handle UNIX specific info yet.
int err, newRef;
struct stat origInfo;
err = stat ( origPath, &origInfo );
if ( err != 0 ) XMP_Throw ( "CreateNewFile: stat failure", kXMPErr_ExternalFailure );
-
- newRef = open ( newPath, (O_CREAT | O_EXCL | O_RDWR), origInfo.st_mode );
- if ( newRef != -1 ) {
- (void) fchown ( newRef, origInfo.st_uid, origInfo.st_gid ); // Tolerate failure.
- close ( newRef );
- }
+
+ (void) chmod ( newPath, origInfo.st_mode ); // Ignore errors.
#endif
@@ -993,6 +381,193 @@ void CreateTempFile ( const std::string & origPath, std::string * tempPath, bool
} // CreateTempFile
// =================================================================================================
+// File mode and folder info utilities
+// -----------------------------------
+
+#if XMP_WinBuild
+
+ // ---------------------------------------------------------------------------------------------
+
+ static DWORD kOtherAttrs = (FILE_ATTRIBUTE_DEVICE | FILE_ATTRIBUTE_OFFLINE);
+
+ FileMode GetFileMode ( const char * path )
+ {
+ std::string utf16; // GetFileAttributes wants native UTF-16.
+ ToUTF16Native ( (UTF8Unit*)path, strlen(path), &utf16 );
+ utf16.append ( 2, '\0' ); // Make sure there are at least 2 final zero bytes.
+
+ // ! A shortcut is seen as a file, we would need extra code to recognize it and find the target.
+
+ DWORD fileAttrs = GetFileAttributesW ( (LPCWSTR) utf16.c_str() );
+ if ( fileAttrs == INVALID_FILE_ATTRIBUTES ) return kFMode_DoesNotExist; // ! Any failure turns into does-not-exist.
+
+ if ( fileAttrs & FILE_ATTRIBUTE_DIRECTORY ) return kFMode_IsFolder;
+ if ( fileAttrs & kOtherAttrs ) return kFMode_IsOther;
+ return kFMode_IsFile;
+
+ } // GetFileMode
+
+ // ---------------------------------------------------------------------------------------------
+
+ void XMP_FolderInfo::Open ( const char * folderPath )
+ {
+
+ if ( this->dirRef != 0 ) this->Close();
+
+ this->folderPath = folderPath;
+
+ } // XMP_FolderInfo::Open
+
+ // ---------------------------------------------------------------------------------------------
+
+ void XMP_FolderInfo::Close()
+ {
+
+ if ( this->dirRef != 0 ) (void) FindClose ( this->dirRef );
+ this->dirRef = 0;
+ this->folderPath.erase();
+
+ } // XMP_FolderInfo::Close
+
+ // ---------------------------------------------------------------------------------------------
+
+ bool XMP_FolderInfo::GetFolderPath ( std::string * folderPath )
+ {
+
+ if ( this->folderPath.empty() ) return false;
+
+ *folderPath = this->folderPath;
+ return true;
+
+ } // XMP_FolderInfo::GetFolderPath
+
+ // ---------------------------------------------------------------------------------------------
+
+ bool XMP_FolderInfo::GetNextChild ( std::string * childName )
+ {
+ bool found = false;
+ WIN32_FIND_DATAW childInfo;
+
+ if ( this->dirRef != 0 ) {
+
+ found = FindNextFile ( this->dirRef, &childInfo );
+ if ( ! found ) return false;
+
+ } else {
+
+ if ( this->folderPath.empty() ) {
+ XMP_Throw ( "XMP_FolderInfo::GetNextChild - not open", kXMPErr_InternalFailure );
+ }
+
+ std::string findPath = this->folderPath;
+ findPath += "\\*";
+ std::string utf16; // FindFirstFile wants native UTF-16.
+ ToUTF16Native ( (UTF8Unit*)findPath.c_str(), findPath.size(), &utf16 );
+ utf16.append ( 2, '\0' ); // Make sure there are at least 2 final zero bytes.
+
+ this->dirRef = FindFirstFileW ( (LPCWSTR) utf16.c_str(), &childInfo );
+ if ( this->dirRef == 0 ) return false;
+ found = true;
+
+ }
+
+ // Ignore all children with names starting in '.'. This covers ., .., .DS_Store, etc.
+ while ( found && (childInfo.cFileName[0] == '.') ) {
+ found = FindNextFile ( this->dirRef, &childInfo );
+ }
+ if ( ! found ) return false;
+
+ size_t len16 = 0;
+ while ( childInfo.cFileName[len16] != 0 ) ++len16;
+ FromUTF16Native ( (UTF16Unit*)childInfo.cFileName, len16, childName ); // The cFileName field is native UTF-16.
+
+ return true;
+
+ } // XMP_FolderInfo::GetNextChild
+
+ // ---------------------------------------------------------------------------------------------
+
+#else // Mac and UNIX both use POSIX functions.
+
+ // ---------------------------------------------------------------------------------------------
+
+ FileMode GetFileMode ( const char * path )
+ {
+ struct stat fileInfo;
+
+ int err = stat ( path, &fileInfo );
+ if ( err != 0 ) return kFMode_DoesNotExist; // ! Any failure turns into does-not-exist.
+
+ // ! The target of a symlink is properly recognized, not the symlink itself. A Mac alias is
+ // ! seen as a file, we would need extra code to recognize it and find the target.
+
+ if ( S_ISREG ( fileInfo.st_mode ) ) return kFMode_IsFile;
+ if ( S_ISDIR ( fileInfo.st_mode ) ) return kFMode_IsFolder;
+ return kFMode_IsOther;
+
+ } // GetFileMode
+
+ // ---------------------------------------------------------------------------------------------
+
+ void XMP_FolderInfo::Open ( const char * folderPath )
+ {
+
+ if ( this->dirRef != 0 ) this->Close();
+
+ this->dirRef = opendir ( folderPath );
+ if ( this->dirRef == 0 ) XMP_Throw ( "XMP_FolderInfo::Open - opendir failed", kXMPErr_ExternalFailure );
+ this->folderPath = folderPath;
+
+ } // XMP_FolderInfo::Open
+
+ // ---------------------------------------------------------------------------------------------
+
+ void XMP_FolderInfo::Close()
+ {
+
+ if ( this->dirRef != 0 ) (void) closedir ( this->dirRef );
+ this->dirRef = 0;
+ this->folderPath.erase();
+
+ } // XMP_FolderInfo::Close
+
+ // ---------------------------------------------------------------------------------------------
+
+ bool XMP_FolderInfo::GetFolderPath ( std::string * folderPath )
+ {
+
+ if ( this->folderPath.empty() ) return false;
+
+ *folderPath = this->folderPath;
+ return true;
+
+ } // XMP_FolderInfo::GetFolderPath
+
+ // ---------------------------------------------------------------------------------------------
+
+ bool XMP_FolderInfo::GetNextChild ( std::string * childName )
+ {
+ struct dirent * childInfo = 0;
+
+ if ( this->dirRef == 0 ) XMP_Throw ( "XMP_FolderInfo::GetNextChild - not open", kXMPErr_InternalFailure );
+
+ while ( true ) {
+ // Ignore all children with names starting in '.'. This covers ., .., .DS_Store, etc.
+ childInfo = readdir ( this->dirRef ); // ! Depends on global lock, readdir is not thread safe.
+ if ( childInfo == 0 ) return false;
+ if ( *childInfo->d_name != '.' ) break;
+ }
+
+ *childName = childInfo->d_name;
+ return true;
+
+ } // XMP_FolderInfo::GetNextChild
+
+ // ---------------------------------------------------------------------------------------------
+
+#endif
+
+// =================================================================================================
// GetPacketCharForm
// =================
//
@@ -1012,12 +587,31 @@ void CreateTempFile ( const std::string & origPath, std::string * tempPath, bool
// nn 00 00 00 - Little endian UTF-32
// nn 00 -- -- - Little endian UTF-16
-XMP_Uns8 GetPacketCharForm ( XMP_StringPtr packetStr, XMP_StringLen packetLen )
+static XMP_Uns8 GetPacketCharForm ( XMP_StringPtr packetStr, XMP_StringLen packetLen )
{
XMP_Uns8 charForm = kXMP_CharUnknown;
XMP_Uns8 * unsBytes = (XMP_Uns8*)packetStr; // ! Make sure comparisons are unsigned.
+
+ if ( packetLen < 2 ) return kXMP_Char8Bit;
- if ( packetLen < 4 ) XMP_Throw ( "Can't determine character encoding", kXMPErr_BadXMP );
+ if ( packetLen < 4 ) {
+
+ // These cases are based on the first 2 bytes:
+ // 00 nn Big endian UTF-16
+ // nn 00 Little endian UTF-16
+ // FE FF Big endian UTF-16
+ // FF FE Little endian UTF-16
+ // Otherwise UTF-8
+
+ if ( packetStr[0] == 0 ) return kXMP_Char16BitBig;
+ if ( packetStr[1] == 0 ) return kXMP_Char16BitLittle;
+ if ( CheckBytes ( packetStr, "\xFE\xFF", 2 ) ) return kXMP_Char16BitBig;
+ if ( CheckBytes ( packetStr, "\xFF\xFE", 2 ) ) return kXMP_Char16BitLittle;
+ return kXMP_Char8Bit;
+
+ }
+
+ // If we get here the packet is at least 4 bytes, could be any form.
if ( unsBytes[0] == 0 ) {
@@ -1068,60 +662,67 @@ XMP_Uns8 GetPacketCharForm ( XMP_StringPtr packetStr, XMP_StringLen packetLen )
}
- if ( charForm == kXMP_CharUnknown ) XMP_Throw ( "Unknown character encoding", kXMPErr_BadXMP );
+ // XMP_Assert ( charForm != kXMP_CharUnknown );
return charForm;
} // GetPacketCharForm
// =================================================================================================
-// GetPacketRWMode
-// ===============
-
-bool GetPacketRWMode ( XMP_StringPtr packetStr, XMP_StringLen packetLen, size_t charSize )
+// FillPacketInfo
+// ==============
+//
+// If a packet wrapper is present, the the packet string is roughly:
+// <?xpacket begin= ...?>
+// <outer-XML-element>
+// ... more XML ...
+// </outer-XML-element>
+// ... whitespace padding ...
+// <?xpacket end='.'?>
+
+// The 8-bit form is 14 bytes, the 16-bit form is 28 bytes, the 32-bit form is 56 bytes.
+#define k8BitTrailer "<?xpacket end="
+#define k16BitTrailer "<\0?\0x\0p\0a\0c\0k\0e\0t\0 \0e\0n\0d\0=\0"
+#define k32BitTrailer "<\0\0\0?\0\0\0x\0\0\0p\0\0\0a\0\0\0c\0\0\0k\0\0\0e\0\0\0t\0\0\0 \0\0\0e\0\0\0n\0\0\0d\0\0\0=\0\0\0"
+static XMP_StringPtr kPacketTrailiers[3] = { k8BitTrailer, k16BitTrailer, k32BitTrailer };
+
+void FillPacketInfo ( const std::string & packet, XMP_PacketInfo * info )
{
- bool isWriteable = false;
- XMP_StringPtr packetLim = packetStr + packetLen;
- XMP_StringPtr rwPtr = packetStr + packetLen - 1;
-
- for ( ; rwPtr >= packetStr; --rwPtr ) if ( *rwPtr == '<' ) break; // Byte at a time, don't know endianness.
- if ( *rwPtr != '<' ) XMP_Throw ( "Bad packet trailer", kXMPErr_BadXMP );
-
- for ( ; rwPtr < packetLim; rwPtr += charSize ) if ( *rwPtr == '=' ) break;
- if ( *rwPtr != '=' ) XMP_Throw ( "Bad packet trailer", kXMPErr_BadXMP );
-
- rwPtr += (2 * charSize);
- if ( rwPtr >= packetLim ) XMP_Throw ( "Bad packet trailer", kXMPErr_BadXMP );
-
- if ( *rwPtr == 'r' ) {
- isWriteable = false;
- } else if ( *rwPtr == 'w' ) {
- isWriteable = true;
- } else {
- XMP_Throw ( "Bad packet trailer", kXMPErr_BadXMP );
- }
+ XMP_StringPtr packetStr = packet.c_str();
+ XMP_StringLen packetLen = (XMP_StringLen) packet.size();
+ if ( packetLen == 0 ) return;
- return isWriteable;
-
-} // GetPacketRWMode
+ info->charForm = GetPacketCharForm ( packetStr, packetLen );
+ XMP_StringLen charSize = XMP_GetCharSize ( info->charForm );
+
+ // Look for a packet wrapper. For our purposes, we can be lazy and just look for the trailer PI.
+ // If that is present we'll assume that a recognizable header is present. First do a bytewise
+ // search for '<', then a char sized comparison for the start of the trailer. We don't really
+ // care about big or little endian here. We're looking for ASCII bytes with zeroes between.
+ // Shorten the range comparisons (n*charSize) by 1 to easily tolerate both big and little endian.
-// =================================================================================================
-// GetPacketPadSize
-// ================
+ XMP_StringLen padStart, padEnd;
+ XMP_StringPtr packetTrailer = kPacketTrailiers [ charSize>>1 ];
-size_t GetPacketPadSize ( XMP_StringPtr packetStr, XMP_StringLen packetLen )
-{
- XMP_Int32 padEnd = packetLen - 1; // ! Must be signed.
+ padEnd = packetLen - 1;
for ( ; padEnd > 0; --padEnd ) if ( packetStr[padEnd] == '<' ) break;
- if ( padEnd == 0 ) return 0;
+ if ( (packetStr[padEnd] != '<') || ((packetLen - padEnd) < (18*charSize)) ) return;
+ if ( ! CheckBytes ( &packetStr[padEnd], packetTrailer, (13*charSize) ) ) return;
- XMP_Int32 padStart = padEnd; // ! Must be signed.
- for ( ; padStart > 0; --padStart ) if ( packetStr[padStart] == '>' ) break;
- if ( padStart == 0 ) return 0;
- ++padStart;
+ info->hasWrapper = true;
- return (padEnd - padStart);
-
-} // GetPacketPadSize
+ char rwFlag = packetStr [padEnd + 15*charSize];
+ if ( rwFlag == 'w' ) info->writeable = true;
+
+ // Look for the start of the padding, right after the last XML end tag.
+
+ padStart = padEnd; // Don't do the -charSize here, might wrap below zero.
+ for ( ; padStart >= charSize; padStart -= charSize ) if ( packetStr[padStart] == '>' ) break;
+ if ( padStart < charSize ) return;
+ padStart += charSize; // The padding starts after the '>'.
+
+ info->padSize = padEnd - padStart; // We want bytes of padding, not character units.
+
+} // FillPacketInfo
// =================================================================================================
// ReadXMPPacket
@@ -1174,37 +775,23 @@ void XMPFileHandler::ProcessXMP()
}
SXMPUtils::RemoveProperties ( &this->xmpObj, 0, 0, kXMPUtil_DoAllProperties );
- this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), this->xmpPacket.size() );
+ this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() );
this->processedXMP = true;
} // XMPFileHandler::ProcessXMP
// =================================================================================================
+// XMPFileHandler::GetSerializeOptions
+// ===================================
+//
+// This base implementation just selects compact serialization. The character form and padding/in-place
+// settings are added in the common code before calling SerializeToBuffer.
-#if TrackMallocFree
+XMP_OptionBits XMPFileHandler::GetSerializeOptions()
+{
- #undef malloc
- #undef free
-
- #define kTrackAddr 0x509DF6
-
- void* XMPFiles_Malloc ( size_t size )
- {
- void* addr = malloc ( size );
- if ( addr == (void*)kTrackAddr ) {
- printf ( "XMPFiles_Malloc: allocated %.8X\n", kTrackAddr );
- }
- return addr;
- }
-
- void XMPFiles_Free ( void* addr )
- {
- if ( addr == (void*)kTrackAddr ) {
- printf ( "XMPFiles_Free: deallocating %.8X\n", kTrackAddr );
- }
- free ( addr );
- }
+ return kXMP_UseCompactFormat;
-#endif
+} // XMPFileHandler::GetSerializeOptions
// =================================================================================================
diff --git a/source/XMPFiles/XMPFiles_Impl.hpp b/source/XMPFiles/XMPFiles_Impl.hpp
index 0b776d9..5ba0f14 100644
--- a/source/XMPFiles/XMPFiles_Impl.hpp
+++ b/source/XMPFiles/XMPFiles_Impl.hpp
@@ -3,7 +3,7 @@
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
-// Copyright 2004-2007 Adobe Systems Incorporated
+// Copyright 2004-2008 Adobe Systems Incorporated
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -21,6 +21,7 @@
#include "XMP.hpp"
#include "XMPFiles.hpp"
+#include "LargeFileAccess.hpp"
#include <vector>
#include <string>
@@ -28,13 +29,20 @@
#include <cassert>
-#if XMP_MacBuild
- #include <Multiprocessing.h>
-#elif XMP_WinBuild
+#if XMP_WinBuild
#include <Windows.h>
#define snprintf _snprintf
-#elif XMP_UNIXBuild
+#else
+ #if XMP_MacBuild
+ #include <Files.h>
+ #endif
+ // POSIX headers for both Mac and generic UNIX.
#include <pthread.h>
+ #include <fcntl.h>
+ #include <unistd.h>
+ #include <dirent.h>
+ #include <sys/stat.h>
+ #include <sys/types.h>
#endif
// =================================================================================================
@@ -100,17 +108,6 @@ extern long sXMPFilesInitCount;
#endif
-#ifndef TrackMallocFree
- #define TrackMallocFree 0
-#endif
-
-#if TrackMallocFree
- #define malloc(size) XMPFiles_Malloc ( size )
- #define free(addr) XMPFiles_Free ( addr )
- extern void* XMPFiles_Malloc ( size_t size );
- extern void XMPFiles_Free ( void* addr );
-#endif
-
extern XMP_FileFormat voidFileFormat; // Used as sink for unwanted output parameters.
extern XMP_PacketInfo voidPacketInfo;
extern void * voidVoidPtr;
@@ -132,6 +129,7 @@ struct FileExtMapping {
extern const FileExtMapping kFileExtMap[];
extern const char * kKnownScannedFiles[];
+extern const char * kKnownRejectedFiles[];
#define Uns8Ptr(p) ((XMP_Uns8 *) (p))
@@ -143,6 +141,25 @@ extern const char * kKnownScannedFiles[];
#define IsSpaceOrTab( ch ) ( ((ch) == ' ') || ((ch) == kTab) )
#define IsWhitespace( ch ) ( IsSpaceOrTab ( ch ) || IsNewline ( ch ) )
+static inline void MakeLowerCase ( std::string * str )
+{
+ for ( size_t i = 0, limit = str->size(); i < limit; ++i ) {
+ char ch = (*str)[i];
+ if ( ('A' <= ch) && (ch <= 'Z') ) (*str)[i] += 0x20;
+ }
+}
+
+static inline void MakeUpperCase ( std::string * str )
+{
+ for ( size_t i = 0, limit = str->size(); i < limit; ++i ) {
+ char ch = (*str)[i];
+ if ( ('a' <= ch) && (ch <= 'z') ) (*str)[i] -= 0x20;
+ }
+}
+
+#define XMP_LitMatch(s,l) (std::strcmp((s),(l)) == 0)
+#define XMP_LitNMatch(s,l,n) (std::strncmp((s),(l),(n)) == 0)
+
#define IgnoreParam(p) voidVoidPtr = (void*)&p
// =================================================================================================
@@ -150,6 +167,7 @@ extern const char * kKnownScannedFiles[];
#define _MakeStr(p) #p
#define _NotifyMsg(n,c,f,l) #n " failed: " #c " in " f " at line " _MakeStr(l)
+#define _NotifyMsg2(msg,c,e) #e " " #msg ": " #c
#if ! XMP_DebugBuild
#define XMP_Assert(c) ((void) 0)
@@ -162,6 +180,12 @@ extern const char * kKnownScannedFiles[];
const char * assert_msg = _NotifyMsg ( XMP_Enforce, (c), __FILE__, __LINE__ ); \
XMP_Throw ( assert_msg , kXMPErr_EnforceFailure ); \
}
+#define XMP_Validate(c,msg,e) \
+ if ( ! (c) ) { \
+ const char * enforce_msg = _NotifyMsg2(msg,c,e); \
+ XMP_Throw ( enforce_msg , e ); \
+ }
+
// =================================================================================================
// Support for memory leak tracking
@@ -246,11 +270,10 @@ typedef std::string XMP_VarString;
// -------------------------------------------------------------------------------------------------
-#if XMP_MacBuild
- typedef MPCriticalRegionID XMP_Mutex;
-#elif XMP_WinBuild
+#if XMP_WinBuild
typedef CRITICAL_SECTION XMP_Mutex;
-#elif XMP_UNIXBuild
+#else
+ // Use pthread for both Mac and generic UNIX.
typedef pthread_mutex_t XMP_Mutex;
#endif
@@ -337,9 +360,7 @@ private:
extern void ReadXMPPacket ( XMPFileHandler * handler );
-extern XMP_Uns8 GetPacketCharForm ( XMP_StringPtr packetStr, XMP_StringLen packetLen );
-extern size_t GetPacketPadSize ( XMP_StringPtr packetStr, XMP_StringLen packetLen );
-extern bool GetPacketRWMode ( XMP_StringPtr packetStr, XMP_StringLen packetLen, size_t charSize );
+extern void FillPacketInfo ( const XMP_VarString & packet, XMP_PacketInfo * info );
class XMPFileHandler { // See XMPFiles.hpp for usage notes.
public:
@@ -357,6 +378,8 @@ public:
virtual void CacheFileData() = 0;
virtual void ProcessTNail(); // The default implementation just sets processedTNail to true.
virtual void ProcessXMP(); // The default implementation just parses the XMP.
+
+ virtual XMP_OptionBits GetSerializeOptions(); // The default is compact.
virtual void UpdateFile ( bool doSafeUpdate ) = 0;
virtual void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) = 0;
@@ -373,8 +396,8 @@ public:
bool processedXMP; // True if the XMP is parsed and reconciled.
bool needsUpdate; // True if the file needs to be updated.
- XMP_PacketInfo packetInfo;
- std::string xmpPacket;
+ XMP_PacketInfo packetInfo; // ! This is always info about the packet in the file, if any!
+ std::string xmpPacket; // ! This is the current XMP, updated by XMPFiles::PutXMP.
SXMPMeta xmpObj;
XMP_ThumbnailInfo tnailInfo;
@@ -383,37 +406,24 @@ public:
typedef XMPFileHandler * (* XMPFileHandlerCTor) ( XMPFiles * parent );
-typedef bool (* CheckFormatProc ) ( XMP_FileFormat format,
- XMP_StringPtr filePath,
- LFA_FileRef fileRef,
- XMPFiles * parent );
+typedef bool (* CheckFileFormatProc ) ( XMP_FileFormat format,
+ XMP_StringPtr filePath,
+ LFA_FileRef fileRef,
+ XMPFiles * parent );
+
+typedef bool (*CheckFolderFormatProc ) ( XMP_FileFormat format,
+ const std::string & rootPath,
+ const std::string & gpName,
+ const std::string & parentName,
+ const std::string & leafName,
+ XMPFiles * parent );
// =================================================================================================
-// File I/O support
-
-// *** Change the model of the LFA functions to not throw for "normal" open/create errors.
-// *** Make sure the semantics of open/create/rename are consistent, e.g. about create of existing.
-
-extern LFA_FileRef LFA_Open ( const char * fileName, char openMode ); // Mode is 'r' or 'w'.
-extern LFA_FileRef LFA_Create ( const char * fileName );
-extern void LFA_Delete ( const char * fileName );
-extern void LFA_Rename ( const char * oldName, const char * newName );
-extern void LFA_Close ( LFA_FileRef file );
-extern XMP_Int64 LFA_Seek ( LFA_FileRef file, XMP_Int64 offset, int seekMode, bool * okPtr = 0 );
-extern XMP_Int32 LFA_Read ( LFA_FileRef file, void * buffer, XMP_Int32 bytes, bool requireAll = false );
-extern void LFA_Write ( LFA_FileRef file, const void * buffer, XMP_Int32 bytes );
-extern void LFA_Flush ( LFA_FileRef file );
-extern XMP_Int64 LFA_Measure ( LFA_FileRef file );
-extern void LFA_Extend ( LFA_FileRef file, XMP_Int64 length );
-extern void LFA_Truncate ( LFA_FileRef file, XMP_Int64 length );
#if XMP_MacBuild
extern LFA_FileRef LFA_OpenRsrc ( const char * fileName, char openMode ); // Open the Mac resource fork.
#endif
-extern void LFA_Copy ( LFA_FileRef sourceFile, LFA_FileRef destFile, XMP_Int64 length, // Not a primitive.
- XMP_AbortProc abortProc = 0, void * abortArg = 0 );
-
extern void CreateTempFile ( const std::string & origPath, std::string * tempPath, bool copyMacRsrc = false );
enum { kCopyMacRsrc = true };
@@ -423,20 +433,85 @@ struct AutoFile { // Provides auto close of files on exit or exception.
~AutoFile() { if ( fileRef != 0 ) LFA_Close ( fileRef ); };
};
-enum { kLFA_RequireAll = true }; // Used for requireAll to LFA_Read.
+enum { kFMode_DoesNotExist, kFMode_IsFile, kFMode_IsFolder, kFMode_IsOther };
+typedef XMP_Uns8 FileMode;
+
+#if XMP_WinBuild
+ #define kDirChar '\\'
+#else
+ #define kDirChar '/'
+#endif
+
+class XMP_FolderInfo {
+public:
+
+ XMP_FolderInfo() : dirRef(0) {};
+ ~XMP_FolderInfo() { if ( this->dirRef != 0 ) this->Close(); };
+
+ void Open ( const char * folderPath );
+ void Close();
+
+ bool GetFolderPath ( XMP_VarString * folderPath );
+ bool GetNextChild ( XMP_VarString * childName );
+
+private:
+
+ std::string folderPath;
+
+ #if XMP_WinBuild
+ HANDLE dirRef; // Windows uses FindFirstFile and FindNextFile.
+ #else
+ DIR * dirRef; // Mac and UNIX use the POSIX opendir/readdir/closedir functions.
+ #endif
+
+};
+
+extern FileMode GetFileMode ( const char * path );
+
+static inline FileMode GetChildMode ( std::string & path, XMP_StringPtr childName )
+{
+ size_t pathLen = path.size();
+ path += kDirChar;
+ path += childName;
+ FileMode mode = GetFileMode ( path.c_str() );
+ path.erase ( pathLen );
+ return mode;
+}
+
+static inline void SplitLeafName ( std::string * path, std::string * leafName )
+{
+ size_t dirPos = path->size();
+ if ( dirPos == 0 ) {
+ leafName->erase();
+ return;
+ }
+
+ for ( --dirPos; dirPos > 0; --dirPos ) {
+ #if XMP_WinBuild
+ if ( (*path)[dirPos] == '/' ) (*path)[dirPos] = kDirChar; // Tolerate both '\' and '/'.
+ #endif
+ if ( (*path)[dirPos] == kDirChar ) break;
+ }
+ if ( (*path)[dirPos] == kDirChar ) {
+ leafName->assign ( &(*path)[dirPos+1] );
+ path->erase ( dirPos );
+ } else if ( dirPos == 0 ) {
+ leafName->erase();
+ leafName->swap ( *path );
+ }
+
+}
// -------------------------------------------------------------------------------------------------
-static inline bool
-CheckBytes ( const void * left, const void * right, size_t length )
+static inline bool CheckBytes ( const void * left, const void * right, size_t length )
{
return (std::memcmp ( left, right, length ) == 0);
}
// -------------------------------------------------------------------------------------------------
-static inline bool
-CheckCString ( const void * left, const void * right )
+static inline bool CheckCString ( const void * left, const void * right )
{
return (std::strcmp ( (char*)left, (char*)right ) == 0);
}
@@ -474,8 +549,7 @@ struct IOBuffer {
IOBuffer() : filePos(0), ptr(&data[0]), limit(ptr), len(0) {};
};
-static inline void
-FillBuffer ( LFA_FileRef fileRef, XMP_Int64 fileOffset, IOBuffer* ioBuf )
+static inline void FillBuffer ( LFA_FileRef fileRef, XMP_Int64 fileOffset, IOBuffer* ioBuf )
{
ioBuf->filePos = LFA_Seek ( fileRef, fileOffset, SEEK_SET );
if ( ioBuf->filePos != fileOffset ) XMP_Throw ( "Seek failure in FillBuffer", kXMPErr_ExternalFailure );
@@ -484,10 +558,9 @@ FillBuffer ( LFA_FileRef fileRef, XMP_Int64 fileOffset, IOBuffer* ioBuf )
ioBuf->limit = ioBuf->ptr + ioBuf->len;
}
-static inline void
-MoveToOffset ( LFA_FileRef fileRef, XMP_Int64 fileOffset, IOBuffer* ioBuf )
+static inline void MoveToOffset ( LFA_FileRef fileRef, XMP_Int64 fileOffset, IOBuffer* ioBuf )
{
- if ( (ioBuf->filePos <= fileOffset) && (fileOffset < (ioBuf->filePos + ioBuf->len)) ) {
+ if ( (ioBuf->filePos <= fileOffset) && (fileOffset < (XMP_Int64)(ioBuf->filePos + ioBuf->len)) ) {
size_t bufOffset = (size_t)(fileOffset - ioBuf->filePos);
ioBuf->ptr = &ioBuf->data[bufOffset];
} else {
@@ -495,8 +568,7 @@ MoveToOffset ( LFA_FileRef fileRef, XMP_Int64 fileOffset, IOBuffer* ioBuf )
}
}
-static inline void
-RefillBuffer ( LFA_FileRef fileRef, IOBuffer* ioBuf )
+static inline void RefillBuffer ( LFA_FileRef fileRef, IOBuffer* ioBuf )
{
ioBuf->filePos += (ioBuf->ptr - &ioBuf->data[0]); // ! Increment before the read.
size_t bufTail = ioBuf->limit - ioBuf->ptr; // We'll re-read the tail portion of the buffer.
diff --git a/source/XMPFiles/FormatSupport/EndianUtils.hpp b/source/common/EndianUtils.hpp
index 684c539..e3c9b23 100644
--- a/source/XMPFiles/FormatSupport/EndianUtils.hpp
+++ b/source/common/EndianUtils.hpp
@@ -20,25 +20,24 @@
#define kLittleEndianHost (! kBigEndianHost)
#if XMP_WinBuild
+ #pragma warning ( disable : 4127 ) // conditional expression is constant
#define kBigEndianHost 0
#elif XMP_MacBuild
- #if __MWERKS__
- #if __POWERPC__
- #define kBigEndianHost 1
- #else
- #error "CodeWarrior must only be for PowerPC"
- #endif
- #else // Must be an Xcode build.
- #if __BIG_ENDIAN__
- #define kBigEndianHost 1
- #elif __LITTLE_ENDIAN__
+ #if __BIG_ENDIAN__
+ #define kBigEndianHost 1
+ #elif __LITTLE_ENDIAN__
+ #define kBigEndianHost 0
+ #else
+ #error "Neither __BIG_ENDIAN__ nor __LITTLE_ENDIAN__ is set"
+ #endif
+#elif XMP_UNIXBuild
+ #ifndef kBigEndianHost // Typically in the makefile for generic UNIX.
+ #if __GNUC__ && (__i386__ || __x86_64__)
#define kBigEndianHost 0
#else
- #error "Neither __BIG_ENDIAN__ nor __LITTLE_ENDIAN__ is set"
+ #error "Must define kBigEndianHost as 0 or 1 in the makefile."
#endif
#endif
-#elif XMP_UNIXBuild
- #error "Endian macros not set up for generic UNIX yet"
#else
#error "Unknown build environment"
#endif
diff --git a/source/XMPCore/ExpatAdapter.hpp b/source/common/ExpatAdapter.hpp
index ffe23b3..9d6c9ec 100644
--- a/source/XMPCore/ExpatAdapter.hpp
+++ b/source/common/ExpatAdapter.hpp
@@ -2,7 +2,7 @@
#define __ExpatAdapter_hpp__
// =================================================================================================
-// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2005-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
@@ -12,27 +12,39 @@
#include "XMP_Environment.h" // ! Must be the first #include!
#include "XMLParserAdapter.hpp"
-#if UsePublicExpat
- #include "expat.h"
-#endif
-
// =================================================================================================
// Derived XML parser adapter for Expat.
// =================================================================================================
+#ifndef BanAllEntityUsage
+ #define BanAllEntityUsage 0
+#endif
+
+struct XML_ParserStruct; // ! Hack to avoid exposing expat.h to all clients.
+typedef struct XML_ParserStruct *XML_Parser;
+
class ExpatAdapter : public XMLParserAdapter {
public:
XML_Parser parser;
- size_t nesting;
+
+ #if BanAllEntityUsage
+ bool isAborted;
+ #endif
+
+ #if XMP_DebugBuild
+ size_t elemNesting;
+ #endif
ExpatAdapter();
virtual ~ExpatAdapter();
- void ParseBuffer ( const void * buffer, size_t length, bool last );
+ void ParseBuffer ( const void * buffer, size_t length, bool last = true );
};
+extern "C" ExpatAdapter * XMP_NewExpatAdapter();
+
// =================================================================================================
#endif // __ExpatAdapter_hpp__
diff --git a/source/common/LargeFileAccess.cpp b/source/common/LargeFileAccess.cpp
new file mode 100644
index 0000000..81e9557
--- /dev/null
+++ b/source/common/LargeFileAccess.cpp
@@ -0,0 +1,814 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2004-2008 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "LargeFileAccess.hpp"
+
+extern void LFA_Throw ( const char* msg, int id );
+
+// =================================================================================================
+// LFA implementations for Macintosh
+// =================================
+
+#if XMP_MacBuild
+
+ static bool FileExists ( const char * filePath )
+ {
+ struct stat info;
+ int err = stat ( filePath, &info );
+ return (err == 0);
+ }
+
+ // ---------------------------------------------------------------------------------------------
+
+ // ! Can't use Apple's 64 bit POSIX functions because frigging MSL has type clashes.
+ // *** Revisit now that we've switched to Xcode.
+
+ LFA_FileRef LFA_Open ( const char * filePath, char mode )
+ {
+ if ( (mode != 'r') && (mode != 'w') )
+ LFA_Throw ( "LFA_Open: invalid mode", kLFAErr_ExternalFailure );;
+
+ FSRef fileRef;
+ SInt8 perm = ( (mode == 'r') ? fsRdPerm : fsRdWrPerm );
+ HFSUniStr255 dataForkName;
+ SInt16 refNum;
+
+ OSErr err = FSGetDataForkName ( &dataForkName );
+ if ( err != noErr ) LFA_Throw ( "LFA_Open: FSGetDataForkName failure", kLFAErr_ExternalFailure );
+
+ err = FSPathMakeRef ( (XMP_Uns8*)filePath, &fileRef, 0 );
+ if ( err != noErr ) LFA_Throw ( "LFA_Open: FSPathMakeRef failure", kLFAErr_ExternalFailure );
+
+ err = FSOpenFork ( &fileRef, dataForkName.length, dataForkName.unicode, perm, &refNum );
+ if ( err != noErr ) LFA_Throw ( "LFA_Open: FSOpenFork failure", kLFAErr_ExternalFailure );
+
+ return (LFA_FileRef)refNum;
+
+ } // LFA_Open
+
+ // ---------------------------------------------------------------------------------------------
+
+ LFA_FileRef LFA_Create ( const char * filePath )
+ {
+ // *** Hack: Use fopen to avoid parent/child name separation needed by FSCreateFileUnicode.
+
+ if ( FileExists ( filePath ) ) {
+ LFA_Throw ( "LFA_Create: file already exists", kLFAErr_ExternalFailure );
+ }
+
+ FILE * temp = fopen ( filePath, "w" );
+ if ( temp == 0 ) LFA_Throw ( "LFA_Create: fopen failure", kLFAErr_ExternalFailure );
+ fclose ( temp );
+
+ return LFA_Open ( filePath, 'w' );
+
+ } // LFA_Create
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Delete ( const char * filePath )
+ {
+ int err = remove ( filePath ); // *** Better to use an FS function.
+ if ( err != 0 ) LFA_Throw ( "LFA_Delete: remove failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Delete
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Rename ( const char * oldName, const char * newName )
+ {
+ int err = rename ( oldName, newName ); // *** Better to use an FS function.
+ if ( err != 0 ) LFA_Throw ( "LFA_Rename: rename failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Rename
+
+ // ---------------------------------------------------------------------------------------------
+
+ LFA_FileRef LFA_OpenRsrc ( const char * filePath, char mode )
+ {
+ if ( (mode != 'r') && (mode != 'w') )
+ LFA_Throw ( "LFA_OpenRsrc: invalid mode", kLFAErr_ExternalFailure );;
+
+ FSRef fileRef;
+ SInt8 perm = ( (mode == 'r') ? fsRdPerm : fsRdWrPerm );
+ HFSUniStr255 rsrcForkName;
+ SInt16 refNum;
+
+ OSErr err = FSGetResourceForkName ( &rsrcForkName );
+ if ( err != noErr ) LFA_Throw ( "LFA_OpenRsrc: FSGetResourceForkName failure", kLFAErr_ExternalFailure );
+
+ err = FSPathMakeRef ( (XMP_Uns8*)filePath, &fileRef, 0 );
+ if ( err != noErr ) LFA_Throw ( "LFA_OpenRsrc: FSPathMakeRef failure", kLFAErr_ExternalFailure );
+
+ err = FSOpenFork ( &fileRef, rsrcForkName.length, rsrcForkName.unicode, perm, &refNum );
+ if ( err != noErr ) LFA_Throw ( "LFA_OpenRsrc: FSOpenFork failure", kLFAErr_ExternalFailure );
+
+ return (LFA_FileRef)refNum;
+
+ } // LFA_OpenRsrc
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Close ( LFA_FileRef file )
+ {
+ if ( file == 0 ) return; // Can happen if LFA_Open throws an exception.
+ long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
+
+ OSErr err = FSCloseFork ( refNum );
+ if ( err != noErr ) LFA_Throw ( "LFA_Close: FSCloseFork failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Close
+
+ // ---------------------------------------------------------------------------------------------
+
+ XMP_Int64 LFA_Seek ( LFA_FileRef file, XMP_Int64 offset, int mode, bool * okPtr )
+ {
+ long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
+
+ UInt16 posMode;
+ switch ( mode ) {
+ case SEEK_SET :
+ posMode = fsFromStart;
+ break;
+ case SEEK_CUR :
+ posMode = fsFromMark;
+ break;
+ case SEEK_END :
+ posMode = fsFromLEOF;
+ break;
+ default :
+ LFA_Throw ( "LFA_Seek: Invalid seek mode", kLFAErr_InternalFailure );
+ break;
+ }
+
+ OSErr err;
+ XMP_Int64 newPos;
+
+ err = FSSetForkPosition ( refNum, posMode, offset );
+
+ if ( err == eofErr ) {
+ // FSSetForkPosition does not implicitly grow the file. Grow then seek to the new EOF.
+ err = FSSetForkSize ( refNum, posMode, offset );
+ if ( err == noErr ) err = FSSetForkPosition ( refNum, fsFromLEOF, 0 );
+ }
+
+ if ( err == noErr ) err = FSGetForkPosition ( refNum, &newPos );
+
+ if ( okPtr != 0 ) {
+ *okPtr = (err == noErr);
+ } else {
+ if ( err != noErr ) LFA_Throw ( "LFA_Seek: FSSetForkPosition failure", kLFAErr_ExternalFailure );
+ }
+
+ return newPos;
+
+ } // LFA_Seek
+
+ // ---------------------------------------------------------------------------------------------
+
+ XMP_Int32 LFA_Read ( LFA_FileRef file, void * buffer, XMP_Int32 bytes, bool requireAll )
+ {
+ long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
+ ByteCount bytesRead;
+
+ OSErr err = FSReadFork ( refNum, fsAtMark, 0, bytes, buffer, &bytesRead );
+ if ( ((err != noErr) && (err != eofErr)) || (requireAll && (bytesRead != (ByteCount)bytes)) ) {
+ // ! FSReadFork returns eofErr for a normal encounter with the end of file.
+ LFA_Throw ( "LFA_Read: FSReadFork failure", kLFAErr_ExternalFailure );
+ }
+
+ return bytesRead;
+
+ } // LFA_Read
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Write ( LFA_FileRef file, const void * buffer, XMP_Int32 bytes )
+ {
+ long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
+ ByteCount bytesWritten;
+
+ OSErr err = FSWriteFork ( refNum, fsAtMark, 0, bytes, buffer, &bytesWritten );
+ if ( (err != noErr) | (bytesWritten != (ByteCount)bytes) ) LFA_Throw ( "LFA_Write: FSWriteFork failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Write
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Flush ( LFA_FileRef file )
+ {
+ long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
+
+ OSErr err = FSFlushFork ( refNum );
+ if ( err != noErr ) LFA_Throw ( "LFA_Flush: FSFlushFork failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Flush
+
+ // ---------------------------------------------------------------------------------------------
+
+ XMP_Int64 LFA_Measure ( LFA_FileRef file )
+ {
+ long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
+ XMP_Int64 length;
+
+ OSErr err = FSGetForkSize ( refNum, &length );
+ if ( err != noErr ) LFA_Throw ( "LFA_Measure: FSSetForkSize failure", kLFAErr_ExternalFailure );
+
+ return length;
+
+ } // LFA_Measure
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Extend ( LFA_FileRef file, XMP_Int64 length )
+ {
+ long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
+
+ OSErr err = FSSetForkSize ( refNum, fsFromStart, length );
+ if ( err != noErr ) LFA_Throw ( "LFA_Extend: FSSetForkSize failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Extend
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Truncate ( LFA_FileRef file, XMP_Int64 length )
+ {
+ long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
+
+ OSErr err = FSSetForkSize ( refNum, fsFromStart, length );
+ if ( err != noErr ) LFA_Throw ( "LFA_Truncate: FSSetForkSize failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Truncate
+
+ // ---------------------------------------------------------------------------------------------
+
+#endif // XMP_MacBuild
+
+// =================================================================================================
+// LFA implementations for Windows
+// ===============================
+
+#if XMP_WinBuild
+ // ---------------------------------------------------------------------------------------------
+
+ LFA_FileRef LFA_Open ( const char * filePath, char mode )
+ {
+ if ( (mode != 'r') && (mode != 'w') )
+ LFA_Throw ( "LFA_Open: invalid mode", kLFAErr_ExternalFailure );;
+
+ DWORD access = GENERIC_READ; // Assume read mode.
+ DWORD share = FILE_SHARE_READ;
+
+ if ( mode == 'w' ) {
+ access |= GENERIC_WRITE;
+ share = 0;
+ }
+
+ std::string wideName;
+ const size_t utf8Len = strlen(filePath);
+ const size_t maxLen = 2 * (utf8Len+1);
+
+ wideName.reserve ( maxLen );
+ wideName.assign ( maxLen, ' ' );
+ int wideLen = MultiByteToWideChar ( CP_UTF8, 0, filePath, -1, (LPWSTR)wideName.data(), (int)maxLen );
+ if ( wideLen == 0 ) LFA_Throw ( "LFA_Open: MultiByteToWideChar failure", kLFAErr_ExternalFailure );
+
+ HANDLE fileHandle = CreateFileW ( (LPCWSTR)wideName.data(), access, share, 0, OPEN_EXISTING,
+ (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS), 0 );
+ if ( fileHandle == INVALID_HANDLE_VALUE ) LFA_Throw ( "LFA_Open: CreateFileW failure", kLFAErr_ExternalFailure );
+
+ return (LFA_FileRef)fileHandle;
+
+ } // LFA_Open
+
+ // ---------------------------------------------------------------------------------------------
+
+ LFA_FileRef LFA_Create ( const char * filePath )
+ {
+ std::string wideName;
+ const size_t utf8Len = strlen(filePath);
+ const size_t maxLen = 2 * (utf8Len+1);
+
+ wideName.reserve ( maxLen );
+ wideName.assign ( maxLen, ' ' );
+ int wideLen = MultiByteToWideChar ( CP_UTF8, 0, filePath, -1, (LPWSTR)wideName.data(), (int)maxLen );
+ if ( wideLen == 0 ) LFA_Throw ( "LFA_Create: MultiByteToWideChar failure", kLFAErr_ExternalFailure );
+
+ HANDLE fileHandle;
+
+ fileHandle = CreateFileW ( (LPCWSTR)wideName.data(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING,
+ (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS), 0 );
+ if ( fileHandle != INVALID_HANDLE_VALUE ) {
+ CloseHandle ( fileHandle );
+ LFA_Throw ( "LFA_Create: file already exists", kLFAErr_ExternalFailure );
+ }
+
+ fileHandle = CreateFileW ( (LPCWSTR)wideName.data(), (GENERIC_READ | GENERIC_WRITE), 0, 0, CREATE_ALWAYS,
+ (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS), 0 );
+ if ( fileHandle == INVALID_HANDLE_VALUE ) LFA_Throw ( "LFA_Create: CreateFileW failure", kLFAErr_ExternalFailure );
+
+ return (LFA_FileRef)fileHandle;
+
+ } // LFA_Create
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Delete ( const char * filePath )
+ {
+ std::string wideName;
+ const size_t utf8Len = strlen(filePath);
+ const size_t maxLen = 2 * (utf8Len+1);
+
+ wideName.reserve ( maxLen );
+ wideName.assign ( maxLen, ' ' );
+ int wideLen = MultiByteToWideChar ( CP_UTF8, 0, filePath, -1, (LPWSTR)wideName.data(), (int)maxLen );
+ if ( wideLen == 0 ) LFA_Throw ( "LFA_Delete: MultiByteToWideChar failure", kLFAErr_ExternalFailure );
+
+ BOOL ok = DeleteFileW ( (LPCWSTR)wideName.data() );
+ if ( ! ok ) LFA_Throw ( "LFA_Delete: DeleteFileW failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Delete
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Rename ( const char * oldName, const char * newName )
+ {
+ std::string wideOldName, wideNewName;
+ size_t utf8Len = strlen(oldName);
+ if ( utf8Len < strlen(newName) ) utf8Len = strlen(newName);
+ const size_t maxLen = 2 * (utf8Len+1);
+ int wideLen;
+
+ wideOldName.reserve ( maxLen );
+ wideOldName.assign ( maxLen, ' ' );
+ wideLen = MultiByteToWideChar ( CP_UTF8, 0, oldName, -1, (LPWSTR)wideOldName.data(), (int)maxLen );
+ if ( wideLen == 0 ) LFA_Throw ( "LFA_Rename: MultiByteToWideChar failure", kLFAErr_ExternalFailure );
+
+ wideNewName.reserve ( maxLen );
+ wideNewName.assign ( maxLen, ' ' );
+ wideLen = MultiByteToWideChar ( CP_UTF8, 0, newName, -1, (LPWSTR)wideNewName.data(), (int)maxLen );
+ if ( wideLen == 0 ) LFA_Throw ( "LFA_Rename: MultiByteToWideChar failure", kLFAErr_ExternalFailure );
+
+ BOOL ok = MoveFileW ( (LPCWSTR)wideOldName.data(), (LPCWSTR)wideNewName.data() );
+ if ( ! ok ) LFA_Throw ( "LFA_Rename: MoveFileW failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Rename
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Close ( LFA_FileRef file )
+ {
+ if ( file == 0 ) return; // Can happen if LFA_Open throws an exception.
+ HANDLE fileHandle = (HANDLE)file;
+
+ BOOL ok = CloseHandle ( fileHandle );
+ if ( ! ok ) LFA_Throw ( "LFA_Close: CloseHandle failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Close
+
+ // ---------------------------------------------------------------------------------------------
+
+ XMP_Int64 LFA_Seek ( LFA_FileRef file, XMP_Int64 offset, int mode, bool * okPtr )
+ {
+ HANDLE fileHandle = (HANDLE)file;
+
+ DWORD method;
+ switch ( mode ) {
+ case SEEK_SET :
+ method = FILE_BEGIN;
+ break;
+ case SEEK_CUR :
+ method = FILE_CURRENT;
+ break;
+ case SEEK_END :
+ method = FILE_END;
+ break;
+ default :
+ LFA_Throw ( "Invalid seek mode", kLFAErr_InternalFailure );
+ break;
+ }
+
+ LARGE_INTEGER seekOffset, newPos;
+ seekOffset.QuadPart = offset;
+
+ BOOL ok = SetFilePointerEx ( fileHandle, seekOffset, &newPos, method );
+ if ( okPtr != 0 ) {
+ *okPtr = ( ok != 0 ); //convert int(disguised as BOOL) to bool, avoiding conversion warning
+ } else {
+ if ( ! ok ) LFA_Throw ( "LFA_Seek: SetFilePointerEx failure", kLFAErr_ExternalFailure );
+ }
+
+ return newPos.QuadPart;
+
+ } // LFA_Seek
+
+ // ---------------------------------------------------------------------------------------------
+
+ XMP_Int32 LFA_Read ( LFA_FileRef file, void * buffer, XMP_Int32 bytes, bool requireAll )
+ {
+ HANDLE fileHandle = (HANDLE)file;
+ DWORD bytesRead;
+
+ BOOL ok = ReadFile ( fileHandle, buffer, bytes, &bytesRead, 0 );
+ if ( (! ok) || (requireAll && (bytesRead != bytes)) ) LFA_Throw ( "LFA_Read: ReadFile failure", kLFAErr_ExternalFailure );
+
+ return bytesRead;
+
+ } // LFA_Read
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Write ( LFA_FileRef file, const void * buffer, XMP_Int32 bytes )
+ {
+ HANDLE fileHandle = (HANDLE)file;
+ DWORD bytesWritten;
+
+ BOOL ok = WriteFile ( fileHandle, buffer, bytes, &bytesWritten, 0 );
+ if ( (! ok) || (bytesWritten != bytes) ) LFA_Throw ( "LFA_Write: WriteFile failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Write
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Flush ( LFA_FileRef file )
+ {
+ HANDLE fileHandle = (HANDLE)file;
+
+ BOOL ok = FlushFileBuffers ( fileHandle );
+ if ( ! ok ) LFA_Throw ( "LFA_Flush: FlushFileBuffers failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Flush
+
+ // ---------------------------------------------------------------------------------------------
+
+ XMP_Int64 LFA_Measure ( LFA_FileRef file )
+ {
+ HANDLE fileHandle = (HANDLE)file;
+ LARGE_INTEGER length;
+
+ BOOL ok = GetFileSizeEx ( fileHandle, &length );
+ if ( ! ok ) LFA_Throw ( "LFA_Measure: GetFileSizeEx failure", kLFAErr_ExternalFailure );
+
+ return length.QuadPart;
+
+ } // LFA_Measure
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Extend ( LFA_FileRef file, XMP_Int64 length )
+ {
+ HANDLE fileHandle = (HANDLE)file;
+
+ LARGE_INTEGER winLength;
+ winLength.QuadPart = length;
+
+ BOOL ok = SetFilePointerEx ( fileHandle, winLength, 0, FILE_BEGIN );
+ if ( ! ok ) LFA_Throw ( "LFA_Extend: SetFilePointerEx failure", kLFAErr_ExternalFailure );
+ ok = SetEndOfFile ( fileHandle );
+ if ( ! ok ) LFA_Throw ( "LFA_Extend: SetEndOfFile failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Extend
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Truncate ( LFA_FileRef file, XMP_Int64 length )
+ {
+ HANDLE fileHandle = (HANDLE)file;
+
+ LARGE_INTEGER winLength;
+ winLength.QuadPart = length;
+
+ BOOL ok = SetFilePointerEx ( fileHandle, winLength, 0, FILE_BEGIN );
+ if ( ! ok ) LFA_Throw ( "LFA_Truncate: SetFilePointerEx failure", kLFAErr_ExternalFailure );
+ ok = SetEndOfFile ( fileHandle );
+ if ( ! ok ) LFA_Throw ( "LFA_Truncate: SetEndOfFile failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Truncate
+
+ // ---------------------------------------------------------------------------------------------
+
+#endif // XMP_WinBuild
+
+// =================================================================================================
+// LFA implementations for POSIX
+// =============================
+
+#if XMP_UNIXBuild
+
+ // ---------------------------------------------------------------------------------------------
+
+ // Make sure off_t is 64 bits and signed.
+ static char check_off_t_size [ (sizeof(off_t) == 8) ? 1 : -1 ];
+ // *** No std::numeric_limits? static char check_off_t_sign [ std::numeric_limits<off_t>::is_signed ? -1 : 1 ];
+
+ static bool FileExists ( const char * filePath )
+ {
+ struct stat info;
+ int err = stat ( filePath, &info );
+ return (err == 0);
+ }
+
+ // ---------------------------------------------------------------------------------------------
+
+ LFA_FileRef LFA_Open ( const char * filePath, char mode )
+ {
+ if ( (mode != 'r') && (mode != 'w') )
+ LFA_Throw ( "LFA_Open: invalid mode", kLFAErr_ExternalFailure );;
+
+ int flags = ((mode == 'r') ? O_RDONLY : O_RDWR); // *** Include O_EXLOCK?
+
+ int descr = open ( filePath, flags, ( S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP ) );
+ if ( descr == -1 ) LFA_Throw ( "LFA_Open: open failure", kLFAErr_ExternalFailure );
+
+ return (LFA_FileRef)descr;
+
+ } // LFA_Open
+
+ // ---------------------------------------------------------------------------------------------
+
+ LFA_FileRef LFA_Create ( const char * filePath )
+ {
+
+ if ( FileExists ( filePath ) ) {
+ LFA_Throw ( "LFA_Create: file already exists", kLFAErr_ExternalFailure );
+ }
+
+ mode_t mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ int descr = open ( filePath, (O_CREAT | O_EXCL | O_RDWR), mode ); // *** Include O_EXLOCK?
+ if ( descr == -1 ) LFA_Throw ( "LFA_Create: open failure", kLFAErr_ExternalFailure );
+
+ return (LFA_FileRef)descr;
+
+ } // LFA_Create
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Delete ( const char * filePath )
+ {
+ int err = unlink ( filePath );
+ if ( err != 0 ) LFA_Throw ( "LFA_Delete: unlink failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Delete
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Rename ( const char * oldName, const char * newName )
+ {
+ int err = rename ( oldName, newName ); // *** POSIX rename clobbers existing destination!
+ if ( err != 0 ) LFA_Throw ( "LFA_Rename: rename failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Rename
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Close ( LFA_FileRef file )
+ {
+ if ( file == 0 ) return; // Can happen if LFA_Open throws an exception.
+ int descr = (int)file;
+
+ int err = close ( descr );
+ if ( err != 0 ) LFA_Throw ( "LFA_Close: close failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Close
+
+ // ---------------------------------------------------------------------------------------------
+
+ XMP_Int64 LFA_Seek ( LFA_FileRef file, XMP_Int64 offset, int mode, bool * okPtr )
+ {
+ int descr = (int)file;
+
+ off_t newPos = lseek ( descr, offset, mode );
+ if ( okPtr != 0 ) {
+ *okPtr = (newPos != -1);
+ } else {
+ if ( newPos == -1 ) LFA_Throw ( "LFA_Seek: lseek failure", kLFAErr_ExternalFailure );
+ }
+
+ return newPos;
+
+ } // LFA_Seek
+
+ // ---------------------------------------------------------------------------------------------
+
+ XMP_Int32 LFA_Read ( LFA_FileRef file, void * buffer, XMP_Int32 bytes, bool requireAll )
+ {
+ int descr = (int)file;
+
+ ssize_t bytesRead = read ( descr, buffer, bytes );
+ if ( (bytesRead == -1) || (requireAll && (bytesRead != bytes)) ) LFA_Throw ( "LFA_Read: read failure", kLFAErr_ExternalFailure );
+
+ return bytesRead;
+
+ } // LFA_Read
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Write ( LFA_FileRef file, const void * buffer, XMP_Int32 bytes )
+ {
+ int descr = (int)file;
+
+ ssize_t bytesWritten = write ( descr, buffer, bytes );
+ if ( bytesWritten != bytes ) LFA_Throw ( "LFA_Write: write failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Write
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Flush ( LFA_FileRef file )
+ {
+ int descr = (int)file;
+
+ int err = fsync ( descr );
+ if ( err != 0 ) LFA_Throw ( "LFA_Flush: fsync failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Flush
+
+ // ---------------------------------------------------------------------------------------------
+
+ XMP_Int64 LFA_Measure ( LFA_FileRef file )
+ {
+ int descr = (int)file;
+
+ off_t currPos = lseek ( descr, 0, SEEK_CUR );
+ off_t length = lseek ( descr, 0, SEEK_END );
+ if ( (currPos == -1) || (length == -1) ) LFA_Throw ( "LFA_Measure: lseek failure", kLFAErr_ExternalFailure );
+ (void) lseek ( descr, currPos, SEEK_SET );
+
+ return length;
+
+ } // LFA_Measure
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Extend ( LFA_FileRef file, XMP_Int64 length )
+ {
+ int descr = (int)file;
+
+ int err = ftruncate ( descr, length );
+ if ( err != 0 ) LFA_Throw ( "LFA_Extend: ftruncate failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Extend
+
+ // ---------------------------------------------------------------------------------------------
+
+ void LFA_Truncate ( LFA_FileRef file, XMP_Int64 length )
+ {
+ int descr = (int)file;
+
+ int err = ftruncate ( descr, length );
+ if ( err != 0 ) LFA_Throw ( "LFA_Truncate: ftruncate failure", kLFAErr_ExternalFailure );
+
+ } // LFA_Truncate
+
+ // ---------------------------------------------------------------------------------------------
+
+#endif // XMP_UNIXBuild
+
+// =================================================================================================
+
+/* note! function does not rewind (LFA_Seek)) */
+void LFA_Copy ( LFA_FileRef sourceFile, LFA_FileRef destFile, XMP_Int64 length,
+ XMP_AbortProc abortProc /* = 0 */, void * abortArg /* = 0 */ )
+{
+ enum { kBufferLen = 64*1024 };
+ XMP_Uns8 buffer [kBufferLen];
+
+ const bool checkAbort = (abortProc != 0);
+
+ while ( length > 0 ) {
+
+ if ( checkAbort && abortProc(abortArg) ) {
+ LFA_Throw ( "LFA_Copy - User abort", kLFAErr_UserAbort );
+ }
+
+ XMP_Int32 ioCount = kBufferLen;
+ if ( length < kBufferLen ) ioCount = (XMP_Int32)length;
+
+ LFA_Read ( sourceFile, buffer, ioCount, kLFA_RequireAll );
+ LFA_Write ( destFile, buffer, ioCount );
+ length -= ioCount;
+
+ }
+
+} // LFA_Copy
+
+// =================================================================================================
+
+// allows to move data within a file (just pass in the same file handle as srcFile and dstFile)
+// shadow effects (stumbling over just-written data) are avoided.
+//
+// * however can also be used to move data between two files *
+// (having both option is handy for flexible use in update()/re-write() handler routines)
+
+void LFA_Move ( LFA_FileRef srcFile, XMP_Int64 srcOffset,
+ LFA_FileRef dstFile, XMP_Int64 dstOffset,
+ XMP_Int64 length, XMP_AbortProc abortProc /* = 0 */, void * abortArg /* = 0 */ )
+{
+ enum { kBufferLen = 64*1024 };
+ XMP_Uns8 buffer [kBufferLen];
+
+ const bool checkAbort = (abortProc != 0);
+
+ if ( srcOffset > dstOffset ) { // avoiding shadow effects
+
+ // move down -> shift lowest packet first !
+
+ while ( length > 0 ) {
+
+ if ( checkAbort && abortProc(abortArg) ) LFA_Throw ( "LFA_Move - User abort", kLFAErr_UserAbort );
+ XMP_Int32 ioCount = kBufferLen;
+ if ( length < kBufferLen ) ioCount = (XMP_Int32)length; //smartly avoids 32/64 bit issues
+
+ LFA_Seek ( srcFile, srcOffset, SEEK_SET );
+ LFA_Read ( srcFile, buffer, ioCount, kLFA_RequireAll );
+ LFA_Seek ( dstFile, dstOffset, SEEK_SET );
+ LFA_Write ( dstFile, buffer, ioCount );
+ length -= ioCount;
+
+ srcOffset += ioCount;
+ dstOffset += ioCount;
+
+ }
+
+ } else { // move up -> shift highest packet first
+
+ srcOffset += length; //move to end
+ dstOffset += length;
+
+ while ( length > 0 ) {
+
+ if ( checkAbort && abortProc(abortArg) ) LFA_Throw ( "LFA_Move - User abort", kLFAErr_UserAbort );
+ XMP_Int32 ioCount = kBufferLen;
+ if ( length < kBufferLen ) ioCount = (XMP_Int32)length; //smartly avoids 32/64 bit issues
+
+ srcOffset -= ioCount;
+ dstOffset -= ioCount;
+
+ LFA_Seek ( srcFile, srcOffset, SEEK_SET );
+ LFA_Read ( srcFile, buffer, ioCount, kLFA_RequireAll );
+ LFA_Seek ( dstFile, dstOffset, SEEK_SET );
+ LFA_Write ( dstFile, buffer, ioCount );
+ length -= ioCount;
+
+ }
+
+ }
+
+} // LFA_Move
+
+// =================================================================================================
+
+XMP_Int64 LFA_Tell ( LFA_FileRef file )
+{
+ return LFA_Seek( file, 0 , SEEK_CUR );
+}
+
+//*** kind of a hack, TOTEST
+bool LFA_isEof( LFA_FileRef file )
+{
+ #if XMP_MacBuild
+ long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast.
+
+ XMP_Int64 position, length;
+ OSErr err = FSGetForkPosition( refNum, &position );
+ if ( err != noErr )
+ LFA_Throw ( "LFA_isEOF:FSGetForkPosition failure", kLFAErr_ExternalFailure );
+
+ err = FSGetForkSize ( refNum, &length );
+ if ( err != noErr )
+ LFA_Throw ( "LFA_isEof: FSGetForkSize failure", kLFAErr_ExternalFailure );
+
+ return position==length;
+ #endif
+
+ #if XMP_WinBuild
+ HANDLE handle = (HANDLE)file;
+
+ XMP_Int64 filepos = LFA_Tell(file);
+
+ DWORD lowWord, highWord;
+ lowWord = GetFileSize(handle, &highWord);
+ XMP_Int64 filesize = ( ((XMP_Int64)highWord) << 32 | lowWord );
+
+ return filesize == filepos;
+ #endif
+
+ #if XMP_UNIXBuild
+ LFA_Throw ( "LFA_isEof: not implemented for Unix yet", kLFAErr_ExternalFailure );
+ return 0;
+ #endif
+}
+
+// TOTEST
+char LFA_GetChar( LFA_FileRef file )
+{
+ XMP_Uns8 c;
+ LFA_Read( file, &c, 1, true);
+ return c;
+}
diff --git a/source/common/LargeFileAccess.hpp b/source/common/LargeFileAccess.hpp
new file mode 100644
index 0000000..bf7f894
--- /dev/null
+++ b/source/common/LargeFileAccess.hpp
@@ -0,0 +1,139 @@
+#ifndef __LargeFileAccess_hpp__
+#define __LargeFileAccess_hpp__ 1
+
+// =================================================================================================
+// Copyright 2006 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include <stdio.h> // The assert macro needs printf.
+#include "XMP_Environment.h"
+#include "XMP_Const.h"
+#include <string>
+
+#include "EndianUtils.hpp"
+
+typedef void * LFA_FileRef;
+
+enum { // used by LFA_Throw, re-route to whatever you need
+ kLFAErr_InternalFailure = 1,
+ kLFAErr_ExternalFailure = 2,
+ kLFAErr_UserAbort = 3
+ };
+
+#define TXMP_STRING_TYPE std::string
+#define XMP_INCLUDE_XMPFILES 1
+#include "XMP.hpp"
+
+// to use these routines, user must define LFA_Throw, kLFAErr_ExternalFailure, kLFAErr_UserAbort
+// Note:LFA_Throw must be a function, not a macro (it may very well wrap a macro, i.e.
+//LFA_Throw(msg,id) { throw std::logic_error ( msg ); }
+
+using namespace std;
+
+#if XMP_WinBuild
+ #include <Windows.h>
+ #define snprintf _snprintf
+#else
+ #if XMP_MacBuild
+ #include <Files.h>
+ #endif
+ // POSIX headers for both Mac and generic UNIX.
+ #include <pthread.h>
+ #include <fcntl.h>
+ #include <unistd.h>
+ #include <dirent.h>
+ #include <sys/stat.h>
+ #include <sys/types.h>
+#endif
+
+// *** Change the model of the LFA functions to not throw for "normal" open/create errors.
+// *** Make sure the semantics of open/create/rename are consistent, e.g. about create of existing.
+
+extern LFA_FileRef LFA_Open ( const char* fileName, char openMode ); // Mode is 'r' or 'w'.
+extern LFA_FileRef LFA_Create ( const char* fileName );
+extern void LFA_Delete ( const char* fileName );
+extern void LFA_Rename ( const char* oldName, const char * newName );
+extern void LFA_Close ( LFA_FileRef file );
+
+// NOTE: unlike the fseek() 'original' LFA_Seek returns the new file position,
+// *NOT* 0 to indicate everything's fine
+extern XMP_Int64 LFA_Seek ( LFA_FileRef file, XMP_Int64 offset, int seekMode, bool* okPtr = 0 );
+extern XMP_Int32 LFA_Read ( LFA_FileRef file, void* buffer, XMP_Int32 bytes, bool requireAll = false );
+extern void LFA_Write ( LFA_FileRef file, const void* buffer, XMP_Int32 bytes );
+extern void LFA_Flush ( LFA_FileRef file );
+extern XMP_Int64 LFA_Tell ( LFA_FileRef file );
+extern XMP_Int64 LFA_Measure ( LFA_FileRef file );
+extern void LFA_Extend ( LFA_FileRef file, XMP_Int64 length );
+extern void LFA_Truncate ( LFA_FileRef file, XMP_Int64 length );
+
+extern void LFA_Copy ( LFA_FileRef sourceFile, LFA_FileRef destFile, XMP_Int64 length, // Not a primitive.
+ XMP_AbortProc abortProc = 0, void * abortArg = 0 );
+
+/* move stuff within a file (both upward and downward */
+extern void LFA_Move ( LFA_FileRef srcFile, XMP_Int64 srcOffset, LFA_FileRef dstFile, XMP_Int64 dstOffset,
+ XMP_Int64 length, XMP_AbortProc abortProc = 0, void * abortArg = 0 );
+
+extern bool LFA_isEof ( LFA_FileRef file );
+extern char LFA_GetChar ( LFA_FileRef file );
+
+enum { kLFA_RequireAll = true }; // Used for requireAll to LFA_Read.
+
+// =================================================================================================
+// Read and convert endianess in one go:
+
+static inline XMP_Uns16 LFA_ReadUns16_BE ( LFA_FileRef file )
+{
+ XMP_Uns16 value;
+ LFA_Read ( file, &value, 2, kLFA_RequireAll );
+ return MakeUns16BE ( value );
+}
+
+static inline XMP_Uns16 LFA_ReadUns16_LE ( LFA_FileRef file )
+{
+ XMP_Uns16 value;
+ LFA_Read ( file, &value, 2, kLFA_RequireAll );
+ return MakeUns16LE ( value );
+}
+
+static inline XMP_Uns32 LFA_ReadUns32_BE ( LFA_FileRef file )
+{
+ XMP_Uns32 value;
+ LFA_Read ( file, &value, 4, kLFA_RequireAll );
+ return MakeUns32BE ( value );
+}
+
+static inline XMP_Uns32 LFA_ReadUns32_LE ( LFA_FileRef file )
+{
+ XMP_Uns32 value;
+ LFA_Read ( file, &value, 4, kLFA_RequireAll );
+ return MakeUns32LE ( value );
+}
+
+// new:
+static inline XMP_Uns64 LFA_ReadUns64_BE ( LFA_FileRef file )
+{
+ XMP_Uns64 value;
+ LFA_Read ( file, &value, 8, kLFA_RequireAll );
+ return MakeUns64BE ( value );
+}
+
+static inline XMP_Uns64 LFA_ReadUns64_LE ( LFA_FileRef file )
+{
+ XMP_Uns64 value;
+ LFA_Read ( file, &value, 8, kLFA_RequireAll );
+ return MakeUns64LE ( value );
+}
+
+#define LFA_ReadInt16_BE(file) ((XMP_Int16) LFA_ReadUns16_BE ( file ))
+#define LFA_ReadInt16_LE(file) ((XMP_Int16) LFA_ReadUns16_LE ( file ))
+#define LFA_ReadInt32_BE(file) ((XMP_Int32) LFA_ReadUns32_BE ( file ))
+#define LFA_ReadInt32_LE(file) ((XMP_Int32) LFA_ReadUns32_LE ( file ))
+#define LFA_ReadInt64_BE(file) ((XMP_Int64) LFA_ReadUns64_BE ( file ))
+#define LFA_ReadInt64_LE(file) ((XMP_Int64) LFA_ReadUns64_LE ( file ))
+
+
+#endif // __LargeFileAccess_hpp__
diff --git a/source/common/XMLParserAdapter.hpp b/source/common/XMLParserAdapter.hpp
new file mode 100644
index 0000000..a21771f
--- /dev/null
+++ b/source/common/XMLParserAdapter.hpp
@@ -0,0 +1,140 @@
+#ifndef __XMLParserAdapter_hpp__
+#define __XMLParserAdapter_hpp__
+
+// =================================================================================================
+// Copyright 2005-2007 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XMP_Environment.h" // ! Must be the first #include!
+#include "XMP_Const.h"
+
+#include <string>
+#include <vector>
+
+// =================================================================================================
+// XML_Node details
+//
+// The XML_Nodes are used only during the XML/RDF parsing process. This presently uses an XML parser
+// to create an XML tree, then a recursive descent RDF recognizer to build the corresponding XMP.
+// This makes it easier to swap XML parsers and provides a clean separation of XML and RDF issues.
+// The overall parsing would be faster and use less memory if the RDF recognition were done on the
+// fly using a state machine. But it was much easier to write the recursive descent version. The
+// current implementation is pretty fast in absolute terms, so being faster might not be crucial.
+//
+// Like the XMP tree, the XML tree contains vectors of pointers for down links, and offspring have
+// a pointer to their parent. Unlike the XMP tree, this is an exact XML document tree. There are no
+// introduced top level namespace nodes or rearrangement of the nodes..
+//
+// The exact state of namespaces can vary during the XML parsing, depending on the parser in use.
+// By the time the RDF recognition is done though, the namespaces must be normalized. All of the
+// used namespaces must be registered, this is done automatically if necessary. All of the "live"
+// namespace prefixes will be unique. The ns field of an XML_Node is the namespace URI, the name
+// field contains a qualified name (prefix:local). This includes default namespace mapping, the
+// URI and prefix will be missing only for elements and attributes in no namespace.
+
+class XML_Node;
+
+typedef XML_Node * XML_NodePtr; // Handy for things like: XML_Node * a, b; - b is XML_Node, not XML_Node*!
+
+enum { kRootNode = 0, kElemNode = 1, kAttrNode = 2, kCDataNode = 3, kPINode = 4 };
+
+#define IsWhitespaceChar(ch) ( ((ch) == ' ') || ((ch) == 0x09) || ((ch) == 0x0A) || ((ch) == 0x0D) )
+
+typedef std::vector<XML_NodePtr> XML_NodeVector;
+typedef XML_NodeVector::iterator XML_NodePos;
+typedef XML_NodeVector::const_iterator XML_cNodePos;
+
+#if 0 // Pattern for iterating over the children or attributes:
+ for ( size_t xxNum = 0, xxLim = _node_->_offspring_.size(); xxNum < xxLim; ++xxNum ) {
+ const XML_NodePtr _curr_ = _node_->_offspring_[xxNum];
+ }
+#endif
+
+class XML_Node {
+public:
+
+ // Intended for lightweight internal use. Clients are expected to use the data directly.
+
+ XMP_Uns8 kind;
+ std::string ns, name, value;
+ size_t nsPrefixLen;
+ XML_NodePtr parent;
+ XML_NodeVector attrs;
+ XML_NodeVector content;
+
+ bool IsWhitespaceNode() const;
+ bool IsLeafContentNode() const; // An empty element or one with a single character data child node.
+ bool IsEmptyLeafNode() const;
+
+ XMP_StringPtr GetAttrValue ( XMP_StringPtr attrName ) const;
+ void SetAttrValue ( XMP_StringPtr attrName, XMP_StringPtr attrValue );
+
+ XMP_StringPtr GetLeafContentValue() const;
+ void SetLeafContentValue ( XMP_StringPtr value );
+
+ size_t CountNamedElements ( XMP_StringPtr nsURI, XMP_StringPtr localName ) const; // Number of child elements with this name.
+ XML_NodePtr GetNamedElement ( XMP_StringPtr nsURI, XMP_StringPtr localName, size_t which = 0 );
+
+ void Dump ( std::string * buffer );
+ void Serialize ( std::string * buffer );
+
+ void RemoveAttrs();
+ void RemoveContent();
+ void ClearNode();
+
+ XML_Node ( XML_NodePtr _parent, XMP_StringPtr _name, XMP_Uns8 _kind )
+ : kind(_kind), name(_name), parent(_parent), nsPrefixLen(0) {};
+
+ XML_Node ( XML_NodePtr _parent, const std::string & _name, XMP_Uns8 _kind )
+ : kind(_kind), name(_name), parent(_parent), nsPrefixLen(0) {};
+
+ virtual ~XML_Node() { RemoveAttrs(); RemoveContent(); };
+
+private:
+
+ XML_Node() : kind(0), parent(0) {}; // ! Hidden to make sure parent pointer is always set.
+
+};
+
+// =================================================================================================
+// Abstract base class for XML parser adapters used by the XMP toolkit.
+
+enum { kXMLPendingInputMax = 16 };
+
+class XMLParserAdapter {
+public:
+
+ XMLParserAdapter()
+ : tree(0,"",kRootNode), rootNode(0), rootCount(0), charEncoding(XMP_OptionBits(-1)), pendingCount(0)
+ {
+ #if XMP_DebugBuild
+ parseLog = 0;
+ #endif
+ };
+
+ virtual ~XMLParserAdapter() {};
+
+ virtual void ParseBuffer ( const void * buffer, size_t length, bool last ) = 0;
+
+ XML_Node tree;
+ XML_NodeVector parseStack;
+ XML_NodePtr rootNode;
+ size_t rootCount;
+
+ XMP_OptionBits charEncoding;
+ size_t pendingCount;
+ unsigned char pendingInput[kXMLPendingInputMax]; // Buffered input for character encoding checks.
+
+ #if XMP_DebugBuild
+ FILE * parseLog;
+ #endif
+
+};
+
+// =================================================================================================
+
+#endif // __XMLParserAdapter_hpp__
diff --git a/source/common/XML_Node.cpp b/source/common/XML_Node.cpp
new file mode 100644
index 0000000..9163fff
--- /dev/null
+++ b/source/common/XML_Node.cpp
@@ -0,0 +1,459 @@
+// =================================================================================================
+// Copyright 2005-2007 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XMP_Environment.h" // ! Must be the first #include!
+#include "XMLParserAdapter.hpp"
+
+#include <map>
+
+// ! Can't include XMP..._Impl.hpp - used by both Core and Files.
+#define XMP_LitNMatch(s,l,n) (std::strncmp((s),(l),(n)) == 0)
+
+#if XMP_WinBuild
+ #define snprintf _snprintf
+ #pragma warning ( disable : 4996 ) // snprintf is safe
+#endif
+
+// =================================================================================================
+
+#if 0 // Pattern for iterating over the children or attributes:
+ for ( size_t xxNum = 0, xxLim = _node_->_offspring_->size(); xxNum < xxLim; ++xxNum ) {
+ const XML_NodePtr _curr_ = _node_->_offspring_[xxNum];
+ }
+#endif
+
+// =================================================================================================
+// XML_Node::IsWhitespaceNode
+//===========================
+
+bool XML_Node::IsWhitespaceNode() const
+{
+ if ( this->kind != kCDataNode ) return false;
+
+ for ( size_t i = 0; i < this->value.size(); ++i ) {
+ unsigned char ch = this->value[i];
+ if ( IsWhitespaceChar ( ch ) ) continue;
+ // *** Add checks for other whitespace characters.
+ return false; // All the checks failed, this isn't whitespace.
+ }
+
+ return true;
+
+} // XML_Node::IsWhitespaceNode
+
+// =================================================================================================
+// XML_Node::IsLeafContentNode
+//============================
+
+bool XML_Node::IsLeafContentNode() const
+{
+ if ( this->kind != kElemNode ) return false;
+ if ( this->content.size() == 0 ) return true;
+ if ( this->content.size() > 1 ) return false;
+ if ( this->content[0]->kind != kCDataNode ) return false;
+
+ return true;
+
+} // XML_Node::IsLeafContentNode
+
+// =================================================================================================
+// XML_Node::IsEmptyLeafNode
+//==========================
+
+bool XML_Node::IsEmptyLeafNode() const
+{
+
+ if ( (this->kind != kElemNode) || (this->content.size() != 0) ) return false;
+ return true;
+
+} // XML_Node::IsEmptyLeafNode
+
+// =================================================================================================
+// XML_Node::GetAttrValue
+//=======================
+
+XMP_StringPtr XML_Node::GetAttrValue ( XMP_StringPtr attrName ) const
+{
+
+ for ( size_t i = 0, aLim = this->attrs.size(); i < aLim; ++i ) {
+ XML_Node * attrPtr = this->attrs[i];
+ if ( ! attrPtr->ns.empty() ) continue; // This form of GetAttrValue is for attrs in no namespace.
+ if ( attrPtr->name == attrName ) return attrPtr->value.c_str();
+ }
+
+ return 0; // Not found.
+
+} // XML_Node::GetAttrValue
+
+// =================================================================================================
+// XML_Node::SetAttrValue
+//=======================
+
+void XML_Node::SetAttrValue ( XMP_StringPtr attrName, XMP_StringPtr attrValue )
+{
+
+ for ( size_t i = 0, aLim = this->attrs.size(); i < aLim; ++i ) {
+ XML_Node * attrPtr = this->attrs[i];
+ if ( ! attrPtr->ns.empty() ) continue; // This form of SetAttrValue is for attrs in no namespace.
+ if ( attrPtr->name == attrName ) {
+ attrPtr->value = attrValue;
+ return;
+ }
+ }
+
+} // XML_Node::SetAttrValue
+
+// =================================================================================================
+// XML_Node::GetLeafContentValue
+//==============================
+
+XMP_StringPtr XML_Node::GetLeafContentValue() const
+{
+ if ( (! this->IsLeafContentNode()) || this->content.empty() ) return "";
+
+ return this->content[0]->value.c_str();
+
+} // XML_Node::GetLeafContentValue
+
+// =================================================================================================
+// XML_Node::SetLeafContentValue
+//==============================
+
+void XML_Node::SetLeafContentValue ( XMP_StringPtr newValue )
+{
+ XML_Node * valueNode;
+
+ if ( ! this->content.empty() ) {
+ valueNode = this->content[0];
+ } else {
+ valueNode = new XML_Node ( this, "", kCDataNode );
+ this->content.push_back ( valueNode );
+ }
+
+ valueNode->value = newValue;
+
+} // XML_Node::SetLeafContentValue
+
+// =================================================================================================
+// XML_Node::CountNamedElements
+//=============================
+
+size_t XML_Node::CountNamedElements ( XMP_StringPtr nsURI, XMP_StringPtr localName ) const
+{
+ size_t count = 0;
+
+ for ( size_t i = 0, vLim = this->content.size(); i < vLim; ++i ) {
+ const XML_Node & child = *this->content[i];
+ if ( child.ns != nsURI ) continue;
+ if ( strcmp ( localName, child.name.c_str()+child.nsPrefixLen ) != 0 ) continue;
+ ++count;
+ }
+
+ return count;
+
+} // XML_Node::CountNamedElements
+
+// =================================================================================================
+// XML_Node::GetNamedElement
+//==========================
+
+XML_NodePtr XML_Node::GetNamedElement ( XMP_StringPtr nsURI, XMP_StringPtr localName, size_t which /* = 0 */ )
+{
+
+ for ( size_t i = 0, vLim = this->content.size(); i < vLim; ++i ) {
+ XML_Node * childPtr = this->content[i];
+ if ( childPtr->ns != nsURI ) continue;
+ if ( strcmp ( localName, childPtr->name.c_str()+childPtr->nsPrefixLen ) != 0 ) continue;
+ if ( which == 0 ) return childPtr;
+ --which;
+ }
+
+ return 0; /// Not found.
+
+} // XML_Node::GetNamedElement
+
+// =================================================================================================
+// DumpNodeList
+// ============
+
+static const char * kNodeKinds[] = { "root", "elem", "attr", "cdata", "pi" };
+
+static void DumpNodeList ( std::string * buffer, const XML_NodeVector & list, int indent )
+{
+
+ for ( size_t i = 0, limit = list.size(); i < limit; ++i ) {
+
+ const XML_Node * node = list[i];
+
+ for ( int t = indent; t > 0; --t ) *buffer += " ";
+ if ( node->IsWhitespaceNode() ) {
+ *buffer += "-- whitespace --\n";
+ continue;
+ }
+
+ *buffer += node->name;
+ *buffer += " - ";
+ *buffer += kNodeKinds[node->kind];
+ if ( ! node->value.empty() ) {
+ *buffer += ", value=\"";
+ *buffer += node->value;
+ *buffer += "\"";
+ }
+ if ( ! node->ns.empty() ) {
+ *buffer += ", ns=\"";
+ *buffer += node->ns;
+ *buffer += "\"";
+ }
+ if ( node->nsPrefixLen != 0 ) {
+ *buffer += ", prefixLen=";
+ char numBuf [20];
+ snprintf ( numBuf, sizeof(numBuf), "%d", node->nsPrefixLen );
+ *buffer += numBuf;
+ }
+ *buffer += "\n";
+
+ if ( ! node->attrs.empty() ) {
+ for ( int t = indent+1; t > 0; --t ) *buffer += " ";
+ *buffer += "attrs:\n";
+ DumpNodeList ( buffer, node->attrs, indent+2 );
+ }
+
+ if ( ! node->content.empty() ) {
+ DumpNodeList ( buffer, node->content, indent+1 );
+ }
+
+ }
+
+} // DumpNodeList
+
+// =================================================================================================
+// XML_Node::Dump
+//===============
+
+void XML_Node::Dump ( std::string * buffer )
+{
+
+ *buffer = "Dump of XML_Node tree\n";
+
+ *buffer += "Root info: name=\"";
+ *buffer += this->name;
+ *buffer += "\", value=\"";
+ *buffer += this->value;
+ *buffer += "\", ns=\"";
+ *buffer += this->ns;
+ *buffer += "\", kind=";
+ *buffer += kNodeKinds[this->kind];
+ *buffer += "\n";
+
+ if ( ! this->attrs.empty() ) {
+ *buffer += " attrs:\n";
+ DumpNodeList ( buffer, this->attrs, 2 );
+ }
+ *buffer += "\n";
+
+ DumpNodeList ( buffer, this->content, 0 );
+
+} // XML_Node::Dump
+
+// =================================================================================================
+// SerializeOneNode
+// ================
+
+static void SerializeOneNode ( std::string * buffer, const XML_Node & node )
+{
+ size_t i, limit;
+ XMP_StringPtr namePtr = node.name.c_str();
+ if ( XMP_LitNMatch ( namePtr, "_dflt_:", 7 ) ) namePtr += 7; // Hack for default namespaces.
+
+ switch ( node.kind ) {
+
+ case kElemNode:
+ *buffer += '<';
+ *buffer += namePtr;
+ for ( i = 0, limit = node.attrs.size(); i < limit; ++i ) {
+ SerializeOneNode ( buffer, *node.attrs[i] );
+ }
+ if ( node.content.empty() ) {
+ *buffer += "/>";
+ } else {
+ *buffer += '>';
+ for ( i = 0, limit = node.content.size(); i < limit; ++i ) {
+ SerializeOneNode ( buffer, *node.content[i] );
+ }
+ *buffer += "</";
+ *buffer += namePtr;
+ *buffer += '>';
+ }
+ break;
+
+ case kAttrNode:
+ *buffer += ' ';
+ *buffer += namePtr;
+ *buffer += "=\"";
+ *buffer += node.value;
+ *buffer += '"';
+ break;
+
+ case kCDataNode:
+ *buffer += node.value;
+ break;
+
+ case kPINode:
+ *buffer += node.value; // *** Note that we're dropping PIs during the Expat parse.
+ break;
+
+ }
+
+} // SerializeOneNode
+
+// =================================================================================================
+// CollectNamespaceDecls
+// =====================
+
+typedef std::map < std::string, std::string > NamespaceMap;
+
+static void CollectNamespaceDecls ( NamespaceMap * nsMap, const XML_Node & node )
+{
+ size_t i, limit;
+
+ if ( ! node.ns.empty() ) {
+ size_t nameMid = 0;
+ while ( node.name[nameMid] != ':' ) ++nameMid;
+ std::string prefix = node.name.substr ( 0, nameMid );
+ (*nsMap)[prefix] = node.ns;
+ }
+
+ if ( node.kind == kElemNode ) {
+
+ for ( i = 0, limit = node.attrs.size(); i < limit; ++i ) {
+ CollectNamespaceDecls ( nsMap, *node.attrs[i] );
+ }
+
+ for ( i = 0, limit = node.content.size(); i < limit; ++i ) {
+ const XML_Node & content = *node.content[i];
+ if ( content.kind == kElemNode ) CollectNamespaceDecls ( nsMap, content );
+ }
+
+ }
+
+} // CollectNamespaceDecls
+
+// =================================================================================================
+// XML_Node::Serialize
+//====================
+
+void XML_Node::Serialize ( std::string * buffer )
+{
+ buffer->erase();
+
+ if ( this->kind != kRootNode ) {
+
+ SerializeOneNode ( buffer, *this );
+
+ } else {
+
+ // Do the outermost level here, in order to add the XML version and namespace declarations.
+
+ *buffer += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+
+ for ( size_t outer = 0, oLimit = this->content.size(); outer < oLimit; ++outer ) {
+
+ const XML_Node & node = *this->content[outer];
+
+ if ( node.kind != kElemNode ) {
+
+ SerializeOneNode ( buffer, node );
+
+ } else {
+
+ XMP_StringPtr namePtr = node.name.c_str();
+ if ( XMP_LitNMatch ( namePtr, "_dflt_:", 7 ) ) namePtr += 7; // Hack for default namespaces.
+
+ *buffer += '<';
+ *buffer += namePtr;
+
+ NamespaceMap nsMap;
+ CollectNamespaceDecls ( &nsMap, node );
+ NamespaceMap::iterator nsDecl = nsMap.begin();
+ NamespaceMap::iterator nsEnd = nsMap.end();
+ for ( ; nsDecl != nsEnd; ++nsDecl ) {
+ const std::string & prefix = nsDecl->first;
+ *buffer += " xmlns";
+ if ( prefix != "_dflt_" ) { *buffer += ':'; *buffer += prefix; }
+ *buffer += "=\"";
+ *buffer += nsDecl->second;
+ *buffer += '"';
+ }
+
+ for ( size_t attr = 0, aLimit = node.attrs.size(); attr < aLimit; ++attr ) {
+ SerializeOneNode ( buffer, *node.attrs[attr] );
+ }
+
+ if ( node.content.empty() ) {
+ *buffer += "/>";
+ } else {
+ *buffer += '>';
+ for ( size_t child = 0, cLimit = node.content.size(); child < cLimit; ++child ) {
+ SerializeOneNode ( buffer, *node.content[child] );
+ }
+ *buffer += "</";
+ *buffer += namePtr;
+ *buffer += '>';
+ }
+
+ }
+
+ }
+
+ }
+
+
+} // XML_Node::Serialize
+
+// =================================================================================================
+// XML_Node::RemoveAttrs
+//======================
+
+void XML_Node::RemoveAttrs()
+{
+
+ for ( size_t i = 0, vLim = this->attrs.size(); i < vLim; ++i ) delete this->attrs[i];
+ this->attrs.clear();
+
+} // XML_Node::RemoveAttrs
+
+// =================================================================================================
+// XML_Node::RemoveContent
+//========================
+
+void XML_Node::RemoveContent()
+{
+
+ for ( size_t i = 0, vLim = this->content.size(); i < vLim; ++i ) delete this->content[i];
+ this->content.clear();
+
+} // XML_Node::RemoveContent
+
+// =================================================================================================
+// XML_Node::ClearNode
+//====================
+
+void XML_Node::ClearNode()
+{
+
+ this->kind = 0;
+ this->ns.erase();
+ this->name.erase();
+ this->value.erase();
+
+ this->RemoveAttrs();
+ this->RemoveContent();
+
+} // XML_Node::ClearNode
+
+// =================================================================================================
diff --git a/third-party/MD5/MD5.cpp b/third-party/MD5/MD5.cpp
index b0aca6d..728455c 100644
--- a/third-party/MD5/MD5.cpp
+++ b/third-party/MD5/MD5.cpp
@@ -1,5 +1,6 @@
#include "MD5.h"
+#include <cassert>
#include <cstring>
using namespace std;
@@ -148,7 +149,7 @@ void MD5Update ( MD5_CTX *context, /* context */
*/
if (inputLen >= partLen) {
- std::memcpy (&context->buffer[index], input, partLen);
+ std::memcpy (&context->buffer[index], input, partLen); // AUDIT: From public MD5 code, assumed safe.
MD5Transform (context->state, context->buffer);
for (i = partLen; i + 63 < inputLen; i += 64)
@@ -160,7 +161,7 @@ void MD5Update ( MD5_CTX *context, /* context */
i = 0;
/* Buffer remaining input */
- std::memcpy (&context->buffer[index], &input[i], inputLen-i);
+ std::memcpy (&context->buffer[index], &input[i], inputLen-i); // AUDIT: From public MD5 code, assumed safe.
}
@@ -193,7 +194,8 @@ void MD5Final ( unsigned char digest[16], /* message digest */
/* Zeroize sensitive information.
*/
- memset (context, 0, sizeof (*context));
+ assert ( sizeof(*context) == sizeof(MD5_CTX) );
+ memset ( context, 0, sizeof (*context) ); // AUDIT: Safe, using sizeof destination.
}
/* MD5 basic transformation. Transforms state based on block.
diff --git a/third-party/QTDevWin/ReadMe.txt b/third-party/QTDevWin/ReadMe.txt
index 9ec8657..a8d5b22 100644
--- a/third-party/QTDevWin/ReadMe.txt
+++ b/third-party/QTDevWin/ReadMe.txt
@@ -1,12 +1,12 @@
-The XMP Files handler for .mov files uses QuickTime.
-This will always be available for build and use on Macintosh.
-For Windows, Apple's QuickTime SDK version 7 and above is needed to build XMP Files
-and the public QuickTime Player is needed in order to use XMPFiles for .mov files.
-The QuickTime Player also installs the necessary QuickTime library.
-
-To build XMP Files for Windows, first obtain a copy of the QuickTime SDK for Windows from
- http://developer.apple.com/sdk/
-
-Unpack the SDK to any convenient location. Copy the contained CIncludes and Libraries folders
-to the XMP development tree under .../third-party/QTWinDev.
-That is, the CIncludes and Libraries folders should appear as siblings of this ReadMe.txt file.
+The XMP Files handler for .mov files uses QuickTime.
+This will always be available for build and use on Macintosh.
+For Windows, Apple's QuickTime SDK version 7 and above is needed to build XMP Files
+and the public QuickTime Player is needed in order to use XMPFiles for .mov files.
+The QuickTime Player also installs the necessary QuickTime library.
+
+To build XMP Files for Windows, first obtain a copy of the QuickTime SDK for Windows from
+ http://developer.apple.com/sdk/
+
+Unpack the SDK to any convenient location. Copy the contained CIncludes and Libraries folders
+to the XMP development tree under .../third-party/QTWinDev.
+That is, the CIncludes and Libraries folders should appear as siblings of this ReadMe.txt file.
diff --git a/third-party/expat/ReadMe.txt b/third-party/expat/ReadMe.txt
index 7cfef15..52859bd 100644
--- a/third-party/expat/ReadMe.txt
+++ b/third-party/expat/ReadMe.txt
@@ -1,38 +1,38 @@
-The XMP Toolkit needs an external XML parser. The source from Adobe is written to use Expat,
-although adapters for other parsers can easily be written. The most recent version of Expat used
-with XMP is 2.0.0. To use Expat:
-
-1. Obtain a copy of the Expat distribution. One good place is SourceForge:
- http://sourceforge.net/projects/expat/
-
-2. Place Expat's lib directory within .../third-party/expat. I.e. as a sibling of this file.
-
-For Expat version 2.0.0 the contents of .../third-party/expat/lib are:
-
- amigaconfig.h
- ascii.h
- asciitab.h
- expat.dsp
- expat.h
- expatw.dsp
- expatw_static.dsp
- expat_external.h
- expat_static.dsp
- iasciitab.h
- internal.h
- latin1tab.h
- libexpat.def
- libexpatw.def
- macconfig.h
- Makefile.MPW
- nametab.h
- utf8tab.h
- winconfig.h
- xmlparse.c
- xmlrole.c
- xmlrole.h
- xmltok.c
- xmltok.h
- xmltok_impl.c
- xmltok_impl.h
- xmltok_ns.c
+The XMP Toolkit needs an external XML parser. The source from Adobe is written to use Expat,
+although adapters for other parsers can easily be written. The most recent version of Expat used
+with XMP is 2.0.0. To use Expat:
+
+1. Obtain a copy of the Expat distribution. One good place is SourceForge:
+ http://sourceforge.net/projects/expat/
+
+2. Place Expat's lib directory within .../third-party/expat. I.e. as a sibling of this file.
+
+For Expat version 2.0.0 the contents of .../third-party/expat/lib are:
+
+ amigaconfig.h
+ ascii.h
+ asciitab.h
+ expat.dsp
+ expat.h
+ expatw.dsp
+ expatw_static.dsp
+ expat_external.h
+ expat_static.dsp
+ iasciitab.h
+ internal.h
+ latin1tab.h
+ libexpat.def
+ libexpatw.def
+ macconfig.h
+ Makefile.MPW
+ nametab.h
+ utf8tab.h
+ winconfig.h
+ xmlparse.c
+ xmlrole.c
+ xmlrole.h
+ xmltok.c
+ xmltok.h
+ xmltok_impl.c
+ xmltok_impl.h
+ xmltok_ns.c
diff --git a/third-party/zlib/ReadMe.txt b/third-party/zlib/ReadMe.txt
new file mode 100755
index 0000000..75b93ac
--- /dev/null
+++ b/third-party/zlib/ReadMe.txt
@@ -0,0 +1,13 @@
+The XMP Toolkit SDK needs zlib.
+This release uses zlib Version 1.2.3
+
+To get zlib:
+
+1. Obtain a copy of the zlib source code (not the compiled dll)
+ from http://www.zlib.net/
+ (download links at the time of writing were at the bottom)
+
+2. Place all top-level .c and .h files of the tar/zip you downloaded
+ directly in .../third-party/zlib
+
+