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.
348 lines
12 KiB
Plaintext
348 lines
12 KiB
Plaintext
// =================================================================================================
|
|
// 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 TXMPFiles.incl_cpp
|
|
/// \brief The implementation of the TXMPFiles template class.
|
|
|
|
#if WIN_ENV
|
|
#pragma warning ( disable : 4003 ) // not enough actual parameters for macro
|
|
#pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning)
|
|
#endif
|
|
|
|
#include "client-glue/WXMP_Common.hpp"
|
|
#include "client-glue/WXMPFiles.hpp"
|
|
|
|
// =================================================================================================
|
|
// Implementation Guidelines
|
|
// =========================
|
|
//
|
|
// The implementations of the template functions are very stylized. The jobs done in this code are:
|
|
//
|
|
// 1. ...
|
|
//
|
|
// =================================================================================================
|
|
|
|
#ifndef XMPFiles_TraceCTorDTor
|
|
#define XMPFiles_TraceCTorDTor 0
|
|
#endif
|
|
|
|
#if XMPFiles_TraceCTorDTor
|
|
class XFPeek { // Hack to peek at the client ref count in the internal object.
|
|
public:
|
|
XFPeek();
|
|
virtual ~XFPeek();
|
|
XMP_Int32 clientRefs;
|
|
};
|
|
#endif
|
|
|
|
// =================================================================================================
|
|
|
|
XMP_MethodIntro(TXMPFiles,void)::
|
|
GetVersionInfo ( XMP_VersionInfo * versionInfo )
|
|
{
|
|
WrapNoCheckVoid ( zXMPFiles_GetVersionInfo_1 ( versionInfo ) );
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,bool)::
|
|
Initialize()
|
|
{
|
|
WrapCheckBool ( ok, zXMPFiles_Initialize_2 ( 0 ) );
|
|
return ok;
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,bool)::
|
|
Initialize ( XMP_OptionBits options )
|
|
{
|
|
WrapCheckBool ( ok, zXMPFiles_Initialize_2 ( options ) );
|
|
return ok;
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,void)::
|
|
Terminate()
|
|
{
|
|
WrapNoCheckVoid ( zXMPFiles_Terminate_1() );
|
|
}
|
|
|
|
// =================================================================================================
|
|
|
|
static XMPFilesRef Default_CTor()
|
|
{
|
|
WrapCheckXMPFilesRef ( newRef, zXMPFiles_CTor_1() );
|
|
return newRef;
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_CTorDTorIntro(TXMPFiles)::
|
|
TXMPFiles() : xmpFilesRef(Default_CTor())
|
|
{
|
|
#if XMPFiles_TraceCTorDTor
|
|
XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef;
|
|
printf ( "Default construct TXMPFiles @ %.8X, ref = %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs );
|
|
#endif
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_CTorDTorIntro(TXMPFiles)::
|
|
TXMPFiles ( const TXMPFiles<tStringObj> & original ) : xmpFilesRef(original.xmpFilesRef)
|
|
{
|
|
WXMPFiles_IncrementRefCount_1 ( this->xmpFilesRef );
|
|
#if XMPFiles_TraceCTorDTor
|
|
XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef;
|
|
printf ( "Copy construct TXMPFiles @ %.8X, ref = %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs );
|
|
#endif
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,void)::
|
|
operator= ( const TXMPFiles<tStringObj> & rhs )
|
|
{
|
|
#if XMPFiles_TraceCTorDTor
|
|
XFPeek* xfLHS = (XFPeek*)this->xmpFilesRef;
|
|
XFPeek* xfRHS = (XFPeek*)rhs.xmpFilesRef;
|
|
printf ( "Assign TXMPFiles, lhs @ %.8X, rhs @ %.8X\n", this, &rhs );
|
|
printf ( " original lhs ref = %.8X, count = %d\n", xfLHS, xfLHS->clientRefs );
|
|
printf ( " original rhs ref = %.8X, count = %d\n", xfRHS, xfRHS->clientRefs );
|
|
#endif
|
|
XMPFilesRef oldRef = this->xmpFilesRef; // ! Decrement last so errors leave client object OK.
|
|
this->xmpFilesRef = rhs.xmpFilesRef;
|
|
WXMPFiles_IncrementRefCount_1 ( this->xmpFilesRef ); // Increment the count on the new ref.
|
|
WXMPFiles_DecrementRefCount_1 ( oldRef ); // Decrement the count on the old ref.
|
|
#if XMPFiles_TraceCTorDTor
|
|
printf ( " result lhs ref = %.8X, count = %d\n", xfLHS, xfLHS->clientRefs );
|
|
#endif
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_CTorDTorIntro(TXMPFiles)::
|
|
TXMPFiles ( XMPFilesRef _xmpFilesRef ) : xmpFilesRef(_xmpFilesRef)
|
|
{
|
|
WXMPFiles_IncrementRefCount_1 ( this->xmpFilesRef );
|
|
#if XMPFiles_TraceCTorDTor
|
|
XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef;
|
|
printf ( "Ref construct TXMPFiles @ %.8X, ref = %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs );
|
|
#endif
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_CTorDTorIntro(TXMPFiles)::
|
|
TXMPFiles ( XMP_StringPtr filePath,
|
|
XMP_FileFormat format /* = kXMP_UnknownFile */,
|
|
XMP_OptionBits openFlags /* = 0 */ ) : xmpFilesRef(Default_CTor())
|
|
{
|
|
#if XMPFiles_TraceCTorDTor
|
|
XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef;
|
|
printf ( "File construct TXMPFiles @ %.8X, ref = %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs );
|
|
#endif
|
|
bool ok = this->OpenFile ( filePath, format, openFlags );
|
|
if ( ! ok ) throw XMP_Error ( kXMPErr_NoFileHandler, "OpenFile returned false" );
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_CTorDTorIntro(TXMPFiles)::
|
|
TXMPFiles ( const tStringObj & filePath,
|
|
XMP_FileFormat format /* = kXMP_UnknownFile */,
|
|
XMP_OptionBits openFlags /* = 0 */ ) : xmpFilesRef(Default_CTor())
|
|
{
|
|
#if XMPFiles_TraceCTorDTor
|
|
XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef;
|
|
printf ( "File construct TXMPFiles @ %.8X, ref = %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs );
|
|
#endif
|
|
bool ok = this->OpenFile ( filePath.c_str(), format, openFlags );
|
|
if ( ! ok ) throw XMP_Error ( kXMPErr_NoFileHandler, "OpenFile returned false" );
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_CTorDTorIntro(TXMPFiles)::
|
|
~TXMPFiles () throw()
|
|
{
|
|
#if XMPFiles_TraceCTorDTor
|
|
XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef;
|
|
printf ( "Destruct TXMPFiles @ %.8X, ref= %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs );
|
|
#endif
|
|
WXMPFiles_DecrementRefCount_1 ( this->xmpFilesRef );
|
|
this->xmpFilesRef = 0;
|
|
}
|
|
|
|
// =================================================================================================
|
|
|
|
XMP_MethodIntro(TXMPFiles,bool)::
|
|
GetFormatInfo ( XMP_FileFormat format,
|
|
XMP_OptionBits * flags )
|
|
{
|
|
WrapCheckBool ( found, zXMPFiles_GetFormatInfo_1 ( format, flags ) );
|
|
return found;
|
|
}
|
|
|
|
// =================================================================================================
|
|
|
|
XMP_MethodIntro(TXMPFiles,XMPFilesRef)::
|
|
GetInternalRef()
|
|
{
|
|
return this->xmpFilesRef;
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,bool)::
|
|
OpenFile ( XMP_StringPtr filePath,
|
|
XMP_FileFormat format /* = kXMP_UnknownFile */,
|
|
XMP_OptionBits openFlags /* =0 */ )
|
|
{
|
|
WrapCheckBool ( ok, zXMPFiles_OpenFile_1 ( filePath, format, openFlags ) );
|
|
return ok;
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,bool)::
|
|
OpenFile ( const tStringObj & filePath,
|
|
XMP_FileFormat format /* = kXMP_UnknownFile */,
|
|
XMP_OptionBits openFlags /* =0 */ )
|
|
{
|
|
return this->OpenFile ( filePath.c_str(), format, openFlags );
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,void)::
|
|
CloseFile ( XMP_OptionBits closeFlags /* =0 */ )
|
|
{
|
|
WrapCheckVoid ( zXMPFiles_CloseFile_1 ( closeFlags ) );
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,bool)::
|
|
GetFileInfo ( tStringObj * filePath /* = 0 */,
|
|
XMP_OptionBits * openFlags /* =0 */,
|
|
XMP_FileFormat * format /* = 0 */,
|
|
XMP_OptionBits * handlerFlags /* =0 */ )
|
|
{
|
|
XMP_StringPtr pathStr;
|
|
XMP_StringLen pathLen;
|
|
|
|
WrapCheckBool ( isOpen, zXMPFiles_GetFileInfo_1 ( &pathStr, &pathLen, openFlags, format, handlerFlags ) );
|
|
if ( isOpen ) {
|
|
if ( filePath != 0 ) filePath->assign ( pathStr, pathLen );
|
|
WXMPFiles_UnlockObj_1 ( this->xmpFilesRef );
|
|
}
|
|
return isOpen;
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,void)::
|
|
SetAbortProc ( XMP_AbortProc abortProc,
|
|
void * abortArg )
|
|
{
|
|
WrapCheckVoid ( zXMPFiles_SetAbortProc_1 ( abortProc, abortArg ) );
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,bool)::
|
|
GetXMP ( SXMPMeta * xmpObj /* = 0 */,
|
|
tStringObj * xmpPacket /* = 0 */,
|
|
XMP_PacketInfo * packetInfo /* =0 */ )
|
|
{
|
|
XMP_StringPtr xmpStr;
|
|
XMP_StringLen xmpLen;
|
|
|
|
XMPMetaRef xmpRef = 0;
|
|
if ( xmpObj != 0 ) {
|
|
SXMPUtils::RemoveProperties ( xmpObj, 0, 0, kXMPUtil_DoAllProperties );
|
|
// *** Need an SXMPMeta::Clear method:
|
|
xmpRef = xmpObj->GetInternalRef();
|
|
}
|
|
|
|
WrapCheckBool ( hasXMP, zXMPFiles_GetXMP_1 ( xmpRef, &xmpStr, &xmpLen, packetInfo ) );
|
|
if ( hasXMP ) {
|
|
if ( xmpPacket != 0 ) xmpPacket->assign ( xmpStr, xmpLen );
|
|
WXMPFiles_UnlockObj_1 ( this->xmpFilesRef );
|
|
}
|
|
return hasXMP;
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,bool)::
|
|
GetThumbnail ( XMP_ThumbnailInfo * tnailInfo )
|
|
{
|
|
WrapCheckBool ( hasTNail, zXMPFiles_GetThumbnail_1 ( tnailInfo ) );
|
|
return hasTNail;
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,void)::
|
|
PutXMP ( const SXMPMeta & xmpObj )
|
|
{
|
|
WrapCheckVoid ( zXMPFiles_PutXMP_1 ( xmpObj.GetInternalRef(), 0, 0 ) );
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,void)::
|
|
PutXMP ( XMP_StringPtr xmpPacket,
|
|
XMP_StringLen xmpLength /* = kXMP_UseNullTermination */ )
|
|
{
|
|
WrapCheckVoid ( zXMPFiles_PutXMP_1 ( 0, xmpPacket, xmpLength ) );
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,void)::
|
|
PutXMP ( const tStringObj & xmpPacket )
|
|
{
|
|
this->PutXMP ( xmpPacket.c_str(), xmpPacket.size() );
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,bool)::
|
|
CanPutXMP ( const SXMPMeta & xmpObj )
|
|
{
|
|
WrapCheckBool ( canPut, zXMPFiles_CanPutXMP_1 ( xmpObj.GetInternalRef(), 0, 0 ) );
|
|
return canPut;
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,bool)::
|
|
CanPutXMP ( XMP_StringPtr xmpPacket,
|
|
XMP_StringLen xmpLength /* = kXMP_UseNullTermination */ )
|
|
{
|
|
WrapCheckBool ( canPut, zXMPFiles_CanPutXMP_1 ( 0, xmpPacket, xmpLength ) );
|
|
return canPut;
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
XMP_MethodIntro(TXMPFiles,bool)::
|
|
CanPutXMP ( const tStringObj & xmpPacket )
|
|
{
|
|
return this->CanPutXMP ( xmpPacket.c_str(), xmpPacket.size() );
|
|
}
|
|
|
|
// =================================================================================================
|