#ifndef __XMPUtils_hpp__
#define __XMPUtils_hpp__

// =================================================================================================
// Copyright 2003 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.
// =================================================================================================

#include "public/include/XMP_Environment.h"
#include "public/include/XMP_Const.h"

#include "XMPCore/source/XMPMeta.hpp"
#include "XMPCore/source/XMPCore_Impl.hpp"
#include "public/include/client-glue/WXMPUtils.hpp"

// -------------------------------------------------------------------------------------------------

class	XMPUtils {
public:
	
	static bool
	Initialize();	// ! For internal use only!
	
	static void
	Terminate() RELEASE_NO_THROW;	// ! For internal use only!

	// ---------------------------------------------------------------------------------------------

	static void
	ComposeArrayItemPath ( XMP_StringPtr   schemaNS,
						   XMP_StringPtr   arrayName,
						   XMP_Index	   itemIndex,
						   XMP_VarString * fullPath );

	static void
	ComposeStructFieldPath ( XMP_StringPtr	 schemaNS,
							 XMP_StringPtr	 structName,
							 XMP_StringPtr	 fieldNS,
							 XMP_StringPtr	 fieldName,
							 XMP_VarString * fullPath );

	static void
	ComposeQualifierPath ( XMP_StringPtr   schemaNS,
						   XMP_StringPtr   propName,
						   XMP_StringPtr   qualNS,
						   XMP_StringPtr   qualName,
						   XMP_VarString * fullPath );

	static void
	ComposeLangSelector ( XMP_StringPtr	  schemaNS,
						  XMP_StringPtr	  arrayName,
						  XMP_StringPtr	  langName,
						  XMP_VarString * fullPath );

	static void
	ComposeFieldSelector ( XMP_StringPtr   schemaNS,
						   XMP_StringPtr   arrayName,
						   XMP_StringPtr   fieldNS,
						   XMP_StringPtr   fieldName,
						   XMP_StringPtr   fieldValue,
						   XMP_VarString * fullPath );

	// ---------------------------------------------------------------------------------------------

	static void
	ConvertFromBool ( bool			  binValue,
					  XMP_VarString * strValue );

	static void
	ConvertFromInt ( XMP_Int32		 binValue,
					 XMP_StringPtr	 format,
					 XMP_VarString * strValue );

	static void
	ConvertFromInt64 ( XMP_Int64	   binValue,
					   XMP_StringPtr   format,
					   XMP_VarString * strValue );

	static void
	ConvertFromFloat ( double		   binValue,
					   XMP_StringPtr   format,
					   XMP_VarString * strValue );

	static void
	ConvertFromDate ( const XMP_DateTime & binValue,
					  XMP_VarString *	   strValue );

	// ---------------------------------------------------------------------------------------------

	static bool
	ConvertToBool ( XMP_StringPtr strValue );

	static XMP_Int32
	ConvertToInt ( XMP_StringPtr strValue );

	static XMP_Int64
	ConvertToInt64 ( XMP_StringPtr strValue );

	static double
	ConvertToFloat ( XMP_StringPtr strValue );

	static void
	ConvertToDate  ( XMP_StringPtr	strValue,
					 XMP_DateTime * binValue );

	// ---------------------------------------------------------------------------------------------

	static void
	CurrentDateTime ( XMP_DateTime * time );

	static void
	SetTimeZone ( XMP_DateTime * time );

	static void
	ConvertToUTCTime ( XMP_DateTime * time );

	static void
	ConvertToLocalTime ( XMP_DateTime * time );

	static int
	CompareDateTime ( const XMP_DateTime & left,
					  const XMP_DateTime & right );
	// ---------------------------------------------------------------------------------------------

	static void
	EncodeToBase64 ( XMP_StringPtr	 rawStr,
					 XMP_StringLen	 rawLen,
					 XMP_VarString * encodedStr );

	static void
	DecodeFromBase64 ( XMP_StringPtr   encodedStr,
					   XMP_StringLen   encodedLen,
					   XMP_VarString * rawStr );

	// ---------------------------------------------------------------------------------------------

	static void
	PackageForJPEG ( const XMPMeta & xmpObj,
					 XMP_VarString * stdStr,
					 XMP_VarString * extStr,
					 XMP_VarString * digestStr );

	static void
	MergeFromJPEG ( XMPMeta *       fullXMP,
                    const XMPMeta & extendedXMP );

	// ---------------------------------------------------------------------------------------------

	static void
	CatenateArrayItems ( const XMPMeta & xmpObj,
						 XMP_StringPtr	 schemaNS,
						 XMP_StringPtr	 arrayName,
						 XMP_StringPtr	 separator,
						 XMP_StringPtr	 quotes,
						 XMP_OptionBits	 options,
						 XMP_VarString * catedStr );

	static void
	SeparateArrayItems ( XMPMeta *		xmpObj,
						 XMP_StringPtr	schemaNS,
						 XMP_StringPtr	arrayName,
						 XMP_OptionBits options,
						 XMP_StringPtr	catedStr );

	static void
	ApplyTemplate ( XMPMeta *	    workingXMP,
					const XMPMeta & templateXMP,
					XMP_OptionBits  actions );

	static void
	RemoveProperties ( XMPMeta *	  xmpObj,
					   XMP_StringPtr  schemaNS,
					   XMP_StringPtr  propName,
					   XMP_OptionBits options );

	static void
	DuplicateSubtree ( const XMPMeta & source,
					   XMPMeta *	   dest,
					   XMP_StringPtr   sourceNS,
					   XMP_StringPtr   sourceRoot,
					   XMP_StringPtr   destNS,
					   XMP_StringPtr   destRoot,
					   XMP_OptionBits  options );

	// ---------------------------------------------------------------------------------------------

	static std::string& Trim(std::string& string);

	static std::string * WhiteSpaceStrPtr;

};	// XMPUtils

// =================================================================================================

#endif	// __XMPUtils_hpp__
