1 #ifndef __XMPMeta_hpp__ 2 #define __XMPMeta_hpp__ 3 4 // ================================================================================================= 5 // Copyright 2002-2008 Adobe Systems Incorporated 6 // All Rights Reserved. 7 // 8 // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms 9 // of the Adobe license agreement accompanying it. 10 // ================================================================================================= 11 12 #include "XMP_Environment.h" 13 #include "XMP_Const.h" 14 #include "XMPCore_Impl.hpp" 15 #include "XMLParserAdapter.hpp" 16 17 // ------------------------------------------------------------------------------------------------- 18 19 #ifndef DumpXMLParseTree 20 #define DumpXMLParseTree 0 21 #endif 22 23 extern XMP_VarString * xdefaultName; 24 25 class XMPIterator; 26 class XMPUtils; 27 28 // ------------------------------------------------------------------------------------------------- 29 30 class XMPMeta { 31 public: 32 33 static void 34 GetVersionInfo ( XMP_VersionInfo * info ); 35 36 static bool 37 Initialize(); 38 static void 39 Terminate() RELEASE_NO_THROW; 40 41 static void 42 Unlock ( XMP_OptionBits options ); 43 44 // --------------------------------------------------------------------------------------------- 45 46 XMPMeta(); 47 48 virtual ~XMPMeta() RELEASE_NO_THROW; 49 50 // --------------------------------------------------------------------------------------------- 51 52 static XMP_OptionBits 53 GetGlobalOptions(); 54 55 static void 56 SetGlobalOptions ( XMP_OptionBits options ); 57 58 // --------------------------------------------------------------------------------------------- 59 60 static XMP_Status 61 DumpNamespaces ( XMP_TextOutputProc outProc, 62 void * refCon ); 63 64 static XMP_Status 65 DumpAliases ( XMP_TextOutputProc outProc, 66 void * refCon ); 67 68 // --------------------------------------------------------------------------------------------- 69 70 static void 71 RegisterNamespace ( XMP_StringPtr namespaceURI, 72 XMP_StringPtr prefix ); 73 74 static bool 75 GetNamespacePrefix ( XMP_StringPtr namespaceURI, 76 XMP_StringPtr * namespacePrefix, 77 XMP_StringLen * prefixSize ); 78 79 static bool 80 GetNamespaceURI ( XMP_StringPtr namespacePrefix, 81 XMP_StringPtr * namespaceURI, 82 XMP_StringLen * uriSize ); 83 84 static void 85 DeleteNamespace ( XMP_StringPtr namespaceURI ); 86 87 // --------------------------------------------------------------------------------------------- 88 89 static void 90 RegisterAlias ( XMP_StringPtr aliasNS, 91 XMP_StringPtr aliasProp, 92 XMP_StringPtr actualNS, 93 XMP_StringPtr actualProp, 94 XMP_OptionBits arrayForm ); 95 96 static bool 97 ResolveAlias ( XMP_StringPtr aliasNS, 98 XMP_StringPtr aliasProp, 99 XMP_StringPtr * actualNS, 100 XMP_StringLen * nsSize, 101 XMP_StringPtr * actualProp, 102 XMP_StringLen * propSize, 103 XMP_OptionBits * arrayForm ); 104 105 static void 106 DeleteAlias ( XMP_StringPtr aliasNS, 107 XMP_StringPtr aliasProp ); 108 109 static void 110 RegisterStandardAliases ( XMP_StringPtr schemaNS ); 111 112 // --------------------------------------------------------------------------------------------- 113 114 void 115 UnlockObject ( XMP_OptionBits options ) const; 116 117 // --------------------------------------------------------------------------------------------- 118 119 bool 120 GetProperty ( XMP_StringPtr schemaNS, 121 XMP_StringPtr propName, 122 XMP_StringPtr * propValue, 123 XMP_StringLen * valueSize, 124 XMP_OptionBits * options ) const; 125 126 bool 127 GetArrayItem ( XMP_StringPtr schemaNS, 128 XMP_StringPtr arrayName, 129 XMP_Index itemIndex, 130 XMP_StringPtr * itemValue, 131 XMP_StringLen * valueSize, 132 XMP_OptionBits * options ) const; 133 134 bool 135 GetStructField ( XMP_StringPtr schemaNS, 136 XMP_StringPtr structName, 137 XMP_StringPtr fieldNS, 138 XMP_StringPtr fieldName, 139 XMP_StringPtr * fieldValue, 140 XMP_StringLen * valueSize, 141 XMP_OptionBits * options ) const; 142 143 bool 144 GetQualifier ( XMP_StringPtr schemaNS, 145 XMP_StringPtr propName, 146 XMP_StringPtr qualNS, 147 XMP_StringPtr qualName, 148 XMP_StringPtr * qualValue, 149 XMP_StringLen * valueSize, 150 XMP_OptionBits * options ) const; 151 152 // --------------------------------------------------------------------------------------------- 153 154 void 155 SetProperty ( XMP_StringPtr schemaNS, 156 XMP_StringPtr propName, 157 XMP_StringPtr propValue, 158 XMP_OptionBits options ); 159 160 void 161 SetArrayItem ( XMP_StringPtr schemaNS, 162 XMP_StringPtr arrayName, 163 XMP_Index itemIndex, 164 XMP_StringPtr itemValue, 165 XMP_OptionBits options ); 166 167 void 168 AppendArrayItem ( XMP_StringPtr schemaNS, 169 XMP_StringPtr arrayName, 170 XMP_OptionBits arrayOptions, 171 XMP_StringPtr itemValue, 172 XMP_OptionBits options ); 173 174 void 175 SetStructField ( XMP_StringPtr schemaNS, 176 XMP_StringPtr structName, 177 XMP_StringPtr fieldNS, 178 XMP_StringPtr fieldName, 179 XMP_StringPtr fieldValue, 180 XMP_OptionBits options ); 181 182 void 183 SetQualifier ( XMP_StringPtr schemaNS, 184 XMP_StringPtr propName, 185 XMP_StringPtr qualNS, 186 XMP_StringPtr qualName, 187 XMP_StringPtr qualValue, 188 XMP_OptionBits options ); 189 190 // --------------------------------------------------------------------------------------------- 191 192 void 193 DeleteProperty ( XMP_StringPtr schemaNS, 194 XMP_StringPtr propName ); 195 196 void 197 DeleteArrayItem ( XMP_StringPtr schemaNS, 198 XMP_StringPtr arrayName, 199 XMP_Index itemIndex ); 200 201 void 202 DeleteStructField ( XMP_StringPtr schemaNS, 203 XMP_StringPtr structName, 204 XMP_StringPtr fieldNS, 205 XMP_StringPtr fieldName ); 206 207 void 208 DeleteQualifier ( XMP_StringPtr schemaNS, 209 XMP_StringPtr propName, 210 XMP_StringPtr qualNS, 211 XMP_StringPtr qualName ); 212 213 // --------------------------------------------------------------------------------------------- 214 215 bool 216 DoesPropertyExist ( XMP_StringPtr schemaNS, 217 XMP_StringPtr propName ) const; 218 219 bool 220 DoesArrayItemExist ( XMP_StringPtr schemaNS, 221 XMP_StringPtr arrayName, 222 XMP_Index itemIndex ) const; 223 224 bool 225 DoesStructFieldExist ( XMP_StringPtr schemaNS, 226 XMP_StringPtr structName, 227 XMP_StringPtr fieldNS, 228 XMP_StringPtr fieldName ) const; 229 230 bool 231 DoesQualifierExist ( XMP_StringPtr schemaNS, 232 XMP_StringPtr propName, 233 XMP_StringPtr qualNS, 234 XMP_StringPtr qualName ) const; 235 236 // --------------------------------------------------------------------------------------------- 237 238 bool 239 GetLocalizedText ( XMP_StringPtr schemaNS, 240 XMP_StringPtr altTextName, 241 XMP_StringPtr genericLang, 242 XMP_StringPtr specificLang, 243 XMP_StringPtr * actualLang, 244 XMP_StringLen * langSize, 245 XMP_StringPtr * itemValue, 246 XMP_StringLen * valueSize, 247 XMP_OptionBits * options ) const; 248 249 void 250 SetLocalizedText ( XMP_StringPtr schemaNS, 251 XMP_StringPtr altTextName, 252 XMP_StringPtr genericLang, 253 XMP_StringPtr specificLang, 254 XMP_StringPtr itemValue, 255 XMP_OptionBits options ); 256 257 // --------------------------------------------------------------------------------------------- 258 259 bool 260 GetProperty_Bool ( XMP_StringPtr schemaNS, 261 XMP_StringPtr propName, 262 bool * propValue, 263 XMP_OptionBits * options ) const; 264 265 bool 266 GetProperty_Int ( XMP_StringPtr schemaNS, 267 XMP_StringPtr propName, 268 XMP_Int32 * propValue, 269 XMP_OptionBits * options ) const; 270 271 bool 272 GetProperty_Int64 ( XMP_StringPtr schemaNS, 273 XMP_StringPtr propName, 274 XMP_Int64 * propValue, 275 XMP_OptionBits * options ) const; 276 277 bool 278 GetProperty_Float ( XMP_StringPtr schemaNS, 279 XMP_StringPtr propName, 280 double * propValue, 281 XMP_OptionBits * options ) const; 282 283 bool 284 GetProperty_Date ( XMP_StringPtr schemaNS, 285 XMP_StringPtr propName, 286 XMP_DateTime * propValue, 287 XMP_OptionBits * options ) const; 288 289 // --------------------------------------------------------------------------------------------- 290 291 void 292 SetProperty_Bool ( XMP_StringPtr schemaNS, 293 XMP_StringPtr propName, 294 bool propValue, 295 XMP_OptionBits options ); 296 297 void 298 SetProperty_Int ( XMP_StringPtr schemaNS, 299 XMP_StringPtr propName, 300 XMP_Int32 propValue, 301 XMP_OptionBits options ); 302 303 void 304 SetProperty_Int64 ( XMP_StringPtr schemaNS, 305 XMP_StringPtr propName, 306 XMP_Int64 propValue, 307 XMP_OptionBits options ); 308 309 void 310 SetProperty_Float ( XMP_StringPtr schemaNS, 311 XMP_StringPtr propName, 312 double propValue, 313 XMP_OptionBits options ); 314 315 void 316 SetProperty_Date ( XMP_StringPtr schemaNS, 317 XMP_StringPtr propName, 318 const XMP_DateTime & propValue, 319 XMP_OptionBits options ); 320 321 // --------------------------------------------------------------------------------------------- 322 323 void 324 GetObjectName ( XMP_StringPtr * namePtr, 325 XMP_StringLen * nameLen ) const; 326 327 void 328 SetObjectName ( XMP_StringPtr name ); 329 330 XMP_OptionBits 331 GetObjectOptions() const; 332 333 void 334 SetObjectOptions ( XMP_OptionBits options ); 335 336 void 337 Sort(); 338 339 void 340 Erase(); 341 342 void 343 Clone ( XMPMeta * clone, XMP_OptionBits options ) const; 344 345 XMP_Index 346 CountArrayItems ( XMP_StringPtr schemaNS, 347 XMP_StringPtr arrayName ) const; 348 349 XMP_Status 350 DumpObject ( XMP_TextOutputProc outProc, 351 void * refCon ) const; 352 353 // --------------------------------------------------------------------------------------------- 354 355 void 356 ParseFromBuffer ( XMP_StringPtr buffer, 357 XMP_StringLen bufferSize, 358 XMP_OptionBits options ); 359 360 void 361 SerializeToBuffer ( XMP_StringPtr * rdfString, 362 XMP_StringLen * rdfSize, 363 XMP_OptionBits options, 364 XMP_StringLen padding, 365 XMP_StringPtr newline, 366 XMP_StringPtr indent, 367 XMP_Index baseIndent ) const; 368 369 // ============================================================================================= 370 371 // --------------------------------------------------------------------------------------------- 372 // - Everything is built out of standard nodes. Each node has a name, value, option flags, a 373 // vector of child nodes, and a vector of qualifier nodes. 374 // 375 // - The option flags are those passed to SetProperty and returned from GetProperty. They tell 376 // if the node is simple, a struct or an array; whether it has qualifiers, etc. 377 // 378 // - The name of the node is an XML qualified name, of the form "prefix:simple-name". Since we 379 // force all namespaces to be known and to have unique prefixes, this is semantically equivalent 380 // to using a URI and simple name pair. 381 // 382 // - Although the value part is only for leaf properties and the children part is only for 383 // structs and arrays, it is easier to simply have them in every node. This keeps things visible 384 // so that debugging is easier 385 // 386 // - The top level node children are the namespaces that contain properties, the next level are 387 // the top level properties, lower levels are the fields of structs or items of arrays. The name 388 // of the top level nodes is just the namespace prefix, with the colon terminator. The name of 389 // top level properties includes the namespace prefix. 390 // 391 // - Any property node, at any level, can have qualifiers. These are themselves general property 392 // nodes. And could in fact themselves have qualifiers! 393 394 // ! Expose the implementation so that file static functions can see the data. 395 396 XMP_Int32 clientRefs; // ! Must be signed to allow decrement from 0. 397 XMP_Int32 prevTkVer; // Previous toolkit version as MMmmuubbb (major, minor, micro, build). 398 XMP_Node tree; 399 400 XMLParserAdapter * xmlParser; 401 402 friend class XMPIterator; 403 friend class XMPUtils; 404 405 private: 406 407 // ! These are hidden on purpose: XMPMeta(const XMPMeta &)408 XMPMeta ( const XMPMeta & /* original */ ) : clientRefs(0), prevTkVer(0), tree(XMP_Node(0,"",0)), xmlParser(0) 409 { XMP_Throw ( "Call to hidden constructor", kXMPErr_InternalFailure ); }; operator =(const XMPMeta &)410 void operator= ( const XMPMeta & /* rhs */ ) 411 { XMP_Throw ( "Call to hidden operator=", kXMPErr_InternalFailure ); }; 412 413 }; // class XMPMeta 414 415 416 // ================================================================================================= 417 418 #endif // __XMPMeta_hpp__ 419