Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

6635 lines
236 KiB

#include "precomp.h"
#include <webcheck.h>
#include <intshcut.h>
#include <mlang.h>
#include "ie4comp.h"
#include "updates.h"
extern TCHAR g_szCustIns[];
extern TCHAR g_szTitle[];
extern TCHAR g_szBuildTemp[];
extern TCHAR g_szJobVersion[];
extern HANDLE g_hLogFile;
extern TCHAR g_aszLang[][16];
extern int g_nLangs, g_iDownloadState;
TCHAR g_szCustInf[MAX_PATH];
HANDLE g_hDownloadEvent = 0;
TCHAR g_szCifVer[MAX_PATH];
TCHAR g_szDestCif[MAX_PATH];
TCHAR g_szCif[MAX_PATH];
TCHAR g_szCustCif[MAX_PATH];
TCHAR g_szCustItems[MAX_PATH];
TCHAR g_szMyCptrPath[MAX_PATH];
TCHAR g_szCtlPanelPath[MAX_PATH];
TCHAR g_szCustIcmPro[MAX_PATH];
static TCHAR s_aszLangDesc[NUMLANG][64];
UINT g_uiNumCabs = 0;
COMPONENT g_aCustComponents[MAXCUST+1];
int g_nCustComp;
int g_iSelOpt;
int g_nModes;
SITEDATA g_aCustSites[NUMSITES];
int g_iSelSite;
int g_nDownloadUrls;
TCHAR g_szAllModes[16];
TCHAR g_szMastInf[MAX_PATH];
TCHAR g_szDefInf[MAX_PATH];
static DWORD s_dwTotalSize = 0;
extern BOOL g_fCancelled;
extern BOOL g_fDone;
extern BOOL g_fLangInit;
extern RECT g_dtRect;
extern BOOL g_fMailNews95;
extern int g_iCurPage;
extern HWND g_hDlg;
extern PROPSHEETPAGE g_psp[];
extern TCHAR g_szBuildRoot[];
extern TCHAR g_szSrcRoot[];
extern TCHAR g_szWizRoot[];
extern TCHAR g_szLanguage[];
extern BOOL g_fIntranet;
extern TCHAR szHtmlHelp[];
#define NUM_BITMAPS 2
#define CX_BITMAP 16
#define CY_BITMAP 16
PCOMPONENT g_paComp = NULL;
PCOMPONENT g_pMNComp = NULL;
PCOMP_VERSION g_rgCompVer = NULL;
HANDLE g_hAVSThread = NULL;
BOOL g_fOptCompInit = FALSE;
static BOOL s_fCustCompInit = FALSE;
TCHAR g_szActLang[4];
static TCHAR s_szCifNew[MAX_PATH];
static TCHAR s_szCifCabURL[MAX_PATH];
TCHAR g_szIEAKProg[MAX_PATH] = TEXT("");
TCHAR g_szBaseURL[MAX_URL];
TCHAR g_szUpdateData[MAX_URL] = TEXT("");
TCHAR g_szUpdateURL[MAX_URL] = TEXT("");
TCHAR g_szFailedCompsMsg[MAX_PATH];
TCHAR g_szFailedComps[MAX_BUF];
TCHAR g_szFailedCompsBox[MAX_PATH + MAX_BUF];
BOOL g_fFailedComp = FALSE;
HIMAGELIST s_hImgList = 0;
static int s_iSelComp = 0;
static PCOMPONENT s_pSelComp;
static int s_nNewCust = 1;
static TCHAR s_szNewTpl[80];
static WORD s_aCustStaticTextFieldID[] =
{
IDC_LOC1, IDC_PARAM1, IDC_LOC3, IDC_LOC4, IDC_PARAM2, IDC_SIZE2, IDC_TITLE1, IDC_COMPDESC
};
#define NCUSTSTATICTEXTFIELDS sizeof(s_aCustStaticTextFieldID)/sizeof(WORD)
static WORD s_aCustTextFieldID[] =
{
IDE_COMPFILENAME, IDE_COMPPARAM, /* IDE_COMPSIZE,*/ IDE_COMPGUID,
IDE_COMPCOMMAND, IDE_UNINSTALLKEY, IDE_COMPVERSION, IDC_COMPTITLE, IDE_COMPDESC
};
#define NCUSTTEXTFIELDS sizeof(s_aCustTextFieldID)/sizeof(WORD)
static WORD s_aCustFieldID[] =
{
IDE_COMPFILENAME, IDE_COMPPARAM, /* IDE_COMPSIZE,*/ IDE_COMPGUID,
IDE_COMPCOMMAND, IDE_UNINSTALLKEY, IDE_COMPVERSION, IDC_COMPTITLE,
IDC_VERIFY, IDC_REMOVECOMP, IDC_BROWSEFILE, IDE_COMPDESC, IDC_PREINSTALL, IDC_POSTINSTALL,
IDC_REBOOTINSTALL, IDC_INSTALLSUCCESS
};
void updateCifVersions32(PCOMPONENT pComp, BOOL fIgnore, BOOL fUpdate = FALSE);
#define NCUSTFIELDS sizeof(s_aCustFieldID)/sizeof(WORD)
void UpdateInf(LPTSTR szMasterInf, LPTSTR szUserInf);
static BOOL s_fNoCore;
TCHAR g_szTempSign[MAX_PATH] = TEXT("");
static TCHAR s_szSiteData[MAX_URL];
extern BOOL g_fBatch;
extern BOOL g_fBatch2;
BOOL g_fInteg = FALSE;
extern void CheckBatchAdvance(HWND hDlg);
extern void DoBatchAdvance(HWND hDlg);
extern DWORD GetRootFree(LPCTSTR pcszPath);
extern BOOL g_fSilent, g_fStealth;
extern void UpdateIEAK(HWND hDlg);
// trust key defines, this are bit fields to determine which one to add/delete
struct TrustKey
{
TCHAR szCompanyName[MAX_PATH];
TCHAR szTrustString[MAX_PATH];
BOOL fSet;
};
static TrustKey s_tkTrustArray[] =
{{TEXT("Microsoft Corporation"), TEXT("bhhphijojgfcdocagmhjgjbhmieinfap jpjmcfmhckkdfknkfemjikfiodeelkbd"), TRUE},
{TEXT("Microsoft Corporation"), TEXT("bhhphijojgfcdocagmhjgjbhmieinfap immbkmbpjfdkajbkncahcedfmndgehba"), TRUE},
{TEXT("Microsoft Corporation (Europe)"), TEXT("bhhphijojgfcdocagmhjgjbhmieinfap doamnolbnlpmdlpnkcnpckgfimpaaicl"), TRUE},
{TEXT("Microsoft Corporation"), TEXT("bhhphijojgfcdocagmhjgjbhmieinfap hbgflemajngobcablgnalaidgojggghj"), TRUE},
{TEXT("Microsoft Corporation"), TEXT("bhhphijojgfcdocagmhjgjbhmieinfap debgjcefniaahdamnhbggedppfiianff"), TRUE}, // new MS cert effective from 4/16/99
{TEXT("Microsoft Corporation (Europe)"), TEXT("bhhphijojgfcdocagmhjgjbhmieinfap kefdggbdmbmgbogjdcnmkoodcknmmghc"), TRUE}, // new MS Europe cert effective from 4/16/99
{TEXT("VDOnet Corporation"), TEXT("bhhphijojgfcdocagmhjgjbhmieinfap moambfklemnlbmhfoomjdignnbkjfkek"), TRUE},
{TEXT("Progressive Networks, Inc."), TEXT("bhhphijojgfcdocagmhjgjbhmieinfap cdikdekkiddcimdmcgedabijgpeobdhd"), TRUE},
{TEXT("Macromedia, Inc."), TEXT("bhhphijojgfcdocagmhjgjbhmieinfap akhlecfpbbjjngidddpgifggcplpcego"), TRUE}
};
extern BOOL g_fSrcDirChanged;
extern HINSTANCE hBrand;
extern BOOL g_fCD, g_fLAN, g_fDownload, g_fBrandingOnly;
BOOL g_fLocalMode = FALSE;
DWORD BuildCDandMflop(LPVOID);
HANDLE g_hProcessInfEvent = 0;
HANDLE g_hCifEvent = 0;
extern BOOL g_fOCW;
// core section component names for base
#define BASEWIN32 TEXT("BASEIE40_WIN")
// returns the component structure for base IE4 component, if for some
// weird reason its not there just return the first component structure
// in the list
PCOMPONENT FindComp(LPCTSTR szID, BOOL fCore)
{
PCOMPONENT pComp;
UINT i;
for (pComp = g_paComp, i=0; ((i < g_uiNumCabs) && (*pComp->szSection)); pComp++)
{
if (fCore)
{
// Note: we are depending on the section name of core IE4 here
if (StrCmpI(pComp->szSection, BASEWIN32) == 0)
return pComp;
}
else
{
if (StrCmpI(pComp->szSection, szID) == 0)
return pComp;
}
}
if (fCore)
return g_paComp;
else
return NULL;
}
PCOMPONENT FindVisibleComponentName(LPCTSTR pcszCompName)
{
PCOMPONENT pComp;
for (pComp = g_paComp; *pComp->szSection; pComp++ )
{
if ((StrCmpI(pComp->szDisplayName, pcszCompName) == 0) && pComp->fVisible &&
!pComp->fAddOnOnly)
return(pComp);
}
return(NULL);
}
PCOMPONENT FindCustComp(LPCTSTR szID)
{
PCOMPONENT pComp;
for (pComp = g_aCustComponents; *pComp->szSection; pComp++)
{
if (StrCmpI(pComp->szSection, szID) == 0)
return pComp;
}
return NULL;
}
PCOMPONENT FindCustComponentName(LPTSTR szCompName)
{
int i;
PCOMPONENT pComp;
for (i = 0, pComp = g_aCustComponents; i < g_nCustComp; i++, pComp++ )
{
if (StrCmp(pComp->szDisplayName, szCompName) == 0) return(pComp);
}
return(NULL);
}
PCOMPONENT FindCustComponentIndex(int iList)
{
int i;
PCOMPONENT pComp;
for (i = 0, pComp = g_aCustComponents; i < g_nCustComp; i++, pComp++ )
{
if (pComp->iList == iList) return(pComp);
}
return(NULL);
}
int GetActiveSetupURL( LPTSTR pSection, LPTSTR szUrl, int /*iSize*/, LPTSTR szCif)
{
TCHAR szUrlWrk[MAX_URL];
GetPrivateProfileString( pSection, TEXT("URL1"), TEXT(""), szUrlWrk, MAX_URL, szCif );
if (*szUrlWrk != TEXT('"')) StrCpy(szUrl, szUrlWrk);
else
StrCpy(szUrl, szUrlWrk + 1);
StrTok(szUrl + 1, TEXT("\" ,"));
return(lstrlen(szUrl));
}
void WriteActiveSetupURL(PCOMPONENT pComp, LPTSTR szCif)
{
TCHAR szUrlWrk[MAX_URL] = TEXT("\"");
StrCat(szUrlWrk, pComp->szUrl);
StrCat(szUrlWrk, (pComp->iType != INST_CAB) ? TEXT("\",2") : TEXT("\",3"));
WritePrivateProfileString(pComp->szSection, TEXT("URL1"), szUrlWrk, szCif);
}
//
// FUNCTION: GetCustComponent(HWND, int)
//
// PURPOSE: Gets custom component data entered in the dialog boxes,
// and saves it in memory
//
void GetCustComponent(HWND hDlg, int iList)
{
PCOMPONENT pComp = FindCustComponentIndex(iList);
if (pComp == NULL) return;
GetDlgItemText( hDlg, IDE_COMPFILENAME, pComp->szPath, countof(pComp->szPath) );
GetDlgItemText( hDlg, IDE_COMPCOMMAND, pComp->szCommand, countof(pComp->szCommand) );
GetDlgItemText( hDlg, IDE_COMPPARAM, pComp->szSwitches, countof(pComp->szSwitches) );
GetDlgItemText( hDlg, IDE_COMPGUID, pComp->szGUID, countof(pComp->szGUID) );
GetDlgItemText( hDlg, IDE_UNINSTALLKEY, pComp->szUninstall, countof(pComp->szUninstall) );
GetDlgItemText( hDlg, IDE_COMPVERSION, pComp->szVersion, countof(pComp->szVersion) );
SendDlgItemMessage( hDlg, IDC_COMPTITLE, CB_GETLBTEXT, pComp->iList,(LPARAM) pComp->szDisplayName );
GetDlgItemText( hDlg, IDE_COMPDESC, pComp->szDesc, countof(pComp->szDesc) );
if (IsDlgButtonChecked(hDlg, IDC_POSTINSTALL) == BST_CHECKED)
pComp->iInstallType = 0;
else
{
if (IsDlgButtonChecked(hDlg, IDC_PREINSTALL) == BST_CHECKED)
pComp->iInstallType = 1;
else
pComp->iInstallType = 2;
}
pComp->fIEDependency = (IsDlgButtonChecked(hDlg, IDC_INSTALLSUCCESS) == BST_CHECKED);
}
void CheckCompType(HWND hDlg, PCOMPONENT pComp )
{
HANDLE hFile;
DWORD dwSize = 0;
LPTSTR pDot, pBack;
if (!pComp) return;
GetDlgItemText( hDlg, IDE_COMPFILENAME, pComp->szPath, countof(pComp->szPath) );
pComp->dwSize = 0;
if ((hFile = CreateFile(pComp->szPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)
{
pComp->dwSize = ((dwSize = GetFileSize(hFile, NULL)) != 0xffffffff) ? (dwSize >> 10) : 0;
CloseHandle(hFile);
}
//SetDlgItemInt( hDlg, IDE_COMPSIZE, dwSize, FALSE);
pDot = StrRChr(pComp->szPath, NULL, TEXT('.'));
pBack = StrRChr(pComp->szPath, NULL, TEXT('\\'));
if ((pDot != NULL) && (StrCmpI(pDot, TEXT(".cab")) == 0))
{
EnableDlgItem(hDlg, IDE_COMPCOMMAND);
pComp->iType = INST_CAB;
if (pBack != NULL)
{
StrCpy(pComp->szUrl, pBack + 1);
}
return;
}
DisableDlgItem(hDlg, IDE_COMPCOMMAND);
if ((pDot != NULL) && (StrCmpI(pDot, TEXT(".exe")) == 0))
{
pComp->iType = INST_EXE;
if (pBack != NULL)
{
StrCpy(pComp->szCommand, pBack + 1);
StrCpy(pComp->szUrl, pBack + 1);
SetDlgItemText( hDlg, IDE_COMPCOMMAND, pComp->szCommand );
}
}
}
//
// FUNCTION: SetCustComponent(HWND, int)
//
// PURPOSE: Gets custom component data from memory,
// and displays it on the screen
//
void SetCustComponent(HWND hDlg, int iList)
{
PCOMPONENT pComp = FindCustComponentIndex(iList);
if (!pComp)
{
int i;
SendDlgItemMessage( hDlg, IDC_COMPTITLE, CB_SETCURSEL, 0, 0L );
for (i = 0; i < NCUSTFIELDS ; i++ )
{
EnsureDialogFocus(hDlg, s_aCustFieldID[i], IDC_ADDNEWCOMP);
DisableDlgItem(hDlg, s_aCustFieldID[i]);
}
for (i = 0; i < NCUSTTEXTFIELDS ; i++ )
{
SetDlgItemText( hDlg, s_aCustTextFieldID[i] , TEXT("") );
}
for (i = 0; i < NCUSTSTATICTEXTFIELDS ; i++ )
DisableDlgItem(hDlg, s_aCustStaticTextFieldID[i]);
CheckDlgButton(hDlg, IDC_PREINSTALL, BST_UNCHECKED);
return;
}
SetDlgItemText( hDlg, IDE_COMPFILENAME, pComp->szPath );
CheckCompType(hDlg, pComp);
SetDlgItemText( hDlg, IDE_COMPCOMMAND, pComp->szCommand );
if (ISNULL(pComp->szGUID))
{
GUID guid;
if (CoCreateGuid(&guid) == NOERROR)
CoStringFromGUID(guid, pComp->szGUID, countof(pComp->szGUID));
else
wnsprintf(pComp->szGUID, countof(pComp->szGUID), TEXT("CUSTOM%i"),iList);
}
SetDlgItemText( hDlg, IDE_COMPGUID, pComp->szGUID );
SetDlgItemText( hDlg, IDE_COMPPARAM, pComp->szSwitches );
SetDlgItemText( hDlg, IDE_UNINSTALLKEY, pComp->szUninstall );
SetDlgItemText( hDlg, IDE_COMPVERSION, pComp->szVersion);
SendDlgItemMessage( hDlg, IDC_COMPTITLE, CB_SETCURSEL, pComp->iList, 0L );
SetDlgItemText( hDlg, IDC_COMPTITLE, pComp->szDisplayName);
SetDlgItemText(hDlg, IDE_COMPDESC, pComp->szDesc);
CheckRadioButton(hDlg, IDC_POSTINSTALL, IDC_REBOOTINSTALL, IDC_POSTINSTALL + pComp->iInstallType);
CheckDlgButton( hDlg, IDC_INSTALLSUCCESS, pComp->fIEDependency ? BST_CHECKED : BST_UNCHECKED);
EnableDlgItem2(hDlg, IDC_INSTALLSUCCESS, (pComp->iInstallType != 1));
if (g_nCustComp < MAXCUST)
EnableDlgItem(hDlg, IDC_ADDNEWCOMP);
else
{
EnsureDialogFocus(hDlg, IDC_ADDNEWCOMP, IDC_REMOVECOMP);
DisableDlgItem(hDlg, IDC_ADDNEWCOMP);
}
SetFocus(GetDlgItem( hDlg, IDC_COMPTITLE ));
}
void InitCustComponents(HWND hDlg)
{
TCHAR szSectBuf[2048];
LPTSTR pSection = szSectBuf;
HWND hCompList;
PCOMPONENT pComp;
TCHAR szCustCifName[32];
if (hDlg) hCompList = GetDlgItem(hDlg, IDC_COMPTITLE);
StrCpy(szCustCifName, TEXT("CUSTOM.CIF"));
PathCombine(g_szCustCif, g_szBuildRoot, TEXT("INS"));
PathAppend(g_szCustCif, GetOutputPlatformDir());
PathAppend(g_szCustCif, g_szLanguage);
PathAppend(g_szCustCif, szCustCifName);
LoadString( g_rvInfo.hInst, IDS_NEWCUST, s_szNewTpl, countof(s_szNewTpl) );
ZeroMemory(szSectBuf, sizeof(szSectBuf));
GetPrivateProfileString( NULL, NULL, TEXT(""), szSectBuf, countof(szSectBuf), g_szCustCif );
pComp = g_aCustComponents;
g_nCustComp = 0;
s_nNewCust = 1;
while (*pSection)
{
int i;
if (StrCmp(pSection, CUSTCMSECT) == 0)
{
pSection += lstrlen(pSection) + 1;
continue;
}
StrCpy(pComp->szSection, pSection);
GetPrivateProfileString( pSection, TEXT("Switches1"), TEXT(""), pComp->szSwitches, countof(pComp->szSwitches), g_szCustCif );
GetPrivateProfileString( pSection, TEXT("DisplayName"), TEXT(""), pComp->szDisplayName, countof(pComp->szDisplayName), g_szCustCif );
GetPrivateProfileString( pSection, TEXT("GUID"), TEXT(""), pComp->szGUID, countof(pComp->szGUID), g_szCustCif );
GetPrivateProfileString( pSection, TEXT("UninstallKey"), TEXT(""), pComp->szUninstall, countof(pComp->szUninstall), g_szCustCif );
GetActiveSetupURL( pSection, pComp->szUrl, countof(pComp->szUrl), g_szCustCif );
GetPrivateProfileString( pSection, TEXT("Version"), TEXT(""), pComp->szVersion, countof(pComp->szVersion), g_szCustCif );
GetPrivateProfileString( pSection, TEXT("Command1"), TEXT(""), pComp->szCommand, countof(pComp->szVersion), g_szCustCif );
GetPrivateProfileString( pSection, TEXT("Path"), TEXT(""), pComp->szPath, countof(pComp->szPath), g_szCustCif );
pComp->dwSize = GetPrivateProfileInt( pSection, TEXT("Size"), 0, g_szCustCif );
pComp->iType = GetPrivateProfileInt( pSection, TEXT("Type1"), 0, g_szCustCif );
pComp->iInstallType = GetPrivateProfileInt( pSection, TEXT("PreInstall"), 0, g_szCustCif);
if (hDlg != NULL)
pComp->iList = (int) SendDlgItemMessage( hDlg, IDC_COMPTITLE, CB_ADDSTRING, 0, (LPARAM) pComp->szDisplayName );
GetPrivateProfileString( pSection, TEXT("Details"), TEXT(""), pComp->szDesc, countof(pComp->szDesc), g_szCustCif );
pComp->fVisible = TRUE;
pComp->fIEDependency = InsGetBool(pSection, TEXT("Dependency"), 0, g_szCustCif);
if (StrCmpN(pComp->szDisplayName, s_szNewTpl, lstrlen(s_szNewTpl)) == 0)
{
i = StrToInt(pComp->szDisplayName + lstrlen(s_szNewTpl));
if (i >= s_nNewCust) s_nNewCust = i + 1;
}
i = StrToInt(pSection + countof("CUSTOM")-1);
if (i >= s_nNewCust) s_nNewCust = i + 1;
pSection += StrLen(pSection) + 1;
pComp++;
g_nCustComp++;
}
s_iSelComp = 0;
s_pSelComp = g_aCustComponents;
if (hDlg != NULL)
s_fCustCompInit = TRUE;
if (g_nCustComp == 0)
{
if (hDlg != NULL)
{
int i;
for (i = 0; i < NCUSTFIELDS ; i++ )
{
EnsureDialogFocus(hDlg, s_aCustFieldID[i], IDC_ADDNEWCOMP);
DisableDlgItem(hDlg, s_aCustFieldID[i]);
}
for (i = 0; i < NCUSTSTATICTEXTFIELDS ; i++ )
DisableDlgItem(hDlg, s_aCustStaticTextFieldID[i]);
}
}
else
{
int i, iComp;
if (hDlg != NULL)
SetCustComponent(hDlg, 0);
for (pComp = g_aCustComponents, iComp = 0; iComp < g_nCustComp ; pComp++, iComp++ )
{
TCHAR szModesParam[80] = TEXT("Cust0Modes");
TCHAR szModes[16] = TEXT("\"");
if (ISNULL(pComp->szSection)) break;
szModesParam[4] = (TCHAR)(iComp + TEXT('0'));
ZeroMemory(pComp->afInstall, sizeof(pComp->afInstall));
GetPrivateProfileString(IS_STRINGS, szModesParam, TEXT(""), szModes, countof(szModes), g_szCustInf);
StrCpy(pComp->szModes, szModes);
if (StrCmpI(szModes, UNUSED) != 0)
{
for (i = 0; i < lstrlen(szModes) ; i++ )
{
int j = szModes[i] - TEXT('0');
pComp->afInstall[j] = TRUE;
}
}
}
}
}
void SaveCustComponents()
{
PCOMPONENT pComp;
int i;
TCHAR szSize[8];
TCHAR szType[8];
TCHAR szModesParam[80] = TEXT("Cust0Modes");
TCHAR szTemp[80];
for (pComp = g_aCustComponents, i = 0; i < g_nCustComp ; pComp++, i++)
{
LPTSTR pSection = pComp->szSection;
wnsprintf(pSection, countof(pComp->szSection), TEXT("CUSTOM%i"), i);
wnsprintf(szTemp, 80, TEXT("\"%s\""), pComp->szSwitches);
StrCpy(pComp->szSwitches, szTemp);
WritePrivateProfileString( pSection, TEXT("Switches1"), pComp->szSwitches, g_szCustCif );
WritePrivateProfileString( pSection, TEXT("DisplayName"), pComp->szDisplayName, g_szCustCif );
pComp->fVisible = TRUE;
if (ISNULL(pComp->szGUID))
{
GUID guid;
if (CoCreateGuid(&guid) == NOERROR)
CoStringFromGUID(guid, pComp->szGUID, countof(pComp->szGUID));
else
wnsprintf(pComp->szGUID, countof(pComp->szGUID), TEXT("CUSTOM%i"),i);
}
WritePrivateProfileString( pSection, TEXT("GUID"), pComp->szGUID, g_szCustCif );
WritePrivateProfileString( pSection, TEXT("UninstallKey"), pComp->szUninstall, g_szCustCif );
WriteActiveSetupURL(pComp, g_szCustCif );
WritePrivateProfileString( pSection, TEXT("Version"), pComp->szVersion, g_szCustCif );
WritePrivateProfileString( pSection, TEXT("Command1"), pComp->szCommand, g_szCustCif );
WritePrivateProfileString( pSection, TEXT("Path"), pComp->szPath, g_szCustCif );
wnsprintf(szSize, countof(szSize), TEXT("%i"), (int) pComp->dwSize);
wnsprintf(szType, countof(szType), TEXT("%i"), pComp->iType);
WritePrivateProfileString( pSection, TEXT("Size"), szSize, g_szCustCif );
WritePrivateProfileString( pSection, TEXT("Type1"), szType, g_szCustCif );
WritePrivateProfileString( pSection, TEXT("Details"), pComp->szDesc, g_szCustCif );
InsWriteInt( pSection, TEXT("PreInstall"), pComp->iInstallType, g_szCustCif );
InsWriteBool( pSection, TEXT("Dependency"), pComp->fIEDependency, g_szCustCif );
szModesParam[4] = (TCHAR)(i + TEXT('0'));
WritePrivateProfileString(IS_STRINGS, szModesParam, pComp->szModes, g_szCustInf);
}
for (; i <= MAXCUST ; i++ )
{
TCHAR szSection[16];
wnsprintf(szSection, countof(szSection), TEXT("CUSTOM%i"), i);
WritePrivateProfileString( szSection, NULL, NULL, g_szCustCif );
szModesParam[4] = (TCHAR)(i + TEXT('0'));
WritePrivateProfileString(IS_STRINGS, szModesParam, NULL, g_szCustInf);
}
WritePrivateProfileString(NULL, NULL, NULL, g_szCustCif);
WritePrivateProfileString(NULL, NULL, NULL, g_szCustInf);
}
// validate version info so that it can either contain a '.' char or numbers 0 - 9.
BOOL IsValidVersion(HWND hDlg, UINT nVersionCtrlID)
{
TCHAR szVersion[MAX_PATH];
int nInvalidCharPos = -1;
int nLen = 0;
int nNumLen = 0;
int nComma = 0;
ZeroMemory(szVersion, sizeof(szVersion));
GetDlgItemText(hDlg, nVersionCtrlID, szVersion, countof(szVersion));
if (*szVersion == TEXT('\0'))
return TRUE;
nLen = StrLen(szVersion);
for(int i = 0; (i < nLen && nInvalidCharPos == -1); i++)
{
if (szVersion[i] != TEXT(',') && !(szVersion[i] >= TEXT('0') && szVersion[i] <= TEXT('9')))
nInvalidCharPos = i;
else if (szVersion[i] == TEXT(','))
{
nComma++;
if (i == 0 || szVersion[i - 1] == TEXT(',') || nComma > 3)
nInvalidCharPos = i;
nNumLen = 0;
}
else
{
nNumLen++;
if (nNumLen > 4)
nInvalidCharPos = i;
}
}
if (nInvalidCharPos == -1 && (nNumLen == 0 || nComma < 3))
nInvalidCharPos = nLen;
if (nInvalidCharPos >= 0)
{
ErrorMessageBox(hDlg, IDS_INVALID_VERSION);
SetFocus(GetDlgItem(hDlg, nVersionCtrlID));
SendMessage(GetDlgItem(hDlg, nVersionCtrlID), EM_SETSEL, (WPARAM)nInvalidCharPos, (LPARAM)nLen);
return FALSE;
}
return TRUE;
}
//
// FUNCTION: CustomComponents(HWND, UINT, UINT, LONG)
//
// PURPOSE: Processes messages for "CustomComponents" page
//
// MESSAGES:
//
// WM_INITDIALOG - intializes the page
// WM_NOTIFY - processes the notifications sent to the page
// WM_COMMAND - saves the id of the choice selected
//
INT_PTR CALLBACK CustomComponents(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
int iComp, iNewSel, i;
HRESULT res;
HWND hComplist;
DWORD dwFlags;
switch (message)
{
case WM_INITDIALOG:
EnableDBCSChars( hDlg, IDE_COMPFILENAME);
EnableDBCSChars( hDlg, IDC_COMPTITLE);
EnableDBCSChars( hDlg, IDE_COMPCOMMAND);
EnableDBCSChars( hDlg, IDE_UNINSTALLKEY);
EnableDBCSChars( hDlg, IDE_COMPPARAM);
EnableDBCSChars( hDlg, IDE_COMPDESC);
DisableDBCSChars(hDlg, IDE_COMPGUID);
DisableDBCSChars(hDlg, IDE_COMPVERSION);
// format for version field is XXXX,XXXX,XXXX,XXXX
Edit_LimitText(GetDlgItem(hDlg, IDE_COMPVERSION), 19);
Edit_LimitText(GetDlgItem(hDlg, IDC_COMPTITLE), countof(g_paComp->szDisplayName)-1);
Edit_LimitText(GetDlgItem(hDlg, IDE_COMPDESC), countof(g_paComp->szDesc)-1);
g_hWizard = hDlg;
break;
case IDM_BATCHADVANCE:
DoBatchAdvance(hDlg);
break;
case WM_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case WM_COMMAND:
switch(HIWORD(wParam))
{
TCHAR szBuf[MAX_PATH];
case BN_CLICKED:
switch (LOWORD(wParam))
{
case IDC_ADDNEWCOMP:
iComp = g_nCustComp;
if (iComp != 0)
{
GetCustComponent(hDlg, s_iSelComp);
if (ISNULL(g_aCustComponents[s_iSelComp].szDisplayName))
{
ErrorMessageBox(hDlg, IDS_NOCUSTCOMPNAME);
return TRUE;
}
dwFlags = FC_NONNULL | FC_FILE | FC_EXISTS;
if (!CheckField(hDlg, IDE_COMPFILENAME, dwFlags)
|| !IsValidVersion(hDlg, IDE_COMPVERSION))
return TRUE;
}
else
{
for (i = 0; i < NCUSTFIELDS ; i++ )
{
EnableDlgItem(hDlg, s_aCustFieldID[i]);
}
for (i = 0; i < NCUSTSTATICTEXTFIELDS ; i++ )
EnableDlgItem(hDlg, s_aCustStaticTextFieldID[i]);
}
g_nCustComp++;
s_pSelComp = &g_aCustComponents[iComp];
ZeroMemory(s_pSelComp, sizeof(COMPONENT));
wnsprintf(s_pSelComp->szSection, countof(s_pSelComp->szSection), TEXT("CUSTOM%i"), s_nNewCust);
wnsprintf(s_pSelComp->szDisplayName, countof(s_pSelComp->szDisplayName), TEXT("%s%i"), s_szNewTpl, s_nNewCust++);
StrCpy(s_pSelComp->szModes, g_szAllModes);
s_pSelComp->iList = (int) SendDlgItemMessage( hDlg, IDC_COMPTITLE, CB_ADDSTRING, 0, (LPARAM) s_pSelComp->szDisplayName );
SendDlgItemMessage( hDlg, IDC_COMPTITLE, CB_SETCURSEL, s_pSelComp->iList, 0L);
s_iSelComp = s_pSelComp->iList;
SetCustComponent(hDlg, s_pSelComp->iList);
SendMessage(GetDlgItem( hDlg, IDC_COMPTITLE ), CB_SETEDITSEL,
0, MAKELPARAM(0, -1));
break;
case IDC_VERIFY:
dwFlags = FC_NONNULL | FC_FILE | FC_EXISTS;
if (!CheckField(hDlg, IDE_COMPFILENAME, dwFlags))
break;
s_pSelComp = &g_aCustComponents[s_iSelComp];
res = CheckTrustExWrap(NULL, s_pSelComp->szPath, hDlg, FALSE, NULL);
switch (res)
{
case NOERROR:
// note that the following means that the idiot hit 'no':
case TRUST_E_SUBJECT_NOT_TRUSTED:
case E_ABORT:
ErrorMessageBox(hDlg, IDS_SIGNEDMSG, MB_OK | MB_SETFOREGROUND | MB_ICONINFORMATION);
break;
case TRUST_E_NOSIGNATURE:
ErrorMessageBox(hDlg, IDS_PLEASESIGNMSG);
break;
case CERT_E_EXPIRED:
ErrorMessageBox(hDlg, IDS_CERTEXPIREDMSG);
break;
case TRUST_E_PROVIDER_UNKNOWN:
case CERT_E_UNTRUSTEDROOT:
ErrorMessageBox(hDlg, IDS_BADPROVIDERMSG);
break;
case CERT_E_MALFORMED:
case CERT_E_ISSUERCHAINING:
case CERT_E_CHAINING:
case CERT_E_CRITICAL:
case CERT_E_PATHLENCONST:
case CERT_E_ROLE:
case DIGSIG_E_DECODE:
case DIGSIG_E_ENCODE:
case DIGSIG_E_CRYPTO:
case DIGSIG_E_EXTENSIBILITY:
default:
ErrorMessageBox(hDlg, IDS_CERTERRORMSG);
break;
}
break;
case IDC_REMOVECOMP:
s_iSelComp = (int) SendDlgItemMessage( hDlg, IDC_COMPTITLE, CB_GETCURSEL, 0, 0L);
SendDlgItemMessage( hDlg, IDC_COMPTITLE, CB_DELETESTRING, s_iSelComp, 0L );
WritePrivateProfileString( g_aCustComponents[s_iSelComp].szSection, NULL, NULL, g_szCustCif );
for (i = s_iSelComp; i < g_nCustComp ; i++ )
{
g_aCustComponents[i] = g_aCustComponents[i + 1];
g_aCustComponents[i].iList--;
}
ZeroMemory(&g_aCustComponents[g_nCustComp--], sizeof(COMPONENT));
if (s_iSelComp >= g_nCustComp) s_iSelComp = g_nCustComp - 1;
SetCustComponent(hDlg, s_iSelComp);
break;
case IDC_BROWSEFILE:
GetDlgItemText(hDlg, IDE_COMPFILENAME, szBuf, countof(szBuf));
if (BrowseForFile(hDlg, szBuf, countof(szBuf), GFN_EXE | GFN_CAB))
SetDlgItemText(hDlg, IDE_COMPFILENAME, szBuf);
break;
case IDC_POSTINSTALL:
case IDC_REBOOTINSTALL:
if (HIWORD(wParam) == BN_CLICKED)
{
EnableDlgItem(hDlg, IDC_INSTALLSUCCESS);
break;
}
return FALSE;
case IDC_PREINSTALL:
if (HIWORD(wParam) == BN_CLICKED)
{
CheckDlgButton(hDlg, IDC_INSTALLSUCCESS, BST_UNCHECKED);
DisableDlgItem(hDlg, IDC_INSTALLSUCCESS);
break;
}
return FALSE;
default:
return FALSE;
}
break;
case CBN_SELENDOK:
hComplist = GetDlgItem(hDlg, IDC_COMPTITLE);
iNewSel = (int) SendMessage( hComplist, CB_GETCURSEL, 0, 0L);
if (iNewSel != s_iSelComp)
{
if (ISNULL(g_aCustComponents[s_iSelComp].szDisplayName))
{
ErrorMessageBox(hDlg, IDS_NOCUSTCOMPNAME);
return TRUE;
}
dwFlags = FC_NONNULL | FC_FILE | FC_EXISTS;
if (!CheckField(hDlg, IDE_COMPFILENAME, dwFlags))
{
return TRUE;
}
if (!IsValidVersion(hDlg, IDE_COMPVERSION))
return TRUE;
}
GetWindowText( hComplist, s_pSelComp->szDisplayName, 80 );
SendMessage( hComplist, CB_DELETESTRING, s_iSelComp, 0L );
SendMessage( hComplist, CB_INSERTSTRING, s_iSelComp,
(LPARAM) s_pSelComp->szDisplayName);
if ((iNewSel != CB_ERR) && (iNewSel != s_iSelComp))
{
GetCustComponent(hDlg, s_iSelComp);
s_iSelComp = iNewSel;
s_pSelComp = &g_aCustComponents[s_iSelComp];
SetCustComponent(hDlg, s_iSelComp);
}
if (iNewSel < 0) iNewSel = 0;
SendMessage( hComplist, CB_SETCURSEL, iNewSel, 0L );
break;
case CBN_EDITCHANGE:
GetWindowText( (HWND) lParam, s_pSelComp->szDisplayName, 80 );
break;
case CBN_CLOSEUP:
case CBN_SELENDCANCEL:
case CBN_DROPDOWN:
case CBN_KILLFOCUS:
if (s_iSelComp >= 0)
{
hComplist = GetDlgItem(hDlg, IDC_COMPTITLE);
GetWindowText( hComplist, s_pSelComp->szDisplayName, countof(s_pSelComp->szDisplayName) );
SendMessage( hComplist, CB_DELETESTRING, s_iSelComp, 0L );
SendMessage( hComplist, CB_INSERTSTRING, s_iSelComp,
(LPARAM) s_pSelComp->szDisplayName);
SendMessage( hComplist, CB_SETCURSEL, s_iSelComp, 0L );
}
break;
case EN_CHANGE:
switch (LOWORD(wParam))
{
case IDE_COMPFILENAME:
if (s_pSelComp) CheckCompType(hDlg, s_pSelComp);
break;
}
break;
}
break;
case WM_NOTIFY:
switch (((NMHDR FAR *) lParam)->code)
{
case PSN_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case PSN_SETACTIVE:
SetBannerText(hDlg);
if (!s_fCustCompInit)
InitCustComponents(hDlg);
else
SetCustComponent(hDlg, s_iSelComp);
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
CheckBatchAdvance(hDlg);
break;
case PSN_WIZBACK:
case PSN_WIZNEXT:
GetCustComponent(hDlg, s_iSelComp);
if (g_nCustComp > 0)
{
if (ISNULL(g_aCustComponents[s_iSelComp].szDisplayName))
{
ErrorMessageBox(hDlg, IDS_NOCUSTCOMPNAME);
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
return TRUE;
}
dwFlags = FC_NONNULL | FC_FILE | FC_EXISTS;
if (!CheckField(hDlg, IDE_COMPFILENAME, dwFlags))
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
return TRUE;
}
if (!IsValidVersion(hDlg, IDE_COMPVERSION))
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
return TRUE;
}
}
SaveCustComponents();
g_iCurPage = PPAGE_CUSTCOMP;
EnablePages();
if (((NMHDR FAR *) lParam)->code == PSN_WIZNEXT) PageNext(hDlg);
else
{
PagePrev(hDlg);
}
break;
case PSN_QUERYCANCEL:
QueryCancel(hDlg);
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
return TRUE;
}
int s_aiIcon[7];
HWND s_hStat,s_hStatus;
extern HWND g_hProgress;
static BOOL s_fComponent = FALSE;
static BOOL s_fNoNet = FALSE;
HWND g_hWait = NULL;
INT_PTR CALLBACK DownloadStatusDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM)
{
RECT dlgRect;
DWORD width, height, left, top;
switch (uMsg)
{
case WM_INITDIALOG:
if (s_fComponent)
{
Animate_Open( GetDlgItem( hDlg, IDC_ANIM ), IDA_DOWNLOAD );
Animate_Play( GetDlgItem( hDlg, IDC_ANIM ), 0, -1, -1 );
InitSysFont(hDlg, IDC_DOWNCOMPNAMD);
InitSysFont(hDlg, IDC_DOWNSTATUS);
g_hProgress = GetDlgItem( hDlg, IDC_PROGRESS );
s_hStatus = GetDlgItem( hDlg, IDC_DOWNSTATUS );
SendMessage(g_hProgress, PBM_SETRANGE, 0, MAKELPARAM(0, 100));
SendMessage(g_hProgress, PBM_SETPOS, 0, 0L);
}
else
{
Animate_Open( GetDlgItem( hDlg, IDC_ANIM ), IDA_GEARS );
Animate_Play( GetDlgItem( hDlg, IDC_ANIM ), 0, -1, -1 );
}
GetWindowRect(hDlg, &dlgRect);
width = dlgRect.right - dlgRect.left;
height = dlgRect.bottom - dlgRect.top;
left = (g_dtRect.right - width)/2;
top = (g_dtRect.bottom - height)/2;
MoveWindow(hDlg, left, top, width, height, TRUE);
break;
case WM_COMMAND:
if ((LOWORD(wParam) == IDCANCEL) && (HIWORD(wParam) == BN_CLICKED)) g_fCancelled = TRUE;
break;
case WM_CLOSE:
g_hProgress = NULL;
s_hStatus = NULL;
EndDialog(hDlg, 0);
break;
default:
return(FALSE);
}
return(TRUE);
}
static HINTERNET s_hInet = NULL;
DWORD g_nTotDown = 0;
HRESULT InetDownloadFile(LPTSTR szTempfile, LPTSTR szUrl, HWND hProgress, int sDownload, LPTSTR szFilename)
{
HRESULT res = NOERROR;
HINTERNET hInetFile = 0;
DWORD dwTotDown = 0;
if (s_hInet == NULL)
s_hInet = InternetOpen(TEXT("Mozilla/4.0 (compatible; MSIE 4.01; Windows NT);IEAKWIZ"),
INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
hInetFile = InternetOpenUrl(s_hInet, szUrl, TEXT("Accept: */*\r\n"), (DWORD)-1,
INTERNET_FLAG_DONT_CACHE, 0);
if (hInetFile != NULL)
{
CHAR szBuf[4096];
DWORD nRead, nWritten;
MSG msg;
DeleteFile(szTempfile);
HANDLE hFile = CreateFile(szTempfile, GENERIC_WRITE, 0, NULL, CREATE_NEW,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) while (1)
{
if (g_fCancelled)
{
res = -1;
break;
}
while (PeekMessage( &msg, s_hStat, 0, 0, PM_REMOVE ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (InternetReadFile(hInetFile, szBuf, sizeof(szBuf), &nRead))
{
if (nRead == 0) break;
WriteFile( hFile, szBuf, nRead, &nWritten, NULL );
dwTotDown += nWritten;
g_nTotDown += nWritten;
if (hProgress != NULL)
{
int iPercent = g_nTotDown / (sDownload * 10);
SendMessage(hProgress, PBM_SETPOS, iPercent, 0L);
SetWindowTextSmart( s_hStatus, szFilename );
}
}
else
{
res = -1;
break;
}
}
//Code Path never called under NT build environment
//causes build error under MSDev: pFilename not defined
/*
#ifdef _DEBUG
if (g_nTotDown)
{
TCHAR szMsg[MAX_PATH];
wnsprintf(szMsg, countof(szMsg), "BRANDME: Wrote %i bytes to %s\r\n", g_nTotDown, pFilename);
OutputDebugString(szMsg);
}
#endif
*/
CloseHandle(hFile);
InternetCloseHandle(hInetFile);
}
else res = -1;
if (dwTotDown < 512)
res = -1;
return(res);
}
INT_PTR CALLBACK DupeSynchDlgProc (HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
int nResult;
switch (iMsg)
{
case WM_INITDIALOG:
SetWindowText(hDlg, (TCHAR *)lParam);
SetTimer(hDlg, 0, 300000, NULL);
return TRUE;
case WM_TIMER:
EndDialog(hDlg, IDIGNORE);
return TRUE;
case WM_COMMAND:
switch (LOWORD (wParam))
{
case IDC_NOTOALL:
nResult = IDIGNORE;
break;
case IDC_YESSYNCH:
nResult = IDYES;
break;
case IDC_NOSYNCH:
default:
nResult = IDNO;
break;
}
EndDialog(hDlg, nResult);
return TRUE;
}
return FALSE;
}
INT_PTR CALLBACK ErrDlgProc (HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
int nResult;
switch (iMsg)
{
case WM_INITDIALOG:
if (GetDlgItem(hDlg, IDC_BADCOMP))
SetDlgItemText(hDlg, IDC_BADCOMP, (TCHAR *)lParam);
else
{
if (GetDlgItem(hDlg, IDC_BADCOMPSEC))
SetDlgItemText(hDlg, IDC_BADCOMPSEC, (TCHAR *)lParam);
}
SetTimer(hDlg, 0, 300000, NULL);
return TRUE;
case WM_TIMER:
EndDialog(hDlg, IDIGNORE);
return TRUE;
case WM_COMMAND:
switch (LOWORD (wParam))
{
case IDC_ERRDLABORT:
nResult = IDABORT;
break;
case IDC_ERRDLRETRY:
case IDC_SECERRYES:
nResult = IDRETRY;
break;
case IDC_SECERRNO:
case IDC_ERRDLIGNORE:
default:
nResult = IDIGNORE;
break;
}
EndDialog(hDlg, nResult);
return TRUE;
}
return FALSE;
}
int DownloadErrMsg(HWND hWnd, LPTSTR szFilename, LPCTSTR lpTemplateName)
{
return (int) DialogBoxParam(g_rvInfo.hInst, lpTemplateName, hWnd, ErrDlgProc, LPARAM(szFilename));
}
HRESULT DownloadCab(HWND hDlg, LPTSTR szUrl, LPTSTR szFilename, LPCTSTR pcszDisplayname, int sComponent, BOOL &fIgnore)
{
HRESULT res = NOERROR;
TCHAR szTempfile[MAX_PATH];
LPTSTR pBack, pDot, pFile, pSlash;
int i, iMsgRes;
StrCpy( szTempfile, szFilename );
pBack = StrRChr(szTempfile, NULL, TEXT('\\'));
pDot = StrRChr(szUrl, NULL, TEXT('.'));
pSlash = StrRChr(szUrl, NULL, TEXT('/'));
StrCpy(pBack, TEXT("\\TEMPFILE"));
if (pDot > pSlash)
StrCat(szTempfile, pDot);
DeleteFile( szTempfile );
if (pcszDisplayname)
{
s_fComponent = TRUE;
SetDlgItemText( s_hStat, IDC_DOWNCOMPNAMD, pcszDisplayname );
}
pFile = StrRChr(szUrl, NULL, TEXT('/'));
if (pFile)
pFile++;
else
pFile = szUrl;
for (i=0; i < 3; i++)
{
res = InetDownloadFile(szTempfile, szUrl, g_hProgress, sComponent, szFilename);
if ((res == NOERROR)||(g_fCancelled))
{
break;
}
}
if ((res != NOERROR)&&(!g_fCancelled))
{
while( (iMsgRes = DownloadErrMsg(hDlg, pFile, MAKEINTRESOURCE(IDD_DOWNLOADERR))) == IDRETRY)
{
res = InetDownloadFile(szTempfile, szUrl, g_hProgress, sComponent, szFilename);
if (res == NOERROR)
{
break;
}
}
if (res != NOERROR)
{
if (iMsgRes == IDABORT)
return res;
else
{
res = NOERROR;
fIgnore = TRUE;
StrCat(g_szFailedComps, pFile);
StrCat(g_szFailedComps, TEXT("\r\n"));
g_fFailedComp = TRUE;
}
}
}
if ((!fIgnore)&&(!g_fCancelled))
{
DeleteFile(szFilename);
res = CheckTrustExWrap(szUrl, szTempfile, hDlg, FALSE, NULL);
if (res != NOERROR)
{
iMsgRes = DownloadErrMsg(hDlg, pFile, MAKEINTRESOURCE(IDD_DOWNLOADSEC));
if (iMsgRes == IDRETRY)
res = NOERROR;
else
{
StrCat(g_szFailedComps, pFile);
StrCat(g_szFailedComps, TEXT("\r\n"));
g_fFailedComp = TRUE;
res = DONT_SHOW_UPDATES;
}
}
if (res == NOERROR)
{
if (!MoveFile( szTempfile, szFilename ))
{
res = 0xffffffff;
}
}
}
DeleteFile(szTempfile);
return(res);
}
void NeedToSetMSTrustKey()
{
static BOOL s_fFirst = TRUE;
HKEY hKey;
DWORD dwTmp;
if (!s_fFirst)
return;
s_fFirst = FALSE;
// Check MS Vendor trust key and set
if (RegOpenKeyEx(HKEY_CURRENT_USER, RK_TRUSTKEY, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
{
for (int i=0; i < countof(s_tkTrustArray); i++)
{
if (RegQueryValueEx( hKey, s_tkTrustArray[i].szTrustString, 0, NULL, NULL, &dwTmp ) == ERROR_SUCCESS)
s_tkTrustArray[i].fSet = FALSE;
}
RegCloseKey(hKey);
}
}
void WriteMSTrustKey(BOOL bSet)
{
HKEY hKey;
if (RegCreateKeyEx(HKEY_CURRENT_USER, RK_TRUSTKEY, 0, NULL, REG_OPTION_NON_VOLATILE,
KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
{
if (bSet)
{
for (int i=0; i < countof(s_tkTrustArray); i++)
{
if (s_tkTrustArray[i].fSet)
RegSetValueEx( hKey, s_tkTrustArray[i].szTrustString, 0, REG_SZ,
(LPBYTE)s_tkTrustArray[i].szCompanyName, sizeof(s_tkTrustArray[i].szCompanyName) );
}
}
else
{
for (int i=0; i < countof(s_tkTrustArray); i++)
{
if (s_tkTrustArray[i].fSet)
RegDeleteValue( hKey, s_tkTrustArray[i].szTrustString );
}
}
RegCloseKey(hKey);
}
}
void AnyCompSelected(HWND hDlg, BOOL &fSel, BOOL &fSizeChange) //---- Blue and Brown components change size, and
{ // need to know to grey out synchronize button
HWND hCompList = GetDlgItem(hDlg, IDC_COMPLIST);
fSel = FALSE;
fSizeChange = FALSE;
PCOMPONENT pComp;
for (pComp = g_paComp; ; pComp++ )
{
if (!pComp || (!(*pComp->szSection))) break;
if (ListView_GetItemState(hCompList, pComp->iList, LVIS_SELECTED) & LVIS_SELECTED)
if ((BLUE2 == pComp->iImage) || (BROWN2 == pComp->iImage))
fSizeChange = TRUE;
else
fSel = TRUE;
}
}
BOOL AnyCompSelected(HWND hDlg)
{
HWND hCompList = GetDlgItem(hDlg, IDC_COMPLIST);
PCOMPONENT pComp;
for (pComp = g_paComp; ; pComp++ )
{
if (!pComp || (!(*pComp->szSection))) break;
if ((BLUE2 != pComp->iImage) && (BROWN2 != pComp->iImage))
if (ListView_GetItemState(hCompList, pComp->iList, LVIS_SELECTED) & LVIS_SELECTED)
return TRUE;
}
return FALSE;
}
void WriteModesToCif(CCifRWComponent_t * pCifRWComponent_t, LPCTSTR pcszModes)
{
int i;
TCHAR szCommaModes[32];
if (pcszModes == NULL || ISNULL(pcszModes))
szCommaModes[0] = TEXT('\0');
else
{
for (i = 0; pcszModes[i]; i++)
{
szCommaModes[i*2] = pcszModes[i];
szCommaModes[(i*2)+1] = TEXT(',');
}
szCommaModes[(i*2)-1] = TEXT('\0');
}
pCifRWComponent_t->SetModes(szCommaModes);
}
void writeToCifFile(PCOMPONENT pComp, LPTSTR szCifNew)
{
ICifRWComponent* pCifRWComponent;
CCifRWComponent_t* pCifRWComponent_t;
LPTSTR pszSection;
DWORD dwVer, dwBuild;
g_lpCifRWFile->CreateComponent(pComp->szSection, &pCifRWComponent);
pCifRWComponent_t = new CCifRWComponent_t(pCifRWComponent);
pCifRWComponent_t->CopyComponent(szCifNew);
WriteModesToCif(pCifRWComponent_t, pComp->szModes);
delete pCifRWComponent_t;
g_lpCifRWFileVer->CreateComponent(pComp->szSection, &pCifRWComponent);
pCifRWComponent_t = new CCifRWComponent_t(pCifRWComponent);
pCifRWComponent_t->CopyComponent(szCifNew);
pCifRWComponent_t->GetVersion(&dwVer, &dwBuild);
delete pCifRWComponent_t;
ConvertDwordsToVersionStr(pComp->szVersion, dwVer, dwBuild);
pszSection = pComp->pszAVSDupeSections;
while (pszSection != NULL)
{
if ((pComp = FindComp(pszSection, FALSE)) != NULL)
{
g_lpCifRWFile->CreateComponent(pComp->szSection, &pCifRWComponent);
pCifRWComponent_t = new CCifRWComponent_t(pCifRWComponent);
pCifRWComponent_t->CopyComponent(szCifNew);
WriteModesToCif(pCifRWComponent_t, pComp->szModes);
delete pCifRWComponent_t;
g_lpCifRWFileVer->CreateComponent(pComp->szSection, &pCifRWComponent);
pCifRWComponent_t = new CCifRWComponent_t(pCifRWComponent);
pCifRWComponent_t->CopyComponent(szCifNew);
pCifRWComponent_t->GetVersion(&dwVer, &dwBuild);
delete pCifRWComponent_t;
ConvertDwordsToVersionStr(pComp->szVersion, dwVer, dwBuild);
}
pszSection = StrChr(pszSection, TEXT(','));
if (pszSection != NULL)
pszSection++;
}
}
void updateCifVersions32(PCOMPONENT pComp, BOOL fIgnore, BOOL fUpdate)
{
TCHAR szCifPath[MAX_PATH];
if ((!fUpdate) && (BLUE2 != pComp->iImage) && (BROWN2 != pComp->iImage))
if (fIgnore)
pComp->iImage = YELLOW;
else
pComp->iImage = GREEN;
//---- use other ieupdate.cif for updates
if ((fUpdate) || (BLUE2 == pComp->iImage) || (BROWN2 == pComp->iImage)) {
PathCombine(szCifPath, g_szIEAKProg, TEXT("update\\ieupdate.cif"));
writeToCifFile(pComp, szCifPath);
}
else
writeToCifFile(pComp, s_szCifNew);
}
static s_fNoToAllSynch;
void DownloadComponent32(HWND hDlg, PCOMPONENT pComp, HWND hCompList, BOOL &g_fCancelled,
BOOL &fOk, BOOL &fDownloaded, BOOL &fIgnore, BOOL fAll)
{
TCHAR szUrl[INTERNET_MAX_URL_LENGTH];
TCHAR szCompUrl[INTERNET_MAX_URL_LENGTH];
TCHAR szLocalPath[MAX_PATH];
TCHAR szUpdateCif[MAX_PATH];
LPTSTR pCab;
LV_ITEM lvItem;
CCifFile_t* pCifFile = NULL;
ICifComponent * pCifComponent = NULL;
CCifComponent_t * pCifComponent_t;
UINT uiIndex = 0;
DWORD dwFlags;
TCHAR tchType = '\0';
int iRet = IDYES;
UNREFERENCED_PARAMETER(tchType);
if ((BLUE2 == pComp->iImage) || (BROWN2 == pComp->iImage)) {
StrCpy(szUpdateCif, g_szIEAKProg);
PathAppend(szUpdateCif, TEXT("\\update\\ieupdate.cif"));
if (!PathFileExists(szUpdateCif))
return;
GetICifFileFromFile_t(&pCifFile, szUpdateCif);
if (g_fCancelled || (FAILED(pCifFile->FindComponent(pComp->szSection, &pCifComponent))))
return;
}
else
if (g_fCancelled || (FAILED(g_lpCifFileNew->FindComponent(pComp->szSection, &pCifComponent))))
return;
pCifComponent_t = new CCifComponent_t((ICifRWComponent *)pCifComponent);
// pComp->fIEDependency is used as a guard against circular dependencies here
if (!pComp->fIEDependency && !pComp->fAVSDupe)
{
pComp->fIEDependency = TRUE;
//--- now BLUE2 and BROWN2 also mean that the component has already been downloaded
if (((pComp->iImage != GREEN) && (pComp->iImage != BLUE2) && (pComp->iImage != BROWN2)) ||
(!fAll && !s_fNoToAllSynch && (( iRet = (int) DialogBoxParam(g_rvInfo.hInst, MAKEINTRESOURCE(IDD_DUPESYNCH),
s_hStat, DupeSynchDlgProc, (LPARAM)pComp->szDisplayName)) == IDYES)))
{
while (SUCCEEDED(pCifComponent_t->GetUrl(uiIndex, szUrl, countof(szUrl), &dwFlags)))
{
if (dwFlags & URLF_RELATIVEURL)
{
StrCpy(szCompUrl, g_szBaseURL);
StrCat(szCompUrl, TEXT("/"));
StrCat(szCompUrl, szUrl);
pCab = szUrl;
}
else
{
StrCpy(szCompUrl, szUrl);
pCab = StrRChr(szUrl, NULL, TEXT('/'));
if (pCab)
pCab++;
else
pCab = szUrl;
}
PathCombine(szLocalPath, g_szIEAKProg, pCab);
if (pComp->dwSize)
{
if(StrCmpI(pCab, TEXT("oem.cab"))) //special case out the OEMInstall cab
{
if (DownloadCab(s_hStat, szCompUrl, szLocalPath, pComp->szDisplayName, pComp->dwSize, fIgnore)
!= NOERROR)
{
fOk = FALSE;
g_fCancelled = TRUE;
}
else
if ((BLUE2 == pComp->iImage) || (BROWN2 == pComp->iImage)) {
pComp->iImage = GREEN;
updateCifVersions32(pComp, fIgnore);
}
fDownloaded = TRUE;
}
}
if (g_fCancelled) break;
uiIndex++;
}
}
else //we are not downloading this cab because it's already downloaded
{
//process window messages, so we pick up messages like cancel for download status popup
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
if (iRet == IDIGNORE)
s_fNoToAllSynch = TRUE;
if (!g_fCancelled)
{
if (fIgnore)
pComp->iImage = YELLOW;
else
if ((BLUE2 != pComp->iImage) && (BROWN2 != pComp->iImage))
pComp->iImage = GREEN;
uiIndex = 0;
while (SUCCEEDED(pCifComponent_t->GetDependency(uiIndex, szLocalPath, countof(szLocalPath), &tchType, NULL, NULL)))
{
PCOMPONENT pDepComp;
pDepComp = FindComp(szLocalPath, FALSE);
if (pDepComp && (pDepComp->iCompType == COMP_OPTIONAL))
{
DownloadComponent32(hDlg, pDepComp, hCompList, g_fCancelled, fOk, fDownloaded, fIgnore, fAll);
if (g_fCancelled)
break;
}
uiIndex++;
}
}
if (g_fCancelled)
{
pComp->iImage = RED;
if ((pComp->iCompType == COMP_OPTIONAL) && (pComp->iPlatform <= PLAT_W98)
&& pComp->fVisible)
{
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_IMAGE;
lvItem.iItem = pComp->iList;
ListView_GetItem(hCompList, &lvItem);
lvItem.iImage = RED;
lvItem.mask = LVIF_IMAGE;
lvItem.iItem = pComp->iList;
ListView_SetItem(hCompList, &lvItem);
ListView_SetItemText(hCompList, pComp->iList, 1, TEXT(""));
}
if (SUCCEEDED(pCifComponent_t->GetUrl(0, szUrl, countof(szUrl), &dwFlags)))
{
if (dwFlags & URLF_RELATIVEURL)
{
pCab = szUrl;
}
else
{
pCab = StrRChr(szUrl, NULL, TEXT('/'));
if (pCab)
pCab++;
else
pCab = szUrl;
}
PathCombine(szLocalPath, g_szIEAKProg, pCab);
DeleteFile(szLocalPath);
}
return;
}
updateCifVersions32(pComp, fIgnore);
if (pComp->fVisible && ((pComp->iCompType != COMP_OPTIONAL) || (pComp->iPlatform <= PLAT_W98)))
{
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_IMAGE;
lvItem.iItem = pComp->iList;
ListView_GetItem(hCompList, &lvItem);
if ((BLUE2 == pComp->iImage) || (BROWN2 == pComp->iImage))
lvItem.iImage = pComp->iImage;
else
if (fIgnore)
lvItem.iImage = YELLOW;
else
lvItem.iImage = GREEN;
lvItem.mask = LVIF_IMAGE;
lvItem.iItem = pComp->iList;
ListView_SetItem(hCompList, &lvItem);
ListView_SetItemText(hCompList, pComp->iList, 1, pComp->szVersion);
}
}
delete pCifComponent_t;
}
void DownloadComponent(HWND hDlg, PCOMPONENT pComp, HWND hCompList, BOOL &g_fCancelled,
BOOL &fOk, BOOL &fDownloaded, BOOL &fIgnore, BOOL fAll)
{
PCOMPONENT pCompTemp;
for (pCompTemp = g_paComp; *pCompTemp->szSection; pCompTemp++)
pCompTemp->fIEDependency = FALSE;
DownloadComponent32(hDlg, pComp, hCompList, g_fCancelled, fOk, fDownloaded, fIgnore, fAll);
}
BOOL IsCheyenneSoftwareRunning(HWND hDlg)
{
if (FindWindow(NULL, TEXT("Inoculan Realtime Manager")) ||
FindWindow(NULL, TEXT("Cheyenne ANtiVirus Realtime Monitor")))
{
TCHAR szMsgBoxText[MAX_PATH];
LoadString( g_rvInfo.hInst, IDS_VIRUSPROGRAMRUNNING, szMsgBoxText, countof(szMsgBoxText) );
MessageBox(hDlg, szMsgBoxText, g_szTitle, MB_OK);
return TRUE;
}
return FALSE;
}
void ProcessDownload(HWND hDlg, BOOL fAll)
{
HWND hCompList = GetDlgItem(hDlg, IDC_COMPLIST);
TCHAR szWrk[MAX_PATH];
PCOMPONENT pComp;
BOOL fDownloaded;
BOOL fIgnore = FALSE;
if (IsCheyenneSoftwareRunning(hDlg))
return;
g_fCancelled = FALSE;
s_fComponent = TRUE;
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
s_hStat = CreateDialog( g_rvInfo.hInst, MAKEINTRESOURCE(IDD_DOWNLOAD), NULL,
DownloadStatusDlgProc );
ShowWindow( s_hStat, SW_SHOWNORMAL );
g_fFailedComp = FALSE;
LoadString( g_rvInfo.hInst, IDS_DOWNLOADLIST_ERROR, g_szFailedCompsMsg, countof(g_szFailedCompsMsg) );
for (pComp = g_paComp; ; pComp++ )
if ((BROWN2 != pComp->iImage) && (BLUE2 != pComp->iImage))
{
LV_ITEM lvItem;
BOOL fOk = TRUE;
DWORD dwDestFree;
PCOMPONENT pSearchComp;
fDownloaded = FALSE;
ZeroMemory(&lvItem,sizeof(lvItem));
if (ISNULL(pComp->szSection)) break;
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
lvItem.stateMask = LVIS_SELECTED;
lvItem.iItem = pComp->iList;
ListView_GetItem(hCompList, &lvItem);
if (!fAll)
{
if ((pComp->iList == 0) && (pComp->iCompType == COMP_OPTIONAL)) continue;
if ((lvItem.state & LVIS_SELECTED) == 0) continue;
}
// BUGBUG fix once we do Alpha version
if (pComp->iPlatform == PLAT_ALPHA) continue;
SetDlgItemText( s_hStat, IDC_DOWNCOMPNAMD, pComp->szDisplayName );
g_nTotDown = 0;
StrCpy(szWrk, g_szIEAKProg);
dwDestFree = GetRootFree(szWrk);
if (dwDestFree < pComp->dwSize)
{
TCHAR szTitle[MAX_PATH];
TCHAR szTemplate[MAX_PATH];
TCHAR szMsg[MAX_PATH];
LoadString( g_rvInfo.hInst, IDS_DISKERROR, szTitle, MAX_PATH );
LoadString( g_rvInfo.hInst, IDS_TEMPDISKMSG, szTemplate, MAX_PATH );
wnsprintf(szMsg, countof(szMsg), szTemplate, dwDestFree, (pComp->dwSize));
MessageBox(NULL, szMsg, szTitle, MB_OK | MB_SETFOREGROUND);
DestroyWindow(s_hStat);
return;
}
fIgnore = FALSE;
DownloadComponent(hDlg, pComp, hCompList, g_fCancelled, fOk, fDownloaded, fIgnore, fAll);
/*
if (*(pComp->piPatchInfo.szSection)) // download patch files
{
DownloadComponent(pComp->piPatchInfo.szSection, pComp->szDisplayName, pComp->piPatchInfo.dwSize, g_fCancelled, fOk, fDownloaded, fIgnore, fAll);
if (fOk)
{
TCHAR szSectBuf[1024];
GetPrivateProfileSection( pComp->piPatchInfo.szSection, szSectBuf, countof(szSectBuf), s_szCifNew );
WritePrivateProfileSection( pComp->piPatchInfo.szSection, szSectBuf, g_szCif );
}
}
*/
if (!fAll && fDownloaded && !g_fCancelled && (pComp->iCompType == COMP_OPTIONAL))
{
// search to download comp on other platforms
for (pSearchComp = g_paComp; ; pSearchComp++)
{
if (ISNULL(pSearchComp->szSection)) break;
if ((StrCmpI(pSearchComp->szDisplayName, pComp->szDisplayName) == 0)
&& (pSearchComp != pComp))
{
SetDlgItemText( s_hStat, IDC_DOWNCOMPNAMD, pSearchComp->szDisplayName );
g_nTotDown = 0;
StrCpy(szWrk, g_szIEAKProg);
dwDestFree = GetRootFree(szWrk);
if (dwDestFree < pSearchComp->dwSize)
{
TCHAR szTitle[MAX_PATH];
TCHAR szTemplate[MAX_PATH];
TCHAR szMsg[MAX_PATH];
LoadString( g_rvInfo.hInst, IDS_DISKERROR, szTitle, MAX_PATH );
LoadString( g_rvInfo.hInst, IDS_TEMPDISKMSG, szTemplate, MAX_PATH );
wnsprintf(szMsg, countof(szMsg), szTemplate, dwDestFree, (pSearchComp->dwSize));
MessageBox(NULL, szMsg, szTitle, MB_OK | MB_SETFOREGROUND);
DestroyWindow(s_hStat);
return;
}
DownloadComponent(hDlg, pSearchComp, hCompList, g_fCancelled, fOk, fDownloaded, fIgnore, fAll);
if (g_fCancelled) break;
/* if (*(pSearchComp->piPatchInfo.szSection)) // download patch files
{
DownloadComponent(pSearchComp->piPatchInfo.szSection, pSearchComp->szDisplayName,
pSearchComp->piPatchInfo.dwSize, g_fCancelled, fOk, fDownloaded, fIgnore);
if (fOk)
{
TCHAR szSectBuf[1024];
GetPrivateProfileSection( pSearchComp->piPatchInfo.szSection, szSectBuf, countof(szSectBuf), s_szCifNew );
WritePrivateProfileSection( pSearchComp->piPatchInfo.szSection, szSectBuf, g_szCif );
}
}*/
if (g_fCancelled) break;
if (fOk)
updateCifVersions32(pSearchComp, fIgnore);
}
}
}
if (fOk && !g_fCancelled)
{
PCOMPONENT pListComp = pComp;
if (pComp->iCompType != COMP_OPTIONAL)
{
s_fNoCore = FALSE;
pListComp = FindComp(NULL, TRUE);
}
if (fIgnore)
lvItem.iImage = pComp->iImage = YELLOW;
else
if ((BLUE2 == pComp->iImage) || (BROWN2 == pComp->iImage))
lvItem.iImage = pComp->iImage;
else
lvItem.iImage = pComp->iImage = GREEN;
lvItem.mask = LVIF_IMAGE;
lvItem.iItem = pListComp->iList;
ListView_SetItem(hCompList, &lvItem);
updateCifVersions32(pComp, fIgnore);
// Do not try to set the version field for NT optional components or invisible
// components for win32 since their iList fields will be zeroed
if (((pComp->fVisible || (StrCmpI(pComp->szSection, BASEWIN32) == 0)) &&
((pComp->iCompType != COMP_OPTIONAL) || (pComp->iPlatform <= PLAT_W98))))
ListView_SetItemText(hCompList, pListComp->iList, 1, pListComp->szVersion);
}
else
{
TCHAR szUrl[MAX_PATH];
LPTSTR pUrl = szUrl;
TCHAR szLocalPath[MAX_PATH];
ICifComponent * pCifComponent;
CCifComponent_t * pCifComponent_t;
HRESULT hr;
DWORD dwFlags;
if (pComp->iCompType != COMP_OPTIONAL)
{
s_fNoCore = TRUE;
pComp = FindComp(NULL, TRUE);
}
if ((pComp->iImage != BROWN2) && (pComp->iImage != BLUE2)) {
lvItem.iImage = pComp->iImage = RED;
lvItem.mask = LVIF_IMAGE;
lvItem.iItem = pComp->iList;
ListView_SetItem(hCompList, &lvItem);
ListView_SetItemText(hCompList, pComp->iList, 1, TEXT(""));
}
if (!(SUCCEEDED(g_lpCifFileNew->FindComponent(pComp->szSection, &pCifComponent))))
break;
pCifComponent_t = new CCifComponent_t((ICifRWComponent *)pCifComponent);
hr = pCifComponent_t->GetUrl(0, szUrl, countof(szUrl), &dwFlags);
delete pCifComponent_t;
if (!(SUCCEEDED(hr)))
break;
if (!(dwFlags & URLF_RELATIVEURL))
{
pUrl = StrRChr(szUrl, NULL, TEXT('/'));
if (pUrl)
pUrl++;
else
pUrl = szUrl;
}
PathCombine(szLocalPath, g_szIEAKProg, pUrl);
DeleteFile(szLocalPath);
break;
}
}
DestroyWindow(s_hStat);
}
void SetCompRevDependList(PCOMPONENT pComp, CCifComponent_t * pCifComponent_t)
{
UINT uiIndex = 0;
PCOMPONENT pCompTemp;
ICifComponent * pCifCompNew;
TCHAR szID[128];
TCHAR tchType;
while (SUCCEEDED(pCifComponent_t->GetDependency(uiIndex, szID, countof(szID), &tchType, NULL, NULL)))
{
if ((pComp->iCompType != COMP_OPTIONAL) ||
(StrCmpNI(szID, TEXT("BASEIE40"), 8) == 0))
{
uiIndex++;
continue;
}
pCompTemp = FindComp(szID, FALSE);
if (pCompTemp)
{
int i;
BOOL fSet = FALSE;
if (pCompTemp->fIEDependency)
{
uiIndex++;
continue;
}
pCompTemp->fIEDependency = TRUE;
for (i=0; (i < 10) && pCompTemp->paCompRevDeps[i]; i++)
{
if (pCompTemp->paCompRevDeps[i] == pComp)
fSet = TRUE;
}
if (!fSet && i < 10)
pCompTemp->paCompRevDeps[i] = pComp;
}
if (SUCCEEDED(g_lpCifFileNew->FindComponent(szID, &pCifCompNew)))
{
CCifComponent_t * pCifCompNew_t =
new CCifComponent_t((ICifRWComponent *)pCifCompNew);
SetCompRevDependList(pComp, pCifCompNew_t);
delete pCifCompNew_t;
}
uiIndex++;
}
}
void BuildReverseDependencyList(IEnumCifComponents * pEnumCifComponents)
{
PCOMPONENT pComp;
ICifComponent * pCifComponent;
TCHAR szID[128];
while (pEnumCifComponents->Next(&pCifComponent) == S_OK)
{
CCifComponent_t * pCifComponent_t =
new CCifComponent_t((ICifRWComponent *)pCifComponent);
pCifComponent_t->GetID(szID, countof(szID));
pComp = FindComp(szID, FALSE);
if (pComp)
{
PCOMPONENT pCompTemp;
for (pCompTemp = g_paComp; *pCompTemp->szSection; pCompTemp++)
pCompTemp->fIEDependency = FALSE;
pComp->fIEDependency = TRUE;
SetCompRevDependList(pComp, pCifComponent_t);
}
delete pCifComponent_t;
}
}
void GetUpdateSite() {
TCHAR szLang[8], szURL[MAX_URL], szMsg[MAX_PATH];
CHAR szSiteDataA[MAX_PATH];
int i, j;
DWORD dwErr;
IDownloadSiteMgr* pSiteMgr = NULL;
IDownloadSite* pISite = NULL;
DOWNLOADSITE* pSite;
LoadString(g_rvInfo.hInst, IDS_AVSUPDATEINITFAIL, szMsg, countof(szMsg));
for (j=0; s_szSiteData[j]; j++);
for (i=j; (i>0) && ('/' != s_szSiteData[i]); i--);
StrNCpy(g_szUpdateData, (LPCWSTR) s_szSiteData, i+1);
StrCat(g_szUpdateData, TEXT("/IEUPDATE.DAT"));
dwErr = CoCreateInstance(CLSID_DownloadSiteMgr, NULL, CLSCTX_INPROC_SERVER,
IID_IDownloadSiteMgr, (void **) &pSiteMgr);
do {
dwErr = pSiteMgr->Initialize(T2Abux(g_szUpdateData, szSiteDataA), NULL);
}
while ((dwErr != NOERROR) && (MessageBox(g_hDlg, szMsg, g_szTitle, MB_RETRYCANCEL) == IDRETRY));
for (i=0; i<NUMSITES; i++) {
pSiteMgr->EnumSites(i, &pISite);
if (!pISite) break;
pISite->GetData(&pSite);
A2Tbux(pSite->pszLang, szLang);
if (0 == StrCmpI(szLang, g_szActLang)) {
A2Tbux(pSite->pszUrl, szURL);
StrCpy(g_szUpdateURL, szURL);
break;
}
}
if (pSiteMgr)
pSiteMgr->Release();
if (pISite)
pISite->Release();
}
DWORD InitOptComponents32(LPVOID)
{
HWND hDlg = g_hWizard;
int iItem = 0;
HWND hCompList = GetDlgItem(hDlg, IDC_COMPLIST);
LV_ITEM lvItemMessage;
TCHAR szBuf[8];
DWORD dwType;
HRESULT hr;
PCOMPONENT pComp;
PCOMP_VERSION pCompVer;
BOOL fNeedCore = TRUE;
TCHAR szCifName[32];
TCHAR * lpszProgressMsg;
CoInitialize(NULL);
lpszProgressMsg=(TCHAR *) LocalAlloc(LPTR, MAX_PATH * sizeof(TCHAR));
ResetEvent(g_hCifEvent);
NeedToSetMSTrustKey();
WriteMSTrustKey(TRUE); // Mark MS as a trusted provider
if(!g_fOCW)
{
CreateDirectory( g_szIEAKProg, NULL );
}
StrCpy(szCifName, TEXT("IESetup.CIF"));
PathCombine(g_szCif, g_szBuildRoot, TEXT("INS"));
PathAppend(g_szCif, GetOutputPlatformDir());
PathAppend(g_szCif, g_szLanguage);
PathAppend(g_szCif, szCifName);
s_dwTotalSize = 0;
ListView_DeleteAllItems(hCompList);
ListView_DeleteColumn(hCompList, 1);
ListView_DeleteColumn(hCompList, 0);
s_fNoCore = FALSE;
InitAVSListView(hCompList); //----- assign image list and create columns
LoadString(g_rvInfo.hInst,IDS_COMPINITDOWNLOAD,lpszProgressMsg,MAX_PATH);
ZeroMemory(&lvItemMessage, sizeof(lvItemMessage));
lvItemMessage.mask = LVIF_TEXT | LVIF_IMAGE;
lvItemMessage.iItem = iItem;
lvItemMessage.pszText = lpszProgressMsg;
lvItemMessage.iImage = YELLOW;
ListView_InsertItem(hCompList, &lvItemMessage);
StrCpy(szBuf, g_szLanguage + 1);
szBuf[lstrlen(szBuf) - 1] = 0;
StrCpy(s_szCifCabURL, g_szBaseURL);
StrCat(s_szCifCabURL, TEXT("/IECIF.CAB"));
StrCpy(g_szCifVer, g_szIEAKProg);
PathAppend(g_szCifVer, TEXT("IEsetup.cif"));
StrCpy(s_szCifNew, g_szIEAKProg);
PathAppend(s_szCifNew, TEXT("new"));
CreateDirectory( s_szCifNew, NULL );
PathAppend(s_szCifNew, TEXT("IEsetup.cif"));
if ((!s_fNoNet)&&(!g_fLocalMode))
{
BOOL fIgnore = FALSE;
TCHAR szCifCabDest[MAX_PATH * 4]; //part of fix for bug 13454--trap on long file path. Rest of fix is not to allow ridiculous paths.
if (g_fBatch2)
{
//batch2 mode we don't download the cab, we copy the cif.
PathCombine(s_szCifCabURL, g_szBaseURL, TEXT("INS"));
PathAppend(s_szCifCabURL, GetOutputPlatformDir());
PathAppend(s_szCifCabURL, g_szLanguage);
PathAppend(s_szCifCabURL, szCifName);
PathCombine(szCifCabDest, g_szIEAKProg, TEXT("new\\IEsetup.cif"));
if (CopyFile(s_szCifCabURL, szCifCabDest, FALSE))
hr = NOERROR;
else
hr = -1;
}
else
{
if (!PathCombine(szCifCabDest, g_szIEAKProg, TEXT("new\\IECIF.CAB")))
{
//error in path combine, probably due to overly long path on win98
//user can't continue
ErrorMessageBox(hDlg, IDS_ERR_PATH);
ListView_DeleteItem(hCompList, iItem);
LocalFree(lpszProgressMsg);
SetEvent(g_hCifEvent);
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
PostMessage( g_hDlg, IDM_INITIALIZE, 0, 0 );
g_fOptCompInit = TRUE;
s_fNoCore = TRUE;
CoUninitialize();
return(0);
}
hr = DownloadCab(hDlg, s_szCifCabURL, szCifCabDest, NULL, 0, fIgnore);
if (hr == NOERROR)
{
TCHAR szCifCabFilesDest[MAX_PATH * 4];
PathCombine(szCifCabFilesDest, g_szIEAKProg, TEXT("new"));
hr = ExtractFilesWrap(szCifCabDest, szCifCabFilesDest, 0, NULL, NULL, 0);
}
}
if (hr != NOERROR)
{
if (!PathFileExists(g_szCifVer))
{
ListView_DeleteItem(hCompList, iItem);
LocalFree(lpszProgressMsg);
SetEvent(g_hCifEvent);
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
PostMessage( g_hDlg, IDM_INITIALIZE, 0, 0 );
g_fOptCompInit = TRUE;
s_fNoCore = TRUE;
CoUninitialize();
return(0);
}
s_fNoNet = TRUE;
g_fLocalMode = TRUE;
}
}
if (!PathFileExists(g_szCifVer))
{
TCHAR szVerCifCab[MAX_PATH* 4];
PathCombine(szVerCifCab, g_szIEAKProg, TEXT("IECIF.CAB"));
// if there is an iecif.cab in the source dir then extract the cif and assume it's valid
if (!PathFileExists(szVerCifCab) ||
(ExtractFilesWrap(szVerCifCab, g_szIEAKProg, 0, NULL, NULL, 0) != NOERROR))
{
TCHAR szTemp[MAX_PATH* 4];
WIN32_FIND_DATA fd;
HANDLE hFind;
PathCombine(szTemp, g_szIEAKProg, TEXT("*.cab"));
if ((hFind = FindFirstFile(szTemp, &fd)) != INVALID_HANDLE_VALUE)
{
// delete all files in download directory if no versioning cif found, this is for
// overinstalls
LoadString(g_rvInfo.hInst, IDS_OLD_CABS, szTemp, countof(szTemp));
FindClose(hFind);
if (MessageBox(hDlg, szTemp, g_szTitle, MB_YESNO) == IDYES)
{
PathRemovePath(g_szIEAKProg, ADN_DONT_DEL_SUBDIRS);
}
else
{
ListView_DeleteItem(hCompList, iItem);
LocalFree(lpszProgressMsg);
SetEvent(g_hCifEvent);
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
PostMessage( g_hDlg, IDM_INITIALIZE, 0, 0 );
g_fOptCompInit = g_fLocalMode = TRUE;
s_fNoCore = TRUE;
CoUninitialize();
return(0);
}
}
CopyFile(s_szCifNew, g_szCifVer, FALSE);
}
}
if (!PathFileExists(g_szCif))
CopyFile(g_szCifVer, g_szCif, FALSE);
if (s_fNoNet||g_fLocalMode)
StrCpy(s_szCifNew, g_szCifVer);
ListView_DeleteItem(hCompList, iItem);
LoadString(g_rvInfo.hInst,IDS_COMPINITPROCESSING,lpszProgressMsg,MAX_PATH);
lvItemMessage.pszText = lpszProgressMsg;
ListView_InsertItem(hCompList, &lvItemMessage);
// create our cif objects
if (g_lpCifFileNew)
{
delete g_lpCifFileNew;
g_lpCifFileNew = NULL;
}
hr = GetICifFileFromFile_t(&g_lpCifFileNew, s_szCifNew);
if (SUCCEEDED(hr))
{
if (g_lpCifRWFile)
{
delete g_lpCifRWFile;
g_lpCifRWFile = NULL;
}
hr = GetICifRWFileFromFile_t(&g_lpCifRWFile, g_szCif);
if (SUCCEEDED(hr))
{
if (g_lpCifRWFileVer)
{
delete g_lpCifRWFileVer;
g_lpCifRWFileVer = NULL;
}
hr = GetICifRWFileFromFile_t(&g_lpCifRWFileVer, g_szCifVer);
}
}
SetEvent(g_hCifEvent);
// wait for the opt cab download attempt so we can block if there were problems
while (MsgWaitForMultipleObjects(1, &g_hProcessInfEvent, FALSE, INFINITE, QS_ALLINPUT) != WAIT_OBJECT_0)
{
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
if (!PathFileExists(g_szMastInf)) // if iesetup.inf doesn't exist in the opt dir, then it
{ // means the opt cab was not downloaded/extracted successfully
// we should not let the user continue
ErrorMessageBox(hDlg, IDS_OPTCAB_ERROR);
ListView_DeleteItem(hCompList, iItem);
LocalFree(lpszProgressMsg);
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
PostMessage( g_hDlg, IDM_INITIALIZE, 0, 0 );
g_fOptCompInit = g_fLocalMode = TRUE;
s_fNoCore = TRUE;
CoUninitialize();
return(0);
}
ListView_DeleteItem(hCompList, iItem);
if (SUCCEEDED(hr))
{
IEnumCifComponents *pEnumCifComponents = NULL;
ICifRWComponent * pCifRWComponent;
ICifComponent *pCifComponent = NULL;
if (SUCCEEDED(hr))
{
// currently not showing alpha comps
hr = g_lpCifFileNew->EnumComponents(&pEnumCifComponents,
PLATFORM_WIN98 | PLATFORM_NT4 | PLATFORM_NT5 | PLATFORM_MILLEN, NULL);
if (0 != g_uiNumCabs)
g_uiNumCabs = 0;
while (pEnumCifComponents->Next(&pCifComponent) == S_OK)
g_uiNumCabs++;
//bug 17727: we need to allocate enough memory to hold the updated components as well, which is
//why there is so much extra
pComp=g_paComp=(PCOMPONENT) LocalAlloc(LPTR, ((g_uiNumCabs*3) + 100) * sizeof(COMPONENT));
pCompVer=g_rgCompVer=(PCOMP_VERSION) LocalAlloc(LPTR, ((g_uiNumCabs*3) + 100) * sizeof(COMP_VERSION));
iItem=0; //reset iItem for filling in the list box
pEnumCifComponents->Reset();
while(pEnumCifComponents->Next(&pCifComponent) == S_OK)
{
ICifComponent * pCifComponentTemp;
TCHAR szVerNew[32];
TCHAR szPatchVerNew[32];
TCHAR szIEAKVer[32] = TEXT("");
TCHAR szIEAKVerNew[32];
TCHAR szCustData[MAX_PATH];
TCHAR szID[128];
TCHAR szMode[MAX_PATH];
UINT uiIndex;
DWORD dwVer, dwBuild, dwPlatform;
CCifComponent_t * pCifComponent_t =
new CCifComponent_t((ICifRWComponent *)pCifComponent);
// ignore components that aren't in a group
if (FAILED(pCifComponent_t->GetGroup(szID, countof(szID))))
{
delete pCifComponent_t;
g_uiNumCabs--;
continue;
}
pComp->fVisible = (pCifComponent_t->IsUIVisible() == S_FALSE) ? FALSE : TRUE;
dwPlatform = pCifComponent_t->GetPlatform();
if (dwPlatform & PLATFORM_WIN98)
{
if (dwPlatform & PLATFORM_NT4)
pComp->iPlatform = PLAT_I386;
else
pComp->iPlatform = PLAT_W98;
}
else
pComp->iPlatform = PLAT_NTx86;
pCifComponent_t->GetID(szID, countof(szID));
StrCpy(pCompVer->szID, szID);
// do not read in the branding.cab entry for microsoft.com
if (StrCmpI(szID, TEXT("BRANDING.CAB")) == 0)
{
ZeroMemory(pComp, sizeof(COMPONENT));
delete pCifComponent_t;
g_uiNumCabs--;
continue;
}
// do not read in exluded components in all modes(128Update) or
// ISP excluded components(IE4SHELL) or corp excluded comps
if (((SUCCEEDED(pCifComponent_t->GetCustomData(TEXT("IEAKExclude"), szCustData, countof(szCustData))))
&& (szCustData[0] == TEXT('1'))) ||
(!g_fIntranet && (SUCCEEDED(pCifComponent_t->GetCustomData(TEXT("IEAKISPExclude"), szCustData, countof(szCustData))))
&& (szCustData[0] == TEXT('1'))) ||
(g_fIntranet && (SUCCEEDED(pCifComponent_t->GetCustomData(TEXT("IEAKCorpExclude"), szCustData, countof(szCustData))))
&& (szCustData[0] == TEXT('1'))))
{
ZeroMemory(pComp, sizeof(COMPONENT));
delete pCifComponent_t;
continue;
}
// add on only components or IEAK show only components
if ((SUCCEEDED(pCifComponent_t->GetCustomData(TEXT("AddOnOnly"), szCustData, countof(szCustData))))
&& (szCustData[0] == TEXT('1')))
{
pComp->fAddOnOnly = TRUE;
pComp->fVisible = TRUE;
}
if ((SUCCEEDED(pCifComponent_t->GetCustomData(TEXT("IEAKVisible"), szCustData, countof(szCustData))))
&& (szCustData[0] == TEXT('1')))
pComp->fVisible = TRUE;
pCifComponent_t->GetCustomData(TEXT("IEAKVersion"), szIEAKVerNew, countof(szIEAKVerNew));
if (SUCCEEDED(g_lpCifRWFileVer->FindComponent(szID, &pCifComponentTemp)))
{
CCifComponent_t * pCifComponentTemp_t =
new CCifComponent_t((ICifRWComponent *)pCifComponentTemp);
pCifComponentTemp_t->GetVersion(&dwVer, &dwBuild);
ConvertDwordsToVersionStr(pComp->szVersion, dwVer, dwBuild);
pCifComponentTemp_t->GetCustomData(TEXT("IEAKVersion"), szIEAKVer, countof(szIEAKVer));
}
pCifComponent_t->GetVersion(&dwVer, &dwBuild);
ConvertDwordsToVersionStr(szVerNew, dwVer, dwBuild);
StrCpy(pCompVer->szVersion, szVerNew);
uiIndex = 0;
szMode[0] = TEXT('\0');
if (SUCCEEDED(g_lpCifRWFile->FindComponent(szID, &pCifComponentTemp)))
{
CCifComponent_t * pCifComponentTemp_t =
new CCifComponent_t((ICifRWComponent *)pCifComponentTemp);
while (SUCCEEDED(pCifComponentTemp_t->GetMode(uiIndex, szMode, countof(szMode))))
{
pComp->szModes[uiIndex] = szMode[0];
pComp->afInstall[szMode[0] - TEXT('0')] = TRUE;
uiIndex++;
}
delete pCifComponentTemp_t;
}
else
{
while (SUCCEEDED(pCifComponent_t->GetMode(uiIndex, szMode, countof(szMode))))
{
pComp->szModes[uiIndex] = szMode[0];
pComp->afInstall[szMode[0] - TEXT('0')] = TRUE;
uiIndex++;
}
}
pComp->szModes[uiIndex] = TEXT('\0');
if ((SUCCEEDED(pCifComponent_t->GetCustomData(TEXT("IEAKCore"), szCustData, countof(szCustData))))
&& (szCustData[0] == TEXT('1')))
{
pComp->iCompType = COMP_CORE;
pComp->fVisible = FALSE;
}
// pick up special core comps for OCW
if (g_fOCW && (SUCCEEDED(pCifComponent_t->GetCustomData(TEXT("IEAKOCWCore"), szCustData, countof(szCustData))))
&& (szCustData[0] == TEXT('1')))
{
pComp->iCompType = COMP_CORE;
pComp->fVisible = FALSE;
}
if ((SUCCEEDED(pCifComponent_t->GetCustomData(TEXT("IEAKServer"), szCustData, countof(szCustData))))
&& (szCustData[0] == TEXT('1')))
pComp->iCompType = COMP_SERVER;
// IEAK should ignore these components since they point to the same cabs as
// another section
if ((SUCCEEDED(pCifComponent_t->GetCustomData(TEXT("IEAKAVSIgnore"), szCustData, countof(szCustData))))
&& (szCustData[0] == TEXT('1')))
{
pComp->fAVSDupe = TRUE;
pComp->fVisible = FALSE;
}
// pick up components which point to the same cabs as this section
if ((SUCCEEDED(pCifComponent_t->GetCustomData(TEXT("IEAKAVSLinks"), szCustData, countof(szCustData))))
&& ISNONNULL(szCustData))
{
StrRemoveWhitespace(szCustData);
if ((pComp->pszAVSDupeSections =
(LPTSTR)CoTaskMemAlloc((StrLen(szCustData)+1) * sizeof(TCHAR))) != NULL)
StrCpy(pComp->pszAVSDupeSections, szCustData);
}
else
pComp->pszAVSDupeSections = NULL;
StrCpy(pComp->szSection, szID);
if (StrCmpI(szID, TEXT("MAILNEWS")) == 0)
g_pMNComp = pComp;
pCifComponent_t->GetGUID(pComp->szGUID, countof(pComp->szGUID));
pCifComponent_t->GetDescription(pComp->szDisplayName, countof(pComp->szDisplayName));
pCifComponent_t->GetUrl(0, pComp->szUrl, countof(pComp->szUrl), &dwType);
if (!(dwType & URLF_RELATIVEURL))
{
LPTSTR pUrl;
TCHAR szTempUrl[MAX_PATH];
pUrl = StrRChr(pComp->szUrl, NULL, TEXT('/'));
if (pUrl)
pUrl++;
else
pUrl = pComp->szUrl;
StrCpy(szTempUrl, pUrl);
StrCpy(pComp->szUrl, szTempUrl);
}
pComp->dwSize = pCifComponent_t->GetDownloadSize();
if (!pComp->fAVSDupe)
s_dwTotalSize += pComp->dwSize;
// take out patch processing for now
/*
// look for a patch entry, special case out patches from 4.0 to 4.01
if (SUCCEEDED(pCifComponent_t->GetPatchID(pComp->piPatchInfo.szSection, countof(pComp->piPatchInfo.szSection))))
{
CHAR szPatchSect[2048];
BOOL fBadPatch = FALSE;
if (GetPrivateProfileSection("Patches", szPatchSect, countof(szPatchSect), g_szDefInf))
{
LPSTR pSectID;
for (pSectID = szPatchSect; *pSectID; pSectID += (lstrlen(pSectID)+1))
{
if (StrCmpI(pSectID, pComp->piPatchInfo.szSection) == 0)
{
fBadPatch = TRUE;
break;
}
}
}
if (fBadPatch)
{
WritePrivateProfileString(pComp->piPatchInfo.szSection, NULL, NULL, g_szCif);
WritePrivateProfileString(pComp->piPatchInfo.szSection, NULL, NULL, s_szCifNew);
WritePrivateProfileString(szID, "PatchID", NULL, g_szCif);
WritePrivateProfileString(szID, "PatchID", NULL, s_szCifNew);
*pComp->piPatchInfo.szSection = '\0';
}
else
{
if (SUCCEEDED(g_lpCifFile->FindComponent(pComp->piPatchInfo.szSection, &pCifComponentTemp)))
{
pCifComponentTemp->GetVersion(&dwVer, &dwBuild);
ConvertDwordsToVersionStr(pComp->piPatchInfo.szVersion, dwVer, dwBuild);
}
g_lpCifFileNew->FindComponent(pComp->piPatchInfo.szSection, &pCifComponentTemp);
pCifComponentTemp->GetVersion(&dwVer, &dwBuild);
ConvertDwordsToVersionStr(szPatchVerNew, dwVer, dwBuild);
pComp->piPatchInfo.dwSize = pCifComponentTemp->GetDownloadSize();
}
}
*/
// Note: we are depending on the section name of core IE4 here.
if ((fNeedCore && (StrCmpI(szID, BASEWIN32) == 0))
|| ((pComp->iCompType == COMP_OPTIONAL) && (pComp->iPlatform <= PLAT_W98)
&& pComp->fVisible))
{
LV_ITEM lvItem;
LVFINDINFO lvFind;
TCHAR szLocalPath[MAX_PATH];
if (StrCmpI(szID, BASEWIN32) == 0)
{
fNeedCore = FALSE;
StrCpy(g_szJobVersion, pComp->szVersion);
}
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_TEXT | LVIF_IMAGE;
// BUGBUG: <oliverl> we should adjust iItem here to make sure core browser
// is always on top
lvItem.iItem = pComp->iList = iItem++;
lvItem.pszText = pComp->szDisplayName;
StrCpy(szLocalPath, g_szIEAKProg);
StrCat(szLocalPath, pComp->szUrl);
if (!PathFileExists(szLocalPath))
{
g_lpCifRWFile->CreateComponent(szID, &pCifRWComponent);
pCifRWComponent->SetGroup(NULL);
lvItem.iImage = pComp->iImage = RED;
}
else
{
CCifRWComponent_t * pCifRWComponent_t;
g_lpCifFileNew->FindComponent(szID, &pCifComponent);
pCifComponent_t->GetGroup(szLocalPath, countof(szLocalPath));
g_lpCifRWFile->CreateComponent(szID, &pCifRWComponent);
pCifRWComponent_t = new CCifRWComponent_t(pCifRWComponent);
pCifRWComponent_t->SetGroup(szLocalPath);
delete pCifRWComponent_t;
if (s_fNoNet || g_fLocalMode || (CheckVer(pComp->szVersion, szVerNew) < 0)
|| (CheckVer(szIEAKVer, szIEAKVerNew) < 0)
|| ((ISNONNULL(pComp->piPatchInfo.szSection))
&& (CheckVer(pComp->piPatchInfo.szVersion, szPatchVerNew) < 0)))
lvItem.iImage = pComp->iImage = YELLOW;
else lvItem.iImage = pComp->iImage = GREEN;
}
ZeroMemory(&lvFind, sizeof(lvFind));
lvFind.flags = LVFI_STRING;
lvFind.psz = pComp->szDisplayName;
if (ListView_FindItem(hCompList, -1, &lvFind) == -1)
{
ListView_InsertItem(hCompList, &lvItem);
if ((pComp->iCompType == COMP_OPTIONAL) && (pComp->iImage != RED))
ListView_SetItemText(hCompList, pComp->iList, 1, pComp->szVersion);
}
}
else
{
TCHAR szLocalPath[MAX_PATH];
PathCombine(szLocalPath, g_szIEAKProg, pComp->szUrl);
if (GetFileAttributes(szLocalPath) == 0xFFFFFFFF)
{
g_lpCifRWFile->CreateComponent(szID, &pCifRWComponent);
pCifRWComponent->SetGroup(NULL);
pComp->iImage = RED;
}
else
{
CCifRWComponent_t * pCifRWComponent_t;
g_lpCifFileNew->FindComponent(szID, &pCifComponent);
pCifComponent_t->GetGroup(szLocalPath, countof(szLocalPath));
g_lpCifRWFile->CreateComponent(szID, &pCifRWComponent);
pCifRWComponent_t = new CCifRWComponent_t(pCifRWComponent);
pCifRWComponent_t->SetGroup(szLocalPath);
delete pCifRWComponent_t;
if (s_fNoNet || g_fLocalMode || (CheckVer(pComp->szVersion, szVerNew) < 0)
|| (CheckVer(szIEAKVer, szIEAKVerNew) < 0)
|| ((ISNONNULL(pComp->piPatchInfo.szSection))
&& (CheckVer(pComp->piPatchInfo.szVersion, szPatchVerNew) < 0)))
pComp->iImage = YELLOW;
else pComp->iImage = GREEN;
}
}
pComp++;
pCompVer++;
delete pCifComponent_t;
}
pEnumCifComponents->Reset();
BuildReverseDependencyList(pEnumCifComponents);
pEnumCifComponents->Release();
for (pComp = g_paComp; (pComp && ISNONNULL(pComp->szSection)); pComp++)
{
if ((pComp->iCompType != COMP_OPTIONAL) &&
(pComp->iImage == RED))
s_fNoCore = TRUE;
}
if (s_fNoCore)
{
LV_ITEM lvItem;
lvItem.mask = LVIF_IMAGE;
lvItem.iItem = 0;
lvItem.iImage = RED;
ListView_SetItem(hCompList, &lvItem);
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
}
else
{
pComp = FindComp(NULL, TRUE);
if (pComp)
ListView_SetItemText(hCompList, pComp->iList, 1, pComp->szVersion);
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
}
}
}
ProcessUpdateIcons(hDlg);
if (FAILED(hr))
{
s_fNoCore = TRUE;
g_fLocalMode = TRUE;
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
}
else
{
IEnumCifModes * pEnumCifModes;
int i, j;
// initialize modes
// currently not getting alpha modes
if (SUCCEEDED(g_lpCifRWFile->EnumModes(&pEnumCifModes,
PLATFORM_WIN98 | PLATFORM_NT4 | PLATFORM_NT5 | PLATFORM_MILLEN, NULL)))
{
ICifMode * pCifMode;
TCHAR szModeID[64];
i = 0;
while (SUCCEEDED(pEnumCifModes->Next(&pCifMode)))
{
CCifMode_t * pCifMode_t = new CCifMode_t((ICifRWMode *)pCifMode);
pCifMode_t->GetID(szModeID, countof(szModeID));
delete pCifMode_t;
g_szAllModes[i] = szModeID[0];
i++;
}
pEnumCifModes->Release();
}
g_nModes = lstrlen(g_szAllModes);
for (pComp = g_paComp; ; pComp++ )
{
if (*pComp->szSection == '\0') break;
if (pComp->iCompType == COMP_CORE)
{
for (i = 0; i < g_nModes ; i++ )
{
pComp->afInstall[i] = TRUE;
}
}
else
{
for (i = 0; i < g_nModes; i++)
{
for (j=0; j < lstrlen(pComp->szModes); j++)
{
if (pComp->szModes[j] == g_szAllModes[i])
pComp->afInstall[i] = TRUE;
}
}
// for invisible comps, set them to the same modes as the visible components
// that depend on them
if (!pComp->fVisible)
{
for (i = 0; pComp->paCompRevDeps[i] && (i < 10); i++)
{
for (j=0; j < MAX_INSTALL_OPTS; j++)
{
if (pComp->paCompRevDeps[i]->afInstall[j])
pComp->afInstall[j] = TRUE;
}
}
}
}
}
InitCustComponents(NULL);
}
g_fOptCompInit = TRUE;
if (!g_fLocalMode)
{
EnableDlgItem2(hDlg, IDC_DOWNLOAD, AnyCompSelected(hDlg));
EnableDlgItem(hDlg, IDC_DOWNLOADALL);
EnableDlgItem(hDlg, IDC_UPDATE);
}
LocalFree(lpszProgressMsg);
PostMessage( g_hDlg, IDM_INITIALIZE, 0, 0 );
CoUninitialize();
return(0);
}
BOOL AnySelection(PCOMPONENT pComp)
{
int i;
if (!pComp)
return FALSE;
for (i = 0; i < 10 ; i++ )
{
if (pComp->afInstall[i]) return(TRUE);
}
return(FALSE);
}
DWORD GetCompDownloadSize(PCOMPONENT pComp)
{
PCOMPONENT pCompDep;
DWORD dwSize = 0;
ICifComponent * pCifComponent;
TCHAR szID[128];
TCHAR tchType;
UINT uiIndex;
if (pComp->fIEDependency || pComp->fAVSDupe)
return 0;
pComp->fIEDependency = TRUE;
if (SUCCEEDED(g_lpCifFileNew->FindComponent(pComp->szSection, &pCifComponent)))
{
CCifComponent_t * pCifComponent_t =
new CCifComponent_t((ICifRWComponent *)pCifComponent);
uiIndex = 0;
while (SUCCEEDED(pCifComponent_t->GetDependency(uiIndex, szID, countof(szID), &tchType, NULL, NULL)))
{
if (StrCmpNI(szID, TEXT("BASEIE40"), 8) != 0)
{
if ((pCompDep = FindComp(szID, FALSE)) != NULL)
dwSize += GetCompDownloadSize(pCompDep);
}
uiIndex++;
}
delete pCifComponent_t;
}
dwSize += pComp->dwSize;
return dwSize;
}
void GetDownloadSize(HWND hCompList, HWND hStatusField)
{
PCOMPONENT pComp, pSearchComp;
LV_ITEM lvItem;
DWORD dwSizeNeeded = 0;
TCHAR szSizeNeeded[32];
BOOL fCore = FALSE;
for (pComp = g_paComp; *pComp->szSection; pComp++)
{
ZeroMemory(&lvItem,sizeof(lvItem));
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
lvItem.stateMask = LVIS_SELECTED;
lvItem.iItem = pComp->iList;
ListView_GetItem(hCompList, &lvItem);
if (((lvItem.state & LVIS_SELECTED) == 0) || (pComp->fIEDependency))
continue;
if (!pComp->fVisible || pComp->fAVSDupe)
continue;
if (pComp->iCompType != COMP_OPTIONAL)
{
fCore = TRUE;
continue;
}
// REVIEW: <oliverl> we need this check so we don't count NT comps twice
if (pComp->iList == 0)
continue;
dwSizeNeeded += GetCompDownloadSize(pComp);
// check other platforms
for (pSearchComp = g_paComp; *pSearchComp->szSection; pSearchComp++)
{
if ((pComp != pSearchComp) &&
(StrCmpI(pComp->szDisplayName, pSearchComp->szDisplayName) == 0))
dwSizeNeeded += GetCompDownloadSize(pSearchComp);
}
}
if (fCore)
{
for (pComp = g_paComp; *pComp->szSection; pComp++)
{
if (!pComp->fIEDependency && !pComp->fAVSDupe && (pComp->iCompType != COMP_OPTIONAL))
dwSizeNeeded += pComp->dwSize;
}
// REVIEW: <oliverl> fudge factor for rounding
dwSizeNeeded += 15;
}
for (pComp = g_paComp; *pComp->szSection; pComp++)
pComp->fIEDependency = FALSE;
wnsprintf(szSizeNeeded, countof(szSizeNeeded), TEXT("%lu KB"), dwSizeNeeded);
InsertCommas(szSizeNeeded);
SetWindowText(hStatusField, szSizeNeeded);
}
//
// FUNCTION: OptionalDownload(HWND, UINT, UINT, LONG)
//
// PURPOSE: Processes messages for "OptionalDownload" page
//
// MESSAGES:
//
// WM_INITDIALOG - intializes the page
// WM_NOTIFY - processes the notifications sent to the page
// WM_COMMAND - saves the id of the choice selected
//
INT_PTR CALLBACK OptionalDownload(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
static TCHAR s_szTotalSize[32];
TCHAR szWrk[MAX_PATH];
TCHAR szFreeSpace[64];
DWORD dwFreeSpace;
BOOL fSel, fSizeChange = FALSE;
static HCURSOR hOldCur = NULL;
static s_fInit = FALSE;
PCOMPONENT* ppCompUpdateList = NULL;
switch (message)
{
case WM_INITDIALOG:
InitSysFont( hDlg, IDC_COMPLIST);
g_hWizard = hDlg;
break;
case WM_SETCURSOR:
if (hOldCur == NULL)
hOldCur = SetCursor(LoadCursor(NULL, IDC_WAIT));
else
{
if (!s_fInit)
SetCursor(LoadCursor(NULL, IDC_WAIT));
}
break;
case IDM_INITIALIZE:
s_fInit = TRUE;
// REVIEW: <oliverl> fudge factor for rounding
s_dwTotalSize += 15;
wnsprintf(s_szTotalSize, countof(s_szTotalSize), TEXT("%lu KB"), s_dwTotalSize);
InsertCommas(s_szTotalSize);
SetDlgItemText(hDlg, IDC_DISKSPACENEEDED, s_szTotalSize);
StrCpy(szWrk, g_szIEAKProg);
dwFreeSpace = GetRootFree(szWrk);
wnsprintf(szFreeSpace, countof(szFreeSpace), TEXT("%lu KB"), dwFreeSpace);
InsertCommas(szFreeSpace);
SetDlgItemText(hDlg, IDC_DISKSPACE, szFreeSpace);
SetCursor(hOldCur);
while (MsgWaitForMultipleObjects(1, &g_hAVSThread, FALSE, INFINITE, QS_ALLINPUT) != WAIT_OBJECT_0)
{
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
if (!g_fLocalMode)
{
s_fComponent = FALSE;
UpdateIEAK(hDlg);
if (g_fLocalMode)
{
DisableDlgItem(hDlg, IDC_DOWNLOAD);
DisableDlgItem(hDlg, IDC_DOWNLOADALL);
}
}
break;
case IDM_BATCHADVANCE:
EnableDlgItem2(hDlg, IDC_DOWNLOAD, AnyCompSelected(hDlg));
DoBatchAdvance(hDlg);
break;
case WM_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED)
{
switch (LOWORD(wParam))
{
TCHAR szTitle[MAX_PATH];
case IDC_DOWNLOAD:
s_fNoToAllSynch = FALSE;
ProcessDownload(hDlg, FALSE);
if (g_fFailedComp)
{
LoadString( g_rvInfo.hInst, IDS_DOWNLOADERR, szTitle, MAX_PATH );
wnsprintf(g_szFailedCompsBox, countof(g_szFailedCompsBox), g_szFailedCompsMsg, g_szFailedComps);
MessageBox(hDlg, g_szFailedCompsBox, szTitle, MB_OK | MB_SETFOREGROUND | MB_ICONEXCLAMATION);
g_szFailedComps[0] = TEXT('\0');
}
break;
case IDC_DOWNLOADALL:
ProcessDownload(hDlg, TRUE);
if (g_fFailedComp)
{
LoadString( g_rvInfo.hInst, IDS_DOWNLOADERR, szTitle, MAX_PATH );
wnsprintf(g_szFailedCompsBox, countof(g_szFailedCompsBox), g_szFailedCompsMsg, g_szFailedComps);
MessageBox(hDlg, g_szFailedCompsBox, szTitle, MB_OK | MB_SETFOREGROUND | MB_ICONEXCLAMATION);
g_szFailedComps[0] = TEXT('\0');
}
break;
case IDC_UPDATE:
DisableDlgItem(hDlg, IDC_UPDATE);
g_hProgress = NULL;
PCOMPONENT *pCompList,
*pCompEnum;
HRESULT hr;
INT_PTR iResult;
pCompList = NULL;
iResult = DialogBoxParam(g_rvInfo.hInst, MAKEINTRESOURCE(IDD_OPTUPDATE), hDlg,
UpdateDlgProc, (LPARAM)&pCompList);
if (IDOK == iResult) {
ASSERT(NULL != pCompList);
if (IsCheyenneSoftwareRunning(hDlg))
ErrDlgProc(hDlg, IDC_ERRDLABORT, NULL,
LPARAM(TEXT("Please turn of all Cheyenne Software")));
s_hStat = CreateDialog( g_rvInfo.hInst, MAKEINTRESOURCE(IDD_DOWNLOAD), NULL,
DownloadStatusDlgProc );
ShowWindow( s_hStat, SW_SHOWNORMAL );
HWND hCompList = GetDlgItem(hDlg, IDC_COMPLIST);
LVITEM lvi;
for (pCompEnum = pCompList; NULL != pCompEnum && NULL != (*pCompEnum); pCompEnum++) {
hr = DownloadUpdate(*pCompEnum);
ZeroMemory(&lvi, sizeof(lvi));
if (DONT_SHOW_UPDATES != hr)
if (BLUE == (*pCompEnum)->iImage)
UpdateBlueIcon(hCompList, *pCompEnum);
else
UpdateBrownIcon(hCompList, *pCompEnum);
LocalFree(*pCompEnum);
}
DestroyWindow(s_hStat);
}
EnableDlgItem(hDlg, IDC_UPDATE);
break;
}
ShowWindow(GetDlgItem(hDlg, IDC_DISKSPACETEXT), SW_SHOW);
ShowWindow(GetDlgItem(hDlg, IDC_DISKSPACETEXT2), SW_HIDE);
SetDlgItemText(hDlg, IDC_DISKSPACENEEDED, s_szTotalSize);
StrCpy(szWrk, g_szIEAKProg);
dwFreeSpace = GetRootFree(szWrk);
wnsprintf(szFreeSpace, countof(szFreeSpace), TEXT("%lu KB"), dwFreeSpace);
InsertCommas(szFreeSpace);
SetDlgItemText(hDlg, IDC_DISKSPACE, szFreeSpace);
if (!g_fLocalMode) EnableDlgItem2(hDlg, IDC_DOWNLOAD, AnyCompSelected(hDlg));
if (!s_fNoCore)
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
}
break;
case WM_NOTIFY:
switch (((NMHDR FAR *) lParam)->code)
{
case PSN_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case PSN_SETACTIVE:
SetBannerText(hDlg);
//processing that was formerly in the downloads page has to go here
g_iDownloadState = DOWN_STATE_SAVE_URL;
SetEvent(g_hDownloadEvent);
if (!g_fBatch && !g_fBatch2 && (!g_fOptCompInit || g_fSrcDirChanged))
{
DWORD dwTid;
g_hWizard = hDlg;
g_hDlg = hDlg;
g_fSrcDirChanged = FALSE;
DisableDlgItem(hDlg, IDC_DOWNLOAD);
DisableDlgItem(hDlg, IDC_DOWNLOADALL);
DisableDlgItem(hDlg, IDC_UPDATE);
g_hAVSThread = CreateThread(NULL, 4096, InitOptComponents32, &g_hWizard, 0, &dwTid);
PropSheet_SetWizButtons(GetParent(hDlg), 0);
}
else
{
if (s_fNoCore)
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
else PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
if (!g_fLocalMode)
EnableDlgItem2(hDlg, IDC_DOWNLOAD, AnyCompSelected(hDlg));
}
CheckBatchAdvance(hDlg);
break;
case LVN_ITEMCHANGED:
if (hOldCur == NULL)
hOldCur = SetCursor(LoadCursor(NULL, IDC_WAIT));
else
{
if (!s_fInit)
SetCursor(LoadCursor(NULL, IDC_WAIT));
}
AnyCompSelected(hDlg, fSel, fSizeChange);
if (!g_fLocalMode && g_fOptCompInit) EnableDlgItem2(hDlg, IDC_DOWNLOAD, fSel);
if (g_fOptCompInit)
{
if (fSizeChange || fSel)
{
ShowWindow(GetDlgItem(hDlg, IDC_DISKSPACETEXT), SW_HIDE);
GetDownloadSize(GetDlgItem(hDlg, IDC_COMPLIST), GetDlgItem(hDlg, IDC_DISKSPACENEEDED));
ShowWindow(GetDlgItem(hDlg, IDC_DISKSPACETEXT2), SW_SHOW);
}
else
{
ShowWindow(GetDlgItem(hDlg, IDC_DISKSPACETEXT), SW_SHOW);
ShowWindow(GetDlgItem(hDlg, IDC_DISKSPACETEXT2), SW_HIDE);
SetDlgItemText(hDlg, IDC_DISKSPACENEEDED, s_szTotalSize);
}
}
break;
case PSN_WIZBACK:
case PSN_WIZNEXT:
if (!g_fOptCompInit && !g_fBatch && !g_fBatch2)
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
g_fCancelled = FALSE;
return(TRUE);
}
// show OE pages if OE is synchronized for win32
if (g_pMNComp)
g_fMailNews95 = (g_pMNComp->iImage != RED);
g_iCurPage = PPAGE_OPTDOWNLOAD;
EnablePages();
if (((NMHDR FAR *) lParam)->code == PSN_WIZNEXT) PageNext(hDlg);
else
{
PagePrev(hDlg);
}
break;
case PSN_QUERYCANCEL:
QueryCancel(hDlg);
break;
default:
return FALSE;
}
break;
case WM_LV_GETITEMS:
LVGetItems(GetDlgItem(hDlg, IDC_COMPLIST));
break;
default:
return FALSE;
}
return TRUE;
}
void InstallComp(PCOMPONENT pComp, INT iOpt, BOOL fInstall)
{
PCOMPONENT pSearchComp;
for (pSearchComp = g_paComp; *pSearchComp->szSection; pSearchComp++)
{
if (!pSearchComp->fAddOnOnly &&
(StrCmpI(pSearchComp->szDisplayName, pComp->szDisplayName) == 0))
pSearchComp->afInstall[iOpt] = fInstall;
}
for (pSearchComp = g_aCustComponents; *pSearchComp->szSection; pSearchComp++)
{
if (StrCmpI(pSearchComp->szDisplayName, pComp->szDisplayName) == 0)
pSearchComp->afInstall[iOpt] = fInstall;
}
}
void SetInstallOption(HWND hDlg, int iOpt)
{
TCHAR szOptName[80];
TCHAR szOptDesc[MAX_PATH];
TCHAR szOptDescParam[16] = TEXT("0_DESC");
TCHAR szOpt[2];
int iComp;
PCOMPONENT pComp, pCoreComp;
ICifMode * pCifMode;
CCifMode_t * pCifMode_t;
szOpt[1] = 0;
SendDlgItemMessage( hDlg, IDC_LISTAVAIL, LB_RESETCONTENT, 0, 0 );
SendDlgItemMessage( hDlg, IDC_LISTINSTALL, LB_RESETCONTENT, 0, 0 );
SendDlgItemMessage( hDlg, g_fOCW ? IDC_OPTLISTOCW : IDC_OPTLIST, CB_SETCURSEL, iOpt, 0 );
SendDlgItemMessage( hDlg, g_fOCW ? IDC_OPTLISTOCW : IDC_OPTLIST, CB_GETLBTEXT, iOpt, (LPARAM) szOptName );
szOptDescParam[0] = szOpt[0]= (TCHAR)(iOpt + TEXT('0'));
WritePrivateProfileString( STRINGS, INSTALLMODE, szOpt, g_szCustInf );
g_lpCifRWFile->FindMode(szOpt, &pCifMode);
pCifMode_t = new CCifMode_t((ICifRWMode *)pCifMode);
pCifMode_t->GetDetails(szOptDesc, countof(szOptDesc));
delete pCifMode_t;
SetDlgItemText( hDlg, IDC_OPTDESC, szOptDesc );
pCoreComp = FindComp(NULL, TRUE);
for (pComp = g_paComp; ; pComp++ )
{
if (ISNULL(pComp->szSection)) break;
if (pComp->fAddOnOnly) continue;
if (pComp->iImage == RED)
{
int i;
for (i = 0; i < MAX_INSTALL_OPTS ; i++ )
{
pComp->afInstall[i] = FALSE;
}
continue;
}
if (pComp == pCoreComp)
{
InstallComp(pComp, iOpt, TRUE);
SendDlgItemMessage( hDlg, IDC_LISTINSTALL, LB_INSERTSTRING, 0, (LPARAM) pComp->szDisplayName );
}
else if ((pComp->iCompType != COMP_CORE) && (pComp->iPlatform <= PLAT_W98))
{
if (pComp->fVisible)
{
SendDlgItemMessage( hDlg, pComp->afInstall[iOpt] ? IDC_LISTINSTALL : IDC_LISTAVAIL,
LB_ADDSTRING, 0, (LPARAM) pComp->szDisplayName );
}
}
}
for (pComp = g_aCustComponents, iComp = 0; iComp < g_nCustComp ; pComp++, iComp++ )
{
if ((pComp->iCompType == COMP_OPTIONAL) && (pComp->iPlatform <= PLAT_W98))
{
SendDlgItemMessage( hDlg, pComp->afInstall[iOpt] ? IDC_LISTINSTALL : IDC_LISTAVAIL,
LB_ADDSTRING, 0, (LPARAM) pComp->szDisplayName );
}
}
if (!g_fOCW)
{
// if not silent or stealth and we are under the max number of install options then
// enable new button
if (!(g_fIntranet && (g_fSilent || g_fStealth)) && (g_nModes < 10))
EnableDlgItem(hDlg, IDC_NEWOPT);
else
{
EnsureDialogFocus(hDlg, IDC_NEWOPT, IDC_DELOPT);
DisableDlgItem(hDlg, IDC_NEWOPT);
}
if (g_nModes > 1)
EnableDlgItem(hDlg, IDC_DELOPT);
else
{
EnsureDialogFocus(hDlg, IDC_DELOPT,
(g_fIntranet && (g_fSilent || g_fStealth)) ? IDC_OPTLIST : IDC_NEWOPT);
DisableDlgItem(hDlg, IDC_DELOPT);
}
}
EnableWindow(GetDlgItem(hDlg, IDC_ADDCOMP), 0 < SendMessage( GetDlgItem(hDlg, IDC_LISTAVAIL), LB_GETCOUNT, 0, 0 ));
EnableWindow(GetDlgItem(hDlg, IDC_ADDALLCOMP), 0 < SendMessage( GetDlgItem(hDlg, IDC_LISTAVAIL), LB_GETCOUNT, 0, 0 ));
EnableWindow(GetDlgItem(hDlg, IDC_REMCOMP), 1 < SendMessage( GetDlgItem(hDlg, IDC_LISTINSTALL), LB_GETCOUNT, 0, 0 ));
EnableWindow(GetDlgItem(hDlg, IDC_REMALLCOMP), 1 < SendMessage( GetDlgItem(hDlg, IDC_LISTINSTALL), LB_GETCOUNT, 0, 0 ));
SetLBWidth(GetDlgItem(hDlg, IDC_LISTAVAIL));
SetLBWidth(GetDlgItem(hDlg, IDC_LISTINSTALL));
}
void InitSelection32(HWND hDlg)
{
int i, j, iComp;
PCOMPONENT pComp;
IEnumCifModes * pEnumCifModes;
if (g_fBatch) return;
SendDlgItemMessage(hDlg, g_fOCW ? IDC_OPTLISTOCW : IDC_OPTLIST, CB_RESETCONTENT, 0, 0 );
// currently not getting alpha modes
if (SUCCEEDED(g_lpCifRWFile->EnumModes(&pEnumCifModes,
PLATFORM_WIN98 | PLATFORM_NT4 | PLATFORM_NT5 | PLATFORM_MILLEN, NULL)))
{
ICifMode * pCifMode;
TCHAR szModeID[64];
TCHAR szOptName[96];
i = 0;
while (SUCCEEDED(pEnumCifModes->Next(&pCifMode)))
{
CCifMode_t * pCifMode_t = new CCifMode_t((ICifRWMode *)pCifMode);
pCifMode_t->GetID(szModeID, countof(szModeID));
g_szAllModes[i] = szModeID[0];
pCifMode_t->GetDescription(szOptName, countof(szOptName));
SendDlgItemMessage( hDlg, g_fOCW ? IDC_OPTLISTOCW : IDC_OPTLIST, CB_ADDSTRING, 0, (LPARAM) szOptName );
i++;
delete pCifMode_t;
}
pEnumCifModes->Release();
g_szAllModes[i] = TEXT('\0');
}
g_nModes = lstrlen(g_szAllModes);
for (pComp = g_paComp; ; pComp++ )
{
if (ISNULL(pComp->szSection)) break;
ZeroMemory(pComp->afInstall, sizeof(pComp->afInstall));
if (pComp->iCompType == COMP_CORE)
{
for (i = 0; i < g_nModes ; i++ )
{
pComp->afInstall[i] = TRUE;
}
}
else
{
for (i = 0; i < g_nModes; i++)
{
for (j=0; j < lstrlen(pComp->szModes); j++)
{
if (pComp->szModes[j] == g_szAllModes[i])
pComp->afInstall[i] = TRUE;
}
}
// for invisible comps, set them to the same modes as the visible components
// that depend on them
if (!pComp->fVisible)
{
for (i = 0; pComp->paCompRevDeps[i] && (i < 10); i++)
{
for (j=0; j < MAX_INSTALL_OPTS; j++)
{
if (pComp->paCompRevDeps[i]->afInstall[j])
pComp->afInstall[j] = TRUE;
}
}
}
}
}
for (pComp = g_aCustComponents, iComp = 0; iComp < g_nCustComp ; pComp++, iComp++ )
{
TCHAR szModesParam[80] = TEXT("Cust0Modes");
TCHAR szModes[16] = TEXT("\"");
if (ISNULL(pComp->szSection)) break;
szModesParam[4] = (TCHAR)(iComp + TEXT('0'));
ZeroMemory(pComp->afInstall, sizeof(pComp->afInstall));
GetPrivateProfileString(IS_STRINGS, szModesParam, TEXT(""), szModes, countof(szModes), g_szCustInf);
if (StrCmpI(szModes, UNUSED) != 0)
{
for (i = 0; i < lstrlen(szModes) ; i++ )
{
int j = szModes[i] - TEXT('0');
pComp->afInstall[j] = TRUE;
}
}
}
if (g_iSelOpt > g_nModes - 1) g_iSelOpt = g_nModes ? g_nModes - 1 : 0;
SetInstallOption(hDlg, g_iSelOpt);
}
void SaveSelection()
{
int i, iComp;
PCOMPONENT pComp;
TCHAR szQuotedModes[16] = TEXT("\"");
ICifRWComponent * pCifRWComponent;
CCifRWComponent_t * pCifRWComponent_t;
StrCat(szQuotedModes, g_szAllModes);
StrCat(szQuotedModes, TEXT("\""));
for (pComp = g_aCustComponents, iComp = 0; iComp < MAXCUST ; pComp++, iComp++ )
{
TCHAR szModesParam[80] = TEXT("Cust0Modes");
TCHAR szModesNameParam[80] = TEXT("Cust0Name");
TCHAR szModes[16] = TEXT("");
TCHAR szQuotedSection[32] = TEXT("\"");
StrCat(szQuotedSection, pComp->szSection);
StrCat(szQuotedSection, TEXT("\""));
szModesParam[4] = szModesNameParam[4] = (TCHAR)(iComp + TEXT('0'));
if (ISNULL(pComp->szSection))
{
InsWriteQuotedString(IS_STRINGS, szModesNameParam, UNUSED, g_szCustInf);
InsWriteQuotedString(IS_STRINGS, szModesParam, TEXT("\"\""), g_szCustInf);
continue;
}
for (i = 0; i < g_nModes ; i++ )
{
TCHAR szAddMode[2] = TEXT("0");
szAddMode[0] = (TCHAR)(i + TEXT('0'));
if (pComp->afInstall[i]) StrCat(szModes, szAddMode);
}
StrCpy(pComp->szModes, szModes);
InsWriteQuotedString(IS_STRINGS, szModesNameParam, szQuotedSection, g_szCustInf);
InsWriteQuotedString(IS_STRINGS, szModesParam, szModes, g_szCustInf);
}
for (pComp = g_paComp; ; pComp++ )
{
TCHAR szModesParam[80];
TCHAR szModes[16] = TEXT("");
if (ISNULL(pComp->szSection)) break;
//BUGBUG fix for alpha release
if (pComp->iPlatform == PLAT_ALPHA) continue;
for (i = 0; i < g_nModes ; i++ )
{
TCHAR szAddMode[2] = TEXT("0");
szAddMode[0] = (TCHAR)(i + TEXT('0'));
if (pComp->afInstall[i]) StrCat(szModes, szAddMode);
}
StrCpy(szModesParam, pComp->szModes);
g_lpCifRWFile->CreateComponent(pComp->szSection, &pCifRWComponent);
pCifRWComponent_t = new CCifRWComponent_t(pCifRWComponent);
if (pComp->iCompType == COMP_CORE)
{
int j;
if ((StrCmpNI(pComp->szSection, TEXT("IE4SHELL"), 8) == 0) ||
(StrCmpNI(pComp->szSection, TEXT("MFC"), 3) == 0))
continue;
WriteModesToCif(pCifRWComponent_t, g_szAllModes);
StrCpy(pComp->szModes, g_szAllModes);
for (j = 0; g_szAllModes[j]; j++)
pComp->afInstall[j] = TRUE;
}
else
{
if (pComp->fVisible)
WriteModesToCif(pCifRWComponent_t, szModes);
// BUGBUG: <oliverl> take out this assert for now because we'd have to totally
// change the way we handle adding and removing comps from modes to
// prevent this from asserting
/* else
ASSERT(ISNULL(pComp->szModes)); */
StrCpy(pComp->szModes, szModes);
}
delete pCifRWComponent_t;
pCifRWComponent_t = NULL;
}
WritePrivateProfileString(NULL, NULL, NULL, g_szCustInf);
g_lpCifRWFile->Flush();
}
BOOL AddDependencies32(HWND hDlg, LPCTSTR pcszSectName, INT &nComp)
{
HWND hSource = GetDlgItem(hDlg, IDC_LISTAVAIL);
HWND hDest = GetDlgItem(hDlg, IDC_LISTINSTALL);
int iComp;
PCOMPONENT pComp;
ICifComponent * pCifComponent;
BOOL fCust = FALSE;
if (StrCmpNI(pcszSectName, TEXT("BASEIE40"), 8) == 0)
return TRUE;
pComp = FindComp(pcszSectName, FALSE);
if (pComp == NULL)
{
fCust = TRUE;
pComp = FindCustComp(pcszSectName);
if (pComp == NULL)
return FALSE;
}
InstallComp(pComp, g_iSelOpt, TRUE);
if (pComp->fVisible)
{
if ((iComp = (int) SendMessage( hSource, LB_FINDSTRINGEXACT, 0, (LPARAM)pComp->szDisplayName )) == -1 )
return FALSE;
SendMessage( hSource, LB_DELETESTRING, iComp, 0 );
SendMessage( hDest, LB_ADDSTRING, 0, (LPARAM) pComp->szDisplayName);
nComp--;
SetLBWidth(GetDlgItem(hDlg, IDC_LISTAVAIL));
SetLBWidth(GetDlgItem(hDlg, IDC_LISTINSTALL));
}
if (!fCust)
{
if (SUCCEEDED(g_lpCifRWFile->FindComponent(pComp->szSection, &pCifComponent)))
{
TCHAR tchType;
TCHAR szDepID[96];
UINT uiIndex = 0;
PCOMPONENT pDepComp;
CCifComponent_t * pCifComponent_t =
new CCifComponent_t((ICifRWComponent *)pCifComponent);
while (SUCCEEDED(pCifComponent_t->GetDependency(uiIndex, szDepID, countof(szDepID), &tchType, NULL, NULL)))
{
pDepComp = FindComp(szDepID, FALSE);
// check to see if we've already seen this dependency
if (pDepComp && !pDepComp->afInstall[g_iSelOpt])
{
if (!AddDependencies32(hDlg, szDepID, nComp))
return FALSE;
}
uiIndex++;
}
delete pCifComponent_t;
}
}
return TRUE;
}
void RemoveSilentDeps32(PCOMPONENT pComp, INT iSelOpt)
{
ICifComponent * pCifComponent;
PCOMPONENT pDepComp;
UINT uiIndex = 0;
TCHAR szDepID[32];
TCHAR tchType;
if (SUCCEEDED(g_lpCifRWFile->FindComponent(pComp->szSection, &pCifComponent)))
{
CCifComponent_t * pCifComponent_t =
new CCifComponent_t((ICifRWComponent *)pCifComponent);
while (SUCCEEDED(pCifComponent_t->GetDependency(uiIndex, szDepID, countof(szDepID), &tchType, NULL, NULL)))
{
pDepComp = FindComp(szDepID, FALSE);
if (pDepComp && !pDepComp->fVisible && pDepComp->afInstall[iSelOpt])
{
InstallComp(pDepComp, iSelOpt, FALSE);
RemoveSilentDeps32(pDepComp, iSelOpt);
}
uiIndex++;
}
delete pCifComponent_t;
}
}
BOOL RemoveDependencies32(HWND hDlg, PCOMPONENT pComp, INT &nComp, BOOL fCust)
{
int i, k, j = 0;
BOOL fAdd;
TCHAR szCompList[MAX_BUF];
TCHAR szHeader[MAX_PATH];
TCHAR szMsgBoxText[MAX_BUF];
HWND hSource = GetDlgItem(hDlg, IDC_LISTINSTALL);
HWND hDest = GetDlgItem(hDlg, IDC_LISTAVAIL);
if (!fCust)
{
ZeroMemory(szCompList, sizeof(szCompList));
StrCat(szCompList, TEXT("\r\n"));
for (i = 0, j = 0; pComp->paCompRevDeps[i] && (i < 10); i++)
{
if (((pComp->paCompRevDeps[i])->fVisible) &&
((pComp->paCompRevDeps[i])->afInstall[g_iSelOpt]))
{
fAdd = TRUE;
for (k = 0; pComp->paCompRevDeps[k] && (k < i); k++)
{
if (0 == (strcmp((const char*)(pComp->paCompRevDeps[k])->szDisplayName,
(const char*)(pComp->paCompRevDeps[i])->szDisplayName)))
fAdd = FALSE;
}
if (fAdd)
{
StrCat(szCompList, (pComp->paCompRevDeps[i])->szDisplayName);
StrCat(szCompList, TEXT("\r\n"));
}
j++;
}
}
if (j != 0)
{
LoadString(g_rvInfo.hInst, IDS_DEPEND_WARNING , szHeader, countof(szHeader));
wnsprintf(szMsgBoxText, countof(szMsgBoxText), szHeader, pComp->szDisplayName, szCompList);
}
}
if (fCust || (j == 0) || (MessageBox(hDlg, szMsgBoxText, TEXT(""), MB_OKCANCEL) == IDOK))
{
InstallComp(pComp, g_iSelOpt, FALSE);
if (!fCust)
{
for (i = 0; pComp->paCompRevDeps[i] && (i < 10); i++)
{
InstallComp(pComp->paCompRevDeps[i], g_iSelOpt, FALSE);
if ((pComp->paCompRevDeps[i])->fVisible)
{
if ((j = (int) SendMessage( hSource, LB_FINDSTRINGEXACT, 1, (LPARAM)(pComp->paCompRevDeps[i])->szDisplayName )) != -1 )
{
SendMessage( hSource, LB_DELETESTRING, j, 0 );
SendMessage( hDest, LB_ADDSTRING, 0, (LPARAM) (pComp->paCompRevDeps[i])->szDisplayName );
nComp--;
SetLBWidth(GetDlgItem(hDlg, IDC_LISTAVAIL));
SetLBWidth(GetDlgItem(hDlg, IDC_LISTINSTALL));
}
}
}
RemoveSilentDeps32(pComp, g_iSelOpt);
}
if ((i = (int) SendMessage( hSource, LB_FINDSTRINGEXACT, 1, (LPARAM)pComp->szDisplayName )) != -1 )
{
SendMessage( hSource, LB_DELETESTRING, i, 0 );
SendMessage( hDest, LB_ADDSTRING, 0, (LPARAM) pComp->szDisplayName );
nComp--;
SetLBWidth(GetDlgItem(hDlg, IDC_LISTAVAIL));
SetLBWidth(GetDlgItem(hDlg, IDC_LISTINSTALL));
}
}
else
return FALSE;
return TRUE;
}
void AddRemoveComponents(HWND hDlg, BOOL fAll, BOOL fAdd)
{
HWND hSource = GetDlgItem(hDlg, fAdd ? IDC_LISTAVAIL : IDC_LISTINSTALL);
HWND hDest = GetDlgItem(hDlg, fAdd ? IDC_LISTINSTALL : IDC_LISTAVAIL);
TCHAR szCompName[MAX_PATH];
PCOMPONENT pComp;
int iComp,iStart;
int nComp = (int) SendMessage(hSource, LB_GETCOUNT, 0, 0);
BOOL fCust;
BOOL fSomeSel = FALSE;
if(!fAdd)
{
iStart=1; //We don't want to remove the browser itself;
}
else
{
iStart=0;
}
if (fAll)
{
for (pComp = g_paComp; *pComp->szSection; pComp++)
{
pComp->afInstall[g_iSelOpt] = fAdd && (!pComp->fAddOnOnly);
}
for (pComp = g_aCustComponents; *pComp->szSection; pComp++ )
{
pComp->afInstall[g_iSelOpt] = fAdd;
}
}
for (iComp = iStart; iComp < nComp; iComp++ )
{
BOOL fSel = (SendMessage( hSource, LB_GETSEL, iComp, 0 ) > 0) ? TRUE : FALSE;
if (!fSel && !fAll) continue;
fSomeSel = TRUE;
SendMessage( hSource, LB_GETTEXT, iComp, (LPARAM) szCompName );
if (!fAll)
{
pComp = FindVisibleComponentName(szCompName);
if (!pComp)
{
pComp = FindCustComponentName(szCompName);
fCust = TRUE;
}
else
fCust = FALSE;
if (pComp)
{
if (fAdd)
{
AddDependencies32(hDlg, pComp->szSection, nComp);
iComp = iStart-1;
}
else
{
if (RemoveDependencies32(hDlg, pComp, nComp, fCust))
iComp = iStart-1;
}
}
continue;
}
SendMessage( hSource, LB_DELETESTRING, iComp, 0 );
SendMessage( hDest, LB_ADDSTRING, 0, (LPARAM) szCompName );
iComp--;
nComp--;
}
if (fSomeSel)
{
BOOL fEnableAdd = (0 < SendMessage( fAdd ? hSource : hDest, LB_GETCOUNT, 0, 0 ));
BOOL fEnableRem = (iStart < SendMessage( fAdd ? hDest : hSource, LB_GETCOUNT, 0, 0 ));
EnableWindow(GetDlgItem(hDlg, IDC_ADDCOMP), fEnableAdd);
EnableWindow(GetDlgItem(hDlg, IDC_ADDALLCOMP), fEnableAdd);
EnableWindow(GetDlgItem(hDlg, IDC_REMCOMP), fEnableRem);
EnableWindow(GetDlgItem(hDlg, IDC_REMALLCOMP), fEnableRem);
if (fEnableAdd)
SetFocus(GetDlgItem(hDlg,IDC_LISTINSTALL));
else
SetFocus(GetDlgItem(hDlg,IDC_LISTAVAIL));
}
SetLBWidth(GetDlgItem(hDlg, IDC_LISTAVAIL));
SetLBWidth(GetDlgItem(hDlg, IDC_LISTINSTALL));
}
DWORD GotRoom(HWND hDlg)
{
PCOMPONENT pComp;
TCHAR szDestRoot[MAX_PATH];
TCHAR szTempRoot[MAX_PATH];
int iComp;
DWORD dwDestMul = 1, dwTempMul = 0;
DWORD dwDestFree, dwTempFree, dwDestNeed, dwTempNeed;
if (g_fCD) dwDestMul++;
if (g_fLAN) dwDestMul++;
if (g_fBrandingOnly) dwDestMul++;
StrCpy(szDestRoot, g_szBuildRoot);
StrCpy(szTempRoot, g_szBuildTemp);
CharUpper(szDestRoot);
CharUpper(szTempRoot);
dwDestFree = GetRootFree(szDestRoot);
dwTempFree = GetRootFree(szTempRoot);
dwDestNeed = dwTempNeed = 4096;
for (pComp = g_paComp; ; pComp++ )
{
if (ISNULL(pComp->szSection)) break;
dwDestNeed += pComp->dwSize * dwDestMul;
dwTempNeed += pComp->dwSize * dwTempMul;
}
for (pComp = g_aCustComponents, iComp = 0; iComp < g_nCustComp ; pComp++, iComp++ )
{
DWORD dwSize = FolderSize(pComp->szPath) >> 10;
dwDestNeed += dwSize * dwDestMul;
dwTempNeed += dwSize * dwTempMul;
}
if (*szDestRoot == *szTempRoot)
{
dwDestNeed += dwTempNeed;
}
else if (dwTempFree < dwTempNeed)
{
TCHAR szTitle[MAX_PATH];
TCHAR szTemplate[MAX_PATH];
TCHAR szMsg[MAX_PATH];
LoadString( g_rvInfo.hInst, IDS_DISKERROR, szTitle, MAX_PATH );
LoadString( g_rvInfo.hInst, IDS_TEMPDISKMSG2, szTemplate, MAX_PATH );
wnsprintf(szMsg, countof(szMsg), szTemplate, dwTempFree, dwTempNeed);
if (MessageBox(hDlg, szMsg, szTitle, MB_OKCANCEL | MB_SETFOREGROUND) == IDCANCEL)
{
LoadString( g_rvInfo.hInst, IDS_ERROREXIT, szMsg, countof(szMsg) );
MessageBox(hDlg, szMsg, szTitle, MB_OK | MB_SETFOREGROUND);
DoCancel();
return (DWORD)-1;
}
else
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
return (DWORD)-1;
}
}
if (dwDestFree < dwDestNeed)
{
TCHAR szTitle[MAX_PATH];
TCHAR szTemplate[MAX_PATH];
TCHAR szMsg[MAX_PATH];
LoadString( g_rvInfo.hInst, IDS_DISKERROR, szTitle, MAX_PATH );
LoadString( g_rvInfo.hInst, IDS_DESTDISKMSG2, szTemplate, MAX_PATH );
wnsprintf(szMsg, countof(szMsg), szTemplate, dwDestFree, dwDestNeed);
if (MessageBox(hDlg, szMsg, szTitle, MB_OKCANCEL | MB_SETFOREGROUND) == IDCANCEL)
{
LoadString( g_rvInfo.hInst, IDS_ERROREXIT, szMsg, countof(szMsg) );
MessageBox(hDlg, szMsg, szTitle, MB_OK | MB_SETFOREGROUND);
DoCancel();
return (DWORD)-1;
}
else
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
return (DWORD)-1;
}
}
return(0);
}
BOOL SaveOption(HWND hDlg, HWND hOptlist)
{
TCHAR szOptName[80] = TEXT("");
TCHAR szOptNameParam[8] = TEXT("0_Name");
TCHAR szOptDesc[MAX_PATH] = TEXT("");
TCHAR szOptDescParam[8] = TEXT("0_DESC");
TCHAR szOptNum[2] = TEXT("0");
ICifRWMode * pCifRWMode;
CCifRWMode_t * pCifRWMode_t;
GetWindowText( hOptlist, szOptName, 80 );
GetDlgItemText( hDlg, IDC_OPTDESC, szOptDesc, countof(szOptDesc));
if (ISNULL(szOptName) || ISNULL(szOptDesc))
{
ErrorMessageBox(hDlg, IDS_BLANKOPTION);
return FALSE;
}
SendMessage( hOptlist, CB_DELETESTRING, g_iSelOpt, 0L );
SendMessage( hOptlist, CB_INSERTSTRING, g_iSelOpt, (LPARAM) szOptName);
SendMessage( hOptlist, CB_SETCURSEL, g_iSelOpt, 0L );
szOptNum[0] = (TCHAR)(g_iSelOpt + TEXT('0'));
g_lpCifRWFile->CreateMode(szOptNum, &pCifRWMode);
pCifRWMode_t = new CCifRWMode_t(pCifRWMode);
pCifRWMode_t->SetDescription(szOptName);
pCifRWMode_t->SetDetails(szOptDesc);
delete pCifRWMode_t;
return TRUE;
}
void ReinitModes(HWND hDlg)
{
PCOMPONENT pComp;
IEnumCifModes * pEnumCifModes;
INT iComp;
// delete the cif structure before copying over the versioning cif to the target dir
if (g_lpCifRWFile)
{
delete g_lpCifRWFile;
g_lpCifRWFile = NULL;
}
CopyFile(g_szCifVer, g_szCif, FALSE);
GetICifRWFileFromFile_t(&g_lpCifRWFile, g_szCif);
if (g_fOCW)
{
g_lpCifRWFile->DeleteMode(TEXT("2"));
g_lpCifRWFile->Flush();
}
// reread the modes for the components from the cif
for (pComp = g_paComp; *pComp->szSection; pComp++)
{
ICifComponent * pCifComponent;
ZeroMemory(pComp->szModes, sizeof(pComp->szModes));
ZeroMemory(pComp->afInstall, sizeof(pComp->afInstall));
if (SUCCEEDED(g_lpCifRWFile->FindComponent(pComp->szSection, &pCifComponent)))
{
UINT uiIndex = 0;
TCHAR szMode[MAX_PATH];
CCifComponent_t * pCifComponent_t =
new CCifComponent_t((ICifRWComponent *)pCifComponent);
while (SUCCEEDED(pCifComponent_t->GetMode(uiIndex, szMode, countof(szMode))))
{
pComp->szModes[uiIndex] = szMode[0];
pComp->afInstall[szMode[0] - TEXT('0')] = TRUE;
uiIndex++;
}
delete pCifComponent_t;
}
}
if (SUCCEEDED(g_lpCifRWFile->EnumModes(&pEnumCifModes,
PLATFORM_WIN98 | PLATFORM_NT4 | PLATFORM_NT5 | PLATFORM_MILLEN, NULL)))
{
ICifMode * pCifMode;
TCHAR szModeID[64];
int i = 0;
while (SUCCEEDED(pEnumCifModes->Next(&pCifMode)))
{
CCifMode_t * pCifMode_t = new CCifMode_t((ICifRWMode *)pCifMode);
pCifMode_t->GetID(szModeID, countof(szModeID));
g_szAllModes[i] = szModeID[0];
i++;
delete pCifMode_t;
}
pEnumCifModes->Release();
g_szAllModes[i] = TEXT('\0');
}
g_nModes = lstrlen(g_szAllModes);
// reset custom components to be in all modes
for (iComp = 0, pComp = g_aCustComponents; iComp < g_nCustComp; iComp++, pComp++ )
{
if (ISNULL(pComp->szSection)) break;
StrCpy(pComp->szModes, g_szAllModes);
}
InitSelection32(hDlg);
}
//
// FUNCTION: ComponentSelect(HWND, UINT, UINT, LONG)
//
// PURPOSE: Processes messages for "ComponentSelect" page
//
// MESSAGES:
//
// WM_INITDIALOG - intializes the page
// WM_NOTIFY - processes the notifications sent to the page
// WM_COMMAND - saves the id of the choice selected
//
//
INT_PTR CALLBACK ComponentSelect(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
TCHAR szOptName[80];
TCHAR szOptTpl[80];
TCHAR szOptNameParam[8] = TEXT("0_Name");
TCHAR szOptDesc[160]; // weird limit imposed by size of window control in ie6setup
TCHAR szOptDescParam[8] = TEXT("0_DESC");
TCHAR szOptNum[2] = TEXT("0");
TCHAR szNextNameParam[8] = TEXT("0_Name");
TCHAR szNextDescParam[8] = TEXT("0_Desc");
TCHAR szModeNameParm[10] = TEXT("%0_Name%");
TCHAR szModeDescParm[10] = TEXT("%0_Desc%");
TCHAR szModeSect[8] = TEXT("0.Win");
int iComp, iOpt, iNewSel;
PCOMPONENT pComp;
TCHAR szModeChar[4] = TEXT("0");
BOOL s_fFirst = TRUE;
HWND hOptlist;
static BOOL s_fEditChange = FALSE;
switch (message)
{
case WM_INITDIALOG:
g_hWizard = hDlg;
EnableDBCSChars( hDlg, IDC_LISTAVAIL);
EnableDBCSChars( hDlg, IDC_LISTINSTALL);
EnableDBCSChars( hDlg, IDC_OPTLIST);
EnableDBCSChars( hDlg, IDC_OPTLISTOCW);
EnableDBCSChars( hDlg, IDC_OPTDESC);
Edit_LimitText(GetDlgItem(hDlg, IDC_OPTDESC), countof(szOptDesc)-1);
Edit_LimitText(GetDlgItem(hDlg, IDC_OPTLIST), countof(szOptName)-1);
break;
case IDM_BATCHADVANCE:
DoBatchAdvance(hDlg);
break;
case WM_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_OPTLIST:
case IDC_OPTLISTOCW:
switch (HIWORD(wParam))
{
case CBN_EDITCHANGE:
s_fEditChange = TRUE;
break;
case CBN_SELENDOK:
hOptlist = GetDlgItem(hDlg, g_fOCW ? IDC_OPTLISTOCW : IDC_OPTLIST);
iNewSel = ComboBox_GetCurSel(hOptlist);
if (s_fEditChange)
{
GetWindowText(hOptlist, szOptName, countof(szOptName));
ComboBox_DeleteString(hOptlist, g_iSelOpt);
ComboBox_InsertString(hOptlist, g_iSelOpt, szOptName);
if (!SaveOption(hDlg, hOptlist))
{
ComboBox_SetCurSel(hOptlist, g_iSelOpt);
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
break;
}
s_fEditChange = FALSE;
}
if ((iNewSel != CB_ERR) && (iNewSel != g_iSelOpt))
{
g_iSelOpt = iNewSel;
SetInstallOption(hDlg, g_iSelOpt);
}
if (iNewSel < 0) iNewSel = 0;
ComboBox_SetCurSel(hOptlist, iNewSel);
break;
case CBN_DROPDOWN:
hOptlist = GetDlgItem(hDlg, g_fOCW ? IDC_OPTLISTOCW : IDC_OPTLIST);
GetWindowText(hOptlist, szOptName, countof(szOptName));
ComboBox_DeleteString(hOptlist, g_iSelOpt);
ComboBox_InsertString(hOptlist, g_iSelOpt, szOptName);
ComboBox_SetCurSel(hOptlist, g_iSelOpt);
break;
default:
return FALSE;
}
break;
case IDC_OPTDESC:
s_fEditChange = TRUE;
break;
case IDC_NEWOPT:
if (s_fEditChange)
{
if (!SaveOption(hDlg, GetDlgItem(hDlg, g_fOCW ? IDC_OPTLISTOCW : IDC_OPTLIST)))
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
break;
}
}
g_iSelOpt = g_nModes++;
LoadString( g_rvInfo.hInst, IDS_NEWINSTALLOPT, szOptTpl, countof(szOptTpl) );
*szOptNum = *szOptNameParam = *szModeChar = *szModeSect =
szModeNameParm[1] = szModeDescParm[1] = (TCHAR)(g_iSelOpt + TEXT('0'));
wnsprintf(szOptName, countof(szOptName), TEXT("%s %s"), szOptTpl, szOptNum);
{
ICifRWMode * pCifRWMode;
CCifRWMode_t * pCifRWMode_t;
szOptNum[0] = (TCHAR)(g_iSelOpt + TEXT('0'));
g_lpCifRWFile->CreateMode(szOptNum, &pCifRWMode);
pCifRWMode_t = new CCifRWMode_t(pCifRWMode);
pCifRWMode_t->SetDescription(szOptName);
delete pCifRWMode_t;
}
SendDlgItemMessage( hDlg, g_fOCW ? IDC_OPTLISTOCW : IDC_OPTLIST, CB_ADDSTRING, 0, (LPARAM) szOptName );
StrCat(g_szAllModes, szModeChar);
// add custom components to mode by default
for (iComp = 0, pComp = g_aCustComponents; iComp < g_nCustComp ; iComp++, pComp++ )
{
if (ISNULL(pComp->szSection)) break;
pComp->afInstall[g_nModes-1] = TRUE;
StrCat(pComp->szModes, szOptNum);
}
SetInstallOption(hDlg, g_iSelOpt);
s_fEditChange = TRUE;
break;
case IDC_DELOPT:
SendDlgItemMessage( hDlg, g_fOCW ? IDC_OPTLISTOCW : IDC_OPTLIST, CB_DELETESTRING, g_iSelOpt, 0 );
if (g_iSelOpt != (g_nModes - 1))
{
ICifRWMode * pCifRWMode;
CCifRWMode_t * pCifRWMode_t;
ICifMode * pCifMode;
CCifMode_t * pCifMode_t;
TCHAR szOptCurrent[2];
TCHAR szOptNext[2];
for (iOpt = g_iSelOpt; iOpt < (g_nModes-1) ; iOpt++ )
{
*szNextNameParam = *szNextDescParam = (TCHAR)(iOpt + TEXT('1'));
*szOptDescParam = *szOptNameParam = (TCHAR)(iOpt + TEXT('0'));
StrCpy(szOptCurrent, TEXT("0"));
StrCpy(szOptNext, TEXT("0"));
szOptCurrent[0] = (TCHAR)(iOpt + TEXT('0'));
szOptNext[0] = (TCHAR)(iOpt + TEXT('1'));
g_lpCifRWFile->DeleteMode(szOptCurrent);
g_lpCifRWFile->CreateMode(szOptCurrent, &pCifRWMode);
pCifRWMode_t = new CCifRWMode_t(pCifRWMode);
g_lpCifRWFile->FindMode(szOptNext, &pCifMode);
pCifMode_t = new CCifMode_t((ICifRWMode *)pCifMode);
pCifMode_t->GetDescription(szOptName, countof(szOptName));
pCifRWMode_t->SetDescription(szOptName);
pCifMode_t->GetDetails(szOptDesc, countof(szOptDesc));
pCifRWMode_t->SetDetails(szOptDesc);
delete pCifRWMode_t;
delete pCifMode_t;
pCifRWMode_t = NULL;
pCifMode_t = NULL;
for (pComp = g_paComp; ; pComp++ )
{
if (ISNULL(pComp->szSection)) break;
pComp->afInstall[iOpt] = pComp->afInstall[iOpt + 1];
}
for (iComp = 0, pComp = g_aCustComponents; iComp < g_nCustComp ; iComp++, pComp++ )
{
if (ISNULL(pComp->szSection)) break;
pComp->afInstall[iOpt] = pComp->afInstall[iOpt + 1];
}
}
}
*szOptDescParam = *szOptNameParam = szOptNum[0] = (TCHAR)((g_nModes-1) + TEXT('0'));
szOptNum[1] = TEXT('\0');
g_lpCifRWFile->DeleteMode(szOptNum);
for (pComp = g_paComp; ; pComp++ )
{
if (ISNULL(pComp->szSection)) break;
pComp->afInstall[g_nModes-1] = FALSE;
}
for (iComp = 0, pComp = g_aCustComponents; iComp < g_nCustComp ; iComp++, pComp++ )
{
if (ISNULL(pComp->szSection)) break;
pComp->afInstall[g_nModes-1] = FALSE;
}
g_nModes--;
g_szAllModes[g_nModes] = TEXT('\0');
if (g_iSelOpt >= g_nModes) g_iSelOpt--;
SetInstallOption(hDlg, g_iSelOpt);
break;
case IDC_ADDCOMP:
AddRemoveComponents(hDlg, FALSE, TRUE);
break;
case IDC_REMCOMP:
AddRemoveComponents(hDlg, FALSE, FALSE);
break;
case IDC_ADDALLCOMP:
AddRemoveComponents(hDlg, TRUE, TRUE);
break;
case IDC_REMALLCOMP:
AddRemoveComponents(hDlg, TRUE, FALSE);
break;
case IDC_RESETCOMPS:
ReinitModes(hDlg);
break;
}
break;
case WM_NOTIFY:
switch (((NMHDR FAR *) lParam)->code)
{
case PSN_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case PSN_SETACTIVE:
SetBannerText(hDlg);
g_iSelOpt = GetPrivateProfileInt( STRINGS, INSTALLMODE, 0, g_szCustInf );
if (g_fOCW)
{
PCOMPONENT pComp;
DisableDlgItem(hDlg, IDC_NEWOPT);
DisableDlgItem(hDlg, IDC_DELOPT);
ShowWindow(GetDlgItem(hDlg, IDC_OPTLIST), SW_HIDE);
LoadString(g_rvInfo.hInst, IDS_OCWOPTDESC, szOptDesc, countof(szOptDesc));
SetWindowText(GetDlgItem(hDlg, IDC_OPTIONTEXT3), szOptDesc);
// do not offer full mode for OCW
g_lpCifRWFile->DeleteMode(TEXT("2"));
g_lpCifRWFile->Flush();
for (pComp = g_paComp; ; pComp++ )
{
if (ISNULL(pComp->szSection)) break;
pComp->afInstall[2] = FALSE;
}
}
else
ShowWindow(GetDlgItem(hDlg, IDC_OPTLISTOCW), SW_HIDE);
if (s_fFirst)
{
InitSelection32(hDlg);
s_fFirst = FALSE;
}
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
CheckBatchAdvance(hDlg);
break;
case PSN_WIZNEXT:
if (GotRoom(hDlg) != 0) return(TRUE);
case PSN_WIZBACK:
if (!g_fBatch)
{
CNewCursor cur(IDC_WAIT);
if (s_fEditChange)
{
if (!SaveOption(hDlg, GetDlgItem(hDlg, g_fOCW ? IDC_OPTLISTOCW : IDC_OPTLIST)))
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
break;
}
s_fEditChange = FALSE;
}
SaveSelection();
for (iOpt = 0; iOpt < g_nModes ; iOpt++ )
{
*szModeChar = *szModeSect = szModeNameParm[1] = szModeDescParm[1] =
*szOptNameParam = *szOptDescParam = *szOptNum = (TCHAR)(iOpt + TEXT('0'));
{
ICifMode * pCifMode;
CCifMode_t * pCifMode_t;
g_lpCifRWFile->FindMode(szOptNum, &pCifMode);
pCifMode_t = new CCifMode_t((ICifRWMode *)pCifMode);
if (FAILED(pCifMode_t->GetDescription(szOptName, countof(szOptName))) ||
FAILED(pCifMode_t->GetDetails(szOptDesc, countof(szOptDesc))))
{
delete pCifMode_t;
ErrorMessageBox(hDlg, IDS_BLANKOPTION);
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
break;
}
delete pCifMode_t;
}
}
InsFlushChanges(g_szCustInf);
}
else
{
g_fMailNews95 = FALSE;
}
g_iCurPage = PPAGE_COMPSEL;
EnablePages();
if (((NMHDR FAR *) lParam)->code == PSN_WIZNEXT) PageNext(hDlg);
else
{
PagePrev(hDlg);
}
break;
case PSN_QUERYCANCEL:
QueryCancel(hDlg);
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
return TRUE;
}
BOOL InitList(HWND hwnd, UINT id)
{
HIMAGELIST himl; // handle of image list
HBITMAP hbmp; // handle of bitmap
HWND hwndList;
LVCOLUMN lvCol;
hwndList = GetDlgItem(hwnd, id);
// Create the image list.
if ((himl = ImageList_Create(CX_BITMAP, CY_BITMAP, 0, NUM_BITMAPS, 0)) == NULL)
return FALSE;
hbmp = LoadBitmap(g_rvInfo.hInst, MAKEINTRESOURCE(IDB_UNSELECT));
ImageList_Add(himl, hbmp, (HBITMAP) NULL);
DeleteObject(hbmp);
hbmp = LoadBitmap(g_rvInfo.hInst, MAKEINTRESOURCE(IDB_SELECT));
ImageList_Add(himl, hbmp, (HBITMAP) NULL);
DeleteObject(hbmp);
if (ImageList_GetImageCount(himl) < NUM_BITMAPS)
return FALSE;
// Associate the image list with the control.
ListView_SetImageList(hwndList, himl, LVSIL_SMALL);
ZeroMemory(&lvCol, sizeof(lvCol));
lvCol.mask = LVCF_FMT;
lvCol.fmt = LVCFMT_LEFT;
lvCol.cx = 280;
ListView_InsertColumn(hwndList, 0, &lvCol);
return TRUE;
}
void InitHiddenItems(UINT uListId)
{
TCHAR szBuf[8];
PCOMPONENT pComp;
if (uListId == IDC_COPYCOMP)
{
for (pComp = g_aCustComponents; *pComp->szSection; pComp++)
{
if (GetPrivateProfileString(IS_NOCOPYCUST, pComp->szGUID, TEXT(""), szBuf, countof(szBuf), g_szCustIns))
pComp->fNoCopy = TRUE;
}
for (pComp = g_paComp; *pComp->szSection; pComp++)
{
if (GetPrivateProfileString(IS_NOCOPYCUST, pComp->szGUID, TEXT(""), szBuf, countof(szBuf), g_szCustIns))
pComp->fNoCopy = TRUE;
}
}
else
{
for (pComp = g_aCustComponents; *pComp->szSection; pComp++)
{
if ((GetPrivateProfileString(IS_HIDECUST, pComp->szGUID, TEXT(""), szBuf, countof(szBuf), g_szCustIns)
&& (*szBuf == TEXT('1'))) || (ISNULL(szBuf) && !AnySelection(pComp)))
pComp->fCustomHide = TRUE;
}
for (pComp = g_paComp; *pComp->szSection; pComp++)
{
if (pComp->fAddOnOnly ||
(GetPrivateProfileString(IS_HIDECUST, pComp->szGUID, TEXT(""), szBuf, countof(szBuf), g_szCustIns)
&& (*szBuf == TEXT('1'))) || (ISNULL(szBuf) && !AnySelection(pComp)))
pComp->fCustomHide = TRUE;
}
}
}
// BUGBUG: <oliverl> should probably persist this server side only info in a server side file for IEAK6
void SaveHiddenItems(UINT uListId)
{
PCOMPONENT pComp;
if (uListId == IDC_COPYCOMP)
{
for (pComp = g_aCustComponents; *pComp->szSection; pComp++)
WritePrivateProfileString(IS_NOCOPYCUST, pComp->szGUID, pComp->fNoCopy ? TEXT("1") : NULL, g_szCustIns);
for (pComp = g_paComp; *pComp->szSection; pComp++)
WritePrivateProfileString(IS_NOCOPYCUST, pComp->szGUID, pComp->fNoCopy ? TEXT("1") : NULL, g_szCustIns);
}
else
{
for (pComp = g_aCustComponents; *pComp->szSection; pComp++)
WritePrivateProfileString(IS_HIDECUST, pComp->szGUID, pComp->fCustomHide ? TEXT("1") : TEXT("0"), g_szCustIns);
for (pComp = g_paComp; *pComp->szSection; pComp++)
WritePrivateProfileString(IS_HIDECUST, pComp->szGUID, (pComp->fCustomHide && !pComp->fAddOnOnly) ? TEXT("1") : TEXT("0"), g_szCustIns);
}
}
BOOL AddItemToList(PCOMPONENT pComp, HWND hDlg, UINT uListID, int& iItem)
{
LVITEM lvItem;
LVFINDINFO lvFind;
TCHAR szStatus[64];
HWND hwndList = GetDlgItem(hDlg, uListID);
if ((uListID == IDC_COPYCOMP) &&
(AnySelection(pComp) || (!pComp->fCustomHide)))
return FALSE;
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_TEXT | LVIF_IMAGE;
lvItem.iItem = iItem;
lvItem.pszText = pComp->szDisplayName;
if (uListID == IDC_COPYCOMP)
lvItem.iImage = pComp->fNoCopy ? 0 : 1;
else
lvItem.iImage = pComp->fCustomHide ? 0 : 1;
ZeroMemory(&lvFind, sizeof(lvFind));
lvFind.flags = LVFI_STRING;
lvFind.psz = pComp->szDisplayName;
if (ListView_FindItem(hwndList, -1, &lvFind) == -1)
{
ListView_InsertItem(hwndList, &lvItem);
if (uListID == IDC_HIDECOMP)
{
if (pComp->fCustomHide)
{
if (AnySelection(pComp))
LoadString(g_rvInfo.hInst, IDS_STATUSFORCE, szStatus, countof(szStatus));
else
LoadString(g_rvInfo.hInst, IDS_STATUSNOSHOW, szStatus, countof(szStatus));
}
else
LoadString(g_rvInfo.hInst, IDS_STATUSSHOW, szStatus, countof(szStatus));
ListView_SetItemText(hwndList, iItem, 1, szStatus);
}
iItem++;
}
return TRUE;
}
BOOL InitListControl(HWND hDlg, UINT uListID, BOOL fInit)
{
HWND hwndList = GetDlgItem(hDlg, uListID);
PCOMPONENT pComp;
LV_COLUMN lvCol;
TCHAR szHeader[MAX_PATH];
int iItem = 0;
BOOL bRet = FALSE;
ListView_DeleteAllItems(hwndList);
if (uListID == IDC_HIDECOMP)
{
ListView_DeleteColumn(hwndList, 1);
ListView_DeleteColumn(hwndList, 0);
}
if (!fInit)
return TRUE;
if (uListID == IDC_HIDECOMP)
{
ZeroMemory(&lvCol, sizeof(lvCol));
lvCol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
lvCol.fmt = LVCFMT_LEFT;
lvCol.cx = 280;
LoadString(g_rvInfo.hInst, IDS_COMPNAME, szHeader, countof(szHeader));
lvCol.pszText = szHeader;
ListView_InsertColumn(hwndList, 0, &lvCol);
ZeroMemory(&lvCol, sizeof(lvCol));
lvCol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
lvCol.fmt = LVCFMT_LEFT;
lvCol.cx = 140;
LoadString(g_rvInfo.hInst, IDS_STATUS, szHeader, countof(szHeader));
lvCol.pszText = szHeader;
ListView_InsertColumn(hwndList, 1, &lvCol);
}
for (pComp = g_paComp; *pComp->szSection; pComp++)
{
if ((pComp->iImage != RED) && pComp->fVisible && !pComp->fAddOnOnly &&
((pComp->iCompType != COMP_OPTIONAL) ||
((pComp->iCompType == COMP_OPTIONAL) && (pComp->iPlatform <= PLAT_W98))) &&
(StrCmpI(pComp->szSection, TEXT("DCOM95")) != 0)) // dcom should always be hidden in custom mode
bRet |= AddItemToList(pComp, hDlg, uListID, iItem);
}
for (pComp = g_aCustComponents; *pComp->szSection; pComp++)
bRet |= AddItemToList(pComp, hDlg, uListID, iItem);
ListView_SetColumnWidth(hwndList, 0, LVSCW_AUTOSIZE);
return bRet;
}
void CheckItem(HWND hDlg, UINT uListID, LVITEM * plvItem, int iCheck)
{
HWND hwndList = GetDlgItem(hDlg, uListID);
PCOMPONENT pComp;
BOOL fFound = FALSE;
BOOL fCustomHide = FALSE;
BOOL fForce = FALSE;
for (pComp = g_aCustComponents; *pComp->szSection; pComp++)
{
if (StrCmpI(plvItem->pszText, pComp->szDisplayName) == 0)
{
fForce = AnySelection(pComp);
if (uListID == IDC_COPYCOMP)
fCustomHide = (pComp->fNoCopy = ((iCheck == -1) ? !pComp->fNoCopy : (iCheck == 0)));
else
fCustomHide = (pComp->fCustomHide = ((iCheck == -1) ? !pComp->fCustomHide : (iCheck == 0)));
fFound = TRUE;
break;
}
}
if (!fFound)
{
for (pComp = g_paComp; *pComp->szSection; pComp++)
{
if (StrCmpI(plvItem->pszText, pComp->szDisplayName) == 0)
{
fForce = AnySelection(pComp);
if (uListID == IDC_COPYCOMP)
fCustomHide = (pComp->fNoCopy = ((iCheck == -1) ? !pComp->fNoCopy : (iCheck == 0)));
else
fCustomHide = (pComp->fCustomHide = ((iCheck == -1) ? !pComp->fCustomHide : (iCheck == 0)));
}
}
}
plvItem->mask = LVIF_IMAGE;
plvItem->iImage = fCustomHide ? 0 : 1;
ListView_SetItem(hwndList, plvItem);
if (uListID == IDC_HIDECOMP)
{
TCHAR szStatus[64];
if (fCustomHide)
{
if (fForce)
LoadString(g_rvInfo.hInst, IDS_STATUSFORCE, szStatus, countof(szStatus));
else
LoadString(g_rvInfo.hInst, IDS_STATUSNOSHOW, szStatus, countof(szStatus));
}
else
LoadString(g_rvInfo.hInst, IDS_STATUSSHOW, szStatus, countof(szStatus));
ListView_SetItemText(hwndList, plvItem->iItem, 1, szStatus);
}
}
void MaintToggleCheckItem(HWND hDlg, UINT uListID, int iItem)
{
LVITEM lvItem;
TCHAR szDisplayName[MAX_PATH];
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.iItem = iItem;
lvItem.pszText = szDisplayName;
lvItem.cchTextMax = countof(szDisplayName);
lvItem.mask = LVIF_TEXT;
if (ListView_GetItem(GetDlgItem(hDlg, uListID), &lvItem))
{
CheckItem(hDlg, uListID, &lvItem, -1);
}
}
void ListViewSelectAll(HWND hDlg, UINT uListID, BOOL fSet)
{
HWND hwndList = GetDlgItem(hDlg, uListID);
LVITEM lvItem;
TCHAR szDisplayName[MAX_PATH];
DWORD dwNumItems, dwIndex;
dwNumItems = ListView_GetItemCount(hwndList);
for (dwIndex=0; dwIndex < dwNumItems; dwIndex++)
{
lvItem.mask = LVIF_TEXT;
lvItem.iItem = (int) dwIndex;
lvItem.iSubItem = 0;
ZeroMemory(szDisplayName, sizeof(szDisplayName));
lvItem.pszText = szDisplayName;
lvItem.cchTextMax = countof(szDisplayName);
ListView_GetItem(hwndList, &lvItem);
CheckItem(hDlg, uListID, &lvItem, fSet ? 1 : 0);
}
}
//
// FUNCTION: CustomizeCustom(HWND, UINT, UINT, LONG)
//
// PURPOSE: Processes messages for "Customize Custom" page
//
// MESSAGES:
//
// WM_INITDIALOG - intializes the page
// WM_NOTIFY - processes the notifications sent to the page
// WM_COMMAND - saves the id of the choice selected
//
INT_PTR CALLBACK CustomizeCustom(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
HWND hwndList = GetDlgItem(hDlg, IDC_HIDECOMP);
int iItem;
switch (message)
{
case WM_INITDIALOG:
EnableDBCSChars(hDlg, IDC_HIDECOMP);
InitList(hDlg, IDC_HIDECOMP);
break;
case IDM_BATCHADVANCE:
DoBatchAdvance(hDlg);
break;
case WM_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED)
{
switch (LOWORD(wParam))
{
case IDC_HIDECHECKALL:
ListViewSelectAll(hDlg, IDC_HIDECOMP, TRUE);
break;
case IDC_HIDEUNCHECKALL:
ListViewSelectAll(hDlg, IDC_HIDECOMP, FALSE);
break;
}
}
break;
case WM_NOTIFY:
switch (((NMHDR FAR *) lParam)->code)
{
case LVN_KEYDOWN:
{
NMLVKEYDOWN *pnm = (NMLVKEYDOWN*) lParam;
if ( pnm->wVKey == VK_SPACE )
{
iItem = ListView_GetSelectionMark(hwndList);
MaintToggleCheckItem(hDlg, IDC_HIDECOMP, iItem);
}
break;
}
case NM_CLICK:
{
POINT pointScreen, pointLVClient;
DWORD dwPos;
LVHITTESTINFO HitTest;
dwPos = GetMessagePos();
pointScreen.x = LOWORD (dwPos);
pointScreen.y = HIWORD (dwPos);
pointLVClient = pointScreen;
// Convert the point from screen to client coordinates,
// relative to the Listview
ScreenToClient (hwndList, &pointLVClient);
HitTest.pt = pointLVClient;
ListView_HitTest(hwndList, &HitTest);
// Only if the user clicked on the checkbox icon/bitmap, change
if (HitTest.flags == LVHT_ONITEMICON)
MaintToggleCheckItem(hDlg, IDC_HIDECOMP, HitTest.iItem);
}
break;
case NM_DBLCLK:
if ( ((LPNMHDR)lParam)->idFrom == IDC_HIDECOMP)
{
iItem = ListView_GetSelectionMark(hwndList);
MaintToggleCheckItem(hDlg, IDC_HIDECOMP, iItem);
}
break;
case PSN_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case PSN_SETACTIVE:
SetBannerText(hDlg);
if (!g_fBatch)
{
BOOL fEnable = (!g_fSilent && !g_fStealth && !GetPrivateProfileInt(IS_BRANDING, TEXT("HideCustom"), 0, g_szCustIns));
EnableDlgItem2(hDlg, IDC_HIDECOMP, fEnable);
EnableDlgItem2(hDlg, IDC_HIDECHECKALL, fEnable);
EnableDlgItem2(hDlg, IDC_HIDEUNCHECKALL, fEnable);
InitHiddenItems(IDC_HIDECOMP);
InitListControl(hDlg, IDC_HIDECOMP, fEnable);
EnableDlgItem2(hDlg, IDC_WEBDLOPT, g_fDownload);
if (g_fDownload)
{
CheckDlgButton(hDlg, IDC_WEBDLOPT,
GetPrivateProfileInt(BRANDING, TEXT("NoIELite"), 1, g_szCustIns) ? BST_UNCHECKED : BST_CHECKED);
}
}
CheckBatchAdvance(hDlg);
break;
case PSN_WIZNEXT:
case PSN_WIZBACK:
if (!g_fBatch)
{
BOOL fNoIELite;
SaveHiddenItems(IDC_HIDECOMP);
if (g_fDownload)
{
fNoIELite = (IsDlgButtonChecked(hDlg, IDC_WEBDLOPT) == BST_CHECKED) ? FALSE : TRUE;
WritePrivateProfileString(BRANDING, TEXT("NoIELite"),
fNoIELite ? TEXT("1") : TEXT("0"), g_szCustIns);
}
}
g_iCurPage = PPAGE_CUSTOMCUSTOM;
EnablePages();
if (((NMHDR FAR *) lParam)->code == PSN_WIZNEXT) PageNext(hDlg);
else
{
PagePrev(hDlg);
}
break;
case PSN_QUERYCANCEL:
QueryCancel(hDlg);
break;
default:
return FALSE;
}
break;
case WM_LV_GETITEMS:
LVGetItems(GetDlgItem(hDlg, IDC_HIDECOMP));
break;
default:
return FALSE;
}
return TRUE;
}
//
// FUNCTION: CopyComp(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for "Copy Custom" page
//
// MESSAGES:
//
// WM_INITDIALOG - intializes the page
// WM_NOTIFY - processes the notifications sent to the page
// WM_COMMAND - saves the id of the choice selected
//
INT_PTR CALLBACK CopyComp(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
HWND hwndList = GetDlgItem(hDlg, IDC_COPYCOMP);
static BOOL s_fNext = TRUE;
int iItem;
switch (message)
{
case WM_INITDIALOG:
EnableDBCSChars(hDlg, IDC_COPYCOMP);
InitList(hDlg, IDC_COPYCOMP);
break;
case IDM_BATCHADVANCE:
DoBatchAdvance(hDlg);
break;
case WM_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED)
{
switch (LOWORD(wParam))
{
case IDC_COPYCHECKALL:
ListViewSelectAll(hDlg, IDC_COPYCOMP, TRUE);
break;
case IDC_COPYUNCHECKALL:
ListViewSelectAll(hDlg, IDC_COPYCOMP, FALSE);
break;
}
}
break;
case WM_NOTIFY:
switch (((NMHDR FAR *) lParam)->code)
{
case LVN_KEYDOWN:
{
NMLVKEYDOWN *pnm = (NMLVKEYDOWN*) lParam;
if ( pnm->wVKey == VK_SPACE )
{
iItem = ListView_GetSelectionMark(hwndList);
MaintToggleCheckItem(hDlg, IDC_COPYCOMP, iItem);
}
break;
}
case NM_CLICK:
{
POINT pointScreen, pointLVClient;
DWORD dwPos;
LVHITTESTINFO HitTest;
dwPos = GetMessagePos();
pointScreen.x = LOWORD (dwPos);
pointScreen.y = HIWORD (dwPos);
pointLVClient = pointScreen;
// Convert the point from screen to client coordinates,
// relative to the Listview
ScreenToClient (hwndList, &pointLVClient);
HitTest.pt = pointLVClient;
ListView_HitTest(hwndList, &HitTest);
// Only if the user clicked on the checkbox icon/bitmap, change
if (HitTest.flags == LVHT_ONITEMICON)
MaintToggleCheckItem(hDlg, IDC_COPYCOMP, HitTest.iItem);
}
break;
case NM_DBLCLK:
if ( ((LPNMHDR)lParam)->idFrom == IDC_COPYCOMP)
{
iItem = ListView_GetSelectionMark(hwndList);
MaintToggleCheckItem(hDlg, IDC_COPYCOMP, iItem);
}
break;
case PSN_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case PSN_SETACTIVE:
SetBannerText(hDlg);
if (!g_fBatch)
{
InitHiddenItems(IDC_COPYCOMP);
if (!g_fDownload && (g_fSilent || g_fStealth || InsGetBool(IS_BRANDING, TEXT("HideCustom"), FALSE, g_szCustIns)))
InitHiddenItems(IDC_HIDECOMP);
if (!InitListControl(hDlg, IDC_COPYCOMP, TRUE))
{
if (s_fNext)
PostMessage(GetParent(hDlg), PSM_PRESSBUTTON, PSBTN_NEXT, 0);
else
PostMessage(GetParent(hDlg), PSM_PRESSBUTTON, PSBTN_BACK, 0);
}
}
CheckBatchAdvance(hDlg);
break;
case PSN_WIZNEXT:
case PSN_WIZBACK:
if (!g_fBatch)
SaveHiddenItems(IDC_COPYCOMP);
g_iCurPage = PPAGE_COPYCOMP;
EnablePages();
if (((NMHDR FAR *) lParam)->code == PSN_WIZNEXT)
{
s_fNext = FALSE;
PageNext(hDlg);
}
else
{
s_fNext = TRUE;
PagePrev(hDlg);
}
break;
case PSN_QUERYCANCEL:
QueryCancel(hDlg);
break;
default:
return FALSE;
}
break;
case WM_LV_GETITEMS:
LVGetItems(GetDlgItem(hDlg, IDC_COPYCOMP));
break;
default:
return FALSE;
}
return TRUE;
}
BOOL g_fUrlsInit = FALSE;
static IDownloadSiteMgr * s_pSiteMgr = NULL;
static int s_aiSites[NUMSITES];
static BOOL s_fInChange = FALSE;
void SetCustSite(HWND hDlg, int iSite)
{
PSITEDATA psd = &g_aCustSites[iSite];
HWND hBaseUList = GetDlgItem(hDlg, IDC_BASEURLLIST);
LV_ITEM lvItem;
s_fInChange = TRUE;
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_TEXT;
lvItem.iItem = iSite;
lvItem.pszText = psd->szName;
ListView_SetItem(hBaseUList, &lvItem);
lvItem.iSubItem = 1;
lvItem.pszText = psd->szUrl;
ListView_SetItem(hBaseUList, &lvItem);
lvItem.pszText = psd->szRegion;
lvItem.iSubItem = 2;
ListView_SetItem(hBaseUList, &lvItem);
s_fInChange = FALSE;
}
void CopyAdmFiles()
{
TCHAR szAdmSrcPath[MAX_PATH];
TCHAR szAdmSrcFile[MAX_PATH];
TCHAR szAdmDestFile[MAX_PATH];
HANDLE hFind = NULL;
WIN32_FIND_DATA wfdFind;
BOOL bDirCreated = FALSE;
PathCombine(szAdmSrcPath, g_szWizRoot, TEXT("iebin"));
PathAppend(szAdmSrcPath, g_szLanguage);
PathAppend(szAdmSrcPath, TEXT("optional"));
PathAppend(szAdmSrcPath, TEXT("*.adm"));
hFind = FindFirstFile( szAdmSrcPath, &wfdFind );
if( hFind == INVALID_HANDLE_VALUE )
return;
do
{
StrCpy(szAdmSrcFile, szAdmSrcPath);
PathRemoveFileSpec(szAdmSrcFile);
PathAppend(szAdmSrcFile, wfdFind.cFileName);
PathCombine(szAdmDestFile, g_szWizRoot, TEXT("policies"));
PathAppend(szAdmDestFile, g_szLanguage);
if(!bDirCreated)
{
PathCreatePath(szAdmDestFile);
bDirCreated = TRUE;
}
PathAppend(szAdmDestFile, wfdFind.cFileName);
CopyFile(szAdmSrcFile, szAdmDestFile, FALSE);
DeleteFile(szAdmSrcFile);
}while( FindNextFile( hFind, &wfdFind ));
FindClose(hFind);
}
void SaveDownloadUrls()
{
int iBase = s_aiSites[0];
TCHAR szIEAKCabUrl[MAX_URL];
TCHAR szCabPath[MAX_PATH];
BOOL fDownloadOpt = TRUE;
BOOL fIgnore = FALSE;
static BOOL s_fFirst = TRUE;
TCHAR szVersionNew[32];
TCHAR szOptIniFile[MAX_PATH];
s_fNoNet = FALSE;
ICifComponent * pCifComponent;
ResetEvent(g_hProcessInfEvent);
if (!g_fBatch2)
{
if (s_pSiteMgr)
{
DOWNLOADSITE *pSite;
IDownloadSite *pISite;
TCHAR szLang[8];
for (int i=0; i<NUMSITES; i++)
{
s_pSiteMgr->EnumSites(i, &pISite);
if (!pISite) break;
pISite->GetData(&pSite);
A2Tbux(pSite->pszLang, szLang);
if (0 == StrCmpI(szLang, g_szActLang)) {
A2Tbux(pSite->pszUrl, g_szBaseURL);
break;
}
pISite->Release();
}
}
PathCombine(g_szMastInf, g_szWizRoot, TEXT("iebin"));
PathAppend(g_szMastInf, g_szLanguage);
PathAppend(g_szMastInf, TEXT("Optional"));
PathCreatePath(g_szMastInf);
PathRemoveBackslash(g_szMastInf);
}
// wait for cif to be downloaded so we can check version
while (MsgWaitForMultipleObjects(1, &g_hCifEvent, FALSE, INFINITE, QS_ALLINPUT) != WAIT_OBJECT_0)
{
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
if (g_lpCifFileNew != NULL)
{
if (!g_fLocalMode)
{
// check version before downloading opt cab
if (SUCCEEDED(g_lpCifFileNew->FindComponent(TEXT("IEAK6OPT"), &pCifComponent)))
{
DWORD dwVer, dwBuild;
TCHAR szVersion[32];
PathCombine(szOptIniFile, g_szMastInf, TEXT("ieak6opt.ini"));
pCifComponent->GetVersion(&dwVer, &dwBuild);
ConvertDwordsToVersionStr(szVersionNew, dwVer, dwBuild);
GetPrivateProfileString(TEXT("ieak6OPT"), VERSION, TEXT("-1"), szVersion, countof(szVersion), szOptIniFile);
if ((StrCmp(szVersion, TEXT("-1")) != 0) &&
(StrCmpI(szVersion, szVersionNew) == 0)) // is opt cab up to date ?
fDownloadOpt = FALSE;
}
}
}
if (!g_fLocalMode && s_fFirst)
{
s_fFirst = FALSE;
wnsprintf(szIEAKCabUrl, countof(szIEAKCabUrl), TEXT("%s/ieak6opt.cab"), g_szBaseURL);
PathCombine(szCabPath, g_szBuildTemp, TEXT("ieak6opt.cab"));
if (fDownloadOpt)
{
// if we are attempting to download the opt cab, delete iesetup.inf in the opt dir
// first and we'll use this as a flag to determine whether or not download &
// extraction succeeded
// Also delete ieak6opt.ini. In case the download fails, this will force a download
// next time ieak runs. Otherwise iesetup.inf never get created.
// See bug 13467-IEv60
DeleteFileInDir(TEXT("iesetup.inf"), g_szMastInf);
DeleteFileInDir(TEXT("ieak6opt.ini"), g_szMastInf);
if (DownloadCab(g_hWizard, szIEAKCabUrl, szCabPath, NULL, 0, fIgnore) == NOERROR)
{
if (ExtractFilesWrap(szCabPath, g_szMastInf, 0, NULL, NULL, 0) != NOERROR)
DeleteFileInDir(TEXT("iesetup.inf"), g_szMastInf);
else
{
SetCurrentDirectory( g_szMastInf);
SetAttribAllEx(g_szMastInf, TEXT("*.*"), FILE_ATTRIBUTE_NORMAL, TRUE);
CopyAdmFiles();
WritePrivateProfileString(TEXT("ieak6OPT"), VERSION, szVersionNew, szOptIniFile);
}
// delete the downloaded ieak6opt.cab from the temp dir so we don't copy
// it to the target folder during the build process later
DeleteFile(szCabPath);
}
}
}
PathCombine(g_szDefInf, g_szMastInf, TEXT("DefFav.inf"));
PathAppend(g_szMastInf, TEXT("IeSetup.Inf"));
PathCombine(g_szCustInf, g_szBuildRoot, TEXT("INS"));
PathAppend(g_szCustInf, GetOutputPlatformDir());
PathAppend(g_szCustInf, g_szLanguage);
PathAppend(g_szCustInf, TEXT("IESetup.inf"));
if (GetFileAttributes(g_szCustInf) == 0xFFFFFFFF)
{
CopyFile(g_szMastInf, g_szCustInf, FALSE);
}
else
{
UpdateInf(g_szMastInf, g_szCustInf);
}
SetEvent(g_hProcessInfEvent);
}
void GetSiteDataPath(void)
{
TCHAR szIEAKIni[MAX_PATH];
PathCombine(szIEAKIni, g_szWizRoot, TEXT("ieak.ini"));
switch (g_dwPlatformId)
{
case PLATFORM_WIN32:
default:
GetPrivateProfileString(TEXT("IEAK"), TEXT("Win32"), TEXT(""), s_szSiteData, countof(s_szSiteData), szIEAKIni);
break;
}
}
void IE4BatchSetup()
{
TCHAR szSectBuf[1024];
TCHAR szSrcCustInf[MAX_PATH];
DWORD sWrk, sCif;
PCOMPONENT pComp;
HANDLE hFind;
WIN32_FIND_DATA fd;
LPTSTR pBack;
int nComp;
PathCombine(g_szCustInf, g_szBuildRoot, TEXT("INS"));
PathAppend(g_szCustInf, GetOutputPlatformDir());
PathAppend(g_szCustInf, g_szLanguage);
PathCreatePath(g_szCustInf);
PathCombine(szSrcCustInf, g_szSrcRoot, TEXT("INS"));
PathAppend(szSrcCustInf, GetOutputPlatformDir());
PathAppend(szSrcCustInf, g_szLanguage);
if (g_fBatch2)
{
StrCpy(g_szBaseURL,g_szSrcRoot);
StrCpy(g_szMastInf,g_szCustInf);
s_fNoNet = FALSE;
}
if (g_fBatch2 && PathFileExists(szSrcCustInf) && PathFileExists(g_szCustInf))
{
CopyFilesSrcToDest(szSrcCustInf, TEXT("*.inf"), g_szCustInf);
CopyFilesSrcToDest(szSrcCustInf, TEXT("*.ins"), g_szCustInf);
CopyFilesSrcToDest(szSrcCustInf, TEXT("*.cif"), g_szCustInf);
CopyFilesSrcToDest(szSrcCustInf, TEXT("*.in_"), g_szCustInf);
}
PathAppend(g_szCustInf, TEXT("IESetup.inf"));
// initialize deffav.inf path
PathCombine(g_szDefInf, g_szWizRoot, TEXT("IEBIN"));
PathAppend(g_szDefInf, g_szLanguage);
PathAppend(g_szDefInf, TEXT("OPTIONAL\\DEFFAV.INF"));
PathCombine(g_szMastInf, g_szWizRoot, TEXT("IESetup.inf"));
if ((hFind = FindFirstFile( g_szCustInf, &fd )) == INVALID_HANDLE_VALUE)
{
CopyFile(g_szMastInf, g_szCustInf, FALSE);
}
else
FindClose(hFind);
GetSiteDataPath();
InitCustComponents(NULL);
sWrk = MAX_PATH;
GetModuleFileName( NULL, g_szIEAKProg, MAX_PATH );
pBack = StrRChr(g_szIEAKProg, NULL, TEXT('\\'));
if (pBack)
*pBack = TEXT('\0');
PathAppend(g_szIEAKProg, TEXT("Download"));
PathAppend(g_szIEAKProg, g_szLanguage);
PathCreatePath(g_szIEAKProg);
PathCombine(g_szCif, g_szBuildRoot, TEXT("INS"));
PathAppend(g_szCif, GetOutputPlatformDir());
PathAppend(g_szCif, g_szLanguage);
PathAppend(g_szCif, TEXT("IESetup.cif"));
if (!PathFileExists(g_szCif))
{
TCHAR szCifFile[MAX_PATH];
PathCombine(szCifFile, g_szIEAKProg, TEXT("IESetup.cif"));
CopyFile(szCifFile, g_szCif, FALSE);
}
StrCpy(s_szCifCabURL, g_szBaseURL);
StrCat(s_szCifCabURL, TEXT("/IECIF.CAB"));
StrCpy(s_szCifNew, g_szIEAKProg);
PathAppend(s_szCifNew, TEXT("new"));
PathCreatePath(s_szCifNew);
PathAppend(s_szCifNew, TEXT("IEsetup.cif"));
{
IEnumCifModes * pEnumCifModes;
ICifComponent * pCifComponent;
GetICifFileFromFile_t(&g_lpCifFileNew, s_szCifNew);
GetICifRWFileFromFile_t(&g_lpCifRWFile, g_szCif);
if (!g_lpCifRWFile)
{
if (g_hLogFile)
{
TCHAR szError[MAX_PATH];
DWORD dwNumWritten;
LoadString(g_rvInfo.hInst,IDS_ERROR_CIFRWFILE,szError,MAX_PATH);
WriteFile(g_hLogFile,szError,StrLen(szError),&dwNumWritten,NULL);
}
return;
}
// initialie set of modes
if (SUCCEEDED(g_lpCifRWFile->EnumModes(&pEnumCifModes,
PLATFORM_WIN98 | PLATFORM_NT4 | PLATFORM_NT5 | PLATFORM_MILLEN, NULL)))
{
TCHAR szModeID[64];
ICifMode * pCifMode;
int i=0;
while (SUCCEEDED(pEnumCifModes->Next(&pCifMode)))
{
CCifMode_t * pCifMode_t = new CCifMode_t((ICifRWMode *)pCifMode);
pCifMode_t->GetID(szModeID, countof(szModeID));
g_szAllModes[i] = szModeID[0];
i++;
delete pCifMode_t;
}
pEnumCifModes->Release();
}
// initialize version number
if (SUCCEEDED(g_lpCifRWFile->FindComponent(BASEWIN32, &pCifComponent)) ||
SUCCEEDED(g_lpCifRWFile->FindComponent(TEXT("BASEIE40_NTAlpha"), &pCifComponent)))
{
DWORD dwVer, dwBuild;
pCifComponent->GetVersion(&dwVer, &dwBuild);
ConvertDwordsToVersionStr(g_szJobVersion, dwVer, dwBuild);
}
}
sCif = GetPrivateProfileString( NULL, NULL, NULL, szSectBuf, countof(szSectBuf), s_szCifNew );
nComp = 20 + sCif/4;
pComp = g_paComp = (PCOMPONENT) LocalAlloc(LPTR, nComp * sizeof(COMPONENT) );
ZeroMemory(g_paComp, nComp * sizeof(COMPONENT));
}
void UpdateInf(LPTSTR szMasterInf, LPTSTR szUserInf)
{
TCHAR szInfBack[MAX_PATH];
LPTSTR pDot, pBuf, pParm;
SetFileAttributes(szUserInf, FILE_ATTRIBUTE_NORMAL);
StrCpy(szInfBack, szUserInf);
pDot = StrRChr(szInfBack, NULL, TEXT('.'));
if (!pDot) return;
StrCpy(pDot, TEXT(".bak"));
DeleteFile( szInfBack );
MoveFile( szUserInf, szInfBack );
CopyFile(szMasterInf, szUserInf, FALSE);
SetFileAttributes(szUserInf, FILE_ATTRIBUTE_NORMAL);
pBuf = (LPTSTR) LocalAlloc(LPTR, INF_BUF_SIZE);
if (pBuf)
{
GetPrivateProfileString( STRINGS, NULL, TEXT(""), pBuf, ARRAYSIZE(pBuf), szInfBack );
pParm = pBuf;
while (*pParm)
{
TCHAR szValBuf[MAX_PATH];
GetPrivateProfileString( STRINGS, pParm, TEXT(""), szValBuf, countof(szValBuf), szInfBack );
InsWriteQuotedString( STRINGS, pParm, szValBuf, szUserInf );
pParm += lstrlen(pParm) + 1;
}
LocalFree(pBuf);
}
}
BOOL GotLang(LPTSTR szLang)
{
int i;
for (i = 0; i < g_nLangs ; i++ )
{
if (StrCmpI(szLang, g_aszLang[i]) == 0) return(TRUE);
}
return(FALSE);
}
extern DWORD g_aLangId[];
extern DWORD g_wCurLang;
DWORD DownloadSiteThreadProc(LPVOID)
{
int i;
TCHAR szBuf[8];
TCHAR szLang[8];
TCHAR szLocaleIni[MAX_PATH];
DWORD dwErr;
HWND hBaseUList;
WIN32_FIND_DATA fd;
DWORD dwRet = WAIT_OBJECT_0;
MSG msg;
LPMULTILANGUAGE pMLang = NULL;
int iEnglish = 0, iCurLang = 0;
USES_CONVERSION;
CoInitialize(NULL);
g_fCancelled = FALSE;
dwErr = CoCreateInstance(CLSID_DownloadSiteMgr, NULL, CLSCTX_INPROC_SERVER,
IID_IDownloadSiteMgr, (void **) &s_pSiteMgr);
if(!s_pSiteMgr)
{
dwErr = GetLastError();
g_fLangInit = TRUE;
SendMessage( g_hDlg, IDM_INITIALIZE, 0, 0 );
PropSheet_SetWizButtons(GetParent(g_hDlg), PSWIZB_BACK | PSWIZB_NEXT);
CoUninitialize();
return(dwErr);
}
g_hDownloadEvent = CreateEvent( NULL, FALSE, FALSE, TEXT("SiteMgrEvent") );
g_hProcessInfEvent = CreateEvent( NULL, TRUE, FALSE, TEXT("ProcessInfEvent") );
g_hCifEvent = CreateEvent( NULL, TRUE, FALSE, TEXT("CifEvent") );
GetSiteDataPath();
while (!(g_fDone || g_fCancelled))
{
if (dwRet == WAIT_OBJECT_0) switch (g_iDownloadState)
{
case DOWN_STATE_IDLE:
break;
case DOWN_STATE_ENUM_LANG:
wnsprintf(szBuf, countof(szBuf), TEXT("%04lx"), g_wCurLang);
PathCombine(szLocaleIni, g_szWizRoot, TEXT("Locale.INI"));
if (GetPrivateProfileString( IS_ACTIVESETUP, szBuf, TEXT(""), g_szActLang,
countof(g_szActLang), szLocaleIni ) == 0)
{
// check for sublocale defaults
GetPrivateProfileString( TEXT("SubLocales"), szBuf, TEXT("EN"), g_szActLang,
countof(g_szActLang), szLocaleIni );
}
iCurLang = -1;
dwErr = CoCreateInstance(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
IID_IMultiLanguage, (void **) &pMLang);
if (!g_fLocalMode)
{
TCHAR szMsg[MAX_PATH];
LoadString(g_rvInfo.hInst, IDS_AVSINITFAIL, szMsg, countof(szMsg));
do
{
CHAR szSiteDataA[MAX_PATH];
dwErr = s_pSiteMgr->Initialize(T2Abux(s_szSiteData, szSiteDataA), NULL);
}
while ((dwErr != NOERROR) && (MessageBox(g_hDlg, szMsg, g_szTitle, MB_RETRYCANCEL) == IDRETRY));
}
if (dwErr != NOERROR)
{
s_pSiteMgr->Release();
s_pSiteMgr = NULL;
g_fLocalMode = TRUE;
}
if (!g_fLocalMode)
{
for (i = 0, g_nLangs = 0; ; i++ )
{
DOWNLOADSITE *pSite;
IDownloadSite *pISite;
if (!s_pSiteMgr) break;
s_pSiteMgr->EnumSites(i, &pISite);
if (!pISite) break;
pISite->GetData(&pSite);
A2Tbux(pSite->pszLang, szLang);
if (StrCmpI(szLang, TEXT("US")) == 0)
StrCpy(szLang, TEXT("EN"));
if (!GotLang(szLang))
{
if (StrCmpI(szLang, g_szActLang) == 0) iCurLang = g_nLangs;
if (StrCmpI(szLang, TEXT("EN")) == 0) iEnglish = g_nLangs;
StrCpy(g_aszLang[g_nLangs], szLang);
GetPrivateProfileString(IS_STRINGS, szLang, TEXT(""), s_aszLangDesc[g_nLangs], 64, szLocaleIni);
if (pMLang)
{
RFC1766INFO rInfo;
LCID lcid;
CharLower(szLang);
if ((dwErr = GetLcid(&lcid, szLang, szLocaleIni)) == NOERROR)
{
g_aLangId[g_nLangs] = lcid;
if (ISNULL(s_aszLangDesc[g_nLangs]))
{
dwErr = pMLang->GetRfc1766Info(lcid, &rInfo);
W2Tbux(rInfo.wszLocaleName, s_aszLangDesc[g_nLangs]);
}
}
}
if (dwErr == NOERROR)
SendDlgItemMessage(g_hDlg, IDC_LANGUAGE, CB_ADDSTRING, 0, (LPARAM)s_aszLangDesc[g_nLangs++] );
if (g_nLangs >= NUMLANG) break;
}
}
if (iCurLang == -1) iCurLang = iEnglish;
if (pMLang) pMLang->Release();
}
else
{
TCHAR szDownloadDir[MAX_PATH];
BOOL fNoMore = FALSE;
HANDLE hFind = NULL;
for (i = 0, g_nLangs = 0; ; i++ )
{
if (hFind == NULL)
{
PathCombine(szDownloadDir, g_szIEAKProg, TEXT("*.*"));
hFind = FindFirstFile(szDownloadDir, &fd);
}
else
fNoMore = FindNextFile(hFind, &fd) ? FALSE : TRUE;
while (!fNoMore && (hFind != INVALID_HANDLE_VALUE) && (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|| (StrCmp(fd.cFileName, TEXT(".")) == 0) || (StrCmp(fd.cFileName, TEXT("..")) == 0)))
{
if (!FindNextFile(hFind, &fd))
{
fNoMore = TRUE;
break;
}
}
if (fNoMore)
{
FindClose(hFind);
break;
}
if (hFind == INVALID_HANDLE_VALUE)
break;
if (StrCmpI(fd.cFileName, g_szActLang) == 0) iCurLang = g_nLangs;
if (StrCmpI(fd.cFileName, TEXT("EN")) == 0) iEnglish = g_nLangs;
StrCpy(g_aszLang[g_nLangs], fd.cFileName);
GetPrivateProfileString(IS_STRINGS, fd.cFileName, TEXT(""), s_aszLangDesc[g_nLangs], 64, szLocaleIni);
if (pMLang)
{
RFC1766INFO rInfo;
LCID lcid;
CharLower(fd.cFileName);
if ((dwErr = GetLcid(&lcid, fd.cFileName, szLocaleIni)) == NOERROR)
{
g_aLangId[g_nLangs] = lcid;
if (ISNULL(s_aszLangDesc[g_nLangs]))
{
dwErr = pMLang->GetRfc1766Info(lcid, &rInfo);
W2Tbux(rInfo.wszLocaleName, s_aszLangDesc[g_nLangs]);
}
}
}
if (dwErr == NOERROR)
SendDlgItemMessage(g_hDlg, IDC_LANGUAGE, CB_ADDSTRING, 0, (LPARAM)s_aszLangDesc[g_nLangs++] );
if (g_nLangs >= NUMLANG) break;
}
if (iCurLang == -1) iCurLang = iEnglish;
}
SendDlgItemMessage( g_hDlg, IDC_LANGUAGE, CB_SETCURSEL, iCurLang, 0 );
g_fLangInit = TRUE;
SendMessage( g_hDlg, IDM_INITIALIZE, 0, 0 );
PropSheet_SetWizButtons(GetParent(g_hDlg), PSWIZB_BACK | PSWIZB_NEXT);
g_iDownloadState = DOWN_STATE_IDLE;
break;
case DOWN_STATE_ENUM_URL:
hBaseUList = GetDlgItem(g_hDlg, IDC_BASEURLLIST);
if (*g_szLanguage == TEXT('\\'))
StrCpy(szBuf, g_szLanguage + 1);
else
StrCpy(szBuf, g_szLanguage);
szBuf[2] = TEXT('\0');
if (s_pSiteMgr)
{
int iSite = 0;
SendDlgItemMessage(g_hDlg, IDC_DOWNLOADLIST, CB_RESETCONTENT, 0, 0);
for (i = 0; ; i++)
{
DOWNLOADSITE *pSite;
IDownloadSite *pISite;
if (!s_pSiteMgr)
break;
s_pSiteMgr->EnumSites(i, &pISite);
if (!pISite)
break;
pISite->GetData(&pSite);
A2Tbux(pSite->pszLang, szLang);
if (StrCmpI(szLang, szBuf) == 0)
{
TCHAR szFriendlyName[MAX_PATH];
s_aiSites[iSite++] = i;
A2Tbux(pSite->pszFriendlyName, szFriendlyName);
SendDlgItemMessage(g_hDlg, IDC_DOWNLOADLIST, CB_ADDSTRING,
0, (LPARAM) szFriendlyName );
}
pISite->Release();
if (iSite >= NUMSITES)
break;
}
}
g_fUrlsInit = TRUE;
SendDlgItemMessage( g_hDlg, IDC_DOWNLOADLIST, CB_SETCURSEL, 0, 0L );
SetFocus( hBaseUList );
SendMessage(g_hDlg, IDM_INITIALIZE, 0, 0 );
PropSheet_SetWizButtons(GetParent(g_hDlg), PSWIZB_BACK | PSWIZB_NEXT);
g_iDownloadState = DOWN_STATE_IDLE;
break;
case DOWN_STATE_SAVE_URL:
SaveDownloadUrls();
g_iDownloadState = DOWN_STATE_IDLE;
break;
}
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
dwRet = MsgWaitForMultipleObjects(1, &g_hDownloadEvent, FALSE, INFINITE, QS_ALLINPUT);
}
if (s_pSiteMgr) s_pSiteMgr->Release();
s_pSiteMgr = 0;
if (s_hInet)
{
InternetCloseHandle(s_hInet);
s_hInet = NULL;
}
CloseHandle(g_hDownloadEvent);
CloseHandle(g_hProcessInfEvent);
CloseHandle(g_hCifEvent);
g_hDownloadEvent = 0;
g_hProcessInfEvent = 0;
g_hCifEvent = 0;
CoUninitialize();
return(0);
}
void InitializeUserDownloadSites(HWND hDlg)
{
int i;
HWND hBaseUList = GetDlgItem(hDlg, IDC_BASEURLLIST);
LV_COLUMN lvCol;
TCHAR szColHead[80];
PSITEDATA psd;
if (hDlg != NULL)
{
ZeroMemory(&lvCol, sizeof(lvCol));
lvCol.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
lvCol.fmt = LVCFMT_LEFT;
lvCol.cx = 80;
lvCol.pszText = szColHead;
LoadString( g_rvInfo.hInst, IDS_DOWNSITEREGION, szColHead, countof(szColHead) );
lvCol.iSubItem = 3;
ListView_InsertColumn(hBaseUList, 0, &lvCol);
lvCol.cx = 125;
lvCol.iSubItem = 2;
LoadString( g_rvInfo.hInst, IDS_DOWNSITEURL, szColHead, countof(szColHead) );
ListView_InsertColumn(hBaseUList, 0, &lvCol);
lvCol.cx = 125;
lvCol.iSubItem = 1;
LoadString( g_rvInfo.hInst, IDS_DOWNSITENAME, szColHead, countof(szColHead) );
ListView_InsertColumn(hBaseUList, 0, &lvCol);
}
for (i = 0, psd = g_aCustSites; ; i++, psd++ )
{
TCHAR szBaseUrlParm[32];
LV_ITEM lvItem;
LPTSTR pSlash;
ZeroMemory(psd, sizeof(SITEDATA));
wnsprintf(szBaseUrlParm, countof(szBaseUrlParm), TEXT("SiteName%i"), i);
GetPrivateProfileString(IS_ACTIVESETUP_SITES, szBaseUrlParm, TEXT(""), psd->szName, 80, g_szCustIns );
if (ISNULL(psd->szName)) break;
wnsprintf(szBaseUrlParm, countof(szBaseUrlParm), TEXT("SiteUrl%i"), i);
GetPrivateProfileString(IS_ACTIVESETUP_SITES, szBaseUrlParm, TEXT(""), psd->szUrl, MAX_URL, g_szCustIns );
pSlash = StrRChr(psd->szUrl, NULL, TEXT('/'));
if (pSlash != NULL)
{
if (StrCmpI(pSlash, TEXT("/WIN32")) == 0)
{
LPTSTR pOld = pSlash;
*pSlash = TEXT('\0');
pSlash = StrRChr(psd->szUrl, NULL, TEXT('/'));
if (pSlash != NULL)
{
if (StrCmpI(pSlash, TEXT("/DOWNLOAD")) == 0)
{
*pSlash = TEXT('\0');
}
else
*pOld = TEXT('/');
}
}
}
wnsprintf(szBaseUrlParm, countof(szBaseUrlParm), TEXT("SiteRegion%i"), i);
GetPrivateProfileString(IS_ACTIVESETUP_SITES, szBaseUrlParm, TEXT(""), psd->szRegion, 80, g_szCustIns );
g_nDownloadUrls++;
if (hDlg != NULL)
{
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_TEXT;
lvItem.iItem = i;
lvItem.pszText = psd->szName;
ListView_InsertItem(hBaseUList, &lvItem);
lvItem.iSubItem = 1;
lvItem.pszText = psd->szUrl;
ListView_SetItem(hBaseUList, &lvItem);
lvItem.pszText = psd->szRegion;
lvItem.iSubItem = 2;
ListView_SetItem(hBaseUList, &lvItem);
}
}
if (hDlg != NULL)
{
if (g_nDownloadUrls)
{
SetDlgItemText( hDlg, IDE_DOWNSITENAME, g_aCustSites->szName );
SetDlgItemText( hDlg, IDE_DOWNSITEURL, g_aCustSites->szUrl );
SetDlgItemText( hDlg, IDE_DOWNSITEREGION, g_aCustSites->szRegion );
}
else
{
DisableDlgItem(hDlg, IDE_DOWNSITENAME);
DisableDlgItem(hDlg, IDE_DOWNSITEURL);
DisableDlgItem(hDlg, IDE_DOWNSITEREGION);
DisableDlgItem(hDlg, IDC_DOWNSITENAME_TXT);
DisableDlgItem(hDlg, IDC_DOWNSITEURL_TXT);
DisableDlgItem(hDlg, IDC_DOWNSITEREGION_TXT);
}
ListView_SetItemState(hBaseUList, 0, LVIS_SELECTED | LVIS_FOCUSED,
LVIS_SELECTED | LVIS_FOCUSED);
}
}
void SetDownloadSiteEditControls(HWND hDlg, int nSite)
{
if (nSite >= 0)
{
PSITEDATA psd = &g_aCustSites[nSite];
SetDlgItemText( hDlg, IDE_DOWNSITENAME, psd->szName );
SetDlgItemText( hDlg, IDE_DOWNSITEURL, psd->szUrl );
SetDlgItemText( hDlg, IDE_DOWNSITEREGION, psd->szRegion );
}
else
{
SetDlgItemText( hDlg, IDE_DOWNSITENAME, TEXT("") );
SetDlgItemText( hDlg, IDE_DOWNSITEURL, TEXT("") );
SetDlgItemText( hDlg, IDE_DOWNSITEREGION, TEXT("") );
}
}
//
// FUNCTION: ComponentSelect(HWND, UINT, UINT, LONG)
//
// PURPOSE: Processes messages for "ComponentSelect" page
//
// MESSAGES:
//
// WM_INITDIALOG - intializes the page
// WM_NOTIFY - processes the notifications sent to the page
// WM_COMMAND - saves the id of the choice selected
//
//
INT_PTR CALLBACK ComponentUrls(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
TCHAR szDownTpl[MAX_PATH];
LV_ITEM lvItem;
HWND hUrlList = GetDlgItem( hDlg, IDC_BASEURLLIST);
PSITEDATA psd = &g_aCustSites[g_iSelSite];
static BOOL s_fNext = TRUE;
static BOOL s_fUserSitesInit = FALSE;
static BOOL s_fErrMessageShown = FALSE;
switch (message)
{
case WM_INITDIALOG:
g_hWizard = hDlg;
EnableDBCSChars( hDlg, IDC_BASEURLLIST);
EnableDBCSChars( hDlg, IDE_DOWNSITENAME);
EnableDBCSChars( hDlg, IDE_DOWNSITEREGION);
EnableDBCSChars( hDlg, IDE_DOWNSITEURL );
break;
case IDM_INITIALIZE:
if ((g_hWait != NULL) && g_fUrlsInit)
{
SendMessage(g_hWait, WM_CLOSE, 0, 0);
g_hWait = NULL;
}
break;
case WM_DESTROY:
break;
case IDM_BATCHADVANCE:
DoBatchAdvance(hDlg);
break;
case WM_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED)
{
int i;
switch (LOWORD(wParam))
{
case IDC_ADDBASEURL:
if (g_nDownloadUrls &&
IsWindowEnabled(GetDlgItem(hDlg, IDE_DOWNSITENAME)) &&
(!CheckField(hDlg, IDE_DOWNSITENAME, FC_NONNULL) ||
!CheckField(hDlg, IDE_DOWNSITEURL, FC_NONNULL | FC_URL) ||
!CheckField(hDlg, IDE_DOWNSITEREGION, FC_NONNULL)))
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
break;
}
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_TEXT;
ListView_SetItemState(hUrlList, g_iSelSite, LVIS_SELECTED | LVIS_FOCUSED, 0);
lvItem.iItem = g_iSelSite = g_nDownloadUrls;
psd = &g_aCustSites[g_nDownloadUrls];
lvItem.pszText = psd->szName;
LoadString( g_rvInfo.hInst, IDS_DOWNLOADURL, szDownTpl, 80 );
wnsprintf(psd->szUrl, countof(psd->szUrl), TEXT("http://%s%i"), szDownTpl, g_nDownloadUrls);
LoadString( g_rvInfo.hInst, IDS_DOWNLOADSITE, szDownTpl, 80 );
wnsprintf(psd->szName, countof(psd->szName), TEXT("%s%i"), szDownTpl, g_nDownloadUrls++);
LoadString( g_rvInfo.hInst, IDS_NORTHAMERICA, psd->szRegion, 80 );
ListView_InsertItem(hUrlList, &lvItem);
SetCustSite(hDlg, g_iSelSite);
ListView_SetItemState(hUrlList, g_iSelSite,
LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
if (!IsWindowEnabled(GetDlgItem(GetParent(hDlg), IDC_NEXT)))
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
EnableDlgItem(hDlg, IDE_DOWNSITENAME);
EnableDlgItem(hDlg, IDE_DOWNSITEURL);
EnableDlgItem(hDlg, IDE_DOWNSITEREGION);
EnableDlgItem(hDlg, IDC_REMOVEBASEURL);
EnableDlgItem(hDlg, IDC_DOWNSITENAME_TXT);
EnableDlgItem(hDlg, IDC_DOWNSITEURL_TXT);
EnableDlgItem(hDlg, IDC_DOWNSITEREGION_TXT);
SetFocus(GetDlgItem( hDlg, IDE_DOWNSITENAME));
EnableDlgItem2(hDlg, IDC_ADDBASEURL, (g_nDownloadUrls < ((g_fIntranet && (g_fSilent || g_fStealth)) ? 1 : 10)));
SendMessage(GetDlgItem( hDlg, IDE_DOWNSITENAME), EM_SETSEL, 0, -1);
break;
case IDC_REMOVEBASEURL:
s_fInChange = TRUE;
if(ListView_DeleteItem(hUrlList, g_iSelSite))
{
for (i = g_iSelSite; i <= g_nDownloadUrls ; i++)
{
g_aCustSites[i] = g_aCustSites[i + 1];
}
g_nDownloadUrls--;
}
s_fInChange = FALSE;
EnableDlgItem2(hDlg, IDC_ADDBASEURL, (g_nDownloadUrls < ((g_fIntranet && (g_fSilent || g_fStealth)) ? 1 : 10)));
if (g_nDownloadUrls == 0) {
int rgids[] = { IDE_DOWNSITENAME, IDE_DOWNSITEURL, IDE_DOWNSITEREGION, IDC_REMOVEBASEURL };
int rgtxtids[] = { IDC_DOWNSITENAME_TXT, IDC_DOWNSITEURL_TXT, IDC_DOWNSITEREGION_TXT };
ZeroMemory(g_aCustSites, sizeof(COMPONENT));
EnsureDialogFocus(hDlg, rgids, countof(rgids), IDC_ADDBASEURL);
DisableDlgItems (hDlg, rgids, countof(rgids));
DisableDlgItems (hDlg, rgtxtids, countof(rgtxtids));
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
}
if (g_iSelSite >= g_nDownloadUrls) g_iSelSite--;
SetDownloadSiteEditControls(hDlg, g_iSelSite);
ListView_SetItemState(hUrlList, g_iSelSite,
LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
break;
}
}
else if (HIWORD(wParam) == EN_CHANGE)
{
switch (LOWORD(wParam))
{
case IDE_DOWNSITENAME:
GetDlgItemText( hDlg, IDE_DOWNSITENAME, psd->szName, countof(psd->szName) );
break;
case IDE_DOWNSITEURL:
GetDlgItemText( hDlg, IDE_DOWNSITEURL, psd->szUrl, countof(psd->szUrl) );
break;
case IDE_DOWNSITEREGION:
GetDlgItemText( hDlg, IDE_DOWNSITEREGION, psd->szRegion, countof(psd->szRegion) );
break;
}
SetCustSite(hDlg, g_iSelSite);
}
break;
case WM_NOTIFY:
switch (((NMHDR FAR *) lParam)->code)
{
int i;
case LVN_ITEMCHANGED:
case LVN_ITEMCHANGING:
if (s_fInChange) break;
// BUGBUG: <oliverl> crazy hack to eat up the second LVN_ITEMCHANGING
// msg we get in the error case. I can't figure out any way
// to distinguish the two.
if ((g_nDownloadUrls > 1) && s_fErrMessageShown &&
(!GetDlgItemText(hDlg, IDE_DOWNSITENAME, szDownTpl, countof(szDownTpl)) ||
!GetDlgItemText(hDlg, IDE_DOWNSITEURL, szDownTpl, countof(szDownTpl)) ||
!PathIsURL(szDownTpl) ||
!GetDlgItemText(hDlg, IDE_DOWNSITEREGION, szDownTpl, countof(szDownTpl))))
{
s_fErrMessageShown = FALSE;
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
break;
}
if ((g_nDownloadUrls > 1) &&
(!CheckField(hDlg, IDE_DOWNSITENAME, FC_NONNULL) ||
!CheckField(hDlg, IDE_DOWNSITENAME, FC_NONNULL) ||
!CheckField(hDlg, IDE_DOWNSITENAME, FC_NONNULL)))
{
s_fErrMessageShown = TRUE;
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
break;
}
for (i = 0; i < g_nDownloadUrls ; i++ )
{
DWORD dwState = ListView_GetItemState(hUrlList, i, LVIS_SELECTED | LVIS_FOCUSED);
if (dwState == (LVIS_FOCUSED | LVIS_SELECTED))
{
g_iSelSite = i;
SetDownloadSiteEditControls(hDlg, g_iSelSite);
}
}
break;
case PSN_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case PSN_SETACTIVE:
if (!s_fUserSitesInit)
{
InitializeUserDownloadSites(hDlg);
s_fUserSitesInit = TRUE;
}
if (!PageEnabled(PPAGE_COMPURLS))
PostMessage(GetParent(hDlg), PSM_PRESSBUTTON, s_fNext ? PSBTN_NEXT : PSBTN_BACK, 0);
else
{
SetBannerText(hDlg);
EnableDlgItem2(hDlg, IDC_ADDBASEURL, (g_nDownloadUrls < ((g_fIntranet && (g_fSilent || g_fStealth)) ? 1 : 10)));
EnableDlgItem2(hDlg, IDC_REMOVEBASEURL, (g_nDownloadUrls != 0));
PropSheet_SetWizButtons(GetParent(hDlg), (g_nDownloadUrls == 0) ? PSWIZB_BACK : PSWIZB_BACK | PSWIZB_NEXT);
CheckBatchAdvance(hDlg);
}
break;
case PSN_WIZNEXT:
case PSN_WIZBACK:
WritePrivateProfileString( IS_ACTIVESETUP_SITES, NULL, NULL, g_szCustIns );
for (i = 0, psd = g_aCustSites; i < 10 ; i++, psd++ )
{
TCHAR szBaseUrlParm[32];
LPTSTR pSlash;
if (ISNONNULL(psd->szUrl) && !PathIsURL(psd->szUrl))
{
ErrorMessageBox(hDlg, IDS_INVALID_URL);
SetCustSite(hDlg, i);
SetFocus(hUrlList);
ListView_SetItemState(hUrlList, i, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
break;
}
pSlash = StrRChr(psd->szUrl, NULL, TEXT('/'));
if (pSlash != NULL)
{
if (StrCmpI(pSlash, TEXT("/WIN32")) == 0)
{
LPTSTR pOld = pSlash;
*pSlash = TEXT('\0');
pSlash = StrRChr(psd->szUrl, NULL, TEXT('/'));
if (pSlash != NULL)
{
if (StrCmpI(pSlash, TEXT("/DOWNLOAD")) == 0)
{
*pSlash = TEXT('\0');
}
else
*pOld = TEXT('/');
}
}
}
if (!g_fBatch && (i < g_nDownloadUrls) && (ISNULL(psd->szUrl)
|| ISNULL(psd->szName) || ISNULL(psd->szRegion)))
{
ErrorMessageBox(hDlg, IDS_BLANKSITE);
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
return TRUE;
}
if ((StrChr(psd->szName, TEXT(',')) != NULL) ||
(StrChr(psd->szRegion, TEXT(',')) != NULL))
{
ErrorMessageBox(hDlg, IDS_ERROR_COMMA);
SetCustSite(hDlg, i);
SetFocus(hUrlList);
ListView_SetItemState(hUrlList, i, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
return TRUE;
}
if (psd->szUrl[lstrlen(psd->szUrl)-1] == TEXT('/'))
psd->szUrl[lstrlen(psd->szUrl)-1] = TEXT('\0');
if(!g_fOCW && ISNONNULL(psd->szUrl))
{
StrCat(psd->szUrl, TEXT("/DOWNLOAD/"));
StrCat(psd->szUrl, GetOutputPlatformDir());
psd->szUrl[lstrlen(psd->szUrl)-1] = TEXT('\0');
}
wnsprintf(szBaseUrlParm, countof(szBaseUrlParm), TEXT("SiteUrl%i"), i);
WritePrivateProfileString( IS_ACTIVESETUP_SITES, szBaseUrlParm, psd->szUrl, g_szCustIns );
wnsprintf(szBaseUrlParm, countof(szBaseUrlParm), TEXT("SiteName%i"), i);
WritePrivateProfileString( IS_ACTIVESETUP_SITES, szBaseUrlParm, psd->szName, g_szCustIns );
wnsprintf(szBaseUrlParm, countof(szBaseUrlParm), TEXT("SiteRegion%i"), i);
WritePrivateProfileString( IS_ACTIVESETUP_SITES, szBaseUrlParm, psd->szRegion, g_szCustIns );
}
g_iCurPage = PPAGE_COMPURLS;
EnablePages();
if (((NMHDR FAR *) lParam)->code == PSN_WIZNEXT)
{
s_fNext = FALSE;
PageNext(hDlg);
}
else
{
s_fNext = TRUE;
PagePrev(hDlg);
}
break;
case PSN_QUERYCANCEL:
QueryCancel(hDlg);
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
return TRUE;
}
INT_PTR CALLBACK AddOnDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fNoAddon,
fDefAddon,
fCustAddon,
fUseMSSite;
TCHAR szAddOnUrl[INTERNET_MAX_URL_LENGTH],
szMenuText[128];
INT id;
switch (uMsg)
{
case WM_INITDIALOG:
EnableDBCSChars(hDlg, IDE_ADDONURL);
Edit_LimitText(GetDlgItem(hDlg, IDE_ADDONURL), countof(szAddOnUrl) - 1);
EnableDBCSChars(hDlg, IDE_MENUTEXT);
Edit_LimitText(GetDlgItem(hDlg, IDE_MENUTEXT), countof(szMenuText) - 1);
break;
case WM_NOTIFY:
switch (((NMHDR FAR *) lParam)->code)
{
case PSN_SETACTIVE:
SetBannerText(hDlg);
// no addon menu is available only in the corp mode
if (g_fIntranet)
{
fNoAddon = InsGetBool(IS_BRANDING, IK_NO_ADDON, FALSE, g_szCustIns);
ShowWindow(GetDlgItem(hDlg, IDC_NO_ADDON), SW_SHOW);
}
else
{
fNoAddon = FALSE;
ShowWindow(GetDlgItem(hDlg, IDC_NO_ADDON), SW_HIDE);
}
fDefAddon = InsGetBool(IS_BRANDING, IK_DEF_ADDON, FALSE, g_szCustIns);
fCustAddon = InsGetBool(IS_BRANDING, IK_CUST_ADDON, FALSE, g_szCustIns);
if (fNoAddon)
id = IDC_NO_ADDON;
else if (fDefAddon)
id = IDC_DEF_ADDON;
else if (fCustAddon)
id = IDC_CUST_ADDON;
else
id = IDC_DEF_ADDON; // default radio button
CheckRadioButton(hDlg, IDC_NO_ADDON, IDC_CUST_ADDON, id);
GetPrivateProfileString(IS_BRANDING, IK_HELP_MENU_TEXT, TEXT(""), szMenuText, countof(szMenuText), g_szCustIns);
SetDlgItemText(hDlg, IDE_MENUTEXT, szMenuText);
GetPrivateProfileString(IS_BRANDING, IK_ADDONURL, TEXT(""), szAddOnUrl, countof(szAddOnUrl), g_szCustIns);
SetDlgItemText(hDlg, IDE_ADDONURL, szAddOnUrl);
EnableDlgItem2(hDlg, IDC_MENUTEXT, fCustAddon);
EnableDlgItem2(hDlg, IDE_MENUTEXT, fCustAddon);
EnableDlgItem2(hDlg, IDC_ADDONURL, fCustAddon);
EnableDlgItem2(hDlg, IDE_ADDONURL, fCustAddon);
fUseMSSite = InsGetBool(IS_BRANDING, IK_ALT_SITES_URL, FALSE, g_szCustIns);
CheckDlgButton(hDlg, IDC_MSDL, fUseMSSite ? BST_CHECKED : BST_UNCHECKED);
CheckBatchAdvance(hDlg);
break;
case PSN_WIZBACK:
case PSN_WIZNEXT:
if (IsDlgButtonChecked(hDlg, IDC_CUST_ADDON) == BST_CHECKED)
if (!CheckField(hDlg, IDE_MENUTEXT, FC_NONNULL) ||
!CheckField(hDlg, IDE_ADDONURL, FC_NONNULL | FC_URL))
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
return TRUE;
}
if (g_fIntranet)
fNoAddon = (IsDlgButtonChecked(hDlg, IDC_NO_ADDON) == BST_CHECKED);
else
fNoAddon = FALSE;
fDefAddon = (IsDlgButtonChecked(hDlg, IDC_DEF_ADDON) == BST_CHECKED);
fCustAddon = (IsDlgButtonChecked(hDlg, IDC_CUST_ADDON) == BST_CHECKED);
if ((!g_fBatch) && (!g_fBatch2))
{
InsWriteBool(IS_BRANDING, IK_NO_ADDON, fNoAddon, g_szCustIns);
InsWriteBool(IS_BRANDING, IK_DEF_ADDON, fDefAddon, g_szCustIns);
InsWriteBool(IS_BRANDING, IK_CUST_ADDON, fCustAddon, g_szCustIns);
}
GetDlgItemText(hDlg, IDE_MENUTEXT, szMenuText, countof(szMenuText));
InsWriteString(IS_BRANDING, IK_HELP_MENU_TEXT, szMenuText, g_szCustIns);
GetDlgItemText(hDlg, IDE_ADDONURL, szAddOnUrl, countof(szAddOnUrl));
InsWriteString(IS_BRANDING, IK_ADDONURL, szAddOnUrl, g_szCustIns);
fUseMSSite = (IsDlgButtonChecked(hDlg, IDC_MSDL) == BST_CHECKED);
InsWriteBool(IS_BRANDING, IK_ALT_SITES_URL, fUseMSSite, g_szCustIns);
g_iCurPage = PPAGE_ADDON;
EnablePages();
(((NMHDR FAR *) lParam)->code == PSN_WIZNEXT) ? PageNext(hDlg) : PagePrev(hDlg);
break;
case PSN_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case PSN_QUERYCANCEL:
QueryCancel(hDlg);
break;
default:
return FALSE;
}
break;
case WM_COMMAND:
switch (HIWORD(wParam))
{
case BN_CLICKED:
switch(LOWORD(wParam))
{
case IDC_NO_ADDON:
case IDC_DEF_ADDON:
case IDC_CUST_ADDON:
fCustAddon = (IsDlgButtonChecked(hDlg, IDC_CUST_ADDON) == BST_CHECKED);
EnableDlgItem2(hDlg, IDC_MENUTEXT, fCustAddon);
EnableDlgItem2(hDlg, IDE_MENUTEXT, fCustAddon);
EnableDlgItem2(hDlg, IDC_ADDONURL, fCustAddon);
EnableDlgItem2(hDlg, IDE_ADDONURL, fCustAddon);
break;
}
break;
}
break;
case WM_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case IDM_BATCHADVANCE:
DoBatchAdvance(hDlg);
break;
default:
return FALSE;
}
return TRUE;
}
//
// FUNCTION: UserAgentString(HWND, UINT, UINT, LONG)
//
// PURPOSE: Processes messages for "UserAgentString" page
//
// MESSAGES:
//
// WM_INITDIALOG - intializes the page
// WM_NOTIFY - processes the notifications sent to the page
// WM_COMMAND - saves the id of the choice selected
//
//
INT_PTR CALLBACK UserAgentString( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
BOOL fChecked = FALSE;
switch( msg )
{
case WM_INITDIALOG:
EnableDBCSChars(hDlg, IDC_UASTRING);
Edit_LimitText(GetDlgItem(hDlg, IDC_UASTRING), MAX_PATH - 1);
g_hWizard = hDlg;
break;
case IDM_BATCHADVANCE:
DoBatchAdvance(hDlg);
break;
case WM_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case WM_COMMAND:
if (GET_WM_COMMAND_CMD(wParam, lParam) != BN_CLICKED)
return FALSE;
switch (GET_WM_COMMAND_ID(wParam, lParam))
{
case IDC_UASTRINGCHECK:
fChecked = (IsDlgButtonChecked(hDlg, IDC_UASTRINGCHECK) == BST_CHECKED);
EnableDlgItem2(hDlg, IDC_UASTRING, fChecked);
EnableDlgItem2(hDlg, IDC_UASTRING_TXT, fChecked);
break;
default:
return FALSE;
}
break;
case WM_NOTIFY:
switch (((NMHDR FAR *) lParam)->code)
{
case PSN_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case PSN_SETACTIVE:
SetBannerText(hDlg);
SetDlgItemTextFromIns(hDlg, IDC_UASTRING, IDC_UASTRINGCHECK, IS_BRANDING,
USER_AGENT, g_szCustIns, NULL, INSIO_TRISTATE);
EnableDlgItem2(hDlg, IDC_UASTRING_TXT, (IsDlgButtonChecked(hDlg, IDC_UASTRINGCHECK) == BST_CHECKED));
CheckBatchAdvance(hDlg);
break;
case PSN_WIZBACK:
case PSN_WIZNEXT:
g_iCurPage = PPAGE_UASTRDLG;
WriteDlgItemTextToIns(hDlg, IDC_UASTRING, IDC_UASTRINGCHECK, IS_BRANDING,
USER_AGENT, g_szCustIns, NULL, INSIO_TRISTATE);
EnablePages();
(((LPNMHDR)lParam)->code == PSN_WIZNEXT) ? PageNext(hDlg) : PagePrev(hDlg);
break;
case PSN_QUERYCANCEL:
QueryCancel(hDlg);
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
return TRUE;
}
INT_PTR CALLBACK ActiveSetupDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
TCHAR szActSetupTitle[50];
switch (uMsg)
{
case WM_INITDIALOG:
EnableDBCSChars(hDlg, IDE_TITLE);
EnableDBCSChars(hDlg, IDE_WIZBITMAPPATH);
EnableDBCSChars(hDlg, IDE_WIZBITMAPPATH2);
EnableDBCSChars(hDlg, IDC_CCTITLE);
Edit_LimitText(GetDlgItem(hDlg, IDE_TITLE), countof(szActSetupTitle) - 1);
Edit_LimitText(GetDlgItem(hDlg, IDE_WIZBITMAPPATH), MAX_PATH - 1);
Edit_LimitText(GetDlgItem(hDlg, IDE_WIZBITMAPPATH2), MAX_PATH - 1);
Edit_LimitText(GetDlgItem(hDlg, IDC_CCTITLE), countof(g_szCustItems) - 1);
break;
case WM_NOTIFY:
switch (((NMHDR FAR *) lParam)->code)
{
case PSN_SETACTIVE:
{
TCHAR szActSetupBitmap[MAX_PATH];
SetBannerText(hDlg);
// IEAKLite mode clean-up: delete the bmp files from the temp dir
DeleteFileInDir(TEXT("actsetup.bmp"), g_szBuildTemp);
DeleteFileInDir(TEXT("topsetup.bmp"), g_szBuildTemp);
// read title
GetPrivateProfileString(IS_ACTIVESETUP, IK_WIZTITLE, TEXT(""), szActSetupTitle, countof(szActSetupTitle), g_szCustIns);
SetDlgItemText(hDlg, IDE_TITLE, szActSetupTitle);
// read left bitmap path
GetPrivateProfileString(IS_ACTIVESETUP, IK_WIZBMP, TEXT(""), szActSetupBitmap, countof(szActSetupBitmap), g_szCustIns);
SetDlgItemText(hDlg, IDE_WIZBITMAPPATH, szActSetupBitmap);
// read top banner bitmap path
if (IsWindowEnabled(GetDlgItem(hDlg, IDE_WIZBITMAPPATH2)))
{
GetPrivateProfileString(IS_ACTIVESETUP, IK_WIZBMP2, TEXT(""), szActSetupBitmap, countof(szActSetupBitmap), g_szCustIns);
SetDlgItemText(hDlg, IDE_WIZBITMAPPATH2, szActSetupBitmap);
}
// read cutom components title
if (g_nCustComp)
{
GetPrivateProfileString(STRINGS, CUSTITEMS, TEXT(""), g_szCustItems, countof(g_szCustItems), g_szCustInf);
if (*g_szCustItems == TEXT('\0'))
LoadString(g_rvInfo.hInst, IDS_CUSTOMCOMPTITLE, g_szCustItems, countof(g_szCustItems));
}
else
*g_szCustItems = TEXT('\0');
SetDlgItemText(hDlg, IDC_CCTITLE, g_szCustItems);
EnableDlgItem2(hDlg, IDC_CCTITLE, *g_szCustItems ? TRUE : FALSE);
EnableDlgItem2(hDlg, IDC_CCTITLE_TXT, *g_szCustItems ? TRUE : FALSE);
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT | PSWIZB_BACK);
CheckBatchAdvance(hDlg);
break;
}
case PSN_WIZBACK:
case PSN_WIZNEXT:
{
TCHAR szActSetupBitmap[MAX_PATH] = TEXT(""),
szActSetupBitmap2[MAX_PATH] = TEXT("");
LPCTSTR pszTmp;
if (!IsBitmapFileValid(hDlg, IDE_WIZBITMAPPATH, szActSetupBitmap, NULL, 164, 312, IDS_TOOBIG164x312, IDS_TOOSMALL164x312))
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
return TRUE;
}
// error checking for top bitmap
if (IsWindowEnabled(GetDlgItem(hDlg, IDE_WIZBITMAPPATH2)))
{
if (!IsBitmapFileValid(hDlg, IDE_WIZBITMAPPATH2, szActSetupBitmap2, NULL, 496, 56, IDS_TOOBIG496x56, IDS_TOOSMALL496x56))
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
return TRUE;
}
}
else
*szActSetupBitmap2 = TEXT('\0');
// error checking for custom components title
if (IsWindowEnabled(GetDlgItem(hDlg, IDC_CCTITLE)))
{
GetDlgItemText(hDlg, IDC_CCTITLE, g_szCustItems, countof(g_szCustItems));
if (*g_szCustItems == TEXT('\0'))
{
ErrorMessageBox(hDlg, IDS_CUSTOMCOMPTITLE_ERROR);
SetFocus(GetDlgItem(hDlg, IDC_CCTITLE));
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
return TRUE;
}
}
else
*g_szCustItems = TEXT('\0');
// write title
GetDlgItemText(hDlg, IDE_TITLE, szActSetupTitle, countof(szActSetupTitle));
pszTmp = (*szActSetupTitle ? szActSetupTitle : NULL);
WritePrivateProfileString(IS_ACTIVESETUP, IK_WIZTITLE, pszTmp, g_szCustIns);
InsWriteQuotedString(BRANDING, IK_WIZTITLE, pszTmp, g_szCustInf);
// write left bitmap path
if (*szActSetupBitmap)
{
TCHAR szDest[MAX_PATH];
pszTmp = szActSetupBitmap;
PathCombine(szDest, g_szBuildTemp, TEXT("actsetup.bmp"));
CopyFile(szActSetupBitmap, szDest, FALSE);
}
else
pszTmp = NULL;
InsWriteQuotedString(IS_ACTIVESETUP, IK_WIZBMP, pszTmp, g_szCustIns);
InsWriteQuotedString(BRANDING, IK_WIZBMP, pszTmp != NULL ? TEXT("actsetup.bmp") : NULL, g_szCustInf);
// write top bitmap path
if (*szActSetupBitmap2)
{
TCHAR szDest[MAX_PATH];
pszTmp = szActSetupBitmap2;
PathCombine(szDest, g_szBuildTemp, TEXT("topsetup.bmp"));
CopyFile(szActSetupBitmap2, szDest, FALSE);
}
else
pszTmp = NULL;
InsWriteQuotedString(IS_ACTIVESETUP, IK_WIZBMP2, pszTmp, g_szCustIns);
InsWriteQuotedString(BRANDING, IK_WIZBMP2, pszTmp != NULL ? TEXT("topsetup.bmp") : NULL, g_szCustInf);
// write custom components title
pszTmp = (*g_szCustItems ? g_szCustItems : NULL);
InsWriteQuotedString(STRINGS, CUSTITEMS, pszTmp, g_szCustInf);
g_iCurPage = PPAGE_SETUPWIZARD;
EnablePages();
(((NMHDR FAR *) lParam)->code == PSN_WIZNEXT) ? PageNext(hDlg) : PagePrev(hDlg);
break;
}
case PSN_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case PSN_QUERYCANCEL:
QueryCancel(hDlg);
break;
default:
return FALSE;
}
break;
case WM_COMMAND:
switch (HIWORD(wParam))
{
case BN_CLICKED:
switch(LOWORD(wParam))
{
TCHAR szActSetupBitmap[MAX_PATH];
case IDC_BROWSEWIZPATH:
GetDlgItemText(hDlg, IDE_WIZBITMAPPATH, szActSetupBitmap, countof(szActSetupBitmap));
if (BrowseForFile(hDlg, szActSetupBitmap, countof(szActSetupBitmap), GFN_BMP))
SetDlgItemText(hDlg, IDE_WIZBITMAPPATH, szActSetupBitmap);
break;
case IDC_BROWSEWIZPATH2:
GetDlgItemText(hDlg, IDE_WIZBITMAPPATH2, szActSetupBitmap, countof(szActSetupBitmap));
if (BrowseForFile(hDlg, szActSetupBitmap, countof(szActSetupBitmap), GFN_BMP))
SetDlgItemText(hDlg, IDE_WIZBITMAPPATH2, szActSetupBitmap);
break;
}
break;
}
break;
case WM_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case IDM_BATCHADVANCE:
DoBatchAdvance(hDlg);
break;
default:
return FALSE;
}
return TRUE;
}
#define MINCMAKVER TEXT("4.71.0819.0")
BOOL g_fCustomICMPro = FALSE;
INT_PTR CALLBACK InternetConnMgr(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
TCHAR szCmd[MAX_PATH+8];
LPTSTR pName;
DWORD dwSize;
switch (message)
{
case WM_INITDIALOG:
g_hWizard = hDlg;
InitSysFont( hDlg, IDE_ICMPRO);
//BUGBUG: (a-saship) for now disable CMAK and once its confirmed remove all references to CMAK
DisableDlgItem(hDlg, IDC_STARTCMAK);
HideDlgItem(hDlg, IDC_STARTCMAK);
HideDlgItem(hDlg, IDC_CMAKICON);
break;
case IDM_BATCHADVANCE:
DoBatchAdvance(hDlg);
break;
case WM_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED)
switch(LOWORD(wParam))
{
case IDC_BROWSEICMPRO:
GetDlgItemText(hDlg, IDE_ICMPRO, g_szCustIcmPro, countof(g_szCustIcmPro));
if (BrowseForFile(hDlg, g_szCustIcmPro, countof(g_szCustIcmPro), GFN_EXE))
SetDlgItemText(hDlg, IDE_ICMPRO, g_szCustIcmPro);
break;
case IDC_ICMPROCHECK:
g_fCustomICMPro = (IsDlgButtonChecked( hDlg, IDC_ICMPROCHECK ) == BST_CHECKED);
EnableDlgItem2(hDlg, IDE_ICMPRO, g_fCustomICMPro);
EnableDlgItem2(hDlg, IDC_BROWSEICMPRO, g_fCustomICMPro);
EnableDlgItem2(hDlg, IDC_ICMPRO_TXT, g_fCustomICMPro);
break;
case IDC_STARTCMAK:
dwSize = sizeof(szCmd);
if (SHGetValue(HKEY_LOCAL_MACHINE, CURRENTVERSIONKEY TEXT("\\App Paths\\cmak.exe"), NULL, NULL,
(LPVOID)szCmd, &dwSize) == ERROR_SUCCESS)
{
DWORD dwExitCode;
StrCat(szCmd, TEXT(" /i"));
if (RunAndWait(szCmd, g_szWizRoot, SW_SHOW, &dwExitCode) && (dwExitCode == IDOK))
{
dwSize = sizeof(g_szCustIcmPro);
if (SHGetValue(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Connection Manager Administration Kit"),
TEXT("Output"), NULL, (LPVOID)g_szCustIcmPro, &dwSize) == ERROR_SUCCESS)
{
g_fCustomICMPro = TRUE;
EnableDlgItem2(hDlg, IDE_ICMPRO, g_fCustomICMPro);
EnableDlgItem2(hDlg, IDC_BROWSEICMPRO, g_fCustomICMPro);
EnableDlgItem2(hDlg, IDC_ICMPRO_TXT, g_fCustomICMPro);
SetDlgItemText(hDlg, IDE_ICMPRO, g_szCustIcmPro);
CheckDlgButton(hDlg, IDC_ICMPROCHECK, BST_CHECKED);
}
}
}
else
ErrorMessageBox(hDlg, IDS_NOCMAK);
break;
}
break;
case WM_NOTIFY:
switch (((NMHDR FAR *) lParam)->code)
{
case PSN_HELP:
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
break;
case PSN_SETACTIVE:
SetBannerText(hDlg);
g_fCustomICMPro = GetPrivateProfileInt( BRANDING, CMUSECUSTOM, 0, g_szCustIns );
CheckDlgButton( hDlg, IDC_ICMPROCHECK, g_fCustomICMPro );
GetPrivateProfileString( BRANDING, CMPROFILEPATH, TEXT(""),
g_szCustIcmPro, countof(g_szCustIcmPro), g_szCustIns );
SetDlgItemText( hDlg, IDE_ICMPRO, g_szCustIcmPro );
EnableDlgItem2(hDlg, IDE_ICMPRO, g_fCustomICMPro);
EnableDlgItem2(hDlg, IDC_BROWSEICMPRO, g_fCustomICMPro);
EnableDlgItem2(hDlg, IDC_ICMPRO_TXT, g_fCustomICMPro);
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT | PSWIZB_BACK);
CheckBatchAdvance(hDlg);
break;
case PSN_WIZBACK:
case PSN_WIZNEXT:
GetDlgItemText( hDlg, IDE_ICMPRO, g_szCustIcmPro, countof(g_szCustIcmPro) );
if(IsDlgButtonChecked(hDlg, IDC_ICMPROCHECK) == BST_CHECKED && !CheckField(hDlg, IDE_ICMPRO, FC_NONNULL | FC_FILE | FC_EXISTS))
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
return TRUE;
}
WritePrivateProfileString( BRANDING, CMPROFILEPATH, g_szCustIcmPro, g_szCustIns );
pName = StrRChr(g_szCustIcmPro, NULL, TEXT('\\'));
if (pName) pName++;
else pName = g_szCustIcmPro;
WritePrivateProfileString( BRANDING, CMPROFILENAME, pName, g_szCustIns );
WritePrivateProfileString( BRANDING, CMUSECUSTOM, (g_fCustomICMPro ? TEXT("1") : TEXT("0")), g_szCustIns);
if (g_fCustomICMPro)
{
TCHAR szDisplayName[MAX_PATH];
TCHAR szGUID[MAX_PATH];
TCHAR szUrl[80];
TCHAR szVersion[64];
LPTSTR pFile, pDot;
DWORD dwVer, dwBuild;
GUID guid;
GetVersionFromFileWrap(g_szCustIcmPro, &dwVer, &dwBuild, TRUE);
ConvertDwordsToVersionStr(szVersion, dwVer, dwBuild);
if (CheckVer(szVersion, MINCMAKVER) <= 0)
{
ErrorMessageBox(hDlg, IDS_ERROR_CMAKVER);
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
return TRUE;
}
GetPrivateProfileString( CUSTCMSECT, TEXT("GUID"), TEXT(""), szGUID, countof(szGUID), g_szCustCif );
if (ISNULL(szGUID))
{
if (CoCreateGuid(&guid) == NOERROR)
CoStringFromGUID(guid, szGUID, countof(szGUID));
}
LoadString( g_rvInfo.hInst, IDS_CUSTICMPRO, szDisplayName, countof(szDisplayName) );
InsWriteQuotedString( CUSTCMSECT, TEXT("DisplayName"), szDisplayName, g_szCustCif );
InsWriteQuotedString( CUSTCMSECT, TEXT("GUID"), szGUID, g_szCustCif );
InsWriteQuotedString( CUSTCMSECT, TEXT("Command1"), pName, g_szCustCif );
wnsprintf(szUrl, countof(szUrl), TEXT("%s"), pName);
WritePrivateProfileString( CUSTCMSECT, TEXT("URL1"), szUrl, g_szCustCif );
pFile = PathFindFileName(g_szCustIcmPro);
pDot = StrChr(pFile, TEXT('.'));
if (pDot)
*pDot = TEXT('\0');
wnsprintf(szDisplayName, countof(szDisplayName), TEXT("/q:a /r:n /c:\"cmstp.exe /i %s.inf\""), pFile);
if (pDot)
*pDot = TEXT('.');
InsWriteQuotedString( CUSTCMSECT, TEXT("Switches1"), szDisplayName, g_szCustCif );
WritePrivateProfileString( CUSTCMSECT, TEXT("Type1"), TEXT("2"), g_szCustCif );
// bump up the version number if it already exists, otherwise use the defined version in
// iedkbrnd.h
if (GetPrivateProfileString( CUSTCMSECT, VERSION, g_szJobVersion, szVersion, countof(szVersion), g_szCustCif ))
{
LPTSTR pComma;
INT iVer;
pComma = StrRChr(szVersion, NULL, TEXT(','));
if (pComma == NULL)
pComma = szVersion;
iVer = StrToInt( pComma + 1 );
iVer++;
wnsprintf(pComma, MAX_PATH, TEXT(",%i"), iVer);
WritePrivateProfileString(CUSTCMSECT, VERSION, szVersion, g_szCustCif);
}
}
else
{
WritePrivateProfileString( CUSTCMSECT, NULL, NULL, g_szCustCif );
}
g_iCurPage = PPAGE_ICM;
EnablePages();
if (((NMHDR FAR *) lParam)->code == PSN_WIZNEXT) PageNext(hDlg);
else
{
PagePrev(hDlg);
}
break;
case PSN_QUERYCANCEL:
QueryCancel(hDlg);
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
return TRUE;
}