/*++ © 1998 Seagate Software, Inc. All rights reserved. Module Name: HsmCom.cpp Abstract: Root node of snapin - represents the Computer. Author: Rohde Wakefield [rohde] 08-Aug-1997 Revision History: --*/ #include "stdafx.h" #include "HsmCom.h" #include "WzQstart.h" #include "PrMrLsRc.h" #include "PrMedSet.h" #include "PrSched.h" int CUiHsmCom::m_nScopeCloseIcon = AddScopeImage( IDI_BLUESAKKARA ); int CUiHsmCom::m_nScopeCloseIconX = CUiHsmCom::m_nScopeCloseIcon; int CUiHsmCom::m_nScopeOpenIcon = CUiHsmCom::m_nScopeCloseIcon; int CUiHsmCom::m_nScopeOpenIconX = CUiHsmCom::m_nScopeCloseIconX; int CUiHsmCom::m_nResultIcon = AddResultImage( IDI_BLUESAKKARA ); int CUiHsmCom::m_nResultIconX = CUiHsmCom::m_nResultIcon; ///////////////////////////////////////////////////////////////////////////// // // CoComObjectRoot // ///////////////////////////////////////////////////////////////////////////// //--------------------------------------------------------------------------- // // FinalConstruct // // Initialize this level of the object hierarchy // HRESULT CUiHsmCom::FinalConstruct( ) { WsbTraceIn( L"CUiHsmCom::FinalConstruct", L"" ); m_rTypeGuid = &cGuidHsmCom; HRESULT hr = CSakNode::FinalConstruct( ); m_bSupportsPropertiesSingle = TRUE; m_bSupportsPropertiesMulti = FALSE; m_bSupportsPropertiesNoEngine = TRUE; m_bSupportsDeleteSingle = FALSE; m_bSupportsDeleteMulti = FALSE; m_bSupportsRefreshSingle = TRUE; m_bSupportsRefreshMulti = FALSE; m_bSupportsRefreshNoEngine = TRUE; m_bIsContainer = TRUE; m_pPageStat = NULL; m_pPageServices = NULL; WsbTraceOut( L"CUiHsmCom::FinalConstruct", L"hr = <%ls>", WsbHrAsString( hr ) ); return( hr ); } //--------------------------------------------------------------------------- // // FinalRelease // // Clean up this level of the object hierarchy // void CUiHsmCom::FinalRelease( ) { WsbTraceIn( L"CUiHsmCom::FinalRelease", L"" ); CSakNode::FinalRelease( ); WsbTraceOut( L"CUiHsmCom::FinalRelease", L"" ); } ///////////////////////////////////////////////////////////////////////////// // // ISakNode // ///////////////////////////////////////////////////////////////////////////// //--------------------------------------------------------------------------- // // GetContextMenu // // Return an HMENU to be used for context menus on this node. // STDMETHODIMP CUiHsmCom::GetContextMenu( BOOL /*bMultiSelect*/, HMENU* phMenu ) { WsbTraceIn( L"CUiHsmCom::GetContextMenu", L"" ); AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = S_OK; CMenu* pRootMenu, *pNewMenu, *pTaskMenu; try { // // Get the context menu from the resource // WsbAffirmHr( LoadContextMenu( IDR_HSMCOM, phMenu ) ); CMenu menu; menu.Attach( *phMenu ); pRootMenu = menu.GetSubMenu( MENU_INDEX_ROOT ); pNewMenu = menu.GetSubMenu( MENU_INDEX_NEW ); pTaskMenu = menu.GetSubMenu( MENU_INDEX_TASK ); // // If we are not configured locally, allow the option to setup // Remote Storage Server. If we are setup, allow them to reconnect // if not connected. // BOOL deleteMenu = TRUE; if( S_FALSE == m_pSakSnapAsk->GetHsmName( 0 ) ) { CComPtr pServer; HRESULT hrConn = m_pSakSnapAsk->GetHsmServer( &pServer ); if( RS_E_NOT_CONFIGURED == hrConn ) { deleteMenu = FALSE; } } if( deleteMenu ) { pRootMenu->DeleteMenu( ID_HSMCOM_ROOT_SETUPWIZARD, MF_BYCOMMAND ); } if( !deleteMenu || ( S_OK != m_pSakSnapAsk->GetState( ) ) ) { pRootMenu->EnableMenuItem( ID_HSMCOM_ROOT_SCHEDULE, MF_GRAYED | MF_BYCOMMAND ); } menu.Detach( ); } WsbCatch( hr ); WsbTraceOut( L"CUiHsmCom::GetContextMenu", L"hr = <%ls>", WsbHrAsString( hr ) ); return( hr ); } //--------------------------------------------------------------------------- // // InvokeCommand // // User has selected a command from the menu. Process it here. // STDMETHODIMP CUiHsmCom::InvokeCommand( SHORT sCmd, IDataObject* pDataObject ) { WsbTraceIn( L"CUiHsmCom::InvokeCommand", L"sCmd = <%d>", sCmd ); CString theString; HRESULT hr = S_OK; AFX_MANAGE_STATE( AfxGetStaticModuleState( ) ); try { switch( sCmd ) { case ID_HSMCOM_ROOT_SETUPWIZARD: { // // use wizard to create manage volume // CComObject* pWizard = new CComObject; WsbAffirmAlloc( pWizard ); CComPtr pSakWizard = (ISakWizard*)pWizard; WsbAffirmHr( m_pSakSnapAsk->CreateWizard( pSakWizard ) ); // // RS_E_CANCELED indicates canceled, and FAILEd indicates error. // If so, then throw "Not set up" // if( S_OK == pWizard->m_HrFinish ) { WsbAffirmHr( RefreshScopePane( ) ); } } break; case ID_HSMCOM_ROOT_SCHEDULE: WsbAffirmHr( m_pSakSnapAsk->ShowPropertySheet( this, pDataObject, 1 ) ); break; case MMC_VERB_REFRESH: WsbAffirmHr( RefreshScopePane( ) ); break; default: break; } } WsbCatch( hr ); WsbTraceOut( L"CUiHsmCom::InvokeCommand", L"hr = <%ls>", WsbHrAsString( hr ) ); return( hr ); } //--------------------------------------------------------------------------- // // CreateChildren // // Create and initialize all the children of the Hsm Computer node. // STDMETHODIMP CUiHsmCom::CreateChildren( ) { WsbTraceIn( L"CUiHsmCom::CreateChildren", L"" ); // // Initialize the children of this node (no recursion. Decendents of children // are NOT created here) // HRESULT hr = S_OK; try { CComPtr pUnkChild; // IUnknown pointer to new child. CComPtr pSakNode; // creation interface for new child node. // // Create a Managed Resource list UI node to be the parent of all managed volumes. // WsbAffirmHr( NewChild( cGuidManVolLst, &pUnkChild ) ); // // Initialize the child UI COM object, putting the Hsm Managed Resource collection object inside the UI object. // WsbAffirmHr( RsQueryInterface( pUnkChild, ISakNode, pSakNode ) ); WsbAffirmHr( pSakNode->InitNode( m_pSakSnapAsk, NULL, this ) ); // // Add the child COM object to the parent's list of children. // WsbAffirmHr( AddChild( pSakNode ) ); // Free up resources pUnkChild.Release( ); pSakNode.Release( ); /////////////////////////////// // CREATE MEDIA SET NODE // // Create a Remote Storage UI node to be the parent of all remote storage sub-nodes. // WsbAffirmHr( NewChild( cGuidMedSet, &pUnkChild ) ); // // Initialize the child UI COM object, putting the Rms Server object inside the UI object. // WsbAffirmHr( RsQueryInterface( pUnkChild, ISakNode, pSakNode ) ); WsbAffirmHr( pSakNode->InitNode( m_pSakSnapAsk, NULL, this ) ); // // Add the child COM object to the parent's list of children. // WsbAffirmHr( AddChild( pSakNode ) ); } 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"CUiHsmCom::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 CUiHsmCom::InitNode( ISakSnapAsk* pSakSnapAsk, IUnknown* pHsmObj, ISakNode* pParent ) { WsbTraceIn( L"CUiHsmCom::InitNode", L"pSakSnapAsk = <0x%p>, pHsmObj = <0x%p>, pParent = <0x%p>", pSakSnapAsk, pHsmObj, pParent ); HRESULT hr = S_OK; try { // // Note: The Hsm computer node no longer owns a server pointer // WsbAffirmHr( CSakNode::InitNode( pSakSnapAsk, NULL, pParent )); // // Set Display Type and Description. // CString tempString; tempString.LoadString( IDS_HSMCOM_TYPE ); WsbAffirmHr( put_Type( (OLECHAR *)(LPCWSTR)tempString ) ); tempString.LoadString( IDS_HSMCOM_DESCRIPTION ); WsbAffirmHr( put_Description( (OLECHAR *)(LPCWSTR)tempString ) ); // // Set up the result view columns // WsbAffirmHr( SetChildProps( RS_STR_RESULT_PROPS_COM_IDS, IDS_RESULT_PROPS_COM_TITLES, IDS_RESULT_PROPS_COM_WIDTHS ) ); RefreshObject(); } WsbCatch( hr ); WsbTraceOut( L"CUiHsmCom::InitNode", L"hr = <%ls>", WsbHrAsString( hr ) ); return( hr ); } STDMETHODIMP CUiHsmCom::AddPropertyPages( RS_NOTIFY_HANDLE handle, IUnknown* pUnkPropSheetCallback, IEnumGUID *pEnumObjectId, IEnumUnknown *pEnumUnkNode) { WsbTraceIn( L"CUiHsmCom::AddPropertyPages", L"" ); HRESULT hr = S_OK; try { // // Create an object to hold the pages // CUiHsmComSheet *pHsmComPropertySheet = new CUiHsmComSheet; WsbAffirmAlloc( pHsmComPropertySheet ); WsbAffirmHr( pHsmComPropertySheet->InitSheet( handle, pUnkPropSheetCallback, this, m_pSakSnapAsk, pEnumObjectId, pEnumUnkNode ) ); // // Tell the object to add it's pages // WsbAffirmHr( pHsmComPropertySheet->AddPropertyPages( ) ); } WsbCatch ( hr ); WsbTraceOut( L"CUiHsmCom::AddPropertyPages", L"hr = <%ls>", WsbHrAsString( hr ) ); return ( hr ); } ///////////////////////////////////////////////////////////////////////////////////////// // // class CUiManVolSheet // HRESULT CUiHsmComSheet::InitSheet( RS_NOTIFY_HANDLE handle, IUnknown* pUnkPropSheetCallback, CSakNode* pSakNode, ISakSnapAsk* pSakSnapAsk, IEnumGUID* pEnumObjectId, IEnumUnknown* pEnumUnkNode ) { WsbTraceIn( L"CUiHsmComSheet::InitSheet", L"handle = <%ld>, pUnkPropSheetCallback = <0x%p>, pSakNode = <0x%p>, pSakSnapAsk = <0x%p>, pEnumObjectId = <0x%p>, ", handle, pUnkPropSheetCallback, pSakNode, pSakSnapAsk, pEnumObjectId ); HRESULT hr = S_OK; try { WsbAffirmHr( CSakPropertySheet::InitSheet( handle, pUnkPropSheetCallback, pSakNode, pSakSnapAsk, pEnumObjectId, pEnumUnkNode ) ); CWsbBstrPtr nodeName; WsbAffirmHr( pSakNode->get_DisplayName( &nodeName ) ); m_NodeTitle = nodeName; } WsbCatch( hr ); WsbTraceOut( L"CUiHsmComSheet::InitSheet", L"hr = <%ls>", WsbHrAsString( hr ) ); return( hr ); } HRESULT CUiHsmComSheet::AddPropertyPages ( ) { WsbTraceIn( L"CUiHsmComSheet::AddPropertyPages", L"" ); AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = S_OK; try { HPROPSHEETPAGE hPage = NULL; // Windows property page handle // --------------------- Statistics Page ---------------------------------- // Create the Hsm Statistics property page. CPropHsmComStat* pPageStats = new CPropHsmComStat(); WsbAffirmAlloc( pPageStats ); pPageStats->m_NodeTitle = m_NodeTitle; AddPage( pPageStats ); // // Add the Schedule, Recall, and Media Copies pages // if setup has happened and the Remote Storage Service // is running. // if( S_OK == m_pSakNode->m_pSakSnapAsk->GetState() ) { //--------------------- Schedule Page -------------------------------------- CPrSchedule* pPageSched = new CPrSchedule(); WsbAffirmAlloc( pPageSched ); AddPage( pPageSched ); //--------------------- Recall Limit Page -------------------------------------- // Create the Hsm Recall property page. CPrMrLsRec* pPageRecall = new CPrMrLsRec(); WsbAffirmAlloc( pPageRecall ); AddPage( pPageRecall ); // --------------------- Media Copies Page ---------------------------------- CPrMedSet *pPageMediaCopies = new CPrMedSet(); WsbAffirmAlloc( pPageMediaCopies ) AddPage( pPageMediaCopies ); // Add more pages here. // .... } } WsbCatch( hr ); WsbTraceOut( L"CUiHsmComSheet::AddPropertyPages", L"hr = <%ls>", WsbHrAsString( hr ) ); return( hr ); }