windows-nt/Source/XPSP1/NT/base/cluster/mgmt/cluscfg/middletier/manageddevice.cpp
2020-09-26 16:20:57 +08:00

895 lines
18 KiB
C++

//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2001 Microsoft Corporation
//
// Module Name:
// ManagedDevice.cpp
//
// Description:
// CManagedDevice implementation.
//
// Maintained By:
// Galen Barbee (GalenB) 02-FEB-2000
//
//////////////////////////////////////////////////////////////////////////////
#include "pch.h"
#include "ManagedDevice.h"
DEFINE_THISCLASS("CManagedDevice")
// ************************************************************************
//
// Constructor / Destructor
//
// ************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CManagedDevice::S_HrCreateInstance(
// IUnknown ** ppunkOut
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CManagedDevice::S_HrCreateInstance(
IUnknown ** ppunkOut
)
{
TraceFunc( "" );
Assert( ppunkOut != NULL );
HRESULT hr;
CManagedDevice * pmd = new CManagedDevice;
if ( pmd != NULL )
{
hr = THR( pmd->Init( ) );
if ( SUCCEEDED( hr ) )
{
hr = THR( pmd->TypeSafeQI( IUnknown, ppunkOut ) );
}
pmd->Release( );
}
else
{
hr = E_OUTOFMEMORY;
}
HRETURN( hr );
} //*** CManagedDevice::S_HrCreateInstance( )
//////////////////////////////////////////////////////////////////////////////
//++
//
// CManagedDevice::CManagedDevice( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
CManagedDevice::CManagedDevice( void )
{
TraceFunc( "" );
InterlockedIncrement( &g_cObjects );
TraceFuncExit();
} //*** CManagedDevice::CManagedDevice( )
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CManagedDevice::Init( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CManagedDevice::Init( void )
{
TraceFunc( "" );
HRESULT hr = S_OK;
// IUnknown stuff
Assert( m_cRef == 0 );
AddRef( ); // Add one count
// IClusCfgManagedResourceInfo
Assert( m_bstrUID == NULL );
Assert( m_bstrName == NULL );
Assert( m_fHasNameChanged == FALSE );
Assert( m_bstrType == NULL );
Assert( m_fIsManaged == FALSE );
Assert( m_fIsQuorumDevice == FALSE );
Assert( m_fIsQuorumCapable == FALSE );
Assert( m_fIsQuorumJoinable == FALSE );
Assert( m_dlmDriveLetterMapping.dluDrives[ 0 ] = dluUNUSED );
// IExtendObjectManager
HRETURN( hr );
} //*** CManagedDevice::Init( )
//////////////////////////////////////////////////////////////////////////////
//++
//
// CManagedDevice::~CManagedDevice( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
CManagedDevice::~CManagedDevice( void )
{
TraceFunc( "" );
if ( m_bstrUID != NULL )
{
TraceSysFreeString( m_bstrUID );
}
if ( m_bstrName != NULL )
{
TraceSysFreeString( m_bstrName );
}
if ( m_bstrType != NULL )
{
TraceSysFreeString( m_bstrType );
}
InterlockedDecrement( &g_cObjects );
TraceFuncExit();
} //*** CManagedDevice::~CManagedDevice( )
// ************************************************************************
//
// IUnknown
//
// ************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CManagedDevice::QueryInterface(
// REFIID riidIn,
// LPVOID * ppvOut
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CManagedDevice::QueryInterface(
REFIID riidIn,
LPVOID * ppvOut
)
{
TraceQIFunc( riidIn, ppvOut );
HRESULT hr = E_NOINTERFACE;
if ( IsEqualIID( riidIn, IID_IUnknown ) )
{
*ppvOut = static_cast< IClusCfgManagedResourceInfo * >( this );
hr = S_OK;
} // if: IUnknown
else if ( IsEqualIID( riidIn, IID_IClusCfgManagedResourceInfo ) )
{
*ppvOut = TraceInterface( __THISCLASS__, IClusCfgManagedResourceInfo, this, 0 );
hr = S_OK;
} // else if: IClusCfgManagedResourceInfo
else if ( IsEqualIID( riidIn, IID_IGatherData ) )
{
*ppvOut = TraceInterface( __THISCLASS__, IGatherData, this, 0 );
hr = S_OK;
} // else if: IGatherData
else if ( IsEqualIID( riidIn, IID_IExtendObjectManager ) )
{
*ppvOut = TraceInterface( __THISCLASS__, IExtendObjectManager, this, 0 );
hr = S_OK;
} // else if: IGatherData
if ( SUCCEEDED( hr ) )
{
((IUnknown*) *ppvOut)->AddRef( );
} // if: success
QIRETURN_IGNORESTDMARSHALLING( hr, riidIn );
} //*** CManagedDevice::QueryInterface( )
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP_( ULONG )
// CManagedDevice::AddRef( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_( ULONG )
CManagedDevice::AddRef( void )
{
TraceFunc( "[IUnknown]" );
InterlockedIncrement( &m_cRef );
RETURN( m_cRef );
} //*** CManagedDevice::AddRef( )
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP_( ULONG )
// CManagedDevice::Release( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_( ULONG )
CManagedDevice::Release( void )
{
TraceFunc( "[IUnknown]" );
InterlockedDecrement( &m_cRef );
if ( m_cRef )
RETURN( m_cRef );
TraceDo( delete this );
RETURN(0);
} //*** CManagedDevice::Release( )
// ************************************************************************
//
// IClusCfgManagedResourceInfo
//
// ************************************************************************
///////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CManagedDevice::GetUID(
// BSTR * pbstrUIDOut
// )
//
//--
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CManagedDevice::GetUID(
BSTR * pbstrUIDOut
)
{
TraceFunc( "[IClusCfgManagedResourceInfo]" );
HRESULT hr = S_OK;
if ( pbstrUIDOut == NULL )
goto InvalidPointer;
if ( m_bstrUID == NULL )
goto UnexpectedError;
*pbstrUIDOut = SysAllocString( m_bstrUID );
if ( *pbstrUIDOut == NULL )
goto OutOfMemory;
Cleanup:
HRETURN( hr );
InvalidPointer:
hr = THR( E_POINTER );
goto Cleanup;
UnexpectedError:
hr = THR( E_UNEXPECTED );
goto Cleanup;
OutOfMemory:
hr = E_OUTOFMEMORY;
goto Cleanup;
} //*** CManagedDevice::GetUID( )
///////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CManagedDevice::GetName(
// BSTR * pbstrNameOut
// )
//
//--
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CManagedDevice::GetName(
BSTR * pbstrNameOut
)
{
TraceFunc( "[IClusCfgManagedResourceInfo]" );
HRESULT hr = S_OK;
if ( pbstrNameOut == NULL )
goto InvalidPointer;
if ( m_bstrName == NULL )
goto UnexpectedError;
*pbstrNameOut = SysAllocString( m_bstrName );
if ( *pbstrNameOut == NULL )
goto OutOfMemory;
Cleanup:
HRETURN( hr );
InvalidPointer:
hr = THR( E_POINTER );
goto Cleanup;
UnexpectedError:
hr = THR( E_UNEXPECTED );
goto Cleanup;
OutOfMemory:
hr = E_OUTOFMEMORY;
goto Cleanup;
} //*** CManagedDevice::GetName( )
///////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CManagedDevice::SetName(
// BSTR bstrNameIn
// )
//
//--
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CManagedDevice::SetName(
LPCWSTR pcszNameIn
)
{
TraceFunc1( "[IClusCfgManagedResourceInfo] pcszNameIn = '%ws'", ( pcszNameIn == NULL ? L"<null>" : pcszNameIn ) );
HRESULT hr = S_OK; // Bug #294649
BSTR bstrNewName;
if ( pcszNameIn == NULL )
goto InvalidArg;
bstrNewName = TraceSysAllocString( pcszNameIn );
if ( bstrNewName == NULL )
goto OutOfMemory;
if ( m_bstrName != NULL )
{
TraceSysFreeString( m_bstrName );
}
m_bstrName = bstrNewName;
m_fHasNameChanged = TRUE;
Cleanup:
HRETURN( hr );
InvalidArg:
hr = THR( E_INVALIDARG );
goto Cleanup;
OutOfMemory:
hr = E_OUTOFMEMORY;
goto Cleanup;
} //*** CManagedDevice::SetName( )
///////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CManagedDevice::IsManaged( void )
//
//--
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CManagedDevice::IsManaged( void )
{
TraceFunc( "[IClusCfgManagedResourceInfo]" );
HRESULT hr;
if ( m_fIsManaged )
{
hr = S_OK;
}
else
{
hr = S_FALSE;
}
HRETURN( hr );
} //*** CManagedDevice::IsManaged( )
///////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CManagedDevice::SetManaged(
// BOOL fIsManagedIn
// )
//
//--
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CManagedDevice::SetManaged(
BOOL fIsManagedIn
)
{
TraceFunc1( "[IClusCfgManagedResourceInfo] fIsManagedIn = '%s'", BOOLTOSTRING( fIsManagedIn ) );
m_fIsManaged = fIsManagedIn;
HRETURN( S_OK );
} //*** CManagedDevice::SetManaged( )
///////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CManagedDevice::IsQuorumDevice( void )
//
//--
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CManagedDevice::IsQuorumDevice( void )
{
TraceFunc( "[IClusCfgManagedResourceInfo]" );
HRESULT hr;
if ( m_fIsQuorumDevice )
{
hr = S_OK;
}
else
{
hr = S_FALSE;
}
HRETURN( hr );
} //*** CManagedDevice::IsQuorumDevice( )
///////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CManagedDevice::SetQuorumedDevice(
// BOOL fIsQuorumDeviceIn
// )
//
//--
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CManagedDevice::SetQuorumedDevice(
BOOL fIsQuorumDeviceIn
)
{
TraceFunc1( "[IClusCfgManagedResourceInfo] fIsQuorumDeviceIn = '%s'", BOOLTOSTRING( fIsQuorumDeviceIn ) );
m_fIsQuorumDevice = fIsQuorumDeviceIn;
HRETURN( S_OK );
} //*** CManagedDevice::SetQuorumedDevice( )
///////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CManagedDevice::IsQuorumCapable( void )
//
//--
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CManagedDevice::IsQuorumCapable( void )
{
TraceFunc( "[IClusCfgManagedResourceInfo]" );
HRESULT hr;
if ( m_fIsQuorumCapable )
{
hr = S_OK;
}
else
{
hr = S_FALSE;
}
HRETURN( hr );
} //*** CManagedDevice::IsQuorumCapable( )
///////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CManagedDevice::GetDriveLetterMappings(
// SDriveLetterMapping * pdlmDriveLetterMappingOut
// )
//
//--
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CManagedDevice::GetDriveLetterMappings(
SDriveLetterMapping * pdlmDriveLetterMappingOut
)
{
TraceFunc( "[IClusCfgManagedResourceInfo]" );
*pdlmDriveLetterMappingOut = m_dlmDriveLetterMapping;
HRETURN( S_OK );
} //*** CManagedDevice::GetDriveLetterMappings( )
///////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CManagedDevice::SetDriveLetterMappings(
// SDriveLetterMapping dlmDriveLetterMappingIn
// )
//
//--
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CManagedDevice::SetDriveLetterMappings(
SDriveLetterMapping dlmDriveLetterMappingIn
)
{
TraceFunc( "[IClusCfgManagedResourceInfo]" );
m_dlmDriveLetterMapping = dlmDriveLetterMappingIn;
HRETURN( S_OK );
} //*** CManagedDevice::SetDriveLetterMappings( )
///////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CManagedDevice::IsDeviceJoinable( void )
//
//--
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CManagedDevice::IsDeviceJoinable( void )
{
TraceFunc( "[IClusCfgManagedResourceInfo]" );
HRESULT hr;
if ( m_fIsQuorumJoinable )
{
hr = S_OK;
}
else
{
hr = S_FALSE;
}
HRETURN( hr );
} //*** CManagedDevice::IsDeviceJoinable( )
///////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CManagedDevice::SetDeviceJoinable( void )
//
//--
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CManagedDevice::SetDeviceJoinable( BOOL fIsJoinableIn )
{
TraceFunc( "[IClusCfgManagedResourceInfo]" );
HRETURN( THR( E_NOTIMPL ) );
} //*** CManagedDevice::SetDeviceJoinable( )
//****************************************************************************
//
// IGatherData
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CManagedDevice::Gather(
// OBJECTCOOKIE cookieParentIn,
// IUnknown * punkIn
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CManagedDevice::Gather(
OBJECTCOOKIE cookieParentIn,
IUnknown * punkIn
)
{
TraceFunc( "[IGatherData]" );
HRESULT hr;
BSTR bstr = NULL;
IClusCfgManagedResourceInfo * pccmri = NULL;
//
// Check parameters
//
if ( punkIn == NULL )
goto InvalidArg;
//
// Find the inteface we need to gather our info.
//
hr = THR( punkIn->TypeSafeQI( IClusCfgManagedResourceInfo, &pccmri ) );
if ( FAILED( hr ) )
goto Cleanup;
//
// Gather UID
//
hr = THR( pccmri->GetUID( &m_bstrUID ) );
if ( FAILED( hr ) )
goto Error;
TraceMemoryAddBSTR( m_bstrUID );
//
// Gather Name
//
hr = THR( pccmri->GetName( &m_bstrName ) );
if ( FAILED( hr ) )
goto Error;
TraceMemoryAddBSTR( m_bstrName );
//
// Gather IsManaged
//
hr = STHR( pccmri->IsManaged( ) );
if ( FAILED( hr ) )
goto Error;
if ( hr == S_OK )
{
m_fIsManaged = TRUE;
}
else
{
m_fIsManaged = FALSE;
}
//
// Gather Quorum Capable
//
hr = STHR( pccmri->IsQuorumCapable( ) );
if ( FAILED( hr ) )
goto Error;
if ( hr == S_OK )
{
m_fIsQuorumCapable = TRUE;
}
else
{
m_fIsQuorumCapable = FALSE;
}
//
// If the device is quorumable, does it allow joins.
//
if(m_fIsQuorumCapable)
{
hr = STHR( pccmri->IsDeviceJoinable( ) );
if( FAILED( hr ) )
goto Error;
if( hr == S_OK )
{
m_fIsQuorumJoinable = TRUE;
}
else
{
m_fIsQuorumJoinable = FALSE;
}
}
else
{
m_fIsQuorumJoinable = FALSE;
}
//
// Gather if resource is the quorum resource.
//
hr = STHR( pccmri->IsQuorumDevice( ) );
if ( FAILED( hr ) )
goto Cleanup;
if ( hr == S_OK )
{
m_fIsQuorumDevice = TRUE;
}
else
{
m_fIsQuorumDevice = FALSE;
}
//
// Gather Device Mappings
//
hr = STHR( pccmri->GetDriveLetterMappings( &m_dlmDriveLetterMapping ) );
if ( FAILED( hr ) )
goto Error;
if ( hr == S_FALSE )
{
// Make sure this is nuked
ZeroMemory( &m_dlmDriveLetterMapping, sizeof(m_dlmDriveLetterMapping) );
}
//
// Anything else to gather??
//
hr = S_OK;
Cleanup:
if ( pccmri != NULL )
{
pccmri->Release( );
}
HRETURN( hr );
Error:
//
// On error, invalidate all data.
//
if ( m_bstrUID != NULL )
{
TraceSysFreeString( m_bstrUID );
m_bstrUID = NULL;
}
if ( m_bstrName != NULL )
{
TraceSysFreeString( m_bstrName );
m_bstrName = NULL;
}
if ( m_bstrType != NULL )
{
TraceSysFreeString( m_bstrType );
m_bstrType = NULL;
}
m_fIsManaged = FALSE;
m_fIsQuorumCapable = FALSE;
m_fIsQuorumJoinable = FALSE;
m_fIsQuorumDevice = FALSE;
ZeroMemory( &m_dlmDriveLetterMapping, sizeof( m_dlmDriveLetterMapping ) );
goto Cleanup;
InvalidArg:
hr = THR( E_INVALIDARG );
goto Cleanup;
} //*** CManagedDevice::Gather( )
// ************************************************************************
//
// IExtendObjectManager
//
// ************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CManagedDevice::FindObject(
// OBJECTCOOKIE cookieIn
// , REFCLSID rclsidTypeIn
// , LPCWSTR pcszNameIn
// , LPUNKNOWN * punkOut
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CManagedDevice::FindObject(
OBJECTCOOKIE cookieIn
, REFCLSID rclsidTypeIn
, LPCWSTR pcszNameIn
, LPUNKNOWN * ppunkOut
)
{
TraceFunc( "[IExtendObjectManager]" );
HRESULT hr = E_UNEXPECTED;
//
// Validate arguments.
//
if ( cookieIn == 0 )
goto InvalidArg;
if ( rclsidTypeIn != CLSID_ManagedResourceType )
goto InvalidArg;
if ( pcszNameIn == NULL )
goto InvalidArg;
if ( ppunkOut == NULL )
goto InvalidPointer;
hr = THR( QueryInterface( DFGUID_ManagedResource,
reinterpret_cast< void ** >( ppunkOut )
) );
if ( FAILED( hr ) )
goto Cleanup;
hr = S_OK;
Cleanup:
HRETURN( hr );
InvalidArg:
hr = THR( E_INVALIDARG );
goto Cleanup;
InvalidPointer:
hr = THR( E_POINTER );
goto Cleanup;
} //*** CManagedDevice::FindObject( )