Blame xmpsdk/src/XMPCore_Impl.hpp

Packit Service 21b5d1
#ifndef __XMPCore_Impl_hpp__
Packit Service 21b5d1
#define __XMPCore_Impl_hpp__
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// Copyright 2002-2008 Adobe Systems Incorporated
Packit Service 21b5d1
// All Rights Reserved.
Packit Service 21b5d1
//
Packit Service 21b5d1
// NOTICE:  Adobe permits you to use, modify, and distribute this file in accordance with the terms
Packit Service 21b5d1
// of the Adobe license agreement accompanying it.
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
Packit Service 21b5d1
#include "XMP_Environment.h"	// ! Must be the first #include!
Packit Service 21b5d1
#include "XMP_Const.h"
Packit Service 21b5d1
#include "XMP_BuildInfo.h"
Packit Service 21b5d1
Packit Service 21b5d1
#include "client-glue/WXMPMeta.hpp"
Packit Service 21b5d1
Packit Service 21b5d1
#include <vector>
Packit Service 21b5d1
#include <string>
Packit Service 21b5d1
#include <map>
Packit Service 21b5d1
Packit Service 21b5d1
#include <cassert>
Packit Service 21b5d1
#include <cstring>
Packit Service 21b5d1
Packit Service 21b5d1
#if XMP_WinBuild
Packit Service 21b5d1
	#include <windows.h>
Packit Service 21b5d1
#else
Packit Service 21b5d1
	// Use pthread for both Mac and generic UNIX.
Packit Service 21b5d1
	#include <pthread.h>
Packit Service 21b5d1
#endif
Packit Service 21b5d1
Packit Service 21b5d1
#if XMP_WinBuild
Packit Service 21b5d1
#   ifdef _MSC_VER
Packit Service 21b5d1
        #pragma warning ( disable : 4244 )	// possible loss of data (temporary for 64 bit builds)
Packit Service 21b5d1
        #pragma warning ( disable : 4267 )	// possible loss of data (temporary for 64 bit builds)
Packit Service 21b5d1
#   endif
Packit Service 21b5d1
#endif
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// Primary internal types
Packit Service 21b5d1
Packit Service 21b5d1
class XMP_Node;
Packit Service 21b5d1
class XML_Node;
Packit Service 21b5d1
class XPathStepInfo;
Packit Service 21b5d1
Packit Service 21b5d1
typedef XMP_Node *	XMP_NodePtr;
Packit Service 21b5d1
Packit Service 21b5d1
typedef std::vector<XMP_Node*>		XMP_NodeOffspring;
Packit Service 21b5d1
typedef XMP_NodeOffspring::iterator	XMP_NodePtrPos;
Packit Service 21b5d1
Packit Service 21b5d1
typedef std::string	XMP_VarString;
Packit Service 21b5d1
typedef XMP_VarString::iterator			XMP_VarStringPos;
Packit Service 21b5d1
typedef XMP_VarString::const_iterator	XMP_cVarStringPos;
Packit Service 21b5d1
Packit Service 21b5d1
typedef std::pair < XMP_VarString, XMP_VarString >	XMP_StringPair;
Packit Service 21b5d1
Packit Service 21b5d1
typedef std::map < XMP_VarString, XMP_VarString > XMP_StringMap;
Packit Service 21b5d1
typedef XMP_StringMap::iterator			XMP_StringMapPos;
Packit Service 21b5d1
typedef XMP_StringMap::const_iterator	XMP_cStringMapPos;
Packit Service 21b5d1
Packit Service 21b5d1
typedef std::vector < XPathStepInfo >		XMP_ExpandedXPath;
Packit Service 21b5d1
typedef XMP_ExpandedXPath::iterator			XMP_ExpandedXPathPos;
Packit Service 21b5d1
typedef XMP_ExpandedXPath::const_iterator	XMP_cExpandedXPathPos;
Packit Service 21b5d1
Packit Service 21b5d1
typedef std::map < XMP_VarString, XMP_ExpandedXPath > XMP_AliasMap;	// Alias name to actual path.
Packit Service 21b5d1
typedef XMP_AliasMap::iterator			XMP_AliasMapPos;
Packit Service 21b5d1
typedef XMP_AliasMap::const_iterator	XMP_cAliasMapPos;
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// General global variables and macros
Packit Service 21b5d1
Packit Service 21b5d1
extern XMP_Int32 sXMP_InitCount;
Packit Service 21b5d1
Packit Service 21b5d1
extern XMP_AliasMap *	sRegisteredAliasMap;
Packit Service 21b5d1
Packit Service 21b5d1
extern XMP_StringMap *	sNamespaceURIToPrefixMap;
Packit Service 21b5d1
extern XMP_StringMap *	sNamespacePrefixToURIMap;
Packit Service 21b5d1
Packit Service 21b5d1
extern XMP_VarString *	sOutputNS;
Packit Service 21b5d1
extern XMP_VarString *	sOutputStr;
Packit Service 21b5d1
Packit Service 21b5d1
extern void *			voidVoidPtr;	// Used to backfill null output parameters.
Packit Service 21b5d1
extern XMP_StringPtr	voidStringPtr;
Packit Service 21b5d1
extern XMP_StringLen	voidStringLen;
Packit Service 21b5d1
extern XMP_OptionBits	voidOptionBits;
Packit Service 21b5d1
extern XMP_Bool			voidByte;
Packit Service 21b5d1
extern bool				voidBool;
Packit Service 21b5d1
extern XMP_Int32		voidInt32;
Packit Service 21b5d1
extern XMP_Int64		voidInt64;
Packit Service 21b5d1
extern double			voidDouble;
Packit Service 21b5d1
extern XMP_DateTime		voidDateTime;
Packit Service 21b5d1
extern WXMP_Result		void_wResult;
Packit Service 21b5d1
Packit Service 21b5d1
#define kHexDigits "0123456789ABCDEF"
Packit Service 21b5d1
Packit Service 21b5d1
#define XMP_LitMatch(s,l)		(std::strcmp((s),(l)) == 0)
Packit Service 21b5d1
#define XMP_LitNMatch(s,l,n)	(std::strncmp((s),(l),(n)) == 0)
Packit Service 21b5d1
	// *** Use the above macros!
