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.
 
 
 
 
 
 

363 lines
16 KiB

/*++
© 1998 Seagate Software, Inc. All rights reserved.
Module Name:
BaseHSM.h
Abstract:
Implementation of CSakNode. This is the base class for any
of the node implementations, providing common functionality.
Author:
Rohde Wakefield [rohde] 12-Aug-1997
Revision History:
--*/
#ifndef _BASEHSM_H
#define _BASEHSM_H
#define BHSM_MAX_CHILD_PROPS 15
#define BHSM_MAX_NAME 40
#define BHSM_MAX_REG_NAME 512
#define BHSM_MAX_NODE_TYPES 10
// Toolbar buttons for all nodes
#define TB_CMD_VOLUME_SETTINGS 100
#define TB_CMD_VOLUME_TOOLS 101
#define TB_CMD_VOLUME_RULES 102
#define TB_CMD_VOLUME_LIST_SCHED 110
#define TB_CMD_VOLUME_LIST_NEW 111
#define TB_CMD_MESE_COPY 120
#define TB_CMD_CAR_COPIES 130
typedef struct _RS_MMCButton {
INT nBitmap;
INT idCommand;
BYTE fsState;
BYTE fsType;
UINT idButtonText;
UINT idTooltipText;
} RS_MMCBUTTON;
#define MAX_TOOLBAR_BUTTONS 20
// This is a dataobject-related structure that maintains basic information that needs to be passed
// from one dataobject-taking method to another.
struct INTERNAL {
DATA_OBJECT_TYPES m_type; // What context is the data object.
};
//
// Declare array that can be added to or completely cleared
// Grows as needed
//
class CRsNodeArray : public CArray<ISakNode*, ISakNode*>
{
public:
CRsNodeArray( ) { SetSize( 0, 10 ); };
~CRsNodeArray( ) { Clear( ); };
ISakNode** begin( ) { return( GetData( ) ); };
ISakNode** end( ) { return( GetData( ) + length( ) ); } ;
INT length( ) { return( (INT)GetUpperBound( ) + 1 ); };
HRESULT Add( ISakNode* pNode )
{
HRESULT hr = S_OK;
try {
CWsbBstrPtr keyAdd, keyEnum;
CComPtr<ISakNodeProp> pNodeProp, pEnumProp;
WsbAffirmHr( RsQueryInterface( pNode, ISakNodeProp, pNodeProp ) );
WsbAffirmHr( pNodeProp->get_DisplayName_SortKey( &keyAdd ) );
ISakNode*pNodeEnum;
INT index;
for( index = 0; index < length( ); index++ ) {
pNodeEnum = GetAt( index );
if( pNodeEnum ) {
keyEnum.Free( );
pEnumProp.Release( );
if( SUCCEEDED( RsQueryInterface( pNodeEnum, ISakNodeProp, pEnumProp ) ) ) {
if( SUCCEEDED( pEnumProp->get_DisplayName_SortKey( &keyEnum ) ) ) {
if( _wcsicmp( keyAdd, keyEnum ) <= 0 ) {
break;
}
}
}
}
}
try {
CArray<ISakNode*, ISakNode*>::InsertAt( index, pNode );
} catch( CMemoryException* pException ) {
pException->Delete();
WsbThrow( E_OUTOFMEMORY );
}
pNode->AddRef( );
} WsbCatch( hr );
return( hr );
};
void Clear( void )
{
ISakNode*pNode;
for( int index = 0; index < length( ); index++ ) {
pNode = GetAt( index );
SetAt( index, 0 );
if( pNode ) pNode->Release( );
}
RemoveAll( );
};
HRESULT CopyTo( int Index, ISakNode** ppNode )
{
if( !ppNode ) return( E_POINTER );
*ppNode = GetAt( Index );
if( *ppNode ) (*ppNode)->AddRef( );
return S_OK;
};
};
class ATL_NO_VTABLE CSakNode :
public CComObjectRoot,
public ISakNode,
public IHsmEvent,
public CComDualImpl<ISakNodeProp, &IID_ISakNodeProp, &LIBID_HSMADMINLib>,
public IDataObject
{
public:
CSakNode( ) : m_rTypeGuid(&(GUID_NULL)) {}
HRESULT FinalConstruct( void );
void FinalRelease( void );
ULONG InternalAddRef( );
ULONG InternalRelease( );
// ISakNode methods
STDMETHOD( InitNode ) ( ISakSnapAsk* pSakSnapAsk, IUnknown* pHsmObj, ISakNode* pParent );
STDMETHOD( TerminateNode ) ( void );
STDMETHOD( GetPrivateData ) ( OUT RS_PRIVATE_DATA* pData );
STDMETHOD( SetPrivateData ) ( IN RS_PRIVATE_DATA Data );
STDMETHOD( GetHsmObj ) ( IUnknown** ppHsmObj );
STDMETHOD( GetNodeType ) ( GUID *pNodeType );
STDMETHOD( FindNodeOfType ) ( REFGUID nodetype, ISakNode** ppNode );
STDMETHOD( GetEnumState ) ( BOOL* pState );
STDMETHOD( SetEnumState ) ( BOOL State );
STDMETHOD( GetScopeID ) ( HSCOPEITEM* pid );
STDMETHOD( SetScopeID ) ( HSCOPEITEM id );
STDMETHOD( GetParent ) ( ISakNode ** ppParent );
STDMETHOD( IsContainer ) ( void );
STDMETHOD( CreateChildren ) ( void );
STDMETHOD( EnumChildren ) ( IEnumUnknown ** ppEnum );
STDMETHOD( DeleteChildren ) ( void );
STDMETHOD( DeleteAllChildren ) ( void );
STDMETHOD( ChildrenAreValid ) ( void );
STDMETHOD( InvalidateChildren ) ( void );
STDMETHOD( HasDynamicChildren ) ( void );
STDMETHOD( EnumChildDisplayProps ) ( IEnumString ** ppEnum );
STDMETHOD( EnumChildDisplayTitles ) ( IEnumString ** ppEnum );
STDMETHOD( EnumChildDisplayPropWidths ) ( IEnumString ** ppEnum );
STDMETHOD( GetMenuHelp ) ( LONG sCmd, BSTR * szHelp );
STDMETHOD( SupportsPropertiesNoEngine ) ( void );
STDMETHOD( SupportsProperties ) ( BOOL bMutliSelec );
STDMETHOD( SupportsRefresh ) ( BOOL bMutliSelect );
STDMETHOD( SupportsRefreshNoEngine ) ( );
STDMETHOD( SupportsDelete ) ( BOOL bMutliSelec );
STDMETHOD( AddPropertyPages ) ( RS_NOTIFY_HANDLE handle, IUnknown* pUnkPropSheetCallback, IEnumGUID *pEnumGuid, IEnumUnknown *pEnumUnkNode);
STDMETHOD( ActivateView ) ( OLE_HANDLE );
STDMETHOD( RefreshObject ) ( void );
STDMETHOD( DeleteObject ) ( void );
STDMETHOD( GetObjectId ) ( GUID *pObjectId );
STDMETHOD( SetObjectId ) ( GUID pObjectId );
STDMETHOD( SetupToolbar ) ( IToolbar *pToolbar );
STDMETHOD( HasToolbar ) ( void );
STDMETHOD( OnToolbarButtonClick ) ( IDataObject *pDataObject, long cmdId );
STDMETHOD( IsValid ) ( );
// IHsmEvent methods
STDMETHOD( OnStateChange ) ( void );
// ISakNodeProp methods
STDMETHOD( get_DisplayName ) ( BSTR *pszName );
STDMETHOD( put_DisplayName ) ( OLECHAR *pszName );
STDMETHOD( get_DisplayName_SortKey ) ( BSTR *pszName );
STDMETHOD( put_DisplayName_SortKey ) ( OLECHAR *pszName );
STDMETHOD( get_Type ) ( BSTR *pszType );
STDMETHOD( put_Type ) ( OLECHAR *pszType );
STDMETHOD( get_Type_SortKey ) ( BSTR *pszType );
STDMETHOD( get_Description ) ( BSTR *pszDesc );
STDMETHOD( put_Description ) ( OLECHAR *pszDesc );
STDMETHOD( get_Description_SortKey ) ( BSTR *pszDesc );
// IDataObject methods
public:
// Implemented
STDMETHOD( SetData ) ( LPFORMATETC lpFormatetc, LPSTGMEDIUM lpMedium, BOOL bRelease );
STDMETHOD( GetData ) ( LPFORMATETC lpFormatetcIn, LPSTGMEDIUM lpMedium );
STDMETHOD( GetDataHere ) ( LPFORMATETC lpFormatetc, LPSTGMEDIUM lpMedium );
STDMETHOD( EnumFormatEtc ) ( DWORD dwDirection, LPENUMFORMATETC* ppEnumFormatEtc );
// IDataObject methods that are Not Implemented
private:
STDMETHOD( QueryGetData ) ( LPFORMATETC /*lpFormatetc*/ )
{ return E_NOTIMPL; };
STDMETHOD( GetCanonicalFormatEtc ) ( LPFORMATETC /*lpFormatetcIn*/, LPFORMATETC /*lpFormatetcOut*/ )
{ return E_NOTIMPL; };
STDMETHOD( DAdvise ) ( LPFORMATETC /*lpFormatetc*/, DWORD /*advf*/, LPADVISESINK /*pAdvSink*/, LPDWORD /*pdwConnection*/ )
{ return E_NOTIMPL; };
STDMETHOD( DUnadvise ) ( DWORD /*dwConnection*/ )
{ return E_NOTIMPL; };
STDMETHOD( EnumDAdvise ) ( LPENUMSTATDATA* /*ppEnumAdvise*/ )
{ return E_NOTIMPL; };
// Implementation
public:
CRsNodeArray m_Children; // Child nodes
BOOL m_bEnumState; // TRUE if children have been enumerated
HSCOPEITEM m_scopeID; // MMC scope item id.
BOOL m_bChildrenAreValid; // TRUE if list of children is up-to-date
CWsbBstrPtr m_szName; // name of node
CWsbBstrPtr m_szName_SortKey; // name of node
CWsbBstrPtr m_szType; // type of node
CWsbBstrPtr m_szDesc; // description of node
BSTR m_rgszChildPropIds[BHSM_MAX_CHILD_PROPS]; // array of child node property Ids
BSTR m_rgszChildPropTitles[BHSM_MAX_CHILD_PROPS];// array of child node title properties
BSTR m_rgszChildPropWidths[BHSM_MAX_CHILD_PROPS];// array of child node width properties
INT m_cChildProps; // number of child node properties
INT m_cChildPropsShow; // number of child node properties to show
CComPtr<ISakNode> m_pParent;
CComPtr<ISakSnapAsk> m_pSakSnapAsk; // pointer to the saksnap "ask" interface
CComPtr<IUnknown> m_pHsmObj; // pointer to the underlying HSM COM object this node encapsulates
const GUID* m_rTypeGuid; // pointer to the type guid for this node type
BOOL m_bSupportsPropertiesNoEngine; // TRUE if this node has property pages.
BOOL m_bSupportsPropertiesSingle; // TRUE if this node has property pages.
BOOL m_bSupportsPropertiesMulti; // TRUE if this node has property pages.
BOOL m_bSupportsRefreshSingle; // TRUE if this node supports the refresh method.
BOOL m_bSupportsRefreshMulti; // TRUE if this node supports the refresh method.
BOOL m_bSupportsRefreshNoEngine; // TRUE if this node supports the refresh method.
BOOL m_bSupportsDeleteSingle; // TRUE if this node supports the delete method.
BOOL m_bSupportsDeleteMulti; // TRUE if this node supports the delete method.
BOOL m_bIsContainer; // TRUE if this node is a container type (as opposed to leaf).
BOOL m_bHasDynamicChildren; // TRUE if this nodes immediate children change
protected:
GUID m_ObjectId;
RS_PRIVATE_DATA m_PrivateData;
INT m_ToolbarBitmap;
INT m_cToolbarButtons;
RS_MMCBUTTON m_ToolbarButtons[MAX_TOOLBAR_BUTTONS];
// Clipboard formats that are required by the console
public:
static UINT m_cfNodeType;
static UINT m_cfNodeTypeString;
static UINT m_cfDisplayName;
static UINT m_cfInternal;
static UINT m_cfClassId;
static UINT m_cfComputerName;
static UINT m_cfEventLogViews;
private:
// Generic "GetData" which will allocate if told to
HRESULT GetDataGeneric( LPFORMATETC lpFormatetcIn, LPSTGMEDIUM lpMedium, BOOL DoAlloc );
// methods to retrieve particular "flavors" of data from a dataobject
HRESULT RetrieveNodeTypeData( LPSTGMEDIUM lpMedium );
HRESULT RetrieveNodeTypeStringData( LPSTGMEDIUM lpMedium );
HRESULT RetrieveDisplayName( LPSTGMEDIUM lpMedium );
HRESULT RetrieveInternal( LPSTGMEDIUM lpMedium );
HRESULT RetrieveClsid( LPSTGMEDIUM lpMedium );
HRESULT RetrieveComputerName( LPSTGMEDIUM lpMedium );
HRESULT RetrieveEventLogViews( LPSTGMEDIUM lpMedium );
// methods to store particular "flavors" of data from a dataobject
HRESULT StoreInternal( LPSTGMEDIUM lpMedium );
// helper method utilized by each of the above
HRESULT Retrieve(const void* pBuffer, DWORD len, LPSTGMEDIUM lpMedium);
HRESULT Store(void* pBuffer, DWORD len, LPSTGMEDIUM lpMedium);
// actual data store in this dataobject.
INTERNAL m_internal;
// Maintain a connection point
CComPtr<IUnknown> m_pUnkConnection;
DWORD m_Advise;
protected:
void SetConnection( IUnknown *pUnkConnection );
virtual HRESULT RefreshScopePane( );
// Registry Helper Functions for derived classes. Not a part of any interface.
static HRESULT LoadRegString( HKEY hKey, OLECHAR * szValName, OLECHAR * sz, OLECHAR * szDefault );
static HRESULT LoadRegDWord( HKEY hKey, OLECHAR * szValName, DWORD * pdw, DWORD dwDefault );
// Helper functions for derived classes to set result pane properties from resource strings
HRESULT FreeChildProps();
HRESULT SetChildProps (const TCHAR* ResIdPropsIds, LONG resIdPropsTitles, LONG resIdPropsWidths);
// Helper Functions to create our children.
static HRESULT NewChild( REFGUID nodetype, IUnknown** ppUnkChild );
HRESULT InternalDelete( BOOL Recurse );
HRESULT AddChild( ISakNode* pChild );
// General Helper functions - not part of any interface.
static HRESULT LoadContextMenu( UINT nId, HMENU *phMenu );
static HRESULT GetCLSIDFromNodeType( REFGUID nodetype, const CLSID ** ppclsid );
static const OLECHAR * CSakNode::GetClassNameFromNodeType( REFGUID Nodetype );
static int AddScopeImage( UINT nId );
static int AddResultImage( UINT nId );
static BSTR SysAlloc64BitSortKey( LONGLONG Number );
};
// macro for multiple-inheritance (CSakNode and a ISakNode derived interface)
// Forwards all CSakNode implemented members to CSakNode explicitly
#define FORWARD_BASEHSM_IMPLS \
STDMETHOD( get_DisplayName ) ( BSTR *pszName ) { return CSakNode::get_DisplayName( pszName ); } \
STDMETHOD( put_DisplayName ) ( OLECHAR *pszName ) { return CSakNode::put_DisplayName( pszName ); } \
STDMETHOD( get_DisplayName_SortKey ) ( BSTR *pszName ) { return CSakNode::get_DisplayName_SortKey( pszName ); } \
STDMETHOD( put_DisplayName_SortKey ) ( OLECHAR *pszName ) { return CSakNode::put_DisplayName_SortKey( pszName ); } \
STDMETHOD( get_Type ) ( BSTR *pszType ) { return CSakNode::get_Type( pszType ); } \
STDMETHOD( put_Type ) ( OLECHAR *pszType ) { return CSakNode::put_Type( pszType ); } \
STDMETHOD( get_Type_SortKey ) ( BSTR *pszType ) { return CSakNode::get_Type_SortKey( pszType ); } \
STDMETHOD( get_Description ) ( BSTR *pszDesc ) { return CSakNode::get_Description( pszDesc ); } \
STDMETHOD( put_Description ) ( OLECHAR *pszDesc ) { return CSakNode::put_Description( pszDesc ); } \
STDMETHOD( get_Description_SortKey ) ( BSTR *pszDesc ) { return CSakNode::get_Description_SortKey( pszDesc ); } \
// Typedef of class that implements IEnumUnknown
typedef CComObject<CComEnum<IEnumUnknown, &IID_IEnumUnknown, IUnknown *,
_CopyInterface<IUnknown> > > CEnumUnknown;
// Typedef of class that implements IEnumVARIANT
typedef CComObject<CComEnum<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT,
_Copy<VARIANT> > > CEnumVariant;
// Typedef of class that implements IEnumString
typedef CComObject<CComEnum<IEnumString, &IID_IEnumString, LPOLESTR,
_Copy<LPOLESTR> > > CEnumString;
// Typedef of class that implements IEnumGUID
typedef CComObject<CComEnum<IEnumGUID, &IID_IEnumGUID, GUID,
_Copy<GUID> > > CEnumGUID;
#endif