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.
 
 
 
 
 
 

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