Packit Service 21b5d1
Packit Service 21b5d1
#define kTab ((char)0x09)
Packit Service 21b5d1
#define kLF ((char)0x0A)
Packit Service 21b5d1
#define kCR ((char)0x0D)
Packit Service 21b5d1
Packit Service 21b5d1
#if XMP_WinBuild
Packit Service 21b5d1
	#define snprintf _snprintf
Packit Service 21b5d1
#endif
Packit Service 21b5d1
Packit Service 21b5d1
#define WtoXMPMeta_Ref(xmpRef)	*((const XMPMeta *)(xmpRef))
Packit Service 21b5d1
#define WtoXMPMeta_Ptr(xmpRef)	(((xmpRef) == 0) ? 0 : (XMPMeta *)(xmpRef))
Packit Service 21b5d1
Packit Service 21b5d1
#define WtoXMPIterator_Ref(iterRef)	*((const XMPIterator *)(iterRef))
Packit Service 21b5d1
#define WtoXMPIterator_Ptr(iterRef)	(((iterRef) == 0) ? 0 : (XMPIterator *)(iterRef))
Packit Service 21b5d1
Packit Service 21b5d1
#define WtoXMPDocOps_Ref(docRef)	*((const XMPDocOps *)(docRef))
Packit Service 21b5d1
#define WtoXMPDocOps_Ptr(docRef)	(((docRef) == 0) ? 0 : (XMPDocOps *)(docRef))
Packit Service 21b5d1
Packit Service 21b5d1
#define IgnoreParam(p)	voidVoidPtr = (void*)&p
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// Version info
Packit Service 21b5d1
Packit Service 21b5d1
#if XMP_DebugBuild
Packit Service 21b5d1
	#define kXMPCore_DebugFlag 1
Packit Service 21b5d1
#else
Packit Service 21b5d1
	#define kXMPCore_DebugFlag 0
Packit Service 21b5d1
#endif
Packit Service 21b5d1
Packit Service 21b5d1
#define kXMPCore_VersionNumber	( (kXMPCore_DebugFlag << 31)    |	\
Packit Service 21b5d1
                                  (XMP_API_VERSION_MAJOR << 24) |	\
Packit Service 21b5d1
						          (XMP_API_VERSION_MINOR << 16) |	\
Packit Service 21b5d1
						          (XMP_API_VERSION_MICRO << 8) )
Packit Service 21b5d1
Packit Service 21b5d1
	#define kXMPCoreName "XMP Core"
Packit Service 21b5d1
	#define kXMPCore_VersionMessage	kXMPCoreName " " XMP_API_VERSION_STRING
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// Support for asserts
Packit Service 21b5d1
Packit Service 21b5d1
#define _MakeStr(p)			#p
Packit Service 21b5d1
#define _NotifyMsg(n,c,f,l)	#n " failed: " #c " in " f " at line " _MakeStr(l)
Packit Service 21b5d1
Packit Service 21b5d1
#if ! XMP_DebugBuild
Packit Service 21b5d1
	#define XMP_Assert(c)	((void) 0)
