1/*****************************************************************************/
2// Copyright 2006-2008 Adobe Systems Incorporated
3// All Rights Reserved.
4//
5// NOTICE: Adobe permits you to use, modify, and distribute this file in
6// accordance with the terms of the Adobe license agreement accompanying it.
7/*****************************************************************************/
8
9/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_iptc.h#1 $ */
10/* $DateTime: 2012/05/30 13:28:51 $ */
11/* $Change: 832332 $ */
12/* $Author: tknoll $ */
13
14/** \file
15 * Support for IPTC metadata within DNG files.
16 */
17
18/*****************************************************************************/
19
20#ifndef __dng_iptc__
21#define __dng_iptc__
22
23/*****************************************************************************/
24
25#include "dng_date_time.h"
26#include "dng_string.h"
27#include "dng_string_list.h"
28
29/*****************************************************************************/
30
31/// \brief Class for reading and holding IPTC metadata associated with a DNG file.
32///
33/// See the \ref spec_iptc "IPTC specification"
34/// for information on member fields of this class.
35
36class dng_iptc
37 {
38
39 public:
40
41 dng_string fTitle;
42
43 int32 fUrgency;
44
45 dng_string fCategory;
46
47 dng_string_list fSupplementalCategories;
48
49 dng_string_list fKeywords;
50
51 dng_string fInstructions;
52
53 dng_date_time_info fDateTimeCreated;
54
55 dng_date_time_info fDigitalCreationDateTime;
56
57 dng_string_list fAuthors;
58
59 dng_string fAuthorsPosition;
60
61 dng_string fCity;
62 dng_string fState;
63 dng_string fCountry;
64 dng_string fCountryCode;
65
66 dng_string fLocation;
67
68 dng_string fTransmissionReference;
69
70 dng_string fHeadline;
71
72 dng_string fCredit;
73
74 dng_string fSource;
75
76 dng_string fCopyrightNotice;
77
78 dng_string fDescription;
79 dng_string fDescriptionWriter;
80
81 protected:
82
83 enum DataSet
84 {
85 kRecordVersionSet = 0,
86 kObjectNameSet = 5,
87 kUrgencySet = 10,
88 kCategorySet = 15,
89 kSupplementalCategoriesSet = 20,
90 kKeywordsSet = 25,
91 kSpecialInstructionsSet = 40,
92 kDateCreatedSet = 55,
93 kTimeCreatedSet = 60,
94 kDigitalCreationDateSet = 62,
95 kDigitalCreationTimeSet = 63,
96 kBylineSet = 80,
97 kBylineTitleSet = 85,
98 kCitySet = 90,
99 kSublocationSet = 92,
100 kProvinceStateSet = 95,
101 kCountryCodeSet = 100,
102 kCountryNameSet = 101,
103 kOriginalTransmissionReferenceSet = 103,
104 kHeadlineSet = 105,
105 kCreditSet = 110,
106 kSourceSet = 115,
107 kCopyrightNoticeSet = 116,
108 kCaptionSet = 120,
109 kCaptionWriterSet = 122
110 };
111
112 enum CharSet
113 {
114 kCharSetUnknown = 0,
115 kCharSetUTF8 = 1
116 };
117
118 public:
119
120 dng_iptc ();
121
122 virtual ~dng_iptc ();
123
124 /// Test if IPTC metadata exists.
125 /// \retval true if no IPTC metadata exists for this DNG.
126
127 bool IsEmpty () const;
128
129 /// Test if IPTC metadata exists.
130 /// \retval true if IPTC metadata exists for this DNG.
131
132 bool NotEmpty () const
133 {
134 return !IsEmpty ();
135 }
136
137 /// Parse a complete block of IPTC data.
138 /// \param blockData The block of IPTC data.
139 /// \param blockSize Size in bytes of data block.
140 /// \param offsetInOriginalFile Used to enable certain file patching operations such as updating date/time in place.
141
142 void Parse (const void *blockData,
143 uint32 blockSize,
144 uint64 offsetInOriginalFile);
145
146 /// Serialize IPTC data to a memory block.
147 /// \param allocator Memory allocator used to acquire memory block.
148 /// \param padForTIFF Forces length of block to be a multiple of four bytes in accordance with TIFF standard.
149 /// \retval Memory block
150
151 dng_memory_block * Spool (dng_memory_allocator &allocator,
152 bool padForTIFF);
153
154 protected:
155
156 void ParseString (dng_stream &stream,
157 dng_string &s,
158 CharSet charSet);
159
160 void SpoolString (dng_stream &stream,
161 const dng_string &s,
162 uint8 dataSet,
163 uint32 maxChars,
164 CharSet charSet);
165
166 };
167
168/*****************************************************************************/
169
170#endif
171
172/*****************************************************************************/
173