1294 lines
32 KiB
C++
1294 lines
32 KiB
C++
/******************************************************************************
|
|
|
|
Copyright (c) 1999-2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
htmlui.cpp
|
|
|
|
Abstract:
|
|
This file contains the implementation of the CRestoreShell class, which
|
|
provide several methods to be used by HTML scripts. This class wrappes the
|
|
new CRestoreManager class.
|
|
|
|
Revision History:
|
|
Seong Kook Khang (SKKhang) 10/08/99
|
|
created
|
|
Seong Kook Khang (SKKhang) 05/10/00
|
|
Renamed from rstrshl.cpp to htmlui.cpp.
|
|
New architecture for Whistler, now CRestoreShell is merely a dummy
|
|
ActiveX control, wrapping the new CRestoreManager class. Most of the
|
|
real functionalities were moved into CRestoreManager.
|
|
|
|
******************************************************************************/
|
|
|
|
#include "stdwin.h"
|
|
#include "stdatl.h"
|
|
#include "resource.h"
|
|
#include "rstrpriv.h"
|
|
#include "srui_htm.h"
|
|
#include "rstrmgr.h"
|
|
#include "rstrshl.h"
|
|
#include "rstrmap.h"
|
|
#include "winsta.h"
|
|
|
|
#define MAX_DATETIME_STR 256
|
|
|
|
#define PROGRESSBAR_INITIALIZING_MAXVAL 30
|
|
#define PROGRESSBAR_AFTER_INITIALIZING 30
|
|
#define PROGRESSBAR_AFTER_RESTORE_MAP 40
|
|
#define PROGRESSBAR_AFTER_RESTORE 100
|
|
|
|
#define CLIWND_RESTORE_TIMER_ID 1
|
|
#define CLIWND_RESTORE_TIMER_TIME 500
|
|
|
|
|
|
const IID IID_IMarsHost = { 0xCC6FFEB0,0xE379,0x427a,{0x98,0x10,0xA1,0x6B,0x7A,0x82,0x6A,0x89 }};
|
|
|
|
static LPCWSTR s_cszHelpAssistant = L"HelpAssistant";
|
|
#define HELPASSISTANT_STRINGID 114
|
|
|
|
|
|
BOOL ConvSysTimeToVariant( PSYSTEMTIME pst, VARIANT *pvar )
|
|
{
|
|
TraceFunctEnter("ConvSysTimeToVariant");
|
|
BOOL fRet = FALSE;
|
|
|
|
if ( !::SystemTimeToVariantTime( pst, &V_DATE(pvar) ) )
|
|
{
|
|
LPCWSTR cszErr = ::GetSysErrStr();
|
|
ErrorTrace(TRACE_ID, "::SystemTimeToVariantTime failed - %ls", cszErr);
|
|
goto Exit;
|
|
}
|
|
V_VT(pvar) = VT_DATE;
|
|
|
|
fRet = TRUE;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( fRet );
|
|
}
|
|
|
|
BOOL ConvVariantToSysTime( VARIANT var, PSYSTEMTIME pst )
|
|
{
|
|
TraceFunctEnter("ConvVariantToSysTime");
|
|
BOOL fRet = FALSE;
|
|
|
|
if ( !::VariantTimeToSystemTime( V_DATE(&var), pst ) )
|
|
{
|
|
LPCWSTR cszErr = ::GetSysErrStr();
|
|
ErrorTrace(TRACE_ID, "::VariantTimeToSystemTime failed - %ls", cszErr);
|
|
goto Exit;
|
|
}
|
|
|
|
fRet = TRUE;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( fRet );
|
|
}
|
|
|
|
inline VARIANT_BOOL ConvBoolToVBool( BOOL fVal )
|
|
{
|
|
return( fVal ? VARIANT_TRUE : VARIANT_FALSE );
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CRestoreShell construction
|
|
|
|
CRestoreShell::CRestoreShell()
|
|
{
|
|
m_fFormInitialized = FALSE;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CRestoreShell - IRestoreShell restore points enumerator
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::Item( INT nIndex, IRestorePoint** ppRP )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::Item");
|
|
HRESULT hr = S_OK;
|
|
SRestorePointInfo *pRPI;
|
|
CRPIObj *pRPIObj;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(ppRP);
|
|
*ppRP = NULL;
|
|
|
|
if ( nIndex < 0 || nIndex >= g_pRstrMgr->GetRPICount() )
|
|
{
|
|
ErrorTrace(TRACE_ID, "Invalid Argument, out of range");
|
|
hr = E_INVALIDARG;
|
|
goto Exit;
|
|
}
|
|
|
|
pRPI = g_pRstrMgr->GetRPI( nIndex );
|
|
if ( pRPI == NULL )
|
|
{
|
|
hr = S_FALSE;
|
|
goto Exit;
|
|
}
|
|
|
|
hr = CRPIObj::CreateInstance( &pRPIObj );
|
|
if ( hr != S_OK || pRPIObj == NULL )
|
|
{
|
|
ErrorTrace(TRACE_ID, "Cannot create RestorePointObject Instance, hr=%d", hr);
|
|
if ( hr == S_OK )
|
|
hr = E_FAIL;
|
|
goto Exit;
|
|
}
|
|
hr = pRPIObj->HrInit( pRPI );
|
|
if ( FAILED(hr) )
|
|
goto Exit;
|
|
pRPIObj->AddRef(); // CreateInstance doesn't do this
|
|
|
|
hr = pRPIObj->QueryInterface( IID_IRestorePoint, (void**)ppRP );
|
|
if ( FAILED(hr) )
|
|
{
|
|
ErrorTrace(TRACE_ID, "QI failed, hr=%d", hr);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return hr;
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_Count( INT *pnCount )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_Count");
|
|
HRESULT hr = S_OK;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pnCount);
|
|
*pnCount = g_pRstrMgr->GetRPICount();
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CRestoreShell - IRestoreShell properties
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_CurrentDate( VARIANT *pvarDate )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_CurrentDate");
|
|
HRESULT hr = E_FAIL;
|
|
SYSTEMTIME stToday;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pvarDate);
|
|
g_pRstrMgr->GetToday( &stToday );
|
|
if ( !ConvSysTimeToVariant( &stToday, pvarDate ) )
|
|
goto Exit;
|
|
/*
|
|
if ( ::SystemTimeToVariantTime( &stToday, &V_DATE(pvarDate) ) == 0 )
|
|
{
|
|
LPCWSTR cszErr = ::GetSysErrStr();
|
|
ErrorTrace(TRACE_ID, "::SystemTimeToVariantTime failed - %ls", cszErr);
|
|
hr = E_FAIL;
|
|
goto Exit;
|
|
}
|
|
V_VT(pvarDate) = VT_DATE;
|
|
*/
|
|
|
|
hr = S_OK;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return hr;
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_FirstDayOfWeek( INT *pnFirstDay )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_LocaleFirstDay");
|
|
HRESULT hr = S_OK;
|
|
int nFirstDay;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pnFirstDay);
|
|
*pnFirstDay = 0;
|
|
nFirstDay = g_pRstrMgr->GetFirstDayOfWeek();
|
|
if ( nFirstDay < 0 || nFirstDay > 6 )
|
|
{
|
|
hr = E_FAIL;
|
|
goto Exit;
|
|
}
|
|
if ( nFirstDay == 6 )
|
|
*pnFirstDay = 0;
|
|
else
|
|
*pnFirstDay = nFirstDay + 1;
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_IsSafeMode( VARIANT_BOOL *pfIsSafeMode )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_IsSafeMode");
|
|
HRESULT hr = S_OK;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pfIsSafeMode);
|
|
*pfIsSafeMode = ConvBoolToVBool( g_pRstrMgr->GetIsSafeMode() );
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_IsUndo( VARIANT_BOOL *pfIsUndo )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_IsUndo");
|
|
HRESULT hr = S_OK;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pfIsUndo);
|
|
*pfIsUndo = ConvBoolToVBool( g_pRstrMgr->GetIsUndo() );
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::put_IsUndo( VARIANT_BOOL fIsUndo )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::put_IsUndo");
|
|
|
|
g_pRstrMgr->SetIsUndo( fIsUndo );
|
|
|
|
TraceFunctLeave();
|
|
return( S_OK );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_LastRestore( INT *pnLastRestore )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_LastRestore");
|
|
HRESULT hr = S_OK;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pnLastRestore);
|
|
//Initialize();
|
|
*pnLastRestore = g_pRstrMgr->GetLastRestore();
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_MainOption( INT *pnMainOption )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_MainOption");
|
|
HRESULT hr = S_OK;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pnMainOption);
|
|
*pnMainOption = g_pRstrMgr->GetMainOption();
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::put_MainOption( INT nMainOption )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::put_MainOption");
|
|
HRESULT hr = S_OK;
|
|
|
|
if ( !g_pRstrMgr->SetMainOption( nMainOption ) )
|
|
hr = E_INVALIDARG;
|
|
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_ManualRPName( BSTR *pbstrManualRP )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_ManualRPName");
|
|
HRESULT hr = S_OK;
|
|
LPCWSTR cszRPName;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pbstrManualRP);
|
|
cszRPName = g_pRstrMgr->GetManualRPName();
|
|
ALLOCATEBSTR_AND_CHECK_ERROR( pbstrManualRP, cszRPName );
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::put_ManualRPName( BSTR bstrManualRP )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::put_ManualRPName");
|
|
|
|
g_pRstrMgr->SetManualRPName( bstrManualRP );
|
|
|
|
TraceFunctLeave();
|
|
return( S_OK );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_MaxDate( VARIANT *pvarDate )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_MaxDate");
|
|
HRESULT hr = E_FAIL;
|
|
SYSTEMTIME stMax;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pvarDate);
|
|
g_pRstrMgr->GetMaxDate( &stMax );
|
|
if ( !ConvSysTimeToVariant( &stMax, pvarDate ) )
|
|
goto Exit;
|
|
|
|
hr = S_OK;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_MinDate( VARIANT *pvarDate )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_MinDate");
|
|
HRESULT hr = E_FAIL;
|
|
SYSTEMTIME stMin;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pvarDate);
|
|
g_pRstrMgr->GetMinDate( &stMin );
|
|
if ( !ConvSysTimeToVariant( &stMin, pvarDate ) )
|
|
goto Exit;
|
|
|
|
hr = S_OK;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_RealPoint( INT *pnPoint )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_RealPoint");
|
|
HRESULT hr = S_OK;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pnPoint);
|
|
*pnPoint = g_pRstrMgr->GetRealPoint();
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_RenamedFolders( IRenamedFolders **ppList )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_RenamedFolders");
|
|
HRESULT hr = S_OK;
|
|
CRFObj *pRF;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(ppList);
|
|
hr = CComObject<CRenamedFolders>::CreateInstance( &pRF );
|
|
if ( FAILED(hr) )
|
|
{
|
|
ErrorTrace(TRACE_ID, "Cannot create CRenamedFolders object, hr=0x%08X", hr);
|
|
goto Exit;
|
|
}
|
|
hr = pRF->QueryInterface( IID_IRenamedFolders, (void**)ppList );
|
|
if ( FAILED(hr) )
|
|
{
|
|
ErrorTrace(TRACE_ID, "Cannot QI IRenamedFolders, hr=0x%08X", hr);
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return hr;
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_RestorePtSelected( VARIANT_BOOL *pfRPSel )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_RestorePtSelected");
|
|
HRESULT hr = S_OK;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pfRPSel);
|
|
|
|
*pfRPSel = ConvBoolToVBool( g_pRstrMgr->GetIsRPSelected() );
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::put_RestorePtSelected( VARIANT_BOOL fRPSel )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::put_RestorePtSelected");
|
|
|
|
g_pRstrMgr->SetIsRPSelected( fRPSel );
|
|
|
|
TraceFunctLeave();
|
|
return( S_OK );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_SelectedDate( VARIANT *pvarDate )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_SelectedDate");
|
|
HRESULT hr = E_FAIL;
|
|
SYSTEMTIME stSel;
|
|
//DATE dateSel;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pvarDate);
|
|
g_pRstrMgr->GetSelectedDate( &stSel );
|
|
if ( !ConvSysTimeToVariant( &stSel, pvarDate ) )
|
|
goto Exit;
|
|
|
|
hr = S_OK;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::put_SelectedDate( VARIANT varDate )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::put_SelectedDate");
|
|
HRESULT hr = E_FAIL;
|
|
SYSTEMTIME stSel;
|
|
|
|
if ( !ConvVariantToSysTime( varDate, &stSel ) )
|
|
goto Exit;
|
|
g_pRstrMgr->SetSelectedDate( &stSel );
|
|
|
|
hr = S_OK;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return hr;
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_SelectedName( BSTR *pbstrName )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_SelectedName");
|
|
HRESULT hr = S_OK;
|
|
LPCWSTR cszName;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pbstrName);
|
|
cszName = g_pRstrMgr->GetSelectedName();
|
|
ALLOCATEBSTR_AND_CHECK_ERROR( pbstrName, cszName );
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return hr;
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_SelectedPoint( INT *pnPoint )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_SelectedPoint");
|
|
HRESULT hr = S_OK;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pnPoint);
|
|
*pnPoint = g_pRstrMgr->GetSelectedPoint();
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::put_SelectedPoint( INT nPoint )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::put_SelectedPoint");
|
|
HRESULT hr = S_OK;
|
|
|
|
if ( nPoint < 0 || nPoint >= g_pRstrMgr->GetRPICount() )
|
|
{
|
|
ErrorTrace(TRACE_ID, "Index is out of range");
|
|
hr = E_INVALIDARG;
|
|
goto Exit;
|
|
}
|
|
if ( !g_pRstrMgr->SetSelectedPoint( nPoint ) )
|
|
{
|
|
hr = E_FAIL;
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_SmgrUnavailable( VARIANT_BOOL *pfSmgr )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_SmgrUnavailable");
|
|
HRESULT hr = S_OK;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pfSmgr);
|
|
*pfSmgr = ConvBoolToVBool( g_pRstrMgr->GetIsSmgrAvailable() );
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_StartMode( INT *pnMode )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_StartMode");
|
|
HRESULT hr = S_OK;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pnMode);
|
|
*pnMode = g_pRstrMgr->GetStartMode();
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return hr;
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_UsedDate( VARIANT *pvarDate )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_UsedDate");
|
|
HRESULT hr = E_FAIL;
|
|
SYSTEMTIME stDate;
|
|
//DATE dateDate;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pvarDate);
|
|
g_pRstrMgr->GetUsedDate( &stDate );
|
|
if ( !ConvSysTimeToVariant( &stDate, pvarDate ) )
|
|
goto Exit;
|
|
|
|
hr = S_OK;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_UsedName( BSTR *pbstrName )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_UsedDate");
|
|
HRESULT hr = S_OK;
|
|
LPCWSTR cszName;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pbstrName);
|
|
cszName = g_pRstrMgr->GetUsedName();
|
|
ALLOCATEBSTR_AND_CHECK_ERROR( pbstrName, cszName );
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CRestoreShell - IRestoreShell properties - HTML UI Specific
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::get_CanNavigatePage( VARIANT_BOOL *pfCanNavigatePage )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::get_CanNavigatePage");
|
|
HRESULT hr = S_OK;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pfCanNavigatePage);
|
|
*pfCanNavigatePage = ConvBoolToVBool( g_pRstrMgr->GetCanNavigatePage() );
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( S_OK );
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::put_CanNavigatePage( VARIANT_BOOL fCanNavigatePage )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::put_CanNavigatePage");
|
|
|
|
g_pRstrMgr->SetCanNavigatePage( fCanNavigatePage );
|
|
|
|
TraceFunctLeave();
|
|
return( S_OK );
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CRestoreShell - IRestoreShell methods
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::BeginRestore( VARIANT_BOOL *pfBeginRestore )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::BeginRestore");
|
|
HRESULT hr = S_OK;
|
|
BOOL fRes;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pfBeginRestore);
|
|
|
|
fRes = g_pRstrMgr->BeginRestore();
|
|
*pfBeginRestore = ConvBoolToVBool( fRes );
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CRestoreShell - IRestoreShell methods
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::CheckRestore( VARIANT_BOOL *pfCheckRestore )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::BeginRestore");
|
|
HRESULT hr = S_OK;
|
|
BOOL fRes;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pfCheckRestore);
|
|
|
|
fRes = g_pRstrMgr->CheckRestore(FALSE); // show UI if any errors found
|
|
*pfCheckRestore = ConvBoolToVBool( fRes );
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
//
|
|
// This method is called only from the HTML code to decide whether to
|
|
// shutdown or not, and the external.window.close() is called to shutdown
|
|
// as sending a WM_CLOSE message to Mars causes problems
|
|
//
|
|
STDMETHODIMP
|
|
CRestoreShell::Cancel( VARIANT_BOOL *pfAbort )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::Cancel");
|
|
HRESULT hr = S_OK;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pfAbort);
|
|
*pfAbort = ConvBoolToVBool( g_pRstrMgr->Cancel() );
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::CancelRestorePoint()
|
|
{
|
|
TraceFunctEnter("CRestoreShell::CancelRestorePoint");
|
|
HRESULT hr = E_FAIL;
|
|
|
|
if ( !g_pRstrMgr->CancelRestorePoint() )
|
|
goto Exit;
|
|
|
|
hr = S_OK;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/*******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::CompareDate( VARIANT varDate1, VARIANT varDate2, INT *pnCmp )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::CompareDate");
|
|
HRESULT hr = S_OK;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pnCmp);
|
|
VALIDATE_INPUT_VARIANT(varDate1, VT_DATE);
|
|
VALIDATE_INPUT_VARIANT(varDate2, VT_DATE);
|
|
*pnCmp = (long)V_DATE(&varDate1) - (long)V_DATE(&varDate2);
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::CreateRestorePoint( VARIANT_BOOL *pfSucceeded )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::CreateRestorePoint");
|
|
HRESULT hr = S_OK;
|
|
BOOL fRes;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pfSucceeded);
|
|
|
|
fRes = g_pRstrMgr->CreateRestorePoint();
|
|
*pfSucceeded = ConvBoolToVBool( fRes );
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::DisableFIFO( void )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::DisableFIFO");
|
|
HRESULT hr = S_OK;
|
|
|
|
if ( !g_pRstrMgr->DisableFIFO() )
|
|
{
|
|
hr = E_FAIL;
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::EnableFIFO( void )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::EnableFIFO");
|
|
HRESULT hr = S_OK;
|
|
|
|
if ( !g_pRstrMgr->EnableFIFO() )
|
|
{
|
|
hr = E_FAIL;
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::FormatDate( VARIANT varDate, VARIANT_BOOL fLongFmt, BSTR *pbstrDate )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::FormatDate");
|
|
HRESULT hr = E_FAIL;
|
|
SYSTEMTIME st;
|
|
CSRStr str;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pbstrDate);
|
|
VALIDATE_INPUT_VARIANT(varDate, VT_DATE);
|
|
if ( !ConvVariantToSysTime( varDate, &st ) )
|
|
goto Exit;
|
|
if ( !g_pRstrMgr->FormatDate( &st, str, fLongFmt ) )
|
|
goto Exit;
|
|
ALLOCATEBSTR_AND_CHECK_ERROR( pbstrDate, str );
|
|
|
|
hr = S_OK;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::FormatLowDiskMsg( BSTR bstrFmt, BSTR *pbstrMsg )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::FormatLowDiskMsg");
|
|
HRESULT hr = E_FAIL;
|
|
CSRStr str;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pbstrMsg);
|
|
if ( !g_pRstrMgr->FormatLowDiskMsg( (WCHAR *)bstrFmt, str ) )
|
|
goto Exit;
|
|
ALLOCATEBSTR_AND_CHECK_ERROR( pbstrMsg, str );
|
|
|
|
hr = S_OK;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::FormatTime( VARIANT varTime, BSTR *pbstrTime )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::FormatTime");
|
|
HRESULT hr = E_FAIL;
|
|
SYSTEMTIME st;
|
|
CSRStr str;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pbstrTime);
|
|
VALIDATE_INPUT_VARIANT(varTime, VT_DATE);
|
|
if ( !ConvVariantToSysTime( varTime, &st ) )
|
|
goto Exit;
|
|
if ( !g_pRstrMgr->FormatTime( &st, str ) )
|
|
goto Exit;
|
|
ALLOCATEBSTR_AND_CHECK_ERROR( pbstrTime, str );
|
|
|
|
hr = S_OK;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::GetLocaleDateFormat( VARIANT varDate, BSTR bstrFormat, BSTR *pbstrDate )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::GetLocaleDateFormat");
|
|
HRESULT hr = E_FAIL;
|
|
SYSTEMTIME st;
|
|
CSRStr str;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pbstrDate);
|
|
VALIDATE_INPUT_VARIANT(varDate, VT_DATE);
|
|
if ( !ConvVariantToSysTime( varDate, &st ) )
|
|
goto Exit;
|
|
if ( !g_pRstrMgr->GetLocaleDateFormat( &st, bstrFormat, str ) )
|
|
goto Exit;
|
|
ALLOCATEBSTR_AND_CHECK_ERROR( pbstrDate, str );
|
|
|
|
hr = S_OK;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::GetYearMonthStr( INT nYear, INT nMonth, BSTR *pbstrYearMonth )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::GetYearMonthStr");
|
|
HRESULT hr = E_FAIL;
|
|
CSRStr str;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pbstrYearMonth);
|
|
if ( !g_pRstrMgr->GetYearMonthStr( nYear, nMonth, str ) )
|
|
goto Exit;
|
|
ALLOCATEBSTR_AND_CHECK_ERROR( pbstrYearMonth, str );
|
|
|
|
hr = S_OK;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::InitializeAll()
|
|
{
|
|
TraceFunctEnter("CRestoreShell::InitializeAll");
|
|
HRESULT hr = S_OK;
|
|
|
|
if ( !g_pRstrMgr->InitializeAll() )
|
|
{
|
|
hr = E_FAIL;
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::Restore( OLE_HANDLE hwndProgress )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::Restore");
|
|
HRESULT hr = S_OK;
|
|
|
|
if ( !g_pRstrMgr->Restore( (HWND)hwndProgress ) )
|
|
{
|
|
hr = E_FAIL;
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::SetFormSize( INT nWidth, INT nHeight )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::SetFormSize");
|
|
HWND hwndFrame;
|
|
CWindow cWnd;
|
|
RECT rc;
|
|
HICON hIconFrame;
|
|
|
|
//
|
|
// Cannot initialize more than once
|
|
//
|
|
if ( m_fFormInitialized )
|
|
goto Exit;
|
|
|
|
hwndFrame = g_pRstrMgr->GetFrameHwnd();
|
|
if ( hwndFrame == NULL )
|
|
{
|
|
ErrorTrace(TRACE_ID, "hwndFrame is NULL");
|
|
goto Exit;
|
|
}
|
|
cWnd.Attach( hwndFrame );
|
|
cWnd.ModifyStyle( WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SIZEBOX, 0 );
|
|
|
|
hIconFrame = (HICON)::LoadImage( _Module.GetResourceInstance(),
|
|
MAKEINTRESOURCE(IDR_RSTRUI),
|
|
IMAGE_ICON, 0, 0, LR_DEFAULTSIZE );
|
|
if ( hIconFrame != NULL )
|
|
cWnd.SetIcon( hIconFrame, TRUE );
|
|
hIconFrame = (HICON)::LoadImage( _Module.GetResourceInstance(),
|
|
MAKEINTRESOURCE(IDR_RSTRUI),
|
|
IMAGE_ICON,
|
|
::GetSystemMetrics(SM_CXSMICON),
|
|
::GetSystemMetrics(SM_CYSMICON),
|
|
LR_DEFAULTSIZE );
|
|
if ( hIconFrame != NULL )
|
|
cWnd.SetIcon( hIconFrame, FALSE );
|
|
|
|
rc.left = 0;
|
|
rc.top = 0;
|
|
rc.right = nWidth;
|
|
rc.bottom = nHeight;
|
|
::AdjustWindowRectEx( &rc, cWnd.GetStyle(), FALSE, cWnd.GetExStyle() );
|
|
cWnd.SetWindowPos(
|
|
NULL,
|
|
0,
|
|
0,
|
|
rc.right-rc.left,
|
|
rc.bottom-rc.top,
|
|
SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER);
|
|
|
|
cWnd.CenterWindow(::GetDesktopWindow()); // ignore error return if any
|
|
|
|
cWnd.ShowWindow(SW_SHOW);
|
|
|
|
m_fFormInitialized = TRUE ;
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( S_OK );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::ShowMessage( BSTR bstrMsg )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::ShowMessage");
|
|
WCHAR szTitle[MAX_STR_TITLE];
|
|
CSRStr strMsg = bstrMsg;
|
|
|
|
PCHLoadString( IDS_RESTOREUI_TITLE, szTitle, MAX_STR_TITLE );
|
|
::MessageBox( g_pRstrMgr->GetFrameHwnd(), strMsg, szTitle, MB_OK | MB_ICONINFORMATION );
|
|
|
|
TraceFunctLeave();
|
|
return( S_OK );
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::CanRunRestore( VARIANT_BOOL *pfSucceeded )
|
|
{
|
|
TraceFunctEnter("CRestoreShell::CanRunRestore");
|
|
HRESULT hr = S_OK;
|
|
BOOL fRes;
|
|
VALIDATE_INPUT_ARGUMENT(pfSucceeded);
|
|
|
|
fRes = g_pRstrMgr->CanRunRestore( FALSE );
|
|
*pfSucceeded = ConvBoolToVBool( fRes );
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
/*
|
|
// check if this user is an RA Help Assistant
|
|
|
|
BOOL
|
|
IsRAUser(HANDLE hServer , PLOGONID pId, LPWSTR pszHelpAsst)
|
|
{
|
|
TENTER("IsRAUser");
|
|
|
|
WINSTATIONINFORMATION Info;
|
|
ULONG Length;
|
|
ULONG LogonId;
|
|
BOOL fRet = FALSE;
|
|
|
|
|
|
LogonId = pId->LogonId;
|
|
|
|
if ( !WinStationQueryInformation( hServer,
|
|
LogonId,
|
|
WinStationInformation,
|
|
&Info,
|
|
sizeof(Info),
|
|
&Length ) )
|
|
{
|
|
trace(0, "! WinStationQueryInformation : %ld", GetLastError());
|
|
goto done;
|
|
}
|
|
|
|
trace(0, "Logged user: %S", Info.UserName);
|
|
|
|
if (0 == _wcsnicmp(Info.UserName, pszHelpAsst, lstrlen(pszHelpAsst)))
|
|
fRet = TRUE;
|
|
|
|
done:
|
|
TLEAVE();
|
|
return fRet;
|
|
}
|
|
*/
|
|
|
|
/******************************************************************************/
|
|
|
|
// --------------------------------------------------------------------------
|
|
// GetLoggedOnUserCount
|
|
//
|
|
// Arguments: <none>
|
|
//
|
|
// Returns: int
|
|
//
|
|
// Purpose: Returns the count of logged on users on this machine. Ripped
|
|
// straight out of shtdndlg.c in msgina.
|
|
//
|
|
// History: 2000-03-29 vtan created
|
|
// --------------------------------------------------------------------------
|
|
int GetLoggedOnUserCount(void)
|
|
{
|
|
int iCount;
|
|
HANDLE hServer;
|
|
PLOGONID pLogonID, pLogonIDs;
|
|
ULONG ul, ulEntries;
|
|
WCHAR szHelpAsst[50];
|
|
DWORD dwErr;
|
|
|
|
TENTER("GetLoggedOnUserCount");
|
|
|
|
/*
|
|
// get the "HelpAssistant" string from the resource exe
|
|
dwErr = SRLoadString(L"sessmgr.exe", HELPASSISTANT_STRINGID, szHelpAsst, sizeof(szHelpAsst));
|
|
if (dwErr != ERROR_SUCCESS)
|
|
{
|
|
trace(0, "! SRLoadString : %ld", dwErr);
|
|
lstrcpy(szHelpAsst, s_cszHelpAssistant);
|
|
}
|
|
|
|
trace(0, "Help Asst string: %S", szHelpAsst);
|
|
*/
|
|
|
|
iCount = 0;
|
|
|
|
// Open a connection to terminal services and get the number of sessions.
|
|
hServer = WinStationOpenServerW(reinterpret_cast<WCHAR*>(
|
|
SERVERNAME_CURRENT));
|
|
if (hServer != NULL)
|
|
{
|
|
if (WinStationEnumerate(hServer, &pLogonIDs, &ulEntries))
|
|
{
|
|
// Iterate the sessions looking for active and disconnected sessions only.
|
|
// Then match the user name and domain (case INsensitive) for a result.
|
|
for (ul = 0, pLogonID = pLogonIDs; ul < ulEntries; ++ul, ++pLogonID)
|
|
{
|
|
if ((pLogonID->State == State_Active) || (pLogonID->State ==
|
|
State_Disconnected) || (pLogonID->State == State_Shadow))
|
|
{
|
|
// don't count RA Help Assistant user if present
|
|
|
|
if (FALSE == WinStationIsHelpAssistantSession(SERVERNAME_CURRENT, pLogonID->LogonId))
|
|
++iCount;
|
|
else
|
|
trace(0, "RA session present - not counting");
|
|
|
|
}
|
|
}
|
|
|
|
// Free any resources used.
|
|
|
|
(BOOLEAN)WinStationFreeMemory(pLogonIDs);
|
|
}
|
|
|
|
(BOOLEAN)WinStationCloseServer(hServer);
|
|
}
|
|
|
|
TLEAVE();
|
|
|
|
// Return result.
|
|
return(iCount);
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
STDMETHODIMP
|
|
CRestoreShell::DisplayOtherUsersWarning()
|
|
{
|
|
TraceFunctEnter("CRestoreShell::DisplayOtherUsersWarning");
|
|
HRESULT hr = S_OK;
|
|
WCHAR szTitle[MAX_STR_TITLE];
|
|
WCHAR szMsg[MAX_STR_MSG];
|
|
WCHAR szMsg1[MAX_STR_MSG];
|
|
WCHAR szMsg2[MAX_STR_MSG];
|
|
DWORD dwUsersLoggedIn,dwCount,dwError;
|
|
|
|
dwUsersLoggedIn = GetLoggedOnUserCount();
|
|
|
|
if (dwUsersLoggedIn <= 1)
|
|
{
|
|
// there are no other users
|
|
goto cleanup;
|
|
}
|
|
|
|
// there are other users - display warning
|
|
dwCount=PCHLoadString( IDS_RESTOREUI_TITLE, szTitle, MAX_STR_TITLE );
|
|
if (dwCount==0)
|
|
{
|
|
dwError = GetLastError();
|
|
ErrorTrace(0, "Loading IDS_RESTOREUI_TITLE failed %d",dwError);
|
|
goto cleanup;
|
|
}
|
|
dwCount=PCHLoadString(IDS_ERR_OTHER_USERS_LOGGED_ON1, szMsg1, MAX_STR_MSG);
|
|
if (dwCount==0)
|
|
{
|
|
dwError = GetLastError();
|
|
ErrorTrace(0, "Loading IDS_ERR_OTHER_USERS_LOGGED_ON1 failed %d",
|
|
dwError);
|
|
goto cleanup;
|
|
}
|
|
dwCount=PCHLoadString(IDS_ERR_OTHER_USERS_LOGGED_ON2, szMsg2, MAX_STR_MSG);
|
|
if (dwCount==0)
|
|
{
|
|
dwError = GetLastError();
|
|
ErrorTrace(0, "Loading IDS_ERR_OTHER_USERS_LOGGED_ON2 failed %d",
|
|
dwError);
|
|
goto cleanup;
|
|
}
|
|
|
|
::wsprintf( szMsg, L"%s %d%s", szMsg1,dwUsersLoggedIn -1, szMsg2 );
|
|
::MessageBox( g_pRstrMgr->GetFrameHwnd(),
|
|
szMsg,
|
|
szTitle,
|
|
MB_OK | MB_ICONWARNING | MB_DEFBUTTON2);
|
|
|
|
cleanup:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
//this returns TRUE if any move fileex entries exist
|
|
STDMETHODIMP
|
|
CRestoreShell::DisplayMoveFileExWarning(VARIANT_BOOL *pfSucceeded)
|
|
{
|
|
TraceFunctEnter("CRestoreShell::DisplayOtherUsersWarning");
|
|
HRESULT hr = S_OK;
|
|
DWORD dwType, cbData, dwRes;
|
|
BOOL fRes;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pfSucceeded);
|
|
fRes = FALSE;
|
|
|
|
/*
|
|
// Check if MoveFileEx entries exist
|
|
dwRes = ::SHGetValue( HKEY_LOCAL_MACHINE,
|
|
STR_REGPATH_SESSIONMANAGER,
|
|
STR_REGVAL_MOVEFILEEX,
|
|
&dwType,
|
|
NULL,
|
|
&cbData );
|
|
if ( dwRes == ERROR_SUCCESS )
|
|
{
|
|
if ( cbData > 2* sizeof(WCHAR))
|
|
{
|
|
fRes = TRUE;
|
|
ErrorTrace(0, "MoveFileEx entries exist...");
|
|
::ShowSRErrDlg( IDS_ERR_SR_MOVEFILEEX_EXIST );
|
|
}
|
|
}
|
|
*/
|
|
|
|
*pfSucceeded = ConvBoolToVBool( fRes );
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
|
|
|
|
//this returns TRUE if any move fileex entries exist
|
|
STDMETHODIMP
|
|
CRestoreShell::WasLastRestoreFromSafeMode(VARIANT_BOOL *pfSucceeded)
|
|
{
|
|
TraceFunctEnter("CRestoreShell::WasLastRestoreFromSafeMode");
|
|
HRESULT hr = S_OK;
|
|
BOOL fRes;
|
|
|
|
VALIDATE_INPUT_ARGUMENT(pfSucceeded);
|
|
fRes = TRUE;
|
|
|
|
fRes = ::WasLastRestoreInSafeMode();
|
|
|
|
*pfSucceeded = ConvBoolToVBool( fRes );
|
|
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( hr );
|
|
}
|
|
/***************************************************************************/
|
|
|
|
|
|
//
|
|
// END OF NEW CODE
|
|
//
|
|
|
|
// end of file
|