Packit Service 21b5d1
#else
Packit Service 21b5d1
		#define XMP_Assert(c)	assert ( c )
Packit Service 21b5d1
#endif
Packit Service 21b5d1
Packit Service 21b5d1
	#define XMP_Enforce(c)																			\
Packit Service 21b5d1
		if ( ! (c) ) {																				\
Packit Service 21b5d1
			const char * assert_msg = _NotifyMsg ( XMP_Enforce, (c), __FILE__, __LINE__ );			\
Packit Service 21b5d1
			XMP_Throw ( assert_msg , kXMPErr_EnforceFailure );										\
Packit Service 21b5d1
		}
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// Support for exceptions and thread locking
Packit Service 21b5d1
Packit Service 21b5d1
#ifndef TraceXMPCalls
Packit Service 21b5d1
	#define TraceXMPCalls	0
Packit Service 21b5d1
#endif
Packit Service 21b5d1
Packit Service 21b5d1
#if ! TraceXMPCalls
Packit Service 21b5d1
Packit Service 21b5d1
	#define AnnounceThrow(msg)		/* Do nothing. */
Packit Service 21b5d1
	#define AnnounceCatch(msg)		/* Do nothing. */
Packit Service 21b5d1
Packit Service 21b5d1
	#define AnnounceEntry(proc)		/* Do nothing. */
Packit Service 21b5d1
	#define AnnounceNoLock(proc)	/* Do nothing. */
Packit Service 21b5d1
	#define AnnounceExit()			/* Do nothing. */
Packit Service 21b5d1
Packit Service 21b5d1
	#define ReportLock()			++sLockCount
Packit Service 21b5d1
	#define ReportUnlock()			--sLockCount
Packit Service 21b5d1
	#define ReportKeepLock()		/* Do nothing. */
Packit Service 21b5d1
Packit Service 21b5d1
#else
Packit Service 21b5d1
Packit Service 21b5d1
	extern FILE * xmpCoreOut;
Packit Service 21b5d1
Packit Service 21b5d1
	#define AnnounceThrow(msg)	\
Packit Service 21b5d1
		fprintf ( xmpCoreOut, "XMP_Throw: %s\n", msg ); fflush ( xmpOut )
Packit Service 21b5d1
	#define AnnounceCatch(msg)	\
Packit Service 21b5d1
		fprintf ( xmpCoreOut, "Catch in %s: %s\n", procName, msg ); fflush ( xmpOut )
Packit Service 21b5d1
Packit Service 21b5d1
	#define AnnounceEntry(proc)			\
Packit Service 21b5d1
		const char * procName = proc;	\
Packit Service 21b5d1
		fprintf ( xmpCoreOut, "Entering %s\n", procName ); fflush ( xmpOut )
Packit Service 21b5d1
	#define AnnounceNoLock(proc)		\
Packit Service 21b5d1
		const char * procName = proc;	\
Packit Service 21b5d1
		fprintf ( xmpCoreOut, "Entering %s (no lock)\n", procName ); fflush ( xmpOut )
Packit Service 21b5d1
	#define AnnounceExit()	\
Packit Service 21b5d1
		fprintf ( xmpCoreOut, "Exiting %s\n", procName ); fflush ( xmpOut )
Packit Service 21b5d1
Packit Service 21b5d1
	#define ReportLock()	\
Packit Service 21b5d1
		++sLockCount; fprintf ( xmpCoreOut, "  Auto lock, count = %d\n", sLockCount ); fflush ( xmpOut )
Packit Service 21b5d1
	#define ReportUnlock()	\
Packit Service 21b5d1
		--sLockCount; fprintf ( xmpCoreOut, "  Auto unlock, count = %d\n", sLockCount ); fflush ( xmpOut )
Packit Service 21b5d1
	#define ReportKeepLock()	\
Packit Service 21b5d1
		fprintf ( xmpCoreOut, "  Keeping lock, count = %d\n", sLockCount ); fflush ( xmpOut )
Packit Service 21b5d1
Packit Service 21b5d1
#endif
Packit Service 21b5d1
Packit Service 21b5d1
#define XMP_Throw(msg,id)	{ AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); }
Packit Service 21b5d1
Packit Service 21b5d1
// -------------------------------------------------------------------------------------------------
Packit Service 21b5d1
Packit Service 21b5d1
#if XMP_WinBuild
Packit Service 21b5d1
	typedef CRITICAL_SECTION XMP_Mutex;
Packit Service 21b5d1
#else
Packit Service 21b5d1
	// Use pthread for both Mac and generic UNIX.
Packit Service 21b5d1
	typedef pthread_mutex_t XMP_Mutex;
