windows-nt/Source/XPSP1/NT/base/cluster/admin/common/clusobj.cpp
2020-09-26 16:20:57 +08:00

155 lines
4 KiB
C++

/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-1998 Microsoft Corporation
//
// Module Name:
// ClusObj.cpp
//
// Description:
// Implementation of the CClusterObject classes.
//
// Author:
// David Potter (davidp) September 15, 1998
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#include "ClusObj.h"
#include "AdmCommonRes.h"
/////////////////////////////////////////////////////////////////////////////
// class CClusResInfo
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//++
//
// CClusResInfo::BRequiredDependenciesPresent
//
// Routine Description:
// Determine if the resource contains each required resource for this
// type of resource.
//
// Arguments:
// plpri [IN] List of resources. Defaults to this resource's
// dependency list.
// rstrMissing [OUT] String in which to return a missing resource
// class name or type name.
// rbMissingTypeName
// [OUT] TRUE = missing resource type name
// FALSE = missing resource class
//
// Return Value:
// None.
//
// Exceptions Thrown:
// Any exceptions thrown by CString::LoadString() or CString::operator=().
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CClusResInfo::BRequiredDependenciesPresent(
IN CClusResPtrList const * plpri,
OUT CString & rstrMissing,
OUT BOOL & rbMissingTypeName
)
{
ATLASSERT( Prti() != NULL );
BOOL bFound = TRUE;
CLUSPROP_BUFFER_HELPER buf;
const CClusResInfo * pri;
// Loop to avoid goto's.
do
{
//
// We're done if there are no required dependencies.
//
if ( Prti()->Pcrd() == NULL )
{
break;
} // if: no required dependencies
//
// Default the list of resources if none specified.
//
if ( plpri == NULL )
{
plpri = PlpriDependencies();
} // if: no list of dependencies specified
//
// Get the list of required dependencies.
//
buf.pRequiredDependencyValue = Prti()->Pcrd();
//
// Loop through each required dependency and make sure
// there is a dependency on a resource of that type.
//
for ( ; buf.pSyntax->dw != CLUSPROP_SYNTAX_ENDMARK
; buf.pb += sizeof( *buf.pValue ) + ALIGN_CLUSPROP( buf.pValue->cbLength )
)
{
bFound = FALSE;
CClusResPtrList::iterator itCurrent = plpri->begin();
CClusResPtrList::iterator itLast = plpri->end();
for ( ; itCurrent != itLast ; itCurrent++ )
{
pri = *itCurrent;
//
// If this is the right type, we've satisfied the
// requirement so exit the loop.
//
if ( buf.pSyntax->dw == CLUSPROP_SYNTAX_RESCLASS )
{
if ( buf.pResourceClassValue->rc == pri->ResClass() )
{
bFound = TRUE;
} // if: match found
} // if: resource class
else if ( buf.pSyntax->dw == CLUSPROP_SYNTAX_NAME )
{
if ( pri->Prti()->RstrName().CompareNoCase( buf.pStringValue->sz ) == 0 )
{
bFound = TRUE;
} // if: match found
} // else if: resource name
if ( bFound )
{
break;
} // if: found a match
} // while: more items in the list
//
// If a match was not found, changes cannot be applied.
//
if ( ! bFound )
{
if ( buf.pSyntax->dw == CLUSPROP_SYNTAX_RESCLASS )
{
if ( ! rstrMissing.LoadString( ADMC_IDS_RESCLASS_UNKNOWN + buf.pResourceClassValue->rc ) )
{
rstrMissing.LoadString( ADMC_IDS_RESCLASS_UNKNOWN );
} // if: error loading specific class name
rbMissingTypeName = FALSE;
} // if: resource class not found
else if ( buf.pSyntax->dw == CLUSPROP_SYNTAX_NAME )
{
rstrMissing = buf.pStringValue->sz;
rbMissingTypeName = TRUE;
} // else if: resource type name not found
break;
} // if: not found
} // while: more dependencies required
} while ( 0 );
return bFound;
} //*** CClusResInfo::BRequiredDependenciesPresent()