Coverage Report

Created: 2025-11-16 07:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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__