Packit Service 21b5d1
#endif
Packit Service 21b5d1
Packit Service 21b5d1
extern XMP_Mutex sXMPCoreLock;
Packit Service 21b5d1
extern int	sLockCount;	// Keep signed to catch unlock errors.
Packit Service 21b5d1
extern XMP_VarString * sExceptionMessage;
Packit Service 21b5d1
Packit Service 21b5d1
extern bool XMP_InitMutex ( XMP_Mutex * mutex );
Packit Service 21b5d1
extern void XMP_TermMutex ( XMP_Mutex & mutex );
Packit Service 21b5d1
Packit Service 21b5d1
extern void XMP_EnterCriticalRegion ( XMP_Mutex & mutex );
Packit Service 21b5d1
extern void XMP_ExitCriticalRegion ( XMP_Mutex & mutex );
Packit Service 21b5d1
Packit Service 21b5d1
class XMP_AutoMutex {
Packit Service 21b5d1
public:
Packit Service 21b5d1
	XMP_AutoMutex() : mutex(&sXMPCoreLock) { XMP_EnterCriticalRegion ( *mutex ); ReportLock(); };
Packit Service 21b5d1
	~XMP_AutoMutex() { if ( mutex != 0 ) { ReportUnlock(); XMP_ExitCriticalRegion ( *mutex ); mutex = 0; } };
Packit Service 21b5d1
	void KeepLock() { ReportKeepLock(); mutex = 0; };
Packit Service 21b5d1
private:
Packit Service 21b5d1
	XMP_Mutex * mutex;
Packit Service 21b5d1
};
Packit Service 21b5d1
Packit Service 21b5d1
// *** Switch to XMPEnterObjectWrapper & XMPEnterStaticWrapper, to allow for per-object locks.
Packit Service 21b5d1
Packit Service 21b5d1
// ! Don't do the initialization check (sXMP_InitCount > 0) for the no-lock case. That macro is used
Packit Service 21b5d1
// ! by WXMPMeta_Initialize_1.
Packit Service 21b5d1
Packit Service 21b5d1
#define XMP_ENTER_WRAPPER_NO_LOCK(proc)						\
Packit Service 21b5d1
	AnnounceNoLock ( proc );								\
Packit Service 21b5d1
	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
Packit Service 21b5d1
	try {													\
Packit Service 21b5d1
		wResult->errMessage = 0;
Packit Service 21b5d1
Packit Service 21b5d1
#define XMP_ENTER_WRAPPER(proc)								\
Packit Service 21b5d1
	AnnounceEntry ( proc );									\
Packit Service 21b5d1
	XMP_Assert ( sXMP_InitCount > 0 );	                    \
Packit Service 21b5d1
	XMP_Assert ( (0 <= sLockCount) && (sLockCount <= 1) );	\
Packit Service 21b5d1
	try {													\
Packit Service 21b5d1
		XMP_AutoMutex mutex;								\
Packit Service 21b5d1
		wResult->errMessage = 0;
Packit Service 21b5d1
Packit Service 21b5d1
#define XMP_EXIT_WRAPPER	\
Packit Service 21b5d1
	XMP_CATCH_EXCEPTIONS	\
Packit Service 21b5d1
	AnnounceExit();
Packit Service 21b5d1
Packit Service 21b5d1
#define XMP_EXIT_WRAPPER_KEEP_LOCK(keep)	\
Packit Service 21b5d1
		if ( keep ) mutex.KeepLock();		\
Packit Service 21b5d1
	XMP_CATCH_EXCEPTIONS					\
Packit Service 21b5d1
	AnnounceExit();
Packit Service 21b5d1
Packit Service 21b5d1
#define XMP_EXIT_WRAPPER_NO_THROW				\
Packit Service 21b5d1
	} catch ( ... )	{							\
Packit Service 21b5d1
		AnnounceCatch ( "no-throw catch-all" );	\
Packit Service 21b5d1
		/* Do nothing. */						\
Packit Service 21b5d1
	}											\
Packit Service 21b5d1
	AnnounceExit();
Packit Service 21b5d1
Packit Service 21b5d1
#define XMP_CATCH_EXCEPTIONS										\
Packit Service 21b5d1
	} catch ( XMP_Error & xmpErr ) {								\
Packit Service 21b5d1
		wResult->int32Result = xmpErr.GetID(); 						\
Packit Service 21b5d1
		wResult->ptrResult   = (void*)"XMP";						\
Packit Service 21b5d1
		wResult->errMessage  = xmpErr.GetErrMsg();					\
Packit Service 21b5d1
		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
Packit Service 21b5d1
		AnnounceCatch ( wResult->errMessage );						\
Packit Service 21b5d1
	} catch ( std::exception & stdErr ) {							\
Packit Service 21b5d1
		wResult->int32Result = kXMPErr_StdException; 				\
Packit Service 21b5d1
		wResult->errMessage  = stdErr.what(); 						\
Packit Service 21b5d1
		if ( wResult->errMessage == 0 ) wResult->errMessage = "";	\
Packit Service 21b5d1
		AnnounceCatch ( wResult->errMessage );						\
Packit Service 21b5d1
	} catch ( ... ) {												\
Packit Service 21b5d1
		wResult->int32Result = kXMPErr_UnknownException; 			\
Packit Service 21b5d1
		wResult->errMessage  = "Caught unknown exception";			\
Packit Service 21b5d1
		AnnounceCatch ( wResult->errMessage );						\
Packit Service 21b5d1
	}
