#ifndef __XMPIterator_hpp__ #define __XMPIterator_hpp__ // ================================================================================================= // Copyright 2003 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 "public/include/XMP_Environment.h" #include "public/include/XMP_Const.h" #include "XMPMeta.hpp" // ================================================================================================= struct IterNode; typedef std::vector < IterNode > IterOffspring; typedef IterOffspring::iterator IterPos; typedef std::pair < IterPos, IterPos > IterPosPair; typedef std::vector < IterPosPair > IterPosStack; enum { // Values for the visitStage field, used to decide how to proceed past a node. kIter_BeforeVisit = 0, // Have not visited this node at all. kIter_VisitSelf = 1, // Have visited this node and returned its value/options portion. kIter_VisitQualifiers = 2, // In the midst of visiting this node's qualifiers. kIter_VisitChildren = 3 // In the midst of visiting this node's children. }; struct IterNode { XMP_OptionBits options; XMP_VarString fullPath; size_t leafOffset; IterOffspring children, qualifiers; XMP_Uns8 visitStage; #if 0 // *** XMP_DebugBuild XMP_StringPtr _pathPtr, _leafPtr; // *** Not working, need operator=? #endif IterNode() : options(0), leafOffset(0), visitStage(kIter_BeforeVisit) { #if 0 // *** XMP_DebugBuild _pathPtr = _leafPtr = 0; #endif }; IterNode ( XMP_OptionBits _options, const XMP_VarString& _fullPath, size_t _leafOffset ) : options(_options), fullPath(_fullPath), leafOffset(_leafOffset), visitStage(kIter_BeforeVisit) { #if 0 // *** XMP_DebugBuild _pathPtr = fullPath.c_str(); _leafPtr = _pathPtr + leafOffset; #endif }; }; struct IterInfo { XMP_OptionBits options; const XMPMeta * xmpObj; XMP_VarString currSchema; IterPos currPos, endPos; IterPosStack ancestors; IterNode tree; #if 0 // *** XMP_DebugBuild XMP_StringPtr _schemaPtr; // *** Not working, need operator=? #endif IterInfo() : options(0), xmpObj(0) { #if 0 // *** XMP_DebugBuild _schemaPtr = 0; #endif }; IterInfo ( XMP_OptionBits _options, const XMPMeta * _xmpObj ) : options(_options), xmpObj(_xmpObj) { #if 0 // *** XMP_DebugBuild _schemaPtr = 0; #endif }; }; // ================================================================================================= class XMPIterator { public: static bool Initialize(); // ! For internal use only! static void Terminate() RELEASE_NO_THROW; // ! For internal use only! XMPIterator ( const XMPMeta & xmpObj, // Construct a property iterator. XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options ); XMPIterator ( XMP_StringPtr schemaNS, // Construct a table iterator. XMP_StringPtr propName, XMP_OptionBits options ); virtual ~XMPIterator() RELEASE_NO_THROW; bool Next ( XMP_StringPtr * schemaNS, XMP_StringLen * nsSize, XMP_StringPtr * propPath, XMP_StringLen * pathSize, XMP_StringPtr * propValue, XMP_StringLen * valueSize, XMP_OptionBits * propOptions ); void Skip ( XMP_OptionBits options ); // ! Expose so that wrappers and file static functions can see the data. XMP_Int32 clientRefs; // ! Must be signed to allow decrement from 0. XMP_ReadWriteLock lock; IterInfo info; private: // ! These are hidden on purpose: XMPIterator() : clientRefs(0) { XMP_Throw ( "Call to hidden constructor", kXMPErr_InternalFailure ); }; XMPIterator ( const XMPIterator & /* original */ ) : clientRefs(0) { XMP_Throw ( "Call to hidden constructor", kXMPErr_InternalFailure ); }; void operator= ( const XMPIterator & /* rhs */ ) { XMP_Throw ( "Call to hidden operator=", kXMPErr_InternalFailure ); }; }; // ================================================================================================= #endif // __XMPIterator_hpp__