Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

669 lines
18 KiB

/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-2002 Microsoft Corporation
//
// Module Name:
// CluAdmExDataObj.h
//
// Implementation File:
// CCluAdmExDataObject.cpp
//
// Description:
// Definition of the CCluAdmExDataObject class, which is the IDataObject
// class used to transfer data between a cluster management tool and the
// extension DLL handlers.
//
// Author:
// David Potter (davidp) June 4, 1996
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#pragma once
#ifndef __CLUADMEXDATAOBJ_H_
#define __CLUADMEXDATAOBJ_H_
/////////////////////////////////////////////////////////////////////////////
// Include Files
/////////////////////////////////////////////////////////////////////////////
#ifndef __cluadmex_h__
#include "CluAdmEx.h" // for IIDs
#endif
#ifndef __cluadmexhostsvr_h__
#include "CluAdmExHostSvr.h" // for CLSIDs
#endif
#ifndef __CLUSOBJ_H_
#include "ClusObj.h" // for CClusterObject
#endif
/////////////////////////////////////////////////////////////////////////////
// Type Declarations
/////////////////////////////////////////////////////////////////////////////
typedef BOOL (*PFGETRESOURCENETWORKNAME)(
OUT BSTR lpszNetName,
IN OUT DWORD * pcchNetName,
IN OUT PVOID pvContext
);
/////////////////////////////////////////////////////////////////////////////
// Forward Class Declarations
/////////////////////////////////////////////////////////////////////////////
class CCluAdmExDataObject;
/////////////////////////////////////////////////////////////////////////////
// External Class Declarations
/////////////////////////////////////////////////////////////////////////////
class CClusterObject;
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CCluAdmExDataObject
//
// Description:
// Encapsulates the IDataObject interface for exchanging data with
// extension DLL handlers.
//
// Inheritance:
// CCluAdmExDataObject
// CComObjectRootEx<>, CComCoClass<>, <interface classes>
//
//--
/////////////////////////////////////////////////////////////////////////////
class CCluAdmExDataObject :
public CComObjectRootEx< CComSingleThreadModel >,
public CComCoClass< CCluAdmExDataObject, &CLSID_CoCluAdmExHostSvrData >,
public ISupportErrorInfo,
public IGetClusterUIInfo,
public IGetClusterDataInfo,
public IGetClusterObjectInfo,
public IGetClusterNodeInfo,
public IGetClusterGroupInfo,
public IGetClusterResourceInfo,
public IGetClusterNetworkInfo,
public IGetClusterNetInterfaceInfo
{
public:
//
// Construction
//
// Default constructor
CCluAdmExDataObject( void )
{
m_pco = NULL;
m_lcid = NULL;
m_hfont = NULL;
m_hicon = NULL;
m_pfGetResNetName = NULL;
// m_pModuleState = AfxGetModuleState();
// ATLASSERT( m_pModuleState != NULL );
} //*** CCluAdmExDataObject()
// Destructor
virtual ~CCluAdmExDataObject( void )
{
// m_pModuleState = NULL;
} //*** ~CCluAdmExDataObject()
// Second-phase constructor.
void Init(
IN OUT CClusterObject * pco,
IN LCID lcid,
IN HFONT hfont,
IN HICON hicon
)
{
ATLASSERT( pco != NULL );
ATLASSERT( pco->Pci() != NULL );
ATLASSERT( pco->Pci()->Hcluster() != NULL );
// Save parameters.
m_pco = pco;
m_lcid = lcid;
m_hfont = hfont;
m_hicon = hicon;
} //*** Init()
//
// Map interfaces to this class.
//
BEGIN_COM_MAP( CCluAdmExDataObject )
COM_INTERFACE_ENTRY( IGetClusterUIInfo )
COM_INTERFACE_ENTRY( IGetClusterDataInfo )
COM_INTERFACE_ENTRY( IGetClusterObjectInfo )
COM_INTERFACE_ENTRY( IGetClusterNodeInfo )
COM_INTERFACE_ENTRY( IGetClusterGroupInfo )
COM_INTERFACE_ENTRY( IGetClusterResourceInfo )
COM_INTERFACE_ENTRY( IGetClusterNetworkInfo )
COM_INTERFACE_ENTRY( IGetClusterNetInterfaceInfo )
COM_INTERFACE_ENTRY( ISupportErrorInfo )
END_COM_MAP()
DECLARE_NOT_AGGREGATABLE( CCluAdmExDataObject )
protected:
//
// Properties of this data object.
//
CClusterObject * m_pco; // Cluster object being extended.
LCID m_lcid; // Locale ID of resources to be loaded by extension.
HFONT m_hfont; // Font for all text.
HICON m_hicon; // Icon for upper left corner.
PFGETRESOURCENETWORKNAME m_pfGetResNetName; // Pointer to static function for getting net name for resource.
PVOID m_pvGetResNetNameContext; // Context for m_pfGetResNetName;
static const IID * s_rgiid[]; // Array of interface IDs supported by this class.
//
// Accessor methods.
//
HCLUSTER Hcluster( void ) const
{
ATLASSERT( m_pco != NULL );
ATLASSERT( m_pco->Pci() != NULL );
return m_pco->Pci()->Hcluster();
} //*** Hcluster()
CClusterObject * Pco( void ) const { return m_pco; }
LCID Lcid( void ) const { return m_lcid; }
HFONT Hfont( void ) const { return m_hfont; }
HICON Hicon( void ) const { return m_hicon; }
public:
PFGETRESOURCENETWORKNAME PfGetResNetName( void ) const { return m_pfGetResNetName; }
// Set the function pointer for getting the resource name
void SetPfGetResNetName( PFGETRESOURCENETWORKNAME pfGetResNetName, PVOID pvContext )
{
m_pfGetResNetName = pfGetResNetName;
m_pvGetResNetNameContext = pvContext;
} //*** SetPfGetResNetName()
public:
//
// ISupportsErrorInfo methods.
//
// Determine if interface supports IErrorInfo
STDMETHOD( InterfaceSupportsErrorInfo )( REFIID riid )
{
const IID ** piid;
for ( piid = s_rgiid ; *piid != NULL ; piid++ )
{
if ( InlineIsEqualGUID( **piid, riid ) )
{
return S_OK;
} // if: matching IID found
}
return S_FALSE;
} //*** InterfaceSupportsErrorInfo()
public:
//
// IGetClusterUIInfo methods.
//
// Get the locale of the running program
STDMETHOD_( LCID, GetLocale )( void )
{
return Lcid();
} //*** GetLocale()
// Get the font to use for text on property pages
STDMETHOD_( HFONT, GetFont )( void )
{
return Hfont();
} //*** GetFont()
// Get the icon to use for the upper left corner
STDMETHOD_( HICON, GetIcon )( void )
{
return Hicon();
} //*** GetIcon()
public:
//
// IGetClusterDataInfo methods.
//
// Get the name of the cluster
STDMETHOD( GetClusterName )(
OUT BSTR lpszName,
IN OUT LONG * pcchName
)
{
ATLASSERT( Pco() != NULL );
ATLASSERT( Pco()->Pci() != NULL );
HRESULT hr;
//
// Validate parameters.
//
if ( pcchName == NULL )
{
return E_INVALIDARG;
}
//
// Copy the name to the caller's buffer.
//
hr = GetStringProperty(
Pco()->Pci()->RstrName(),
lpszName,
pcchName
);
return hr;
} //*** GetClusterName()
// Get a handle to the cluster
STDMETHOD_( HCLUSTER, GetClusterHandle )( void )
{
return Hcluster();
} //*** GetClusterHandle()
// Get the number of objects currently selected
STDMETHOD_( LONG, GetObjectCount )( void )
{
//
// We only support one selected object at a time for now.
//
return 1;
} //*** GetObjectCount()
public:
//
// IGetClusterObjectInfo methods.
//
// Get the name of the object at the specified index
STDMETHOD( GetObjectName )(
IN LONG nObjIndex,
OUT BSTR lpszName,
IN OUT LONG * pcchName
)
{
ATLASSERT( Pco() != NULL );
HRESULT hr;
//
// Validate parameters.
// We only support one selected object at a time for now.
//
if ( (nObjIndex != 0) || (pcchName == NULL) )
{
return E_INVALIDARG;
} // if: wrong object index or no count buffer
//
// Copy the name to the caller's buffer.
//
hr = GetStringProperty(
Pco()->RstrName(),
lpszName,
pcchName
);
return hr;
} //*** GetObjectName()
// Get the type of the object at the specified index
STDMETHOD_( CLUADMEX_OBJECT_TYPE, GetObjectType )(
IN LONG nObjIndex
)
{
ATLASSERT( Pco() != NULL );
//
// Validate parameters.
// We only support one selected object at a time for now.
//
if ( nObjIndex == 1 )
{
SetLastError( (DWORD) E_INVALIDARG );
return (CLUADMEX_OBJECT_TYPE) -1;
} // if: invalid argument
return Pco()->Cot();
} //*** GetObjectType()
public:
//
// IGetClusterNodeInfo methods.
//
// Get the handle to the node at the specified index
STDMETHOD_( HNODE, GetNodeHandle )(
IN LONG nObjIndex
)
{
ATLASSERT( Pco() != NULL );
//
// Validate parameters.
// We only support one selected object at a time for now.
//
if ( (nObjIndex == 1)
|| (Pco()->Cot() != CLUADMEX_OT_NODE) )
{
SetLastError( (DWORD) E_INVALIDARG );
return NULL;
} // if: invalid argument
CClusNodeInfo * pni = reinterpret_cast< CClusNodeInfo * >( Pco() );
return pni->Hnode();
} //*** GetNodeHandle()
public:
//
// IGetClusterGroupInfo methods.
//
// Get the handle to the group at the specified index
STDMETHOD_( HGROUP, GetGroupHandle )(
IN LONG nObjIndex
)
{
ATLASSERT( Pco() != NULL );
//
// Validate parameters.
// We only support one selected object at a time for now.
//
if ( (nObjIndex == 1)
|| (Pco()->Cot() != CLUADMEX_OT_GROUP) )
{
SetLastError( (DWORD) E_INVALIDARG );
return NULL;
} // if: invalid argument
CClusGroupInfo * pgi = reinterpret_cast< CClusGroupInfo * >( Pco() );
return pgi->Hgroup();
} //*** GetGroupHandle()
public:
//
// IGetClusterResourceInfo methods.
//
// Get the handle to the resource at the specified index
STDMETHOD_( HRESOURCE, GetResourceHandle )(
IN LONG nObjIndex
)
{
ATLASSERT( Pco() != NULL );
//
// Validate parameters.
// We only support one selected object at a time for now.
//
if ( (nObjIndex == 1)
|| (Pco()->Cot() != CLUADMEX_OT_RESOURCE) )
{
SetLastError( (DWORD) E_INVALIDARG );
return NULL;
} // if: invalid argument
CClusResInfo * pri = reinterpret_cast< CClusResInfo * >( Pco() );
return pri->Hresource();
} //*** GetResourceHandle()
// Get the type of the resource at the specified index
STDMETHOD( GetResourceTypeName )(
IN LONG nObjIndex,
OUT BSTR lpszResourceTypeName,
IN OUT LONG * pcchResTypeName
)
{
ATLASSERT( Pco() != NULL );
HRESULT hr;
CClusResInfo * pri = reinterpret_cast< CClusResInfo * >( Pco() );
//
// Validate parameters.
// We only support one selected object at a time for now.
//
if ( (nObjIndex != 0)
|| (pcchResTypeName == NULL)
|| (Pco()->Cot() != CLUADMEX_OT_RESOURCE) )
{
return E_INVALIDARG;
} // if: invalid argument
//
// Copy the name to the caller's buffer.
//
ATLASSERT( pri->Prti() != NULL );
hr = GetStringProperty(
pri->Prti()->RstrName(),
lpszResourceTypeName,
pcchResTypeName
);
return hr;
} //*** GetResourceTypeName()
// Get the network name for the resource at the specified index
STDMETHOD_( BOOL, GetResourceNetworkName )(
IN LONG nObjIndex,
OUT BSTR lpszNetName,
IN OUT ULONG * pcchNetName
)
{
ATLASSERT( Pco() != NULL );
BOOL bSuccess = FALSE;
CClusResInfo * pri = reinterpret_cast< CClusResInfo * >( Pco() );
try
{
//
// Validate parameters.
// We only support one selected object at a time for now.
//
if ( (nObjIndex != 0)
|| (pcchNetName == NULL)
|| (*pcchNetName < MAX_COMPUTERNAME_LENGTH)
|| (Pco()->Cot() != CLUADMEX_OT_RESOURCE) )
{
SetLastError( (DWORD) E_INVALIDARG );
return FALSE;
} // if: invalid argument
//
// If there is a function for getting this information, call it.
// Otherwise, handle it ourselves.
//
if ( PfGetResNetName() != NULL )
{
bSuccess = (*PfGetResNetName())( lpszNetName, pcchNetName, m_pvGetResNetNameContext );
} // if: function specified for getting this info
else
{
bSuccess = pri->BGetNetworkName( lpszNetName, pcchNetName );
} // if: no function specified for getting this info
} // try
catch (...)
{
bSuccess = FALSE;
SetLastError( (DWORD) E_INVALIDARG );
} // catch: anything
return bSuccess;
} //*** GetResourceNetworkName()
public:
//
// IGetClusterNetworkInfo methods.
//
// Get the handle to the network at the specified index
STDMETHOD_( HNETWORK, GetNetworkHandle )(
IN LONG nObjIndex
)
{
ATLASSERT( Pco() != NULL );
// Validate parameters.
// We only support one selected object at a time for now.
if ( (nObjIndex == 1)
|| (Pco()->Cot() != CLUADMEX_OT_NETWORK) )
{
SetLastError( (DWORD) E_INVALIDARG );
return NULL;
} // if: invalid argument
CClusNetworkInfo * pni = reinterpret_cast< CClusNetworkInfo * >( Pco() );
return pni->Hnetwork();
} //*** GetNetworkHandle()
public:
//
// IGetClusterNetInterfaceInfo methods.
//
// Get the handle to the network interface at the specified index
STDMETHOD_( HNETINTERFACE, GetNetInterfaceHandle )(
IN LONG nObjIndex
)
{
ATLASSERT( Pco() != NULL );
// Validate parameters.
// We only support one selected object at a time for now.
if ( (nObjIndex == 1)
|| (Pco()->Cot() != CLUADMEX_OT_NETINTERFACE) )
{
SetLastError( (DWORD) E_INVALIDARG );
return NULL;
} // if: invalid argument
CClusNetIFInfo * pnii = reinterpret_cast< CClusNetIFInfo * >( Pco() );
return pnii->Hnetinterface();
} //*** GetNetInterfaceHandle()
// Implementation
protected:
// AFX_MODULE_STATE * m_pModuleState; // Required for resetting our state during callbacks.
// Get a string property
STDMETHOD( GetStringProperty )(
IN const CString & rstrNameSource,
OUT BSTR lpszName,
IN OUT LONG * pcchName
)
{
ATLASSERT( pcchName != NULL );
LONG cchName = 0;
HRESULT hr = S_OK;
//
// Save the length to copy.
//
try
{
cchName = *pcchName;
*pcchName = rstrNameSource.GetLength() + 1;
} // try
catch (...)
{
hr = E_INVALIDARG;
goto Cleanup;
} // catch: anything
//
// If only the length is being requested, return it now.
//
if ( lpszName == NULL )
{
hr = S_OK;
goto Cleanup;
} // if: no name buffer specified
//
// If a buffer is specified and it is too small, return an error.
//
if ( cchName < *pcchName )
{
hr = ERROR_MORE_DATA;
goto Cleanup;
} // if: buffer too small
//
// Copy the data.
//
hr = StringCchCopyNW( lpszName, cchName, rstrNameSource, rstrNameSource.GetLength() );
if ( FAILED( hr ) )
{
goto Cleanup;
} // if: error copying data
Cleanup:
return hr;
} //*** GetStringProperty()
}; //*** class CCluAdmExDataObject
/////////////////////////////////////////////////////////////////////////////
// Class Data
/////////////////////////////////////////////////////////////////////////////
_declspec( selectany ) const IID * CCluAdmExDataObject::s_rgiid[] =
{
&IID_IGetClusterDataInfo,
&IID_IGetClusterObjectInfo,
&IID_IGetClusterNodeInfo,
&IID_IGetClusterGroupInfo,
&IID_IGetClusterResourceInfo,
&IID_IGetClusterNetworkInfo,
&IID_IGetClusterNetInterfaceInfo,
NULL
};
/////////////////////////////////////////////////////////////////////////////
#endif // __CLUADMEXDATAOBJ_H_