Packit Service 21b5d1
Packit Service 21b5d1
#if XMP_DebugBuild
Packit Service 21b5d1
	#define RELEASE_NO_THROW	/* empty */
Packit Service 21b5d1
#else
Packit Service 21b5d1
	#define RELEASE_NO_THROW	throw()
Packit Service 21b5d1
#endif
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// ExpandXPath, FindNode, and related support
Packit Service 21b5d1
Packit Service 21b5d1
// *** Normalize the use of "const xx &" for input params
Packit Service 21b5d1
Packit Service 21b5d1
#define kXMP_ArrayItemName	"[]"
Packit Service 21b5d1
Packit Service 21b5d1
#define kXMP_CreateNodes	true
Packit Service 21b5d1
#define kXMP_ExistingOnly	false
Packit Service 21b5d1
Packit Service 21b5d1
#define FindConstSchema(t,u)	FindSchemaNode ( const_cast<XMP_Node*>(t), u, kXMP_ExistingOnly, 0 )
Packit Service 21b5d1
#define FindConstChild(p,c)		FindChildNode ( const_cast<XMP_Node*>(p), c, kXMP_ExistingOnly, 0 )
Packit Service 21b5d1
#define FindConstQualifier(p,c)	FindQualifierNode ( const_cast<XMP_Node*>(p), c, kXMP_ExistingOnly, 0 )
Packit Service 21b5d1
#define FindConstNode(t,p)		FindNode ( const_cast<XMP_Node*>(t), p, kXMP_ExistingOnly, 0 )
Packit Service 21b5d1
Packit Service 21b5d1
extern XMP_OptionBits
Packit Service 21b5d1
VerifySetOptions ( XMP_OptionBits options, XMP_StringPtr propValue );
Packit Service 21b5d1
Packit Service 21b5d1
extern void
Packit Service 21b5d1
ComposeXPath ( const XMP_ExpandedXPath & expandedXPath,
Packit Service 21b5d1
			   XMP_VarString * stringXPath );
Packit Service 21b5d1
Packit Service 21b5d1
extern void
Packit Service 21b5d1
ExpandXPath	( XMP_StringPtr			schemaNS,
Packit Service 21b5d1
			  XMP_StringPtr			propPath,
Packit Service 21b5d1
			  XMP_ExpandedXPath *	expandedXPath );
Packit Service 21b5d1
Packit Service 21b5d1
extern XMP_Node *
Packit Service 21b5d1
FindSchemaNode ( XMP_Node *		  xmpTree,
Packit Service 21b5d1
				 XMP_StringPtr	  nsURI,
Packit Service 21b5d1
				 bool			  createNodes,
Packit Service 21b5d1
				 XMP_NodePtrPos * ptrPos = 0 );
Packit Service 21b5d1
Packit Service 21b5d1
extern XMP_Node *
Packit Service 21b5d1
FindChildNode ( XMP_Node *		 parent,
Packit Service 21b5d1
				XMP_StringPtr	 childName,
Packit Service 21b5d1
				bool			 createNodes,
Packit Service 21b5d1
				XMP_NodePtrPos * ptrPos = 0 );
Packit Service 21b5d1
Packit Service 21b5d1
extern XMP_Node *
Packit Service 21b5d1
FindQualifierNode ( XMP_Node *		 parent,
Packit Service 21b5d1
					XMP_StringPtr	 qualName,
Packit Service 21b5d1
					bool			 createNodes,
Packit Service 21b5d1
					XMP_NodePtrPos * ptrPos = 0 );
Packit Service 21b5d1
Packit Service 21b5d1
extern XMP_Node *
Packit Service 21b5d1
FindNode ( XMP_Node *		xmpTree,
Packit Service 21b5d1
		   const XMP_ExpandedXPath & expandedXPath,
Packit Service 21b5d1
		   bool				createNodes,
Packit Service 21b5d1
		   XMP_OptionBits	leafOptions = 0,
Packit Service 21b5d1
		   XMP_NodePtrPos * ptrPos = 0 );
