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.
468 lines
14 KiB
468 lines
14 KiB
/*++
|
|
|
|
© 1998 Seagate Software, Inc. All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
PrHsmCom.cpp
|
|
|
|
Abstract:
|
|
|
|
Implements all the property page interface to the individual nodes,
|
|
including creating the property page, and adding it to the property sheet.
|
|
|
|
Author:
|
|
|
|
Rohde Wakefield [rohde] 08-Aug-1997
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "HsmCom.h"
|
|
#include "PrHsmCom.h"
|
|
#include "ca.h"
|
|
#include "intshcut.h"
|
|
|
|
static DWORD pHelpIds[] =
|
|
{
|
|
|
|
IDC_SNAPIN_TITLE, idh_instance,
|
|
IDC_STATIC_STATUS, idh_status,
|
|
IDC_STATIC_STATUS_LABEL, idh_status,
|
|
IDC_STATIC_MANAGED_VOLUMES, idh_total_managed_volumes,
|
|
IDC_STATIC_MANAGED_VOLUMES_LABEL, idh_total_managed_volumes,
|
|
IDC_STATIC_CARTS_USED, idh_total_cartridges_used,
|
|
IDC_STATIC_CARTS_USED_LABEL, idh_total_cartridges_used,
|
|
IDC_STATIC_DATA_IN_RS, idh_total_data_remote_storage,
|
|
IDC_STATIC_DATA_IN_RS_LABEL, idh_total_data_remote_storage,
|
|
IDC_STATIC_GROUP, idh_version,
|
|
IDC_STATIC_BUILD_LABEL_HSM, idh_version,
|
|
IDC_STATIC_ENGINE_BUILD_HSM, idh_version,
|
|
|
|
0, 0
|
|
};
|
|
|
|
|
|
CPropHsmComStat::CPropHsmComStat() : CSakPropertyPage(CPropHsmComStat::IDD)
|
|
|
|
{
|
|
//{{AFX_DATA_INIT(CPropHsmComStat)
|
|
//}}AFX_DATA_INIT
|
|
|
|
m_hConsoleHandle = 0;
|
|
m_pParent = 0;
|
|
m_bUpdate = FALSE;
|
|
m_pHelpIds = pHelpIds;
|
|
}
|
|
|
|
CPropHsmComStat::~CPropHsmComStat()
|
|
{
|
|
}
|
|
|
|
BOOL CPropHsmComStat::OnInitDialog()
|
|
{
|
|
WsbTraceIn( L"CPropHsmComStat::OnInitDialog", L"" );
|
|
HRESULT hr = S_OK;
|
|
ULONG volCount = 0; // number of managed Resources in server
|
|
LONGLONG totalTotal = 0;
|
|
LONGLONG totalFree = 0;
|
|
LONGLONG totalUsed = 0;
|
|
LONGLONG totalPremigrated = 0;
|
|
LONGLONG totalTruncated = 0;
|
|
LONGLONG remoteStorage = 0;
|
|
LONGLONG total = 0;
|
|
LONGLONG free = 0;
|
|
LONGLONG premigrated = 0;
|
|
LONGLONG truncated = 0;
|
|
CMediaInfoObject mio;
|
|
int i;
|
|
int mediaCount = 0;
|
|
CComPtr<IWsbIndexedCollection> pManResCollection;
|
|
CComPtr<IHsmServer> pHsmServer;
|
|
CComPtr<IFsaServer> pFsaServer;
|
|
CComPtr<IRmsServer> pRmsServer;
|
|
CComPtr<IFsaResource> pFsaRes;
|
|
CComPtr<IUnknown> pUnkFsaRes; // unknown pointer to managed resource list
|
|
CComPtr<IHsmManagedResource> pHsmManRes;
|
|
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
|
|
try {
|
|
|
|
#if DBG
|
|
//
|
|
// For checked builds, make visible the version info
|
|
//
|
|
GetDlgItem( IDC_STATIC_GROUP )->ShowWindow( SW_SHOWNA );
|
|
GetDlgItem( IDC_STATIC_BUILD_LABEL_HSM )->ShowWindow( SW_SHOWNA );
|
|
GetDlgItem( IDC_STATIC_ENGINE_BUILD_HSM )->ShowWindow( SW_SHOWNA );
|
|
#endif
|
|
|
|
//
|
|
// Put the title up
|
|
//
|
|
SetDlgItemText( IDC_SNAPIN_TITLE, m_NodeTitle );
|
|
|
|
//
|
|
// Show service status
|
|
//
|
|
GetAndShowServiceStatus();
|
|
|
|
//
|
|
// Contact the engine
|
|
//
|
|
HRESULT hrInternal = m_pParent->GetHsmServer( &pHsmServer );
|
|
if( hrInternal == S_OK ) {
|
|
|
|
//
|
|
// The engine is up
|
|
//
|
|
WsbAffirmHr ( ( (CUiHsmComSheet *)m_pParent )->GetRmsServer( &pRmsServer ) );
|
|
WsbAffirmHr ( ( (CUiHsmComSheet *)m_pParent )->GetFsaServer( &pFsaServer ) );
|
|
|
|
//
|
|
// Get the number of managed volumes
|
|
//
|
|
WsbAffirmHr( pHsmServer->GetManagedResources( &pManResCollection ) );
|
|
WsbAffirmHr( pManResCollection->GetEntries( &volCount ));
|
|
|
|
//
|
|
// Iterate through the collection
|
|
//
|
|
for( i = 0; i < (int)volCount; i++ ) {
|
|
|
|
//
|
|
// Protect against bad volumes with try statement.
|
|
// Otherwise we bail initializing whole dialog
|
|
//
|
|
HRESULT hrLocal = S_OK;
|
|
try {
|
|
|
|
//
|
|
// Get the FsaResource
|
|
//
|
|
pHsmManRes.Release( );
|
|
pUnkFsaRes.Release( );
|
|
pFsaRes.Release( );
|
|
WsbAffirmHr( pManResCollection->At( i, IID_IHsmManagedResource, ( void** ) &pHsmManRes ) );
|
|
WsbAffirmHr( pHsmManRes->GetFsaResource( &pUnkFsaRes ) );
|
|
WsbAffirmHr( RsQueryInterface( pUnkFsaRes, IFsaResource, pFsaRes ) );
|
|
|
|
// Total up statistics
|
|
WsbAffirmHr( pFsaRes->GetSizes( &total, &free, &premigrated, &truncated ) );
|
|
totalPremigrated += premigrated;
|
|
totalTruncated += truncated;
|
|
|
|
remoteStorage = totalPremigrated + totalTruncated;
|
|
|
|
} WsbCatch( hrLocal );
|
|
}
|
|
|
|
HRESULT hrLocal = S_OK;
|
|
try {
|
|
|
|
//
|
|
// Count the number of media used
|
|
// Initialize media object
|
|
//
|
|
WsbAffirmHr( mio.Initialize( GUID_NULL, pHsmServer, pRmsServer ) );
|
|
|
|
// Did we get a node?
|
|
if( mio.m_MediaId != GUID_NULL ) {
|
|
HRESULT hrEnum = S_OK;
|
|
while( SUCCEEDED( hrEnum ) ) {
|
|
|
|
if( S_OK == mio.DoesMasterExist( ) ) {
|
|
|
|
mediaCount++;
|
|
}
|
|
|
|
for( INT index = 0; index < mio.m_NumMediaCopies; index++ ) {
|
|
|
|
if( S_OK == mio.DoesCopyExist( index ) ) {
|
|
|
|
mediaCount++;
|
|
}
|
|
}
|
|
|
|
hrEnum = mio.Next();
|
|
}
|
|
}
|
|
|
|
} WsbCatch( hrLocal );
|
|
|
|
|
|
CString sText;
|
|
// Set number of managed volumes
|
|
SetDlgItemInt( IDC_STATIC_MANAGED_VOLUMES, volCount, FALSE );
|
|
|
|
// Show data in Remote Storage - text is same for singular and plural
|
|
CString sFormattedNumber;
|
|
RsGuiFormatLongLong4Char (remoteStorage, sFormattedNumber );
|
|
SetDlgItemText( IDC_STATIC_DATA_IN_RS, sFormattedNumber );
|
|
|
|
SetDlgItemInt( IDC_STATIC_CARTS_USED, mediaCount, FALSE );
|
|
|
|
CWsbStringPtr pNtProductVersionHsm;
|
|
ULONG buildVersionHsm;
|
|
ULONG ntProductBuildHsm;
|
|
|
|
//
|
|
// Get service versions
|
|
// Note: Fsa version is NOT in use at the moment, it may be used as an HSM
|
|
// client version in a future C/S HSM
|
|
//
|
|
{
|
|
|
|
CComPtr <IWsbServer> pWsbHsmServer;
|
|
WsbAffirmHr( RsQueryInterface( pHsmServer, IWsbServer, pWsbHsmServer ) );
|
|
WsbAffirmHr( pWsbHsmServer->GetNtProductBuild( &ntProductBuildHsm ) );
|
|
WsbAffirmHr( pWsbHsmServer->GetNtProductVersion( &pNtProductVersionHsm, 0 ) );
|
|
WsbAffirmHr( pWsbHsmServer->GetBuildVersion( &buildVersionHsm ) );
|
|
|
|
}
|
|
|
|
sText.Format( L"%ls.%d [%ls]", (WCHAR*)pNtProductVersionHsm, ntProductBuildHsm, RsBuildVersionAsString( buildVersionHsm ) );
|
|
SetDlgItemText( IDC_STATIC_ENGINE_BUILD_HSM, sText );
|
|
|
|
//
|
|
// The engine is up. Show the controls
|
|
//
|
|
GetDlgItem( IDC_STATIC_MANAGED_VOLUMES_LABEL )->ShowWindow( SW_SHOW );
|
|
GetDlgItem( IDC_STATIC_MANAGED_VOLUMES )->ShowWindow( SW_SHOW );
|
|
GetDlgItem( IDC_STATIC_DATA_IN_RS_LABEL )->ShowWindow( SW_SHOW );
|
|
GetDlgItem( IDC_STATIC_DATA_IN_RS )->ShowWindow( SW_SHOW );
|
|
GetDlgItem( IDC_STATIC_CARTS_USED_LABEL )->ShowWindow( SW_SHOW );
|
|
GetDlgItem( IDC_STATIC_CARTS_USED )->ShowWindow( SW_SHOW );
|
|
GetDlgItem( IDC_STATIC_GROUP )->ShowWindow( SW_SHOW );
|
|
GetDlgItem( IDC_STATIC_BUILD_LABEL_HSM )->ShowWindow( SW_SHOW );
|
|
GetDlgItem( IDC_STATIC_ENGINE_BUILD_HSM )->ShowWindow( SW_SHOW );
|
|
|
|
} else {
|
|
|
|
// The engine is down. Hide the controls
|
|
GetDlgItem( IDC_STATIC_MANAGED_VOLUMES_LABEL )->ShowWindow( SW_HIDE );
|
|
GetDlgItem( IDC_STATIC_MANAGED_VOLUMES )->ShowWindow( SW_HIDE );
|
|
GetDlgItem( IDC_STATIC_DATA_IN_RS )->ShowWindow( SW_HIDE );
|
|
GetDlgItem( IDC_STATIC_DATA_IN_RS_LABEL )->ShowWindow( SW_HIDE );
|
|
GetDlgItem( IDC_STATIC_CARTS_USED_LABEL )->ShowWindow( SW_HIDE );
|
|
GetDlgItem( IDC_STATIC_CARTS_USED )->ShowWindow( SW_HIDE );
|
|
GetDlgItem( IDC_STATIC_GROUP )->ShowWindow( SW_HIDE );
|
|
GetDlgItem( IDC_STATIC_BUILD_LABEL_HSM )->ShowWindow( SW_HIDE );
|
|
GetDlgItem( IDC_STATIC_ENGINE_BUILD_HSM )->ShowWindow( SW_HIDE );
|
|
|
|
}
|
|
|
|
} WsbCatch( hr );
|
|
|
|
CSakPropertyPage::OnInitDialog();
|
|
|
|
WsbTraceOut( L"CPropHsmComStat::OnInitDialog", L"" );
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL CPropHsmComStat::OnCommand(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
// Page is dirty, mark it.
|
|
// SetModified();
|
|
// m_bUpdate = TRUE;
|
|
return CSakPropertyPage::OnCommand(wParam, lParam);
|
|
}
|
|
|
|
void CPropHsmComStat::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
WsbTraceIn( L"CPropHsmComStat::DoDataExchange", L"" );
|
|
CSakPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CPropHsmComStat)
|
|
//}}AFX_DATA_MAP
|
|
WsbTraceOut( L"CPropHsmComStat::DoDataExchange", L"" );
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CPropHsmComStat, CSakPropertyPage)
|
|
//{{AFX_MSG_MAP(CPropHsmComStat)
|
|
ON_WM_DESTROY()
|
|
ON_WM_DRAWITEM()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPropHsmComStat message handlers
|
|
|
|
BOOL CPropHsmComStat::OnApply()
|
|
{
|
|
if (m_bUpdate == TRUE)
|
|
{
|
|
// Do the work of making the change here.
|
|
|
|
m_bUpdate = FALSE;
|
|
}
|
|
|
|
return CSakPropertyPage::OnApply();
|
|
}
|
|
|
|
|
|
|
|
HRESULT CPropHsmComStat::GetAndShowServiceStatus()
|
|
{
|
|
WsbTraceIn( L"CPropHsmComStat::GetAndShowServiceStatus", L"" );
|
|
HRESULT hr = S_OK;
|
|
try {
|
|
|
|
//
|
|
// Get and display service statuses
|
|
//
|
|
DWORD serviceStatus;
|
|
CString sStatus;
|
|
|
|
// Engine
|
|
HRESULT hrSetup = S_FALSE;
|
|
WsbAffirmHr( WsbGetServiceStatus( m_pszName, APPID_RemoteStorageEngine, &serviceStatus ) );
|
|
if( SERVICE_RUNNING == serviceStatus ) {
|
|
|
|
CComPtr<IHsmServer> pHsmServer;
|
|
hr = ( m_pParent->GetHsmServer( &pHsmServer ) );
|
|
if ( hr == RS_E_NOT_CONFIGURED ) {
|
|
|
|
hrSetup = S_FALSE;
|
|
|
|
}
|
|
else {
|
|
|
|
hrSetup = S_OK;
|
|
WsbAffirmHr( hr );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
RsGetStatusString( serviceStatus, hrSetup, sStatus );
|
|
SetDlgItemText( IDC_STATIC_STATUS, sStatus );
|
|
|
|
} WsbCatch( hr );
|
|
|
|
WsbTraceOut( L"CPropHsmComStat::GetAndShowServiceStatus", L"hr = <%ls>", WsbHrAsString( hr ) );
|
|
return( hr );
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CRsWebLink
|
|
|
|
CRsWebLink::CRsWebLink()
|
|
{
|
|
}
|
|
|
|
CRsWebLink::~CRsWebLink()
|
|
{
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CRsWebLink, CStatic)
|
|
//{{AFX_MSG_MAP(CRsWebLink)
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_CTLCOLOR_REFLECT()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CRsWebLink message handlers
|
|
|
|
void CRsWebLink::PreSubclassWindow()
|
|
{
|
|
//
|
|
// Need to set up font correctly
|
|
//
|
|
LOGFONT logfont;
|
|
CFont* tempFont = GetFont( );
|
|
tempFont->GetLogFont( &logfont );
|
|
|
|
// logfont.lfWeight = FW_BOLD;
|
|
logfont.lfUnderline = TRUE;
|
|
|
|
m_Font.CreateFontIndirect( &logfont );
|
|
|
|
SetFont( &m_Font );
|
|
|
|
//
|
|
// Resize based on font
|
|
//
|
|
CRect rect;
|
|
CWindowDC dc( this );
|
|
CString title;
|
|
GetClientRect( rect );
|
|
GetWindowText( title );
|
|
|
|
dc.SelectObject( m_Font );
|
|
CSize size = dc.GetTextExtent( title );
|
|
SetWindowPos( 0, 0, 0, size.cx, rect.bottom, SWP_NOMOVE | SWP_NOZORDER );
|
|
|
|
//
|
|
// And set the class cursor
|
|
//
|
|
HCURSOR hCur = AfxGetApp( )->LoadStandardCursor( IDC_HAND );
|
|
SetClassLongPtr( GetSafeHwnd( ), GCLP_HCURSOR, (LONG_PTR)hCur );
|
|
|
|
CStatic::PreSubclassWindow();
|
|
}
|
|
|
|
void CRsWebLink::OnLButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
WsbTraceIn( L"CRsWebLink::OnLButtonDown", L"" );
|
|
|
|
CString caption;
|
|
CString addr;
|
|
|
|
GetWindowText( caption );
|
|
addr = TEXT( "http://" );
|
|
addr += caption;
|
|
|
|
AfxGetApp()->BeginWaitCursor( );
|
|
|
|
OpenURL( addr );
|
|
|
|
AfxGetApp( )->EndWaitCursor( );
|
|
|
|
CStatic::OnLButtonDown( nFlags, point );
|
|
|
|
WsbTraceOut( L"CRsWebLink::OnLButtonDown", L"" );
|
|
}
|
|
|
|
HRESULT CRsWebLink::OpenURL(CString &Url)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
try {
|
|
|
|
CComPtr<IUniformResourceLocator> pURL;
|
|
WsbAffirmHr( CoCreateInstance( CLSID_InternetShortcut, 0, CLSCTX_ALL, IID_IUniformResourceLocator, (void**)&pURL ) );
|
|
WsbAffirmHr( pURL->SetURL( Url, IURL_SETURL_FL_GUESS_PROTOCOL ) );
|
|
|
|
//
|
|
// Open the URL by calling InvokeCommand
|
|
//
|
|
URLINVOKECOMMANDINFO ivci;
|
|
ivci.dwcbSize = sizeof( URLINVOKECOMMANDINFO );
|
|
ivci.dwFlags = IURL_INVOKECOMMAND_FL_ALLOW_UI;
|
|
ivci.hwndParent = 0;
|
|
ivci.pcszVerb = TEXT( "open" );
|
|
|
|
WsbAffirmHr( pURL->InvokeCommand( &ivci ) );
|
|
|
|
} WsbCatch( hr );
|
|
|
|
return( hr );
|
|
}
|
|
|
|
HBRUSH CRsWebLink::CtlColor(CDC* pDC, UINT /* nCtlColor */ )
|
|
{
|
|
HBRUSH hBrush = (HBRUSH)GetStockObject( HOLLOW_BRUSH );
|
|
pDC->SetTextColor( RGB( 0, 0, 255 ) );
|
|
pDC->SetBkMode( TRANSPARENT );
|
|
return( hBrush );
|
|
}
|