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.
 
 
 
 
 
 

628 lines
18 KiB

/*++
© 1998 Seagate Software, Inc. All rights reserved
Module Name:
ManVolLs.cpp
Abstract:
Node representing Managed Volumes as a whole.
Author:
Rohde Wakefield [rohde] 08-Aug-1997
Revision History:
--*/
#include "stdafx.h"
#include "WzMnVlLs.h" // managed Resource creation wizard
#include "PrMrSts.h"
#include "ManVolLs.h"
int CUiManVolLst::m_nScopeCloseIcon = AddScopeImage( IDI_DEVLST );
int CUiManVolLst::m_nScopeCloseIconX = AddScopeImage( IDI_DEVLSTX );
int CUiManVolLst::m_nScopeOpenIcon = AddScopeImage( IDI_NODEOPENFOLDER );
int CUiManVolLst::m_nScopeOpenIconX = CUiManVolLst::m_nScopeCloseIconX;
int CUiManVolLst::m_nResultIcon = AddResultImage( IDI_DEVLST );
int CUiManVolLst::m_nResultIconX = AddResultImage( IDI_DEVLSTX );
/////////////////////////////////////////////////////////////////////////////
//
// CoComObjectRoot
//
/////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
//
// FinalConstruct
//
// Initialize this level of the object hierarchy
//
HRESULT CUiManVolLst::FinalConstruct( )
{
WsbTraceIn( L"CUiManVolLst::FinalConstruct", L"" );
m_rTypeGuid = &cGuidManVolLst;
HRESULT hr = CSakNode::FinalConstruct( );
m_bSupportsPropertiesSingle = TRUE;
m_bSupportsPropertiesMulti = FALSE;
m_bSupportsDeleteSingle = FALSE;
m_bSupportsDeleteMulti = FALSE;
m_bSupportsRefreshSingle = TRUE;
m_bSupportsRefreshMulti = FALSE;
m_bIsContainer = TRUE;
m_bHasDynamicChildren = TRUE;
// Toolbar values
INT i = 0;
#if 0 // MS does not want us to have schedule toolbar button
m_ToolbarButtons[i].nBitmap = 0;
m_ToolbarButtons[i].idCommand = TB_CMD_VOLUME_LIST_SCHED;
m_ToolbarButtons[i].idButtonText = IDS_TB_TEXT_VOLUME_LIST_SCHED;
m_ToolbarButtons[i].idTooltipText = IDS_TB_TIP_VOLUME_LIST_SCHED;
i++;
#endif
m_ToolbarButtons[i].nBitmap = 0;
m_ToolbarButtons[i].idCommand = TB_CMD_VOLUME_LIST_NEW;
m_ToolbarButtons[i].idButtonText = IDS_TB_TEXT_VOLUME_LIST_NEW;
m_ToolbarButtons[i].idTooltipText = IDS_TB_TIP_VOLUME_LIST_NEW;
i++;
m_ToolbarBitmap = IDB_TOOLBAR_VOLUME_LIST;
m_cToolbarButtons = i;
WsbTraceOut( L"CUiManVolLst::FinalConstruct", L"hr = <%ls>", WsbHrAsString( hr ) );
return( hr );
}
//---------------------------------------------------------------------------
//
// FinalRelease
//
// Clean up this level of the object hierarchy
//
void CUiManVolLst::FinalRelease( )
{
WsbTraceIn( L"CUiManVolLst::FinalRelease", L"" );
CSakNode::FinalRelease( );
WsbTraceOut( L"CUiManVolLst::FinalRelease", L"" );
}
/////////////////////////////////////////////////////////////////////////////
//
// ISakNode
//
/////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
//
// GetContextMenu
//
// Return an HMENU to be used for context menus on this node.
// Set the state of the menus according to the engine state.
//
STDMETHODIMP
CUiManVolLst::GetContextMenu( BOOL /* bMultiSelect */, HMENU* phMenu )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HRESULT hr = S_OK;
try {
LoadContextMenu( IDR_MANVOLLST, phMenu );
CMenu* pRootMenu, *pNewMenu, *pTaskMenu;
CMenu menu;
menu.Attach( *phMenu );
pRootMenu = menu.GetSubMenu( MENU_INDEX_ROOT );
pNewMenu = menu.GetSubMenu( MENU_INDEX_NEW );
pTaskMenu = menu.GetSubMenu( MENU_INDEX_TASK );
//
// If engine down, disable these items
//
if ( m_pSakSnapAsk->GetState() != S_OK ) {
pNewMenu->EnableMenuItem( ID_MANVOLLST_NEW_MANVOL, MF_GRAYED | MF_BYCOMMAND );
}
menu.Detach();
} WsbCatch( hr );
return( hr );
}
//---------------------------------------------------------------------------
//
// InvokeCommand
//
// User has selected a command from the menu. Process it here.
//
STDMETHODIMP
CUiManVolLst::InvokeCommand( SHORT sCmd, IDataObject* /* pDataObject */ )
{
WsbTraceIn( L"CUiManVolLst::InvokeCommand", L"sCmd = <%d>", sCmd );
CString theString;
HRESULT hr = S_OK;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
try {
switch (sCmd) {
case MMC_VERB_REFRESH:
RefreshObject( );
RefreshScopePane( );
break;
case ID_MANVOLLST_ROOT_MANVOL:
case ID_MANVOLLST_NEW_MANVOL:
{
//
// use wizard to create manage volume
//
CComObject<CWizManVolLst>* pWizard = new CComObject<CWizManVolLst>;
WsbAffirmAlloc( pWizard );
CComPtr<ISakWizard> pSakWizard = (ISakWizard*)pWizard;
WsbAffirmHr( m_pSakSnapAsk->CreateWizard( pSakWizard ) );
if( S_OK == pWizard->m_HrFinish ) {
WsbAffirmHr( RefreshScopePane( ) );
}
break;
}
default:
WsbThrow( S_FALSE );
break;
}
} WsbCatch( hr );
WsbTraceOut( L"CUiManVolLst::InvokeCommand", L"hr = <%ls>", WsbHrAsString( hr ) );
return( hr );
}
HRESULT CUiManVolLst::SetupToolbar( IToolbar *pToolbar )
{
WsbTraceIn( L"CUiManVolLst::SetupToolbar", L"pToolbar = <0x%p>", pToolbar );
HRESULT hr = S_OK;
try {
for( INT i = 0; i < m_cToolbarButtons; i++ ) {
m_ToolbarButtons[i].fsState = (UCHAR)( ( S_OK == m_pSakSnapAsk->GetState( ) ) ? TBSTATE_ENABLED : 0 );
}
WsbAffirmHr( CSakNode::SetupToolbar( pToolbar ) );
} WsbCatch( hr );
WsbTraceOut( L"CUiManVolLst::SetupToolbar", L"hr = <%ls>", WsbHrAsString( hr ) );
return hr;
}
HRESULT CUiManVolLst::OnToolbarButtonClick( IDataObject* /* pDataObject */, long cmdId )
{
WsbTraceIn( L"CUiManVolLst::OnToolbarButtonClick", L"cmdId = <%d>", cmdId );
HRESULT hr = S_OK;
try {
switch ( cmdId ) {
case TB_CMD_VOLUME_LIST_NEW:
{
//
// use wizard to create manage volume
//
CComObject<CWizManVolLst>* pWizard = new CComObject<CWizManVolLst>;
WsbAffirmAlloc( pWizard );
CComPtr<ISakWizard> pSakWizard = (ISakWizard*)pWizard;
WsbAffirmHr( m_pSakSnapAsk->CreateWizard( pSakWizard ) );
if( S_OK == pWizard->m_HrFinish ) {
WsbAffirmHr( RefreshScopePane() );
}
break;
}
}
} WsbCatch( hr );
WsbTraceOut( L"CUiManVolLst::OnToolbarButtonClick", L"hr = <%ls>", WsbHrAsString( hr ) );
return( hr );
}
//---------------------------------------------------------------------------------
//
// RefreshObject
//
// Refresh data in the object. This function is used for data that can change
// (for example, volume utilization).
//
STDMETHODIMP CUiManVolLst::RefreshObject ()
{
WsbTraceIn( L"CUiManVolLst::RefreshObject", L"" );
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HRESULT hr = S_OK;
try {
//
// Get the server objects
//
m_pHsmServer.Release( );
m_pFsaServer.Release( );
m_pFsaFilter.Release( );
m_pManResCollection.Release( );
if( m_pSakSnapAsk->GetHsmServer( &m_pHsmServer ) == S_OK) {
// Get the FsaServer object
if ( m_pSakSnapAsk->GetFsaServer( &m_pFsaServer ) == S_OK) {
// Get the Fsa Filter object
WsbAffirmHr( m_pFsaServer->GetFilter( &m_pFsaFilter ) );
// Tell FSA to rescan (updates properties)
WsbAffirmHr( m_pFsaServer->ScanForResources( ) );
// Get Managed Volumes collection from HSM server
WsbAffirmHr( m_pHsmServer->GetManagedResources( &m_pManResCollection ) );
}
}
} WsbCatch( hr );
WsbTraceOut( L"CUiManVolLst::RefreshObject", L"hr = <%ls>", WsbHrAsString( hr ) );
return( hr );
}
HRESULT CUiManVolLst::ShowManVolLstProperties (IDataObject *pDataObject, int initialPage)
{
WsbTraceIn( L"CUiManVolLst::ShowManVolLstProperties", L"initialPage = <%d>", initialPage );
HRESULT hr = S_OK;
try {
CComPtr <ISakNode> pSakNode;
WsbAffirmHr( _InternalQueryInterface( IID_ISakNode, (void **) &pSakNode ) );
WsbAffirmHr( m_pSakSnapAsk->ShowPropertySheet( pSakNode, pDataObject, initialPage ) );
} WsbCatch( hr );
WsbTraceOut( L"CUiManVolLst::ShowManVolLstProperties", L"hr = <%ls>", WsbHrAsString( hr ) );
return( hr );
}
//----------------------------------------------------------------------------
//
// AddPropertyPages
//
STDMETHODIMP
CUiManVolLst::AddPropertyPages( RS_NOTIFY_HANDLE handle, IUnknown* pUnkPropSheetCallback, IEnumGUID *pEnumObjectId, IEnumUnknown *pEnumUnkNode )
{
WsbTraceIn( L"CUiManVolLst::AddPropertyPages", L"handle = <%ld>, pUnkPropSheetCallback = <0x%0.l8x>, pEnumObjectId = <0x%p>",
handle, pUnkPropSheetCallback, pEnumObjectId );
HRESULT hr = S_OK;
try {
//
// Create an object to hold the pages
//
CUiManVolLstSheet *pManVolPropertySheet = new CUiManVolLstSheet;
WsbAffirmAlloc( pManVolPropertySheet );
WsbAffirmHr( pManVolPropertySheet->InitSheet(
handle,
pUnkPropSheetCallback,
(CSakNode *) this,
m_pSakSnapAsk,
pEnumObjectId,
pEnumUnkNode
) );
//
// Tell the object to add it's pages
//
WsbAffirmHr( pManVolPropertySheet->AddPropertyPages( ) );
} WsbCatch ( hr );
WsbTraceOut( L"CUiManVolLst::AddPropertyPages", L"hr = <%ls>", WsbHrAsString( hr ) );
return ( hr );
}
//---------------------------------------------------------------------------
//
// CreateChildren
//
// Create and initialize all the children of the Managed Resource List node.
//
STDMETHODIMP CUiManVolLst::CreateChildren( )
{
WsbTraceIn( L"CUiManVolLst::CreateChildren", L"" );
// Initialize the children of this node (no recursion. Decendents of children
// are NOT created here)
CComPtr<IUnknown> pUnkChild; // IUnknown pointer to new child.
CComPtr<ISakNode> pNode;
HRESULT hr = S_OK;
try {
//
// Get pointer to Hsm Managed Resource Collection object stored
// in this UI node. This may be NULL in the case of the service
// being down, in which case we don't want to do anything.
//
if( m_pManResCollection ) {
ULONG count = 0; // number of managed Resources in server
WsbAffirmHr( m_pManResCollection->GetEntries( &count ) );
CComPtr<IUnknown> pUnkHsmManRes; // unknown pointer to Hsm volume
for( int i = 0; i < (int)count; i++ ) {
pUnkChild.Release( );
pNode.Release( );
pUnkHsmManRes.Release( );
// Create a managed Resource UI node for each managed volume in the HsmServer.
WsbAffirmHr( NewChild( cGuidManVol, &pUnkChild ) );
WsbAffirmHr( RsQueryInterface( pUnkChild, ISakNode, pNode ) );
WsbAffirmHr( m_pManResCollection->At( i, IID_IUnknown, (void**)&pUnkHsmManRes ) );
// Initialize the child UI COM object, putting the Hsm managed Resource
// object inside the UI object.
WsbAffirmHr( pNode->InitNode( m_pSakSnapAsk, pUnkHsmManRes, this ) );
// Add the child COM object to the parent's list of children.
WsbAffirmHr( AddChild( pNode ) );
}
}
} WsbCatch( hr );
// Indicate that this node's children are valid and up-to-date (even if there ARE
// no children - at least now we know it).
m_bChildrenAreValid = TRUE;
// indicate that this parent node needs to be re-enumerated
m_bEnumState = FALSE;
WsbTraceOut( L"CUiManVolLst::CreateChildren", L"hr = <%ls>", WsbHrAsString( hr ) );
return( hr );
}
//---------------------------------------------------------------------------
//
// InitNode
//
// Initialize single COM object without using the registry. Derived
// objects frequently augment this method by implementing it themselves.
//
STDMETHODIMP CUiManVolLst::InitNode(
ISakSnapAsk* pSakSnapAsk,
IUnknown* pHsmObj,
ISakNode* pParent
)
{
WsbTraceIn( L"CUiManVolLst::InitNode", L"pSakSnapAsk = <0x%p>, pHsmObj = <0x%p>, pParent = <0x%p>", pSakSnapAsk, pHsmObj, pParent );
HRESULT hr = S_OK;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
try {
WsbAffirmHr( CSakNode::InitNode( pSakSnapAsk, NULL, pParent ) );
//
// Set the object properties
// Display Name
//
CString sDisplayName;
sDisplayName.LoadString( IDS_MANVOLLST_DISPLAY_NAME );
CWsbStringPtr szWsbDisplayName( sDisplayName );
WsbAffirmHr( put_DisplayName( szWsbDisplayName ) );
//
// Description
//
CString sDescription;
sDescription.LoadString( IDS_MANVOLLST_DESCRIPTION );
CWsbStringPtr szWsbDescription( sDescription );
WsbAffirmHr( put_Description( szWsbDescription ) );
//
// Set up the result view columns
//
WsbAffirmHr( SetChildProps( RS_STR_RESULT_PROPS_MANRESLST_IDS,
IDS_RESULT_PROPS_MANRESLST_TITLES,
IDS_RESULT_PROPS_MANRESLST_WIDTHS));
WsbAffirmHr( RefreshObject( ) );
} WsbCatch( hr );
WsbTraceOut( L"CUiManVolLst::InitNode", L"hr = <%ls>", WsbHrAsString( hr ) );
return( hr );
}
STDMETHODIMP
CUiManVolLst::TerminateNode(
)
/*++
Routine Description:
Free any interface connections or other resources
that would prevent correct shutdown of node (would
keep ref count from going to 0).
Arguments:
CopySet - copy set of interest.
pszValue - return string representing the state.
Return Value:
S_OK - Handled.
E_* - Some error occurred.
--*/
{
WsbTraceIn( L"CUiManVolLst::TerminateNode", L"" );
HRESULT hr = S_OK;
try {
//
// Release any interface pointers kept so that circular references
// are broken
//
m_pFsaServer.Release( );
m_pManResCollection.Release( );
m_pHsmServer.Release( );
m_pFsaFilter.Release( );
m_pSchedAgent.Release( );
m_pTask.Release( );
m_pTrigger.Release( );
//
// And call the base class for it's pieces
//
WsbAffirmHr( CSakNode::TerminateNode( ) );
} WsbCatch( hr );
WsbTraceOut( L"CUiManVolLst::TerminateNode", L"hr = <%ls>", WsbHrAsString( hr ) );
return( hr );
}
/////////////////////////////////////////////////////////////////////////////////////////
//
// class CUiManVolLstSheet
//
HRESULT CUiManVolLstSheet::AddPropertyPages ( )
{
WsbTraceIn( L"CUiManVolLstSheet::AddPropertyPages", L"" );
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HRESULT hr = S_OK;
try {
// --------------------- Statistics Page ----------------------------------
// NOTE: We now use the same page as the volume property sheet !!
CPrMrSts *pPropPageStatus = new CPrMrSts( TRUE );
WsbAffirmAlloc( pPropPageStatus );
AddPage( pPropPageStatus );
// Add more pages here.
// ....
} WsbCatch( hr );
WsbTraceOut( L"CUiManVolLstSheet::AddPropertyPages", L"hr = <%ls>", WsbHrAsString( hr ) );
return( hr );
}
HRESULT CUiManVolLstSheet::GetNextFsaResource ( int *pBookMark, IFsaResource **ppFsaResource )
{
WsbTraceIn( L"CUiManVolLstSheet::GetNextFsaResource", L"*pBookMark = <%d>", *pBookMark );
HRESULT hr = S_OK;
HRESULT hrInternal = S_OK;
try {
WsbAffirm ( *pBookMark >= 0, E_FAIL );
CComPtr <IWsbIndexedCollection> pManResCollection;
WsbAffirmHr( GetManResCollection( &pManResCollection ) );
CComPtr <IHsmManagedResource> pHsmManRes;
CComPtr <IUnknown> pUnkFsaRes;
hr = pManResCollection->At(*pBookMark, IID_IHsmManagedResource, (void**) &pHsmManRes);
if ( hr == S_OK ) {
(*pBookMark)++;
WsbAffirmHr( pHsmManRes->GetFsaResource( &pUnkFsaRes ));
WsbAffirmHr( pUnkFsaRes->QueryInterface( IID_IFsaResource, (void**) ppFsaResource ) );
}
} WsbCatch (hr);
WsbTraceOut( L"CUiManVolLstSheet::GetNextFsaResource", L"hr = <%ls>", WsbHrAsString( hr ) );
return hr;
}
// This function is to be called from the page thread
HRESULT CUiManVolLstSheet::GetManResCollection( IWsbIndexedCollection **ppManResCollection )
{
WsbTraceIn( L"CUiManVolLstSheet::GetManResCollection", L"" );
HRESULT hr = S_OK;
try {
CComPtr <IHsmServer> pHsmServer;
WsbAffirmHrOk( GetHsmServer( &pHsmServer ) );
//
// Get Managed Volumes collection from HSM server
//
WsbAffirmHr( pHsmServer->GetManagedResources( ppManResCollection ) );
} WsbCatch( hr );
WsbTraceOut( L"CUiManVolLstSheet::GetManResCollection", L"hr = <%ls>, *ppManResCollection = <0x%p>",
WsbHrAsString( hr ), *ppManResCollection );
return( hr );
}