////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000 Microsoft Corporation // // Module Name: // ResourceEntry.h // // Description: // ResourceEntry implementation. // // Maintained By: // Geoffrey Pease (GPease) 15-JUN-2000 // ////////////////////////////////////////////////////////////////////////////// #include "pch.h" #include "GroupHandle.h" #include "ResourceEntry.h" DEFINE_THISCLASS("CResourceEntry") #define DEPENDENCY_INCREMENT 10 #define PROPLIST_INCREMENT 128 // ************************************************************************ // // Constructor / Destructor // // ************************************************************************ ////////////////////////////////////////////////////////////////////////////// // // CResourceEntry::CResourceEntry( void ) // ////////////////////////////////////////////////////////////////////////////// CResourceEntry::CResourceEntry( void ) { TraceFunc( "" ); Assert( m_fConfigured == FALSE ); Assert( m_bstrName == NULL ); Assert( m_pccmrcResource == NULL ); Assert( m_clsidType == IID_NULL ); Assert( m_clsidClassType == IID_NULL ); Assert( m_dfFlags == dfUNKNOWN ); Assert( m_cAllocedDependencies == 0 ); Assert( m_cDependencies == 0 ); Assert( m_rgDependencies == NULL ); Assert( m_cAllocedDependents == 0 ); Assert( m_cDependents == 0 ); Assert( m_rgDependents == NULL ); Assert( m_groupHandle == NULL ); Assert( m_hResource == NULL ); Assert( m_cbAllocedPropList == 0 ); Assert( m_cbPropList == 0 ); Assert( m_pPropList == NULL ); TraceFuncExit(); } // CResourceEntry( ) ////////////////////////////////////////////////////////////////////////////// // // CResourceEntry::~CResourceEntry( ) // ////////////////////////////////////////////////////////////////////////////// CResourceEntry::~CResourceEntry( ) { TraceFunc( "" ); if ( m_bstrName != NULL ) { TraceSysFreeString( m_bstrName ); } if ( m_rgDependencies != NULL ) { TraceFree( m_rgDependencies ); } if ( m_rgDependents != NULL ) { THR( ClearDependents( ) ); } if ( m_groupHandle != NULL ) { m_groupHandle->Release( ); } if ( m_hResource != NULL ) { CloseClusterResource( m_hResource ); } if ( m_pPropList != NULL ) { TraceFree( m_pPropList ); } TraceFuncExit(); } // ~CResourceEntry( ) //**************************************************************************** // // IResourceEntry // //**************************************************************************** ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::SetName( // BSTR bstrIn // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::SetName( BSTR bstrIn ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; Assert( bstrIn != NULL ); if ( m_bstrName != NULL ) { TraceSysFreeString( m_bstrName ); } m_bstrName = bstrIn; HRETURN( hr ); } // SetName( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::GetName( // BSTR * pbstrOut // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::GetName( BSTR * pbstrOut ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; Assert( pbstrOut != NULL ); *pbstrOut = m_bstrName; HRETURN( hr ); } // GetName( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::SetAssociatedResource( // IClusCfgManagedResourceCfg * pccmrcIn // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::SetAssociatedResource( IClusCfgManagedResourceCfg * pccmrcIn ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; if ( m_pccmrcResource != NULL ) { m_pccmrcResource->Release( ); } m_pccmrcResource = pccmrcIn; m_pccmrcResource->AddRef( ); HRETURN( hr ); } // SetAssociatedResource( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::GetAssociatedResource( // IClusCfgManagedResourceCfg ** ppccmrcOut // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::GetAssociatedResource( IClusCfgManagedResourceCfg ** ppccmrcOut ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr; if ( m_pccmrcResource != NULL ) { *ppccmrcOut = m_pccmrcResource; (*ppccmrcOut)->AddRef( ); hr = S_OK; } else { hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA ); } HRETURN( hr ); } // GetAssociatedResource( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::SetType( // const CLSID * pclsidIn // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::SetType( const CLSID * pclsidIn ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; m_clsidType = * pclsidIn; HRETURN( hr ); } // SetType( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::GetType( // CLSID * pclsidOut // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::GetType( CLSID * pclsidOut ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; *pclsidOut = m_clsidType; HRETURN( hr ); } // GetType( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::GetTypePtr( // const CLSID ** ppclsidOut // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::GetTypePtr( const CLSID ** ppclsidOut ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; Assert( ppclsidOut != NULL ); *ppclsidOut = &m_clsidType; HRETURN( hr ); } // GetTypePtr( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::SetClassType( // const CLSID * pclsidIn // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::SetClassType( const CLSID * pclsidIn ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; m_clsidClassType = *pclsidIn; HRETURN( hr ); } // SetClassType( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::GetClassType( // CLSID * pclsidOut // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::GetClassType( CLSID * pclsidOut ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; *pclsidOut = m_clsidClassType; HRETURN( hr ); } // GetClassType( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::GetClassTypePtr( // const CLSID ** ppclsidOut // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::GetClassTypePtr( const CLSID ** ppclsidOut ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; Assert( ppclsidOut != NULL ); *ppclsidOut = &m_clsidClassType; HRETURN( hr ); } // GetClassTypePtr( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::SetFlags( // EDependencyFlags dfIn // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::SetFlags( EDependencyFlags dfIn ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; m_dfFlags = dfIn; HRETURN( hr ); } // SetFlags( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::GetFlags( // EDependencyFlags * pdfOut // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::GetFlags( EDependencyFlags * pdfOut ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; Assert( pdfOut != NULL ); *pdfOut = m_dfFlags; HRETURN( hr ); } // GetFlags( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::AddTypeDependency( // const CLSID * pclsidIn, // EDependencyFlags dfIn // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::AddTypeDependency( const CLSID * pclsidIn, EDependencyFlags dfIn ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; if ( m_cAllocedDependencies == 0 ) { m_rgDependencies = (DependencyEntry *) TraceAlloc( HEAP_ZERO_MEMORY, sizeof(DependencyEntry) * DEPENDENCY_INCREMENT ); if ( m_rgDependencies == NULL ) goto OutOfMemory; m_cAllocedDependencies = DEPENDENCY_INCREMENT; Assert( m_cDependencies == 0 ); } else if ( m_cDependencies == m_cAllocedDependencies ) { DependencyEntry * pdepends; pdepends = (DependencyEntry *) TraceAlloc( HEAP_ZERO_MEMORY, sizeof(DependencyEntry) * ( m_cAllocedDependencies + DEPENDENCY_INCREMENT ) ); if ( pdepends == NULL ) goto OutOfMemory; CopyMemory( pdepends, m_rgDependencies, sizeof(DependencyEntry) * m_cAllocedDependencies ); TraceFree( m_rgDependencies ); m_rgDependencies = pdepends; } m_rgDependencies[ m_cDependencies ].clsidType = *pclsidIn; m_rgDependencies[ m_cDependencies ].dfFlags = (EDependencyFlags) dfIn; m_cDependencies++; Cleanup: HRETURN( hr ); OutOfMemory: hr = E_OUTOFMEMORY; goto Cleanup; } // AddTypeDependency( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::GetCountOfTypeDependencies( // ULONG * pcOut // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::GetCountOfTypeDependencies( ULONG * pcOut ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; Assert( pcOut != NULL ); *pcOut = m_cDependencies; HRETURN( hr ); } // GetCountOfTypeDependencies( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::GetTypeDependency( // ULONG idxIn, // const CLSID * pclsidOut, // EDependencyFlags * dfOut // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::GetTypeDependency( ULONG idxIn, CLSID * pclsidOut, EDependencyFlags * dfOut ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; Assert( pclsidOut != NULL ); Assert( dfOut != NULL ); Assert( idxIn < m_cDependencies ); *pclsidOut = m_rgDependencies[ idxIn ].clsidType; *dfOut = m_rgDependencies[ idxIn ].dfFlags; HRETURN( hr ); } // GetTypeDependency( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::GetTypeDependencyPtr( // ULONG idxIn, // const CLSID ** ppclsidOut, // EDependencyFlags * dfOut // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::GetTypeDependencyPtr( ULONG idxIn, const CLSID ** ppclsidOut, EDependencyFlags * dfOut ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; Assert( ppclsidOut != NULL ); Assert( dfOut != NULL ); Assert( idxIn < m_cDependencies ); *ppclsidOut = &m_rgDependencies[ idxIn ].clsidType; *dfOut = m_rgDependencies[ idxIn ].dfFlags; HRETURN( hr ); } // GetTypeDependencyPtr( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::AddDependent( // ULONG idxIn, // EDependencyFlags dfFlagsIn // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::AddDependent( ULONG idxIn, EDependencyFlags dfFlagsIn ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; if ( m_cAllocedDependents == 0 ) { m_rgDependents = (DependentEntry *) TraceAlloc( HEAP_ZERO_MEMORY, sizeof(DependentEntry) * DEPENDENCY_INCREMENT ); if ( m_rgDependents == NULL ) goto OutOfMemory; m_cAllocedDependents = DEPENDENCY_INCREMENT; Assert( m_cDependents == 0 ); } else if ( m_cDependents == m_cAllocedDependents ) { DependentEntry * pdepends; pdepends = (DependentEntry *) TraceAlloc( HEAP_ZERO_MEMORY, sizeof(DependentEntry) * ( m_cAllocedDependents + DEPENDENCY_INCREMENT ) ); if ( pdepends == NULL ) goto OutOfMemory; CopyMemory( pdepends, m_rgDependents, sizeof(DependentEntry) * m_cAllocedDependents ); TraceFree( m_rgDependents ); m_rgDependents = pdepends; } m_rgDependents[ m_cDependents ].idxResource = idxIn; m_rgDependents[ m_cDependents ].dfFlags = dfFlagsIn; m_cDependents++; Cleanup: HRETURN( hr ); OutOfMemory: hr = E_OUTOFMEMORY; goto Cleanup; } // AddDependent( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::GetCountOfDependents( // ULONG * pcOut // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::GetCountOfDependents( ULONG * pcOut ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; Assert( pcOut != NULL ); *pcOut = m_cDependents; HRETURN( hr ); } // GetCountOfDependents( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::GetDependent( // ULONG idxIn, // ULONG * pidxOut // EDependencyFlags * pdfOut // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::GetDependent( ULONG idxIn, ULONG * pidxOut, EDependencyFlags * pdfOut ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; Assert( idxIn < m_cDependents ); Assert( pidxOut != NULL ); Assert( pdfOut != NULL ); *pidxOut = m_rgDependents[ idxIn ].idxResource; *pdfOut = m_rgDependents[ idxIn ].dfFlags; HRETURN( hr ); } // GetDependent( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::ClearDependents( void ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::ClearDependents( void ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; TraceFree( m_rgDependents ); m_cAllocedDependents = 0; m_cDependents = 0; HRETURN( hr ); } // ClearDependents( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::SetGroupHandle( // HGROUP hGroupIn // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::SetGroupHandle( CGroupHandle * pghIn ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; Assert( pghIn != NULL ); if ( m_groupHandle != NULL ) { m_groupHandle->Release( ); } m_groupHandle = pghIn; m_groupHandle->AddRef( ); HRETURN( hr ); } // SetGroupHandle( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::GetGroupHandle( // CGroupHandle ** pghIn // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::GetGroupHandle( CGroupHandle ** pghOut ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; Assert( pghOut != NULL ); *pghOut = m_groupHandle; if ( *pghOut != NULL ) { (*pghOut)->AddRef( ); } HRETURN( hr ); } // GetGroupHandle( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::SetHResource( // HRESOURCE hResourceIn // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::SetHResource( HRESOURCE hResourceIn ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; if ( m_hResource != NULL ) { BOOL bRet = CloseClusterResource( m_hResource ); // This shouldn't fail - and what would we do if it did? Assert( bRet ); } m_hResource = hResourceIn; HRETURN( hr ); } // SetHResource( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::GetHResource( // HRESOURCE * phResourceOut // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::GetHResource( HRESOURCE * phResourceOut ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; Assert( phResourceOut != NULL ); *phResourceOut = m_hResource; if ( *phResourceOut == NULL ) { hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA ); } HRETURN( hr ); } // GetHResource( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::SetConfigured( // BOOL fConfiguredIn // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::SetConfigured( BOOL fConfiguredIn ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr = S_OK; m_fConfigured = fConfiguredIn; HRETURN( hr ); } // SetConfigured( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::IsConfigured( void ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::IsConfigured( void ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr; if ( m_fConfigured ) { hr = S_OK; } else { hr = S_FALSE; } HRETURN( hr ); } // IsConfigured( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::StoreClusterResourceControl( // DWORD dwClusCtlIn, // LPVOID pvInBufferIn, // DWORD cbInBufferIn // ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::StoreClusterResourceControl( DWORD dwClusCtlIn, LPVOID pvInBufferIn, DWORD cbInBufferIn ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr; DWORD cbNewSize; LPBYTE pb; CLUSPROP_LIST * plist; if ( dwClusCtlIn == CLUSCTL_RESOURCE_SET_PRIVATE_PROPERTIES ) { // // Grow the buffer (if needed) // if ( ALIGN_CLUSPROP( cbInBufferIn - sizeof(plist->nPropertyCount) ) >= m_cbAllocedPropList - m_cbPropList ) { if ( cbInBufferIn > PROPLIST_INCREMENT ) { cbNewSize = m_cbAllocedPropList + ALIGN_CLUSPROP( cbInBufferIn - sizeof(plist->nPropertyCount) ); } else { cbNewSize = m_cbAllocedPropList + PROPLIST_INCREMENT; } if ( m_cbAllocedPropList == 0 ) { pb = (LPBYTE) TraceAlloc( HEAP_ZERO_MEMORY, cbNewSize ); if ( pb == NULL ) goto OutOfMemory; m_cbPropList = sizeof(plist->nPropertyCount); } else { pb = (LPBYTE) TraceReAlloc( m_pPropList, cbNewSize, HEAP_ZERO_MEMORY ); if ( pb == NULL ) goto OutOfMemory; } m_cbAllocedPropList = cbNewSize; m_pPropList = (CLUSPROP_LIST * )pb; } // // Copy the properties in to the list. // pb = ((LPBYTE) m_pPropList) + m_cbPropList; plist = (CLUSPROP_LIST * ) pvInBufferIn; CopyMemory( pb, &plist->PropertyName, cbInBufferIn - sizeof(plist->nPropertyCount) ); // // Increment the property count // m_pPropList->nPropertyCount += plist->nPropertyCount; // // Adjust the list size allowing for entry padding. // m_cbPropList += ALIGN_CLUSPROP( cbInBufferIn - sizeof(plist->nPropertyCount) ); } else { // // TODO: 20-JUN-2000 // Implement buffering other/custom clusctls. // hr = THR( E_NOTIMPL ); goto Cleanup; } hr = S_OK; Cleanup: HRETURN( hr ); OutOfMemory: hr = E_OUTOFMEMORY; goto Cleanup; } // StoreClusterResourceControl( ) ////////////////////////////////////////////////////////////////////////////// // // STDMETHODIMP // CResourceEntry::Configure( void ) // ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CResourceEntry::Configure( void ) { TraceFunc( "[IResourceEntry]" ); HRESULT hr; DWORD dw; Assert( m_hResource != NULL ); // // Send down the property list. // if ( m_pPropList != NULL ) { dw = TW32( ClusterResourceControl( m_hResource, NULL, CLUSCTL_RESOURCE_SET_PRIVATE_PROPERTIES, m_pPropList, m_cbPropList, NULL, NULL, NULL ) ); if ( dw != ERROR_SUCCESS ) { hr = HRESULT_FROM_WIN32( dw ); goto Cleanup; } } // // TODO: 20-JUN-2000 // Send down buffered other/custom clusctls. // hr = S_OK; Cleanup: HRETURN( hr ); } // Configure( )