You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

206 lines
10 KiB
C++

#ifndef __TXMPIterator_hpp__
#define __TXMPIterator_hpp__ 1
#if ( ! __XMP_hpp__ )
#error "Do not directly include, use XMPSDK.hpp"
#endif
// =================================================================================================
// ADOBE SYSTEMS INCORPORATED
// Copyright 2002-2007 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.
// =================================================================================================
// ================================================================================================
/// \file TXMPIterator.hpp
/// \brief Template class for the XMP Toolkit iteration services.
///
/// This template class provides iteration services for the XMP Toolkit. It should be instantiated
/// with a string class such as <tt>std::string</tt>. Please read the general usage notes for
/// information on the overall architecture of the XMP API.
// ================================================================================================
// ================================================================================================
/// \class TXMPIterator TXMPIterator.hpp
/// \brief Template class for the XMP Toolkit iteration services.
///
/// This template class provides iteration services for the XMP Toolkit. It should be instantiated
/// with a string class such as <tt>std::string</tt>. Please read the general usage notes for
/// information on the overall architecture of the XMP API.
///
/// \c TXMPIterator provides a uniform means to iterate over several XMP data structures, including
/// the schema and properties within an XMP object plus global tables such as registered
/// namespaces. The template wraps a string class around the raw XMP API, so that output strings
/// are automatically copied and access is fully thread safe. String objects are only necessary
/// for output strings. Input string are literals and passed as typical C <tt>const char *</tt>.
///
/// The template parameter, class \c TtStringObj, is described in the XMPSDK.hpp umbrella header.
///
/// \note Only XMP object iteration is implemented at this time. There are no table iterators yet.
///
/// Iteration over the schema and properties within an XMP object is the most important and complex
/// use of \c TTXMPIterator. It is helpful to have a thorough understanding of the XMP data tree.
/// One way to learn this is to create some complex XMP and examine the output of
/// <tt>TXMPMeta::DumpObject</tt>. This is also described in the XMP Specification, in the XMP Data
/// Model chapter.
///
/// The top of the XMP data tree is a single root node. This does not explicitly appear in the dump
/// and is never visited by an iterator (that is, it is never returned from
/// <tt>TXMPIterator::Next</tt>). Beneath the root are schema nodes. These are just collectors for
/// top level properties in the same namespace. They are created and destroyed implicitly. Beneath
/// the schema nodes are the property nodes. The nodes below a property node depend on its type
/// (simple, struct, or array) and whether it has qualifiers.
///
/// A \c TXMPIterator constructor defines a starting point for the iteration and options that control
/// how it proceeds. By default the iteration starts at the root and visits all nodes beneath it in
/// a depth first manner. The root node is not visited, the first visited node is a schema node. You
/// can provide a schema name or property path to select a different starting node. By default this
/// visits the named root node first then all nodes beneath it in a depth first manner.
///
/// The <tt>TXMPIterator::Next</tt> method delivers the schema URI, path, and option flags for the
/// node being visited. If the node is simple it also delivers the value. Qualifiers for this node
/// are visited next. The fields of a struct or items of an array are visited after the qualifiers
/// of the parent.
///
/// The options to control the iteration are:
///
/// \li \c kXMP_IterJustChildren - Visit just the immediate children of the root. Skip the root
/// itself and all nodes below the immediate children. This omits the qualifiers of the immediate
/// children, the qualifier nodes being below what they qualify.
///
/// \li \c kXMP_IterJustLeafNodes - Visit just the leaf property nodes and their qualifiers.
///
/// \li \c kXMP_IterJustLeafName - Return just the leaf component of the node names. The default is
/// to return the full path name.
///
/// \li \c kXMP_IterIncludeAliases - Include aliases as part of the iteration. Since aliases are not
/// actual nodes the default iteration does not visit them.
///
/// \li \c kXMP_IterOmitQualifiers - Do not visit the qualifiers of a node.
///
// ================================================================================================
#include "client-glue/WXMPIterator.hpp"
template <class tStringObj>
class TXMPIterator {
public:
// --------------------------------------------------------------------------------------------
/// \brief Assignment operator, assigns the internal ref and increments the ref count.
///
/// The assignment operator assigns the internal ref from the rhs object and increments the
/// reference count on the underlying internal XMP iterator.
void operator= ( const TXMPIterator<tStringObj> & rhs );
// --------------------------------------------------------------------------------------------
/// \brief Copy constructor, creates a client object refering to the same internal object.
///
/// The copy constructor creates a new client iterator that refers to the same underlying iterator.
TXMPIterator ( const TXMPIterator<tStringObj> & original );
// --------------------------------------------------------------------------------------------
/// \brief Construct an iterator for the properties within an XMP object.
///
/// Construct an iterator for the properties within an XMP object. The general operation of an
/// XMP object iterator was described above. Overloaded forms are provided to iterate the entire
/// data tree, properties within a specific schema, or a subtree rooted at a specific node.
///
/// \param xmpObj The XMP object over which to iterate.
///
/// \param schemaNS Optional schema namespace URI to restrict the iteration. Omitted (visit all
/// schema) by passing 0 or "".
///
/// \param propName Optional property name to restrict the iteration. May be an arbitrary path
/// expression. Omitted (visit all properties) by passing 0 or "". If not null/empty a schema
/// URI must also be provided.
///
/// \param options Option flags to control the iteration.
///
/// The available option flags are:
///
/// \li \c kXMP_IterJustChildren - Just visit the immediate children of the root, default is subtree.
/// \li \c kXMP_IterJustLeafNodes - Just visit the leaf nodes, default visits all nodes.
/// \li \c kXMP_IterJustLeafName - Return just the leaf part of the path, default is the full path.
/// \li \c kXMP_IterOmitQualifiers - Omit all qualifiers.
TXMPIterator ( const TXMPMeta<tStringObj> & xmpObj,
XMP_StringPtr schemaNS,
XMP_StringPtr propName,
XMP_OptionBits options = 0 );
TXMPIterator ( const TXMPMeta<tStringObj> & xmpObj,
XMP_StringPtr schemaNS,
XMP_OptionBits options = 0 );
TXMPIterator ( const TXMPMeta<tStringObj> & xmpObj,
XMP_OptionBits options = 0 );
// --------------------------------------------------------------------------------------------
/// \brief Construct an iterator for the global tables of the XMP toolkit.
///
/// \note <b>Not yet implemented.</b> File a bug if you need this.
TXMPIterator ( XMP_StringPtr schemaNS,
XMP_StringPtr propName,
XMP_OptionBits options );
// --------------------------------------------------------------------------------------------
/// \brief Destructor, typical virtual destructor.
virtual ~TXMPIterator() throw();
// --------------------------------------------------------------------------------------------
/// \brief Visit the next node in the iteration.
///
/// \result Returns true if there was another node to visit, false if the iteration is done.
///
/// \param schemaNS A pointer to the string that is assigned the schema namespace URI of
/// the current property. May be null if the value is not wanted.
///
/// \param propPath A pointer to the string that is assigned the XPath name of the current
/// property. May be null if the value is not wanted.
///
/// \param propValue A pointer to the string that is assigned the value of the current
/// property. May be null if the value is not wanted.
///
/// \param options A pointer to the XMP_OptionBits variable that is assigned the flags
/// describing the current property.
bool
Next ( tStringObj * schemaNS = 0,
tStringObj * propPath = 0,
tStringObj * propValue = 0,
XMP_OptionBits * options = 0 );
// --------------------------------------------------------------------------------------------
/// \brief Skip some portion of the remaining iterations.
///
/// \param options Option flags to control the iteration.
///
/// The available option flags are:
///
/// \li \c kXMP_IterSkipSubtree - Skip the subtree below the current node.
/// \li \c kXMP_IterSkipSiblings - Skip the subtree below and remaining siblings of the current node.
void
Skip ( XMP_OptionBits options );
private:
XMPIteratorRef iterRef;
TXMPIterator(); // ! Hidden, must choose property or table iteration.
}; // class TXMPIterator
// =================================================================================================
#endif // __TXMPIterator_hpp__