mirror of https://github.com/tongzx/nt5src
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.
1436 lines
46 KiB
1436 lines
46 KiB
//----------------------------------------------------------------------------
|
|
//
|
|
// Copyright (c) 1997-1999 Microsoft Corporation
|
|
// All rights reserved.
|
|
//
|
|
// File Name:
|
|
// loadfile.c
|
|
//
|
|
// Description:
|
|
//
|
|
// This file implements ReadSettingsFromAnswerFile(). It is called
|
|
// from load.c only if the user chose to edit an existing answer file.
|
|
//
|
|
// We call GetPrivateProfileString repeatedly to figure out how to
|
|
// initialize GenSettings WizGlobals and NetSettings global vars.
|
|
//
|
|
// WARNING:
|
|
// This function is called after reset.c in the case we're editting
|
|
// an answer file. Be very careful how you call GetPrivateProfileString()
|
|
// because if the setting is not present, you do not want to change
|
|
// the default already set in reset.c. Numerous examples below.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "pch.h"
|
|
#include "allres.h"
|
|
|
|
//
|
|
// Misc constants (declared as vars to save space)
|
|
//
|
|
|
|
static WCHAR *StrConstYes = _T("Yes");
|
|
static WCHAR *StrConstNo = _T("No");
|
|
static WCHAR *StrConstStar = _T("*");
|
|
|
|
extern BOOL GetCommaDelimitedEntry( OUT TCHAR szIPString[],
|
|
IN OUT TCHAR **pBuffer );
|
|
|
|
|
|
// ISSUE-2002/02/28-stelo- make constants for each key and use them both in the save file and in this load file
|
|
const TCHAR c_szFAVORITESEX[] = _T("FavoritesEx");
|
|
|
|
|
|
//
|
|
// Local prototypes
|
|
//
|
|
|
|
static VOID ReadRegionalSettings( VOID );
|
|
|
|
static VOID ReadTapiSettings( VOID );
|
|
|
|
static VOID ReadIeSettings( VOID );
|
|
|
|
static VOID ReadIeFavorites( VOID );
|
|
|
|
static VOID ParseAddressAndPort( LPTSTR pszBufferForProxyAddressAndPort,
|
|
LPTSTR pszAddress,
|
|
DWORD cbAddressLen,
|
|
LPTSTR pszPort,
|
|
DWORD cbPortLen);
|
|
|
|
//
|
|
// Call out to loadnet.c to load the network settings
|
|
//
|
|
|
|
extern VOID ReadNetworkSettings( HWND );
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: ReadSettingsFromAnswerFile
|
|
//
|
|
// Purpose: This function does all of the GetPrivateProfile*() stuff
|
|
// to load up our in-memory settings.
|
|
//
|
|
// Arguments: VOID
|
|
//
|
|
// Returns: VOID
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
BOOL ReadSettingsFromAnswerFile(HWND hwnd)
|
|
{
|
|
|
|
INT temp;
|
|
TCHAR Buffer[MAX_INILINE_LEN];
|
|
|
|
//
|
|
// Get the UnattendMode. In case there is garbage in the answer file,
|
|
// let the answer be UMODE_PROVIDE_DEFAULT.
|
|
//
|
|
|
|
temp = StrBuffSize(Buffer);
|
|
|
|
GetPrivateProfileString(_T("Unattended"),
|
|
_T("UnattendMode"),
|
|
_T(""),
|
|
Buffer,
|
|
temp,
|
|
FixedGlobals.ScriptName);
|
|
|
|
if ( LSTRCMPI(Buffer, _T("GuiAttended")) == 0 )
|
|
GenSettings.iUnattendMode = UMODE_GUI_ATTENDED;
|
|
|
|
else if ( LSTRCMPI(Buffer, _T("DefaultHide")) == 0 )
|
|
GenSettings.iUnattendMode = UMODE_DEFAULT_HIDE;
|
|
|
|
else if ( LSTRCMPI(Buffer, _T("Readonly")) == 0 )
|
|
GenSettings.iUnattendMode = UMODE_READONLY;
|
|
|
|
else if ( LSTRCMPI(Buffer, _T("FullUnattended")) == 0 )
|
|
GenSettings.iUnattendMode = UMODE_FULL_UNATTENDED;
|
|
|
|
else
|
|
GenSettings.iUnattendMode = UMODE_PROVIDE_DEFAULT;
|
|
|
|
//
|
|
// Get the HAL
|
|
//
|
|
GetPrivateProfileString(_T("Unattended"),
|
|
_T("ComputerType"),
|
|
_T(""),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName);
|
|
|
|
//
|
|
// Have to read in HAL and SCSI drivers a little
|
|
// differently because of the quotes on the left for the SCSI drivers
|
|
// and the different formatting with the HAL
|
|
//
|
|
{
|
|
|
|
HINF hUnattendTxt;
|
|
INFCONTEXT UnattendTxtContext;
|
|
BOOL bKeepReading = TRUE;
|
|
BOOL bHalFound = FALSE;
|
|
TCHAR szTempBuffer[MAX_INILINE_LEN];
|
|
|
|
hUnattendTxt = SetupOpenInfFile( FixedGlobals.ScriptName,
|
|
NULL,
|
|
INF_STYLE_OLDNT | INF_STYLE_WIN4,
|
|
NULL );
|
|
|
|
if( hUnattendTxt == INVALID_HANDLE_VALUE ) {
|
|
|
|
// ISSUE-2002/02/28-stelo - alert an error that we couldn't open the file or just
|
|
// skip over in this case?
|
|
//return;
|
|
|
|
}
|
|
|
|
UnattendTxtContext.Inf = hUnattendTxt;
|
|
UnattendTxtContext.CurrentInf = hUnattendTxt;
|
|
|
|
|
|
|
|
bKeepReading = SetupFindFirstLine( hUnattendTxt,
|
|
_T("Unattended"),
|
|
NULL,
|
|
&UnattendTxtContext );
|
|
|
|
//
|
|
// Look for the ComputerType key to set which HAL to use
|
|
//
|
|
while( bKeepReading && ! bHalFound ) {
|
|
|
|
SetupGetStringField( &UnattendTxtContext,
|
|
0,
|
|
szTempBuffer,
|
|
MAX_INILINE_LEN,
|
|
NULL );
|
|
|
|
if( LSTRCMPI( szTempBuffer, _T("ComputerType") ) == 0 ) {
|
|
|
|
SetupGetStringField( &UnattendTxtContext,
|
|
1,
|
|
GenSettings.szHalFriendlyName,
|
|
MAX_INILINE_LEN,
|
|
NULL );
|
|
|
|
bHalFound = TRUE;
|
|
|
|
}
|
|
|
|
//
|
|
// move to the next line of the answer file
|
|
//
|
|
bKeepReading = SetupFindNextLine( &UnattendTxtContext, &UnattendTxtContext );
|
|
|
|
}
|
|
|
|
//
|
|
// Read in the SCSI drivers
|
|
//
|
|
bKeepReading = SetupFindFirstLine( hUnattendTxt,
|
|
_T("MassStorageDrivers"),
|
|
NULL,
|
|
&UnattendTxtContext );
|
|
//
|
|
// For each MassStorageDriver entry, add it to the MassStorageDriver
|
|
// namelist
|
|
//
|
|
|
|
while( bKeepReading ) {
|
|
|
|
TCHAR szScsiFriendlyName[MAX_INILINE_LEN];
|
|
|
|
SetupGetStringField( &UnattendTxtContext,
|
|
0,
|
|
szScsiFriendlyName,
|
|
MAX_INILINE_LEN,
|
|
NULL );
|
|
|
|
//
|
|
// Don't allow the adding of a blank name (protection against a bad input file)
|
|
//
|
|
if( szScsiFriendlyName[0] != _T('\0') ) {
|
|
|
|
AddNameToNameList( &GenSettings.MassStorageDrivers,
|
|
szScsiFriendlyName );
|
|
|
|
}
|
|
|
|
//
|
|
// move to the next line of the answer file
|
|
//
|
|
bKeepReading = SetupFindNextLine( &UnattendTxtContext, &UnattendTxtContext );
|
|
|
|
}
|
|
|
|
SetupCloseInfFile( hUnattendTxt );
|
|
|
|
}
|
|
|
|
//
|
|
// Not reading from the [OEMBootFiles] section because this gets
|
|
// generated from whatever SCSI and HAL selections they make so
|
|
// it is not necessary to read it in.
|
|
//
|
|
|
|
//
|
|
// Get OEM Ads data
|
|
//
|
|
|
|
GetPrivateProfileString(_T("OEM_Ads"),
|
|
_T("Logo"),
|
|
GenSettings.lpszLogoBitmap,
|
|
GenSettings.lpszLogoBitmap,
|
|
StrBuffSize(GenSettings.lpszLogoBitmap),
|
|
FixedGlobals.ScriptName);
|
|
|
|
GetPrivateProfileString(_T("OEM_Ads"),
|
|
_T("Background"),
|
|
GenSettings.lpszBackgroundBitmap,
|
|
GenSettings.lpszBackgroundBitmap,
|
|
StrBuffSize(GenSettings.lpszBackgroundBitmap),
|
|
FixedGlobals.ScriptName);
|
|
|
|
//
|
|
// Get the product ID
|
|
//
|
|
|
|
{
|
|
TCHAR *pStart = Buffer, *pEnd;
|
|
BOOL bStop = FALSE;
|
|
int CurField = 0;
|
|
|
|
GetPrivateProfileString(_T("UserData"),
|
|
_T("ProductKey"),
|
|
NULLSTR,
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName);
|
|
|
|
// We did not have a ProductKey, check for the old ProductID
|
|
//
|
|
if ( Buffer[0] == NULLCHR )
|
|
{
|
|
GetPrivateProfileString(_T("UserData"),
|
|
_T("ProductID"),
|
|
_T("-"),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName);
|
|
}
|
|
|
|
//
|
|
// Have to parse out the pid1-pid2-pid3-pid4-pid5.
|
|
//
|
|
|
|
do {
|
|
|
|
if ( (pEnd = wcschr(pStart, _T('-'))) == NULL )
|
|
bStop = TRUE;
|
|
else
|
|
*pEnd++ = _T('\0');
|
|
|
|
lstrcpyn(GenSettings.ProductId[CurField++],
|
|
pStart,
|
|
MAX_PID_FIELD + 1);
|
|
|
|
pStart = pEnd;
|
|
|
|
} while ( ! bStop && CurField < NUM_PID_FIELDS );
|
|
}
|
|
|
|
|
|
//
|
|
// Get the license mode for server. If we find this section, we
|
|
// force on iProductInstall to be Server.
|
|
//
|
|
|
|
GetPrivateProfileString(_T("LicenseFilePrintData"),
|
|
_T("AutoMode"),
|
|
_T(""),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName);
|
|
|
|
if ( Buffer[0] != _T('\0') ) {
|
|
|
|
|
|
WizGlobals.iProductInstall = PRODUCT_UNATTENDED_INSTALL;
|
|
|
|
WizGlobals.iPlatform = PLATFORM_SERVER;
|
|
|
|
if ( LSTRCMPI(Buffer, _T("PerSeat")) == 0 ) {
|
|
GenSettings.bPerSeat = TRUE;
|
|
} else {
|
|
GenSettings.bPerSeat = FALSE;
|
|
GenSettings.NumConnections =
|
|
GetPrivateProfileInt(_T("LicenseFilePrintData"),
|
|
_T("AutoUsers"),
|
|
GenSettings.NumConnections,
|
|
FixedGlobals.ScriptName);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Get name&org
|
|
//
|
|
|
|
GetPrivateProfileString(_T("UserData"),
|
|
_T("FullName"),
|
|
GenSettings.UserName,
|
|
GenSettings.UserName,
|
|
StrBuffSize(GenSettings.UserName),
|
|
FixedGlobals.ScriptName);
|
|
|
|
GetPrivateProfileString(_T("UserData"),
|
|
_T("OrgName"),
|
|
GenSettings.Organization,
|
|
GenSettings.Organization,
|
|
StrBuffSize(GenSettings.Organization),
|
|
FixedGlobals.ScriptName);
|
|
|
|
|
|
//
|
|
// Get the computer names. It can be:
|
|
// 1. ComputerName=*
|
|
// 2. ComputerName=some_name
|
|
// 3. not specified at all
|
|
// 4. multiple computer names
|
|
//
|
|
// In case #4, we wrote out a .UDF, but we won't read the .UDF. Instead,
|
|
// we get the list from here:
|
|
//
|
|
// [SetupMgr]
|
|
// ComputerName0=some_name
|
|
// ComputerName1=another_name
|
|
//
|
|
|
|
{
|
|
ResetNameList(&GenSettings.ComputerNames);
|
|
|
|
GetPrivateProfileString(_T("UserData"),
|
|
_T("ComputerName"),
|
|
_T(""),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName);
|
|
|
|
if( Buffer[0] != _T('\0') )
|
|
{
|
|
|
|
if( lstrcmpi(Buffer, StrConstStar) == 0 )
|
|
{
|
|
|
|
//
|
|
// if ComputerName=*, it is either the auto generate case
|
|
// or the UDF case
|
|
//
|
|
|
|
GetPrivateProfileString(_T("SetupMgr"),
|
|
_T("ComputerName0"),
|
|
_T(""),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName);
|
|
|
|
if( Buffer[0] == _T('\0') )
|
|
{
|
|
GenSettings.bAutoComputerName = TRUE;
|
|
}
|
|
else
|
|
{
|
|
int i;
|
|
TCHAR Buffer2[MAX_INILINE_LEN];
|
|
HRESULT hrPrintf;
|
|
|
|
GenSettings.bAutoComputerName = FALSE;
|
|
|
|
for( i = 0; TRUE; i++ )
|
|
{
|
|
hrPrintf=StringCchPrintf(Buffer2, AS(Buffer2),_T("ComputerName%d"), i);
|
|
|
|
GetPrivateProfileString(_T("SetupMgr"),
|
|
Buffer2,
|
|
_T(""),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName);
|
|
|
|
if ( Buffer[0] == _T('\0') )
|
|
break;
|
|
|
|
AddNameToNameList(&GenSettings.ComputerNames, Buffer);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
GenSettings.bAutoComputerName = FALSE;
|
|
AddNameToNameList(&GenSettings.ComputerNames, Buffer);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Get the IE settings
|
|
//
|
|
|
|
ReadIeSettings();
|
|
|
|
//
|
|
// Get the targetpath
|
|
//
|
|
|
|
GetPrivateProfileString(_T("Unattended"),
|
|
_T("TargetPath"),
|
|
_T(""),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName);
|
|
|
|
if ( lstrcmpi(Buffer, StrConstStar) == 0 ) {
|
|
GenSettings.iTargetPath = TARGPATH_AUTO;
|
|
GenSettings.TargetPath[0] = _T('\0');
|
|
}
|
|
|
|
else if ( lstrcmpi(Buffer, _T("")) == 0 ) {
|
|
GenSettings.iTargetPath = TARGPATH_WINNT;
|
|
GenSettings.TargetPath[0] = _T('\0');
|
|
}
|
|
|
|
else {
|
|
GenSettings.iTargetPath = TARGPATH_SPECIFY;
|
|
lstrcpyn(GenSettings.TargetPath, Buffer, MAX_TARGPATH + 1);
|
|
}
|
|
|
|
//
|
|
// Get the administrator password.
|
|
//
|
|
// AdminPassword == * means bSpecifyPassword to blank
|
|
// AdminPassword[0] == '\0' means !bSpecifyPassword
|
|
//
|
|
// Always set ConfirmPassword == AdminPassword on an edit so that
|
|
// the user can breeze past this page.
|
|
//
|
|
|
|
// Check to see if the password is encrypted
|
|
GetPrivateProfileString(_T("GuiUnattended"),
|
|
_T("EncryptedAdminPassword"),
|
|
_T(""),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName);
|
|
if (lstrcmpi(Buffer, StrConstYes) == 0)
|
|
{
|
|
// If it is encrypted, don't bother reading it, just blank it out
|
|
GenSettings.AdminPassword[0] = _T('\0');
|
|
GenSettings.bSpecifyPassword = TRUE;
|
|
}
|
|
|
|
else
|
|
{
|
|
GetPrivateProfileString(_T("GuiUnattended"),
|
|
_T("AdminPassword"),
|
|
GenSettings.AdminPassword,
|
|
GenSettings.AdminPassword,
|
|
StrBuffSize(GenSettings.AdminPassword),
|
|
FixedGlobals.ScriptName);
|
|
|
|
if ( GenSettings.AdminPassword[0] == _T('\0') )
|
|
GenSettings.bSpecifyPassword = FALSE;
|
|
else
|
|
GenSettings.bSpecifyPassword = TRUE;
|
|
|
|
if ( lstrcmpi(GenSettings.AdminPassword, StrConstStar) == 0 )
|
|
GenSettings.AdminPassword[0] = _T('\0');
|
|
}
|
|
lstrcpyn(GenSettings.ConfirmPassword, GenSettings.AdminPassword, AS(GenSettings.ConfirmPassword));
|
|
|
|
GetPrivateProfileString(_T("GuiUnattended"),
|
|
_T("AutoLogon"),
|
|
_T(""),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName);
|
|
|
|
if ( lstrcmpi(Buffer, StrConstYes) == 0 )
|
|
GenSettings.bAutoLogon = TRUE;
|
|
else
|
|
GenSettings.bAutoLogon = FALSE;
|
|
|
|
GenSettings.nAutoLogonCount = GetPrivateProfileInt(_T("GuiUnattended"),
|
|
_T("AutoLogonCount"),
|
|
GenSettings.nAutoLogonCount,
|
|
FixedGlobals.ScriptName);
|
|
|
|
GetPrivateProfileString(_T("GuiUnattended"),
|
|
_T("OEMDuplicatorstring"),
|
|
GenSettings.szOemDuplicatorString,
|
|
GenSettings.szOemDuplicatorString,
|
|
StrBuffSize(GenSettings.szOemDuplicatorString),
|
|
FixedGlobals.ScriptName);
|
|
|
|
//
|
|
// Get the display settings.
|
|
//
|
|
|
|
GenSettings.DisplayColorBits = GetPrivateProfileInt(
|
|
_T("Display"),
|
|
_T("BitsPerPel"),
|
|
GenSettings.DisplayColorBits,
|
|
FixedGlobals.ScriptName);
|
|
|
|
GenSettings.DisplayXResolution = GetPrivateProfileInt(
|
|
_T("Display"),
|
|
_T("XResolution"),
|
|
GenSettings.DisplayXResolution,
|
|
FixedGlobals.ScriptName);
|
|
|
|
GenSettings.DisplayYResolution = GetPrivateProfileInt(
|
|
_T("Display"),
|
|
_T("YResolution"),
|
|
GenSettings.DisplayYResolution,
|
|
FixedGlobals.ScriptName);
|
|
|
|
GenSettings.DisplayRefreshRate = GetPrivateProfileInt(
|
|
_T("Display"),
|
|
_T("Vrefresh"),
|
|
GenSettings.DisplayRefreshRate,
|
|
FixedGlobals.ScriptName);
|
|
|
|
//
|
|
// Get the runonce commands. They are listed like this:
|
|
//
|
|
// [GuiRunOnce]
|
|
// Command0=some_cmd
|
|
// Command0=another_cmd
|
|
//
|
|
// ISSUE-2002/02/28-stelo -Need to investigate this biz about running these commands
|
|
// in sequence or in parrallel.
|
|
//
|
|
|
|
{
|
|
int i;
|
|
TCHAR Buffer2[MAX_INILINE_LEN];
|
|
HRESULT hrPrintf;
|
|
|
|
ResetNameList(&GenSettings.RunOnceCmds);
|
|
|
|
for ( i=0; TRUE; i++ ) {
|
|
|
|
hrPrintf=StringCchPrintf(Buffer2, AS(Buffer2),_T("Command%d"), i);
|
|
|
|
GetPrivateProfileString(_T("GuiRunOnce"),
|
|
Buffer2,
|
|
_T(""),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName);
|
|
|
|
if ( Buffer[0] == _T('\0') )
|
|
break;
|
|
|
|
AddNameToNameList(&GenSettings.RunOnceCmds, Buffer);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Loop through the commands and parse out any add printer commands
|
|
//
|
|
|
|
//
|
|
// NOTE: This code works if the user never edits the commands.
|
|
// However, the user might want to modify it and put
|
|
// different switches on it on the RunOnce page. The
|
|
// parsing below could be more robust.
|
|
//
|
|
// If /n means 'name', then it should parse for /n then
|
|
// the next arg is the printer name no matter what switches
|
|
// the user added or re-ordered.
|
|
//
|
|
|
|
{
|
|
int i, NumCmds;
|
|
TCHAR *pName;
|
|
TCHAR PrinterName[MAX_PRINTERNAME + 1];
|
|
|
|
NumCmds = GetNameListSize(&GenSettings.RunOnceCmds);
|
|
|
|
for ( i=0; i<NumCmds; i++ )
|
|
{
|
|
pName = GetNameListName(&GenSettings.RunOnceCmds, i);
|
|
|
|
PrinterName[0] = _T('\0');
|
|
if ( ( swscanf(pName,
|
|
_T("rundll32 printui.dll,PrintUIEntry /in /n %s"),
|
|
PrinterName) > 0 ) &&
|
|
( PrinterName[0] ) )
|
|
{
|
|
AddNameToNameList(&GenSettings.PrinterNames, PrinterName);
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Get the timezone
|
|
//
|
|
|
|
GetPrivateProfileString( _T("GuiUnattended"),
|
|
_T("TimeZone"),
|
|
_T(""),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName );
|
|
|
|
if ( LSTRCMPI(Buffer, _T("%TIMEZONE%")) == 0 )
|
|
{
|
|
GenSettings.TimeZoneIdx = TZ_IDX_SETSAMEASSERVER;
|
|
}
|
|
else if ( ( Buffer[0] == _T('\0') ) ||
|
|
( swscanf(Buffer, _T("%d"), &GenSettings.TimeZoneIdx) <= 0 ) )
|
|
{
|
|
GenSettings.TimeZoneIdx = TZ_IDX_DONOTSPECIFY;
|
|
}
|
|
|
|
//
|
|
// Init the settings for the 2 Distribution Folder pages. OemPreInstall
|
|
// indicates whether the script is stand-alone or not. The others are
|
|
// saved in the [SetupMgr] section.
|
|
//
|
|
|
|
GetPrivateProfileString(_T("Unattended"),
|
|
_T("OemPreInstall"),
|
|
_T(""),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName );
|
|
|
|
if ( lstrcmpi(Buffer, StrConstYes) == 0 )
|
|
WizGlobals.bStandAloneScript = FALSE;
|
|
else
|
|
WizGlobals.bStandAloneScript = TRUE;
|
|
|
|
GetPrivateProfileString(_T("SetupMgr"),
|
|
_T("DistFolder"),
|
|
WizGlobals.DistFolder,
|
|
WizGlobals.DistFolder,
|
|
StrBuffSize(WizGlobals.DistFolder),
|
|
FixedGlobals.ScriptName);
|
|
|
|
GetPrivateProfileString(_T("SetupMgr"),
|
|
_T("DistShare"),
|
|
WizGlobals.DistShareName,
|
|
WizGlobals.DistShareName,
|
|
StrBuffSize(WizGlobals.DistShareName),
|
|
FixedGlobals.ScriptName);
|
|
|
|
WizGlobals.bCreateNewDistFolder = FALSE;
|
|
|
|
//
|
|
// Get tapi & regional settings
|
|
//
|
|
|
|
ReadTapiSettings();
|
|
ReadRegionalSettings();
|
|
|
|
//
|
|
// Purposely grabbing the JoinWorkgroup key twice. Once to determine if
|
|
// there a value for the key and once to set the value for the global
|
|
// NetSettings.WorkGroupName string.
|
|
//
|
|
|
|
GetPrivateProfileString(_T("Identification"),
|
|
_T("JoinWorkgroup"),
|
|
_T(""),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName);
|
|
|
|
GetPrivateProfileString(_T("Identification"),
|
|
_T("JoinWorkgroup"),
|
|
NetSettings.WorkGroupName,
|
|
NetSettings.WorkGroupName,
|
|
StrBuffSize(NetSettings.WorkGroupName),
|
|
FixedGlobals.ScriptName);
|
|
|
|
GetPrivateProfileString(_T("Identification"),
|
|
_T("JoinDomain"),
|
|
NetSettings.DomainName,
|
|
NetSettings.DomainName,
|
|
StrBuffSize(NetSettings.DomainName),
|
|
FixedGlobals.ScriptName);
|
|
|
|
//
|
|
// If they didn't specify a workgroup in the answerfile and they did
|
|
// specify a domain, chose to Join a Domain (i.e. not join a workgroup)
|
|
//
|
|
|
|
if( Buffer[0] == _T('\0') &&
|
|
NetSettings.DomainName[0] != _T('\0') )
|
|
{
|
|
NetSettings.bWorkgroup = FALSE;
|
|
}
|
|
|
|
if( lstrcmp( NetSettings.DomainName, _T("%MACHINEDOMAIN%") ) == 0 )
|
|
{
|
|
WizGlobals.iProductInstall = PRODUCT_REMOTEINSTALL;
|
|
}
|
|
|
|
GetPrivateProfileString(_T("Identification"),
|
|
_T("DomainAdmin"),
|
|
NetSettings.DomainAccount,
|
|
NetSettings.DomainAccount,
|
|
StrBuffSize(NetSettings.DomainAccount),
|
|
FixedGlobals.ScriptName);
|
|
|
|
GetPrivateProfileString(_T("Identification"),
|
|
_T("DomainAdminPassword"),
|
|
NetSettings.DomainPassword,
|
|
NetSettings.DomainPassword,
|
|
StrBuffSize(NetSettings.DomainPassword),
|
|
FixedGlobals.ScriptName);
|
|
|
|
if( NetSettings.DomainAccount[0] == _T('\0') )
|
|
{
|
|
NetSettings.bCreateAccount = FALSE;
|
|
}
|
|
else
|
|
{
|
|
NetSettings.bCreateAccount = TRUE;
|
|
}
|
|
|
|
//
|
|
// Make the domain password and the confirm the same so user can
|
|
// breeze past the page if they want to
|
|
//
|
|
lstrcpyn( NetSettings.ConfirmPassword, NetSettings.DomainPassword ,AS(NetSettings.ConfirmPassword));
|
|
|
|
//
|
|
// Read in the Network settings
|
|
//
|
|
ReadNetworkSettings( hwnd );
|
|
|
|
return( TRUE );
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: ReadTapiSettings
|
|
//
|
|
// Purpose: Read the tapi settings keys from the answerfile.
|
|
//
|
|
// Arguments: VOID
|
|
//
|
|
// Returns: VOID
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static VOID
|
|
ReadTapiSettings( VOID ) {
|
|
|
|
TCHAR Buffer[MAX_INILINE_LEN] = _T("");
|
|
|
|
//
|
|
// Note: if it doesn't find the CountryCode key then it defaults to
|
|
// "Don't specify setting"
|
|
//
|
|
GenSettings.dwCountryCode = GetPrivateProfileInt(_T("TapiLocation"),
|
|
_T("CountryCode"),
|
|
DONTSPECIFYSETTING,
|
|
FixedGlobals.ScriptName);
|
|
|
|
GetPrivateProfileString(_T("TapiLocation"),
|
|
_T("Dialing"),
|
|
_T(""),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName);
|
|
|
|
if ( LSTRCMPI(Buffer, _T("Tone")) == 0 )
|
|
GenSettings.iDialingMethod = TONE;
|
|
else if ( LSTRCMPI(Buffer, _T("Pulse")) == 0 )
|
|
GenSettings.iDialingMethod = PULSE;
|
|
else
|
|
GenSettings.iDialingMethod = DONTSPECIFYSETTING;
|
|
|
|
GetPrivateProfileString(_T("TapiLocation"),
|
|
_T("AreaCode"),
|
|
GenSettings.szAreaCode,
|
|
GenSettings.szAreaCode,
|
|
StrBuffSize(GenSettings.szAreaCode),
|
|
FixedGlobals.ScriptName);
|
|
|
|
GetPrivateProfileString(_T("TapiLocation"),
|
|
_T("LongDistanceAccess"),
|
|
GenSettings.szOutsideLine,
|
|
GenSettings.szOutsideLine,
|
|
StrBuffSize(GenSettings.szOutsideLine),
|
|
FixedGlobals.ScriptName);
|
|
|
|
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: ReadRegionalSettings
|
|
//
|
|
// Purpose: Read the regional settings keys from the answerfile.
|
|
//
|
|
// Arguments: VOID
|
|
//
|
|
// Returns: VOID
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static VOID
|
|
ReadRegionalSettings( VOID ) {
|
|
|
|
TCHAR Buffer[MAX_INILINE_LEN] = _T("");
|
|
TCHAR OemSkipBuffer[MAX_INILINE_LEN] = _T("");
|
|
TCHAR szLanguageGroup[MAX_INILINE_LEN] = _T("");
|
|
|
|
TCHAR *pLanguageGroup = NULL;
|
|
|
|
DWORD dwOemSkipSize = 0;
|
|
DWORD dwLanguageSize = 0;
|
|
DWORD dwSystemSize = 0;
|
|
DWORD dwNumberSize = 0;
|
|
DWORD dwKeyboardSize = 0;
|
|
|
|
dwOemSkipSize = GetPrivateProfileString(_T("RegionalSettings"),
|
|
_T("OEMSkipRegionalSettings"),
|
|
_T(""),
|
|
OemSkipBuffer,
|
|
StrBuffSize(OemSkipBuffer),
|
|
FixedGlobals.ScriptName);
|
|
|
|
GetPrivateProfileString(_T("RegionalSettings"),
|
|
_T("LanguageGroup"),
|
|
_T(""),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName);
|
|
|
|
//
|
|
// Loop grabbing the Language Groups and inserting them into
|
|
// the NameList
|
|
//
|
|
pLanguageGroup = Buffer;
|
|
while( GetCommaDelimitedEntry( szLanguageGroup, &pLanguageGroup ) ) {
|
|
|
|
AddNameToNameList( &GenSettings.LanguageGroups,
|
|
szLanguageGroup );
|
|
|
|
}
|
|
|
|
dwLanguageSize = GetPrivateProfileString(_T("RegionalSettings"),
|
|
_T("Language"),
|
|
_T(""),
|
|
GenSettings.szLanguage,
|
|
StrBuffSize(GenSettings.szLanguage),
|
|
FixedGlobals.ScriptName);
|
|
|
|
dwSystemSize = GetPrivateProfileString(_T("RegionalSettings"),
|
|
_T("SystemLocale"),
|
|
_T(""),
|
|
GenSettings.szMenuLanguage,
|
|
StrBuffSize(GenSettings.szMenuLanguage),
|
|
FixedGlobals.ScriptName);
|
|
|
|
dwNumberSize = GetPrivateProfileString(_T("RegionalSettings"),
|
|
_T("UserLocale"),
|
|
_T(""),
|
|
GenSettings.szNumberLanguage,
|
|
StrBuffSize(GenSettings.szNumberLanguage),
|
|
FixedGlobals.ScriptName);
|
|
|
|
dwKeyboardSize = GetPrivateProfileString(_T("RegionalSettings"),
|
|
_T("InputLocale"),
|
|
_T(""),
|
|
GenSettings.szKeyboardLayout,
|
|
StrBuffSize(GenSettings.szKeyboardLayout),
|
|
FixedGlobals.ScriptName);
|
|
|
|
//
|
|
// If the OEMSkipRegionalSettings was specified in the answerfile, set
|
|
// its value and return. Else set the language locales appropriately.
|
|
//
|
|
if( dwOemSkipSize > 0 ) {
|
|
|
|
if( lstrcmp( OemSkipBuffer, _T("0") ) == 0 ) {
|
|
|
|
GenSettings.iRegionalSettings = REGIONAL_SETTINGS_SKIP;
|
|
|
|
}
|
|
else if( lstrcmp( OemSkipBuffer, _T("1") ) == 0 ) {
|
|
|
|
GenSettings.iRegionalSettings = REGIONAL_SETTINGS_DEFAULT;
|
|
|
|
}
|
|
else {
|
|
|
|
// if it was set to some strange settings, just set it to use default
|
|
GenSettings.iRegionalSettings = REGIONAL_SETTINGS_DEFAULT;
|
|
|
|
}
|
|
|
|
}
|
|
else {
|
|
|
|
if( dwLanguageSize != 0 ) {
|
|
|
|
GenSettings.iRegionalSettings = REGIONAL_SETTINGS_SPECIFY;
|
|
|
|
}
|
|
else if( dwSystemSize != 0 || dwNumberSize != 0 || dwKeyboardSize != 0 ) {
|
|
|
|
GenSettings.iRegionalSettings = REGIONAL_SETTINGS_SPECIFY;
|
|
|
|
GenSettings.bUseCustomLocales = TRUE;
|
|
|
|
}
|
|
else {
|
|
|
|
//
|
|
// If no keys were specified, set it to not specified
|
|
//
|
|
GenSettings.iRegionalSettings = REGIONAL_SETTINGS_NOT_SPECIFIED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: ReadIeSettings
|
|
//
|
|
// Purpose: Read the IE settings keys from the answerfile and store them in
|
|
// the global structs.
|
|
//
|
|
// Arguments: VOID
|
|
//
|
|
// Returns: VOID
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static VOID
|
|
ReadIeSettings( VOID )
|
|
{
|
|
|
|
TCHAR szBufferForProxyAddressAndPort[2048 + 1];
|
|
TCHAR szAddress[MAX_PROXY_LEN];
|
|
TCHAR szPort[MAX_PROXY_PORT_LEN];
|
|
TCHAR Buffer[MAX_INILINE_LEN];
|
|
TCHAR *pLocalString;
|
|
|
|
GetPrivateProfileString(_T("Branding"),
|
|
_T("IEBrandingFile"),
|
|
GenSettings.szInsFile,
|
|
GenSettings.szInsFile,
|
|
StrBuffSize(GenSettings.szInsFile),
|
|
FixedGlobals.ScriptName);
|
|
|
|
if( GenSettings.szInsFile[0] != _T('\0') )
|
|
{
|
|
GenSettings.IeCustomizeMethod = IE_USE_BRANDING_FILE;
|
|
}
|
|
else
|
|
{
|
|
GenSettings.IeCustomizeMethod = IE_SPECIFY_SETTINGS;
|
|
}
|
|
|
|
GetPrivateProfileString(_T("URL"),
|
|
_T("AutoConfig"),
|
|
_T("1"),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName);
|
|
|
|
if( lstrcmpi( Buffer, _T("1") ) == 0 )
|
|
{
|
|
GenSettings.bUseAutoConfigScript = TRUE;
|
|
}
|
|
else
|
|
{
|
|
GenSettings.bUseAutoConfigScript = FALSE;
|
|
}
|
|
|
|
GetPrivateProfileString(_T("URL"),
|
|
_T("AutoConfigURL"),
|
|
GenSettings.szAutoConfigUrl,
|
|
GenSettings.szAutoConfigUrl,
|
|
StrBuffSize(GenSettings.szAutoConfigUrl),
|
|
FixedGlobals.ScriptName);
|
|
|
|
GetPrivateProfileString(_T("URL"),
|
|
_T("AutoConfigJSURL"),
|
|
GenSettings.szAutoConfigUrlJscriptOrPac,
|
|
GenSettings.szAutoConfigUrlJscriptOrPac,
|
|
StrBuffSize(GenSettings.szAutoConfigUrlJscriptOrPac),
|
|
FixedGlobals.ScriptName);
|
|
|
|
if( GenSettings.szAutoConfigUrl[0] != _T('\0') ||
|
|
GenSettings.szAutoConfigUrlJscriptOrPac[0] != _T('\0') )
|
|
{
|
|
GenSettings.bUseAutoConfigScript = TRUE;
|
|
}
|
|
else
|
|
{
|
|
GenSettings.bUseAutoConfigScript = FALSE;
|
|
}
|
|
|
|
GetPrivateProfileString(_T("Proxy"),
|
|
_T("Use_Same_Proxy"),
|
|
_T("0"),
|
|
Buffer,
|
|
StrBuffSize(Buffer),
|
|
FixedGlobals.ScriptName);
|
|
|
|
if( lstrcmpi( Buffer, _T("1") ) == 0 )
|
|
{
|
|
GenSettings.bUseSameProxyForAllProtocols = TRUE;
|
|
}
|
|
else
|
|
{
|
|
GenSettings.bUseSameProxyForAllProtocols = FALSE;
|
|
}
|
|
|
|
//
|
|
// Get the HTTP Proxy server
|
|
//
|
|
|
|
GetPrivateProfileString(_T("Proxy"),
|
|
_T("HTTP_Proxy_Server"),
|
|
_T(""),
|
|
szBufferForProxyAddressAndPort,
|
|
StrBuffSize(szBufferForProxyAddressAndPort),
|
|
FixedGlobals.ScriptName);
|
|
|
|
ParseAddressAndPort( szBufferForProxyAddressAndPort, szAddress, AS(szAddress), szPort, AS(szPort));
|
|
|
|
lstrcpyn( GenSettings.szHttpProxyAddress, szAddress, AS(GenSettings.szHttpProxyAddress) );
|
|
lstrcpyn( GenSettings.szHttpProxyPort, szPort, AS(GenSettings.szHttpProxyPort) );
|
|
|
|
if( GenSettings.szHttpProxyAddress[0] != _T('\0') )
|
|
{
|
|
GenSettings.bUseProxyServer = TRUE;
|
|
}
|
|
else
|
|
{
|
|
GenSettings.bUseProxyServer = FALSE;
|
|
}
|
|
|
|
//
|
|
// Get the Secure Proxy server
|
|
//
|
|
|
|
GetPrivateProfileString(_T("Proxy"),
|
|
_T("Secure_Proxy_Server"),
|
|
_T(""),
|
|
szBufferForProxyAddressAndPort,
|
|
StrBuffSize(szBufferForProxyAddressAndPort),
|
|
FixedGlobals.ScriptName);
|
|
|
|
ParseAddressAndPort( szBufferForProxyAddressAndPort, szAddress, AS(szAddress), szPort, AS(szAddress) );
|
|
|
|
lstrcpyn( GenSettings.szSecureProxyAddress, szAddress, AS(GenSettings.szSecureProxyAddress) );
|
|
lstrcpyn( GenSettings.szSecureProxyPort, szPort, AS(GenSettings.szSecureProxyPort) );
|
|
|
|
//
|
|
// Get the FTP Proxy server
|
|
//
|
|
|
|
GetPrivateProfileString(_T("Proxy"),
|
|
_T("FTP_Proxy_Server"),
|
|
_T(""),
|
|
szBufferForProxyAddressAndPort,
|
|
StrBuffSize(szBufferForProxyAddressAndPort),
|
|
FixedGlobals.ScriptName);
|
|
|
|
ParseAddressAndPort( szBufferForProxyAddressAndPort, szAddress, AS(szAddress), szPort, AS(szPort) );
|
|
|
|
lstrcpyn( GenSettings.szFtpProxyAddress, szAddress, AS(GenSettings.szFtpProxyAddress) );
|
|
lstrcpyn( GenSettings.szFtpProxyPort, szPort, AS(GenSettings.szFtpProxyPort) );
|
|
|
|
//
|
|
// Get the Gopher Proxy server
|
|
//
|
|
|
|
GetPrivateProfileString(_T("Proxy"),
|
|
_T("Gopher_Proxy_Server"),
|
|
_T(""),
|
|
szBufferForProxyAddressAndPort,
|
|
StrBuffSize(szBufferForProxyAddressAndPort),
|
|
FixedGlobals.ScriptName);
|
|
|
|
ParseAddressAndPort( szBufferForProxyAddressAndPort, szAddress, AS(szAddress), szPort, AS(szPort) );
|
|
|
|
lstrcpyn( GenSettings.szGopherProxyAddress, szAddress, AS(GenSettings.szGopherProxyAddress) );
|
|
lstrcpyn( GenSettings.szGopherProxyPort, szPort, AS(GenSettings.szGopherProxyPort) );
|
|
|
|
//
|
|
// Get the Socks Proxy server
|
|
//
|
|
|
|
GetPrivateProfileString(_T("Proxy"),
|
|
_T("Socks_Proxy_Server"),
|
|
_T(""),
|
|
szBufferForProxyAddressAndPort,
|
|
StrBuffSize(szBufferForProxyAddressAndPort),
|
|
FixedGlobals.ScriptName);
|
|
|
|
ParseAddressAndPort( szBufferForProxyAddressAndPort, szAddress, AS(szAddress), szPort, AS(szPort) );
|
|
|
|
lstrcpyn( GenSettings.szSocksProxyAddress, szAddress, AS(GenSettings.szSocksProxyAddress) );
|
|
lstrcpyn( GenSettings.szSocksProxyPort, szPort, AS(GenSettings.szSocksProxyPort) );
|
|
|
|
|
|
GetPrivateProfileString(_T("Proxy"),
|
|
_T("Proxy_Override"),
|
|
_T(""),
|
|
GenSettings.szProxyExceptions,
|
|
StrBuffSize(GenSettings.szProxyExceptions),
|
|
FixedGlobals.ScriptName);
|
|
|
|
pLocalString = _tcsstr( GenSettings.szProxyExceptions, _T("<local>") );
|
|
|
|
|
|
// Initialize the GenSettings Proxy Bypass boolean value...
|
|
//
|
|
GenSettings.bBypassProxyForLocalAddresses = FALSE;
|
|
|
|
if( pLocalString != NULL )
|
|
{
|
|
TCHAR *pChar;
|
|
TCHAR *pEndLocal;
|
|
LPTSTR lpszExceptionBuffer;
|
|
DWORD cbExceptionBufferLen;
|
|
|
|
|
|
//
|
|
// Remove the false entry, so it doesn't get added to the exception edit box
|
|
//
|
|
pEndLocal = pLocalString + lstrlen( _T("<local>") );
|
|
|
|
//
|
|
// Allocate the exception buffer...
|
|
//
|
|
cbExceptionBufferLen= lstrlen(pEndLocal)+1;
|
|
lpszExceptionBuffer = MALLOC( cbExceptionBufferLen * sizeof(TCHAR) );
|
|
if ( lpszExceptionBuffer )
|
|
{
|
|
GenSettings.bBypassProxyForLocalAddresses = TRUE;
|
|
|
|
//
|
|
// strcpy is undefined if source and dest overlap so I have to go through
|
|
// an intermediate buffer
|
|
//
|
|
lstrcpyn( lpszExceptionBuffer, pEndLocal, cbExceptionBufferLen);
|
|
|
|
lstrcpyn( pLocalString, lpszExceptionBuffer,
|
|
AS(GenSettings.szProxyExceptions)-
|
|
(int)(pLocalString-GenSettings.szProxyExceptions) );
|
|
|
|
//
|
|
// If the first or last char is a semicolon(;) then remove it.
|
|
//
|
|
|
|
pChar = GenSettings.szProxyExceptions;
|
|
|
|
if( *pChar == _T(';') )
|
|
{
|
|
lstrcpyn( lpszExceptionBuffer, GenSettings.szProxyExceptions, cbExceptionBufferLen);
|
|
|
|
pChar = lpszExceptionBuffer;
|
|
|
|
pChar++;
|
|
|
|
lstrcpyn( GenSettings.szProxyExceptions, pChar, AS(GenSettings.szProxyExceptions) );
|
|
|
|
}
|
|
|
|
pChar = GenSettings.szProxyExceptions + lstrlen( GenSettings.szProxyExceptions );
|
|
|
|
pChar--;
|
|
|
|
if( *pChar == _T(';') )
|
|
{
|
|
*pChar = _T('\0');
|
|
}
|
|
|
|
FREE( lpszExceptionBuffer );
|
|
}
|
|
}
|
|
|
|
GetPrivateProfileString(_T("URL"),
|
|
_T("Home_Page"),
|
|
_T(""),
|
|
GenSettings.szHomePage,
|
|
StrBuffSize(GenSettings.szHomePage),
|
|
FixedGlobals.ScriptName);
|
|
|
|
GetPrivateProfileString(_T("URL"),
|
|
_T("Help_Page"),
|
|
_T(""),
|
|
GenSettings.szHelpPage,
|
|
StrBuffSize(GenSettings.szHelpPage),
|
|
FixedGlobals.ScriptName);
|
|
|
|
GetPrivateProfileString(_T("URL"),
|
|
_T("Search_Page"),
|
|
_T(""),
|
|
GenSettings.szSearchPage,
|
|
StrBuffSize(GenSettings.szSearchPage),
|
|
FixedGlobals.ScriptName);
|
|
|
|
ReadIeFavorites();
|
|
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: ReadIeFavorites
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Arguments: VOID
|
|
//
|
|
// Returns: VOID
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static VOID
|
|
ReadIeFavorites( VOID )
|
|
{
|
|
|
|
const TCHAR c_szTITLE[] = _T("Title");
|
|
const TCHAR c_szURL[] = _T("URL");
|
|
const INT c_nMAX_URLS = 1000;
|
|
|
|
INT i = 1;
|
|
TCHAR szTitle[MAX_INILINE_LEN + 1];
|
|
TCHAR szUrl[MAX_INILINE_LEN + 1];
|
|
TCHAR szNumberBuffer[10];
|
|
TCHAR szFavoriteFriendlyName[MAX_INILINE_LEN + 1];
|
|
TCHAR szFavoriteAddress[MAX_INILINE_LEN + 1];
|
|
TCHAR *pszDotUrl;
|
|
HRESULT hrCat;
|
|
|
|
//
|
|
// We really always should hit the break to exit the loop. The max count
|
|
// is just to avoid a infinite loop for some strange reason.
|
|
//
|
|
|
|
while( i < c_nMAX_URLS )
|
|
{
|
|
|
|
_itot( i, szNumberBuffer, 10 );
|
|
|
|
i++;
|
|
|
|
lstrcpyn( szTitle, c_szTITLE, AS(szTitle) );
|
|
hrCat=StringCchCat( szTitle, AS(szTitle), szNumberBuffer);
|
|
|
|
lstrcpyn( szUrl, c_szURL, AS(szUrl) );
|
|
hrCat=StringCchCat( szUrl, AS(szUrl), szNumberBuffer );
|
|
|
|
GetPrivateProfileString( c_szFAVORITESEX,
|
|
szTitle,
|
|
_T(""),
|
|
szFavoriteFriendlyName,
|
|
StrBuffSize( szFavoriteFriendlyName ),
|
|
FixedGlobals.ScriptName );
|
|
|
|
if( szFavoriteFriendlyName[0] != _T('\0') )
|
|
{
|
|
|
|
//
|
|
// Strip off the .url portion of the title
|
|
//
|
|
|
|
pszDotUrl = _tcsstr( szFavoriteFriendlyName, _T(".url") );
|
|
|
|
if( pszDotUrl != NULL )
|
|
{
|
|
*pszDotUrl = _T('\0');
|
|
}
|
|
else
|
|
{
|
|
// skip it if it is a malformed title
|
|
continue;
|
|
}
|
|
|
|
GetPrivateProfileString( c_szFAVORITESEX,
|
|
szUrl,
|
|
_T(""),
|
|
szFavoriteAddress,
|
|
StrBuffSize( szFavoriteAddress ),
|
|
FixedGlobals.ScriptName );
|
|
|
|
AddNameToNameList( &GenSettings.Favorites,
|
|
szFavoriteFriendlyName );
|
|
|
|
AddNameToNameList( &GenSettings.Favorites,
|
|
szFavoriteAddress );
|
|
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: ParseAddressAndPort
|
|
//
|
|
// Purpose: LPTCSTR pszBufferForProxyAddressAndPort - the string to parse the
|
|
// web address and port from
|
|
// LPTSTR pszAddress - web address returned in this string
|
|
// DWORD cbAddressLen - length of adress buffer
|
|
// LPTSTR pszPort - web port returned in this string
|
|
// DWORD cbPortLen - length of port buffer
|
|
//
|
|
// Arguments: VOID
|
|
//
|
|
// Returns: VOID
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static VOID
|
|
ParseAddressAndPort( LPTSTR pszBufferForProxyAddressAndPort,
|
|
LPTSTR pszAddress,
|
|
DWORD cbAddressLen,
|
|
LPTSTR pszPort,
|
|
DWORD cbPortLen)
|
|
{
|
|
|
|
INT i;
|
|
INT iStrLen;
|
|
BOOL bColonFound = FALSE;
|
|
|
|
lstrcpyn( pszAddress, _T(""), cbAddressLen);
|
|
|
|
lstrcpyn( pszPort, _T(""), cbPortLen);
|
|
|
|
|
|
iStrLen = lstrlen( pszBufferForProxyAddressAndPort );
|
|
|
|
for( i = 0; i < iStrLen; i++ )
|
|
{
|
|
|
|
if( pszBufferForProxyAddressAndPort[i] == _T(':') )
|
|
{
|
|
|
|
//
|
|
// We have found the colon(:) separating the address and the port
|
|
// if the next char is a digit. This prevents the colon in
|
|
// http://www.someaddress.com from looking like the port.
|
|
//
|
|
|
|
if( _istdigit( pszBufferForProxyAddressAndPort[i + 1] ) )
|
|
{
|
|
bColonFound = TRUE;
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if( bColonFound )
|
|
{
|
|
LPTSTR pPortSection;
|
|
|
|
pszBufferForProxyAddressAndPort[i] = _T('\0');
|
|
|
|
pPortSection = &( pszBufferForProxyAddressAndPort[i + 1] );
|
|
|
|
lstrcpyn( pszAddress, pszBufferForProxyAddressAndPort, cbAddressLen);
|
|
|
|
lstrcpyn( pszPort, pPortSection, cbPortLen);
|
|
}
|
|
else
|
|
{
|
|
|
|
//
|
|
// it doesn't contain a colon so it doesn't have a port, the whole
|
|
// string is the address
|
|
//
|
|
|
|
lstrcpyn( pszAddress, pszBufferForProxyAddressAndPort, cbAddressLen);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|