Packit Service 21b5d1
Packit Service 21b5d1
extern XMP_Index
Packit Service 21b5d1
LookupLangItem ( const XMP_Node * arrayNode, XMP_VarString & lang );	// ! Lang must be normalized!
Packit Service 21b5d1
Packit Service 21b5d1
extern XMP_Index
Packit Service 21b5d1
LookupFieldSelector ( const XMP_Node * arrayNode, XMP_StringPtr fieldName, XMP_StringPtr fieldValue );
Packit Service 21b5d1
Packit Service 21b5d1
extern void
Packit Service 21b5d1
CloneOffspring ( const XMP_Node * origParent, XMP_Node * cloneParent );
Packit Service 21b5d1
Packit Service 21b5d1
extern XMP_Node *
Packit Service 21b5d1
CloneSubtree ( const XMP_Node * origRoot, XMP_Node * cloneParent );
Packit Service 21b5d1
Packit Service 21b5d1
extern bool
Packit Service 21b5d1
CompareSubtrees ( const XMP_Node & leftNode, const XMP_Node & rightNode );
Packit Service 21b5d1
Packit Service 21b5d1
extern void
Packit Service 21b5d1
DeleteEmptySchema ( XMP_Node * schemaNode );
Packit Service 21b5d1
Packit Service 21b5d1
extern void
Packit Service 21b5d1
NormalizeLangValue ( XMP_VarString * value );
Packit Service 21b5d1
Packit Service 21b5d1
extern void
Packit Service 21b5d1
NormalizeLangArray ( XMP_Node * array );
Packit Service 21b5d1
Packit Service 21b5d1
extern void
Packit Service 21b5d1
DetectAltText ( XMP_Node * xmpParent );
Packit Service 21b5d1
Packit Service 21b5d1
extern void
Packit Service 21b5d1
SortNamedNodes ( XMP_NodeOffspring & nodeVector );
Packit Service 21b5d1
Packit Service 21b5d1
static inline bool
Packit Service 21b5d1
IsPathPrefix ( XMP_StringPtr fullPath, XMP_StringPtr prefix )
Packit Service 21b5d1
{
Packit Service 21b5d1
	bool isPrefix = false;
Packit Service 21b5d1
	XMP_StringLen prefixLen = std::strlen(prefix);
Packit Service 21b5d1
	if ( XMP_LitNMatch ( prefix, fullPath, prefixLen ) ) {
Packit Service 21b5d1
		char separator = fullPath[prefixLen];
Packit Service 21b5d1
		if ( (separator == 0) || (separator == '/') ||
Packit Service 21b5d1
			 (separator == '[') || (separator == '*') ) isPrefix = true;
Packit Service 21b5d1
	}
Packit Service 21b5d1
	return isPrefix;
Packit Service 21b5d1
}
Packit Service 21b5d1
Packit Service 21b5d1
// -------------------------------------------------------------------------------------------------
Packit Service 21b5d1
Packit Service 21b5d1
class XPathStepInfo {
Packit Service 21b5d1
public:
Packit Service 21b5d1
	XMP_VarString	step;
Packit Service 21b5d1
	XMP_OptionBits	options;
Packit Service 21b5d1
	XPathStepInfo ( XMP_StringPtr _step, XMP_OptionBits _options ) : step(_step), options(_options) {};
Packit Service 21b5d1
	XPathStepInfo ( XMP_VarString _step, XMP_OptionBits _options ) : step(_step), options(_options) {};
Packit Service 21b5d1
private:
Packit Service 21b5d1
	XPathStepInfo() : options(0) {};	// ! Hide the default constructor.
Packit Service 21b5d1
};
Packit Service 21b5d1
Packit Service 21b5d1
enum { kSchemaStep = 0, kRootPropStep = 1, kAliasIndexStep = 2 };
Packit Service 21b5d1
Packit Service 21b5d1
enum {	// Bits for XPathStepInfo options.	// *** Add mask check to init code.
Packit Service 21b5d1
	kXMP_StepKindMask		= 0x0F,	// ! The step kinds are mutually exclusive numbers.
Packit Service 21b5d1
	kXMP_StructFieldStep	= 0x01,	// Also for top level nodes (schema "fields").
Packit Service 21b5d1
	kXMP_QualifierStep		= 0x02,	// ! Order is significant to separate struct/qual from array kinds!
Packit Service 21b5d1
	kXMP_ArrayIndexStep		= 0x03,	// ! The kinds must not overlay array form bits!
Packit Service 21b5d1
	kXMP_ArrayLastStep		= 0x04,
Packit Service 21b5d1
	kXMP_QualSelectorStep	= 0x05,
Packit Service 21b5d1
	kXMP_FieldSelectorStep	= 0x06,
Packit Service 21b5d1
	kXMP_StepIsAlias        = 0x10
Packit Service 21b5d1
};
Packit Service 21b5d1
Packit Service 21b5d1
#define GetStepKind(f)	((f) & kXMP_StepKindMask)
Packit Service 21b5d1
Packit Service 21b5d1
#define kXMP_NewImplicitNode	kXMP_InsertAfterItem
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// XMP_Node details
Packit Service 21b5d1
Packit Service 21b5d1
#if 0	// Pattern for iterating over the children or qualifiers:
Packit Service 21b5d1
	for ( size_t xxNum = 0, xxLim = _node_->_offspring_.size(); xxNum < xxLim; ++xxNum ) {
Packit Service 21b5d1
		const XMP_Node * _curr_ = _node_->_offspring_[xxNum];
Packit Service 21b5d1
	}
