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.
501 lines
13 KiB
501 lines
13 KiB
/*++
|
|
|
|
© 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 );
|
|
}
|