windows-nt/Source/XPSP1/NT/inetsrv/iis/ui/admin/w3scfg/defws.cpp

670 lines
12 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1994-1998 Microsoft Corporation
Module Name :
defws.cpp
Abstract:
Default Web Site Dialog
Author:
Ronald Meijer (ronaldm)
Project:
Internet Services Manager
Revision History:
--*/
//
// Include Files
//
#include "stdafx.h"
#include "w3scfg.h"
#include "defws.h"
#include "dirbrows.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//
// Directory Size Units
//
#define DS_UNITS MEGABYTE
//
// Default Web Site Property Page
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
IMPLEMENT_DYNCREATE(CDefWebSitePage, CInetPropertyPage)
CDefWebSitePage::CDefWebSitePage(
IN CInetPropertySheet * pSheet
)
/*++
Routine Description:
Constructor for WWW Default Web Site page
Arguments:
CInetPropertySheet * pSheet : Sheet object
Return Value:
N/A
--*/
: CInetPropertyPage(CDefWebSitePage::IDD, pSheet),
m_ppropCompression(NULL),
m_fFilterPathFound(FALSE),
m_fCompressionDirectoryChanged(FALSE)
{
#if 0 // Keep Class Wizard happy
//{{AFX_DATA_INIT(CDefWebSitePage)
m_fEnableDynamic = FALSE;
m_fEnableStatic = FALSE;
m_strDirectory = _T("");
m_nUnlimited = -1;
m_ilSize = 0L;
//}}AFX_DATA_INIT
#endif // 0
}
CDefWebSitePage::~CDefWebSitePage()
/*++
Routine Description:
Destructor
Arguments:
N/A
Return Value:
N/A
--*/
{
}
void
CDefWebSitePage::DoDataExchange(
IN CDataExchange * pDX
)
/*++
Routine Description:
Initialise/Store control data
Arguments:
CDataExchange * pDX - DDX/DDV control structure
Return Value:
None
--*/
{
CInetPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDefWebSitePage)
DDX_Control(pDX, IDC_EDIT_COMPRESS_DIRECTORY, m_edit_Directory);
DDX_Control(pDX, IDC_BUTTON_BROWSE, m_button_Browse);
DDX_Control(pDX, IDC_STATIC_COMPRESS_MB, m_static_MB);
DDX_Control(pDX, IDC_EDIT_COMPRESS_DIRECTORY_SIZE, m_edit_DirectorySize);
DDX_Check(pDX, IDC_CHECK_DYNAMIC_COMPRESSION, m_fEnableDynamic);
DDX_Check(pDX, IDC_CHECK_STATIC_COMPRESSION, m_fEnableStatic);
DDX_Radio(pDX, IDC_RADIO_COMPRESS_UNLIMITED, m_nUnlimited);
//}}AFX_DATA_MAP
if (HasCompression())
{
if (!pDX->m_bSaveAndValidate || m_fEnableStatic)
{
DDX_Text(pDX, IDC_EDIT_COMPRESS_DIRECTORY, m_strDirectory);
DDV_MaxChars(pDX, m_strDirectory, _MAX_PATH);
}
if (pDX->m_bSaveAndValidate && m_fEnableStatic)
{
if (!IsFullyQualifiedPath(m_strDirectory))
{
::AfxMessageBox(IDS_ERR_INVALID_PATH);
pDX->Fail();
}
//
// Perform some additional smart checking on the compression
// directory if the current machine is local, and the
// directory has changed
//
if (IsLocal() && m_fCompressionDirectoryChanged)
{
//
// Should exist on the local machine.
//
DWORD dwAttr = GetFileAttributes(m_strDirectory);
if (dwAttr == 0xffffffff
|| (dwAttr & FILE_ATTRIBUTE_DIRECTORY) == 0
|| IsNetworkPath(m_strDirectory)
)
{
::AfxMessageBox(IDS_ERR_COMPRESS_DIRECTORY);
pDX->Fail();
}
//
// Now check to make sure the volume is of the correct
// type.
//
DWORD dwFileSystemFlags;
if (::GetVolumeInformationSystemFlags(
m_strDirectory,
&dwFileSystemFlags
))
{
if (!(dwFileSystemFlags & FS_PERSISTENT_ACLS))
{
//
// No ACLS
//
if (!NoYesMessageBox(IDS_NO_ACL_WARNING))
{
pDX->Fail();
}
}
if (dwFileSystemFlags & FS_VOL_IS_COMPRESSED
|| dwAttr & FILE_ATTRIBUTE_COMPRESSED)
{
//
// Compression cache directory is itself compressed
//
if (!NoYesMessageBox(IDS_COMPRESS_WARNING))
{
pDX->Fail();
}
}
}
}
}
if (!pDX->m_bSaveAndValidate || (m_fEnableLimiting && m_fEnableStatic))
{
DDX_Text(pDX, IDC_EDIT_COMPRESS_DIRECTORY_SIZE, m_ilSize);
DDV_MinMaxLong(pDX, m_ilSize, 1, 1024L);
}
}
}
//
// Message Map
//
BEGIN_MESSAGE_MAP(CDefWebSitePage, CInetPropertyPage)
//{{AFX_MSG_MAP(CDefWebSitePage)
ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse)
ON_BN_CLICKED(IDC_RADIO_COMPRESS_LIMITED, OnRadioLimited)
ON_BN_CLICKED(IDC_RADIO_COMPRESS_UNLIMITED, OnRadioUnlimited)
ON_BN_CLICKED(IDC_CHECK_DYNAMIC_COMPRESSION, OnCheckDynamicCompression)
ON_BN_CLICKED(IDC_CHECK_STATIC_COMPRESSION, OnCheckStaticCompression)
ON_EN_CHANGE(IDC_EDIT_COMPRESS_DIRECTORY, OnChangeEditCompressDirectory)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
ON_EN_CHANGE(IDC_EDIT_COMPRESS_DIRECTORY, OnItemChanged)
ON_EN_CHANGE(IDC_EDIT_COMPRESS_DIRECTORY_SIZE, OnItemChanged)
END_MESSAGE_MAP()
void
CDefWebSitePage::SetControlStates()
/*++
Routine Description:
Enable/disable control states depending on the state of
the dialog.
Arguments:
None
Return Value:
None
--*/
{
GetDlgItem(IDC_STATIC_COMPRESS_DIRECTORY)->EnableWindow(m_fEnableStatic);
m_edit_Directory.EnableWindow(m_fEnableStatic);
m_edit_DirectorySize.EnableWindow(m_fEnableStatic && m_fEnableLimiting);
m_static_MB.EnableWindow(m_fEnableStatic&& m_fEnableLimiting);
GetDlgItem(IDC_RADIO_COMPRESS_LIMITED)->EnableWindow(m_fEnableStatic);
GetDlgItem(IDC_RADIO_COMPRESS_UNLIMITED)->EnableWindow(m_fEnableStatic);
GetDlgItem(IDC_STATIC_MAX_COMPRESS_SIZE)->EnableWindow(m_fEnableStatic);
//
// Browse on the local machine only
//
m_button_Browse.EnableWindow(IsLocal() && m_fEnableStatic);
}
/* virtual */
HRESULT
CDefWebSitePage::FetchLoadedValues()
/*++
Routine Description:
Move configuration data from sheet to dialog controls
Arguments:
None
Return Value:
HRESULT
--*/
{
CError err;
ASSERT(m_ppropCompression == NULL);
m_ppropCompression = new CIISCompressionProps(GetServerName());
if (m_ppropCompression)
{
err = m_ppropCompression->LoadData();
m_fFilterPathFound = err.Succeeded();
if (err.Succeeded())
{
m_fEnableDynamic = m_ppropCompression->m_fEnableDynamicCompression;
m_fEnableStatic = m_ppropCompression->m_fEnableStaticCompression;
m_fEnableLimiting = m_ppropCompression->m_fLimitDirectorySize;
m_strDirectory = m_ppropCompression->m_strDirectory;
m_nUnlimited = m_fEnableLimiting ? RADIO_LIMITED : RADIO_UNLIMITED;
if (m_ppropCompression->m_dwDirectorySize == 0xffffffff)
{
m_ilSize = DEF_MAX_COMPDIR_SIZE / DS_UNITS;
}
else
{
m_ilSize = m_ppropCompression->m_dwDirectorySize / DS_UNITS;
}
}
else if (err.Win32Error() == ERROR_PATH_NOT_FOUND)
{
//
// Fail quietly
//
TRACEEOLID("No compression filters installed");
err.Reset();
}
}
else
{
err = ERROR_NOT_ENOUGH_MEMORY;
}
return err;
}
HRESULT
CDefWebSitePage::SaveInfo()
/*++
Routine Description:
Save the information on this property page
Arguments:
None
Return Value:
Error return code
--*/
{
ASSERT(IsDirty());
TRACEEOLID("Saving W3 default web site page now...");
CError err;
BeginWaitCursor();
//
// Write Compression parms as well.
//
if (err.Succeeded() && HasCompression())
{
ASSERT(m_ppropCompression);
DWORD dwSize = m_ilSize * DS_UNITS;
m_ppropCompression->m_fEnableDynamicCompression = m_fEnableDynamic;
m_ppropCompression->m_fEnableStaticCompression = m_fEnableStatic;
m_ppropCompression->m_fLimitDirectorySize = m_fEnableLimiting;
m_ppropCompression->m_strDirectory = m_strDirectory;
m_ppropCompression->m_dwDirectorySize = dwSize;
err = m_ppropCompression->WriteDirtyProps();
}
EndWaitCursor();
if (err.Succeeded())
{
m_fCompressionDirectoryChanged = FALSE;
}
return err;
}
//
// Message Handlers
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
BOOL
CDefWebSitePage::OnInitDialog()
/*++
Routine Description:
WM_INITDIALOG handler. Initialize the dialog.
Arguments:
None.
Return Value:
TRUE if focus is to be set automatically, FALSE if the focus
is already set.
--*/
{
CInetPropertyPage::OnInitDialog();
//
// Check to make sure compression is supported
//
for (UINT n = IDC_COMPRESS_FLAGS_FIRST; n <= IDC_COMPRESS_FLAGS_LAST; ++n)
{
GetDlgItem(n)->EnableWindow(HasCompression());
}
SetControlStates();
return TRUE;
}
void
CDefWebSitePage::OnItemChanged()
/*++
Routine Description:
Handle change in control data
Arguments:
None
Return Value:
None
--*/
{
SetModified(TRUE);
SetControlStates();
}
void
CDefWebSitePage::OnButtonBrowse()
/*++
Routine Description:
"Browse" button handler
Arguments:
None
Return Value:
None
--*/
{
ASSERT(IsLocal());
CString str;
m_edit_Directory.GetWindowText(str);
CDirBrowseDlg dlgBrowse(this, str);
if (dlgBrowse.DoModal() == IDOK)
{
m_edit_Directory.SetWindowText(dlgBrowse.GetFullPath(str));
OnItemChanged();
}
}
void
CDefWebSitePage::OnChangeEditCompressDirectory()
/*++
Routine Description:
Handle change in compression directory edit box.
Arguments:
None
Return Value:
None
--*/
{
m_fCompressionDirectoryChanged = TRUE;
OnItemChanged();
}
void
CDefWebSitePage::OnRadioLimited()
/*++
Routine Description:
'Limited' radio button handler
Arguments:
None
Return Value:
None
--*/
{
if (!m_fEnableLimiting)
{
m_nUnlimited = RADIO_LIMITED;
m_fEnableLimiting = TRUE;
OnItemChanged();
m_edit_DirectorySize.SetSel(0, -1);
m_edit_DirectorySize.SetFocus();
}
}
void
CDefWebSitePage::OnRadioUnlimited()
/*++
Routine Description:
'Unlimited' radio button handler
Arguments:
None
Return Value:
None
--*/
{
if (m_fEnableLimiting)
{
m_nUnlimited = RADIO_UNLIMITED;
m_fEnableLimiting = FALSE;
OnItemChanged();
}
}
void
CDefWebSitePage::OnCheckDynamicCompression()
/*++
Routine Description:
"Enable Dynamic Compression' checkbox handler
Arguments:
None
Return Value:
None
--*/
{
m_fEnableDynamic = !m_fEnableDynamic;
OnItemChanged();
}
void
CDefWebSitePage::OnCheckStaticCompression()
/*++
Routine Description:
"Enable Dynamic Compression' checkbox handler
Arguments:
None
Return Value:
None
--*/
{
m_fEnableStatic = !m_fEnableStatic;
OnItemChanged();
if (m_fEnableStatic)
{
m_edit_Directory.SetSel(0, -1);
m_edit_Directory.SetFocus();
}
}
void
CDefWebSitePage::OnDestroy()
/*++
Routine Description:
WM_DESTROY handler. Clean up internal data
Arguments:
None
Return Value:
None
--*/
{
CInetPropertyPage::OnDestroy();
SAFE_DELETE(m_ppropCompression);
}