Packit Service 21b5d1
#endif
Packit Service 21b5d1
Packit Service 21b5d1
class XMP_Node {
Packit Service 21b5d1
public:
Packit Service 21b5d1
Packit Service 21b5d1
	XMP_OptionBits		options;
Packit Service 21b5d1
	XMP_VarString		name, value;
Packit Service 21b5d1
	XMP_Node *			parent;
Packit Service 21b5d1
	XMP_NodeOffspring	children;
Packit Service 21b5d1
	XMP_NodeOffspring	qualifiers;
Packit Service 21b5d1
	#if XMP_DebugBuild
Packit Service 21b5d1
		// *** XMP_StringPtr	_namePtr, _valuePtr;	// *** Not working, need operator=?
Packit Service 21b5d1
	#endif
Packit Service 21b5d1
Packit Service 21b5d1
	XMP_Node ( XMP_Node * _parent, XMP_StringPtr _name, XMP_OptionBits _options )
Packit Service 21b5d1
		: options(_options), name(_name), parent(_parent)
Packit Service 21b5d1
	{
Packit Service 21b5d1
		#if XMP_DebugBuild
Packit Service 21b5d1
			XMP_Assert ( (name.find ( ':' ) != XMP_VarString::npos) || (name == kXMP_ArrayItemName) ||
Packit Service 21b5d1
			             (options & kXMP_SchemaNode) || (parent == 0) );
Packit Service 21b5d1
			// *** _namePtr  = name.c_str();
Packit Service 21b5d1
			// *** _valuePtr = value.c_str();
Packit Service 21b5d1
		#endif
Packit Service 21b5d1
	};
Packit Service 21b5d1
Packit Service 21b5d1
	XMP_Node ( XMP_Node * _parent, const XMP_VarString & _name, XMP_OptionBits _options )
Packit Service 21b5d1
		: options(_options), name(_name), parent(_parent)
Packit Service 21b5d1
	{
Packit Service 21b5d1
		#if XMP_DebugBuild
Packit Service 21b5d1
			XMP_Assert ( (name.find ( ':' ) != XMP_VarString::npos) || (name == kXMP_ArrayItemName) ||
Packit Service 21b5d1
			             (options & kXMP_SchemaNode) || (parent == 0) );
Packit Service 21b5d1
			// *** _namePtr  = name.c_str();
Packit Service 21b5d1
			// *** _valuePtr = value.c_str();
Packit Service 21b5d1
		#endif
Packit Service 21b5d1
	};
Packit Service 21b5d1
	
Packit Service 21b5d1
	XMP_Node ( XMP_Node * _parent, XMP_StringPtr _name, XMP_StringPtr _value, XMP_OptionBits _options )
Packit Service 21b5d1
		: options(_options), name(_name), value(_value), parent(_parent)
Packit Service 21b5d1
	{
Packit Service 21b5d1
		#if XMP_DebugBuild
Packit Service 21b5d1
			XMP_Assert ( (name.find ( ':' ) != XMP_VarString::npos) || (name == kXMP_ArrayItemName) ||
Packit Service 21b5d1
			             (options & kXMP_SchemaNode) || (parent == 0) );
Packit Service 21b5d1
			// *** _namePtr  = name.c_str();
Packit Service 21b5d1
			// *** _valuePtr = value.c_str();
Packit Service 21b5d1
		#endif
Packit Service 21b5d1
	};
Packit Service 21b5d1
Packit Service 21b5d1
	XMP_Node ( XMP_Node * _parent, const XMP_VarString & _name, const XMP_VarString & _value, XMP_OptionBits _options )
Packit Service 21b5d1
		: options(_options), name(_name), value(_value), parent(_parent)
Packit Service 21b5d1
	{
Packit Service 21b5d1
		#if XMP_DebugBuild
Packit Service 21b5d1
			XMP_Assert ( (name.find ( ':' ) != XMP_VarString::npos) || (name == kXMP_ArrayItemName) ||
Packit Service 21b5d1
			             (options & kXMP_SchemaNode) || (parent == 0) );
Packit Service 21b5d1
			// *** _namePtr  = name.c_str();
Packit Service 21b5d1
			// *** _valuePtr = value.c_str();
Packit Service 21b5d1
		#endif
Packit Service 21b5d1
	};
Packit Service 21b5d1
	
Packit Service 21b5d1
	void RemoveChildren()
Packit Service 21b5d1
	{
Packit Service 21b5d1
		for ( size_t i = 0, vLim = children.size(); i < vLim; ++i ) {
Packit Service 21b5d1
			if ( children[i] != 0 ) delete children[i];
Packit Service 21b5d1
		}
Packit Service 21b5d1
		children.clear();
Packit Service 21b5d1
	}
Packit Service 21b5d1
	
Packit Service 21b5d1
	void RemoveQualifiers()
Packit Service 21b5d1
	{
Packit Service 21b5d1
		for ( size_t i = 0, vLim = qualifiers.size(); i < vLim; ++i ) {
Packit Service 21b5d1
			if ( qualifiers[i] != 0 ) delete qualifiers[i];
Packit Service 21b5d1
		}
Packit Service 21b5d1
		qualifiers.clear();
Packit Service 21b5d1
	}
Packit Service 21b5d1
	
Packit Service 21b5d1
	void ClearNode()
Packit Service 21b5d1
	{
Packit Service 21b5d1
		options = 0;
Packit Service 21b5d1
		name.erase();
Packit Service 21b5d1
		value.erase();
Packit Service 21b5d1
		this->RemoveChildren();
Packit Service 21b5d1
		this->RemoveQualifiers();
Packit Service 21b5d1
	}
Packit Service 21b5d1
Packit Service 21b5d1
	virtual ~XMP_Node() { RemoveChildren(); RemoveQualifiers(); };
Packit Service 21b5d1
Packit Service 21b5d1
private:
Packit Service 21b5d1
	XMP_Node() : options(0), parent(0)	// ! Make sure parent pointer is always set.
Packit Service 21b5d1
	{
Packit Service 21b5d1
		#if XMP_DebugBuild
Packit Service 21b5d1
			// *** _namePtr  = name.c_str();
Packit Service 21b5d1
			// *** _valuePtr = value.c_str();
Packit Service 21b5d1
		#endif
Packit Service 21b5d1
	};
Packit Service 21b5d1
Packit Service 21b5d1
};
Packit Service 21b5d1
Packit Service 21b5d1
class XMP_AutoNode {	// Used to hold a child during subtree construction.
Packit Service 21b5d1
public:
Packit Service 21b5d1
	XMP_Node * nodePtr;
Packit Service 21b5d1
	XMP_AutoNode() : nodePtr(0) {};
Packit Service 21b5d1
	~XMP_AutoNode() { if ( nodePtr != 0 ) delete ( nodePtr ); nodePtr = 0; };
Packit Service 21b5d1
	XMP_AutoNode ( XMP_Node * _parent, XMP_StringPtr _name, XMP_OptionBits _options )
Packit Service 21b5d1
		: nodePtr ( new XMP_Node ( _parent, _name, _options ) ) {};
Packit Service 21b5d1
	XMP_AutoNode ( XMP_Node * _parent, const XMP_VarString & _name, XMP_OptionBits _options )
Packit Service 21b5d1
		: nodePtr ( new XMP_Node ( _parent, _name, _options ) ) {};
Packit Service 21b5d1
	XMP_AutoNode ( XMP_Node * _parent, XMP_StringPtr _name, XMP_StringPtr _value, XMP_OptionBits _options )
Packit Service 21b5d1
		: nodePtr ( new XMP_Node ( _parent, _name, _value, _options ) ) {};
Packit Service 21b5d1
	XMP_AutoNode ( XMP_Node * _parent, const XMP_VarString & _name, const XMP_VarString & _value, XMP_OptionBits _options )
Packit Service 21b5d1
		: nodePtr ( new XMP_Node ( _parent, _name, _value, _options ) ) {};
Packit Service 21b5d1
};
Packit Service 21b5d1
Packit Service 21b5d1
extern void ProcessRDF ( XMP_Node * xmpTree, const XML_Node & xmlTree, XMP_OptionBits options );
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
Packit Service 21b5d1
#endif	// __XMPCore_Impl_hpp__