|
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__
|