/src/exiv2/xmpsdk/src/XMPIterator.hpp
Line | Count | Source |
1 | | #ifndef __XMPIterator_hpp__ |
2 | | #define __XMPIterator_hpp__ |
3 | | |
4 | | // ================================================================================================= |
5 | | // Copyright 2002-2007 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 "XMPMeta.hpp" |
15 | | |
16 | | // ================================================================================================= |
17 | | |
18 | | struct IterNode; |
19 | | typedef std::vector < IterNode > IterOffspring; |
20 | | typedef IterOffspring::iterator IterPos; |
21 | | |
22 | | typedef std::pair < IterPos, IterPos > IterPosPair; |
23 | | typedef std::vector < IterPosPair > IterPosStack; |
24 | | |
25 | | enum { // Values for the visitStage field, used to decide how to proceed past a node. |
26 | | kIter_BeforeVisit = 0, // Have not visited this node at all. |
27 | | kIter_VisitSelf = 1, // Have visited this node and returned its value/options portion. |
28 | | kIter_VisitQualifiers = 2, // In the midst of visiting this node's qualifiers. |
29 | | kIter_VisitChildren = 3 // In the midst of visiting this node's children. |
30 | | }; |
31 | | |
32 | | struct IterNode { |
33 | | |
34 | | XMP_OptionBits options; |
35 | | XMP_VarString fullPath; |
36 | | size_t leafOffset; |
37 | | IterOffspring children, qualifiers; |
38 | | XMP_Uns8 visitStage; |
39 | | #if 0 // *** XMP_DebugBuild |
40 | | XMP_StringPtr _pathPtr, _leafPtr; // *** Not working, need operator=? |
41 | | #endif |
42 | | |
43 | 9.59k | IterNode() : options(0), leafOffset(0), visitStage(kIter_BeforeVisit) |
44 | 9.59k | { |
45 | | #if 0 // *** XMP_DebugBuild |
46 | | _pathPtr = _leafPtr = 0; |
47 | | #endif |
48 | 9.59k | }; |
49 | | |
50 | | IterNode ( XMP_OptionBits _options, const XMP_VarString& _fullPath, size_t _leafOffset ) |
51 | 256k | : options(_options), fullPath(_fullPath), leafOffset(_leafOffset), visitStage(kIter_BeforeVisit) |
52 | 256k | { |
53 | | #if 0 // *** XMP_DebugBuild |
54 | | _pathPtr = fullPath.c_str(); |
55 | | _leafPtr = _pathPtr + leafOffset; |
56 | | #endif |
57 | 256k | }; |
58 | | |
59 | | }; |
60 | | |
61 | | struct IterInfo { |
62 | | |
63 | | XMP_OptionBits options; |
64 | | const XMPMeta * xmpObj; |
65 | | XMP_VarString currSchema; |
66 | | IterPos currPos, endPos; |
67 | | IterPosStack ancestors; |
68 | | IterNode tree; |
69 | | #if 0 // *** XMP_DebugBuild |
70 | | XMP_StringPtr _schemaPtr; // *** Not working, need operator=? |
71 | | #endif |
72 | | |
73 | | IterInfo() : options(0), xmpObj(0) |
74 | 0 | { |
75 | 0 | #if 0 // *** XMP_DebugBuild |
76 | 0 | _schemaPtr = 0; |
77 | 0 | #endif |
78 | 0 | }; |
79 | | |
80 | 9.59k | IterInfo ( XMP_OptionBits _options, const XMPMeta * _xmpObj ) : options(_options), xmpObj(_xmpObj) |
81 | 9.59k | { |
82 | | #if 0 // *** XMP_DebugBuild |
83 | | _schemaPtr = 0; |
84 | | #endif |
85 | 9.59k | }; |
86 | | |
87 | | }; |
88 | | |
89 | | // ================================================================================================= |
90 | | |
91 | | class XMPIterator { |
92 | | public: |
93 | | |
94 | | static bool |
95 | | Initialize(); // ! For internal use only! |
96 | | |
97 | | static void |
98 | | Terminate() RELEASE_NO_THROW; // ! For internal use only! |
99 | | |
100 | | static void |
101 | | Unlock ( XMP_OptionBits options ); |
102 | | |
103 | | XMPIterator ( const XMPMeta & xmpObj, // Construct a property iterator. |
104 | | XMP_StringPtr schemaNS, |
105 | | XMP_StringPtr propName, |
106 | | XMP_OptionBits options ); |
107 | | |
108 | | XMPIterator ( XMP_StringPtr schemaNS, // Construct a table iterator. |
109 | | XMP_StringPtr propName, |
110 | | XMP_OptionBits options ); |
111 | | |
112 | | virtual ~XMPIterator() RELEASE_NO_THROW; |
113 | | |
114 | | bool |
115 | | Next ( XMP_StringPtr * schemaNS, |
116 | | XMP_StringLen * nsSize, |
117 | | XMP_StringPtr * propPath, |
118 | | XMP_StringLen * pathSize, |
119 | | XMP_StringPtr * propValue, |
120 | | XMP_StringLen * valueSize, |
121 | | XMP_OptionBits * propOptions ); |
122 | | |
123 | | void |
124 | | Skip ( XMP_OptionBits options ); |
125 | | |
126 | | void |
127 | | UnlockIter ( XMP_OptionBits options ); |
128 | | |
129 | | // ! Expose so that wrappers and file static functions can see the data. |
130 | | |
131 | | XMP_Int32 clientRefs; // ! Must be signed to allow decrement from 0. |
132 | | IterInfo info; |
133 | | |
134 | | private: |
135 | | |
136 | | // ! These are hidden on purpose: |
137 | | XMPIterator() : clientRefs(0) |
138 | 0 | { XMP_Throw ( "Call to hidden constructor", kXMPErr_InternalFailure ); }; |
139 | | XMPIterator ( const XMPIterator & /* original */ ) : clientRefs(0) |
140 | 0 | { XMP_Throw ( "Call to hidden constructor", kXMPErr_InternalFailure ); }; |
141 | | void operator= ( const XMPIterator & /* rhs */ ) |
142 | 0 | { XMP_Throw ( "Call to hidden operator=", kXMPErr_InternalFailure ); }; |
143 | | |
144 | | }; |
145 | | |
146 | | // ================================================================================================= |
147 | | |
148 | | #endif // __XMPIterator_hpp__ |