|
|
/*++
� 1998 Seagate Software, Inc. All rights reserved.
Module Name:
MeSe.cpp
Abstract:
Node representing our Media Set (Media Pool) within NTMS.
Author:
Rohde Wakefield [rohde] 04-Aug-1997
Revision History:
--*/
#include "stdafx.h"
#include "MeSe.h"
#include "WzMedSet.h"
#include "ca.h"
int CUiMedSet::m_nScopeCloseIcon = AddScopeImage( IDI_NODELIB ); int CUiMedSet::m_nScopeCloseIconX = AddScopeImage( IDI_NODELIBX ); int CUiMedSet::m_nScopeOpenIcon = AddScopeImage( IDI_NODEOPENFOLDER ); int CUiMedSet::m_nScopeOpenIconX = CUiMedSet::m_nScopeCloseIconX; int CUiMedSet::m_nResultIcon = AddResultImage( IDI_NODELIB ); int CUiMedSet::m_nResultIconX = AddResultImage( IDI_NODELIBX );
/////////////////////////////////////////////////////////////////////////////
//
// CoComObjectRoot
//
/////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
//
// FinalConstruct
//
// Initialize this level of the object hierarchy
//
HRESULT CUiMedSet::FinalConstruct( ) { WsbTraceIn( L"CUiMedSet::FinalConstruct", L"" );
m_rTypeGuid = &cGuidMedSet; m_NumCopySets = 0;
HRESULT hr = CSakNode::FinalConstruct( );
m_bSupportsPropertiesSingle = FALSE; 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;
m_ToolbarButtons[i].nBitmap = 0; m_ToolbarButtons[i].idCommand = TB_CMD_MESE_COPY; m_ToolbarButtons[i].idButtonText = IDS_TB_TEXT_MESE_COPY; m_ToolbarButtons[i].idTooltipText = IDS_TB_TIP_MESE_COPY; i++;
m_ToolbarBitmap = IDB_TOOLBAR_MESE; m_cToolbarButtons = i;
WsbTraceOut( L"CUiMedSet::FinalConstruct", L"hr = <%ls>", WsbHrAsString( hr ) ); return( hr ); }
//---------------------------------------------------------------------------
//
// FinalRelease
//
// Clean up this level of the object hierarchy
//
void CUiMedSet::FinalRelease( ) { WsbTraceIn( L"CUiMedSet::FinalRelease", L"" );
// if( m_pDbSession ) {
//
// m_pDb->Close( m_pDbSession );
//
// }
CSakNode::FinalRelease( );
WsbTraceOut( L"CUiMedSet::FinalRelease", L"" ); }
/////////////////////////////////////////////////////////////////////////////
//
// ISakNode
//
/////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
//
// GetContextMenu
//
// Return an HMENU to be used for context menus on this node.
//
STDMETHODIMP CUiMedSet::GetContextMenu( BOOL bMultiSelect, HMENU* phMenu ) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = S_OK; try {
CMenu* pRootMenu; LoadContextMenu( IDR_MEDSET, phMenu ); CMenu menu; menu.Attach( *phMenu ); pRootMenu = menu.GetSubMenu( MENU_INDEX_ROOT );
pRootMenu->EnableMenuItem( ID_MEDSET_ROOT_COPY, MF_GRAYED | MF_BYCOMMAND ); //
// If not multi-select, and media copies are supported,
// and If engine up, enable copy
//
if( !bMultiSelect && ( m_pSakSnapAsk->GetState() == S_OK ) ) {
if( m_MediaCopiesEnabled ) {
pRootMenu->EnableMenuItem( ID_MEDSET_ROOT_COPY, MF_BYCOMMAND ); } }
menu.Detach();
} WsbCatch( hr );
return( hr ); }
//---------------------------------------------------------------------------
//
// InvokeCommand
//
// User has selected a command from the menu. Process it here.
//
STDMETHODIMP CUiMedSet::InvokeCommand( SHORT sCmd, IDataObject* /*pDataObject*/ ) { WsbTraceIn( L"CUiMedSet::InvokeCommand", L"sCmd = <%d>", sCmd );
HRESULT hr = S_OK;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CComPtr<IHsmServer> pHsm;
try {
switch (sCmd) {
case ID_MEDSET_ROOT_COPY: { //
// use wizard to sync media copies
//
CComObject<CMediaCopyWizard>* pWizard = new CComObject<CMediaCopyWizard>; WsbAffirmAlloc( pWizard );
CComPtr<ISakWizard> pSakWizard = (ISakWizard*)pWizard; WsbAffirmHr( m_pSakSnapAsk->CreateWizard( pSakWizard ) ); } break; }
} WsbCatch( hr );
WsbTraceOut( L"CUiMedSet::InvokeCommand", L"hr = <%ls>", WsbHrAsString( hr ) ); return hr; }
HRESULT CUiMedSet::SetupToolbar( IToolbar *pToolbar ) { WsbTraceIn( L"CUiMedSet::SetupToolbar", L"pToolbar = <0x%p>", pToolbar ); HRESULT hr = S_OK;
try {
BOOL state = ( S_OK == m_pSakSnapAsk->GetState( ) ) ? TRUE : FALSE;
for( INT i = 0; i < m_cToolbarButtons; i++ ) {
m_ToolbarButtons[i].fsState = (UCHAR)( state ? TBSTATE_ENABLED : 0 );
//
// If media copy button, need to check if should be enabled
//
if( state && ( TB_CMD_MESE_COPY == m_ToolbarButtons[i].idCommand ) ) {
if( m_MediaCopiesEnabled ) { m_ToolbarButtons[i].fsState = TBSTATE_ENABLED;
} else {
m_ToolbarButtons[i].fsState = 0; } } }
WsbAffirmHr( CSakNode::SetupToolbar( pToolbar ) );
} WsbCatch( hr );
WsbTraceOut( L"CUiMedSet::SetupToolbar", L"hr = <%ls>", WsbHrAsString( hr ) ); return hr; }
HRESULT CUiMedSet::OnToolbarButtonClick( IDataObject * /* pDataObject */, long cmdId ) { WsbTraceIn( L"CUiMedSet::OnToolbarButtonClick", L"cmdId = <%d>", cmdId ); HRESULT hr = S_OK; try {
switch ( cmdId ) {
case TB_CMD_MESE_COPY: { //
// use wizard to sync media copies
//
CComObject<CMediaCopyWizard>* pWizard = new CComObject<CMediaCopyWizard>; WsbAffirmAlloc( pWizard );
CComPtr<ISakWizard> pSakWizard = (ISakWizard*)pWizard; WsbAffirmHr( m_pSakSnapAsk->CreateWizard( pSakWizard ) ); } break; } } WsbCatch( hr );
WsbTraceOut( L"CUiMedSet::OnToolbarButtonClick", L"hr = <%ls>", WsbHrAsString( hr ) ); return( hr ); }
//---------------------------------------------------------------------------
//
// CreateChildren
//
// Create and initialize all the children of the media node.
//
STDMETHODIMP CUiMedSet::CreateChildren( ) { CMediaInfoObject mio; WsbTraceIn( L"CUiMedSet::CreateChildren", L"" );
HRESULT hr = S_OK;
try {
WsbAffirmPointer( m_pHsmServer ); WsbAffirmPointer( m_pRmsServer );
HRESULT hrEnum;
// Get media info
WsbAffirmHr( mio.Initialize( GUID_NULL, m_pHsmServer, m_pRmsServer ) );
// Did we get a node?
if( mio.m_MediaId != GUID_NULL ) {
hrEnum = S_OK; while( SUCCEEDED( hrEnum ) ) {
if( S_OK == mio.IsViewable( FALSE ) ) {
//
// Create the coresponding node
//
CComPtr<IUnknown> pUnkChild; CComPtr<ISakNode> pNode;
WsbAffirmHr( NewChild( cGuidCar, &pUnkChild ) ); WsbAffirmHr( RsQueryInterface( pUnkChild, ISakNode, pNode ) );
//
// And initialize
//
// The media node now initializes based on the media id. Assign it in
// the base class.
pNode->SetObjectId( mio.m_MediaId ); WsbAffirmHr( pNode->InitNode( m_pSakSnapAsk, 0, this ) );
//
// Add the child COM object to the parent's list of children.
//
WsbAffirmHr( AddChild( pNode ) ); }
hrEnum = mio.Next(); }
WsbAffirm( SUCCEEDED( hrEnum ) || ( WSB_E_NOTFOUND == hrEnum ), hrEnum ); } } 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"CUiMedSet::CreateChildren", L"hr = <%ls>", WsbHrAsString( hr ) ); return( hr ); }
//
// InitNode
//
// Initialize single COM object. Derived objects frequently augment this method
// by implementing it themselves.
//
STDMETHODIMP CUiMedSet::InitNode( ISakSnapAsk* pSakSnapAsk, IUnknown* pHsmObj, ISakNode* pParent ) { WsbTraceIn( L"CUiMedSet::InitNode", L"pSakSnapAsk = <0x%p>, pHsmObj = <0x%p>, pParent = <0x%p>", pSakSnapAsk, pHsmObj, pParent ); HRESULT hr = S_OK;
try {
WsbAffirmHr( CSakNode::InitNode( pSakSnapAsk, pHsmObj, pParent ) );
//
// Set Display Type and Description
//
CString tempString; tempString.LoadString( IDS_MEDSET_DISPLAYNAME ); WsbAffirmHr( put_DisplayName( (OLECHAR *)(LPCWSTR)tempString ) ); tempString.LoadString( IDS_MEDSET_TYPE ); WsbAffirmHr( put_Type( (OLECHAR *)(LPCWSTR)tempString ) ); tempString.LoadString( IDS_MEDSET_DESCRIPTION ); WsbAffirmHr( put_Description( (OLECHAR *)(LPCWSTR)tempString ) );
WsbAffirmHr( RefreshObject() );
} WsbCatch( hr );
WsbTraceOut( L"CUiMedSet::InitNode", L"hr = <%ls>", WsbHrAsString( hr ) ); return( hr ); }
STDMETHODIMP CUiMedSet::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"CUiMedSet::TerminateNode", L"" ); HRESULT hr = S_OK;
try {
//
// Release any interface pointers kept so that circular references
// are broken
//
m_pStoragePool.Release( ); m_pHsmServer.Release( ); m_pRmsServer.Release( );
//
// And call the base class for it's pieces
//
WsbAffirmHr( CSakNode::TerminateNode( ) );
} WsbCatch( hr );
WsbTraceOut( L"CUiMedSet::TerminateNode", L"hr = <%ls>", WsbHrAsString( hr ) ); return( hr ); }
HRESULT CUiMedSet::RefreshObject() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = S_OK;
try {
m_NumCopySets = 0; m_MediaCopiesEnabled = FALSE;
WsbAssertPointer( m_pSakSnapAsk );
//
// If the engine is down, we want to create the node anyway
// Need to release smart pointers so that interfaces are
// correctly reference counted. IOW, if they already have
// an interface pointer stored, it will not get released
// before being clobbered here in the Get functions.
//
m_pHsmServer.Release( ); m_pRmsServer.Release( ); m_pStoragePool.Release( );
if( m_pSakSnapAsk->GetHsmServer( &m_pHsmServer ) == S_OK ) {
if( m_pSakSnapAsk->GetRmsServer( &m_pRmsServer ) == S_OK ) {
//
// Get the storage pool of interest
//
if( RsGetStoragePool( m_pHsmServer, &m_pStoragePool ) == S_OK ) {
//
// Contact data base and store necessary info
//
CMediaInfoObject mio; mio.Initialize( GUID_NULL, m_pHsmServer, m_pRmsServer ); m_NumCopySets = mio.m_NumMediaCopies;
//
// Find out if media copies are supported
//
GUID mediaSetId; CWsbBstrPtr mediaName; WsbAffirmHr( m_pStoragePool->GetMediaSet( &mediaSetId, &mediaName ) );
CComPtr<IRmsMediaSet> pMediaSet; WsbAffirmHr( m_pRmsServer->CreateObject( mediaSetId, CLSID_CRmsMediaSet, IID_IRmsMediaSet, RmsOpenExisting, (void**)&pMediaSet ) );
m_MediaCopiesEnabled = ( pMediaSet->IsMediaCopySupported( ) == S_OK ); } } }
//
// Set up the result view columns
// This changes with the number of media copies, so can't
// do once in Init()
//
WsbAffirmHr( SetChildProps( RS_STR_RESULT_PROPS_MEDSET_IDS, IDS_RESULT_PROPS_MEDSET_TITLES, IDS_RESULT_PROPS_MEDSET_WIDTHS ) ); m_cChildPropsShow = m_cChildProps - HSMADMIN_MAX_COPY_SETS + m_NumCopySets;
} WsbCatch( hr );
return( hr ); }
|