|
|
/////////////////////////////////////////////////////////////////////////////
//
// 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_
|