1 /*****************************************************************************/
2 // Copyright 2006-2019 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 #ifndef __dng_xmp_sdk__
10 #define __dng_xmp_sdk__
11 
12 /*****************************************************************************/
13 
14 #include "dng_auto_ptr.h"
15 #include "dng_classes.h"
16 #include "dng_flags.h"
17 #include "dng_types.h"
18 
19 /*****************************************************************************/
20 
21 extern const char *XMP_NS_TIFF;
22 extern const char *XMP_NS_EXIF;
23 extern const char *XMP_NS_EXIFEX;
24 extern const char *XMP_NS_PHOTOSHOP;
25 extern const char *XMP_NS_XAP;
26 extern const char *XMP_NS_XAP_RIGHTS;
27 extern const char *XMP_NS_DC;
28 extern const char *XMP_NS_XMP_NOTE;
29 extern const char *XMP_NS_MM;
30 
31 extern const char *XMP_NS_CRS;
32 extern const char *XMP_NS_CRSS;
33 extern const char *XMP_NS_CRD;
34 
35 extern const char *XMP_NS_LCP;
36 
37 extern const char *XMP_NS_AUX;
38 
39 extern const char *XMP_NS_IPTC;
40 extern const char *XMP_NS_IPTC_EXT;
41 
42 extern const char *XMP_NS_CRX;
43 
44 extern const char *XMP_NS_DNG;
45 
46 extern const char *XMP_NS_PANO;
47 
48 /*****************************************************************************/
49 
50 class dng_xmp_private;
51 
52 /*****************************************************************************/
53 
54 typedef bool (IteratePathsCallback) (const char *ns,
55 			  				   	     const char *path,
56 			  				         void *callbackData);
57 
58 /*****************************************************************************/
59 
60 struct dng_xmp_namespace
61 	{
62 	const char * fullName;
63 	const char * shortName;
64 	};
65 
66 /*****************************************************************************/
67 
68 class dng_xmp_sdk
69 	{
70 
71 	private:
72 
73 		dng_xmp_private *fPrivate;
74 
75 	public:
76 
77 		dng_xmp_sdk ();
78 
79 		dng_xmp_sdk (const dng_xmp_sdk &sdk);
80 
81 		virtual ~dng_xmp_sdk ();
82 
83 		static void InitializeSDK (dng_xmp_namespace * extraNamespaces = NULL,
84 								   const char *software = NULL);
85 
86 		static void TerminateSDK ();
87 
88 		bool HasMeta () const;
89 
RequireMeta()90         void RequireMeta ()
91             {
92             NeedMeta ();
93             }
94 
95 		void * GetPrivateMeta ();
96 
97 		void Parse (dng_host &host,
98 					const char *buffer,
99 				    uint32 count);
100 
101 		bool Exists (const char *ns,
102 					 const char *path) const;
103 
104 		void AppendArrayItem (const char *ns,
105 							  const char *arrayName,
106 							  const char *itemValue,
107 							  bool isBag = true,
108 							  bool propIsStruct = false);
109 
110 		int32 CountArrayItems (const char *ns,
111 		                       const char *path) const;
112 
113 		bool HasNameSpace (const char *ns) const;
114 
115 		void Remove (const char *ns,
116 				     const char *path);
117 
118 		void RemoveProperties (const char *ns);
119 
120 		bool IsEmptyString (const char *ns,
121 					        const char *path);
122 
123 		bool IsEmptyArray (const char *ns,
124 					       const char *path);
125 
126 		void ComposeArrayItemPath (const char *ns,
127 								   const char *arrayName,
128 								   int32 itemNumber,
129 								   dng_string &s) const;
130 
131 		void ComposeStructFieldPath (const char *ns,
132 								     const char *structName,
133 								     const char *fieldNS,
134 									 const char *fieldName,
135 								     dng_string &s) const;
136 
137 		bool GetNamespacePrefix (const char *uri,
138 								 dng_string &s) const;
139 
140 		bool GetString (const char *ns,
141 				   		const char *path,
142 				   		dng_string &s) const;
143 
144 		void ValidateStringList (const char *ns,
145 								 const char *path);
146 
147 		bool GetStringList (const char *ns,
148 							const char *path,
149 							dng_string_list &list) const;
150 
151 		bool GetAltLangDefault (const char *ns,
152 								const char *path,
153 								dng_string &s,
154                                 bool silent = false) const;
155 
156 		bool GetLocalString (const char *ns,
157 							 const char *path,
158 							 dng_local_string &s) const;
159 
160 		bool GetStructField (const char *ns,
161 							 const char *path,
162 							 const char *fieldNS,
163 							 const char *fieldName,
164 							 dng_string &s) const;
165 
166 		void Set (const char *ns,
167 				  const char *path,
168 				  const char *text);
169 
170 		void SetString (const char *ns,
171 				  		const char *path,
172 				  		const dng_string &s);
173 
174 		void SetStringList (const char *ns,
175 				  		    const char *path,
176 				  		    const dng_string_list &list,
177 				  		    bool isBag);
178 
179 		void SetAltLangDefault (const char *ns,
180 								const char *path,
181 								const dng_string &s);
182 
183         void SetLocalString (const char *ns,
184                              const char *path,
185                              const dng_local_string &s);
186 
187 		void SetStructField (const char *ns,
188 							 const char *path,
189 							 const char *fieldNS,
190 							 const char *fieldName,
191 							 const char *text);
192 
193 		void DeleteStructField (const char *ns,
194 								const char *structName,
195 								const char *fieldNS,
196 								const char *fieldName);
197 
198 		dng_memory_block * Serialize (dng_memory_allocator &allocator,
199 									  bool asPacket,
200 									  uint32 targetBytes,
201 									  uint32 padBytes,
202 									  bool forJPEG,
203 									  bool compact) const;
204 
205 		void PackageForJPEG (dng_memory_allocator &allocator,
206 							 AutoPtr<dng_memory_block> &stdBlock,
207 							 AutoPtr<dng_memory_block> &extBlock,
208 							 dng_string &extDigest) const;
209 
210 		void MergeFromJPEG (const dng_xmp_sdk *xmp);
211 
212 		void ReplaceXMP (dng_xmp_sdk *xmp);
213 
214 		bool IteratePaths (IteratePathsCallback *callback,
215 						   void *callbackData = NULL,
216 						   const char *startNS = 0,
217 						   const char *startingPath = 0);
218 
219 		#if qDNGXMPDocOps
220 
221 		void DocOpsOpenXMP (const char *srcMIME);
222 
223 		void DocOpsPrepareForSave (const char *srcMIME,
224 								   const char *dstMIME,
225 								   bool newPath = true);
226 
227 		void DocOpsUpdateMetadata (const char *srcMIME);
228 
229 		#endif
230 
231 	private:
232 
233 		void ClearMeta ();
234 
235 		void MakeMeta ();
236 
237 		void NeedMeta ();
238 
239 		// Hidden assignment operator.
240 
241 		dng_xmp_sdk & operator= (const dng_xmp_sdk &sdk);
242 
243 	};
244 
245 /*****************************************************************************/
246 
247 #endif
248 
249 /*****************************************************************************/
250