///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1999-2002 Microsoft Corporation // // Module Name: // Partition.cpp // // Description: // Implementation of the cluster disk partition class for the MSCLUS // automation classes. // // Author: // Galen Barbee (galenb) 10-Feb-1999 // // Revision History: // // Notes: // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "Partition.h" ///////////////////////////////////////////////////////////////////////////// // Global variables ///////////////////////////////////////////////////////////////////////////// static const IID * iidCClusPartition[] = { &IID_ISClusPartition }; static const IID * iidCClusPartitions[] = { &IID_ISClusPartitions }; //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // CClusPartition class ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartition::CClusPartition // // Description: // Constructor. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CClusPartition::CClusPartition( void ) { m_piids = (const IID *) iidCClusPartition; m_piidsSize = ARRAYSIZE( iidCClusPartition ); ZeroMemory( &m_cpi, sizeof( m_cpi ) ); } //*** CClusPartition::CClusPartition() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartition::Create // // Description: // Finish creating this object. // // Arguments: // pcpi [IN] - points to the CLUS_PARTITION_INFO struct. // // Return Value: // S_OK if successful, or E_POINTER // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CClusPartition::Create( IN CLUS_PARTITION_INFO * pcpi ) { ASSERT( pcpi != NULL ); HRESULT _hr = E_POINTER; if ( pcpi != NULL ) { m_cpi = *pcpi; _hr = S_OK; } // if: pcpi != NULL return _hr; } //*** CClusPartition::Create() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartition::get_Flags // // Description: // Get the dwFlags field from the CLUS_PARTITION_INFO struct. // // Arguments: // plFlags [OUT] - catches the dwFlags field. // // Return Value: // S_OK if successful, or E_POINTER // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusPartition::get_Flags( OUT long * plFlags ) { //ASSERT( plFlags != NULL ); HRESULT _hr = E_POINTER; if ( plFlags != NULL ) { *plFlags = m_cpi.dwFlags; _hr = S_OK; } return _hr; } //*** CClusPartition::get_Flags() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartition::get_DeviceName // // Description: // Get the szDeviceName field from the CLUS_PARTITION_INFO struct. // // Arguments: // pbstrDeviceName [OUT] - catches the szDeviceName field. // // Return Value: // S_OK if successful, or E_POINTER // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusPartition::get_DeviceName( OUT BSTR * pbstrDeviceName ) { //ASSERT( pbstrDeviceName != NULL ); HRESULT _hr = E_POINTER; if ( pbstrDeviceName != NULL ) { *pbstrDeviceName = SysAllocString( m_cpi.szDeviceName ); if ( *pbstrDeviceName == NULL ) { _hr = E_OUTOFMEMORY; } else { _hr = S_OK; } } return _hr; } //*** CClusPartition::get_DeviceName() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartition::get_VolumeLabel // // Description: // Get the szVolumeLabel field from the CLUS_PARTITION_INFO struct. // // Arguments: // pbstrVolumeLabel [OUT] - catches the szVolumeLabel field. // // Return Value: // S_OK if successful, or E_POINTER // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusPartition::get_VolumeLabel( OUT BSTR * pbstrVolumeLabel ) { //ASSERT( pbstrVolumeLabel != NULL ); HRESULT _hr = E_POINTER; if ( pbstrVolumeLabel != NULL ) { *pbstrVolumeLabel = SysAllocString( m_cpi.szVolumeLabel ); if ( *pbstrVolumeLabel == NULL ) { _hr = E_OUTOFMEMORY; } else { _hr = S_OK; } } return _hr; } //*** CClusPartition::get_VolumeLabel() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartition::get_SerialNumber // // Description: // Get the dwSerialNumber field from the CLUS_PARTITION_INFO struct. // // Arguments: // plSerialNumber [OUT] - catches the dwSerialNumber field. // // Return Value: // S_OK if successful, or E_POINTER // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusPartition::get_SerialNumber( OUT long * plSerialNumber ) { //ASSERT( plSerialNumber != NULL ); HRESULT _hr = E_POINTER; if ( plSerialNumber != NULL ) { *plSerialNumber = m_cpi.dwSerialNumber; _hr = S_OK; } return _hr; } //*** CClusPartition::get_SerialNumber() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartition::get_MaximumComponentLength // // Description: // Get the dwMaximumComponentLength field from the CLUS_PARTITION_INFO // struct. // // Arguments: // plMaximumComponentLength [OUT] - catches the dwMaximumComponentLength // field. // // Return Value: // S_OK if successful, or E_POINTER // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusPartition::get_MaximumComponentLength( OUT long * plMaximumComponentLength ) { //ASSERT( plMaximumComponentLength != NULL ); HRESULT _hr = E_POINTER; if ( plMaximumComponentLength != NULL ) { *plMaximumComponentLength = m_cpi.rgdwMaximumComponentLength; _hr = S_OK; } return _hr; } //*** CClusPartition::get_MaximumComponentLength() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartition::get_FileSystemFlags // // Description: // Get the dwFileSystemFlags field from the CLUS_PARTITION_INFO struct. // // Arguments: // plFileSystemFlags [OUT] - catches the dwFileSystemFlags field. // // Return Value: // S_OK if successful, or E_POINTER // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusPartition::get_FileSystemFlags( OUT long * plFileSystemFlags ) { //ASSERT( plFileSystemFlags != NULL ); HRESULT _hr = E_POINTER; if ( plFileSystemFlags != NULL ) { *plFileSystemFlags = m_cpi.dwFileSystemFlags; _hr = S_OK; } return _hr; } //*** CClusPartition::get_FileSystemFlags() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartition::get_FileSystem // // Description: // Get the szFileSystem field from the CLUS_PARTITION_INFO struct. // // Arguments: // pbstrFileSystem [OUT] - catches the szFileSystem field. // // Return Value: // S_OK if successful, or E_POINTER // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusPartition::get_FileSystem( OUT BSTR * pbstrFileSystem ) { //ASSERT( pbstrFileSystem != NULL ); HRESULT _hr = E_POINTER; if ( pbstrFileSystem != NULL ) { *pbstrFileSystem = SysAllocString( m_cpi.szFileSystem ); if ( *pbstrFileSystem == NULL ) { _hr = E_OUTOFMEMORY; } else { _hr = S_OK; } } return _hr; } //*** CClusPartition::get_FileSystem() //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // CClusPartitions class ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartitions::CClusPartitions // // Description: // Constructor // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CClusPartitions::CClusPartitions( void ) { m_piids = (const IID *) iidCClusPartitions; m_piidsSize = ARRAYSIZE( iidCClusPartitions ); } //*** CClusPartitions::CClusPartitions() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartitions::~CClusPartitions // // Description: // Destructor // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CClusPartitions::~CClusPartitions( void ) { Clear(); } //*** CClusPartitions::~CClusPartitions() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartitions::HrCreateItem // // Description: // Create and add a partition to the collection. // // Arguments: // rcpvl [IN] - value list of partition(s). // // Return Value: // S_OK if successful, or HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CClusPartitions::HrCreateItem( IN CLUS_PARTITION_INFO * pcpi ) { ASSERT( pcpi != NULL ); HRESULT _hr = E_POINTER; if ( pcpi != NULL ) { CComObject< CClusPartition > * _pPartition = NULL; _hr = CComObject< CClusPartition >::CreateInstance( &_pPartition ); if ( SUCCEEDED( _hr ) ) { CSmartPtr< CComObject< CClusPartition > > _ptrPartition( _pPartition ); _hr = _ptrPartition->Create( pcpi ); if ( SUCCEEDED( _hr ) ) { m_pvPartitions.insert( m_pvPartitions.end(), _pPartition ); _ptrPartition->AddRef(); } // if: } // if: } // if: return _hr; } //*** CClusPartitions::HrCreateItem() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartitions::GetIndex // // Description: // Convert the passed in 1 based index into a 0 based index. // // Arguments: // varIndex [IN] - the 1 based index. // pnIndex [OUT] - the 0 based index // // Return Value: // S_OK if successful, or E_INVALIDARG if the index is out of range. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CClusPartitions::GetIndex( VARIANT varIndex, UINT * pnIndex ) { //ASSERT( pnIndex != NULL ); HRESULT _hr = E_POINTER; if ( pnIndex != NULL ) { CComVariant v; UINT nIndex = 0; *pnIndex = 0; v.Copy( &varIndex ); // Check to see if the index is a number. _hr = v.ChangeType( VT_I4 ); if ( SUCCEEDED( _hr ) ) { nIndex = v.lVal; nIndex--; // Adjust index to be 0 relative instead of 1 relative if ( nIndex < m_pvPartitions.size() ) { *pnIndex = nIndex; } else { _hr = E_INVALIDARG; } } } return _hr; } //*** CClusPartitions::GetIndex() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartitions::get_Count // // Description: // Returns the count of elements (Partitions) in the collection. // // Arguments: // plCount [OUT] - Catches the count. // // Return Value: // S_OK if successful, or E_POINTER if not. // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusPartitions::get_Count( long * plCount ) { //ASSERT( plCount != NULL ); HRESULT _hr = E_POINTER; if ( plCount != NULL ) { *plCount = m_pvPartitions.size(); _hr = S_OK; } return _hr; } //*** CClusPartitions::get_Count() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartitions::Clear // // Description: // Clean out the vector of ClusPartition objects. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CClusPartitions::Clear( void ) { ::ReleaseAndEmptyCollection< PartitionVector, CComObject< CClusPartition > >( m_pvPartitions ); } //*** CClusPartitions::Clear() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartitions::get_Item // // Description: // Returns the object (Partition) at the passed in index. // // Arguments: // varIndex [IN] - Hold the index. This is a one based number, or // a string that is the name of the group to get. // ppPartition [OUT] - Catches the partition // // Return Value: // S_OK if successful, E_POINTER, or E_INVALIDARG if the index is out // of range, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusPartitions::get_Item( IN VARIANT varIndex, OUT ISClusPartition ** ppPartition ) { //ASSERT( ppPartition != NULL ); HRESULT _hr = E_POINTER; if ( ppPartition != NULL ) { CComObject< CClusPartition > * pPartition = NULL; // Zero the out param *ppPartition = NULL; UINT nIndex = 0; _hr = GetIndex( varIndex, &nIndex ); if ( SUCCEEDED( _hr ) ) { pPartition = m_pvPartitions[ nIndex ]; _hr = pPartition->QueryInterface( IID_ISClusPartition, (void **) ppPartition ); } } return _hr; } //*** CClusPartitions::get_Item() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPartitions::get__NewEnum // // Description: // Create and return a new enumeration for this collection. // // Arguments: // ppunk [OUT] - Catches the new enumeration. // // Return Value: // S_OK if successful, E_POINTER, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusPartitions::get__NewEnum( IUnknown ** ppunk ) { return ::HrNewIDispatchEnum< PartitionVector, CComObject< CClusPartition > >( ppunk, m_pvPartitions ); } //*** CClusPartitions::get__NewEnum()