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.
 
 
 
 
 
 

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 );
}