mirror of https://github.com/lianthony/NT4.0
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.
777 lines
22 KiB
777 lines
22 KiB
// options.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "import.h"
|
|
#include "registry.h"
|
|
#include "machine.h"
|
|
#include "base.h"
|
|
#include "options.h"
|
|
#include "targetdi.h"
|
|
#include "vrootdlg.h"
|
|
#include "browsedi.h"
|
|
|
|
extern "C"
|
|
{
|
|
#include "uiexport.h"
|
|
}
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COptions dialog
|
|
|
|
|
|
COptions::COptions(MACHINE *pMachine, OPTIONS_LIST *pOption, BOOL fSendEndMsg,
|
|
BOOL fAllowChgMachine, CWnd* pParent /*=NULL*/)
|
|
: CDialog(COptions::IDD, pParent),
|
|
m_fAllowChgMachine( fAllowChgMachine ),
|
|
m_pTargetMachine( pMachine ),
|
|
m_fSendEndMsg( fSendEndMsg ),
|
|
m_pOptionsList( pOption ),
|
|
m_cxOption( 0 ),
|
|
m_cxInstall( 0 ),
|
|
m_cxSize( 0 )
|
|
{
|
|
//{{AFX_DATA_INIT(COptions)
|
|
//}}AFX_DATA_INIT
|
|
m_strFmt.LoadString( IDS_FILE_SIZE_FORMAT );
|
|
m_TotalSize = 0;
|
|
m_OldSel = 0;
|
|
m_fKeyDown = FALSE;
|
|
|
|
if ( pMachine->m_InstallMode == INSTALL_GATEWAY )
|
|
{
|
|
SetHelpID( HIDD_GATEWAY_OPTION );
|
|
}
|
|
|
|
//
|
|
// Load initial column widths from the resources
|
|
//
|
|
// CODEWORK: This is rather lame. Ideally, the width should be
|
|
// auto-determined from the localised strings that
|
|
// go into these columns. Also, these settings should be
|
|
// saved as part of the preference settings.
|
|
//
|
|
CString strSizes;
|
|
if (strSizes.LoadString(IDS_COLUMN_WIDTHS))
|
|
{
|
|
_stscanf(strSizes, _T("%d %d %d"),
|
|
&m_cxOption, &m_cxInstall, &m_cxSize);
|
|
}
|
|
|
|
if (m_cxOption <= 0 || m_cxInstall <= 0 || m_cxSize <= 0)
|
|
{
|
|
m_cxOption = 150;
|
|
m_cxInstall = 60;
|
|
m_cxSize = 60;
|
|
}
|
|
}
|
|
|
|
COptions::~COptions()
|
|
{
|
|
}
|
|
|
|
|
|
void COptions::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(COptions)
|
|
DDX_Control(pDX, IDC_DIR_TEXT, m_DirText);
|
|
DDX_Control(pDX, IDC_NUM_SPACE_REQUIRED, m_sc_NumSpaceRequired);
|
|
DDX_Control(pDX, IDC_NUM_SPACE_AVAILABLE, m_sc_NumSpaceAvailable);
|
|
DDX_Control(pDX, IDC_SPACE_REQUIERD, m_sc_SpaceRequired);
|
|
DDX_Control(pDX, IDC_SPACE_AVAILABLE, m_sc_SpaceAvailable);
|
|
DDX_Control(pDX, IDC_DIRECTORY, m_sc_Directory);
|
|
DDX_Control(pDX, IDC_CHANGE_DIRECTORY, m_but_Change_Directory);
|
|
DDX_Control(pDX, IDC_DESCRIPTION, m_Description);
|
|
DDX_Control(pDX, IDC_OPTION, m_OptionsList);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(COptions, CDialog)
|
|
//{{AFX_MSG_MAP(COptions)
|
|
ON_NOTIFY(LVN_ITEMCHANGED, IDC_OPTION, OnSelchangeOption)
|
|
ON_NOTIFY(NM_CLICK, IDC_OPTION, OnClickOption)
|
|
ON_NOTIFY(NM_DBLCLK, IDC_OPTION, OnDblClickOption)
|
|
ON_BN_CLICKED(IDC_CHANGE_DIRECTORY, OnChangeDirectory)
|
|
ON_NOTIFY(LVN_KEYDOWN, IDC_OPTION, OnKeydownOption)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COptions message handlers
|
|
|
|
BOOL COptions::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
CString strCaption;
|
|
strCaption.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )?IDS_WINNT_LOGO:IDS_LANMAN_LOGO );
|
|
SetWindowText( strCaption );
|
|
|
|
CenterWindow();
|
|
|
|
m_AvailableSize = 0;
|
|
|
|
CImageList *pil = new CImageList;
|
|
pil->Create( IDB_CHECKBOX, 16, 15, RGB(255,255,255));
|
|
|
|
m_OptionsList.SetImageList( pil, LVSIL_SMALL );
|
|
//const LV_COLUMN col1 = { LVCF_WIDTH, LVCFMT_LEFT, 150, NULL, 0 };
|
|
//const LV_COLUMN col2 = { LVCF_WIDTH, LVCFMT_LEFT, 60, NULL, 0 };
|
|
//const LV_COLUMN col3 = { LVCF_WIDTH, LVCFMT_LEFT, 60, NULL, 0 };
|
|
|
|
const LV_COLUMN col1 = { LVCF_WIDTH, LVCFMT_LEFT, m_cxOption, NULL, 0 };
|
|
const LV_COLUMN col2 = { LVCF_WIDTH, LVCFMT_LEFT, m_cxInstall, NULL, 0 };
|
|
const LV_COLUMN col3 = { LVCF_WIDTH, LVCFMT_LEFT, m_cxSize, NULL, 0 };
|
|
|
|
m_OptionsList.InsertColumn(0, &col1);
|
|
m_OptionsList.InsertColumn(1, &col2);
|
|
m_OptionsList.InsertColumn(2, &col3);
|
|
|
|
DisplayOptions();
|
|
|
|
//DisplaySize();
|
|
#ifdef BETA1
|
|
DisplayMachineName();
|
|
#endif
|
|
|
|
m_but_Change_Directory.EnableWindow( !m_pTargetMachine->m_fAlreadyInstall );
|
|
|
|
// BUGBUG: beta 1 does not allow remote installation
|
|
|
|
#ifdef BETA1
|
|
m_but_ChgMachine.EnableWindow( FALSE/*m_fAllowChgMachine && !m_pTargetMachine->m_fFromWin32*/ );
|
|
#endif
|
|
//m_Customize.EnableWindow( FALSE );
|
|
//m_but_Change_Directory.ShowWindow( FALSE );
|
|
m_sc_Directory.SetWindowText( m_pTargetMachine->strDirectory );
|
|
|
|
LRESULT lResult;
|
|
OnSelchangeOption( NULL, &lResult );
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void COptions::OnSelchangeOption( NMHDR *pNMHDR, LRESULT *lResult )
|
|
{
|
|
// display the correct description and directory information
|
|
NM_LISTVIEW *pListView = (NM_LISTVIEW *)pNMHDR;
|
|
|
|
INT nCurSel = m_OptionsList.GetNextItem( -1, LVNI_SELECTED);
|
|
if ( nCurSel != LB_ERR )
|
|
{
|
|
OPTION_STATE *pOption = GetOptionItem( nCurSel );
|
|
if ( pOption != NULL )
|
|
{
|
|
m_Description.SetWindowText( pOption->strDescription );
|
|
if ( m_fKeyDown )
|
|
{
|
|
m_OldSel = nCurSel;
|
|
m_fKeyDown = FALSE;
|
|
}
|
|
}
|
|
}
|
|
DisplaySize();
|
|
*lResult = 0;
|
|
}
|
|
|
|
void COptions::OnDblClickOption( NMHDR *pNMHDR, LRESULT *lResult )
|
|
{
|
|
OnClickOption( pNMHDR, lResult );
|
|
OnClickOption( pNMHDR, lResult );
|
|
}
|
|
|
|
void COptions::CheckOptionBox(int index, LV_ITEM *pLVI, OPTION_STATE *pOption)
|
|
{
|
|
CString csAction;
|
|
|
|
pLVI->iImage = STATE_INSTALLED;
|
|
switch (pOption->iState)
|
|
{
|
|
case STATE_NOT_INSTALLED:
|
|
pOption->SetAction( ACTION_INSTALL );
|
|
csAction.LoadString( IDS_INSTALL_STATE );
|
|
break;
|
|
case STATE_INSTALLED:
|
|
pOption->SetAction( ACTION_DO_NOTHING );
|
|
break;
|
|
}
|
|
|
|
m_OptionsList.SetItemText(index, 1, (LPTSTR)(LPCTSTR)csAction);
|
|
m_OptionsList.SetItem(pLVI);
|
|
m_OptionsList.Update(index);
|
|
}
|
|
|
|
void COptions::UnCheckOptionBox(int index, LV_ITEM *pLVI, OPTION_STATE *pOption)
|
|
{
|
|
CString csAction;
|
|
|
|
pLVI->iImage = STATE_NOT_INSTALLED;
|
|
switch (pOption->iState)
|
|
{
|
|
case STATE_INSTALLED:
|
|
pOption->SetAction( ACTION_REMOVE );
|
|
csAction.LoadString( IDS_REMOVE_STATE );
|
|
break;
|
|
case STATE_NOT_INSTALLED:
|
|
pOption->SetAction( ACTION_DO_NOTHING );
|
|
break;
|
|
}
|
|
|
|
m_OptionsList.SetItemText(index, 1, (LPTSTR)(LPCTSTR)csAction);
|
|
m_OptionsList.SetItem(pLVI);
|
|
m_OptionsList.Update(index);
|
|
}
|
|
|
|
void COptions::OnClickOption( NMHDR *pNMHDR, LRESULT *lResult )
|
|
{
|
|
// change the option type
|
|
NM_LISTVIEW *pListView = (NM_LISTVIEW *)pNMHDR;
|
|
CString strState;
|
|
|
|
INT nCurSel = m_OptionsList.GetNextItem( -1, LVNI_SELECTED);
|
|
if ( nCurSel != LB_ERR )
|
|
{
|
|
// Find out the (x, y)-coordinate of the button click
|
|
POINT ptScreen;
|
|
DWORD dwPos = ::GetMessagePos();
|
|
ptScreen.x = LOWORD(dwPos);
|
|
ptScreen.y = HIWORD(dwPos);
|
|
::ScreenToClient(((NMHDR *)pNMHDR)->hwndFrom, &ptScreen);
|
|
|
|
// Find out the Rect of the item icon
|
|
RECT rect;
|
|
ListView_GetItemRect(((NMHDR *)pNMHDR)->hwndFrom, nCurSel, &rect, LVIR_ICON);
|
|
|
|
// test if the click happens on icon or lable of the list view item
|
|
BOOL fClickOnIcon;
|
|
fClickOnIcon = ( ptScreen.x >= rect.left ) && (ptScreen.x <= rect.right );
|
|
|
|
// if the Click is on icon, then select this item first
|
|
if (fClickOnIcon)
|
|
m_OldSel = nCurSel;
|
|
|
|
LV_ITEM lvi;
|
|
lvi.mask = LVIF_IMAGE | LVIF_PARAM;
|
|
lvi.iItem = nCurSel;
|
|
lvi.iSubItem = 0;
|
|
m_OptionsList.GetItem( &lvi );
|
|
|
|
OPTION_STATE *pOption = (OPTION_STATE *) lvi.lParam;
|
|
|
|
CString csOptionName;
|
|
|
|
if ( m_OldSel == nCurSel )
|
|
{
|
|
switch (lvi.iImage )
|
|
{
|
|
case STATE_NOT_INSTALLED:
|
|
CheckOptionBox(nCurSel, &lvi, pOption);
|
|
switch (pOption->nID)
|
|
{
|
|
case IDS_SN_W3SAMP:
|
|
case IDS_SN_HTMLA:
|
|
csOptionName.LoadString(IDS_OPTION_WWW);
|
|
CheckOption(csOptionName);
|
|
csOptionName.LoadString(IDS_OPTION_ADMIN);
|
|
CheckOption(csOptionName);
|
|
break;
|
|
case IDS_SN_WWW:
|
|
case IDS_SN_FTP:
|
|
case IDS_SN_GOPHER:
|
|
csOptionName.LoadString(IDS_OPTION_ADMIN);
|
|
CheckOption(csOptionName);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case STATE_INSTALLED:
|
|
UnCheckOptionBox(nCurSel, &lvi, pOption);
|
|
switch (pOption->nID)
|
|
{
|
|
case IDS_SN_WWW:
|
|
csOptionName.LoadString(IDS_OPTION_W3SAMP);
|
|
UnCheckOption(csOptionName);
|
|
csOptionName.LoadString(IDS_OPTION_HTMLA);
|
|
UnCheckOption(csOptionName);
|
|
break;
|
|
case IDS_SN_ADMIN:
|
|
csOptionName.LoadString(IDS_OPTION_WWW);
|
|
UnCheckOption(csOptionName);
|
|
csOptionName.LoadString(IDS_OPTION_W3SAMP);
|
|
UnCheckOption(csOptionName);
|
|
csOptionName.LoadString(IDS_OPTION_HTMLA);
|
|
UnCheckOption(csOptionName);
|
|
csOptionName.LoadString(IDS_OPTION_FTP);
|
|
UnCheckOption(csOptionName);
|
|
csOptionName.LoadString(IDS_OPTION_GOPHER);
|
|
UnCheckOption(csOptionName);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
DisplaySize();
|
|
}
|
|
m_OldSel = nCurSel;
|
|
}
|
|
|
|
*lResult = 0;
|
|
}
|
|
|
|
void COptions::CheckOption(CString csOptionName)
|
|
{
|
|
LV_FINDINFO FindInfo;
|
|
|
|
FindInfo.flags = LVFI_STRING;
|
|
FindInfo.psz = (LPCTSTR)csOptionName;
|
|
FindInfo.lParam = 0;
|
|
|
|
int index = m_OptionsList.FindItem(&FindInfo, -1);
|
|
|
|
LV_ITEM lvi;
|
|
lvi.mask = LVIF_IMAGE | LVIF_PARAM;
|
|
lvi.iItem = index;
|
|
lvi.iSubItem = 0;
|
|
m_OptionsList.GetItem( &lvi );
|
|
|
|
OPTION_STATE *pOption = (OPTION_STATE *) lvi.lParam;
|
|
|
|
if (lvi.iImage == STATE_NOT_INSTALLED)
|
|
CheckOptionBox(index, &lvi, pOption);
|
|
}
|
|
|
|
void COptions::UnCheckOption(CString csOptionName)
|
|
{
|
|
LV_FINDINFO FindInfo;
|
|
|
|
FindInfo.flags = LVFI_STRING;
|
|
FindInfo.psz = (LPCTSTR)csOptionName;
|
|
FindInfo.lParam = 0;
|
|
|
|
int index = m_OptionsList.FindItem(&FindInfo, -1);
|
|
|
|
LV_ITEM lvi;
|
|
lvi.mask = LVIF_IMAGE | LVIF_PARAM;
|
|
lvi.iItem = index;
|
|
lvi.iSubItem = 0;
|
|
m_OptionsList.GetItem( &lvi );
|
|
|
|
OPTION_STATE *pOption = (OPTION_STATE *) lvi.lParam;
|
|
|
|
if (lvi.iImage == STATE_INSTALLED)
|
|
UnCheckOptionBox(index, &lvi, pOption);
|
|
}
|
|
|
|
|
|
OPTION_STATE *COptions::GetOptionItem( INT nCurSel )
|
|
{
|
|
LV_ITEM lvi;
|
|
lvi.mask = LVIF_PARAM;
|
|
lvi.iItem = nCurSel;
|
|
lvi.iSubItem = 0;
|
|
if ( !m_OptionsList.GetItem( &lvi ))
|
|
return(NULL);
|
|
else
|
|
return(OPTION_STATE*)lvi.lParam;
|
|
}
|
|
|
|
void COptions::DisplaySize()
|
|
{
|
|
CString strLoc;
|
|
CString strFmt;
|
|
CString strDisplay;
|
|
|
|
DWORD dwSectorsPerCluster;
|
|
DWORD dwBytesPerSector;
|
|
DWORD dwFreeCluster;
|
|
DWORD dwTotalCluster;
|
|
INT Index = 2;
|
|
|
|
// get the first few characters of the path
|
|
strLoc = m_pTargetMachine->strDirectory.Left(Index);
|
|
strFmt.LoadString( IDS_SPACE_REQUIRED );
|
|
|
|
POSITION pos = m_pOptionsList->GetHeadPosition();
|
|
INT TotalSize = 0;
|
|
OPTION_STATE *pOption;
|
|
|
|
// find all the space required
|
|
while ( pos != NULL )
|
|
{
|
|
pOption = (OPTION_STATE *)m_pOptionsList->GetAt( pos );
|
|
if ( pOption != NULL )
|
|
{
|
|
if ( pOption->iAction == ACTION_INSTALL )
|
|
{
|
|
TotalSize += pOption->iSize;
|
|
}
|
|
}
|
|
m_pOptionsList->GetNext( pos );
|
|
}
|
|
|
|
strDisplay.Format( strFmt, strLoc );
|
|
m_sc_SpaceRequired.SetWindowText( strDisplay );
|
|
|
|
strFmt.LoadString( IDS_SPACE_AVAILABLE );
|
|
strDisplay.Format( strFmt, strLoc);
|
|
m_sc_SpaceAvailable.SetWindowText( strDisplay );
|
|
|
|
strFmt.LoadString( IDS_FILE_SIZE_FORMAT );
|
|
strDisplay.Format( strFmt, TotalSize / 1000 );
|
|
m_sc_NumSpaceRequired.SetWindowText( strDisplay );
|
|
|
|
strLoc += _T("\\");
|
|
GetDiskFreeSpace( strLoc, &dwSectorsPerCluster, &dwBytesPerSector, &dwFreeCluster, &dwTotalCluster );
|
|
|
|
strDisplay.Format( strFmt, (dwSectorsPerCluster * dwBytesPerSector * dwFreeCluster /1024));
|
|
m_sc_NumSpaceAvailable.SetWindowText( strDisplay );
|
|
}
|
|
|
|
void COptions::DisplayOptions()
|
|
{
|
|
INT iIndex = 0;
|
|
INT i = 0;
|
|
|
|
m_OptionsList.DeleteAllItems();
|
|
|
|
POSITION pos = m_pOptionsList->GetHeadPosition();
|
|
OPTION_STATE *pOption;
|
|
|
|
while ( pos != NULL )
|
|
{
|
|
pOption = (OPTION_STATE *)m_pOptionsList->GetAt( pos );
|
|
|
|
// add all the options into the listbox
|
|
if ( pOption->fVisible )
|
|
{
|
|
TCHAR buf[100];
|
|
LV_ITEM lvi;
|
|
|
|
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
|
|
const TCHAR *pszName = pOption->strName;
|
|
lvi.pszText = (TCHAR *)pszName;
|
|
lvi.cchTextMax = pOption->strName.GetLength();
|
|
lvi.iItem = iIndex;
|
|
if ( ((pOption->iState == STATE_INSTALLED) && (pOption->iAction != ACTION_REMOVE)) ||
|
|
((pOption->iState == STATE_NOT_INSTALLED) && (pOption->iAction == ACTION_INSTALL)) )
|
|
{
|
|
lvi.iImage = STATE_INSTALLED;
|
|
} else
|
|
{
|
|
lvi.iImage = STATE_NOT_INSTALLED;
|
|
}
|
|
lvi.iSubItem = 0;
|
|
lvi.state = (iIndex == 0)? LVIS_SELECTED | LVIS_FOCUSED :0;
|
|
lvi.stateMask = LVIS_SELECTED | LVIS_FOCUSED ;
|
|
lvi.lParam = (LPARAM)pOption;
|
|
|
|
m_OptionsList.InsertItem( &lvi );
|
|
|
|
CString strState;
|
|
switch( pOption->iAction )
|
|
{
|
|
case ACTION_REMOVE:
|
|
strState.LoadString( IDS_REMOVE_STATE );
|
|
break;
|
|
case ACTION_INSTALL:
|
|
strState.LoadString( IDS_INSTALL_STATE );
|
|
break;
|
|
}
|
|
m_OptionsList.SetItemText( iIndex, 1, (LPTSTR)(LPCTSTR)strState );
|
|
|
|
wsprintf( buf, m_strFmt, (INT)(pOption->GetTotalSize() / 1000 ));
|
|
|
|
m_OptionsList.SetItemText( iIndex, 2, buf );
|
|
|
|
m_TotalSize += pOption->iSize ;
|
|
|
|
iIndex++;
|
|
}
|
|
m_OptionsList.Update( 0 );
|
|
|
|
m_pOptionsList->GetNext( pos );
|
|
i++;
|
|
}
|
|
m_OptionsList.SetItemState( 0, 0xffff, LVIS_SELECTED | LVIS_FOCUSED );
|
|
}
|
|
|
|
BOOL COptions::DestroyWindow()
|
|
{
|
|
CImageList *pil = m_OptionsList.GetImageList( LVSIL_SMALL );
|
|
|
|
if ( pil != NULL )
|
|
{
|
|
delete pil;
|
|
}
|
|
|
|
return CDialog::DestroyWindow();
|
|
}
|
|
|
|
void COptions::OnChangeDirectory()
|
|
{
|
|
TCHAR buf[MAX_PATH];
|
|
|
|
if ( BrowseForDirectory( m_hWnd, m_pTargetMachine->strDirectory,
|
|
buf, MAX_PATH, NULL, TRUE ))
|
|
{
|
|
m_pTargetMachine->ChangeDir( buf );
|
|
m_sc_Directory.SetWindowText( buf );
|
|
DisplaySize();
|
|
}
|
|
|
|
#ifdef NEVER
|
|
CTargetDir TargetDir( m_pTargetMachine->strDirectory );
|
|
|
|
if ( TargetDir.DoModal() == IDOK )
|
|
{
|
|
m_pTargetMachine->ChangeDir( TargetDir.m_Location );
|
|
m_sc_Directory.SetWindowText( TargetDir.m_Location );
|
|
DisplaySize();
|
|
}
|
|
#endif
|
|
}
|
|
|
|
//
|
|
// check for whether each options has enough disk space
|
|
//
|
|
BOOL COptions::NotEnoughDiskSpace()
|
|
{
|
|
BOOL fReturn = TRUE;
|
|
DWORD dwTotalSize = 0;
|
|
|
|
do
|
|
{
|
|
POSITION pos = m_pOptionsList->GetHeadPosition();
|
|
// find all the space required
|
|
while ( pos != NULL )
|
|
{
|
|
OPTION_STATE *pOption = (OPTION_STATE *)m_pOptionsList->GetAt( pos );
|
|
if ( pOption && pOption->iAction == ACTION_INSTALL )
|
|
dwTotalSize += pOption->iSize;
|
|
m_pOptionsList->GetNext( pos );
|
|
}
|
|
|
|
CString strLoc;
|
|
DWORD dwSectorsPerCluster;
|
|
DWORD dwBytesPerSector;
|
|
DWORD dwFreeCluster;
|
|
DWORD dwTotalCluster;
|
|
|
|
strLoc.Format( _T("%c:\\"), m_pTargetMachine->strDirectory.GetAt(0));
|
|
GetDiskFreeSpace( strLoc, &dwSectorsPerCluster, &dwBytesPerSector, &dwFreeCluster, &dwTotalCluster );
|
|
|
|
DWORD dwFreeSpace = ((dwSectorsPerCluster * dwBytesPerSector * dwFreeCluster)/1024);
|
|
|
|
if ( dwFreeSpace < (DWORD)(dwTotalSize/1024))
|
|
{
|
|
CString strError;
|
|
|
|
strError.LoadString((theApp.TargetMachine.m_actualProductType==PT_WINNT)?IDS_NOT_ENOUGH_DISK_SPACE_NTW: IDS_NOT_ENOUGH_DISK_SPACE_NTS );
|
|
strError.Format( strError, m_pTargetMachine->strDirectory.GetAt(0));
|
|
|
|
CString strLogo;
|
|
strLogo.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )?IDS_WINNT_LOGO:IDS_LANMAN_LOGO );
|
|
|
|
MessageBox( strError, strLogo );
|
|
return(TRUE);
|
|
}
|
|
fReturn = FALSE;
|
|
} while(FALSE);
|
|
return(fReturn);
|
|
}
|
|
|
|
void COptions::OnOK()
|
|
{
|
|
// decide whether install inetstp option or not
|
|
POSITION pos;
|
|
INETSTP_OPTION *pSetup = NULL;
|
|
BOOL fKeepInetStp = FALSE;
|
|
|
|
pos = m_pOptionsList->GetHeadPosition();
|
|
while ( pos )
|
|
{
|
|
OPTION_STATE *pOption = (OPTION_STATE *)m_pOptionsList->GetAt( pos );
|
|
if ( pOption ) {
|
|
if (pOption->nID == IDS_SN_INETSTP) {
|
|
pSetup = (INETSTP_OPTION *)pOption;
|
|
} else {
|
|
if ( (pOption->iState == STATE_NOT_INSTALLED && pOption->iAction == ACTION_INSTALL) ||
|
|
(pOption->iState ==STATE_INSTALLED && pOption->iAction != ACTION_REMOVE) )
|
|
fKeepInetStp = TRUE;
|
|
}
|
|
}
|
|
m_pOptionsList->GetNext( pos );
|
|
}
|
|
if (fKeepInetStp) {
|
|
if (pSetup->iState == STATE_INSTALLED)
|
|
pSetup->iAction = ACTION_DO_NOTHING;
|
|
else
|
|
pSetup->iAction = ACTION_INSTALL;
|
|
} else {
|
|
if (pSetup->iState == STATE_INSTALLED)
|
|
pSetup->iAction = ACTION_REMOVE;
|
|
else
|
|
pSetup->iAction = ACTION_DO_NOTHING;
|
|
}
|
|
|
|
// make sure we have enough disk space before we continue
|
|
if ( m_fAllowChgMachine )
|
|
{
|
|
if ( NotEnoughDiskSpace())
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
do
|
|
{
|
|
// create the directory
|
|
// if directory does not exist, we need to ask the user for creation
|
|
CHAR szCurrentDir[MAX_PATH+1];
|
|
|
|
if ( GetCurrentDirectory( MAX_PATH+1, szCurrentDir ) == 0 )
|
|
break;
|
|
|
|
TCHAR strDir[4];
|
|
strcpy( strDir,_T("?:\\"));
|
|
strncpy( strDir, m_pTargetMachine->strDirectory, 1 );
|
|
#ifdef NEVER
|
|
UINT nType = GetDriveType( strDir );
|
|
if ( nType != DRIVE_FIXED )
|
|
{
|
|
// must be a fixed drive
|
|
CString strError;
|
|
|
|
strError.LoadString( IDS_MUST_BE_FIXED_DISK );
|
|
|
|
CString strLogo;
|
|
strLogo.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )?IDS_WINNT_LOGO:IDS_LANMAN_LOGO );
|
|
|
|
MessageBox( strError, strLogo );
|
|
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
if ( SetCurrentDirectory( m_pTargetMachine->strDirectory ) == FALSE )
|
|
{
|
|
// assume it does not exist, so popup a dialog and ask the user
|
|
CString strFormat;
|
|
CString strMsg;
|
|
|
|
strFormat.LoadString( IDS_DIR_DOES_NOT_EXIST );
|
|
strMsg.Format( strFormat, m_pTargetMachine->strDirectory );
|
|
|
|
CString strLogo;
|
|
strLogo.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )?IDS_WINNT_LOGO:IDS_LANMAN_LOGO );
|
|
|
|
if ( MessageBox( strMsg, strLogo, MB_YESNO ) == IDNO )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// CreateDirectory
|
|
if ( !CreateLayerDirectory( m_pTargetMachine->strDirectory ))
|
|
{
|
|
strFormat.LoadString( IDS_CANNOT_CREATE_DIR );
|
|
strMsg.Format( strFormat, m_pTargetMachine->strDirectory );
|
|
|
|
CString strLogo;
|
|
strLogo.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )?IDS_WINNT_LOGO:IDS_LANMAN_LOGO );
|
|
|
|
MessageBox( strMsg, strLogo, MB_OK );
|
|
return;
|
|
}
|
|
}
|
|
|
|
SetCurrentDirectory( szCurrentDir );
|
|
|
|
} while (FALSE);
|
|
|
|
// popup the virtual root dialog
|
|
if ( !DisplayVRootDlg())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( m_fSendEndMsg )
|
|
{
|
|
CWnd *pWnd = AfxGetMainWnd();
|
|
pWnd->PostMessage( WM_DO_INSTALL, (LPARAM) FALSE );
|
|
}
|
|
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
void COptions::OnCancel()
|
|
{
|
|
// finish it
|
|
if ( m_fSendEndMsg )
|
|
{
|
|
CWnd *pWnd = AfxGetMainWnd();
|
|
pWnd->PostMessage( WM_SETUP_END, INSTALL_INTERRUPT );
|
|
}
|
|
|
|
CDialog::OnCancel();
|
|
}
|
|
|
|
BOOL COptions::Create()
|
|
{
|
|
return CDialog::Create(COptions::IDD, AfxGetMainWnd());
|
|
}
|
|
|
|
|
|
void COptions::OnKeydownOption(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
|
|
// if the Key is a space bar, then pass to click
|
|
if ( pLVKeyDow->wVKey == VK_SPACE )
|
|
{
|
|
OnClickOption( pNMHDR, pResult );
|
|
} else if (( pLVKeyDow->wVKey == VK_UP ) || ( pLVKeyDow->wVKey == VK_DOWN ))
|
|
{
|
|
m_fKeyDown = TRUE;
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
BOOL COptions::DisplayVRootDlg()
|
|
{
|
|
BOOL fReturn = FALSE;
|
|
|
|
WWW_OPTION *pWWW = (WWW_OPTION*)FindOption( m_pTargetMachine->m_OptionsList, IDS_SN_WWW );
|
|
FTP_OPTION *pFTP = (FTP_OPTION*)FindOption( m_pTargetMachine->m_OptionsList, IDS_SN_FTP );
|
|
GOPHER_OPTION *pGopher = (GOPHER_OPTION*)FindOption( m_pTargetMachine->m_OptionsList, IDS_SN_GOPHER );
|
|
|
|
//ASSERT( pWWW != NULL );
|
|
//ASSERT( pFTP != NULL );
|
|
//ASSERT( pGopher != NULL );
|
|
|
|
if (((pWWW != NULL) && ( pWWW->iAction == ACTION_INSTALL )) ||
|
|
((pFTP != NULL) && (pFTP->iAction == ACTION_INSTALL )) ||
|
|
((pGopher != NULL) && (pGopher->iAction == ACTION_INSTALL )))
|
|
{
|
|
// we need to display the vroot dialog
|
|
CVRootDlg VRootDlg( pWWW, pFTP, pGopher );
|
|
|
|
if ( VRootDlg.DoModal() == IDOK )
|
|
{
|
|
fReturn = TRUE;
|
|
}
|
|
} else
|
|
{
|
|
fReturn = TRUE;
|
|
}
|
|
return(fReturn);
|
|
}
|