///////////////////////////////////////////////////////////////////////// // // ResourceDesc.cpp // // Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved // // History: 10/15/97 Sanj Created by Sanj // 10/17/97 jennymc Moved things a tiny bit // ///////////////////////////////////////////////////////////////////////// #include "precomp.h" #include "refptr.h" #include "poormansresource.h" #include "resourcedesc.h" #include "cfgmgrdevice.h" //////////////////////////////////////////////////////////////////////// // // Function: CResourceDescriptor::CResourceDescriptor // // Class Constructor. // // Inputs: PPOORMAN_RESDESC_HDR pResDescHdr - Resource Descriptor // header used to get resource info // plus the raw bytes following. // CConfigMgrDevice* pOwnerDevice - Pointer to the // owner config manager device. // // Outputs: None. // // Return: None. // // Comments: None. // //////////////////////////////////////////////////////////////////////// CResourceDescriptor::CResourceDescriptor( PPOORMAN_RESDESC_HDR pResDescHdr, CConfigMgrDevice* pOwnerDevice ) : CRefPtrLite(), m_pbResourceDescriptor( NULL ), m_dwResourceSize( 0 ), m_dwResourceId( 0 ), m_pOwnerDevice( pOwnerDevice ) { // At least try to validate the pointer first if ( NULL != pResDescHdr ) { m_dwResourceSize = pResDescHdr->dwResourceSize; if ( 0 != m_dwResourceSize ) { m_dwResourceId = pResDescHdr->dwResourceId; // Now axe the size of the resource descriptor, since we have // stored the necessary information therein. m_dwResourceSize -= SIZEOF_RESDESC_HDR; BYTE* pbData = new BYTE[m_dwResourceSize]; if ( NULL != pbData ) { // The header tells us how long the block of data including the // header is. try { CopyMemory( pbData, ( ( (PBYTE) pResDescHdr ) + SIZEOF_RESDESC_HDR ), m_dwResourceSize ); } catch ( ... ) { delete [] pbData; throw ; } // A derived class will interpret the raw bytes pointed to by this // value. m_pbResourceDescriptor = pbData; } else { throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ; } } // IF 0 != m_dwSizeOfData } // IF NULL != pResDescHdr // AddRef the owner device if ( NULL != m_pOwnerDevice ) { m_pOwnerDevice->AddRef(); } } //////////////////////////////////////////////////////////////////////// // // Function: CResourceDescriptor::CResourceDescriptor // // Class Constructor. // // Inputs: DWORD dwResourceId - Type of Resource // LPVOID pResource - Data Buffer containing // resource specific data. // DWORD dwResourceSize - Size of Buffer // CConfigMgrDevice* pOwnerDevice - Pointer to the // owner config manager device. // // Outputs: None. // // Return: None. // // Comments: None. // //////////////////////////////////////////////////////////////////////// CResourceDescriptor::CResourceDescriptor( DWORD dwResourceId, LPVOID pResource, DWORD dwResourceSize, CConfigMgrDevice* pOwnerDevice ) : CRefPtrLite(), m_pbResourceDescriptor( NULL ), m_dwResourceSize( dwResourceSize ), m_dwResourceId( dwResourceId ), m_pOwnerDevice( pOwnerDevice ) { if ( 0 != m_dwResourceSize && NULL != pResource ) { BYTE* pbData = new BYTE[m_dwResourceSize]; if ( NULL != pbData ) { // The header tells us how long the block of data including the // header is. CopyMemory( pbData, pResource, m_dwResourceSize ); // A derived class will interpret the raw bytes pointed to by this // value. m_pbResourceDescriptor = pbData; } // IF NULL != pbData } // IF 0 != m_dwResourceSize && pResource // AddRef the owner device if ( NULL != m_pOwnerDevice ) { m_pOwnerDevice->AddRef(); } } CResourceDescriptor::CResourceDescriptor( const CResourceDescriptor& resource ) : CRefPtrLite(), m_pbResourceDescriptor( NULL ), m_dwResourceSize( 0 ), m_dwResourceId( 0 ), m_pOwnerDevice( NULL ) { m_dwResourceSize = resource.m_dwResourceSize; m_dwResourceId = resource.m_dwResourceId; m_pbResourceDescriptor = new BYTE[m_dwResourceSize]; if ( NULL != m_pbResourceDescriptor ) { CopyMemory( m_pbResourceDescriptor, resource.m_pbResourceDescriptor, m_dwResourceSize ); } m_pOwnerDevice = resource.m_pOwnerDevice; // AddRef the owner device if ( NULL != m_pOwnerDevice ) { m_pOwnerDevice->AddRef(); } } //////////////////////////////////////////////////////////////////////// // // Function: CResourceDescriptor::~CResourceDescriptor // // Class Destructor. // // Inputs: None. // // Outputs: None. // // Return: None. // // Comments: None. // //////////////////////////////////////////////////////////////////////// CResourceDescriptor::~CResourceDescriptor( void ) { if ( NULL != m_pbResourceDescriptor ) { delete [] m_pbResourceDescriptor; } // Owner device should be released now. if ( NULL != m_pOwnerDevice ) { m_pOwnerDevice->Release(); } } //////////////////////////////////////////////////////////////////////// // // Function: CResourceDescriptor::GetResource() // // Returns a string representation of the associated resource value. // This value may be a number, a range or whatever the overriding // implementation returns. // // Inputs: None. // // Outputs: CHString& str - Storage for string. // // Return: None. // // Comments: Derived classes MUST implement this function to get // a useful value. This base implementation just empties // the string. // //////////////////////////////////////////////////////////////////////// void *CResourceDescriptor::GetResource() { return NULL; } //////////////////////////////////////////////////////////////////////// // // Function: CResourceDescriptor::GetOwnerHardwareKey // // Queries the owner device for its hardware key. // // Inputs: None. // // Outputs: CHString& str - Storage for string. // // Return: None. // // Comments: None. // //////////////////////////////////////////////////////////////////////// BOOL CResourceDescriptor::GetOwnerHardwareKey( CHString& str ) { BOOL fReturn = ( NULL != m_pOwnerDevice ); if ( NULL != m_pOwnerDevice ) { str = m_pOwnerDevice->GetHardwareKey(); } return fReturn; } //////////////////////////////////////////////////////////////////////// // // Function: CResourceDescriptor::GetOwnerDeviceID // // Queries the owner device for its Device ID // // Inputs: None. // // Outputs: CHString& str - Storage for string. // // Return: None. // // Comments: None. // //////////////////////////////////////////////////////////////////////// BOOL CResourceDescriptor::GetOwnerDeviceID( CHString& str ) { BOOL fReturn = ( NULL != m_pOwnerDevice ); if ( NULL != m_pOwnerDevice ) { fReturn = m_pOwnerDevice->GetDeviceID( str ); } return fReturn; } //////////////////////////////////////////////////////////////////////// // // Function: CResourceDescriptor::GetOwnerName // // Queries the owner device for its Name (DeviceDesc). // // Inputs: None. // // Outputs: CHString& str - Storage for string. // // Return: None. // // Comments: None. // //////////////////////////////////////////////////////////////////////// BOOL CResourceDescriptor::GetOwnerName( CHString& str ) { BOOL fReturn = ( NULL != m_pOwnerDevice ); if ( NULL != m_pOwnerDevice ) { fReturn = m_pOwnerDevice->GetDeviceDesc( str ); } return fReturn; } //////////////////////////////////////////////////////////////////////// // // Function: CResourceDescriptor::GetOwner // // Returns an AddRef'd pointer to the owner device // // Inputs: None. // // Outputs: None. // // Return: CConfigMgrDevice* NULL if no pointer // // Comments: Caller MUST call release on the returned // pointer. // //////////////////////////////////////////////////////////////////////// CConfigMgrDevice *CResourceDescriptor::GetOwner( void ) { if ( NULL != m_pOwnerDevice ) { m_pOwnerDevice->AddRef(); } return m_pOwnerDevice; } // // Constructor and Destructor for the Resource Descriptor Collection // object. // //////////////////////////////////////////////////////////////////////// // // Function: CResourceCollection::CResourceCollection // // Class Constructor. // // Inputs: None. // // Outputs: None. // // Return: None. // // Comments: None. // //////////////////////////////////////////////////////////////////////// CResourceCollection::CResourceCollection( void ) { } //////////////////////////////////////////////////////////////////////// // // Function: CResourceCollection::~CResourceCollection // // Class Destructor. // // Inputs: None. // // Outputs: None. // // Return: None. // // Comments: None. // //////////////////////////////////////////////////////////////////////// CResourceCollection::~CResourceCollection( void ) { }