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

#include "XMP_Environment.h"	// ! This must be the first include!
#include "XMPCore_Impl.hpp"
#include "XMPIterator.hpp"
#include "client-glue/WXMPIterator.hpp"



#if XMP_WinBuild
    #pragma warning ( disable : 4101 ) // unreferenced local variable
    #pragma warning ( disable : 4189 ) // local variable is initialized but not referenced
    #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning)
    #if XMP_DebugBuild
        #pragma warning ( disable : 4297 ) // function assumed not to throw an exception but does
    #endif
#endif

#if __cplusplus
extern "C" {
#endif

namespace DngXmpSdk {
// =================================================================================================
// CTor/DTor Wrappers
// ==================

void
WXMPIterator_PropCTor_1 ( XMPMetaRef     xmpRef,
                          XMP_StringPtr  schemaNS,
                          XMP_StringPtr  propName,
                          XMP_OptionBits options,
                          WXMP_Result *  wResult )
{
    XMP_ENTER_WRAPPER ( "WXMPIterator_PropCTor_1" )

        if ( schemaNS == 0 ) schemaNS = "";
        if ( propName == 0 ) propName = "";

        const XMPMeta & xmpObj = WtoXMPMeta_Ref ( xmpRef );
        XMPIterator *   iter   = new XMPIterator ( xmpObj, schemaNS, propName, options );
        ++iter->clientRefs;
        XMP_Assert ( iter->clientRefs == 1 );
        wResult->ptrResult = XMPIteratorRef ( iter );

    XMP_EXIT_WRAPPER
}

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

void
WXMPIterator_TableCTor_1 ( XMP_StringPtr  schemaNS,
                           XMP_StringPtr  propName,
                           XMP_OptionBits options,
                           WXMP_Result *  wResult )
{
    XMP_ENTER_WRAPPER ( "WXMPIterator_TableCTor_1" )

        if ( schemaNS == 0 ) schemaNS = "";
        if ( propName == 0 ) propName = "";

        XMPIterator * iter = new XMPIterator ( schemaNS, propName, options );
        ++iter->clientRefs;
        XMP_Assert ( iter->clientRefs == 1 );
        wResult->ptrResult = XMPIteratorRef ( iter );

    XMP_EXIT_WRAPPER
}

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

void
WXMPIterator_IncrementRefCount_1 ( XMPIteratorRef iterRef )
{
    WXMP_Result * wResult = &void_wResult;	// ! Needed to "fool" the EnterWrapper macro.
    XMP_ENTER_WRAPPER ( "WXMPIterator_IncrementRefCount_1" )

        XMPIterator * thiz = (XMPIterator*)iterRef;

        ++thiz->clientRefs;
        XMP_Assert ( thiz->clientRefs > 1 );

    XMP_EXIT_WRAPPER_NO_THROW
}

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

void
WXMPIterator_DecrementRefCount_1 ( XMPIteratorRef iterRef )
{
    WXMP_Result * wResult = &void_wResult;	// ! Needed to "fool" the EnterWrapper macro.
    XMP_ENTER_WRAPPER ( "WXMPIterator_DecrementRefCount_1" )

        XMPIterator * thiz = (XMPIterator*)iterRef;

        XMP_Assert ( thiz->clientRefs > 0 );
        --thiz->clientRefs;
        if ( thiz->clientRefs <= 0 ) delete ( thiz );

    XMP_EXIT_WRAPPER_NO_THROW
}

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

void
WXMPIterator_Unlock_1 ( XMP_OptionBits options )
{
    WXMP_Result * wResult = &void_wResult;	// ! Needed to "fool" the EnterWrapper macro.
    XMP_ENTER_WRAPPER_NO_LOCK ( "WXMPIterator_Unlock_1" )

        XMPIterator::Unlock ( options );

    XMP_EXIT_WRAPPER_NO_THROW
}

// =================================================================================================
// Class Method Wrappers
// =====================

void
WXMPIterator_Next_1 ( XMPIteratorRef   iterRef,
                      XMP_StringPtr *  schemaNS,
                      XMP_StringLen *  nsSize,
                      XMP_StringPtr *  propPath,
                      XMP_StringLen *  pathSize,
                      XMP_StringPtr *  propValue,
                      XMP_StringLen *  valueSize,
                      XMP_OptionBits * propOptions,
                      WXMP_Result *    wResult )
{
    XMP_ENTER_WRAPPER ( "WXMPIterator_Next_1" )

        if ( schemaNS == 0 ) schemaNS = &voidStringPtr;
        if ( nsSize == 0 ) nsSize = &voidStringLen;
        if ( propPath == 0 ) propPath = &voidStringPtr;
        if ( pathSize == 0 ) pathSize = &voidStringLen;
        if ( propValue == 0 ) propValue = &voidStringPtr;
        if ( valueSize == 0 ) valueSize = &voidStringLen;
        if ( propOptions == 0 ) propOptions = &voidOptionBits;

        XMPIterator * iter = WtoXMPIterator_Ptr ( iterRef );
        XMP_Bool found = iter->Next ( schemaNS, nsSize, propPath, pathSize, propValue, valueSize, propOptions );
        wResult->int32Result = found;

    XMP_EXIT_WRAPPER_KEEP_LOCK ( found )
}

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

void
WXMPIterator_Skip_1 ( XMPIteratorRef iterRef,
                      XMP_OptionBits options,
                      WXMP_Result *  wResult )
{
    XMP_ENTER_WRAPPER ( "WXMPIterator_Skip_1" )

        XMPIterator * iter = WtoXMPIterator_Ptr ( iterRef );
        iter->Skip ( options );

    XMP_EXIT_WRAPPER
}

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

void
WXMPUtils_UnlockIter_1 ( XMPIteratorRef iterRef,
                         XMP_OptionBits options )
{
    WXMP_Result * wResult = &void_wResult;	// ! Needed to "fool" the EnterWrapper macro.
    XMP_ENTER_WRAPPER_NO_LOCK ( "WXMPUtils_UnlockIter_1" )

        XMPIterator * iter = WtoXMPIterator_Ptr ( iterRef );
        iter->UnlockIter ( options );

    XMP_EXIT_WRAPPER_NO_THROW
}

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


#if __cplusplus
} /* extern "C" */
#endif

} // namespace DngXmpSdk
