/*++

Copyright (c) 1993  Microsoft Corporation

Module Name:

    regresls.cxx

Abstract:

    This module contains the definitions of the member functions
    of RESOURCE_LIST class.

Author:

    Jaime Sasson (jaimes) 02-Dec-1993

Environment:

    ULIB, User Mode


--*/

#include "regresls.hxx"
#include "iterator.hxx"
#include "regdesc.hxx"
#include "regfdesc.hxx"


DEFINE_CONSTRUCTOR ( RESOURCE_LIST, OBJECT );


RESOURCE_LIST::~RESOURCE_LIST (
    )

/*++

Routine Description:

    Destroy a RESOURCE_LIST.

Arguments:

    None.

Return Value:

    None.

--*/

{
    Destroy();
}


VOID
RESOURCE_LIST::Construct (
    )

/*++

Routine Description:

    Construct a RESOURCE_LIST object.

Arguments:

    None.

Return Value:

    None.

--*/

{
    _FullResourceDescriptors = NULL;
}


VOID
RESOURCE_LIST::Destroy (
    )

/*++

Routine Description:

    Worker method for object destruction.

Arguments:

    None.

Return Value:

    None.

--*/

{
    if( _FullResourceDescriptors != NULL ) {
        _FullResourceDescriptors->DeleteAllMembers();
        DELETE( _FullResourceDescriptors );
    }
    _FullResourceDescriptors = NULL;
}



BOOLEAN
RESOURCE_LIST::Initialize(
    IN  PCBYTE       Data,
    IN  ULONG        Size
    )

/*++

Routine Description:

    Initialize an object of type RESOURCE_LIST.

Arguments:

    Data - Pointer to a buffer that contains a CM_RESOURCE_LIST.

    Size - Buffer size.

Return Value:

    BOOLEAN - Returns TRUE if the initialization succeeds.

--*/

{
    PCM_FULL_RESOURCE_DESCRIPTOR    FullResource;
    ULONG                           Count;
    ULONG                           i;
    PARRAY  TmpList;
    ULONG   BufferSize;
    ULONG   FullDescriptorSize;

    if( Data == NULL ) {
        return( FALSE );
    }

    Count           = ( ( PCM_RESOURCE_LIST )Data )->Count;
    FullResource    = ( ( PCM_RESOURCE_LIST )Data )->List;

    TmpList = ( PARRAY )NEW( ARRAY );
    DebugPtrAssert( TmpList );
    if( ( TmpList == NULL ) ||
        ( !TmpList->Initialize() ) ) {
        DebugPrintTrace(("REGEDT32: Out of memory" ));
        DELETE( TmpList );
        return( FALSE );
    }

    //
    // For each CM_FULL_RESOURCE DESCRIPTOR in the current value...
    //

    BufferSize = Size -             // Data size
                 sizeof( ULONG );   // Count

    for( i = 0; i < Count; i++ ) {

        PFULL_DESCRIPTOR   FullResourceDescriptor;

        FullResourceDescriptor = ( PFULL_DESCRIPTOR )NEW( FULL_DESCRIPTOR );
        if( ( FullResourceDescriptor == NULL ) ||
            !FullResourceDescriptor->Initialize( ( PCBYTE )FullResource,
                                                 BufferSize,
                                                 &FullDescriptorSize )
          ) {
            DebugPrint( "REGEDT32: Unable to create or initialize FullResourcedescriptor \n" );
            DELETE( FullResourceDescriptor );
            TmpList->DeleteAllMembers();
            DELETE( TmpList );
            return( FALSE );
        }
        TmpList->Put( FullResourceDescriptor );

        FullResource = ( PCM_FULL_RESOURCE_DESCRIPTOR )( ( ULONG_PTR )FullResource + FullDescriptorSize );
        BufferSize -= FullDescriptorSize;
    }
    _FullResourceDescriptors = TmpList;
    return( TRUE );
}