mirror of
https://github.com/rn10950/RetroZilla.git
synced 2024-11-16 12:30:13 +01:00
6490 lines
204 KiB
C
6490 lines
204 KiB
C
|
/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||
|
*
|
||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||
|
* the License. You may obtain a copy of the License at
|
||
|
* http://www.mozilla.org/MPL/
|
||
|
*
|
||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||
|
* for the specific language governing rights and limitations under the
|
||
|
* License.
|
||
|
*
|
||
|
* The Original Code is Mozilla Communicator client code, released
|
||
|
* March 31, 1998.
|
||
|
*
|
||
|
* The Initial Developer of the Original Code is
|
||
|
* Netscape Communications Corporation.
|
||
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
||
|
* the Initial Developer. All Rights Reserved.
|
||
|
*
|
||
|
* Contributor(s):
|
||
|
* Sean Su <ssu@netscape.com>
|
||
|
* Curt Patrick <curt@netscape.com>
|
||
|
*
|
||
|
* Alternatively, the contents of this file may be used under the terms of
|
||
|
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
||
|
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||
|
* of those above. If you wish to allow use of your version of this file only
|
||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||
|
* use your version of this file under the terms of the MPL, indicate your
|
||
|
* decision by deleting the provisions above and replace them with the notice
|
||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||
|
* the provisions above, a recipient may use your version of this file under
|
||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||
|
*
|
||
|
* ***** END LICENSE BLOCK ***** */
|
||
|
|
||
|
#include "extern.h"
|
||
|
#include "extra.h"
|
||
|
#include "dialogs.h"
|
||
|
#include "ifuncns.h"
|
||
|
#include "xpnetHook.h"
|
||
|
#include "time.h"
|
||
|
#include "xpi.h"
|
||
|
#include "logging.h"
|
||
|
#include "nsEscape.h"
|
||
|
|
||
|
char *ArchiveExtensions[] = {"zip",
|
||
|
"xpi",
|
||
|
"jar",
|
||
|
""};
|
||
|
|
||
|
BOOL InitApplication()
|
||
|
{
|
||
|
CLASSINFO classinfo;
|
||
|
WinQueryClassInfo((HAB)0, WC_FRAME, &classinfo);
|
||
|
return (WinRegisterClass((HAB)0, CLASS_NAME_SETUP_DLG, WinDefDlgProc,
|
||
|
CS_SAVEBITS, classinfo.cbWindowData));
|
||
|
}
|
||
|
|
||
|
BOOL InitInstance()
|
||
|
{
|
||
|
gSystemInfo.lScreenX = WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN);
|
||
|
gSystemInfo.lScreenY = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN);
|
||
|
gSystemInfo.lDlgFrameX = WinQuerySysValue(HWND_DESKTOP, SV_CXDLGFRAME);
|
||
|
gSystemInfo.lDlgFrameY = WinQuerySysValue(HWND_DESKTOP, SV_CYDLGFRAME);
|
||
|
gSystemInfo.lTitleBarY = WinQuerySysValue(HWND_DESKTOP, SV_CYTITLEBAR);
|
||
|
|
||
|
hWndMain = NULL;
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
void PrintError(PSZ szMsg, ULONG ulErrorCodeSH)
|
||
|
{
|
||
|
ERRORID erridErrorCode;
|
||
|
char szErrorString[MAX_BUF];
|
||
|
|
||
|
if(ulErrorCodeSH == ERROR_CODE_SHOW)
|
||
|
{
|
||
|
erridErrorCode = WinGetLastError((HAB)0);
|
||
|
sprintf(szErrorString, "%d : %s", erridErrorCode, szMsg);
|
||
|
}
|
||
|
else
|
||
|
sprintf(szErrorString, "%s", szMsg);
|
||
|
|
||
|
if((sgProduct.ulMode != SILENT) && (sgProduct.ulMode != AUTO))
|
||
|
{
|
||
|
WinMessageBox(HWND_DESKTOP, hWndMain, szErrorString, NULL, 0, MB_ICONEXCLAMATION);
|
||
|
}
|
||
|
else if(sgProduct.ulMode == AUTO)
|
||
|
{
|
||
|
ShowMessage(szErrorString, TRUE);
|
||
|
DosSleep(5000);
|
||
|
ShowMessage(szErrorString, FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Windows API does offer a GlobalReAlloc() routine, but it kept
|
||
|
* returning an out of memory error for subsequent calls to it
|
||
|
* after the first time, thus the reason for this routine. */
|
||
|
void *NS_GlobalReAlloc(void **hgMemory,
|
||
|
DWORD dwMemoryBufSize,
|
||
|
DWORD dwNewSize)
|
||
|
{
|
||
|
HGLOBAL hgPtr = NULL;
|
||
|
|
||
|
if((hgPtr = NS_GlobalAlloc(dwNewSize)) == NULL)
|
||
|
return(NULL);
|
||
|
else
|
||
|
{
|
||
|
memcpy(hgPtr, *hgMemory, dwMemoryBufSize);
|
||
|
FreeMemory(hgMemory);
|
||
|
*hgMemory = hgPtr;
|
||
|
return(hgPtr);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void *NS_GlobalAlloc(ULONG ulMaxBuf)
|
||
|
{
|
||
|
void *vBuf = NULL;
|
||
|
|
||
|
if ((vBuf = calloc(1, ulMaxBuf)) == NULL)
|
||
|
{
|
||
|
if((szEGlobalAlloc == NULL) || (*szEGlobalAlloc == '\0'))
|
||
|
PrintError("Memory allocation error.", ERROR_CODE_HIDE);
|
||
|
else
|
||
|
PrintError(szEGlobalAlloc, ERROR_CODE_SHOW);
|
||
|
|
||
|
return(NULL);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return(vBuf);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void FreeMemory(void **vPointer)
|
||
|
{
|
||
|
if(*vPointer != NULL)
|
||
|
free(*vPointer);
|
||
|
*vPointer = NULL;
|
||
|
}
|
||
|
|
||
|
HRESULT NS_LoadStringAlloc(HMODULE hInstance, ULONG ulID, PSZ *szStringBuf, ULONG ulStringBuf)
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
|
||
|
if((*szStringBuf = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
|
||
|
if(!WinLoadString((HAB)0, hInstance, ulID, ulStringBuf, *szStringBuf))
|
||
|
{
|
||
|
if((szEStringLoad == NULL) ||(*szEStringLoad == '\0'))
|
||
|
sprintf(szBuf, "Could not load string resource ID %d", ulID);
|
||
|
else
|
||
|
sprintf(szBuf, szEStringLoad, ulID);
|
||
|
|
||
|
PrintError(szBuf, ERROR_CODE_SHOW);
|
||
|
return(1);
|
||
|
}
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
HRESULT NS_LoadString(HMODULE hInstance, ULONG ulID, PSZ szStringBuf, ULONG ulStringBuf)
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
|
||
|
if(!WinLoadString((HAB)0, hInstance, ulID, ulStringBuf, szStringBuf))
|
||
|
{
|
||
|
if((szEStringLoad == NULL) ||(*szEStringLoad == '\0'))
|
||
|
sprintf(szBuf, "Could not load string resource ID %d", ulID);
|
||
|
else
|
||
|
sprintf(szBuf, szEStringLoad, ulID);
|
||
|
|
||
|
PrintError(szBuf, ERROR_CODE_SHOW);
|
||
|
return(1);
|
||
|
}
|
||
|
return(WIZ_OK);
|
||
|
}
|
||
|
|
||
|
void UnsetSetupState(void)
|
||
|
{
|
||
|
char szApp[MAX_BUF_TINY];
|
||
|
|
||
|
sprintf(szApp,
|
||
|
"%s %s",
|
||
|
sgProduct.szProductNameInternal,
|
||
|
sgProduct.szUserAgent);
|
||
|
PrfWriteProfileString(HINI_USERPROFILE, szApp, "Setup State", NULL);
|
||
|
}
|
||
|
|
||
|
void SetSetupState(char *szState)
|
||
|
{
|
||
|
char szApp[MAX_BUF_TINY];
|
||
|
|
||
|
sprintf(szApp,
|
||
|
"%s %s",
|
||
|
sgProduct.szProductNameInternal,
|
||
|
sgProduct.szUserAgent);
|
||
|
|
||
|
PrfWriteProfileString(HINI_USERPROFILE, szApp, "Setup State", szState);
|
||
|
}
|
||
|
|
||
|
DWORD GetPreviousUnfinishedState(void)
|
||
|
{
|
||
|
char szBuf[MAX_BUF_TINY];
|
||
|
char szApp[MAX_BUF_TINY];
|
||
|
DWORD dwRv = PUS_NONE;
|
||
|
|
||
|
if(sgProduct.szProductNameInternal &&
|
||
|
sgProduct.szUserAgent)
|
||
|
{
|
||
|
sprintf(szApp,
|
||
|
"%s %s",
|
||
|
sgProduct.szProductNameInternal,
|
||
|
sgProduct.szUserAgent);
|
||
|
|
||
|
PrfQueryProfileString(HINI_USERPROFILE, szApp, "Setup State", "", szBuf, sizeof(szBuf));
|
||
|
if(stricmp(szBuf, SETUP_STATE_DOWNLOAD) == 0)
|
||
|
dwRv = PUS_DOWNLOAD;
|
||
|
else if(stricmp(szBuf, SETUP_STATE_UNPACK_XPCOM) == 0)
|
||
|
dwRv = PUS_UNPACK_XPCOM;
|
||
|
else if(stricmp(szBuf, SETUP_STATE_INSTALL_XPI) == 0)
|
||
|
dwRv = PUS_INSTALL_XPI;
|
||
|
}
|
||
|
|
||
|
return(dwRv);
|
||
|
}
|
||
|
|
||
|
void UnsetSetupCurrentDownloadFile(void)
|
||
|
{
|
||
|
char szApp[MAX_BUF];
|
||
|
|
||
|
sprintf(szApp,
|
||
|
"%s %s",
|
||
|
sgProduct.szProductNameInternal,
|
||
|
sgProduct.szUserAgent);
|
||
|
PrfWriteProfileString(HINI_USERPROFILE, szApp, "Setup Current Download", NULL);
|
||
|
}
|
||
|
|
||
|
void SetSetupCurrentDownloadFile(char *szCurrentFilename)
|
||
|
{
|
||
|
char szApp[MAX_BUF];
|
||
|
|
||
|
sprintf(szApp,
|
||
|
"%s %s",
|
||
|
sgProduct.szProductNameInternal,
|
||
|
sgProduct.szUserAgent);
|
||
|
PrfWriteProfileString(HINI_USERPROFILE, szApp, "Setup State", szCurrentFilename);
|
||
|
}
|
||
|
|
||
|
char *GetSetupCurrentDownloadFile(char *szCurrentDownloadFile,
|
||
|
ULONG ulCurrentDownloadFileBufSize)
|
||
|
{
|
||
|
char szApp[MAX_BUF];
|
||
|
|
||
|
if(!szCurrentDownloadFile)
|
||
|
return(NULL);
|
||
|
|
||
|
memset(szCurrentDownloadFile, 0, ulCurrentDownloadFileBufSize);
|
||
|
if(sgProduct.szProductNameInternal &&
|
||
|
sgProduct.szUserAgent)
|
||
|
{
|
||
|
sprintf(szApp,
|
||
|
"%s %s",
|
||
|
sgProduct.szProductNameInternal,
|
||
|
sgProduct.szUserAgent);
|
||
|
PrfQueryProfileString(HINI_USERPROFILE, szApp, "Setup Current Download", "",
|
||
|
szCurrentDownloadFile, ulCurrentDownloadFileBufSize);
|
||
|
}
|
||
|
|
||
|
return(szCurrentDownloadFile);
|
||
|
}
|
||
|
|
||
|
BOOL UpdateFile(char *szInFilename, char *szOutFilename, char *szIgnoreStr)
|
||
|
{
|
||
|
FILE *ifp;
|
||
|
FILE *ofp;
|
||
|
char szLineRead[MAX_BUF];
|
||
|
char szLCIgnoreLongStr[MAX_BUF];
|
||
|
char szLCLineRead[MAX_BUF];
|
||
|
BOOL bFoundIgnoreStr = FALSE;
|
||
|
|
||
|
if((ifp = fopen(szInFilename, "rt")) == NULL)
|
||
|
return(bFoundIgnoreStr);
|
||
|
if((ofp = fopen(szOutFilename, "w+t")) == NULL)
|
||
|
{
|
||
|
fclose(ifp);
|
||
|
return(bFoundIgnoreStr);
|
||
|
}
|
||
|
|
||
|
if(strlen(szIgnoreStr) < sizeof(szLCIgnoreLongStr))
|
||
|
{
|
||
|
strcpy(szLCIgnoreLongStr, szIgnoreStr);
|
||
|
strlwr(szLCIgnoreLongStr);
|
||
|
}
|
||
|
|
||
|
while(fgets(szLineRead, sizeof(szLineRead), ifp) != NULL)
|
||
|
{
|
||
|
strcpy(szLCLineRead, szLineRead);
|
||
|
strlwr(szLCLineRead);
|
||
|
if(!strstr(szLCLineRead, szLCIgnoreLongStr))
|
||
|
fputs(szLineRead, ofp);
|
||
|
else
|
||
|
bFoundIgnoreStr = TRUE;
|
||
|
}
|
||
|
fclose(ifp);
|
||
|
fclose(ofp);
|
||
|
|
||
|
return(bFoundIgnoreStr);
|
||
|
}
|
||
|
|
||
|
HRESULT Initialize(HMODULE hInstance, PSZ szAppName)
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szCurrentProcessDir[MAX_BUF];
|
||
|
char *tempEnvVar = NULL;
|
||
|
|
||
|
bSDUserCanceled = FALSE;
|
||
|
hDlgMessage = NULL;
|
||
|
|
||
|
/* load strings from setup.exe */
|
||
|
if(NS_LoadStringAlloc(hInstance, IDS_ERROR_GLOBALALLOC, &szEGlobalAlloc, MAX_BUF))
|
||
|
return(1);
|
||
|
if(NS_LoadStringAlloc(hInstance, IDS_ERROR_STRING_LOAD, &szEStringLoad, MAX_BUF))
|
||
|
return(1);
|
||
|
if(NS_LoadStringAlloc(hInstance, IDS_ERROR_DLL_LOAD, &szEDllLoad, MAX_BUF))
|
||
|
return(1);
|
||
|
if(NS_LoadStringAlloc(hInstance, IDS_ERROR_STRING_NULL, &szEStringNull, MAX_BUF))
|
||
|
return(1);
|
||
|
|
||
|
ParsePath(szAppName, szCurrentProcessDir,
|
||
|
sizeof(szCurrentProcessDir),
|
||
|
FALSE,
|
||
|
PP_PATH_ONLY);
|
||
|
|
||
|
if(DosLoadModule(NULL, 0, "SETUPRSC", &hSetupRscInst) != NO_ERROR)
|
||
|
{
|
||
|
char szFullFilename[MAX_BUF];
|
||
|
|
||
|
strcpy(szFullFilename, szCurrentProcessDir);
|
||
|
AppendBackSlash(szFullFilename, sizeof(szFullFilename));
|
||
|
strcat(szFullFilename, "Setuprsc.dll");
|
||
|
if(DosLoadModule(NULL, 0, szFullFilename, &hSetupRscInst) != NO_ERROR)
|
||
|
{
|
||
|
sprintf(szBuf, szEDllLoad, szFullFilename);
|
||
|
PrintError(szBuf, ERROR_CODE_HIDE);
|
||
|
return(1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ulWizardState = DLG_NONE;
|
||
|
ulTempSetupType = ulWizardState;
|
||
|
siComponents = NULL;
|
||
|
bCreateDestinationDir = FALSE;
|
||
|
bReboot = FALSE;
|
||
|
gulUpgradeValue = UG_NONE;
|
||
|
gulSiteSelectorStatus = SS_SHOW;
|
||
|
gbILUseTemp = TRUE;
|
||
|
gbIgnoreRunAppX = FALSE;
|
||
|
gbIgnoreProgramFolderX = FALSE;
|
||
|
|
||
|
if((szSetupDir = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
strcpy(szSetupDir, szCurrentProcessDir);
|
||
|
|
||
|
if((szTempDir = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
if((szOSTempDir = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
if((szFileIniConfig = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
if((szFileIniInstall = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
// determine the system's TEMP path
|
||
|
tempEnvVar = getenv("TMP");
|
||
|
if ((tempEnvVar) && (!(isFAT(tempEnvVar)))) {
|
||
|
strcpy(szTempDir, tempEnvVar);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
tempEnvVar = getenv("TEMP");
|
||
|
if (tempEnvVar)
|
||
|
strcpy(szTempDir, tempEnvVar);
|
||
|
}
|
||
|
if ((!tempEnvVar) || (isFAT(tempEnvVar)))
|
||
|
{
|
||
|
ULONG ulBootDrive = 0;
|
||
|
APIRET rc;
|
||
|
char buffer[] = " :\\OS2\\";
|
||
|
DosQuerySysInfo(QSV_BOOT_DRIVE, QSV_BOOT_DRIVE,
|
||
|
&ulBootDrive, sizeof(ulBootDrive));
|
||
|
buffer[0] = 'A' - 1 + ulBootDrive;
|
||
|
if (isFAT(buffer)) {
|
||
|
/* Try current disk if boot drive is FAT */
|
||
|
ULONG ulDriveNum;
|
||
|
ULONG ulDriveMap;
|
||
|
strcpy(buffer, " :\\");
|
||
|
DosQueryCurrentDisk(&ulDriveNum, &ulDriveMap);
|
||
|
buffer[0] = 'A' - 1 + ulDriveNum;
|
||
|
if (isFAT(buffer)) {
|
||
|
int i;
|
||
|
for (i = 2; i < 26; i++) {
|
||
|
if ((ulDriveMap<<(31-i)) >> 31) {
|
||
|
buffer[0] = 'A' + i;
|
||
|
if (!(isFAT(buffer))) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (i == 26) {
|
||
|
char szBuf[MAX_BUF];
|
||
|
if(NS_LoadString(hSetupRscInst, IDS_ERROR_NO_LONG_FILENAMES, szBuf, MAX_BUF) == WIZ_OK)
|
||
|
WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, szBuf, NULL, 0, MB_ICONEXCLAMATION);
|
||
|
return(1);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
strcpy(szTempDir, buffer);
|
||
|
strcat(szTempDir, "TEMP");
|
||
|
}
|
||
|
strcpy(szOSTempDir, szTempDir);
|
||
|
AppendBackSlash(szTempDir, MAX_BUF);
|
||
|
strcat(szTempDir, WIZ_TEMP_DIR);
|
||
|
|
||
|
if(!FileExists(szTempDir))
|
||
|
{
|
||
|
AppendBackSlash(szTempDir, MAX_BUF);
|
||
|
CreateDirectoriesAll(szTempDir, FALSE);
|
||
|
RemoveBackSlash(szTempDir);
|
||
|
if(!FileExists(szTempDir))
|
||
|
{
|
||
|
char szECreateTempDir[MAX_BUF];
|
||
|
|
||
|
if(GetPrivateProfileString("Messages", "ERROR_CREATE_TEMP_DIR", "",
|
||
|
szECreateTempDir, sizeof(szECreateTempDir),
|
||
|
szFileIniInstall))
|
||
|
{
|
||
|
sprintf(szBuf, szECreateTempDir, szTempDir);
|
||
|
PrintError(szBuf, ERROR_CODE_HIDE);
|
||
|
}
|
||
|
return(1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DeleteIdiGetConfigIni();
|
||
|
bIdiArchivesExists = DeleteIdiGetArchives();
|
||
|
DeleteIdiGetRedirect();
|
||
|
DeleteInstallLogFile(FILE_INSTALL_LOG);
|
||
|
DeleteInstallLogFile(FILE_INSTALL_STATUS_LOG);
|
||
|
LogISTime(W_START);
|
||
|
DetermineOSVersionEx();
|
||
|
|
||
|
gSystemInfo.bScreenReader = TRUE;
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
/* Function to remove quotes from a string */
|
||
|
void RemoveQuotes(LPSTR lpszSrc, LPSTR lpszDest, int iDestSize)
|
||
|
{
|
||
|
char *lpszBegin;
|
||
|
|
||
|
if(strlen(lpszSrc) > iDestSize)
|
||
|
return;
|
||
|
|
||
|
if(*lpszSrc == '\"')
|
||
|
lpszBegin = &lpszSrc[1];
|
||
|
else
|
||
|
lpszBegin = lpszSrc;
|
||
|
|
||
|
strcpy(lpszDest, lpszBegin);
|
||
|
|
||
|
if(lpszDest[strlen(lpszDest) - 1] == '\"')
|
||
|
lpszDest[strlen(lpszDest) - 1] = '\0';
|
||
|
}
|
||
|
|
||
|
/* Function to locate the first non space character in a string,
|
||
|
* and return a pointer to it. */
|
||
|
LPSTR GetFirstNonSpace(LPSTR lpszString)
|
||
|
{
|
||
|
int i;
|
||
|
int iStrLength;
|
||
|
|
||
|
iStrLength = strlen(lpszString);
|
||
|
|
||
|
for(i = 0; i < iStrLength; i++)
|
||
|
{
|
||
|
if(!isspace(lpszString[i]))
|
||
|
return(&lpszString[i]);
|
||
|
}
|
||
|
|
||
|
return(NULL);
|
||
|
}
|
||
|
|
||
|
BOOL IsInArchivesLst(siC *siCObject, BOOL bModify)
|
||
|
{
|
||
|
char *szBufPtr;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szArchiveLstFile[MAX_BUF_MEDIUM];
|
||
|
BOOL bRet = FALSE;
|
||
|
|
||
|
strcpy(szArchiveLstFile, szTempDir);
|
||
|
AppendBackSlash(szArchiveLstFile, sizeof(szArchiveLstFile));
|
||
|
strcat(szArchiveLstFile, "Archive.lst");
|
||
|
GetPrivateProfileString("Archives", NULL, "", szBuf, sizeof(szBuf), szArchiveLstFile);
|
||
|
if(*szBuf != '\0')
|
||
|
{
|
||
|
szBufPtr = szBuf;
|
||
|
while(*szBufPtr != '\0')
|
||
|
{
|
||
|
if(stricmp(siCObject->szArchiveName, szBufPtr) == 0)
|
||
|
{
|
||
|
if(bModify)
|
||
|
{
|
||
|
/* jar file found. Unset attribute to download from the net */
|
||
|
siCObject->dwAttributes &= ~SIC_DOWNLOAD_REQUIRED;
|
||
|
/* save the path of where jar was found at */
|
||
|
strcpy(siCObject->szArchivePath, szTempDir);
|
||
|
AppendBackSlash(siCObject->szArchivePath, MAX_BUF);
|
||
|
}
|
||
|
bRet = TRUE;
|
||
|
|
||
|
/* found what we're looking for. No need to continue */
|
||
|
break;
|
||
|
}
|
||
|
szBufPtr += strlen(szBufPtr) + 1;
|
||
|
}
|
||
|
}
|
||
|
return(bRet);
|
||
|
}
|
||
|
|
||
|
HRESULT ParseSetupIni()
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szFileIniSetup[MAX_BUF];
|
||
|
char szFileIdiGetConfigIni[MAX_BUF];
|
||
|
|
||
|
strcpy(szFileIdiGetConfigIni, szTempDir);
|
||
|
AppendBackSlash(szFileIdiGetConfigIni, sizeof(szFileIdiGetConfigIni));
|
||
|
strcat(szFileIdiGetConfigIni, FILE_IDI_GETCONFIGINI);
|
||
|
|
||
|
strcpy(szFileIniSetup, szSetupDir);
|
||
|
AppendBackSlash(szFileIniSetup, sizeof(szFileIniSetup));
|
||
|
strcat(szFileIniSetup, FILE_INI_SETUP);
|
||
|
|
||
|
DosCopy(szFileIniSetup, szFileIdiGetConfigIni, DCPY_EXISTING);
|
||
|
|
||
|
if(!FileExists(szFileIdiGetConfigIni))
|
||
|
{
|
||
|
char szEFileNotFound[MAX_BUF];
|
||
|
|
||
|
if(GetPrivateProfileString("Messages", "ERROR_FILE_NOT_FOUND", "", szEFileNotFound, sizeof(szEFileNotFound), szFileIniInstall))
|
||
|
{
|
||
|
sprintf(szBuf, szEFileNotFound, szFileIdiGetConfigIni);
|
||
|
PrintError(szBuf, ERROR_CODE_HIDE);
|
||
|
}
|
||
|
return(1);
|
||
|
}
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
HRESULT GetConfigIni()
|
||
|
{
|
||
|
char szFileIniTempDir[MAX_BUF];
|
||
|
char szFileIniSetupDir[MAX_BUF];
|
||
|
char szMsgRetrieveConfigIni[MAX_BUF];
|
||
|
char szBuf[MAX_BUF];
|
||
|
HRESULT hResult = 0;
|
||
|
|
||
|
if(!GetPrivateProfileString("Messages", "MSG_RETRIEVE_CONFIGINI", "", szMsgRetrieveConfigIni, sizeof(szMsgRetrieveConfigIni), szFileIniInstall))
|
||
|
return(1);
|
||
|
|
||
|
strcpy(szFileIniTempDir, szTempDir);
|
||
|
AppendBackSlash(szFileIniTempDir, sizeof(szFileIniTempDir));
|
||
|
strcat(szFileIniTempDir, FILE_INI_CONFIG);
|
||
|
|
||
|
/* set default value for szFileIniConfig here */
|
||
|
strcpy(szFileIniConfig, szFileIniTempDir);
|
||
|
|
||
|
strcpy(szFileIniSetupDir, szSetupDir);
|
||
|
AppendBackSlash(szFileIniSetupDir, sizeof(szFileIniSetupDir));
|
||
|
strcat(szFileIniSetupDir, FILE_INI_CONFIG);
|
||
|
|
||
|
/* if config.ini exists, then use it, else download config.ini from the net */
|
||
|
if(!FileExists(szFileIniTempDir))
|
||
|
{
|
||
|
if(FileExists(szFileIniSetupDir))
|
||
|
{
|
||
|
strcpy(szFileIniConfig, szFileIniSetupDir);
|
||
|
hResult = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
char szEFileNotFound[MAX_BUF];
|
||
|
|
||
|
if(GetPrivateProfileString("Messages", "ERROR_FILE_NOT_FOUND", "", szEFileNotFound, sizeof(szEFileNotFound), szFileIniInstall))
|
||
|
{
|
||
|
sprintf(szBuf, szEFileNotFound, FILE_INI_CONFIG);
|
||
|
PrintError(szBuf, ERROR_CODE_HIDE);
|
||
|
}
|
||
|
hResult = 1;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
hResult = 0;
|
||
|
|
||
|
return(hResult);
|
||
|
}
|
||
|
|
||
|
HRESULT GetInstallIni()
|
||
|
{
|
||
|
char szFileIniTempDir[MAX_BUF];
|
||
|
char szFileIniSetupDir[MAX_BUF];
|
||
|
char szMsgRetrieveInstallIni[MAX_BUF];
|
||
|
char szBuf[MAX_BUF];
|
||
|
HRESULT hResult = 0;
|
||
|
|
||
|
if(NS_LoadString(hSetupRscInst, IDS_MSG_RETRIEVE_INSTALLINI, szMsgRetrieveInstallIni, MAX_BUF) != WIZ_OK)
|
||
|
return(1);
|
||
|
|
||
|
strcpy(szFileIniTempDir, szTempDir);
|
||
|
AppendBackSlash(szFileIniTempDir, sizeof(szFileIniTempDir));
|
||
|
strcat(szFileIniTempDir, FILE_INI_INSTALL);
|
||
|
|
||
|
/* set default value for szFileIniInstall here */
|
||
|
strcpy(szFileIniInstall, szFileIniTempDir);
|
||
|
|
||
|
strcpy(szFileIniSetupDir, szSetupDir);
|
||
|
AppendBackSlash(szFileIniSetupDir, sizeof(szFileIniSetupDir));
|
||
|
strcat(szFileIniSetupDir, FILE_INI_INSTALL);
|
||
|
|
||
|
/* if install.ini exists, then use it, else download install.ini from the net */
|
||
|
if(!FileExists(szFileIniTempDir))
|
||
|
{
|
||
|
if(FileExists(szFileIniSetupDir))
|
||
|
{
|
||
|
strcpy(szFileIniInstall, szFileIniSetupDir);
|
||
|
hResult = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
char szEFileNotFound[MAX_BUF];
|
||
|
|
||
|
if(NS_LoadString(hSetupRscInst, IDS_ERROR_FILE_NOT_FOUND, szEFileNotFound, MAX_BUF) == WIZ_OK)
|
||
|
{
|
||
|
sprintf(szBuf, szEFileNotFound, FILE_INI_INSTALL);
|
||
|
PrintError(szBuf, ERROR_CODE_HIDE);
|
||
|
}
|
||
|
hResult = 1;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
hResult = 0;
|
||
|
|
||
|
return(hResult);
|
||
|
}
|
||
|
|
||
|
int LocateJar(siC *siCObject, LPSTR szPath, int dwPathSize, BOOL bIncludeTempDir)
|
||
|
{
|
||
|
BOOL bRet;
|
||
|
char szBuf[MAX_BUF * 2];
|
||
|
char szSEADirTemp[MAX_BUF];
|
||
|
char szSetupDirTemp[MAX_BUF];
|
||
|
char szTempDirTemp[MAX_BUF];
|
||
|
|
||
|
/* initialize default behavior */
|
||
|
bRet = AP_NOT_FOUND;
|
||
|
if(szPath != NULL)
|
||
|
memset(szPath, 0, dwPathSize);
|
||
|
siCObject->dwAttributes |= SIC_DOWNLOAD_REQUIRED;
|
||
|
|
||
|
strcpy(szSEADirTemp, sgProduct.szAlternateArchiveSearchPath);
|
||
|
AppendBackSlash(szSEADirTemp, sizeof(szSEADirTemp));
|
||
|
strcat(szSEADirTemp, siCObject->szArchiveName);
|
||
|
|
||
|
/* XXX_QUICK_FIX
|
||
|
* checking sgProduct.szAlternateArchiveSearchPath for empty string
|
||
|
* should be done prior to AppendBackSlash() above.
|
||
|
* This is a quick fix for the time frame that we are currently in. */
|
||
|
if((*sgProduct.szAlternateArchiveSearchPath != '\0') && (FileExists(szSEADirTemp)))
|
||
|
{
|
||
|
/* jar file found. Unset attribute to download from the net */
|
||
|
siCObject->dwAttributes &= ~SIC_DOWNLOAD_REQUIRED;
|
||
|
/* save the path of where jar was found at */
|
||
|
strcpy(siCObject->szArchivePath, sgProduct.szAlternateArchiveSearchPath);
|
||
|
AppendBackSlash(siCObject->szArchivePath, MAX_BUF);
|
||
|
bRet = AP_ALTERNATE_PATH;
|
||
|
|
||
|
/* save path where archive is located */
|
||
|
if((szPath != NULL) && (strlen(sgProduct.szAlternateArchiveSearchPath) < dwPathSize))
|
||
|
strcpy(szPath, sgProduct.szAlternateArchiveSearchPath);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
strcpy(szSetupDirTemp, szSetupDir);
|
||
|
AppendBackSlash(szSetupDirTemp, sizeof(szSetupDirTemp));
|
||
|
|
||
|
strcpy(szTempDirTemp, szTempDir);
|
||
|
AppendBackSlash(szTempDirTemp, sizeof(szTempDirTemp));
|
||
|
|
||
|
if(stricmp(szTempDirTemp, szSetupDirTemp) == 0)
|
||
|
{
|
||
|
/* check the temp dir for the .xpi file */
|
||
|
strcpy(szBuf, szTempDirTemp);
|
||
|
AppendBackSlash(szBuf, sizeof(szBuf));
|
||
|
strcat(szBuf, siCObject->szArchiveName);
|
||
|
|
||
|
if(FileExists(szBuf))
|
||
|
{
|
||
|
if(bIncludeTempDir == TRUE)
|
||
|
{
|
||
|
/* jar file found. Unset attribute to download from the net */
|
||
|
siCObject->dwAttributes &= ~SIC_DOWNLOAD_REQUIRED;
|
||
|
/* save the path of where jar was found at */
|
||
|
strcpy(siCObject->szArchivePath, szTempDirTemp);
|
||
|
AppendBackSlash(siCObject->szArchivePath, MAX_BUF);
|
||
|
bRet = AP_TEMP_PATH;
|
||
|
}
|
||
|
|
||
|
/* if the archive name is in the archive.lst file, then it was uncompressed
|
||
|
* by the self extracting .exe file. Assume that the .xpi file exists.
|
||
|
* This is a safe assumption because the self extracting.exe creates the
|
||
|
* archive.lst with what it uncompresses everytime it is run. */
|
||
|
if(IsInArchivesLst(siCObject, TRUE))
|
||
|
bRet = AP_SETUP_PATH;
|
||
|
|
||
|
/* save path where archive is located */
|
||
|
if((szPath != NULL) && (strlen(szTempDirTemp) < dwPathSize))
|
||
|
strcpy(szPath, szTempDirTemp);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* check the setup dir for the .xpi file */
|
||
|
strcpy(szBuf, szSetupDirTemp);
|
||
|
AppendBackSlash(szBuf, sizeof(szBuf));
|
||
|
strcat(szBuf, siCObject->szArchiveName);
|
||
|
|
||
|
if(FileExists(szBuf))
|
||
|
{
|
||
|
/* jar file found. Unset attribute to download from the net */
|
||
|
siCObject->dwAttributes &= ~SIC_DOWNLOAD_REQUIRED;
|
||
|
/* save the path of where jar was found at */
|
||
|
strcpy(siCObject->szArchivePath, szSetupDirTemp);
|
||
|
AppendBackSlash(siCObject->szArchivePath, MAX_BUF);
|
||
|
bRet = AP_SETUP_PATH;
|
||
|
|
||
|
/* save path where archive is located */
|
||
|
if((szPath != NULL) && (strlen(sgProduct.szAlternateArchiveSearchPath) < dwPathSize))
|
||
|
strcpy(szPath, szSetupDirTemp);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* check the ns_temp dir for the .xpi file */
|
||
|
strcpy(szBuf, szTempDirTemp);
|
||
|
AppendBackSlash(szBuf, sizeof(szBuf));
|
||
|
strcat(szBuf, siCObject->szArchiveName);
|
||
|
|
||
|
if(FileExists(szBuf))
|
||
|
{
|
||
|
if(bIncludeTempDir == TRUE)
|
||
|
{
|
||
|
/* jar file found. Unset attribute to download from the net */
|
||
|
siCObject->dwAttributes &= ~SIC_DOWNLOAD_REQUIRED;
|
||
|
/* save the path of where jar was found at */
|
||
|
strcpy(siCObject->szArchivePath, szTempDirTemp);
|
||
|
AppendBackSlash(siCObject->szArchivePath, MAX_BUF);
|
||
|
bRet = AP_TEMP_PATH;
|
||
|
}
|
||
|
|
||
|
/* save path where archive is located */
|
||
|
if((szPath != NULL) && (strlen(sgProduct.szAlternateArchiveSearchPath) < dwPathSize))
|
||
|
strcpy(szPath, szTempDirTemp);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return(bRet);
|
||
|
}
|
||
|
|
||
|
void SwapFTPAndHTTP(char *szInUrl, DWORD dwInUrlSize)
|
||
|
{
|
||
|
char szTmpBuf[MAX_BUF];
|
||
|
char *ptr = NULL;
|
||
|
char szFtp[] = "ftp://";
|
||
|
char szHttp[] = "http://";
|
||
|
|
||
|
if((!szInUrl) || !diAdditionalOptions.bUseProtocolSettings)
|
||
|
return;
|
||
|
|
||
|
memset(szTmpBuf, 0, sizeof(szTmpBuf));
|
||
|
switch(diAdditionalOptions.dwUseProtocol)
|
||
|
{
|
||
|
case UP_HTTP:
|
||
|
if((strncmp(szInUrl, szFtp, (sizeof(szFtp) - 1)) == 0) &&
|
||
|
((int)dwInUrlSize > strlen(szInUrl) + 1))
|
||
|
{
|
||
|
ptr = szInUrl + (sizeof(szFtp) - 1);
|
||
|
memmove(ptr + 1, ptr, strlen(ptr) + 1);
|
||
|
memcpy(szInUrl, szHttp, (sizeof(szHttp) - 1));
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case UP_FTP:
|
||
|
default:
|
||
|
if((strncmp(szInUrl, szHttp, (sizeof(szHttp) - 1)) == 0) &&
|
||
|
((int)dwInUrlSize > strlen(szInUrl) + 1))
|
||
|
{
|
||
|
ptr = szInUrl + (sizeof(szHttp) - 1);
|
||
|
memmove(ptr - 1, ptr, strlen(ptr) + 1);
|
||
|
memcpy(szInUrl, szFtp, (sizeof(szFtp) - 1));
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int UpdateIdiFile(char *szPartialUrl,
|
||
|
DWORD dwPartialUrlBufSize,
|
||
|
siC *siCObject,
|
||
|
char *szSection,
|
||
|
char *szKey,
|
||
|
char *szFileIdiGetArchives)
|
||
|
{
|
||
|
char szUrl[MAX_BUF];
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szBufTemp[MAX_BUF];
|
||
|
|
||
|
SwapFTPAndHTTP(szPartialUrl, dwPartialUrlBufSize);
|
||
|
RemoveSlash(szPartialUrl);
|
||
|
sprintf(szUrl, "%s/%s", szPartialUrl, siCObject->szArchiveName);
|
||
|
if(WritePrivateProfileString(szSection,
|
||
|
szKey,
|
||
|
szUrl,
|
||
|
szFileIdiGetArchives) == 0)
|
||
|
{
|
||
|
char szEWPPS[MAX_BUF];
|
||
|
|
||
|
if(GetPrivateProfileString("Messages", "ERROR_WRITEPRIVATEPROFILESTRING", "", szEWPPS, sizeof(szEWPPS), szFileIniInstall))
|
||
|
{
|
||
|
sprintf(szBufTemp,
|
||
|
"%s\n [%s]\n url=%s",
|
||
|
szFileIdiGetArchives,
|
||
|
szSection,
|
||
|
szUrl);
|
||
|
sprintf(szBuf, szEWPPS, szBufTemp);
|
||
|
PrintError(szBuf, ERROR_CODE_SHOW);
|
||
|
}
|
||
|
return(1);
|
||
|
}
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
HRESULT AddArchiveToIdiFile(siC *siCObject,
|
||
|
char *szSection,
|
||
|
char *szFileIdiGetArchives)
|
||
|
{
|
||
|
char szFile[MAX_BUF];
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szUrl[MAX_BUF];
|
||
|
char szIdentifier[MAX_BUF];
|
||
|
char szArchiveSize[MAX_ITOA];
|
||
|
char szKey[MAX_BUF_TINY];
|
||
|
int iIndex = 0;
|
||
|
ssi *ssiSiteSelectorTemp;
|
||
|
|
||
|
WritePrivateProfileString(szSection,
|
||
|
"desc",
|
||
|
siCObject->szDescriptionShort,
|
||
|
szFileIdiGetArchives);
|
||
|
_itoa(siCObject->ulInstallSizeArchive, szArchiveSize, 10);
|
||
|
WritePrivateProfileString(szSection,
|
||
|
"size",
|
||
|
szArchiveSize,
|
||
|
szFileIdiGetArchives);
|
||
|
_itoa(siCObject->dwAttributes & SIC_IGNORE_DOWNLOAD_ERROR, szBuf, 10);
|
||
|
WritePrivateProfileString(szSection,
|
||
|
"Ignore File Network Error",
|
||
|
szBuf,
|
||
|
szFileIdiGetArchives);
|
||
|
|
||
|
strcpy(szFile, szTempDir);
|
||
|
AppendBackSlash(szFile, sizeof(szFile));
|
||
|
strcat(szFile, FILE_INI_REDIRECT);
|
||
|
|
||
|
memset(szIdentifier, 0, sizeof(szIdentifier));
|
||
|
ssiSiteSelectorTemp = SsiGetNode(szSiteSelectorDescription);
|
||
|
|
||
|
GetPrivateProfileString("Redirect",
|
||
|
"Status",
|
||
|
"",
|
||
|
szBuf,
|
||
|
sizeof(szBuf),
|
||
|
szFileIniConfig);
|
||
|
if(stricmp(szBuf, "ENABLED") != 0)
|
||
|
{
|
||
|
/* redirect.ini is *not* enabled, so use the url from the
|
||
|
* config.ini's [Site Selector] section */
|
||
|
if(*ssiSiteSelectorTemp->szDomain != '\0')
|
||
|
{
|
||
|
sprintf(szKey, "url%d", iIndex);
|
||
|
strcpy(szUrl, ssiSiteSelectorTemp->szDomain);
|
||
|
UpdateIdiFile(szUrl, sizeof(szUrl), siCObject, szSection, szKey, szFileIdiGetArchives);
|
||
|
++iIndex;
|
||
|
}
|
||
|
|
||
|
/* use the url from the config.ini's [General] section as well */
|
||
|
GetPrivateProfileString("General",
|
||
|
"url",
|
||
|
"",
|
||
|
szUrl,
|
||
|
sizeof(szUrl),
|
||
|
szFileIniConfig);
|
||
|
if(*szUrl != 0)
|
||
|
{
|
||
|
sprintf(szKey, "url%d", iIndex);
|
||
|
UpdateIdiFile(szUrl, sizeof(szUrl), siCObject, szSection, szKey, szFileIdiGetArchives);
|
||
|
}
|
||
|
}
|
||
|
else if(FileExists(szFile))
|
||
|
{
|
||
|
/* redirect.ini is enabled *and* it exists */
|
||
|
GetPrivateProfileString("Site Selector",
|
||
|
ssiSiteSelectorTemp->szIdentifier,
|
||
|
"",
|
||
|
szUrl,
|
||
|
sizeof(szUrl),
|
||
|
szFile);
|
||
|
if(*szUrl != '\0')
|
||
|
{
|
||
|
sprintf(szKey, "url%d", iIndex);
|
||
|
UpdateIdiFile(szUrl, sizeof(szUrl), siCObject, szSection, szKey, szFileIdiGetArchives);
|
||
|
++iIndex;
|
||
|
}
|
||
|
|
||
|
/* use the url from the config.ini's [General] section as well */
|
||
|
GetPrivateProfileString("General",
|
||
|
"url",
|
||
|
"",
|
||
|
szUrl,
|
||
|
sizeof(szUrl),
|
||
|
szFileIniConfig);
|
||
|
if(*szUrl != 0)
|
||
|
{
|
||
|
sprintf(szKey, "url%d", iIndex);
|
||
|
UpdateIdiFile(szUrl, sizeof(szUrl), siCObject, szSection, szKey, szFileIdiGetArchives);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* redirect.ini is enabled, but the file does not exist,
|
||
|
* so fail over to the url from the config.ini's [General] section */
|
||
|
GetPrivateProfileString("General",
|
||
|
"url",
|
||
|
"",
|
||
|
szUrl,
|
||
|
sizeof(szUrl),
|
||
|
szFileIniConfig);
|
||
|
if(*szUrl != 0)
|
||
|
{
|
||
|
sprintf(szKey, "url%d", iIndex);
|
||
|
UpdateIdiFile(szUrl, sizeof(szUrl), siCObject, szSection, szKey, szFileIdiGetArchives);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
void SetSetupRunMode(LPSTR szMode)
|
||
|
{
|
||
|
if(stricmp(szMode, "NORMAL") == 0)
|
||
|
sgProduct.ulMode = NORMAL;
|
||
|
if(stricmp(szMode, "AUTO") == 0)
|
||
|
sgProduct.ulMode = AUTO;
|
||
|
if(stricmp(szMode, "SILENT") == 0)
|
||
|
sgProduct.ulMode = SILENT;
|
||
|
}
|
||
|
|
||
|
BOOL CheckForArchiveExtension(LPSTR szFile)
|
||
|
{
|
||
|
int i;
|
||
|
BOOL bRv = FALSE;
|
||
|
char szExtension[MAX_BUF_TINY];
|
||
|
|
||
|
/* if there is no extension in szFile, szExtension will be zero'ed out */
|
||
|
ParsePath(szFile, szExtension, sizeof(szExtension), FALSE, PP_EXTENSION_ONLY);
|
||
|
i = 0;
|
||
|
while(*ArchiveExtensions[i] != '\0')
|
||
|
{
|
||
|
if(stricmp(szExtension, ArchiveExtensions[i]) == 0)
|
||
|
{
|
||
|
bRv = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
++i;
|
||
|
}
|
||
|
return(bRv);
|
||
|
}
|
||
|
|
||
|
long RetrieveRedirectFile()
|
||
|
{
|
||
|
long lResult;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szBufUrl[MAX_BUF];
|
||
|
char szBufTemp[MAX_BUF];
|
||
|
char szIndex0[MAX_BUF];
|
||
|
char szFileIdiGetRedirect[MAX_BUF];
|
||
|
char szFileIniRedirect[MAX_BUF];
|
||
|
ssi *ssiSiteSelectorTemp;
|
||
|
|
||
|
if(GetTotalArchivesToDownload() == 0)
|
||
|
return(0);
|
||
|
|
||
|
strcpy(szFileIniRedirect, szTempDir);
|
||
|
AppendBackSlash(szFileIniRedirect, sizeof(szFileIniRedirect));
|
||
|
strcat(szFileIniRedirect, FILE_INI_REDIRECT);
|
||
|
|
||
|
if(FileExists(szFileIniRedirect))
|
||
|
DosDelete(szFileIniRedirect);
|
||
|
|
||
|
GetPrivateProfileString("Redirect", "Status", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "ENABLED") != 0)
|
||
|
return(0);
|
||
|
|
||
|
ssiSiteSelectorTemp = SsiGetNode(szSiteSelectorDescription);
|
||
|
if(ssiSiteSelectorTemp != NULL)
|
||
|
{
|
||
|
if(ssiSiteSelectorTemp->szDomain != NULL)
|
||
|
strcpy(szBufUrl, ssiSiteSelectorTemp->szDomain);
|
||
|
}
|
||
|
else
|
||
|
/* No domain to download the redirect.ini file from.
|
||
|
* Assume that it does not exist.
|
||
|
* This should trigger the backup/alternate url. */
|
||
|
return(0);
|
||
|
|
||
|
strcpy(szFileIdiGetRedirect, szTempDir);
|
||
|
AppendBackSlash(szFileIdiGetRedirect, sizeof(szFileIdiGetRedirect));
|
||
|
strcat(szFileIdiGetRedirect, FILE_IDI_GETREDIRECT);
|
||
|
|
||
|
GetPrivateProfileString("Redirect", "Description", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
WritePrivateProfileString("File0", "desc", szBuf, szFileIdiGetRedirect);
|
||
|
GetPrivateProfileString("Redirect", "Server Path", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
AppendSlash(szBufUrl, sizeof(szBufUrl));
|
||
|
strcat(szBufUrl, szBuf);
|
||
|
SwapFTPAndHTTP(szBufUrl, sizeof(szBufUrl));
|
||
|
if(WritePrivateProfileString("File0", "url", szBufUrl, szFileIdiGetRedirect) == 0)
|
||
|
{
|
||
|
char szEWPPS[MAX_BUF];
|
||
|
|
||
|
if(GetPrivateProfileString("Messages", "ERROR_WRITEPRIVATEPROFILESTRING", "", szEWPPS, sizeof(szEWPPS), szFileIniInstall))
|
||
|
{
|
||
|
sprintf(szBufTemp, "%s\n [%s]\n %s=%s", szFileIdiGetRedirect, "File0", szIndex0, szBufUrl);
|
||
|
sprintf(szBuf, szEWPPS, szBufTemp);
|
||
|
PrintError(szBuf, ERROR_CODE_SHOW);
|
||
|
}
|
||
|
return(1);
|
||
|
}
|
||
|
|
||
|
lResult = DownloadFiles(szFileIdiGetRedirect, /* input idi file to parse */
|
||
|
szTempDir, /* download directory */
|
||
|
diAdvancedSettings.szProxyServer, /* proxy server name */
|
||
|
diAdvancedSettings.szProxyPort, /* proxy server port */
|
||
|
diAdvancedSettings.szProxyUser, /* proxy server user (optional) */
|
||
|
diAdvancedSettings.szProxyPasswd, /* proxy password (optional) */
|
||
|
FALSE, /* show retry message */
|
||
|
TRUE, /* ignore network error */
|
||
|
NULL, /* buffer to store the name of failed file */
|
||
|
0); /* size of failed file name buffer */
|
||
|
return(lResult);
|
||
|
}
|
||
|
|
||
|
int CRCCheckDownloadedArchives(char *szCorruptedArchiveList,
|
||
|
DWORD dwCorruptedArchiveListSize,
|
||
|
char *szFileIdiGetArchives)
|
||
|
{
|
||
|
DWORD dwIndex0;
|
||
|
DWORD dwFileCounter;
|
||
|
siC *siCObject = NULL;
|
||
|
char szArchivePathWithFilename[MAX_BUF];
|
||
|
char szArchivePath[MAX_BUF];
|
||
|
char szMsgCRCCheck[MAX_BUF];
|
||
|
char szSection[MAX_INI_SK];
|
||
|
int iRv;
|
||
|
int iResult;
|
||
|
|
||
|
/* delete the getarchives.idi file because it needs to be recreated
|
||
|
* if there are any files that fails the CRC check */
|
||
|
if(szFileIdiGetArchives)
|
||
|
DosDelete(szFileIdiGetArchives);
|
||
|
|
||
|
if(szCorruptedArchiveList != NULL)
|
||
|
memset(szCorruptedArchiveList, 0, dwCorruptedArchiveListSize);
|
||
|
|
||
|
GetPrivateProfileString("Strings", "Message Verifying Archives", "", szMsgCRCCheck, sizeof(szMsgCRCCheck), szFileIniConfig);
|
||
|
ShowMessage(szMsgCRCCheck, TRUE);
|
||
|
|
||
|
iResult = WIZ_CRC_PASS;
|
||
|
dwIndex0 = 0;
|
||
|
dwFileCounter = 0;
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
while(siCObject)
|
||
|
{
|
||
|
if((siCObject->dwAttributes & SIC_SELECTED) &&
|
||
|
!(siCObject->dwAttributes & SIC_IGNORE_DOWNLOAD_ERROR))
|
||
|
{
|
||
|
if((iRv = LocateJar(siCObject, szArchivePath, sizeof(szArchivePath), TRUE)) == AP_NOT_FOUND)
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szEFileNotFound[MAX_BUF];
|
||
|
|
||
|
if(GetPrivateProfileString("Messages", "ERROR_FILE_NOT_FOUND", "", szEFileNotFound, sizeof(szEFileNotFound), szFileIniInstall))
|
||
|
{
|
||
|
sprintf(szBuf, szEFileNotFound, siCObject->szArchiveName);
|
||
|
PrintError(szBuf, ERROR_CODE_HIDE);
|
||
|
}
|
||
|
iResult = WIZ_ARCHIVES_MISSING; // not all .xpi files were downloaded
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if(strlen(szArchivePath) < sizeof(szArchivePathWithFilename))
|
||
|
strcpy(szArchivePathWithFilename, szArchivePath);
|
||
|
|
||
|
AppendBackSlash(szArchivePathWithFilename, sizeof(szArchivePathWithFilename));
|
||
|
if((strlen(szArchivePathWithFilename) + strlen(siCObject->szArchiveName)) < sizeof(szArchivePathWithFilename))
|
||
|
strcat(szArchivePathWithFilename, siCObject->szArchiveName);
|
||
|
|
||
|
if(CheckForArchiveExtension(szArchivePathWithFilename))
|
||
|
{
|
||
|
/* Make sure that the Archive that failed is located in the TEMP
|
||
|
* folder. This means that it was downloaded at one point and not
|
||
|
* simply uncompressed from the self-extracting exe file. */
|
||
|
if(VerifyArchive(szArchivePathWithFilename) != ZIP_OK)
|
||
|
{
|
||
|
if(iRv == AP_TEMP_PATH)
|
||
|
{
|
||
|
/* Delete the archive even though the download lib will automatically
|
||
|
* overwrite the file. This is in case that Setup is canceled, at the
|
||
|
* next restart, the file will be downloaded during the first attempt,
|
||
|
* not after a VerifyArchive() call. */
|
||
|
DosDelete(szArchivePathWithFilename);
|
||
|
sprintf(szSection, "File%d", dwFileCounter);
|
||
|
++dwFileCounter;
|
||
|
if(szFileIdiGetArchives)
|
||
|
if((AddArchiveToIdiFile(siCObject,
|
||
|
szSection,
|
||
|
szFileIdiGetArchives)) != 0)
|
||
|
return(WIZ_ERROR_UNDEFINED);
|
||
|
|
||
|
++siCObject->iCRCRetries;
|
||
|
if(szCorruptedArchiveList != NULL)
|
||
|
{
|
||
|
if((DWORD)(strlen(szCorruptedArchiveList) + strlen(siCObject->szArchiveName + 1)) < dwCorruptedArchiveListSize)
|
||
|
{
|
||
|
strcat(szCorruptedArchiveList, " ");
|
||
|
strcat(szCorruptedArchiveList, siCObject->szArchiveName);
|
||
|
strcat(szCorruptedArchiveList, "\n");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
iResult = WIZ_CRC_FAIL;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
++dwIndex0;
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
}
|
||
|
ShowMessage(szMsgCRCCheck, FALSE);
|
||
|
return(iResult);
|
||
|
}
|
||
|
|
||
|
long RetrieveArchives()
|
||
|
{
|
||
|
DWORD dwIndex0;
|
||
|
DWORD dwFileCounter;
|
||
|
BOOL bDone;
|
||
|
siC *siCObject = NULL;
|
||
|
long lResult;
|
||
|
char szFileIdiGetArchives[MAX_BUF];
|
||
|
char szSection[MAX_BUF];
|
||
|
char szCorruptedArchiveList[MAX_BUF];
|
||
|
char szFailedFile[MAX_BUF];
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szPartiallyDownloadedFilename[MAX_BUF];
|
||
|
int iCRCRetries;
|
||
|
int iRv;
|
||
|
|
||
|
/* retrieve the redirect.ini file */
|
||
|
RetrieveRedirectFile();
|
||
|
|
||
|
memset(szCorruptedArchiveList, 0, sizeof(szCorruptedArchiveList));
|
||
|
strcpy(szFileIdiGetArchives, szTempDir);
|
||
|
AppendBackSlash(szFileIdiGetArchives, sizeof(szFileIdiGetArchives));
|
||
|
strcat(szFileIdiGetArchives, FILE_IDI_GETARCHIVES);
|
||
|
GetSetupCurrentDownloadFile(szPartiallyDownloadedFilename,
|
||
|
sizeof(szPartiallyDownloadedFilename));
|
||
|
|
||
|
gbDownloadTriggered= FALSE;
|
||
|
lResult = WIZ_OK;
|
||
|
dwIndex0 = 0;
|
||
|
dwFileCounter = 0;
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
while(siCObject)
|
||
|
{
|
||
|
if(siCObject->dwAttributes & SIC_SELECTED)
|
||
|
{
|
||
|
/* If a previous unfinished setup was detected, then
|
||
|
* include the TEMP dir when searching for archives.
|
||
|
* Only download jars if not already in the local machine.
|
||
|
* Also if the last file being downloaded should be resumed.
|
||
|
* The resume detection is done automatically. */
|
||
|
if((LocateJar(siCObject,
|
||
|
NULL,
|
||
|
0,
|
||
|
gbPreviousUnfinishedDownload) == AP_NOT_FOUND) ||
|
||
|
(stricmp(szPartiallyDownloadedFilename,
|
||
|
siCObject->szArchiveName) == 0))
|
||
|
{
|
||
|
sprintf(szSection, "File%d", dwFileCounter);
|
||
|
if((lResult = AddArchiveToIdiFile(siCObject,
|
||
|
szSection,
|
||
|
szFileIdiGetArchives)) != 0)
|
||
|
return(lResult);
|
||
|
|
||
|
++dwFileCounter;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
++dwIndex0;
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
}
|
||
|
|
||
|
SetSetupState(SETUP_STATE_DOWNLOAD);
|
||
|
|
||
|
/* iCRCRetries is initially set to 0 because the first attemp at downloading
|
||
|
* the archives is not considered a "retry". Subsequent downloads are
|
||
|
* considered retries. */
|
||
|
iCRCRetries = 0;
|
||
|
bDone = FALSE;
|
||
|
do
|
||
|
{
|
||
|
/* the existence of the getarchives.idi file determines if there are
|
||
|
any archives needed to be downloaded */
|
||
|
if(FileExists(szFileIdiGetArchives))
|
||
|
{
|
||
|
gbDownloadTriggered = TRUE;
|
||
|
lResult = DownloadFiles(szFileIdiGetArchives, /* input idi file to parse */
|
||
|
szTempDir, /* download directory */
|
||
|
diAdvancedSettings.szProxyServer, /* proxy server name */
|
||
|
diAdvancedSettings.szProxyPort, /* proxy server port */
|
||
|
diAdvancedSettings.szProxyUser, /* proxy server user (optional) */
|
||
|
diAdvancedSettings.szProxyPasswd, /* proxy password (optional) */
|
||
|
iCRCRetries, /* show retry message */
|
||
|
FALSE, /* ignore network error */
|
||
|
szFailedFile, /* buffer to store the name of failed file */
|
||
|
sizeof(szFailedFile)); /* size of failed file name buffer */
|
||
|
if(lResult == WIZ_OK)
|
||
|
{
|
||
|
/* CRC check only the archives that were downloaded.
|
||
|
* It will regenerate the idi file with the list of files
|
||
|
* that have not passed the CRC check. */
|
||
|
iRv = CRCCheckDownloadedArchives(szCorruptedArchiveList,
|
||
|
sizeof(szCorruptedArchiveList),
|
||
|
szFileIdiGetArchives);
|
||
|
switch(iRv)
|
||
|
{
|
||
|
case WIZ_CRC_PASS:
|
||
|
bDone = TRUE;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
bDone = FALSE;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* Download failed. Error message was already shown by DownloadFiles().
|
||
|
* Simple exit loop here */
|
||
|
bDone = TRUE;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
/* no idi file, so exit loop */
|
||
|
bDone = TRUE;
|
||
|
|
||
|
if(!bDone)
|
||
|
{
|
||
|
++iCRCRetries;
|
||
|
if(iCRCRetries > MAX_CRC_FAILED_DOWNLOAD_RETRIES)
|
||
|
bDone = TRUE;
|
||
|
}
|
||
|
|
||
|
} while(!bDone);
|
||
|
|
||
|
if(iCRCRetries > MAX_CRC_FAILED_DOWNLOAD_RETRIES)
|
||
|
{
|
||
|
/* too many retries from failed CRC checks */
|
||
|
char szMsg[MAX_BUF];
|
||
|
|
||
|
LogISComponentsFailedCRC(szCorruptedArchiveList, W_DOWNLOAD);
|
||
|
GetPrivateProfileString("Strings", "Error Too Many CRC Failures", "", szMsg, sizeof(szMsg), szFileIniConfig);
|
||
|
if(*szMsg != '\0')
|
||
|
PrintError(szMsg, ERROR_CODE_HIDE);
|
||
|
|
||
|
lResult = WIZ_CRC_FAIL;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if(gbDownloadTriggered)
|
||
|
LogISComponentsFailedCRC(NULL, W_DOWNLOAD);
|
||
|
}
|
||
|
|
||
|
LogISDownloadProtocol(diAdditionalOptions.dwUseProtocol);
|
||
|
LogMSDownloadProtocol(diAdditionalOptions.dwUseProtocol);
|
||
|
|
||
|
if(lResult == WIZ_OK)
|
||
|
{
|
||
|
LogISDownloadStatus("ok", NULL);
|
||
|
}
|
||
|
else if(gbDownloadTriggered)
|
||
|
{
|
||
|
sprintf(szBuf, "failed: %d", lResult);
|
||
|
LogISDownloadStatus(szBuf, szFailedFile);
|
||
|
}
|
||
|
|
||
|
/* We want to log the download status regardless if we downloaded or not. */
|
||
|
LogMSDownloadStatus(lResult);
|
||
|
|
||
|
if(lResult == WIZ_OK)
|
||
|
{
|
||
|
UnsetSetupCurrentDownloadFile();
|
||
|
UnsetSetupState();
|
||
|
}
|
||
|
|
||
|
return(lResult);
|
||
|
}
|
||
|
|
||
|
void RemoveBackSlash(PSZ szInput)
|
||
|
{
|
||
|
char *ptrChar = NULL;
|
||
|
|
||
|
if(!szInput)
|
||
|
return;
|
||
|
|
||
|
ptrChar = WinPrevChar(0, 0, 0, szInput, szInput + strlen(szInput));
|
||
|
if (*ptrChar == '\\') {
|
||
|
*ptrChar = '\0';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void AppendBackSlash(PSZ szInput, ULONG ulInputSize)
|
||
|
{
|
||
|
ULONG ulInputLen = strlen(szInput);
|
||
|
|
||
|
if(szInput)
|
||
|
{
|
||
|
if(*szInput == '\0')
|
||
|
{
|
||
|
if((ulInputLen + 1) < ulInputSize)
|
||
|
{
|
||
|
strcat(szInput, "\\");
|
||
|
}
|
||
|
}
|
||
|
else if(*WinPrevChar(0, 0, 0, szInput, &szInput[ulInputLen]) != '\\')
|
||
|
{
|
||
|
if((ulInputLen + 1) < ulInputSize)
|
||
|
{
|
||
|
strcat(szInput, "\\");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void RemoveSlash(LPSTR szInput)
|
||
|
{
|
||
|
DWORD dwInputLen;
|
||
|
BOOL bDone;
|
||
|
char *ptrChar = NULL;
|
||
|
|
||
|
if(szInput)
|
||
|
{
|
||
|
dwInputLen = strlen(szInput);
|
||
|
bDone = FALSE;
|
||
|
ptrChar = &szInput[dwInputLen];
|
||
|
while(!bDone)
|
||
|
{
|
||
|
ptrChar = WinPrevChar(0, 0, 0, szInput, ptrChar);
|
||
|
if(*ptrChar == '/')
|
||
|
*ptrChar = '\0';
|
||
|
else
|
||
|
bDone = TRUE;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void AppendSlash(LPSTR szInput, DWORD dwInputSize)
|
||
|
{
|
||
|
DWORD dwInputLen = strlen(szInput);
|
||
|
|
||
|
if(szInput)
|
||
|
{
|
||
|
if(*szInput == '\0')
|
||
|
{
|
||
|
if((dwInputLen + 1) < dwInputSize)
|
||
|
{
|
||
|
strcat(szInput, "/");
|
||
|
}
|
||
|
}
|
||
|
else if(*WinPrevChar(0, 0, 0, szInput, &szInput[dwInputLen]) != '/')
|
||
|
{
|
||
|
if((dwInputLen + 1) < dwInputSize)
|
||
|
{
|
||
|
strcat(szInput, "/");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ParsePath(PSZ szInput, PSZ szOutput, ULONG ulOutputSize, BOOL bURLPath, ULONG ulType)
|
||
|
{
|
||
|
int iFoundDelimiter;
|
||
|
ULONG ulInputLen;
|
||
|
ULONG ulOutputLen;
|
||
|
BOOL bFound;
|
||
|
BOOL bDone = FALSE;
|
||
|
char cDelimiter;
|
||
|
char *ptrChar = NULL;
|
||
|
char *ptrLastChar = NULL;
|
||
|
|
||
|
if(bURLPath)
|
||
|
cDelimiter = '/';
|
||
|
else
|
||
|
cDelimiter = '\\';
|
||
|
|
||
|
if(szInput && szOutput)
|
||
|
{
|
||
|
bFound = TRUE;
|
||
|
ulInputLen = strlen(szInput);
|
||
|
memset(szOutput, 0, ulOutputSize);
|
||
|
|
||
|
if(ulInputLen < ulOutputSize)
|
||
|
{
|
||
|
switch(ulType)
|
||
|
{
|
||
|
case PP_FILENAME_ONLY:
|
||
|
ptrChar = &szInput[ulInputLen];
|
||
|
bDone = FALSE;
|
||
|
while(!bDone)
|
||
|
{
|
||
|
ptrChar = WinPrevChar(0, 0, 0, szInput, ptrChar);
|
||
|
if(*ptrChar == cDelimiter)
|
||
|
{
|
||
|
strcpy(szOutput, WinNextChar(0, 0, 0, ptrChar));
|
||
|
bDone = TRUE;
|
||
|
}
|
||
|
else if(ptrChar == szInput)
|
||
|
{
|
||
|
/* we're at the beginning of the string and still
|
||
|
* nothing found. So just return the input string. */
|
||
|
strcpy(szOutput, szInput);
|
||
|
bDone = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case PP_PATH_ONLY:
|
||
|
strcpy(szOutput, szInput);
|
||
|
ulOutputLen = strlen(szOutput);
|
||
|
ptrChar = &szOutput[ulOutputLen];
|
||
|
bDone = FALSE;
|
||
|
while(!bDone)
|
||
|
{
|
||
|
ptrChar = WinPrevChar(0, 0, 0, szOutput, ptrChar);
|
||
|
if(*ptrChar == cDelimiter)
|
||
|
{
|
||
|
*WinNextChar(0, 0, 0, ptrChar) = '\0';
|
||
|
bDone = TRUE;
|
||
|
}
|
||
|
else if(ptrChar == szOutput)
|
||
|
{
|
||
|
/* we're at the beginning of the string and still
|
||
|
* nothing found. So just return the input string. */
|
||
|
bDone = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case PP_EXTENSION_ONLY:
|
||
|
/* check the last character first */
|
||
|
ptrChar = WinPrevChar(0, 0, 0, szInput, &szInput[ulInputLen]);
|
||
|
if(*ptrChar == '.')
|
||
|
break;
|
||
|
|
||
|
bDone = FALSE;
|
||
|
while(!bDone)
|
||
|
{
|
||
|
ptrChar = WinPrevChar(0, 0, 0, szInput, ptrChar);
|
||
|
if(*ptrChar == cDelimiter)
|
||
|
/* found path delimiter before '.' */
|
||
|
bDone = TRUE;
|
||
|
else if(*ptrChar == '.')
|
||
|
{
|
||
|
strcpy(szOutput, WinNextChar(0, 0, 0, ptrChar));
|
||
|
bDone = TRUE;
|
||
|
}
|
||
|
else if(ptrChar == szInput)
|
||
|
bDone = TRUE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case PP_ROOT_ONLY:
|
||
|
strcpy(szOutput, szInput);
|
||
|
ulOutputLen = strlen(szOutput);
|
||
|
ptrLastChar = WinPrevChar(0, 0, 0, szOutput, &szOutput[ulOutputLen]);
|
||
|
ptrChar = WinNextChar(0, 0, 0, szOutput);
|
||
|
if(*ptrChar == ':')
|
||
|
{
|
||
|
ptrChar = WinNextChar(0, 0, 0, ptrChar);
|
||
|
*ptrChar = cDelimiter;
|
||
|
*WinNextChar(0, 0, 0, ptrChar) = '\0';
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
iFoundDelimiter = 0;
|
||
|
ptrChar = szOutput;
|
||
|
while(!bDone)
|
||
|
{
|
||
|
if(*ptrChar == cDelimiter)
|
||
|
++iFoundDelimiter;
|
||
|
|
||
|
if(iFoundDelimiter == 4)
|
||
|
{
|
||
|
*WinNextChar(0, 0, 0, ptrChar) = '\0';
|
||
|
bDone = TRUE;
|
||
|
}
|
||
|
else if(ptrChar == ptrLastChar)
|
||
|
bDone = TRUE;
|
||
|
else
|
||
|
ptrChar = WinNextChar(0, 0, 0, ptrChar);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
HRESULT LaunchApps()
|
||
|
{
|
||
|
DWORD dwIndex0;
|
||
|
BOOL bArchiveFound;
|
||
|
siC *siCObject = NULL;
|
||
|
char szArchive[MAX_BUF];
|
||
|
char szMsg[MAX_BUF];
|
||
|
|
||
|
LogISLaunchApps(W_START);
|
||
|
if(!GetPrivateProfileString("Messages", "MSG_CONFIGURING", "", szMsg, sizeof(szMsg), szFileIniInstall))
|
||
|
return(1);
|
||
|
|
||
|
dwIndex0 = 0;
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
while(siCObject)
|
||
|
{
|
||
|
/* launch 3rd party executable */
|
||
|
if((siCObject->dwAttributes & SIC_SELECTED) && (siCObject->dwAttributes & SIC_LAUNCHAPP))
|
||
|
{
|
||
|
bArchiveFound = TRUE;
|
||
|
strcpy(szArchive, sgProduct.szAlternateArchiveSearchPath);
|
||
|
AppendBackSlash(szArchive, sizeof(szArchive));
|
||
|
strcat(szArchive, siCObject->szArchiveName);
|
||
|
if((*sgProduct.szAlternateArchiveSearchPath == '\0') || !FileExists(szArchive))
|
||
|
{
|
||
|
strcpy(szArchive, szSetupDir);
|
||
|
AppendBackSlash(szArchive, sizeof(szArchive));
|
||
|
strcat(szArchive, siCObject->szArchiveName);
|
||
|
if(!FileExists(szArchive))
|
||
|
{
|
||
|
strcpy(szArchive, szTempDir);
|
||
|
AppendBackSlash(szArchive, sizeof(szArchive));
|
||
|
strcat(szArchive, siCObject->szArchiveName);
|
||
|
if(!FileExists(szArchive))
|
||
|
{
|
||
|
bArchiveFound = FALSE;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(bArchiveFound)
|
||
|
{
|
||
|
char szParameterBuf[MAX_BUF];
|
||
|
char szSpawnFile[MAX_BUF];
|
||
|
char szMessageString[MAX_BUF];
|
||
|
DWORD dwErr = FO_SUCCESS;
|
||
|
|
||
|
sprintf(szMessageString, szMsg, siCObject->szDescriptionShort);
|
||
|
ShowMessage(szMessageString, TRUE);
|
||
|
DecryptString(szParameterBuf, siCObject->szParameter);
|
||
|
|
||
|
strcpy(szSpawnFile, szArchive);
|
||
|
if(siCObject->dwAttributes & SIC_UNCOMPRESS)
|
||
|
{
|
||
|
if((dwErr = FileUncompress(szArchive, szTempDir)) == FO_SUCCESS)
|
||
|
{
|
||
|
strcpy(szSpawnFile, szTempDir);
|
||
|
AppendBackSlash(szSpawnFile, sizeof(szSpawnFile));
|
||
|
strcat(szSpawnFile, siCObject->szArchiveNameUncompressed);
|
||
|
}
|
||
|
|
||
|
LogISLaunchAppsComponentUncompress(siCObject->szDescriptionShort, dwErr);
|
||
|
if(dwErr != FO_SUCCESS)
|
||
|
{
|
||
|
ShowMessage(szMessageString, FALSE);
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
LogISLaunchAppsComponent(siCObject->szDescriptionShort);
|
||
|
WinSpawn(szSpawnFile, szParameterBuf, szTempDir, TRUE);
|
||
|
|
||
|
if(siCObject->dwAttributes & SIC_UNCOMPRESS)
|
||
|
FileDelete(szSpawnFile);
|
||
|
|
||
|
ShowMessage(szMessageString, FALSE);
|
||
|
}
|
||
|
}
|
||
|
++dwIndex0;
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
}
|
||
|
|
||
|
LogISLaunchApps(W_END);
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
HRESULT ProcessOS2Integration()
|
||
|
{
|
||
|
if (diOS2Integration.oiCBMakeDefaultBrowser.bCheckBoxState == TRUE) {
|
||
|
HOBJECT hObjURL = NULLHANDLE;
|
||
|
CHAR szSetupString[1000];
|
||
|
CHAR szTemp[CCHMAXPATH];
|
||
|
strcpy(szSetupString, "OBJECTID=<MOZTEMPCONVERSIONURL>");
|
||
|
sprintf(szTemp, "%s\\%s", sgProduct.szPath, sgProduct.szProgramName);
|
||
|
strcat(szSetupString, ";DEFAULTBROWSER=");
|
||
|
strcat(szSetupString, szTemp) ;
|
||
|
PrfWriteProfileString(HINI_USER,
|
||
|
"WPURLDEFAULTSETTINGS",
|
||
|
"DefaultBrowserExe",
|
||
|
szTemp ) ;
|
||
|
|
||
|
strcat(szSetupString, ";DEFAULTWORKINGDIR=");
|
||
|
strcat(szSetupString, sgProduct.szPath);
|
||
|
PrfWriteProfileString(HINI_USER,
|
||
|
"WPURLDEFAULTSETTINGS",
|
||
|
"DefaultWorkingDir",
|
||
|
sgProduct.szPath);
|
||
|
|
||
|
if (hObjURL = WinCreateObject("WPUrl",
|
||
|
"Temporary URL",
|
||
|
szSetupString,
|
||
|
"<WP_NOWHERE>",
|
||
|
CO_REPLACEIFEXISTS))
|
||
|
{
|
||
|
WinDestroyObject(hObjURL);
|
||
|
}
|
||
|
}
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
char *GetOSTypeString(char *szOSType, ULONG ulOSTypeBufSize)
|
||
|
{
|
||
|
memset(szOSType, 0, ulOSTypeBufSize);
|
||
|
|
||
|
if(gSystemInfo.ulOSType & OS_WARP3)
|
||
|
strcpy(szOSType, "Warp 3");
|
||
|
else
|
||
|
strcpy(szOSType, "Warp 4");
|
||
|
|
||
|
return(szOSType);
|
||
|
}
|
||
|
|
||
|
void DetermineOSVersionEx()
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szOSType[MAX_BUF];
|
||
|
ULONG aulSysInfo[QSV_MAX+1];
|
||
|
APIRET rc;
|
||
|
ULONG TotPhysMem,TotResMem,TotAvailMem;
|
||
|
|
||
|
rc = DosQuerySysInfo(1,
|
||
|
QSV_MAX,
|
||
|
(PVOID)&aulSysInfo[1],
|
||
|
sizeof(ULONG)*QSV_MAX);
|
||
|
|
||
|
if(rc != NO_ERROR)
|
||
|
{
|
||
|
/* DosQuerySysInfo() failed for some reason. It's not fatal, but could cause
|
||
|
* some complications during installation */
|
||
|
char szEMsg[MAX_BUF_TINY];
|
||
|
|
||
|
if(GetPrivateProfileString("Messages", "ERROR_GETVERSION", "", szEMsg, sizeof(szEMsg), szFileIniInstall))
|
||
|
PrintError(szEMsg, ERROR_CODE_SHOW);
|
||
|
}
|
||
|
|
||
|
gSystemInfo.ulOSType = OS_WARP4; /* @MAK - should detect more stuff here */
|
||
|
gSystemInfo.ulMajorVersion = aulSysInfo[QSV_VERSION_MAJOR];
|
||
|
gSystemInfo.ulMinorVersion = aulSysInfo[QSV_VERSION_MINOR];
|
||
|
gSystemInfo.ulBuildNumber = aulSysInfo[QSV_VERSION_REVISION];
|
||
|
memset(gSystemInfo.szExtraString, 0, sizeof(gSystemInfo.szExtraString));
|
||
|
strcpy(gSystemInfo.szExtraString, "Seriously should be something"); /* @MAK */
|
||
|
|
||
|
gSystemInfo.ulMemoryTotalPhysical = aulSysInfo[QSV_TOTPHYSMEM]/1024;
|
||
|
gSystemInfo.ulMemoryAvailablePhysical = aulSysInfo[QSV_TOTAVAILMEM]/1024;
|
||
|
|
||
|
GetOSTypeString(szOSType, sizeof(szOSType));
|
||
|
sprintf(szBuf,
|
||
|
" System Info:\n\
|
||
|
OS Type: %s\n\
|
||
|
Major Version: %d\n\
|
||
|
Minor Version: %d\n\
|
||
|
Build Number: %d\n\
|
||
|
Extra String: %s\n\
|
||
|
Total Physical Memory: %dKB\n\
|
||
|
Total Available Physical Memory: %dKB\n",
|
||
|
szOSType,
|
||
|
gSystemInfo.ulMajorVersion,
|
||
|
gSystemInfo.ulMinorVersion,
|
||
|
gSystemInfo.ulBuildNumber,
|
||
|
gSystemInfo.szExtraString,
|
||
|
gSystemInfo.ulMemoryTotalPhysical,
|
||
|
gSystemInfo.ulMemoryAvailablePhysical);
|
||
|
|
||
|
UpdateInstallStatusLog(szBuf);
|
||
|
}
|
||
|
|
||
|
HRESULT WinSpawn(LPSTR szClientName, LPSTR szParameters, LPSTR szCurrentDir, BOOL bWait)
|
||
|
{
|
||
|
STARTDATA startdata;
|
||
|
PID pid, endpid;
|
||
|
ULONG ulSessID;
|
||
|
APIRET rc;
|
||
|
RESULTCODES resultcodes;
|
||
|
ULONG ulFlags;
|
||
|
|
||
|
rc = DosQueryAppType(szClientName, &ulFlags);
|
||
|
if (rc == NO_ERROR) {
|
||
|
memset(&startdata, 0, sizeof(STARTDATA));
|
||
|
startdata.Length = sizeof(STARTDATA);
|
||
|
startdata.PgmName = szClientName;
|
||
|
startdata.PgmInputs = szParameters;
|
||
|
rc = DosStartSession(&startdata, &ulSessID, &pid);
|
||
|
if (rc == NO_ERROR) {
|
||
|
if (bWait) {
|
||
|
DosWaitChild(DCWA_PROCESS, DCWW_NOWAIT, &resultcodes, &endpid, pid);
|
||
|
}
|
||
|
return (TRUE);
|
||
|
}
|
||
|
} else {
|
||
|
CHAR szBuf[CCHMAXPATH];
|
||
|
HOBJECT hobject;
|
||
|
strcpy(szBuf, szCurrentDir);
|
||
|
strcat(szBuf, szClientName);
|
||
|
hobject = WinQueryObject(szBuf);
|
||
|
WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
|
||
|
WinOpenObject(hobject, 0, TRUE); // 0 = OPEN_DEFAULT
|
||
|
}
|
||
|
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
HRESULT InitDlgWelcome(diW *diDialog)
|
||
|
{
|
||
|
diDialog->bShowDialog = FALSE;
|
||
|
if((diDialog->szTitle = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessage0 = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessage1 = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessage2 = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
void DeInitDlgWelcome(diW *diDialog)
|
||
|
{
|
||
|
FreeMemory(&(diDialog->szTitle));
|
||
|
FreeMemory(&(diDialog->szMessage0));
|
||
|
FreeMemory(&(diDialog->szMessage1));
|
||
|
FreeMemory(&(diDialog->szMessage2));
|
||
|
}
|
||
|
|
||
|
HRESULT InitDlgLicense(diL *diDialog)
|
||
|
{
|
||
|
diDialog->bShowDialog = FALSE;
|
||
|
if((diDialog->szTitle = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szLicenseFilename = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessage0 = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessage1 = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
void DeInitDlgLicense(diL *diDialog)
|
||
|
{
|
||
|
FreeMemory(&(diDialog->szTitle));
|
||
|
FreeMemory(&(diDialog->szLicenseFilename));
|
||
|
FreeMemory(&(diDialog->szMessage0));
|
||
|
FreeMemory(&(diDialog->szMessage1));
|
||
|
}
|
||
|
|
||
|
HRESULT InitDlgQuickLaunch(diQL *diDialog)
|
||
|
{
|
||
|
diDialog->bTurboMode = FALSE;
|
||
|
diDialog->bTurboModeEnabled = FALSE;
|
||
|
diDialog->bShowDialog = FALSE;
|
||
|
if((diDialog->szTitle = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessage0 = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessage1 = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessage2 = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
void DeInitDlgQuickLaunch(diQL *diDialog)
|
||
|
{
|
||
|
FreeMemory(&(diDialog->szTitle));
|
||
|
FreeMemory(&(diDialog->szMessage0));
|
||
|
FreeMemory(&(diDialog->szMessage1));
|
||
|
FreeMemory(&(diDialog->szMessage2));
|
||
|
}
|
||
|
|
||
|
HRESULT InitDlgSetupType(diST *diDialog)
|
||
|
{
|
||
|
diDialog->bShowDialog = FALSE;
|
||
|
|
||
|
if((diDialog->szTitle = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessage0 = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szReadmeFilename = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szReadmeApp = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
diDialog->stSetupType0.dwCItems = 0;
|
||
|
diDialog->stSetupType1.dwCItems = 0;
|
||
|
diDialog->stSetupType2.dwCItems = 0;
|
||
|
diDialog->stSetupType3.dwCItems = 0;
|
||
|
if((diDialog->stSetupType0.szDescriptionShort = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->stSetupType0.szDescriptionLong = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
if((diDialog->stSetupType1.szDescriptionShort = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->stSetupType1.szDescriptionLong = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
if((diDialog->stSetupType2.szDescriptionShort = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->stSetupType2.szDescriptionLong = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
if((diDialog->stSetupType3.szDescriptionShort = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->stSetupType3.szDescriptionLong = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
void DeInitDlgSetupType(diST *diDialog)
|
||
|
{
|
||
|
FreeMemory(&(diDialog->szTitle));
|
||
|
FreeMemory(&(diDialog->szMessage0));
|
||
|
|
||
|
FreeMemory(&(diDialog->szReadmeFilename));
|
||
|
FreeMemory(&(diDialog->szReadmeApp));
|
||
|
FreeMemory(&(diDialog->stSetupType0.szDescriptionShort));
|
||
|
FreeMemory(&(diDialog->stSetupType0.szDescriptionLong));
|
||
|
FreeMemory(&(diDialog->stSetupType1.szDescriptionShort));
|
||
|
FreeMemory(&(diDialog->stSetupType1.szDescriptionLong));
|
||
|
FreeMemory(&(diDialog->stSetupType2.szDescriptionShort));
|
||
|
FreeMemory(&(diDialog->stSetupType2.szDescriptionLong));
|
||
|
FreeMemory(&(diDialog->stSetupType3.szDescriptionShort));
|
||
|
FreeMemory(&(diDialog->stSetupType3.szDescriptionLong));
|
||
|
}
|
||
|
|
||
|
HRESULT InitDlgSelectComponents(diSC *diDialog, DWORD dwSM)
|
||
|
{
|
||
|
diDialog->bShowDialog = FALSE;
|
||
|
|
||
|
/* set to show the Single dialog or the Multi dialog for the SelectComponents dialog */
|
||
|
diDialog->bShowDialogSM = dwSM;
|
||
|
if((diDialog->szTitle = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessage0 = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
void DeInitDlgSelectComponents(diSC *diDialog)
|
||
|
{
|
||
|
FreeMemory(&(diDialog->szTitle));
|
||
|
FreeMemory(&(diDialog->szMessage0));
|
||
|
}
|
||
|
|
||
|
HRESULT InitDlgOS2Integration(diOI *diDialog)
|
||
|
{
|
||
|
diDialog->bShowDialog = FALSE;
|
||
|
if((diDialog->szTitle = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
if((diDialog->szMessage0 = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
if((diDialog->szMessage1 = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
if((diDialog->szHomeDirectory = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
|
||
|
diDialog->oiCBMakeDefaultBrowser.bEnabled = FALSE;
|
||
|
diDialog->oiCBAssociateHTML.bEnabled = FALSE;
|
||
|
diDialog->oiCBUpdateCONFIGSYS.bEnabled = FALSE;
|
||
|
|
||
|
diDialog->oiCBMakeDefaultBrowser.bCheckBoxState = FALSE;
|
||
|
diDialog->oiCBAssociateHTML.bCheckBoxState = FALSE;
|
||
|
diDialog->oiCBUpdateCONFIGSYS.bCheckBoxState = FALSE;
|
||
|
|
||
|
if((diDialog->oiCBMakeDefaultBrowser.szDescription = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->oiCBAssociateHTML.szDescription = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->oiCBUpdateCONFIGSYS.szDescription = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
void DeInitDlgOS2Integration(diOI *diDialog)
|
||
|
{
|
||
|
FreeMemory(&(diDialog->szTitle));
|
||
|
FreeMemory(&(diDialog->szMessage0));
|
||
|
FreeMemory(&(diDialog->szMessage1));
|
||
|
FreeMemory(&(diDialog->szHomeDirectory));
|
||
|
|
||
|
FreeMemory(&(diDialog->oiCBMakeDefaultBrowser.szDescription));
|
||
|
FreeMemory(&(diDialog->oiCBAssociateHTML.szDescription));
|
||
|
FreeMemory(&(diDialog->oiCBUpdateCONFIGSYS.szDescription));
|
||
|
}
|
||
|
|
||
|
HRESULT InitDlgProgramFolder(diPF *diDialog)
|
||
|
{
|
||
|
diDialog->bShowDialog = FALSE;
|
||
|
if((diDialog->szTitle = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessage0 = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
void DeInitDlgProgramFolder(diPF *diDialog)
|
||
|
{
|
||
|
FreeMemory(&(diDialog->szTitle));
|
||
|
FreeMemory(&(diDialog->szMessage0));
|
||
|
}
|
||
|
|
||
|
HRESULT InitDlgAdditionalOptions(diDO *diDialog)
|
||
|
{
|
||
|
diDialog->bShowDialog = FALSE;
|
||
|
diDialog->bSaveInstaller = FALSE;
|
||
|
diDialog->bRecaptureHomepage = FALSE;
|
||
|
diDialog->bShowHomepageOption = FALSE;
|
||
|
diDialog->dwUseProtocol = UP_FTP;
|
||
|
diDialog->bUseProtocolSettings = TRUE;
|
||
|
diDialog->bShowProtocols = TRUE;
|
||
|
if((diDialog->szTitle = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessage0 = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessage1 = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
void DeInitDlgAdditionalOptions(diDO *diDialog)
|
||
|
{
|
||
|
FreeMemory(&(diDialog->szTitle));
|
||
|
FreeMemory(&(diDialog->szMessage0));
|
||
|
FreeMemory(&(diDialog->szMessage1));
|
||
|
}
|
||
|
|
||
|
HRESULT InitDlgAdvancedSettings(diAS *diDialog)
|
||
|
{
|
||
|
diDialog->bShowDialog = FALSE;
|
||
|
if((diDialog->szTitle = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessage0 = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szProxyServer = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szProxyPort = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szProxyUser = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szProxyPasswd = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
void DeInitDlgAdvancedSettings(diAS *diDialog)
|
||
|
{
|
||
|
FreeMemory(&(diDialog->szTitle));
|
||
|
FreeMemory(&(diDialog->szMessage0));
|
||
|
FreeMemory(&(diDialog->szProxyServer));
|
||
|
FreeMemory(&(diDialog->szProxyPort));
|
||
|
FreeMemory(&(diDialog->szProxyUser));
|
||
|
FreeMemory(&(diDialog->szProxyPasswd));
|
||
|
}
|
||
|
|
||
|
HRESULT InitDlgStartInstall(diSI *diDialog)
|
||
|
{
|
||
|
diDialog->bShowDialog = FALSE;
|
||
|
if((diDialog->szTitle = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessageInstall = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessageDownload = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
void DeInitDlgStartInstall(diSI *diDialog)
|
||
|
{
|
||
|
FreeMemory(&(diDialog->szTitle));
|
||
|
FreeMemory(&(diDialog->szMessageInstall));
|
||
|
FreeMemory(&(diDialog->szMessageDownload));
|
||
|
}
|
||
|
|
||
|
HRESULT InitDlgDownload(diD *diDialog)
|
||
|
{
|
||
|
diDialog->bShowDialog = FALSE;
|
||
|
if((diDialog->szTitle = NS_GlobalAlloc(MAX_BUF_TINY)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessageDownload0 = NS_GlobalAlloc(MAX_BUF_MEDIUM)) == NULL)
|
||
|
return(1);
|
||
|
if((diDialog->szMessageRetry0 = NS_GlobalAlloc(MAX_BUF_MEDIUM)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
void DeInitDlgDownload(diD *diDialog)
|
||
|
{
|
||
|
FreeMemory(&(diDialog->szTitle));
|
||
|
FreeMemory(&(diDialog->szMessageDownload0));
|
||
|
FreeMemory(&(diDialog->szMessageRetry0));
|
||
|
}
|
||
|
|
||
|
ULONG InitDlgReboot(diR *diDialog)
|
||
|
{
|
||
|
diDialog->dwShowDialog = FALSE;
|
||
|
if((diDialog->szTitle = NS_GlobalAlloc(MAX_BUF_MEDIUM)) == NULL)
|
||
|
return(1);
|
||
|
GetPrivateProfileString("Messages", "DLG_REBOOT_TITLE", "", diDialog->szTitle, MAX_BUF_MEDIUM, szFileIniInstall);
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
void DeInitDlgReboot(diR *diDialog)
|
||
|
{
|
||
|
FreeMemory(&(diDialog->szTitle));
|
||
|
}
|
||
|
|
||
|
HRESULT InitSetupGeneral()
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
|
||
|
sgProduct.ulMode = NORMAL;
|
||
|
sgProduct.ulCustomType = ST_RADIO0;
|
||
|
sgProduct.ulNumberOfComponents = 0;
|
||
|
sgProduct.bLockPath = FALSE;
|
||
|
|
||
|
if((sgProduct.szPath = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((sgProduct.szSubPath = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((sgProduct.szProgramName = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((sgProduct.szCompanyName = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((sgProduct.szProductName = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((sgProduct.szProductNameInternal = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((sgProduct.szProductNamePrevious = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((sgProduct.szUninstallFilename = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((sgProduct.szUserAgent = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((sgProduct.szProgramFolderName = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((sgProduct.szProgramFolderPath = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((sgProduct.szAlternateArchiveSearchPath = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((sgProduct.szParentProcessFilename = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((szTempSetupPath = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
if((szSiteSelectorDescription = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
if(GetPrivateProfileString("Messages", "CB_DEFAULT", "", szBuf, sizeof(szBuf), szFileIniInstall))
|
||
|
strcpy(szSiteSelectorDescription, szBuf);
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
void DeInitSetupGeneral()
|
||
|
{
|
||
|
FreeMemory(&(sgProduct.szPath));
|
||
|
FreeMemory(&(sgProduct.szSubPath));
|
||
|
FreeMemory(&(sgProduct.szProgramName));
|
||
|
FreeMemory(&(sgProduct.szCompanyName));
|
||
|
FreeMemory(&(sgProduct.szProductName));
|
||
|
FreeMemory(&(sgProduct.szProductNameInternal));
|
||
|
FreeMemory(&(sgProduct.szProductNamePrevious));
|
||
|
FreeMemory(&(sgProduct.szUninstallFilename));
|
||
|
FreeMemory(&(sgProduct.szUserAgent));
|
||
|
FreeMemory(&(sgProduct.szProgramFolderName));
|
||
|
FreeMemory(&(sgProduct.szProgramFolderPath));
|
||
|
FreeMemory(&(sgProduct.szAlternateArchiveSearchPath));
|
||
|
FreeMemory(&(sgProduct.szParentProcessFilename));
|
||
|
FreeMemory(&(szTempSetupPath));
|
||
|
FreeMemory(&(szSiteSelectorDescription));
|
||
|
}
|
||
|
|
||
|
HRESULT InitSXpcomFile()
|
||
|
{
|
||
|
if((siCFXpcomFile.szSource = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((siCFXpcomFile.szDestination = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
if((siCFXpcomFile.szMessage = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
return(1);
|
||
|
|
||
|
siCFXpcomFile.bCleanup = TRUE;
|
||
|
siCFXpcomFile.ulInstallSize = 0;
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
void DeInitSXpcomFile()
|
||
|
{
|
||
|
FreeMemory(&(siCFXpcomFile.szSource));
|
||
|
FreeMemory(&(siCFXpcomFile.szDestination));
|
||
|
FreeMemory(&(siCFXpcomFile.szMessage));
|
||
|
}
|
||
|
|
||
|
siC *CreateSiCNode()
|
||
|
{
|
||
|
siC *siCNode;
|
||
|
|
||
|
if((siCNode = NS_GlobalAlloc(sizeof(struct sinfoComponent))) == NULL)
|
||
|
exit(1);
|
||
|
|
||
|
siCNode->dwAttributes = 0;
|
||
|
siCNode->ulInstallSize = 0;
|
||
|
siCNode->ulInstallSizeSystem = 0;
|
||
|
siCNode->ulInstallSizeArchive = 0;
|
||
|
siCNode->lRandomInstallPercentage = 0;
|
||
|
siCNode->lRandomInstallValue = 0;
|
||
|
siCNode->bForceUpgrade = FALSE;
|
||
|
|
||
|
if((siCNode->szArchiveName = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
if((siCNode->szArchiveNameUncompressed = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
if((siCNode->szArchivePath = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
if((siCNode->szDestinationPath = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
if((siCNode->szDescriptionShort = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
if((siCNode->szDescriptionLong = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
if((siCNode->szParameter = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
if((siCNode->szReferenceName = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
|
||
|
siCNode->iNetRetries = 0;
|
||
|
siCNode->iCRCRetries = 0;
|
||
|
siCNode->iNetTimeOuts = 0;
|
||
|
siCNode->siCDDependencies = NULL;
|
||
|
siCNode->siCDDependees = NULL;
|
||
|
siCNode->Next = NULL;
|
||
|
siCNode->Prev = NULL;
|
||
|
|
||
|
return(siCNode);
|
||
|
}
|
||
|
|
||
|
void SiCNodeInsert(siC **siCHead, siC *siCTemp)
|
||
|
{
|
||
|
if(*siCHead == NULL)
|
||
|
{
|
||
|
*siCHead = siCTemp;
|
||
|
(*siCHead)->Next = *siCHead;
|
||
|
(*siCHead)->Prev = *siCHead;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
siCTemp->Next = *siCHead;
|
||
|
siCTemp->Prev = (*siCHead)->Prev;
|
||
|
(*siCHead)->Prev->Next = siCTemp;
|
||
|
(*siCHead)->Prev = siCTemp;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void SiCNodeDelete(siC *siCTemp)
|
||
|
{
|
||
|
if(siCTemp != NULL)
|
||
|
{
|
||
|
DeInitSiCDependencies(siCTemp->siCDDependencies);
|
||
|
DeInitSiCDependencies(siCTemp->siCDDependees);
|
||
|
|
||
|
siCTemp->Next->Prev = siCTemp->Prev;
|
||
|
siCTemp->Prev->Next = siCTemp->Next;
|
||
|
siCTemp->Next = NULL;
|
||
|
siCTemp->Prev = NULL;
|
||
|
|
||
|
FreeMemory(&(siCTemp->szDestinationPath));
|
||
|
FreeMemory(&(siCTemp->szArchivePath));
|
||
|
FreeMemory(&(siCTemp->szArchiveName));
|
||
|
FreeMemory(&(siCTemp->szArchiveNameUncompressed));
|
||
|
FreeMemory(&(siCTemp->szParameter));
|
||
|
FreeMemory(&(siCTemp->szReferenceName));
|
||
|
FreeMemory(&(siCTemp->szDescriptionLong));
|
||
|
FreeMemory(&(siCTemp->szDescriptionShort));
|
||
|
FreeMemory(&siCTemp);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
siCD *CreateSiCDepNode()
|
||
|
{
|
||
|
siCD *siCDepNode;
|
||
|
|
||
|
if((siCDepNode = NS_GlobalAlloc(sizeof(struct sinfoComponentDep))) == NULL)
|
||
|
exit(1);
|
||
|
|
||
|
if((siCDepNode->szDescriptionShort = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
if((siCDepNode->szReferenceName = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
siCDepNode->Next = NULL;
|
||
|
siCDepNode->Prev = NULL;
|
||
|
|
||
|
return(siCDepNode);
|
||
|
}
|
||
|
|
||
|
void SiCDepNodeInsert(siCD **siCDepHead, siCD *siCDepTemp)
|
||
|
{
|
||
|
if(*siCDepHead == NULL)
|
||
|
{
|
||
|
*siCDepHead = siCDepTemp;
|
||
|
(*siCDepHead)->Next = *siCDepHead;
|
||
|
(*siCDepHead)->Prev = *siCDepHead;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
siCDepTemp->Next = *siCDepHead;
|
||
|
siCDepTemp->Prev = (*siCDepHead)->Prev;
|
||
|
(*siCDepHead)->Prev->Next = siCDepTemp;
|
||
|
(*siCDepHead)->Prev = siCDepTemp;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void SiCDepNodeDelete(siCD *siCDepTemp)
|
||
|
{
|
||
|
if(siCDepTemp != NULL)
|
||
|
{
|
||
|
siCDepTemp->Next->Prev = siCDepTemp->Prev;
|
||
|
siCDepTemp->Prev->Next = siCDepTemp->Next;
|
||
|
siCDepTemp->Next = NULL;
|
||
|
siCDepTemp->Prev = NULL;
|
||
|
|
||
|
FreeMemory(&(siCDepTemp->szDescriptionShort));
|
||
|
FreeMemory(&(siCDepTemp->szReferenceName));
|
||
|
FreeMemory(&siCDepTemp);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ssi *CreateSsiSiteSelectorNode()
|
||
|
{
|
||
|
ssi *ssiNode;
|
||
|
|
||
|
if((ssiNode = NS_GlobalAlloc(sizeof(struct ssInfo))) == NULL)
|
||
|
exit(1);
|
||
|
if((ssiNode->szDescription = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
if((ssiNode->szDomain = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
if((ssiNode->szIdentifier = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
|
||
|
ssiNode->Next = NULL;
|
||
|
ssiNode->Prev = NULL;
|
||
|
|
||
|
return(ssiNode);
|
||
|
}
|
||
|
|
||
|
void SsiSiteSelectorNodeInsert(ssi **ssiHead, ssi *ssiTemp)
|
||
|
{
|
||
|
if(*ssiHead == NULL)
|
||
|
{
|
||
|
*ssiHead = ssiTemp;
|
||
|
(*ssiHead)->Next = *ssiHead;
|
||
|
(*ssiHead)->Prev = *ssiHead;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ssiTemp->Next = *ssiHead;
|
||
|
ssiTemp->Prev = (*ssiHead)->Prev;
|
||
|
(*ssiHead)->Prev->Next = ssiTemp;
|
||
|
(*ssiHead)->Prev = ssiTemp;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void SsiSiteSelectorNodeDelete(ssi *ssiTemp)
|
||
|
{
|
||
|
if(ssiTemp != NULL)
|
||
|
{
|
||
|
ssiTemp->Next->Prev = ssiTemp->Prev;
|
||
|
ssiTemp->Prev->Next = ssiTemp->Next;
|
||
|
ssiTemp->Next = NULL;
|
||
|
ssiTemp->Prev = NULL;
|
||
|
|
||
|
FreeMemory(&(ssiTemp->szDescription));
|
||
|
FreeMemory(&(ssiTemp->szDomain));
|
||
|
FreeMemory(&(ssiTemp->szIdentifier));
|
||
|
FreeMemory(&ssiTemp);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
HRESULT SiCNodeGetAttributes(DWORD dwIndex, BOOL bIncludeInvisible, DWORD dwACFlag)
|
||
|
{
|
||
|
DWORD dwCount = 0;
|
||
|
siC *siCTemp = siComponents;
|
||
|
|
||
|
if(siCTemp != NULL)
|
||
|
{
|
||
|
if(((bIncludeInvisible == TRUE) || ((bIncludeInvisible == FALSE) && (!(siCTemp->dwAttributes & SIC_INVISIBLE)))) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
if(dwIndex == 0)
|
||
|
return(siCTemp->dwAttributes);
|
||
|
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
while((siCTemp != NULL) && (siCTemp != siComponents))
|
||
|
{
|
||
|
if(((bIncludeInvisible == TRUE) || ((bIncludeInvisible == FALSE) && (!(siCTemp->dwAttributes & SIC_INVISIBLE)))) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
if(dwIndex == dwCount)
|
||
|
return(siCTemp->dwAttributes);
|
||
|
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
}
|
||
|
}
|
||
|
return(-1);
|
||
|
}
|
||
|
|
||
|
void SiCNodeSetAttributes(DWORD dwIndex, DWORD dwAttributes, BOOL bSet, BOOL bIncludeInvisible, DWORD dwACFlag, HWND hwndListBox)
|
||
|
{
|
||
|
DWORD dwCount = 0;
|
||
|
DWORD dwVisibleIndex = 0;
|
||
|
siC *siCTemp = siComponents;
|
||
|
|
||
|
LPSTR szTmpString;
|
||
|
TCHAR tchBuffer[MAX_BUF];
|
||
|
|
||
|
if(siCTemp != NULL)
|
||
|
{
|
||
|
if(((bIncludeInvisible == TRUE) || ((bIncludeInvisible == FALSE) && (!(siCTemp->dwAttributes & SIC_INVISIBLE)))) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
if(dwIndex == 0)
|
||
|
{
|
||
|
if(bSet)
|
||
|
siCTemp->dwAttributes |= dwAttributes;
|
||
|
else
|
||
|
siCTemp->dwAttributes &= ~dwAttributes;
|
||
|
}
|
||
|
|
||
|
++dwCount;
|
||
|
if(!(siCTemp->dwAttributes & SIC_INVISIBLE))
|
||
|
++dwVisibleIndex;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
while((siCTemp != NULL) && (siCTemp != siComponents))
|
||
|
{
|
||
|
if(((bIncludeInvisible == TRUE) || ((bIncludeInvisible == FALSE) && (!(siCTemp->dwAttributes & SIC_INVISIBLE)))) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
if(dwIndex == dwCount)
|
||
|
{
|
||
|
if(bSet)
|
||
|
siCTemp->dwAttributes |= dwAttributes;
|
||
|
else
|
||
|
siCTemp->dwAttributes &= ~dwAttributes;
|
||
|
}
|
||
|
|
||
|
++dwCount;
|
||
|
if(!(siCTemp->dwAttributes & SIC_INVISIBLE))
|
||
|
++dwVisibleIndex;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BOOL IsInList(DWORD dwCurrentItem, DWORD dwItems, DWORD *dwItemsSelected)
|
||
|
{
|
||
|
DWORD i;
|
||
|
|
||
|
for(i = 0; i < dwItems; i++)
|
||
|
{
|
||
|
if(dwItemsSelected[i] == dwCurrentItem)
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
void RestoreInvisibleFlag(siC *siCNode)
|
||
|
{
|
||
|
char szBuf[MAX_BUF_TINY];
|
||
|
char szAttribute[MAX_BUF_TINY];
|
||
|
|
||
|
GetPrivateProfileString(siCNode->szReferenceName, "Attributes", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
strcpy(szAttribute, szBuf);
|
||
|
strupr(szAttribute);
|
||
|
|
||
|
if(strstr(szAttribute, "INVISIBLE") || siCNode->bSupersede)
|
||
|
siCNode->dwAttributes |= SIC_INVISIBLE;
|
||
|
else
|
||
|
siCNode->dwAttributes &= ~SIC_INVISIBLE;
|
||
|
}
|
||
|
|
||
|
void RestoreAdditionalFlag(siC *siCNode)
|
||
|
{
|
||
|
char szBuf[MAX_BUF_TINY];
|
||
|
char szAttribute[MAX_BUF_TINY];
|
||
|
|
||
|
GetPrivateProfileString(siCNode->szReferenceName, "Attributes", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
strcpy(szAttribute, szBuf);
|
||
|
strupr(szAttribute);
|
||
|
|
||
|
if(strstr(szAttribute, "ADDITIONAL") && !strstr(szAttribute, "NOTADDITIONAL"))
|
||
|
siCNode->dwAttributes |= SIC_ADDITIONAL;
|
||
|
else
|
||
|
siCNode->dwAttributes &= ~SIC_ADDITIONAL;
|
||
|
}
|
||
|
|
||
|
|
||
|
// This function:
|
||
|
// - Zeros the SELECTED and ADDITIONAL attributes of all components.
|
||
|
// - Set all attributes as specified for the specific Setup Type
|
||
|
// - Overrides attributes designated in any [Component XXX-Overwrite-Setup TypeX]
|
||
|
// sections for the specific Setup Type.
|
||
|
void SiCNodeSetItemsSelected(DWORD dwSetupType)
|
||
|
{
|
||
|
siC *siCNode;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szSTSection[MAX_BUF];
|
||
|
char szComponentKey[MAX_BUF];
|
||
|
char szComponentSection[MAX_BUF];
|
||
|
char szOverrideSection[MAX_BUF];
|
||
|
char szOverrideAttributes[MAX_BUF];
|
||
|
DWORD dwIndex0;
|
||
|
|
||
|
strcpy(szSTSection, "Setup Type");
|
||
|
_itoa(dwSetupType, szBuf, 10);
|
||
|
strcat(szSTSection, szBuf);
|
||
|
|
||
|
// For each component in the global list unset its SELECTED and ADDITIONAL attributes
|
||
|
siCNode = siComponents;
|
||
|
do
|
||
|
{
|
||
|
if(siCNode == NULL)
|
||
|
break;
|
||
|
|
||
|
/* clear these flags for all components so they can be
|
||
|
* reset later if they belong to the setup type the user
|
||
|
* selected */
|
||
|
siCNode->dwAttributes &= ~SIC_SELECTED;
|
||
|
siCNode->dwAttributes &= ~SIC_ADDITIONAL;
|
||
|
siCNode->dwAttributes |= SIC_INVISIBLE;
|
||
|
|
||
|
/* Force Upgrade needs to be performed here because the user has just
|
||
|
* selected the destination path for the product. The destination path is
|
||
|
* critical to the checking of the Force Upgrade. */
|
||
|
ResolveForceUpgrade(siCNode);
|
||
|
ResolveSupersede(siCNode);
|
||
|
siCNode = siCNode->Next;
|
||
|
} while((siCNode != NULL) && (siCNode != siComponents));
|
||
|
|
||
|
/* for each component in a setup type, set its ATTRIBUTES to the right values */
|
||
|
dwIndex0 = 0;
|
||
|
sprintf(szComponentKey, "C%d", dwIndex0);
|
||
|
GetPrivateProfileString(szSTSection, szComponentKey, "", szComponentSection, sizeof(szComponentSection), szFileIniConfig);
|
||
|
while(*szComponentSection != '\0')
|
||
|
{
|
||
|
if((siCNode = SiCNodeFind(siComponents, szComponentSection)) != NULL)
|
||
|
{
|
||
|
/* Component is in the Setup Type the user selected, so we now need to
|
||
|
* reset the INVISIBLE and ADDITIONAL flags because they were unset
|
||
|
* above and also are not reset anywhere else. */
|
||
|
RestoreInvisibleFlag(siCNode);
|
||
|
RestoreAdditionalFlag(siCNode);
|
||
|
|
||
|
sprintf(szOverrideSection, "%s-Override-%s", siCNode->szReferenceName, szSTSection);
|
||
|
GetPrivateProfileString(szOverrideSection, "Attributes", "", szOverrideAttributes, sizeof(szOverrideAttributes), szFileIniConfig);
|
||
|
|
||
|
if((siCNode->lRandomInstallPercentage != 0) &&
|
||
|
(siCNode->lRandomInstallPercentage <= siCNode->lRandomInstallValue) &&
|
||
|
!(siCNode->dwAttributes & SIC_DISABLED))
|
||
|
{
|
||
|
/* Random Install Percentage check passed *and* the component
|
||
|
* is not DISABLED */
|
||
|
if(*szOverrideAttributes != '\0')
|
||
|
siCNode->dwAttributes = ParseComponentAttributes(szOverrideAttributes, siCNode->dwAttributes, TRUE);
|
||
|
siCNode->dwAttributes &= ~SIC_SELECTED;
|
||
|
}
|
||
|
else if(sgProduct.ulCustomType != dwSetupType)
|
||
|
{
|
||
|
/* Setup Type other than custom detected, so
|
||
|
* make sure all components from this Setup Type
|
||
|
* is selected (regardless if it's DISABLED or not).
|
||
|
* Don't select components that are Superseded */
|
||
|
if(!siCNode->bSupersede)
|
||
|
siCNode->dwAttributes |= SIC_SELECTED;
|
||
|
|
||
|
if(*szOverrideAttributes != '\0')
|
||
|
siCNode->dwAttributes = ParseComponentAttributes(szOverrideAttributes, siCNode->dwAttributes, TRUE);
|
||
|
}
|
||
|
else if(!(siCNode->dwAttributes & SIC_DISABLED) && !siCNode->bForceUpgrade && !siCNode->bSupersede)
|
||
|
{
|
||
|
/* Custom setup type detected and the component is
|
||
|
* not DISABLED and FORCE_UPGRADE. Reset the component's
|
||
|
* attribute to default. If the component is DISABLED and
|
||
|
* happens not be SELECTED in the config.ini file, we leave
|
||
|
* it as is. The user will see the component in the Options
|
||
|
* Dialogs as not selected and DISABLED. Not sure why we
|
||
|
* want this, but marketing might find it useful someday. */
|
||
|
|
||
|
GetPrivateProfileString(siCNode->szReferenceName, "Attributes", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
siCNode->dwAttributes = ParseComponentAttributes(szBuf, 0, FALSE);
|
||
|
if(*szOverrideAttributes != '\0')
|
||
|
siCNode->dwAttributes = ParseComponentAttributes(szOverrideAttributes, siCNode->dwAttributes, TRUE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
++dwIndex0;
|
||
|
sprintf(szComponentKey, "C%d", dwIndex0);
|
||
|
GetPrivateProfileString(szSTSection, szComponentKey, "", szComponentSection, sizeof(szComponentSection), szFileIniConfig);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
char *SiCNodeGetReferenceName(DWORD dwIndex, BOOL bIncludeInvisible, DWORD dwACFlag)
|
||
|
{
|
||
|
DWORD dwCount = 0;
|
||
|
siC *siCTemp = siComponents;
|
||
|
|
||
|
if(siCTemp != NULL)
|
||
|
{
|
||
|
if(((bIncludeInvisible == TRUE) || ((bIncludeInvisible == FALSE) && (!(siCTemp->dwAttributes & SIC_INVISIBLE)))) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
if(dwIndex == 0)
|
||
|
return(siCTemp->szReferenceName);
|
||
|
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
while((siCTemp != NULL) && (siCTemp != siComponents))
|
||
|
{
|
||
|
if(((bIncludeInvisible == TRUE) || ((bIncludeInvisible == FALSE) && (!(siCTemp->dwAttributes & SIC_INVISIBLE)))) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
if(dwIndex == dwCount)
|
||
|
return(siCTemp->szReferenceName);
|
||
|
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
}
|
||
|
}
|
||
|
return(NULL);
|
||
|
}
|
||
|
|
||
|
char *SiCNodeGetDescriptionShort(DWORD dwIndex, BOOL bIncludeInvisible, DWORD dwACFlag)
|
||
|
{
|
||
|
DWORD dwCount = 0;
|
||
|
siC *siCTemp = siComponents;
|
||
|
|
||
|
if(siCTemp != NULL)
|
||
|
{
|
||
|
if(((bIncludeInvisible == TRUE) || ((bIncludeInvisible == FALSE) && (!(siCTemp->dwAttributes & SIC_INVISIBLE)))) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
if(dwIndex == 0)
|
||
|
return(siCTemp->szDescriptionShort);
|
||
|
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
while((siCTemp != NULL) && (siCTemp != siComponents))
|
||
|
{
|
||
|
if(((bIncludeInvisible == TRUE) || ((bIncludeInvisible == FALSE) && (!(siCTemp->dwAttributes & SIC_INVISIBLE)))) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
if(dwIndex == dwCount)
|
||
|
return(siCTemp->szDescriptionShort);
|
||
|
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
}
|
||
|
}
|
||
|
return(NULL);
|
||
|
}
|
||
|
|
||
|
char *SiCNodeGetDescriptionLong(DWORD dwIndex, BOOL bIncludeInvisible, DWORD dwACFlag)
|
||
|
{
|
||
|
DWORD dwCount = 0;
|
||
|
siC *siCTemp = siComponents;
|
||
|
|
||
|
if(siCTemp != NULL)
|
||
|
{
|
||
|
if(((bIncludeInvisible == TRUE) || ((bIncludeInvisible == FALSE) && (!(siCTemp->dwAttributes & SIC_INVISIBLE)))) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
if(dwIndex == 0)
|
||
|
return(siCTemp->szDescriptionLong);
|
||
|
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
while((siCTemp != NULL) && (siCTemp != siComponents))
|
||
|
{
|
||
|
if(((bIncludeInvisible == TRUE) || ((bIncludeInvisible == FALSE) && (!(siCTemp->dwAttributes & SIC_INVISIBLE)))) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
if(dwIndex == dwCount)
|
||
|
return(siCTemp->szDescriptionLong);
|
||
|
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
}
|
||
|
}
|
||
|
return(NULL);
|
||
|
}
|
||
|
|
||
|
unsigned long long SiCNodeGetInstallSize(DWORD dwIndex, BOOL bIncludeInvisible, DWORD dwACFlag)
|
||
|
{
|
||
|
DWORD dwCount = 0;
|
||
|
siC *siCTemp = siComponents;
|
||
|
|
||
|
if(siCTemp != NULL)
|
||
|
{
|
||
|
if(((bIncludeInvisible == TRUE) || ((bIncludeInvisible == FALSE) && (!(siCTemp->dwAttributes & SIC_INVISIBLE)))) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
if(dwIndex == 0)
|
||
|
return(siCTemp->ulInstallSize);
|
||
|
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
while((siCTemp != NULL) && (siCTemp != siComponents))
|
||
|
{
|
||
|
if(((bIncludeInvisible == TRUE) || ((bIncludeInvisible == FALSE) && (!(siCTemp->dwAttributes & SIC_INVISIBLE)))) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
if(dwIndex == dwCount)
|
||
|
return(siCTemp->ulInstallSize);
|
||
|
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
}
|
||
|
}
|
||
|
return(0L);
|
||
|
}
|
||
|
|
||
|
unsigned long long SiCNodeGetInstallSizeSystem(DWORD dwIndex, BOOL bIncludeInvisible, DWORD dwACFlag)
|
||
|
{
|
||
|
DWORD dwCount = 0;
|
||
|
siC *siCTemp = siComponents;
|
||
|
|
||
|
if(siCTemp != NULL)
|
||
|
{
|
||
|
if(((bIncludeInvisible == TRUE) || ((bIncludeInvisible == FALSE) && (!(siCTemp->dwAttributes & SIC_INVISIBLE)))) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
if(dwIndex == 0)
|
||
|
return(siCTemp->ulInstallSizeSystem);
|
||
|
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
while((siCTemp != NULL) && (siCTemp != siComponents))
|
||
|
{
|
||
|
if(((bIncludeInvisible == TRUE) || ((bIncludeInvisible == FALSE) && (!(siCTemp->dwAttributes & SIC_INVISIBLE)))) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
if(dwIndex == dwCount)
|
||
|
return(siCTemp->ulInstallSizeSystem);
|
||
|
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
}
|
||
|
}
|
||
|
return(0L);
|
||
|
}
|
||
|
|
||
|
unsigned long long SiCNodeGetInstallSizeArchive(DWORD dwIndex, BOOL bIncludeInvisible, DWORD dwACFlag)
|
||
|
{
|
||
|
DWORD dwCount = 0;
|
||
|
siC *siCTemp = siComponents;
|
||
|
|
||
|
if(siCTemp != NULL)
|
||
|
{
|
||
|
if(((bIncludeInvisible == TRUE) || ((bIncludeInvisible == FALSE) && (!(siCTemp->dwAttributes & SIC_INVISIBLE)))) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
if(dwIndex == 0)
|
||
|
return(siCTemp->ulInstallSizeArchive);
|
||
|
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
while((siCTemp != NULL) && (siCTemp != siComponents))
|
||
|
{
|
||
|
if(((bIncludeInvisible == TRUE) || ((bIncludeInvisible == FALSE) && (!(siCTemp->dwAttributes & SIC_INVISIBLE)))) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
if(dwIndex == dwCount)
|
||
|
return(siCTemp->ulInstallSizeArchive);
|
||
|
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
}
|
||
|
}
|
||
|
return(0L);
|
||
|
}
|
||
|
|
||
|
/* retrieve Index of node containing short description */
|
||
|
int SiCNodeGetIndexDS(char *szInDescriptionShort)
|
||
|
{
|
||
|
DWORD dwCount = 0;
|
||
|
siC *siCTemp = siComponents;
|
||
|
|
||
|
if(siCTemp != NULL)
|
||
|
{
|
||
|
if(stricmp(szInDescriptionShort, siCTemp->szDescriptionShort) == 0)
|
||
|
return(dwCount);
|
||
|
|
||
|
++dwCount;
|
||
|
siCTemp = siCTemp->Next;
|
||
|
while((siCTemp != NULL) && (siCTemp != siComponents))
|
||
|
{
|
||
|
if(stricmp(szInDescriptionShort, siCTemp->szDescriptionShort) == 0)
|
||
|
return(dwCount);
|
||
|
|
||
|
++dwCount;
|
||
|
siCTemp = siCTemp->Next;
|
||
|
}
|
||
|
}
|
||
|
return(-1);
|
||
|
}
|
||
|
|
||
|
/* retrieve Index of node containing Reference Name */
|
||
|
int SiCNodeGetIndexRN(char *szInReferenceName)
|
||
|
{
|
||
|
DWORD dwCount = 0;
|
||
|
siC *siCTemp = siComponents;
|
||
|
|
||
|
if(siCTemp != NULL)
|
||
|
{
|
||
|
if(stricmp(szInReferenceName, siCTemp->szReferenceName) == 0)
|
||
|
return(dwCount);
|
||
|
|
||
|
++dwCount;
|
||
|
siCTemp = siCTemp->Next;
|
||
|
while((siCTemp != NULL) && (siCTemp != siComponents))
|
||
|
{
|
||
|
if(stricmp(szInReferenceName, siCTemp->szReferenceName) == 0)
|
||
|
return(dwCount);
|
||
|
|
||
|
++dwCount;
|
||
|
siCTemp = siCTemp->Next;
|
||
|
}
|
||
|
}
|
||
|
return(-1);
|
||
|
}
|
||
|
|
||
|
siC *SiCNodeGetObject(DWORD dwIndex, BOOL bIncludeInvisibleObjs, DWORD dwACFlag)
|
||
|
{
|
||
|
DWORD dwCount = -1;
|
||
|
siC *siCTemp = siComponents;
|
||
|
|
||
|
if(siCTemp != NULL)
|
||
|
{
|
||
|
if((bIncludeInvisibleObjs) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
++dwCount;
|
||
|
}
|
||
|
else if((!(siCTemp->dwAttributes & SIC_INVISIBLE)) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
if(dwIndex == dwCount)
|
||
|
return(siCTemp);
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
while((siCTemp != siComponents) && (siCTemp != NULL))
|
||
|
{
|
||
|
if(bIncludeInvisibleObjs)
|
||
|
{
|
||
|
++dwCount;
|
||
|
}
|
||
|
else if((!(siCTemp->dwAttributes & SIC_INVISIBLE)) &&
|
||
|
((dwACFlag == AC_ALL) ||
|
||
|
((dwACFlag == AC_COMPONENTS) && (!(siCTemp->dwAttributes & SIC_ADDITIONAL))) ||
|
||
|
((dwACFlag == AC_ADDITIONAL_COMPONENTS) && (siCTemp->dwAttributes & SIC_ADDITIONAL))))
|
||
|
{
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
if(dwIndex == dwCount)
|
||
|
return(siCTemp);
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
}
|
||
|
}
|
||
|
return(NULL);
|
||
|
}
|
||
|
|
||
|
DWORD GetAdditionalComponentsCount()
|
||
|
{
|
||
|
DWORD dwCount = 0;
|
||
|
siC *siCTemp = siComponents;
|
||
|
|
||
|
if(siCTemp != NULL)
|
||
|
{
|
||
|
if(siCTemp->dwAttributes & SIC_ADDITIONAL)
|
||
|
{
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
while((siCTemp != siComponents) && (siCTemp != NULL))
|
||
|
{
|
||
|
if(siCTemp->dwAttributes & SIC_ADDITIONAL)
|
||
|
{
|
||
|
++dwCount;
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
}
|
||
|
}
|
||
|
return(dwCount);
|
||
|
}
|
||
|
|
||
|
dsN *CreateDSNode()
|
||
|
{
|
||
|
dsN *dsNode;
|
||
|
|
||
|
if((dsNode = NS_GlobalAlloc(sizeof(struct diskSpaceNode))) == NULL)
|
||
|
exit(1);
|
||
|
|
||
|
dsNode->ulSpaceRequired = 0;
|
||
|
|
||
|
if((dsNode->szVDSPath = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
if((dsNode->szPath = NS_GlobalAlloc(MAX_BUF)) == NULL)
|
||
|
exit(1);
|
||
|
dsNode->Next = dsNode;
|
||
|
dsNode->Prev = dsNode;
|
||
|
|
||
|
return(dsNode);
|
||
|
}
|
||
|
|
||
|
void DsNodeInsert(dsN **dsNHead, dsN *dsNTemp)
|
||
|
{
|
||
|
if(*dsNHead == NULL)
|
||
|
{
|
||
|
*dsNHead = dsNTemp;
|
||
|
(*dsNHead)->Next = *dsNHead;
|
||
|
(*dsNHead)->Prev = *dsNHead;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
dsNTemp->Next = *dsNHead;
|
||
|
dsNTemp->Prev = (*dsNHead)->Prev;
|
||
|
(*dsNHead)->Prev->Next = dsNTemp;
|
||
|
(*dsNHead)->Prev = dsNTemp;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void DsNodeDelete(dsN **dsNTemp)
|
||
|
{
|
||
|
if(*dsNTemp != NULL)
|
||
|
{
|
||
|
(*dsNTemp)->Next->Prev = (*dsNTemp)->Prev;
|
||
|
(*dsNTemp)->Prev->Next = (*dsNTemp)->Next;
|
||
|
(*dsNTemp)->Next = NULL;
|
||
|
(*dsNTemp)->Prev = NULL;
|
||
|
|
||
|
FreeMemory(&((*dsNTemp)->szVDSPath));
|
||
|
FreeMemory(&((*dsNTemp)->szPath));
|
||
|
FreeMemory(dsNTemp);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* returns the value in kilobytes */
|
||
|
unsigned long long GetDiskSpaceRequired(DWORD dwType)
|
||
|
{
|
||
|
unsigned long long ullTotalSize = 0;
|
||
|
siC *siCTemp = siComponents;
|
||
|
|
||
|
if(siCTemp != NULL)
|
||
|
{
|
||
|
if(siCTemp->dwAttributes & SIC_SELECTED)
|
||
|
{
|
||
|
switch(dwType)
|
||
|
{
|
||
|
case DSR_DESTINATION:
|
||
|
ullTotalSize += siCTemp->ulInstallSize;
|
||
|
break;
|
||
|
|
||
|
case DSR_SYSTEM:
|
||
|
ullTotalSize += siCTemp->ulInstallSizeSystem;
|
||
|
break;
|
||
|
|
||
|
case DSR_TEMP:
|
||
|
case DSR_DOWNLOAD_SIZE:
|
||
|
if((LocateJar(siCTemp, NULL, 0, gbPreviousUnfinishedDownload) == AP_NOT_FOUND) ||
|
||
|
(dwType == DSR_DOWNLOAD_SIZE))
|
||
|
ullTotalSize += siCTemp->ulInstallSizeArchive;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
while((siCTemp != NULL) && (siCTemp != siComponents))
|
||
|
{
|
||
|
if(siCTemp->dwAttributes & SIC_SELECTED)
|
||
|
{
|
||
|
switch(dwType)
|
||
|
{
|
||
|
case DSR_DESTINATION:
|
||
|
ullTotalSize += siCTemp->ulInstallSize;
|
||
|
break;
|
||
|
|
||
|
case DSR_SYSTEM:
|
||
|
ullTotalSize += siCTemp->ulInstallSizeSystem;
|
||
|
break;
|
||
|
|
||
|
case DSR_TEMP:
|
||
|
case DSR_DOWNLOAD_SIZE:
|
||
|
if((LocateJar(siCTemp, NULL, 0, gbPreviousUnfinishedDownload) == AP_NOT_FOUND) ||
|
||
|
(dwType == DSR_DOWNLOAD_SIZE))
|
||
|
ullTotalSize += siCTemp->ulInstallSizeArchive;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* add the amount of disk space it will take for the
|
||
|
xpinstall engine in the TEMP area */
|
||
|
if(dwType == DSR_TEMP)
|
||
|
ullTotalSize += siCFXpcomFile.ulInstallSize;
|
||
|
|
||
|
return(ullTotalSize);
|
||
|
}
|
||
|
|
||
|
int LocateExistingPath(char *szPath, char *szExistingPath, DWORD dwExistingPathSize)
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
|
||
|
strcpy(szExistingPath, szPath);
|
||
|
AppendBackSlash(szExistingPath, dwExistingPathSize);
|
||
|
while((FileExists(szExistingPath) == FALSE))
|
||
|
{
|
||
|
RemoveBackSlash(szExistingPath);
|
||
|
ParsePath(szExistingPath, szBuf, sizeof(szBuf), FALSE, PP_PATH_ONLY);
|
||
|
strcpy(szExistingPath, szBuf);
|
||
|
AppendBackSlash(szExistingPath, dwExistingPathSize);
|
||
|
}
|
||
|
return(WIZ_OK);
|
||
|
}
|
||
|
|
||
|
/* returns the value in bytes */
|
||
|
unsigned long long GetDiskSpaceAvailable(LPSTR szPath)
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szBuf2[MAX_BUF];
|
||
|
FSALLOCATE fsAllocate;
|
||
|
unsigned long long nBytes = 0;
|
||
|
APIRET rc;
|
||
|
ULONG ulDriveNo;
|
||
|
|
||
|
ulDriveNo = toupper(szPath[0]) + 1 - 'A';
|
||
|
rc = DosQueryFSInfo(ulDriveNo,
|
||
|
FSIL_ALLOC,
|
||
|
&fsAllocate,
|
||
|
sizeof(fsAllocate));
|
||
|
|
||
|
if (rc != NO_ERROR) {
|
||
|
char szEDeterminingDiskSpace[MAX_BUF];
|
||
|
|
||
|
if(GetPrivateProfileString("Messages", "ERROR_DETERMINING_DISK_SPACE", "", szEDeterminingDiskSpace, sizeof(szEDeterminingDiskSpace), szFileIniInstall))
|
||
|
{
|
||
|
strcpy(szBuf2, "\n ");
|
||
|
strcat(szBuf2, szPath);
|
||
|
sprintf(szBuf, szEDeterminingDiskSpace, szBuf2);
|
||
|
PrintError(szBuf, ERROR_CODE_SHOW);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
nBytes = fsAllocate.cUnitAvail;
|
||
|
nBytes *= fsAllocate.cSectorUnit;
|
||
|
nBytes *= fsAllocate.cbSector;
|
||
|
if (nBytes > 1024)
|
||
|
nBytes /= 1024;
|
||
|
else
|
||
|
nBytes = 0;
|
||
|
|
||
|
return nBytes;
|
||
|
}
|
||
|
|
||
|
HRESULT ErrorMsgDiskSpace(unsigned long long ullDSAvailable, unsigned long long ullDSRequired, LPSTR szPath, BOOL bCrutialMsg)
|
||
|
{
|
||
|
char szBuf0[MAX_BUF];
|
||
|
char szBuf1[MAX_BUF];
|
||
|
char szBuf2[MAX_BUF];
|
||
|
char szBuf3[MAX_BUF];
|
||
|
char szBufRootPath[MAX_BUF];
|
||
|
char szBufMsg[MAX_BUF];
|
||
|
char szDSAvailable[MAX_BUF];
|
||
|
char szDSRequired[MAX_BUF];
|
||
|
char szDlgDiskSpaceCheckTitle[MAX_BUF];
|
||
|
char szDlgDiskSpaceCheckMsg[MAX_BUF];
|
||
|
DWORD dwDlgType;
|
||
|
|
||
|
if(!GetPrivateProfileString("Messages", "DLG_DISK_SPACE_CHECK_TITLE", "", szDlgDiskSpaceCheckTitle, sizeof(szDlgDiskSpaceCheckTitle), szFileIniInstall))
|
||
|
exit(1);
|
||
|
|
||
|
if(bCrutialMsg)
|
||
|
{
|
||
|
dwDlgType = MB_RETRYCANCEL;
|
||
|
if(!GetPrivateProfileString("Messages", "DLG_DISK_SPACE_CHECK_CRUCIAL_MSG", "", szDlgDiskSpaceCheckMsg, sizeof(szDlgDiskSpaceCheckMsg), szFileIniInstall))
|
||
|
exit(1);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
dwDlgType = MB_OK;
|
||
|
if(!GetPrivateProfileString("Messages", "DLG_DISK_SPACE_CHECK_MSG", "", szDlgDiskSpaceCheckMsg, sizeof(szDlgDiskSpaceCheckMsg), szFileIniInstall))
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
ParsePath(szPath, szBufRootPath, sizeof(szBufRootPath), FALSE, PP_ROOT_ONLY);
|
||
|
RemoveBackSlash(szBufRootPath);
|
||
|
strcpy(szBuf0, szPath);
|
||
|
RemoveBackSlash(szBuf0);
|
||
|
|
||
|
_itoa(ullDSAvailable, szDSAvailable, 10);
|
||
|
_itoa(ullDSRequired, szDSRequired, 10);
|
||
|
|
||
|
sprintf(szBuf1, "\n\n %s\n\n ", szBuf0);
|
||
|
sprintf(szBuf2, "%s KB\n ", szDSRequired);
|
||
|
sprintf(szBuf3, "%s KB\n\n", szDSAvailable);
|
||
|
sprintf(szBufMsg, szDlgDiskSpaceCheckMsg, szBufRootPath, szBuf1, szBuf2, szBuf3);
|
||
|
|
||
|
if((sgProduct.ulMode != SILENT) && (sgProduct.ulMode != AUTO))
|
||
|
{
|
||
|
return(WinMessageBox(HWND_DESKTOP, hWndMain, szBufMsg, szDlgDiskSpaceCheckTitle, 0, dwDlgType | MB_ICONEXCLAMATION | MB_DEFBUTTON2 | MB_APPLMODAL));
|
||
|
}
|
||
|
else if(sgProduct.ulMode == AUTO)
|
||
|
{
|
||
|
ShowMessage(szBufMsg, TRUE);
|
||
|
DosSleep(5000);
|
||
|
ShowMessage(szBufMsg, FALSE);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
return(MBID_CANCEL);
|
||
|
}
|
||
|
|
||
|
void UpdatePathDiskSpaceRequired(LPSTR szPath, unsigned long long ullSize, dsN **dsnComponentDSRequirement)
|
||
|
{
|
||
|
BOOL bFound = FALSE;
|
||
|
dsN *dsnTemp = *dsnComponentDSRequirement;
|
||
|
char szReparsePath[MAX_BUF];
|
||
|
char szVDSPath[MAX_BUF];
|
||
|
char szRootPath[MAX_BUF];
|
||
|
|
||
|
if(ullSize > 0)
|
||
|
{
|
||
|
ParsePath(szPath, szRootPath, sizeof(szRootPath), FALSE, PP_ROOT_ONLY);
|
||
|
|
||
|
if(GetDiskSpaceAvailable(szRootPath) == GetDiskSpaceAvailable(szPath))
|
||
|
// Check for user quota on path. It is very unlikely that the user quota
|
||
|
// for the path will be the same as the quota for its root path when user
|
||
|
// quota is enabled.
|
||
|
//
|
||
|
// If it happens to be the same, then I'm assuming that the disk space on
|
||
|
// the path's root path will decrease at the same rate as the path with
|
||
|
// user quota enabled.
|
||
|
//
|
||
|
// If user quota is not enabled on the folder, then use the root path.
|
||
|
strcpy(szVDSPath, szRootPath);
|
||
|
else
|
||
|
strcpy(szVDSPath, szPath);
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if(*dsnComponentDSRequirement == NULL)
|
||
|
{
|
||
|
*dsnComponentDSRequirement = CreateDSNode();
|
||
|
dsnTemp = *dsnComponentDSRequirement;
|
||
|
strcpy(dsnTemp->szVDSPath, szVDSPath);
|
||
|
strcpy(dsnTemp->szPath, szPath);
|
||
|
dsnTemp->ulSpaceRequired = ullSize;
|
||
|
bFound = TRUE;
|
||
|
}
|
||
|
else if(stricmp(dsnTemp->szVDSPath, szVDSPath) == 0)
|
||
|
{
|
||
|
dsnTemp->ulSpaceRequired += ullSize;
|
||
|
bFound = TRUE;
|
||
|
}
|
||
|
else
|
||
|
dsnTemp = dsnTemp->Next;
|
||
|
|
||
|
} while((dsnTemp != *dsnComponentDSRequirement) && (dsnTemp != NULL) && (bFound == FALSE));
|
||
|
|
||
|
if(bFound == FALSE)
|
||
|
{
|
||
|
dsnTemp = CreateDSNode();
|
||
|
strcpy(dsnTemp->szVDSPath, szVDSPath);
|
||
|
strcpy(dsnTemp->szPath, szPath);
|
||
|
dsnTemp->ulSpaceRequired = ullSize;
|
||
|
DsNodeInsert(dsnComponentDSRequirement, dsnTemp);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
HRESULT InitComponentDiskSpaceInfo(dsN **dsnComponentDSRequirement)
|
||
|
{
|
||
|
DWORD dwIndex0;
|
||
|
siC *siCObject = NULL;
|
||
|
HRESULT hResult = 0;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szIndex0[MAX_BUF];
|
||
|
char szBufTempPath[MAX_BUF];
|
||
|
|
||
|
ParsePath(szTempDir, szBufTempPath, sizeof(szBufTempPath), FALSE, PP_ROOT_ONLY);
|
||
|
AppendBackSlash(szBufTempPath, sizeof(szBufTempPath));
|
||
|
|
||
|
dwIndex0 = 0;
|
||
|
_itoa(dwIndex0, szIndex0, 10);
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
while(siCObject)
|
||
|
{
|
||
|
if(siCObject->dwAttributes & SIC_SELECTED)
|
||
|
{
|
||
|
if(*(siCObject->szDestinationPath) == '\0')
|
||
|
strcpy(szBuf, sgProduct.szPath);
|
||
|
else
|
||
|
strcpy(szBuf, siCObject->szDestinationPath);
|
||
|
|
||
|
AppendBackSlash(szBuf, sizeof(szBuf));
|
||
|
UpdatePathDiskSpaceRequired(szBuf, siCObject->ulInstallSize, dsnComponentDSRequirement);
|
||
|
|
||
|
if(*szTempDir != '\0')
|
||
|
UpdatePathDiskSpaceRequired(szTempDir, siCObject->ulInstallSizeArchive, dsnComponentDSRequirement);
|
||
|
}
|
||
|
|
||
|
++dwIndex0;
|
||
|
_itoa(dwIndex0, szIndex0, 10);
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
}
|
||
|
|
||
|
/* take the uncompressed size of Xpcom into account */
|
||
|
if(*szTempDir != '\0')
|
||
|
UpdatePathDiskSpaceRequired(szTempDir, siCFXpcomFile.ulInstallSize, dsnComponentDSRequirement);
|
||
|
|
||
|
return(hResult);
|
||
|
}
|
||
|
|
||
|
HRESULT VerifyDiskSpace()
|
||
|
{
|
||
|
unsigned long long ullDSAvailable;
|
||
|
HRESULT hRetValue = FALSE;
|
||
|
dsN *dsnTemp = NULL;
|
||
|
|
||
|
DeInitDSNode(&gdsnComponentDSRequirement);
|
||
|
InitComponentDiskSpaceInfo(&gdsnComponentDSRequirement);
|
||
|
if(gdsnComponentDSRequirement != NULL)
|
||
|
{
|
||
|
dsnTemp = gdsnComponentDSRequirement;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if(dsnTemp != NULL)
|
||
|
{
|
||
|
ullDSAvailable = GetDiskSpaceAvailable(dsnTemp->szVDSPath);
|
||
|
if(ullDSAvailable < dsnTemp->ulSpaceRequired)
|
||
|
{
|
||
|
hRetValue = ErrorMsgDiskSpace(ullDSAvailable, dsnTemp->ulSpaceRequired, dsnTemp->szPath, FALSE);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
dsnTemp = dsnTemp->Next;
|
||
|
}
|
||
|
} while((dsnTemp != NULL) && (dsnTemp != gdsnComponentDSRequirement));
|
||
|
}
|
||
|
return(hRetValue);
|
||
|
}
|
||
|
|
||
|
/* Function: ParseOSType
|
||
|
*
|
||
|
* Input: char *
|
||
|
*
|
||
|
* Return: DWORD
|
||
|
*
|
||
|
* Description: This function parses an input string (szOSType) for specific
|
||
|
* string keys:
|
||
|
* WIN95_DEBUTE, WIN95, WIN98, NT3, NT4, NT5, NT50, NT51
|
||
|
*
|
||
|
* It then stores the information in a DWORD, each bit corresponding to a
|
||
|
* particular OS type.
|
||
|
*/
|
||
|
ULONG ParseOSType(char *szOSType)
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
ULONG ulOSType = 0;
|
||
|
|
||
|
strcpy(szBuf, szOSType);
|
||
|
strupr(szBuf);
|
||
|
|
||
|
if(strstr(szBuf, "WARP4"))
|
||
|
ulOSType |= OS_WARP4;
|
||
|
if(strstr(szBuf, "WARP3"))
|
||
|
ulOSType |= OS_WARP3;
|
||
|
|
||
|
return(ulOSType);
|
||
|
}
|
||
|
|
||
|
HRESULT ParseComponentAttributes(char *szAttribute, DWORD dwAttributes, BOOL bOverride)
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
|
||
|
strcpy(szBuf, szAttribute);
|
||
|
strupr(szBuf);
|
||
|
|
||
|
if(bOverride != TRUE)
|
||
|
{
|
||
|
if(strstr(szBuf, "LAUNCHAPP"))
|
||
|
dwAttributes |= SIC_LAUNCHAPP;
|
||
|
if(strstr(szBuf, "DOWNLOAD_ONLY"))
|
||
|
dwAttributes |= SIC_DOWNLOAD_ONLY;
|
||
|
if(strstr(szBuf, "FORCE_UPGRADE"))
|
||
|
dwAttributes |= SIC_FORCE_UPGRADE;
|
||
|
if(strstr(szBuf, "IGNORE_DOWNLOAD_ERROR"))
|
||
|
dwAttributes |= SIC_IGNORE_DOWNLOAD_ERROR;
|
||
|
if(strstr(szBuf, "IGNORE_XPINSTALL_ERROR"))
|
||
|
dwAttributes |= SIC_IGNORE_XPINSTALL_ERROR;
|
||
|
if(strstr(szBuf, "UNCOMPRESS"))
|
||
|
dwAttributes |= SIC_UNCOMPRESS;
|
||
|
}
|
||
|
|
||
|
if(strstr(szBuf, "UNSELECTED"))
|
||
|
dwAttributes &= ~SIC_SELECTED;
|
||
|
else if(strstr(szBuf, "SELECTED"))
|
||
|
dwAttributes |= SIC_SELECTED;
|
||
|
|
||
|
if(strstr(szBuf, "INVISIBLE"))
|
||
|
dwAttributes |= SIC_INVISIBLE;
|
||
|
else if(strstr(szBuf, "VISIBLE"))
|
||
|
dwAttributes &= ~SIC_INVISIBLE;
|
||
|
|
||
|
if(strstr(szBuf, "DISABLED"))
|
||
|
dwAttributes |= SIC_DISABLED;
|
||
|
if(strstr(szBuf, "ENABLED"))
|
||
|
dwAttributes &= ~SIC_DISABLED;
|
||
|
|
||
|
if(strstr(szBuf, "NOTADDITIONAL"))
|
||
|
dwAttributes &= ~SIC_ADDITIONAL;
|
||
|
else if(strstr(szBuf, "ADDITIONAL"))
|
||
|
dwAttributes |= SIC_ADDITIONAL;
|
||
|
|
||
|
if(strstr(szBuf, "NOTSUPERSEDE"))
|
||
|
dwAttributes &= ~SIC_SUPERSEDE;
|
||
|
else if(strstr(szBuf, "SUPERSEDE"))
|
||
|
dwAttributes |= SIC_SUPERSEDE;
|
||
|
|
||
|
|
||
|
return(dwAttributes);
|
||
|
}
|
||
|
|
||
|
long RandomSelect()
|
||
|
{
|
||
|
long lArbitrary = 0;
|
||
|
|
||
|
srand((unsigned)time(NULL));
|
||
|
lArbitrary = rand() % 100;
|
||
|
return(lArbitrary);
|
||
|
}
|
||
|
|
||
|
siC *SiCNodeFind(siC *siCHeadNode, char *szInReferenceName)
|
||
|
{
|
||
|
siC *siCNode = siCHeadNode;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if(siCNode == NULL)
|
||
|
break;
|
||
|
|
||
|
if(stricmp(siCNode->szReferenceName, szInReferenceName) == 0)
|
||
|
return(siCNode);
|
||
|
|
||
|
siCNode = siCNode->Next;
|
||
|
} while((siCNode != NULL) && (siCNode != siCHeadNode));
|
||
|
|
||
|
return(NULL);
|
||
|
}
|
||
|
|
||
|
BOOL ResolveSupersede(siC *siCObject)
|
||
|
{
|
||
|
DWORD dwIndex;
|
||
|
char szFilePath[MAX_BUF];
|
||
|
char szSupersedeFile[MAX_BUF];
|
||
|
char szSupersedeVersion[MAX_BUF];
|
||
|
char szType[MAX_BUF_TINY];
|
||
|
char szKey[MAX_BUF_TINY];
|
||
|
|
||
|
siCObject->bSupersede = FALSE;
|
||
|
if(siCObject->dwAttributes & SIC_SUPERSEDE)
|
||
|
{
|
||
|
dwIndex = 0;
|
||
|
GetPrivateProfileString(siCObject->szReferenceName, "SupersedeType", "", szType, sizeof(szType), szFileIniConfig);
|
||
|
if(*szType !='\0')
|
||
|
{
|
||
|
if(stricmp(szType, "File Exists") == 0)
|
||
|
{
|
||
|
sprintf(szKey, "SupersedeFile%d", dwIndex);
|
||
|
GetPrivateProfileString(siCObject->szReferenceName, szKey, "", szSupersedeFile, sizeof(szSupersedeFile), szFileIniConfig);
|
||
|
while(*szSupersedeFile != '\0')
|
||
|
{
|
||
|
DecryptString(szFilePath, szSupersedeFile);
|
||
|
if(FileExists(szFilePath))
|
||
|
{
|
||
|
/* The file exists. set Supersede */
|
||
|
siCObject->bSupersede = TRUE;
|
||
|
break; /* Found at least one file, so break out of while loop */
|
||
|
}
|
||
|
sprintf(szKey, "SupersedeFile%d", ++dwIndex);
|
||
|
GetPrivateProfileString(siCObject->szReferenceName, szKey, "", szSupersedeFile, sizeof(szSupersedeFile), szFileIniConfig);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(siCObject->bSupersede)
|
||
|
{
|
||
|
siCObject->dwAttributes &= ~SIC_SELECTED;
|
||
|
siCObject->dwAttributes |= SIC_DISABLED;
|
||
|
siCObject->dwAttributes |= SIC_INVISIBLE;
|
||
|
}
|
||
|
else
|
||
|
/* Make sure to unset the DISABLED bit. If the Setup Type is other than
|
||
|
* Custom, then we don't care if it's DISABLED or not because this flag
|
||
|
* is only used in the Custom dialogs.
|
||
|
*
|
||
|
* If the Setup Type is Custom and this component is DISABLED by default
|
||
|
* via the config.ini, it's default value will be restored in the
|
||
|
* SiCNodeSetItemsSelected() function that called ResolveSupersede(). */
|
||
|
siCObject->dwAttributes &= ~SIC_DISABLED;
|
||
|
}
|
||
|
return(siCObject->bSupersede);
|
||
|
}
|
||
|
|
||
|
BOOL ResolveForceUpgrade(siC *siCObject)
|
||
|
{
|
||
|
DWORD dwIndex;
|
||
|
char szFilePath[MAX_BUF];
|
||
|
char szKey[MAX_BUF_TINY];
|
||
|
char szForceUpgradeFile[MAX_BUF];
|
||
|
|
||
|
siCObject->bForceUpgrade = FALSE;
|
||
|
if(siCObject->dwAttributes & SIC_FORCE_UPGRADE)
|
||
|
{
|
||
|
dwIndex = 0;
|
||
|
BuildNumberedString(dwIndex, NULL, "Force Upgrade File", szKey, sizeof(szKey));
|
||
|
GetPrivateProfileString(siCObject->szReferenceName, szKey, "", szForceUpgradeFile, sizeof(szForceUpgradeFile), szFileIniConfig);
|
||
|
while(*szForceUpgradeFile != '\0')
|
||
|
{
|
||
|
DecryptString(szFilePath, szForceUpgradeFile);
|
||
|
if(FileExists(szFilePath))
|
||
|
{
|
||
|
siCObject->bForceUpgrade = TRUE;
|
||
|
|
||
|
/* Found at least one file, so break out of while loop */
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
BuildNumberedString(++dwIndex, NULL, "Force Upgrade File", szKey, sizeof(szKey));
|
||
|
GetPrivateProfileString(siCObject->szReferenceName, szKey, "", szForceUpgradeFile, sizeof(szForceUpgradeFile), szFileIniConfig);
|
||
|
}
|
||
|
|
||
|
if(siCObject->bForceUpgrade)
|
||
|
{
|
||
|
siCObject->dwAttributes |= SIC_SELECTED;
|
||
|
siCObject->dwAttributes |= SIC_DISABLED;
|
||
|
}
|
||
|
else
|
||
|
/* Make sure to unset the DISABLED bit. If the Setup Type is other than
|
||
|
* Custom, then we don't care if it's DISABLED or not because this flag
|
||
|
* is only used in the Custom dialogs.
|
||
|
*
|
||
|
* If the Setup Type is Custom and this component is DISABLED by default
|
||
|
* via the config.ini, it's default value will be restored in the
|
||
|
* SiCNodeSetItemsSelected() function that called ResolveForceUpgrade(). */
|
||
|
siCObject->dwAttributes &= ~SIC_DISABLED;
|
||
|
}
|
||
|
return(siCObject->bForceUpgrade);
|
||
|
}
|
||
|
|
||
|
void InitSiComponents(char *szFileIni)
|
||
|
{
|
||
|
DWORD dwIndex0;
|
||
|
DWORD dwIndex1;
|
||
|
int iCurrentLoop;
|
||
|
char szIndex0[MAX_BUF];
|
||
|
char szIndex1[MAX_BUF];
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szComponentKey[MAX_BUF];
|
||
|
char szComponentSection[MAX_BUF];
|
||
|
char szDependency[MAX_BUF];
|
||
|
char szDependee[MAX_BUF];
|
||
|
char szSTSection[MAX_BUF];
|
||
|
char szDPSection[MAX_BUF];
|
||
|
siC *siCTemp = NULL;
|
||
|
siCD *siCDepTemp = NULL;
|
||
|
siCD *siCDDependeeTemp = NULL;
|
||
|
|
||
|
/* clean up the list before reading new components given the Setup Type */
|
||
|
DeInitSiComponents(&siComponents);
|
||
|
|
||
|
/* Parse the Setup Type sections in reverse order because
|
||
|
* the Custom Setup Type is always last. It needs to be parsed
|
||
|
* first because the component list it has will be shown in its
|
||
|
* other custom dialogs. Order matters! */
|
||
|
for(iCurrentLoop = 3; iCurrentLoop >= 0; iCurrentLoop--)
|
||
|
{
|
||
|
strcpy(szSTSection, "Setup Type");
|
||
|
_itoa(iCurrentLoop, szBuf, 10);
|
||
|
strcat(szSTSection, szBuf);
|
||
|
|
||
|
/* read in each component given a setup type */
|
||
|
dwIndex0 = 0;
|
||
|
_itoa(dwIndex0, szIndex0, 10);
|
||
|
strcpy(szComponentKey, "C");
|
||
|
strcat(szComponentKey, szIndex0);
|
||
|
GetPrivateProfileString(szSTSection, szComponentKey, "", szComponentSection, sizeof(szComponentSection), szFileIni);
|
||
|
while(*szComponentSection != '\0')
|
||
|
{
|
||
|
GetPrivateProfileString(szComponentSection, "Archive", "", szBuf, sizeof(szBuf), szFileIni);
|
||
|
if((*szBuf != '\0') && (SiCNodeFind(siComponents, szComponentSection) == NULL))
|
||
|
{
|
||
|
/* create and initialize empty node */
|
||
|
siCTemp = CreateSiCNode();
|
||
|
|
||
|
/* store name of archive for component */
|
||
|
strcpy(siCTemp->szArchiveName, szBuf);
|
||
|
|
||
|
/* store name of the uncompressed archive for the component */
|
||
|
GetPrivateProfileString(szComponentSection,
|
||
|
"Archive Uncompressed",
|
||
|
"",
|
||
|
siCTemp->szArchiveNameUncompressed,
|
||
|
sizeof(szBuf),
|
||
|
szFileIni);
|
||
|
|
||
|
/* get short description of component */
|
||
|
GetPrivateProfileString(szComponentSection, "Description Short", "", szBuf, sizeof(szBuf), szFileIni);
|
||
|
strcpy(siCTemp->szDescriptionShort, szBuf);
|
||
|
|
||
|
/* get long description of component */
|
||
|
GetPrivateProfileString(szComponentSection, "Description Long", "", szBuf, sizeof(szBuf), szFileIni);
|
||
|
strcpy(siCTemp->szDescriptionLong, szBuf);
|
||
|
|
||
|
/* get commandline parameter for component */
|
||
|
GetPrivateProfileString(szComponentSection, "Parameter", "", siCTemp->szParameter, MAX_BUF, szFileIni);
|
||
|
|
||
|
/* set reference name for component */
|
||
|
strcpy(siCTemp->szReferenceName, szComponentSection);
|
||
|
|
||
|
/* get install size required in destination for component. Sould be in Kilobytes */
|
||
|
GetPrivateProfileString(szComponentSection, "Install Size", "", szBuf, sizeof(szBuf), szFileIni);
|
||
|
if(*szBuf != '\0')
|
||
|
siCTemp->ulInstallSize = atoi(szBuf);
|
||
|
else
|
||
|
siCTemp->ulInstallSize = 0;
|
||
|
|
||
|
/* get install size required in system for component. Sould be in Kilobytes */
|
||
|
GetPrivateProfileString(szComponentSection, "Install Size System", "", szBuf, sizeof(szBuf), szFileIni);
|
||
|
if(*szBuf != '\0')
|
||
|
siCTemp->ulInstallSizeSystem = atoi(szBuf);
|
||
|
else
|
||
|
siCTemp->ulInstallSizeSystem = 0;
|
||
|
|
||
|
/* get install size required in temp for component. Sould be in Kilobytes */
|
||
|
GetPrivateProfileString(szComponentSection, "Install Size Archive", "", szBuf, sizeof(szBuf), szFileIni);
|
||
|
if(*szBuf != '\0')
|
||
|
siCTemp->ulInstallSizeArchive = atoi(szBuf);
|
||
|
else
|
||
|
siCTemp->ulInstallSizeArchive = 0;
|
||
|
|
||
|
/* get attributes of component */
|
||
|
GetPrivateProfileString(szComponentSection, "Attributes", "", szBuf, sizeof(szBuf), szFileIni);
|
||
|
siCTemp->dwAttributes = ParseComponentAttributes(szBuf, 0, FALSE);
|
||
|
|
||
|
/* get the random percentage value and select or deselect the component (by default) for
|
||
|
* installation */
|
||
|
GetPrivateProfileString(szComponentSection, "Random Install Percentage", "", szBuf, sizeof(szBuf), szFileIni);
|
||
|
if(*szBuf != '\0')
|
||
|
{
|
||
|
siCTemp->lRandomInstallPercentage = atol(szBuf);
|
||
|
if(siCTemp->lRandomInstallPercentage != 0)
|
||
|
siCTemp->lRandomInstallValue = RandomSelect();
|
||
|
}
|
||
|
|
||
|
/* get all dependencies for this component */
|
||
|
dwIndex1 = 0;
|
||
|
_itoa(dwIndex1, szIndex1, 10);
|
||
|
strcpy(szDependency, "Dependency");
|
||
|
strcat(szDependency, szIndex1);
|
||
|
GetPrivateProfileString(szComponentSection, szDependency, "", szBuf, sizeof(szBuf), szFileIni);
|
||
|
while(*szBuf != '\0')
|
||
|
{
|
||
|
/* create and initialize empty node */
|
||
|
siCDepTemp = CreateSiCDepNode();
|
||
|
|
||
|
/* store name of archive for component */
|
||
|
strcpy(siCDepTemp->szReferenceName, szBuf);
|
||
|
|
||
|
/* inserts the newly created component into the global component list */
|
||
|
SiCDepNodeInsert(&(siCTemp->siCDDependencies), siCDepTemp);
|
||
|
|
||
|
ProcessWindowsMessages();
|
||
|
++dwIndex1;
|
||
|
_itoa(dwIndex1, szIndex1, 10);
|
||
|
strcpy(szDependency, "Dependency");
|
||
|
strcat(szDependency, szIndex1);
|
||
|
GetPrivateProfileString(szComponentSection, szDependency, "", szBuf, sizeof(szBuf), szFileIni);
|
||
|
}
|
||
|
|
||
|
/* get all dependees for this component */
|
||
|
dwIndex1 = 0;
|
||
|
_itoa(dwIndex1, szIndex1, 10);
|
||
|
strcpy(szDependee, "Dependee");
|
||
|
strcat(szDependee, szIndex1);
|
||
|
GetPrivateProfileString(szComponentSection, szDependee, "", szBuf, sizeof(szBuf), szFileIni);
|
||
|
while(*szBuf != '\0')
|
||
|
{
|
||
|
/* create and initialize empty node */
|
||
|
siCDDependeeTemp = CreateSiCDepNode();
|
||
|
|
||
|
/* store name of archive for component */
|
||
|
strcpy(siCDDependeeTemp->szReferenceName, szBuf);
|
||
|
|
||
|
/* inserts the newly created component into the global component list */
|
||
|
SiCDepNodeInsert(&(siCTemp->siCDDependees), siCDDependeeTemp);
|
||
|
|
||
|
ProcessWindowsMessages();
|
||
|
++dwIndex1;
|
||
|
_itoa(dwIndex1, szIndex1, 10);
|
||
|
strcpy(szDependee, "Dependee");
|
||
|
strcat(szDependee, szIndex1);
|
||
|
GetPrivateProfileString(szComponentSection, szDependee, "", szBuf, sizeof(szBuf), szFileIni);
|
||
|
}
|
||
|
|
||
|
// locate previous path if necessary
|
||
|
strcpy(szDPSection, szComponentSection);
|
||
|
strcat(szDPSection, "-Destination Path");
|
||
|
if(LocatePreviousPath(szDPSection, siCTemp->szDestinationPath, MAX_PATH) == FALSE)
|
||
|
memset(siCTemp->szDestinationPath, 0, MAX_PATH);
|
||
|
|
||
|
/* inserts the newly created component into the global component list */
|
||
|
SiCNodeInsert(&siComponents, siCTemp);
|
||
|
}
|
||
|
|
||
|
ProcessWindowsMessages();
|
||
|
++dwIndex0;
|
||
|
_itoa(dwIndex0, szIndex0, 10);
|
||
|
strcpy(szComponentKey, "C");
|
||
|
strcat(szComponentKey, szIndex0);
|
||
|
GetPrivateProfileString(szSTSection, szComponentKey, "", szComponentSection, sizeof(szComponentSection), szFileIni);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sgProduct.ulNumberOfComponents = dwIndex0;
|
||
|
}
|
||
|
|
||
|
void ResetComponentAttributes(char *szFileIni)
|
||
|
{
|
||
|
char szIndex[MAX_BUF];
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szComponentItem[MAX_BUF];
|
||
|
siC *siCTemp;
|
||
|
DWORD dwCounter;
|
||
|
|
||
|
for(dwCounter = 0; dwCounter < sgProduct.ulNumberOfComponents; dwCounter++)
|
||
|
{
|
||
|
_itoa(dwCounter, szIndex, 10);
|
||
|
strcpy(szComponentItem, "Component");
|
||
|
strcat(szComponentItem, szIndex);
|
||
|
|
||
|
siCTemp = SiCNodeGetObject(dwCounter, TRUE, AC_ALL);
|
||
|
GetPrivateProfileString(szComponentItem, "Attributes", "", szBuf, sizeof(szBuf), szFileIni);
|
||
|
siCTemp->dwAttributes = ParseComponentAttributes(szBuf, 0, FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void UpdateSiteSelector()
|
||
|
{
|
||
|
DWORD dwIndex;
|
||
|
char szIndex[MAX_BUF];
|
||
|
char szKDescription[MAX_BUF];
|
||
|
char szDescription[MAX_BUF];
|
||
|
char szKDomain[MAX_BUF];
|
||
|
char szDomain[MAX_BUF];
|
||
|
char szFileIniRedirect[MAX_BUF];
|
||
|
ssi *ssiSiteSelectorTemp;
|
||
|
|
||
|
strcpy(szFileIniRedirect, szTempDir);
|
||
|
AppendBackSlash(szFileIniRedirect, sizeof(szFileIniRedirect));
|
||
|
strcat(szFileIniRedirect, FILE_INI_REDIRECT);
|
||
|
|
||
|
if(FileExists(szFileIniRedirect) == FALSE)
|
||
|
return;
|
||
|
|
||
|
/* get all dependees for this component */
|
||
|
dwIndex = 0;
|
||
|
_itoa(dwIndex, szIndex, 10);
|
||
|
strcpy(szKDescription, "Description");
|
||
|
strcpy(szKDomain, "Domain");
|
||
|
strcat(szKDescription, szIndex);
|
||
|
strcat(szKDomain, szIndex);
|
||
|
GetPrivateProfileString("Site Selector", szKDescription, "", szDescription, sizeof(szDescription), szFileIniRedirect);
|
||
|
while(*szDescription != '\0')
|
||
|
{
|
||
|
if(stricmp(szDescription, szSiteSelectorDescription) == 0)
|
||
|
{
|
||
|
GetPrivateProfileString("Site Selector", szKDomain, "", szDomain, sizeof(szDomain), szFileIniRedirect);
|
||
|
if(*szDomain != '\0')
|
||
|
{
|
||
|
ssiSiteSelectorTemp = SsiGetNode(szDescription);
|
||
|
if(ssiSiteSelectorTemp != NULL)
|
||
|
{
|
||
|
strcpy(ssiSiteSelectorTemp->szDomain, szDomain);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* no match found for the given domain description, so assume there's nothing
|
||
|
* to change. just return. */
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* found matched description, but domain was not set, so assume there's no
|
||
|
* redirect required, just return. */
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
++dwIndex;
|
||
|
_itoa(dwIndex, szIndex, 10);
|
||
|
strcpy(szKDescription, "Description");
|
||
|
strcpy(szKDomain, "Domain");
|
||
|
strcat(szKDescription, szIndex);
|
||
|
strcat(szKDomain, szIndex);
|
||
|
memset(szDescription, 0, sizeof(szDescription));
|
||
|
memset(szDomain, 0, sizeof(szDomain));
|
||
|
GetPrivateProfileString("Site Selector", szKDescription, "", szDescription, sizeof(szDescription), szFileIniRedirect);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void InitSiteSelector(char *szFileIni)
|
||
|
{
|
||
|
DWORD dwIndex;
|
||
|
char szIndex[MAX_BUF];
|
||
|
char szKDescription[MAX_BUF];
|
||
|
char szDescription[MAX_BUF];
|
||
|
char szKDomain[MAX_BUF];
|
||
|
char szDomain[MAX_BUF];
|
||
|
char szKIdentifier[MAX_BUF];
|
||
|
char szIdentifier[MAX_BUF];
|
||
|
ssi *ssiSiteSelectorNewNode;
|
||
|
|
||
|
ssiSiteSelector = NULL;
|
||
|
|
||
|
/* get all dependees for this component */
|
||
|
dwIndex = 0;
|
||
|
_itoa(dwIndex, szIndex, 10);
|
||
|
strcpy(szKDescription, "Description");
|
||
|
strcpy(szKDomain, "Domain");
|
||
|
strcpy(szKIdentifier, "Identifier");
|
||
|
strcat(szKDescription, szIndex);
|
||
|
strcat(szKDomain, szIndex);
|
||
|
strcat(szKIdentifier, szIndex);
|
||
|
GetPrivateProfileString("Site Selector", szKDescription, "", szDescription, sizeof(szDescription), szFileIni);
|
||
|
while(*szDescription != '\0')
|
||
|
{
|
||
|
/* if the Domain and Identifier are not set, then skip */
|
||
|
GetPrivateProfileString("Site Selector", szKDomain, "", szDomain, sizeof(szDomain), szFileIni);
|
||
|
GetPrivateProfileString("Site Selector", szKIdentifier, "", szIdentifier, sizeof(szIdentifier), szFileIni);
|
||
|
if((*szDomain != '\0') && (*szIdentifier != '\0'))
|
||
|
{
|
||
|
/* create and initialize empty node */
|
||
|
ssiSiteSelectorNewNode = CreateSsiSiteSelectorNode();
|
||
|
|
||
|
strcpy(ssiSiteSelectorNewNode->szDescription, szDescription);
|
||
|
strcpy(ssiSiteSelectorNewNode->szDomain, szDomain);
|
||
|
strcpy(ssiSiteSelectorNewNode->szIdentifier, szIdentifier);
|
||
|
|
||
|
/* inserts the newly created node into the global node list */
|
||
|
SsiSiteSelectorNodeInsert(&(ssiSiteSelector), ssiSiteSelectorNewNode);
|
||
|
}
|
||
|
|
||
|
ProcessWindowsMessages();
|
||
|
++dwIndex;
|
||
|
_itoa(dwIndex, szIndex, 10);
|
||
|
strcpy(szKDescription, "Description");
|
||
|
strcpy(szKDomain, "Domain");
|
||
|
strcpy(szKIdentifier, "Identifier");
|
||
|
strcat(szKDescription, szIndex);
|
||
|
strcat(szKDomain, szIndex);
|
||
|
strcat(szKIdentifier, szIndex);
|
||
|
memset(szDescription, 0, sizeof(szDescription));
|
||
|
memset(szDomain, 0, sizeof(szDomain));
|
||
|
memset(szIdentifier, 0, sizeof(szIdentifier));
|
||
|
GetPrivateProfileString("Site Selector", szKDescription, "", szDescription, sizeof(szDescription), szFileIni);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void InitErrorMessageStream(char *szFileIni)
|
||
|
{
|
||
|
char szBuf[MAX_BUF_TINY];
|
||
|
|
||
|
GetPrivateProfileString("Message Stream",
|
||
|
"Status",
|
||
|
"",
|
||
|
szBuf,
|
||
|
sizeof(szBuf),
|
||
|
szFileIni);
|
||
|
|
||
|
if(stricmp(szBuf, "disabled") == 0)
|
||
|
gErrorMessageStream.bEnabled = FALSE;
|
||
|
else
|
||
|
gErrorMessageStream.bEnabled = TRUE;
|
||
|
|
||
|
GetPrivateProfileString("Message Stream",
|
||
|
"url",
|
||
|
"",
|
||
|
gErrorMessageStream.szURL,
|
||
|
sizeof(gErrorMessageStream.szURL),
|
||
|
szFileIni);
|
||
|
|
||
|
GetPrivateProfileString("Message Stream",
|
||
|
"Show Confirmation",
|
||
|
"",
|
||
|
szBuf,
|
||
|
sizeof(szBuf),
|
||
|
szFileIni);
|
||
|
if(stricmp(szBuf, "FALSE") == 0)
|
||
|
gErrorMessageStream.bShowConfirmation = FALSE;
|
||
|
else
|
||
|
gErrorMessageStream.bShowConfirmation = TRUE;
|
||
|
|
||
|
GetPrivateProfileString("Message Stream",
|
||
|
"Confirmation Message",
|
||
|
"",
|
||
|
gErrorMessageStream.szConfirmationMessage,
|
||
|
sizeof(szBuf),
|
||
|
szFileIni);
|
||
|
|
||
|
gErrorMessageStream.bSendMessage = FALSE;
|
||
|
gErrorMessageStream.dwMessageBufSize = MAX_BUF;
|
||
|
gErrorMessageStream.szMessage = NS_GlobalAlloc(gErrorMessageStream.dwMessageBufSize);
|
||
|
}
|
||
|
|
||
|
void DeInitErrorMessageStream()
|
||
|
{
|
||
|
FreeMemory(&gErrorMessageStream.szMessage);
|
||
|
}
|
||
|
|
||
|
#ifdef SSU_DEBUG
|
||
|
void ViewSiComponentsDependency(char *szBuffer, char *szIndentation, siC *siCNode)
|
||
|
{
|
||
|
siC *siCNodeTemp;
|
||
|
siCD *siCDependencyTemp;
|
||
|
|
||
|
siCDependencyTemp = siCNode->siCDDependencies;
|
||
|
if(siCDependencyTemp != NULL)
|
||
|
{
|
||
|
char szIndentationPadding[MAX_BUF];
|
||
|
DWORD dwIndex;
|
||
|
|
||
|
strcpy(szIndentationPadding, szIndentation);
|
||
|
strcat(szIndentationPadding, " ");
|
||
|
|
||
|
do
|
||
|
{
|
||
|
strcat(szBuffer, szIndentationPadding);
|
||
|
strcat(szBuffer, siCDependencyTemp->szReferenceName);
|
||
|
strcat(szBuffer, "::");
|
||
|
|
||
|
if((dwIndex = SiCNodeGetIndexRN(siCDependencyTemp->szReferenceName)) != -1)
|
||
|
strcat(szBuffer, SiCNodeGetDescriptionShort(dwIndex, TRUE, AC_ALL));
|
||
|
else
|
||
|
strcat(szBuffer, "Component does not exist");
|
||
|
|
||
|
strcat(szBuffer, ":");
|
||
|
strcat(szBuffer, "\n");
|
||
|
|
||
|
if(dwIndex != -1)
|
||
|
{
|
||
|
if((siCNodeTemp = SiCNodeGetObject(dwIndex, TRUE, AC_ALL)) != NULL)
|
||
|
ViewSiComponentsDependency(szBuffer, szIndentationPadding, siCNodeTemp);
|
||
|
else
|
||
|
strcat(szBuffer, "Node not found");
|
||
|
}
|
||
|
|
||
|
siCDependencyTemp = siCDependencyTemp->Next;
|
||
|
}while((siCDependencyTemp != NULL) && (siCDependencyTemp != siCNode->siCDDependencies));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ViewSiComponentsDependee(char *szBuffer, char *szIndentation, siC *siCNode)
|
||
|
{
|
||
|
siC *siCNodeTemp;
|
||
|
siCD *siCDependeeTemp;
|
||
|
|
||
|
siCDependeeTemp = siCNode->siCDDependees;
|
||
|
if(siCDependeeTemp != NULL)
|
||
|
{
|
||
|
char szIndentationPadding[MAX_BUF];
|
||
|
DWORD dwIndex;
|
||
|
|
||
|
strcpy(szIndentationPadding, szIndentation);
|
||
|
strcat(szIndentationPadding, " ");
|
||
|
|
||
|
do
|
||
|
{
|
||
|
strcat(szBuffer, szIndentationPadding);
|
||
|
strcat(szBuffer, siCDependeeTemp->szReferenceName);
|
||
|
strcat(szBuffer, "::");
|
||
|
|
||
|
if((dwIndex = SiCNodeGetIndexRN(siCDependeeTemp->szReferenceName)) != -1)
|
||
|
strcat(szBuffer, SiCNodeGetDescriptionShort(dwIndex, TRUE, AC_ALL));
|
||
|
else
|
||
|
strcat(szBuffer, "Component does not exist");
|
||
|
|
||
|
strcat(szBuffer, ":");
|
||
|
strcat(szBuffer, "\n");
|
||
|
|
||
|
if(dwIndex != -1)
|
||
|
{
|
||
|
if((siCNodeTemp = SiCNodeGetObject(dwIndex, TRUE, AC_ALL)) != NULL)
|
||
|
ViewSiComponentsDependency(szBuffer, szIndentationPadding, siCNodeTemp);
|
||
|
else
|
||
|
strcat(szBuffer, "Node not found");
|
||
|
}
|
||
|
|
||
|
siCDependeeTemp = siCDependeeTemp->Next;
|
||
|
}while((siCDependeeTemp != NULL) && (siCDependeeTemp != siCNode->siCDDependees));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ViewSiComponents()
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
siC *siCTemp = siComponents;
|
||
|
|
||
|
// build dependency list
|
||
|
memset(szBuf, 0, sizeof(szBuf));
|
||
|
strcpy(szBuf, "Dependency:\n");
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if(siCTemp == NULL)
|
||
|
break;
|
||
|
|
||
|
strcat(szBuf, " ");
|
||
|
strcat(szBuf, siCTemp->szReferenceName);
|
||
|
strcat(szBuf, "::");
|
||
|
strcat(szBuf, siCTemp->szDescriptionShort);
|
||
|
strcat(szBuf, ":\n");
|
||
|
|
||
|
ViewSiComponentsDependency(szBuf, " ", siCTemp);
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
} while((siCTemp != NULL) && (siCTemp != siComponents));
|
||
|
|
||
|
WinMessageBox(HWND_DESKTOP, hWndMain, szBuf, NULL, 0, MB_ICONEXCLAMATION);
|
||
|
|
||
|
// build dependee list
|
||
|
memset(szBuf, 0, sizeof(szBuf));
|
||
|
strcpy(szBuf, "Dependee:\n");
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if(siCTemp == NULL)
|
||
|
break;
|
||
|
|
||
|
strcat(szBuf, " ");
|
||
|
strcat(szBuf, siCTemp->szReferenceName);
|
||
|
strcat(szBuf, "::");
|
||
|
strcat(szBuf, siCTemp->szDescriptionShort);
|
||
|
strcat(szBuf, ":\n");
|
||
|
|
||
|
ViewSiComponentsDependee(szBuf, " ", siCTemp);
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
} while((siCTemp != NULL) && (siCTemp != siComponents));
|
||
|
|
||
|
WinMessageBox(HWND_DESKTOP, hWndMain, szBuf, NULL, 0, MB_ICONEXCLAMATION);
|
||
|
}
|
||
|
#endif /* SSU_DEBUG */
|
||
|
|
||
|
void DeInitSiCDependencies(siCD *siCDDependencies)
|
||
|
{
|
||
|
siCD *siCDepTemp;
|
||
|
|
||
|
if(siCDDependencies == NULL)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
else if((siCDDependencies->Prev == NULL) || (siCDDependencies->Prev == siCDDependencies))
|
||
|
{
|
||
|
SiCDepNodeDelete(siCDDependencies);
|
||
|
return;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
siCDepTemp = siCDDependencies->Prev;
|
||
|
}
|
||
|
|
||
|
while(siCDepTemp != siCDDependencies)
|
||
|
{
|
||
|
SiCDepNodeDelete(siCDepTemp);
|
||
|
siCDepTemp = siCDDependencies->Prev;
|
||
|
}
|
||
|
SiCDepNodeDelete(siCDepTemp);
|
||
|
}
|
||
|
|
||
|
void DeInitSiComponents(siC **siCHeadNode)
|
||
|
{
|
||
|
siC *siCTemp;
|
||
|
|
||
|
if((*siCHeadNode) == NULL)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
else if(((*siCHeadNode)->Prev == NULL) || ((*siCHeadNode)->Prev == (*siCHeadNode)))
|
||
|
{
|
||
|
SiCNodeDelete((*siCHeadNode));
|
||
|
return;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
siCTemp = (*siCHeadNode)->Prev;
|
||
|
}
|
||
|
|
||
|
while(siCTemp != (*siCHeadNode))
|
||
|
{
|
||
|
SiCNodeDelete(siCTemp);
|
||
|
siCTemp = (*siCHeadNode)->Prev;
|
||
|
}
|
||
|
SiCNodeDelete(siCTemp);
|
||
|
}
|
||
|
|
||
|
void DeInitDSNode(dsN **dsnComponentDSRequirement)
|
||
|
{
|
||
|
dsN *dsNTemp;
|
||
|
|
||
|
if(*dsnComponentDSRequirement == NULL)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
else if(((*dsnComponentDSRequirement)->Prev == NULL) || ((*dsnComponentDSRequirement)->Prev == *dsnComponentDSRequirement))
|
||
|
{
|
||
|
DsNodeDelete(dsnComponentDSRequirement);
|
||
|
return;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
dsNTemp = (*dsnComponentDSRequirement)->Prev;
|
||
|
}
|
||
|
|
||
|
while(dsNTemp != *dsnComponentDSRequirement)
|
||
|
{
|
||
|
DsNodeDelete(&dsNTemp);
|
||
|
dsNTemp = (*dsnComponentDSRequirement)->Prev;
|
||
|
}
|
||
|
DsNodeDelete(dsnComponentDSRequirement);
|
||
|
}
|
||
|
|
||
|
BOOL ResolveComponentDependency(siCD *siCDInDependency, HWND hwndListBox)
|
||
|
{
|
||
|
int dwIndex;
|
||
|
siCD *siCDepTemp = siCDInDependency;
|
||
|
BOOL bMoreToResolve = FALSE;
|
||
|
DWORD dwAttrib;
|
||
|
|
||
|
if(siCDepTemp != NULL)
|
||
|
{
|
||
|
if((dwIndex = SiCNodeGetIndexRN(siCDepTemp->szReferenceName)) != -1)
|
||
|
{
|
||
|
dwAttrib = SiCNodeGetAttributes(dwIndex, TRUE, AC_ALL);
|
||
|
if(!(dwAttrib & SIC_SELECTED) && !(dwAttrib & SIC_DISABLED))
|
||
|
{
|
||
|
bMoreToResolve = TRUE;
|
||
|
SiCNodeSetAttributes(dwIndex, SIC_SELECTED, TRUE, TRUE, AC_ALL, hwndListBox);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
siCDepTemp = siCDepTemp->Next;
|
||
|
while((siCDepTemp != NULL) && (siCDepTemp != siCDInDependency))
|
||
|
{
|
||
|
if((dwIndex = SiCNodeGetIndexRN(siCDepTemp->szReferenceName)) != -1)
|
||
|
{
|
||
|
dwAttrib = SiCNodeGetAttributes(dwIndex, TRUE, AC_ALL);
|
||
|
if(!(dwAttrib & SIC_SELECTED) && !(dwAttrib & SIC_DISABLED))
|
||
|
{
|
||
|
bMoreToResolve = TRUE;
|
||
|
SiCNodeSetAttributes(dwIndex, SIC_SELECTED, TRUE, TRUE, AC_ALL, hwndListBox);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
siCDepTemp = siCDepTemp->Next;
|
||
|
}
|
||
|
}
|
||
|
return(bMoreToResolve);
|
||
|
}
|
||
|
|
||
|
BOOL ResolveDependencies(DWORD dwIndex, HWND hwndListBox)
|
||
|
{
|
||
|
BOOL bMoreToResolve = FALSE;
|
||
|
DWORD dwCount = 0;
|
||
|
siC *siCTemp = siComponents;
|
||
|
|
||
|
if(siCTemp != NULL)
|
||
|
{
|
||
|
/* can resolve specific component or all components (-1) */
|
||
|
if((dwIndex == dwCount) || (dwIndex == -1))
|
||
|
{
|
||
|
if(SiCNodeGetAttributes(dwCount, TRUE, AC_ALL) & SIC_SELECTED)
|
||
|
{
|
||
|
bMoreToResolve = ResolveComponentDependency(siCTemp->siCDDependencies, hwndListBox);
|
||
|
if(dwIndex == dwCount)
|
||
|
{
|
||
|
return(bMoreToResolve);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
++dwCount;
|
||
|
siCTemp = siCTemp->Next;
|
||
|
while((siCTemp != NULL) && (siCTemp != siComponents))
|
||
|
{
|
||
|
/* can resolve specific component or all components (-1) */
|
||
|
if((dwIndex == dwCount) || (dwIndex == -1))
|
||
|
{
|
||
|
if(SiCNodeGetAttributes(dwCount, TRUE, AC_ALL) & SIC_SELECTED)
|
||
|
{
|
||
|
bMoreToResolve = ResolveComponentDependency(siCTemp->siCDDependencies, hwndListBox);
|
||
|
if(dwIndex == dwCount)
|
||
|
{
|
||
|
return(bMoreToResolve);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
++dwCount;
|
||
|
siCTemp = siCTemp->Next;
|
||
|
}
|
||
|
}
|
||
|
return(bMoreToResolve);
|
||
|
}
|
||
|
|
||
|
BOOL ResolveComponentDependee(siCD *siCDInDependee)
|
||
|
{
|
||
|
int dwIndex;
|
||
|
siCD *siCDDependeeTemp = siCDInDependee;
|
||
|
BOOL bAtLeastOneSelected = FALSE;
|
||
|
|
||
|
if(siCDDependeeTemp != NULL)
|
||
|
{
|
||
|
if((dwIndex = SiCNodeGetIndexRN(siCDDependeeTemp->szReferenceName)) != -1)
|
||
|
{
|
||
|
if((SiCNodeGetAttributes(dwIndex, TRUE, AC_ALL) & SIC_SELECTED) == TRUE)
|
||
|
{
|
||
|
bAtLeastOneSelected = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
siCDDependeeTemp = siCDDependeeTemp->Next;
|
||
|
while((siCDDependeeTemp != NULL) && (siCDDependeeTemp != siCDInDependee))
|
||
|
{
|
||
|
if((dwIndex = SiCNodeGetIndexRN(siCDDependeeTemp->szReferenceName)) != -1)
|
||
|
{
|
||
|
if((SiCNodeGetAttributes(dwIndex, TRUE, AC_ALL) & SIC_SELECTED) == TRUE)
|
||
|
{
|
||
|
bAtLeastOneSelected = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
siCDDependeeTemp = siCDDependeeTemp->Next;
|
||
|
}
|
||
|
}
|
||
|
return(bAtLeastOneSelected);
|
||
|
}
|
||
|
|
||
|
ssi* SsiGetNode(LPSTR szDescription)
|
||
|
{
|
||
|
ssi *ssiSiteSelectorTemp = ssiSiteSelector;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if(ssiSiteSelectorTemp == NULL)
|
||
|
break;
|
||
|
|
||
|
if(stricmp(ssiSiteSelectorTemp->szDescription, szDescription) == 0)
|
||
|
return(ssiSiteSelectorTemp);
|
||
|
|
||
|
ssiSiteSelectorTemp = ssiSiteSelectorTemp->Next;
|
||
|
} while((ssiSiteSelectorTemp != NULL) && (ssiSiteSelectorTemp != ssiSiteSelector));
|
||
|
|
||
|
return(NULL);
|
||
|
}
|
||
|
|
||
|
void ResolveDependees(LPSTR szToggledReferenceName, HWND hwndListBox)
|
||
|
{
|
||
|
BOOL bAtLeastOneSelected;
|
||
|
BOOL bMoreToResolve = FALSE;
|
||
|
siC *siCTemp = siComponents;
|
||
|
DWORD dwIndex;
|
||
|
DWORD dwAttrib;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if(siCTemp == NULL)
|
||
|
break;
|
||
|
|
||
|
if((siCTemp->siCDDependees != NULL) &&
|
||
|
(stricmp(siCTemp->szReferenceName, szToggledReferenceName) != 0))
|
||
|
{
|
||
|
bAtLeastOneSelected = ResolveComponentDependee(siCTemp->siCDDependees);
|
||
|
if(bAtLeastOneSelected == FALSE)
|
||
|
{
|
||
|
if((dwIndex = SiCNodeGetIndexRN(siCTemp->szReferenceName)) != -1)
|
||
|
{
|
||
|
dwAttrib = SiCNodeGetAttributes(dwIndex, TRUE, AC_ALL);
|
||
|
if((dwAttrib & SIC_SELECTED) && !(dwAttrib & SIC_DISABLED))
|
||
|
{
|
||
|
SiCNodeSetAttributes(dwIndex, SIC_SELECTED, FALSE, TRUE, AC_ALL, hwndListBox);
|
||
|
bMoreToResolve = TRUE;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if((dwIndex = SiCNodeGetIndexRN(siCTemp->szReferenceName)) != -1)
|
||
|
{
|
||
|
dwAttrib = SiCNodeGetAttributes(dwIndex, TRUE, AC_ALL);
|
||
|
if(!(dwAttrib & SIC_SELECTED) && !(dwAttrib & SIC_DISABLED))
|
||
|
{
|
||
|
SiCNodeSetAttributes(dwIndex, SIC_SELECTED, TRUE, TRUE, AC_ALL, hwndListBox);
|
||
|
bMoreToResolve = TRUE;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
siCTemp = siCTemp->Next;
|
||
|
} while((siCTemp != NULL) && (siCTemp != siComponents));
|
||
|
|
||
|
if(bMoreToResolve == TRUE)
|
||
|
ResolveDependees(szToggledReferenceName, hwndListBox);
|
||
|
}
|
||
|
|
||
|
void PrintUsage(PSZ szAppName)
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szUsageMsg[MAX_BUF];
|
||
|
char szProcessFilename[MAX_BUF];
|
||
|
|
||
|
/* -h: this help
|
||
|
* -a [path]: Alternate archive search path
|
||
|
* -n [filename]: setup's parent's process filename
|
||
|
* -ma: run setup in Auto mode
|
||
|
* -ms: run setup in Silent mode
|
||
|
* -ira: ignore the [RunAppX] sections
|
||
|
* -ispf: ignore the [Program FolderX] sections that show
|
||
|
* the Start Menu shortcut folder at the end of installation.
|
||
|
*/
|
||
|
|
||
|
if(*sgProduct.szParentProcessFilename != '\0')
|
||
|
strcpy(szProcessFilename, sgProduct.szParentProcessFilename);
|
||
|
else
|
||
|
{
|
||
|
strcpy(szBuf, szAppName);
|
||
|
ParsePath(szBuf, szProcessFilename, sizeof(szProcessFilename), FALSE, PP_FILENAME_ONLY);
|
||
|
}
|
||
|
|
||
|
GetPrivateProfileString("Strings", "UsageMsg Usage", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
sprintf(szUsageMsg, szBuf, szProcessFilename, "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n");
|
||
|
|
||
|
PrintError(szUsageMsg, ERROR_CODE_HIDE);
|
||
|
}
|
||
|
|
||
|
ULONG ParseCommandLine(int argc, char *argv[])
|
||
|
{
|
||
|
char szArgVBuf[MAX_BUF];
|
||
|
int i;
|
||
|
int iArgC;
|
||
|
|
||
|
#ifdef XXX_DEBUG
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szOutputStr[MAX_BUF];
|
||
|
#endif
|
||
|
|
||
|
#ifdef XXX_DEBUG
|
||
|
sprintf(szOutputStr, "ArgC: %d\n", iArgC);
|
||
|
#endif
|
||
|
|
||
|
i = 0;
|
||
|
while(i < argc)
|
||
|
{
|
||
|
if(!stricmp(argv[i], "-h") || !stricmp(argv[i], "/h"))
|
||
|
{
|
||
|
PrintUsage(argv[0]);
|
||
|
return(WIZ_ERROR_UNDEFINED);
|
||
|
}
|
||
|
else if(!stricmp(argv[i], "-a") || !stricmp(argv[i], "/a"))
|
||
|
{
|
||
|
++i;
|
||
|
strcpy(sgProduct.szAlternateArchiveSearchPath, argv[i]);
|
||
|
}
|
||
|
else if(!stricmp(argv[i], "-n") || !stricmp(argv[i], "/n"))
|
||
|
{
|
||
|
++i;
|
||
|
strcpy(sgProduct.szParentProcessFilename, argv[i]);
|
||
|
}
|
||
|
else if(!stricmp(argv[i], "-ma") || !stricmp(argv[i], "/ma"))
|
||
|
SetSetupRunMode("AUTO");
|
||
|
else if(!stricmp(argv[i], "-ms") || !stricmp(argv[i], "/ms"))
|
||
|
SetSetupRunMode("SILENT");
|
||
|
else if(!stricmp(argv[i], "-ira") || !stricmp(argv[i], "/ira"))
|
||
|
/* ignore [RunAppX] sections */
|
||
|
gbIgnoreRunAppX = TRUE;
|
||
|
else if(!stricmp(argv[i], "-ispf") || !stricmp(argv[i], "/ispf"))
|
||
|
/* ignore [Program FolderX] sections */
|
||
|
gbIgnoreProgramFolderX = TRUE;
|
||
|
|
||
|
#ifdef XXX_DEBUG
|
||
|
_itoa(i, szBuf, 10);
|
||
|
strcat(szOutputStr, " ");
|
||
|
strcat(szOutputStr, szBuf);
|
||
|
strcat(szOutputStr, ": ");
|
||
|
strcat(szOutputStr, argv[i]);
|
||
|
strcat(szOutputStr, "\n");
|
||
|
#endif
|
||
|
|
||
|
++i;
|
||
|
}
|
||
|
|
||
|
#ifdef XXX_DEBUG
|
||
|
WinMessageBox(HWND_DESKTOP, NULL, szOutputStr, "Output", 0, MB_OK);
|
||
|
#endif
|
||
|
return(WIZ_OK);
|
||
|
}
|
||
|
|
||
|
void GetAlternateArchiveSearchPath(LPSTR lpszCmdLine)
|
||
|
{
|
||
|
char szBuf[MAX_PATH];
|
||
|
LPSTR lpszAASPath;
|
||
|
LPSTR lpszEndPath;
|
||
|
LPSTR lpszEndQuote;
|
||
|
|
||
|
if(strcpy(szBuf, lpszCmdLine))
|
||
|
{
|
||
|
if((lpszAASPath = strstr(szBuf, "-a")) == NULL)
|
||
|
return;
|
||
|
else
|
||
|
lpszAASPath += 2;
|
||
|
|
||
|
if(*lpszAASPath == '\"')
|
||
|
{
|
||
|
lpszAASPath = lpszAASPath + 1;
|
||
|
if((lpszEndQuote = strstr(lpszAASPath, "\"")) != NULL)
|
||
|
{
|
||
|
*lpszEndQuote = '\0';
|
||
|
}
|
||
|
}
|
||
|
else if((lpszEndPath = strstr(lpszAASPath, " ")) != NULL)
|
||
|
{
|
||
|
*lpszEndPath = '\0';
|
||
|
}
|
||
|
|
||
|
strcpy(sgProduct.szAlternateArchiveSearchPath, lpszAASPath);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#define BUFMIN 8*1024
|
||
|
#define BUFMAX 256*1024
|
||
|
#define BUFDEFAULT 32*1024
|
||
|
|
||
|
BOOL CheckForProcess(PID pid, LPSTR szProcessName, DWORD dwProcessName, PSZ szFQProcessName, DWORD dwFQProcessName)
|
||
|
{
|
||
|
/* Only compile this code if we have the new toolkit */
|
||
|
#ifdef QS_PROCESS
|
||
|
ULONG bufsize = BUFDEFAULT;
|
||
|
QSPTRREC* pbh;
|
||
|
APIRET rc = 0;
|
||
|
CHAR szUpperAppName[CCHMAXPATH] = {0};
|
||
|
|
||
|
/* Can't call with both - only one or the other */
|
||
|
if (pid && szProcessName) {
|
||
|
return FALSE;
|
||
|
}
|
||
|
if (szProcessName) {
|
||
|
strcpy(szUpperAppName, szProcessName);
|
||
|
strupr(szUpperAppName);
|
||
|
}
|
||
|
do {
|
||
|
pbh = (QSPTRREC*) malloc(bufsize);
|
||
|
if(!pbh) {
|
||
|
if(bufsize <= BUFMIN)
|
||
|
rc = ERROR_NOT_ENOUGH_MEMORY;
|
||
|
else if(rc != ERROR_BUFFER_OVERFLOW)
|
||
|
bufsize /= 2;
|
||
|
} else {
|
||
|
rc = DosQuerySysState(QS_PROCESS | QS_MTE, 0, 0, 0, pbh, bufsize);
|
||
|
if(rc == ERROR_BUFFER_OVERFLOW) {
|
||
|
if(bufsize < BUFMAX) {
|
||
|
free(pbh);
|
||
|
bufsize *= 2;
|
||
|
} else {
|
||
|
rc = ERROR_TOO_MANY_NAMES; // give up.
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} while(rc == ERROR_BUFFER_OVERFLOW);
|
||
|
|
||
|
if(rc == NO_ERROR) {
|
||
|
QSPREC* ppiLocal = pbh->pProcRec;
|
||
|
while(ppiLocal->RecType == QS_PROCESS) {
|
||
|
QSLREC* pmi = pbh->pLibRec;
|
||
|
while (pmi && pmi->hmte != ppiLocal->hMte)
|
||
|
pmi = (QSLREC*)pmi->pNextRec;
|
||
|
if(pmi) {
|
||
|
if ((szUpperAppName[0] && strstr((char*)pmi->pName, szUpperAppName)) ||
|
||
|
(ppiLocal->pid == pid)) {
|
||
|
if (szFQProcessName)
|
||
|
strcpy(szFQProcessName, (char*)pmi->pName);
|
||
|
if (pbh)
|
||
|
free(pbh);
|
||
|
return TRUE;
|
||
|
}
|
||
|
}
|
||
|
ppiLocal=(QSPREC*)(ppiLocal->pThrdRec+ppiLocal->cTCB);
|
||
|
}
|
||
|
}
|
||
|
if(pbh)
|
||
|
free(pbh);
|
||
|
#endif
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
int PreCheckInstance(char *szSection, char *szIniFile, char *szFQProcessName)
|
||
|
{
|
||
|
char szParameter[MAX_BUF];
|
||
|
char szPath[MAX_BUF];
|
||
|
ULONG ulCounter = 0;
|
||
|
BOOL bContinue = TRUE;
|
||
|
char szExtraCmd[] = "Extra Cmd";
|
||
|
char szExtraCmdParameter[MAX_BUF];
|
||
|
|
||
|
do
|
||
|
{
|
||
|
/* Read the win reg key path */
|
||
|
sprintf(szExtraCmdParameter, "%s%d Parameter", szExtraCmd, ulCounter);
|
||
|
GetPrivateProfileString(szSection,
|
||
|
szExtraCmdParameter,
|
||
|
"",
|
||
|
szParameter,
|
||
|
sizeof(szParameter),
|
||
|
szIniFile);
|
||
|
if(*szParameter == '\0')
|
||
|
{
|
||
|
bContinue = FALSE;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
ParsePath(szFQProcessName, szPath, sizeof(szPath), FALSE, PP_PATH_ONLY);
|
||
|
|
||
|
// we've found a file, so let's execute it and stop. No need to look
|
||
|
// for other keys to parse. We only want to do that if the file is
|
||
|
// _not_ found. This is for when we change the name of the browser
|
||
|
// app file and still need to deal with locating it and calling
|
||
|
// -kill on it. ie.
|
||
|
// previous name: netscp6.exe
|
||
|
// new name: netscp.exe
|
||
|
// We only need to call one of them, not both.
|
||
|
bContinue = FALSE;
|
||
|
|
||
|
/* Run the file */
|
||
|
WinSpawn(szFQProcessName, szParameter, szPath, TRUE);
|
||
|
|
||
|
/* Even though WinSpawn is suppose to wait for the app to finish, this
|
||
|
* does not really work that way for trying to quit the browser when
|
||
|
* it's in turbo mode, so we wait 2 secs for it to complete. */
|
||
|
DosSleep(2000);
|
||
|
|
||
|
++ulCounter;
|
||
|
} while(bContinue);
|
||
|
|
||
|
return(WIZ_OK);
|
||
|
}
|
||
|
|
||
|
ULONG CloseAllWindowsOfWindowHandle(HWND hwndWindow)
|
||
|
{
|
||
|
HENUM henum;
|
||
|
HWND hwnd;
|
||
|
PID mainpid, pid;
|
||
|
TID tid;
|
||
|
|
||
|
WinQueryWindowProcess(hwndWindow, &mainpid, &tid);
|
||
|
|
||
|
henum = WinBeginEnumWindows(HWND_DESKTOP);
|
||
|
while ((hwnd = WinGetNextWindow(henum)) != NULLHANDLE)
|
||
|
{
|
||
|
WinQueryWindowProcess(hwnd, &pid, &tid);
|
||
|
if (pid == mainpid) {
|
||
|
if (WinIsWindowVisible(hwnd)) {
|
||
|
MRESULT rc = WinSendMsg(hwnd, WM_CLOSE, 0, 0);
|
||
|
printf("rc = %x\n", rc);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
WinEndEnumWindows(henum);
|
||
|
/* The windows don't close quick enough, so we need to wait a bit */
|
||
|
DosSleep(2500);
|
||
|
|
||
|
return(WIZ_OK);
|
||
|
}
|
||
|
|
||
|
HRESULT CheckInstances()
|
||
|
{
|
||
|
char szSection[MAX_BUF];
|
||
|
char szProcessName[CCHMAXPATH];
|
||
|
char szFQProcessName[CCHMAXPATH];
|
||
|
char szClassName[MAX_BUF];
|
||
|
char szCloseAllWindows[MAX_BUF];
|
||
|
char szAttention[MAX_BUF];
|
||
|
char szMessage[MAX_BUF];
|
||
|
char szMessageFulInstaller[MAX_BUF];
|
||
|
char szIndex[MAX_BUF];
|
||
|
int iIndex;
|
||
|
BOOL bContinue;
|
||
|
BOOL bCloseAllWindows;
|
||
|
HWND hwndFW;
|
||
|
LPSTR szCN;
|
||
|
DWORD dwRv0;
|
||
|
DWORD dwRv1;
|
||
|
|
||
|
bContinue = TRUE;
|
||
|
iIndex = -1;
|
||
|
while(bContinue)
|
||
|
{
|
||
|
memset(szClassName, 0, sizeof(szClassName));
|
||
|
memset(szMessage, 0, sizeof(szMessage));
|
||
|
memset(szMessageFulInstaller, 0, sizeof(szMessageFulInstaller));
|
||
|
|
||
|
++iIndex;
|
||
|
_itoa(iIndex, szIndex, 10);
|
||
|
strcpy(szSection, "Check Instance");
|
||
|
strcat(szSection, szIndex);
|
||
|
|
||
|
GetPrivateProfileString("Messages", "MB_ATTENTION_STR", "", szAttention, sizeof(szAttention), szFileIniInstall);
|
||
|
GetPrivateProfileString(szSection, "Message", "", szMessage, sizeof(szMessage), szFileIniConfig);
|
||
|
GetPrivateProfileString(szSection, "Message Full Installer", "", szMessageFulInstaller, sizeof(szMessageFulInstaller), szFileIniConfig);
|
||
|
if(!gbDownloadTriggered && !gbPreviousUnfinishedDownload && (*szMessageFulInstaller != '\0'))
|
||
|
strcpy(szMessage, szMessageFulInstaller);
|
||
|
|
||
|
if(GetPrivateProfileString(szSection, "Process Name", "", szProcessName, sizeof(szProcessName), szFileIniConfig) != 0L)
|
||
|
{
|
||
|
if(*szProcessName != '\0')
|
||
|
{
|
||
|
/* If an instance is found, call PreCheckInstance first */
|
||
|
if(CheckForProcess(0, szProcessName, sizeof(szProcessName), szFQProcessName, sizeof(szFQProcessName)) == TRUE)
|
||
|
PreCheckInstance(szSection, szFileIniConfig, szFQProcessName);
|
||
|
|
||
|
if(CheckForProcess(0, szProcessName, sizeof(szProcessName), NULL, 0) == TRUE)
|
||
|
{
|
||
|
if(*szMessage != '\0')
|
||
|
{
|
||
|
switch(sgProduct.ulMode)
|
||
|
{
|
||
|
case NORMAL:
|
||
|
switch(WinMessageBox(HWND_DESKTOP, hWndMain, szMessage, szAttention, 0, MB_ICONEXCLAMATION | MB_OKCANCEL))
|
||
|
{
|
||
|
case MBID_CANCEL:
|
||
|
/* User selected to cancel Setup */
|
||
|
return(TRUE);
|
||
|
|
||
|
case MBID_RETRY:
|
||
|
case MBID_OK:
|
||
|
/* User selected to retry. Reset counter */
|
||
|
iIndex = -1;
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case AUTO:
|
||
|
ShowMessage(szMessage, TRUE);
|
||
|
DosSleep(5000);
|
||
|
ShowMessage(szMessage, FALSE);
|
||
|
|
||
|
/* Setup mode is AUTO. Show message, timeout, then cancel because we can't allow user to continue */
|
||
|
return(TRUE);
|
||
|
|
||
|
case SILENT:
|
||
|
return(TRUE);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* No message to display. Assume cancel because we can't allow user to continue */
|
||
|
return(TRUE);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Process Name= key existed, and has been processed, so continue looking for more */
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
GetPrivateProfileString(szSection, "Close All Process Windows", "", szCloseAllWindows, sizeof(szCloseAllWindows), szFileIniConfig);
|
||
|
if(stricmp(szCloseAllWindows, "TRUE") == 0)
|
||
|
bCloseAllWindows = TRUE;
|
||
|
else
|
||
|
bCloseAllWindows = FALSE;
|
||
|
|
||
|
/* Process Name= key did not exist, so look for other keys */
|
||
|
dwRv0 = GetPrivateProfileString(szSection, "Class Name", "", szClassName, sizeof(szClassName), szFileIniConfig);
|
||
|
if (dwRv0 == 0L)
|
||
|
{
|
||
|
bContinue = FALSE;
|
||
|
}
|
||
|
else if(*szClassName != '\0')
|
||
|
{
|
||
|
if(*szClassName == '\0')
|
||
|
szCN = NULL;
|
||
|
else
|
||
|
szCN = szClassName;
|
||
|
|
||
|
/* If an instance is found, call PreCheckInstance first */
|
||
|
if((hwndFW = FindWindow(szCN)) != NULL) {
|
||
|
PID pid;
|
||
|
TID tid;
|
||
|
WinQueryWindowProcess(hwndFW, &pid, &tid);
|
||
|
CheckForProcess(pid, NULL, 0, szFQProcessName, sizeof(szFQProcessName));
|
||
|
PreCheckInstance(szSection, szFileIniConfig, szFQProcessName);
|
||
|
}
|
||
|
|
||
|
if((hwndFW = FindWindow(szCN)) != NULL)
|
||
|
{
|
||
|
if(*szMessage != '\0')
|
||
|
{
|
||
|
switch(sgProduct.ulMode)
|
||
|
{
|
||
|
case NORMAL:
|
||
|
switch(WinMessageBox(HWND_DESKTOP, hWndMain, szMessage, szAttention, 0, MB_ICONEXCLAMATION | MB_OKCANCEL))
|
||
|
{
|
||
|
case MBID_CANCEL:
|
||
|
/* User selected to cancel Setup */
|
||
|
return(TRUE);
|
||
|
|
||
|
case MBID_RETRY:
|
||
|
case MBID_OK:
|
||
|
/* User selected to retry. Reset counter */
|
||
|
if(bCloseAllWindows)
|
||
|
CloseAllWindowsOfWindowHandle(hwndFW);
|
||
|
|
||
|
iIndex = -1;
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case AUTO:
|
||
|
/* Setup mode is AUTO. Show message, timeout, then auto close
|
||
|
* all the windows associated with the process */
|
||
|
|
||
|
ShowMessage(szMessage, TRUE);
|
||
|
DosSleep(5000);
|
||
|
ShowMessage(szMessage, FALSE);
|
||
|
|
||
|
if(bCloseAllWindows)
|
||
|
CloseAllWindowsOfWindowHandle(hwndFW);
|
||
|
|
||
|
return(TRUE);
|
||
|
|
||
|
case SILENT:
|
||
|
/* Setup mode is SILENT. Just auto close
|
||
|
* all the windows associated with the process */
|
||
|
|
||
|
if(bCloseAllWindows)
|
||
|
CloseAllWindowsOfWindowHandle(hwndFW);
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* No message to display. Assume cancel because we can't allow user to continue */
|
||
|
return(TRUE);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
int CRCCheckArchivesStartup(char *szCorruptedArchiveList, DWORD dwCorruptedArchiveListSize, BOOL bIncludeTempPath)
|
||
|
{
|
||
|
DWORD dwIndex0;
|
||
|
DWORD dwFileCounter;
|
||
|
siC *siCObject = NULL;
|
||
|
char szArchivePathWithFilename[MAX_BUF];
|
||
|
char szArchivePath[MAX_BUF];
|
||
|
char szMsgCRCCheck[MAX_BUF];
|
||
|
char szPartiallyDownloadedFilename[MAX_BUF];
|
||
|
int iRv;
|
||
|
int iResult;
|
||
|
|
||
|
if(szCorruptedArchiveList != NULL)
|
||
|
memset(szCorruptedArchiveList, 0, dwCorruptedArchiveListSize);
|
||
|
|
||
|
GetSetupCurrentDownloadFile(szPartiallyDownloadedFilename,
|
||
|
sizeof(szPartiallyDownloadedFilename));
|
||
|
GetPrivateProfileString("Strings", "Message Verifying Archives", "", szMsgCRCCheck, sizeof(szMsgCRCCheck), szFileIniConfig);
|
||
|
ShowMessage(szMsgCRCCheck, TRUE);
|
||
|
|
||
|
iResult = WIZ_CRC_PASS;
|
||
|
dwIndex0 = 0;
|
||
|
dwFileCounter = 0;
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
while(siCObject)
|
||
|
{
|
||
|
/* only download jars if not already in the local machine */
|
||
|
iRv = LocateJar(siCObject, szArchivePath, sizeof(szArchivePath), bIncludeTempPath);
|
||
|
if((iRv != AP_NOT_FOUND) &&
|
||
|
(stricmp(szPartiallyDownloadedFilename,
|
||
|
siCObject->szArchiveName) != 0))
|
||
|
{
|
||
|
if(strlen(szArchivePath) < sizeof(szArchivePathWithFilename))
|
||
|
strcpy(szArchivePathWithFilename, szArchivePath);
|
||
|
|
||
|
AppendBackSlash(szArchivePathWithFilename, sizeof(szArchivePathWithFilename));
|
||
|
if((strlen(szArchivePathWithFilename) + strlen(siCObject->szArchiveName)) < sizeof(szArchivePathWithFilename))
|
||
|
strcat(szArchivePathWithFilename, siCObject->szArchiveName);
|
||
|
|
||
|
if(CheckForArchiveExtension(szArchivePathWithFilename))
|
||
|
{
|
||
|
/* Make sure that the Archive that failed is located in the TEMP
|
||
|
* folder. This means that it was downloaded at one point and not
|
||
|
* simply uncompressed from the self-extracting exe file. */
|
||
|
if(VerifyArchive(szArchivePathWithFilename) != ZIP_OK)
|
||
|
{
|
||
|
if(iRv == AP_TEMP_PATH)
|
||
|
DosDelete(szArchivePathWithFilename);
|
||
|
else if(szCorruptedArchiveList != NULL)
|
||
|
{
|
||
|
iResult = WIZ_CRC_FAIL;
|
||
|
if((DWORD)(strlen(szCorruptedArchiveList) + strlen(siCObject->szArchiveName + 1)) < dwCorruptedArchiveListSize)
|
||
|
{
|
||
|
strcat(szCorruptedArchiveList, " ");
|
||
|
strcat(szCorruptedArchiveList, siCObject->szArchiveName);
|
||
|
strcat(szCorruptedArchiveList, "\n");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
iResult = WIZ_OUT_OF_MEMORY;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
++dwIndex0;
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
}
|
||
|
ShowMessage(szMsgCRCCheck, FALSE);
|
||
|
return(iResult);
|
||
|
}
|
||
|
|
||
|
int StartupCheckArchives(void)
|
||
|
{
|
||
|
int iRv;
|
||
|
char szBuf[MAX_BUF_SMALL];
|
||
|
char szCorruptedArchiveList[MAX_BUF];
|
||
|
|
||
|
iRv = CRCCheckArchivesStartup(szCorruptedArchiveList, sizeof(szCorruptedArchiveList), gbPreviousUnfinishedDownload);
|
||
|
switch(iRv)
|
||
|
{
|
||
|
char szMsg[MAX_BUF];
|
||
|
char szBuf2[MAX_BUF];
|
||
|
char szTitle[MAX_BUF_TINY];
|
||
|
|
||
|
case WIZ_CRC_FAIL:
|
||
|
switch(sgProduct.ulMode)
|
||
|
{
|
||
|
case NORMAL:
|
||
|
if(GetPrivateProfileString("Messages", "STR_MESSAGEBOX_TITLE", "", szBuf, sizeof(szBuf), szFileIniInstall))
|
||
|
strcpy(szTitle, "Setup");
|
||
|
else
|
||
|
sprintf(szTitle, szBuf, sgProduct.szProductName);
|
||
|
|
||
|
GetPrivateProfileString("Strings", "Error Corrupted Archives Detected", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(*szBuf != '\0')
|
||
|
{
|
||
|
strcpy(szBuf2, "\n\n");
|
||
|
strcat(szBuf2, szCorruptedArchiveList);
|
||
|
strcat(szBuf2, "\n");
|
||
|
sprintf(szMsg, szBuf, szBuf2);
|
||
|
}
|
||
|
WinMessageBox(HWND_DESKTOP, hWndMain, szMsg, szTitle, 0, MB_OK | MB_ERROR);
|
||
|
break;
|
||
|
|
||
|
case AUTO:
|
||
|
GetPrivateProfileString("Strings", "Error Corrupted Archives Detected AUTO mode", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
ShowMessage(szBuf, TRUE);
|
||
|
DosSleep(5000);
|
||
|
ShowMessage(szBuf, FALSE);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
LogISComponentsFailedCRC(szCorruptedArchiveList, W_STARTUP);
|
||
|
return(WIZ_CRC_FAIL);
|
||
|
|
||
|
case WIZ_CRC_PASS:
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
LogISComponentsFailedCRC(NULL, W_STARTUP);
|
||
|
return(iRv);
|
||
|
}
|
||
|
|
||
|
HRESULT ParseConfigIni(int argc, char *argv[])
|
||
|
{
|
||
|
int iRv;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szMsgInitSetup[MAX_BUF];
|
||
|
char szPreviousPath[MAX_BUF];
|
||
|
char szShowDialog[MAX_BUF];
|
||
|
DWORD dwPreviousUnfinishedState;
|
||
|
|
||
|
if(InitSetupGeneral())
|
||
|
return(1);
|
||
|
if(InitDlgWelcome(&diWelcome))
|
||
|
return(1);
|
||
|
if(InitDlgLicense(&diLicense))
|
||
|
return(1);
|
||
|
if(InitDlgSetupType(&diSetupType))
|
||
|
return(1);
|
||
|
if(InitDlgSelectComponents(&diSelectComponents, SM_SINGLE))
|
||
|
return(1);
|
||
|
if(InitDlgSelectComponents(&diSelectAdditionalComponents, SM_SINGLE))
|
||
|
return(1);
|
||
|
if(InitDlgOS2Integration(&diOS2Integration))
|
||
|
return(1);
|
||
|
if(InitDlgProgramFolder(&diProgramFolder))
|
||
|
return(1);
|
||
|
if(InitDlgAdditionalOptions(&diAdditionalOptions))
|
||
|
return(1);
|
||
|
if(InitDlgAdvancedSettings(&diAdvancedSettings))
|
||
|
return(1);
|
||
|
if(InitDlgQuickLaunch(&diQuickLaunch))
|
||
|
return(1);
|
||
|
if(InitDlgStartInstall(&diStartInstall))
|
||
|
return(1);
|
||
|
if(InitDlgDownload(&diDownload))
|
||
|
return(1);
|
||
|
if(InitDlgReboot(&diReboot))
|
||
|
return(1);
|
||
|
if(InitSXpcomFile())
|
||
|
return(1);
|
||
|
|
||
|
/* get install Mode information */
|
||
|
GetPrivateProfileString("General", "Run Mode", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
SetSetupRunMode(szBuf);
|
||
|
if(ParseCommandLine(argc, argv))
|
||
|
return(1);
|
||
|
|
||
|
if(GetPrivateProfileString("Messages", "MSG_INIT_SETUP", "", szMsgInitSetup, sizeof(szMsgInitSetup), szFileIniInstall))
|
||
|
ShowMessage(szMsgInitSetup, TRUE);
|
||
|
|
||
|
/* get product name description */
|
||
|
GetPrivateProfileString("General", "Company Name", "", sgProduct.szCompanyName, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("General", "Product Name", "", sgProduct.szProductName, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("General", "Product Name Internal", "", sgProduct.szProductNameInternal, MAX_BUF, szFileIniConfig);
|
||
|
if (sgProduct.szProductNameInternal[0] == 0)
|
||
|
strcpy(sgProduct.szProductNameInternal, sgProduct.szProductName);
|
||
|
GetPrivateProfileString("General", "Product Name Previous", "", sgProduct.szProductNamePrevious, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("General", "Uninstall Filename", "", sgProduct.szUninstallFilename, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("General", "User Agent", "", sgProduct.szUserAgent, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("General", "Sub Path", "", sgProduct.szSubPath, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("General", "Program Name", "", sgProduct.szProgramName, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("General", "Lock Path", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "TRUE") == 0)
|
||
|
sgProduct.bLockPath = TRUE;
|
||
|
|
||
|
/* get main install path */
|
||
|
if(LocatePreviousPath("Locate Previous Product Path", szPreviousPath, sizeof(szPreviousPath)) == FALSE)
|
||
|
{
|
||
|
GetPrivateProfileString("General", "Path", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(sgProduct.szPath, szBuf);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* If the previous path is located in the regsitry, then we need to check to see if the path from
|
||
|
* the regsitry plus the Sub Path contains the Program Name file. If it does, then we have the
|
||
|
* correct path, so just use it.
|
||
|
*
|
||
|
* If it does not contain the Program Name file, then check the parent path (from the registry) +
|
||
|
* SubPath. If this path contains the Program Name file, then we found an older path format. We
|
||
|
* then need to use the parent path as the default path.
|
||
|
*
|
||
|
* Only do the older path format checking if the Sub Path= and Program Name= keys exist. If
|
||
|
* either are not set, then assume that the path from the registry is what we want.
|
||
|
*/
|
||
|
if((*sgProduct.szSubPath != '\0') && (*sgProduct.szProgramName != '\0'))
|
||
|
{
|
||
|
/* If the Sub Path= and Program Name= keys exist, do extra parsing for the correct path */
|
||
|
strcpy(szBuf, szPreviousPath);
|
||
|
AppendBackSlash(szBuf, sizeof(szBuf));
|
||
|
strcat(szBuf, sgProduct.szSubPath);
|
||
|
AppendBackSlash(szBuf, sizeof(szBuf));
|
||
|
strcat(szBuf, sgProduct.szProgramName);
|
||
|
|
||
|
/* Check to see if PreviousPath + SubPath + ProgramName exists. If it does, then we have the
|
||
|
* correct path.
|
||
|
*/
|
||
|
if(FileExists(szBuf))
|
||
|
{
|
||
|
strcpy(sgProduct.szPath, szPreviousPath);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* If not, try parent of PreviousPath + SubPath + ProgramName.
|
||
|
* If this exists, then we need to use the parent path of PreviousPath.
|
||
|
*/
|
||
|
RemoveBackSlash(szPreviousPath);
|
||
|
ParsePath(szPreviousPath, szBuf, sizeof(szBuf), FALSE, PP_PATH_ONLY);
|
||
|
AppendBackSlash(szBuf, sizeof(szBuf));
|
||
|
strcat(szBuf, sgProduct.szSubPath);
|
||
|
AppendBackSlash(szBuf, sizeof(szBuf));
|
||
|
strcat(szBuf, sgProduct.szProgramName);
|
||
|
|
||
|
if(FileExists(szBuf))
|
||
|
{
|
||
|
RemoveBackSlash(szPreviousPath);
|
||
|
ParsePath(szPreviousPath, szBuf, sizeof(szBuf), FALSE, PP_PATH_ONLY);
|
||
|
strcpy(sgProduct.szPath, szBuf);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* If we still can't locate ProgramName file, then use the default in the config.ini */
|
||
|
GetPrivateProfileString("General", "Path", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(sgProduct.szPath, szBuf);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
strcpy(sgProduct.szPath, szPreviousPath);
|
||
|
}
|
||
|
}
|
||
|
RemoveBackSlash(sgProduct.szPath);
|
||
|
|
||
|
/* make a copy of sgProduct.szPath to be used in the Setup Type dialog */
|
||
|
strcpy(szTempSetupPath, sgProduct.szPath);
|
||
|
|
||
|
/* get main program folder path */
|
||
|
GetPrivateProfileString("General", "Program Folder Path", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(sgProduct.szProgramFolderPath, szBuf);
|
||
|
|
||
|
/* get main program folder name */
|
||
|
GetPrivateProfileString("General", "Program Folder Name", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(sgProduct.szProgramFolderName, szBuf);
|
||
|
|
||
|
/* Welcome dialog */
|
||
|
GetPrivateProfileString("Dialog Welcome", "Show Dialog", "", szShowDialog, sizeof(szShowDialog), szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Welcome", "Title", "", diWelcome.szTitle, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Welcome", "Message0", "", diWelcome.szMessage0, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Welcome", "Message1", "", diWelcome.szMessage1, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Welcome", "Message2", "", diWelcome.szMessage2, MAX_BUF, szFileIniConfig);
|
||
|
if(stricmp(szShowDialog, "TRUE") == 0)
|
||
|
diWelcome.bShowDialog = TRUE;
|
||
|
|
||
|
/* License dialog */
|
||
|
GetPrivateProfileString("Dialog License", "Show Dialog", "", szShowDialog, sizeof(szShowDialog), szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog License", "Title", "", diLicense.szTitle, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog License", "License File", "", diLicense.szLicenseFilename, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog License", "Message0", "", diLicense.szMessage0, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog License", "Message1", "", diLicense.szMessage1, MAX_BUF, szFileIniConfig);
|
||
|
if(stricmp(szShowDialog, "TRUE") == 0)
|
||
|
diLicense.bShowDialog = TRUE;
|
||
|
|
||
|
/* Setup Type dialog */
|
||
|
GetPrivateProfileString("Dialog Setup Type", "Show Dialog", "", szShowDialog, sizeof(szShowDialog), szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Setup Type", "Title", "", diSetupType.szTitle, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Setup Type", "Message0", "", diSetupType.szMessage0, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Setup Type", "Readme Filename", "", diSetupType.szReadmeFilename, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Setup Type", "Readme App", "", diSetupType.szReadmeApp, MAX_BUF, szFileIniConfig);
|
||
|
if(stricmp(szShowDialog, "TRUE") == 0)
|
||
|
diSetupType.bShowDialog = TRUE;
|
||
|
|
||
|
/* Get Setup Types info */
|
||
|
GetPrivateProfileString("Setup Type0", "Description Short", "", diSetupType.stSetupType0.szDescriptionShort, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Setup Type0", "Description Long", "", diSetupType.stSetupType0.szDescriptionLong, MAX_BUF, szFileIniConfig);
|
||
|
STSetVisibility(&diSetupType.stSetupType0);
|
||
|
|
||
|
GetPrivateProfileString("Setup Type1", "Description Short", "", diSetupType.stSetupType1.szDescriptionShort, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Setup Type1", "Description Long", "", diSetupType.stSetupType1.szDescriptionLong, MAX_BUF, szFileIniConfig);
|
||
|
STSetVisibility(&diSetupType.stSetupType1);
|
||
|
|
||
|
GetPrivateProfileString("Setup Type2", "Description Short", "", diSetupType.stSetupType2.szDescriptionShort, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Setup Type2", "Description Long", "", diSetupType.stSetupType2.szDescriptionLong, MAX_BUF, szFileIniConfig);
|
||
|
STSetVisibility(&diSetupType.stSetupType2);
|
||
|
|
||
|
GetPrivateProfileString("Setup Type3", "Description Short", "", diSetupType.stSetupType3.szDescriptionShort, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Setup Type3", "Description Long", "", diSetupType.stSetupType3.szDescriptionLong, MAX_BUF, szFileIniConfig);
|
||
|
STSetVisibility(&diSetupType.stSetupType3);
|
||
|
|
||
|
/* remember the radio button that is considered the Custom type (the last radio button) */
|
||
|
SetCustomType();
|
||
|
|
||
|
/* Select Components dialog */
|
||
|
GetPrivateProfileString("Dialog Select Components", "Show Dialog", "", szShowDialog, sizeof(szShowDialog), szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Select Components", "Title", "", diSelectComponents.szTitle, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Select Components", "Message0", "", diSelectComponents.szMessage0, MAX_BUF, szFileIniConfig);
|
||
|
if(stricmp(szShowDialog, "TRUE") == 0)
|
||
|
diSelectComponents.bShowDialog = TRUE;
|
||
|
|
||
|
/* Select Additional Components dialog */
|
||
|
GetPrivateProfileString("Dialog Select Additional Components", "Show Dialog", "", szShowDialog, sizeof(szShowDialog), szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Select Additional Components", "Title", "", diSelectAdditionalComponents.szTitle, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Select Additional Components", "Message0", "", diSelectAdditionalComponents.szMessage0, MAX_BUF, szFileIniConfig);
|
||
|
if(stricmp(szShowDialog, "TRUE") == 0)
|
||
|
diSelectAdditionalComponents.bShowDialog = TRUE;
|
||
|
|
||
|
/* OS/2 Integration dialog */
|
||
|
GetPrivateProfileString("Dialog OS/2 Integration", "Show Dialog", "", szShowDialog, sizeof(szShowDialog), szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog OS/2 Integration", "Title", "", diOS2Integration.szTitle, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog OS/2 Integration", "Message0", "", diOS2Integration.szMessage0, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog OS/2 Integration", "Message1", "", diOS2Integration.szMessage1, MAX_BUF, szFileIniConfig);
|
||
|
if(stricmp(szShowDialog, "TRUE") == 0)
|
||
|
diOS2Integration.bShowDialog = TRUE;
|
||
|
|
||
|
/* Additional Options dialog */
|
||
|
GetPrivateProfileString("Dialog Additional Options", "Show Dialog", "", szShowDialog, sizeof(szShowDialog), szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Additional Options", "Title", "", diAdditionalOptions.szTitle, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Additional Options", "Message0", "", diAdditionalOptions.szMessage0, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Additional Options", "Message1", "", diAdditionalOptions.szMessage1, MAX_BUF, szFileIniConfig);
|
||
|
|
||
|
GetPrivateProfileString("Dialog Additional Options", "Save Installer", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "TRUE") == 0)
|
||
|
diAdditionalOptions.bSaveInstaller = TRUE;
|
||
|
|
||
|
GetPrivateProfileString("Dialog Additional Options", "Recapture Homepage", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "TRUE") == 0)
|
||
|
diAdditionalOptions.bRecaptureHomepage = TRUE;
|
||
|
|
||
|
GetPrivateProfileString("Dialog Additional Options", "Show Homepage Option", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "TRUE") == 0)
|
||
|
diAdditionalOptions.bShowHomepageOption = TRUE;
|
||
|
|
||
|
if(stricmp(szShowDialog, "TRUE") == 0)
|
||
|
diAdditionalOptions.bShowDialog = TRUE;
|
||
|
|
||
|
/* Advanced Settings dialog */
|
||
|
GetPrivateProfileString("Dialog Advanced Settings", "Show Dialog", "", szShowDialog, sizeof(szShowDialog), szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Advanced Settings", "Title", "", diAdvancedSettings.szTitle, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Advanced Settings", "Message0", "", diAdvancedSettings.szMessage0, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Advanced Settings", "Proxy Server", "", diAdvancedSettings.szProxyServer, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Advanced Settings", "Proxy Port", "", diAdvancedSettings.szProxyPort, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Advanced Settings", "Proxy User", "", diAdvancedSettings.szProxyUser, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Advanced Settings", "Proxy Password", "", diAdvancedSettings.szProxyPasswd, MAX_BUF, szFileIniConfig);
|
||
|
if(stricmp(szShowDialog, "TRUE") == 0)
|
||
|
diAdvancedSettings.bShowDialog = TRUE;
|
||
|
|
||
|
GetPrivateProfileString("Dialog Advanced Settings", "Use Protocol", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "HTTP") == 0)
|
||
|
diAdditionalOptions.dwUseProtocol = UP_HTTP;
|
||
|
else
|
||
|
diAdditionalOptions.dwUseProtocol = UP_FTP;
|
||
|
|
||
|
GetPrivateProfileString("Dialog Advanced Settings", "Use Protocol Settings", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "DISABLED") == 0)
|
||
|
diAdditionalOptions.bUseProtocolSettings = FALSE;
|
||
|
else
|
||
|
diAdditionalOptions.bUseProtocolSettings = TRUE;
|
||
|
|
||
|
GetPrivateProfileString("Dialog Advanced Settings",
|
||
|
"Show Protocols",
|
||
|
"",
|
||
|
szBuf,
|
||
|
sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "FALSE") == 0)
|
||
|
diAdditionalOptions.bShowProtocols = FALSE;
|
||
|
else
|
||
|
diAdditionalOptions.bShowProtocols = TRUE;
|
||
|
|
||
|
/* Quick Launch dialog */
|
||
|
GetPrivateProfileString("Dialog Quick Launch", "Show Dialog", "", szShowDialog, sizeof(szShowDialog), szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Quick Launch", "Title", "", diQuickLaunch.szTitle, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Quick Launch", "Message0", "", diQuickLaunch.szMessage0, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Quick Launch", "Message1", "", diQuickLaunch.szMessage1, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Quick Launch", "Message2", "", diQuickLaunch.szMessage2, MAX_BUF, szFileIniConfig);
|
||
|
if(stricmp(szShowDialog, "TRUE") == 0)
|
||
|
diQuickLaunch.bShowDialog = TRUE;
|
||
|
GetPrivateProfileString("Dialog Quick Launch", "Turbo Mode", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "TRUE") == 0)
|
||
|
diQuickLaunch.bTurboMode = TRUE;
|
||
|
GetPrivateProfileString("Dialog Quick Launch", "Turbo Mode Enabled","", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "TRUE") == 0)
|
||
|
diQuickLaunch.bTurboModeEnabled = TRUE;
|
||
|
else
|
||
|
/* since turbo mode is disabled, make sure bTurboMode is FALSE */
|
||
|
diQuickLaunch.bTurboMode = FALSE;
|
||
|
|
||
|
/* Start Install dialog */
|
||
|
GetPrivateProfileString("Dialog Start Install", "Show Dialog", "", szShowDialog, sizeof(szShowDialog), szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Start Install", "Title", "", diStartInstall.szTitle, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Start Install", "Message Install", "", diStartInstall.szMessageInstall, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Start Install", "Message Download", "", diStartInstall.szMessageDownload, MAX_BUF, szFileIniConfig);
|
||
|
if(stricmp(szShowDialog, "TRUE") == 0)
|
||
|
diStartInstall.bShowDialog = TRUE;
|
||
|
|
||
|
/* Download dialog */
|
||
|
GetPrivateProfileString("Dialog Download", "Show Dialog", "", szShowDialog, sizeof(szShowDialog), szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Download", "Title", "", diDownload.szTitle, MAX_BUF_TINY, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Download", "Message Download0", "", diDownload.szMessageDownload0, MAX_BUF_MEDIUM, szFileIniConfig);
|
||
|
GetPrivateProfileString("Dialog Download", "Message Retry0", "", diDownload.szMessageRetry0, MAX_BUF_MEDIUM, szFileIniConfig);
|
||
|
if(stricmp(szShowDialog, "TRUE") == 0)
|
||
|
diDownload.bShowDialog = TRUE;
|
||
|
|
||
|
/* Reboot dialog */
|
||
|
GetPrivateProfileString("Dialog Reboot", "Show Dialog", "", szShowDialog, sizeof(szShowDialog), szFileIniConfig);
|
||
|
if(stricmp(szShowDialog, "TRUE") == 0)
|
||
|
diReboot.dwShowDialog = TRUE;
|
||
|
else if(stricmp(szShowDialog, "AUTO") == 0)
|
||
|
diReboot.dwShowDialog = AUTO;
|
||
|
|
||
|
GetPrivateProfileString("OS/2 Integration-Item0", "CheckBoxState", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
GetPrivateProfileString("OS/2 Integration-Item0", "Description", "", diOS2Integration.oiCBMakeDefaultBrowser.szDescription, MAX_BUF, szFileIniConfig);
|
||
|
/* Check to see if the checkbox need to be shown at all or not */
|
||
|
if(*diOS2Integration.oiCBMakeDefaultBrowser.szDescription != '\0')
|
||
|
diOS2Integration.oiCBMakeDefaultBrowser.bEnabled = TRUE;
|
||
|
/* check to see if the checkbox needs to be checked by default or not */
|
||
|
if(stricmp(szBuf, "TRUE") == 0)
|
||
|
diOS2Integration.oiCBMakeDefaultBrowser.bCheckBoxState = TRUE;
|
||
|
|
||
|
GetPrivateProfileString("OS/2 Integration-Item1", "CheckBoxState", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
GetPrivateProfileString("OS/2 Integration-Item1", "Description", "", diOS2Integration.oiCBAssociateHTML.szDescription, MAX_BUF, szFileIniConfig);
|
||
|
/* Check to see if the checkbox need to be shown at all or not */
|
||
|
if(*diOS2Integration.oiCBAssociateHTML.szDescription != '\0')
|
||
|
diOS2Integration.oiCBAssociateHTML.bEnabled = TRUE;
|
||
|
/* check to see if the checkbox needs to be checked by default or not */
|
||
|
if(stricmp(szBuf, "TRUE") == 0)
|
||
|
diOS2Integration.oiCBAssociateHTML.bCheckBoxState = TRUE;
|
||
|
|
||
|
GetPrivateProfileString("OS/2 Integration-Item2", "CheckBoxState", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
GetPrivateProfileString("OS/2 Integration-Item2", "Description", "", diOS2Integration.oiCBUpdateCONFIGSYS.szDescription, MAX_BUF, szFileIniConfig);
|
||
|
/* Check to see if the checkbox need to be shown at all or not */
|
||
|
if(*diOS2Integration.oiCBUpdateCONFIGSYS.szDescription != '\0')
|
||
|
diOS2Integration.oiCBUpdateCONFIGSYS.bEnabled = TRUE;
|
||
|
/* check to see if the checkbox needs to be checked by default or not */
|
||
|
if(stricmp(szBuf, "TRUE") == 0)
|
||
|
diOS2Integration.oiCBUpdateCONFIGSYS.bCheckBoxState = TRUE;
|
||
|
|
||
|
/* Read in the Site Selector Status */
|
||
|
GetPrivateProfileString("Site Selector", "Status", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "HIDE") == 0)
|
||
|
gulSiteSelectorStatus = SS_HIDE;
|
||
|
|
||
|
switch(sgProduct.ulMode)
|
||
|
{
|
||
|
case AUTO:
|
||
|
case SILENT:
|
||
|
diWelcome.bShowDialog = FALSE;
|
||
|
diLicense.bShowDialog = FALSE;
|
||
|
diSetupType.bShowDialog = FALSE;
|
||
|
diSelectComponents.bShowDialog = FALSE;
|
||
|
diSelectAdditionalComponents.bShowDialog = FALSE;
|
||
|
diOS2Integration.bShowDialog = FALSE;
|
||
|
diProgramFolder.bShowDialog = FALSE;
|
||
|
diQuickLaunch.bShowDialog = FALSE;
|
||
|
diAdditionalOptions.bShowDialog = FALSE;
|
||
|
diAdvancedSettings.bShowDialog = FALSE;
|
||
|
diStartInstall.bShowDialog = FALSE;
|
||
|
diDownload.bShowDialog = FALSE;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
InitSiComponents(szFileIniConfig);
|
||
|
InitSiteSelector(szFileIniConfig);
|
||
|
InitErrorMessageStream(szFileIniConfig);
|
||
|
|
||
|
/* get Default Setup Type */
|
||
|
GetPrivateProfileString("General", "Default Setup Type", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if((stricmp(szBuf, "Setup Type 0") == 0) && diSetupType.stSetupType0.bVisible)
|
||
|
{
|
||
|
ulSetupType = ST_RADIO0;
|
||
|
ulTempSetupType = ulSetupType;
|
||
|
}
|
||
|
else if((stricmp(szBuf, "Setup Type 1") == 0) && diSetupType.stSetupType1.bVisible)
|
||
|
{
|
||
|
ulSetupType = ST_RADIO1;
|
||
|
ulTempSetupType = ulSetupType;
|
||
|
}
|
||
|
else if((stricmp(szBuf, "Setup Type 2") == 0) && diSetupType.stSetupType2.bVisible)
|
||
|
{
|
||
|
ulSetupType = ST_RADIO2;
|
||
|
ulTempSetupType = ulSetupType;
|
||
|
}
|
||
|
else if((stricmp(szBuf, "Setup Type 3") == 0) && diSetupType.stSetupType3.bVisible)
|
||
|
{
|
||
|
ulSetupType = ST_RADIO3;
|
||
|
ulTempSetupType = ulSetupType;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if(diSetupType.stSetupType0.bVisible)
|
||
|
{
|
||
|
ulSetupType = ST_RADIO0;
|
||
|
ulTempSetupType = ulSetupType;
|
||
|
}
|
||
|
else if(diSetupType.stSetupType1.bVisible)
|
||
|
{
|
||
|
ulSetupType = ST_RADIO1;
|
||
|
ulTempSetupType = ulSetupType;
|
||
|
}
|
||
|
else if(diSetupType.stSetupType2.bVisible)
|
||
|
{
|
||
|
ulSetupType = ST_RADIO2;
|
||
|
ulTempSetupType = ulSetupType;
|
||
|
}
|
||
|
else if(diSetupType.stSetupType3.bVisible)
|
||
|
{
|
||
|
ulSetupType = ST_RADIO3;
|
||
|
ulTempSetupType = ulSetupType;
|
||
|
}
|
||
|
}
|
||
|
SiCNodeSetItemsSelected(ulSetupType);
|
||
|
|
||
|
/* get install size required in temp for component Xpcom. Sould be in Kilobytes */
|
||
|
GetPrivateProfileString("Core", "Install Size", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(*szBuf != '\0')
|
||
|
siCFXpcomFile.ulInstallSize = atoi(szBuf);
|
||
|
else
|
||
|
siCFXpcomFile.ulInstallSize = 0;
|
||
|
|
||
|
GetPrivateProfileString("Core", "Source", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(siCFXpcomFile.szSource, szBuf);
|
||
|
GetPrivateProfileString("Core", "Destination", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(siCFXpcomFile.szDestination, szBuf);
|
||
|
GetPrivateProfileString("Core", "Message", "", siCFXpcomFile.szMessage, MAX_BUF, szFileIniConfig);
|
||
|
GetPrivateProfileString("Core", "Cleanup", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "FALSE") == 0)
|
||
|
siCFXpcomFile.bCleanup = FALSE;
|
||
|
else
|
||
|
siCFXpcomFile.bCleanup = TRUE;
|
||
|
|
||
|
LogISProductInfo();
|
||
|
LogMSProductInfo();
|
||
|
CleanupXpcomFile();
|
||
|
ShowMessage(szMsgInitSetup, FALSE);
|
||
|
|
||
|
/* check the windows registry to see if a previous instance of setup finished downloading
|
||
|
* all the required archives. */
|
||
|
dwPreviousUnfinishedState = GetPreviousUnfinishedState();
|
||
|
gbPreviousUnfinishedDownload = dwPreviousUnfinishedState == PUS_DOWNLOAD;
|
||
|
if(gbPreviousUnfinishedDownload)
|
||
|
{
|
||
|
char szTitle[MAX_BUF_TINY];
|
||
|
|
||
|
switch(sgProduct.ulMode)
|
||
|
{
|
||
|
case NORMAL:
|
||
|
if(!GetPrivateProfileString("Messages", "STR_MESSAGEBOX_TITLE", "", szBuf, sizeof(szBuf), szFileIniInstall))
|
||
|
strcpy(szTitle, "Setup");
|
||
|
else
|
||
|
sprintf(szTitle, szBuf, sgProduct.szProductName);
|
||
|
|
||
|
GetPrivateProfileString("Strings", "Message Unfinished Download Restart", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(WinMessageBox(HWND_DESKTOP, hWndMain, szBuf, szTitle, 0, MB_YESNO | MB_ICONQUESTION) == MBID_NO)
|
||
|
{
|
||
|
UnsetSetupCurrentDownloadFile();
|
||
|
UnsetSetupState(); /* unset the download state so that the archives can be deleted */
|
||
|
DeleteArchives(DA_ONLY_IF_NOT_IN_ARCHIVES_LST);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else if((dwPreviousUnfinishedState == PUS_UNPACK_XPCOM) || (dwPreviousUnfinishedState == PUS_INSTALL_XPI))
|
||
|
{
|
||
|
char szTitle[MAX_BUF_TINY];
|
||
|
|
||
|
// need to set this var to true even though the previous state was not the
|
||
|
// download state. This is because it is used for disk space calculation
|
||
|
// wrt saved downloaded files and making sure CRC checks are performed on
|
||
|
// them.
|
||
|
gbPreviousUnfinishedDownload = TRUE;
|
||
|
switch(sgProduct.ulMode)
|
||
|
{
|
||
|
case NORMAL:
|
||
|
if(!GetPrivateProfileString("Messages", "STR_MESSAGEBOX_TITLE", "", szBuf, sizeof(szBuf), szFileIniInstall))
|
||
|
strcpy(szTitle, "Setup");
|
||
|
else
|
||
|
sprintf(szTitle, szBuf, sgProduct.szProductName);
|
||
|
|
||
|
GetPrivateProfileString("Strings", "Message Unfinished Install Xpi Restart", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(WinMessageBox(HWND_DESKTOP, hWndMain, szBuf, szTitle, 0, MB_YESNO | MB_ICONQUESTION) == MBID_NO)
|
||
|
{
|
||
|
UnsetSetupCurrentDownloadFile();
|
||
|
UnsetSetupState(); /* unset the installing xpis state so that the archives can be deleted */
|
||
|
DeleteArchives(DA_ONLY_IF_NOT_IN_ARCHIVES_LST);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
iRv = StartupCheckArchives();
|
||
|
return(iRv);
|
||
|
}
|
||
|
|
||
|
HRESULT ParseInstallIni()
|
||
|
{
|
||
|
/* get system font */
|
||
|
/* @MAK - we need to query this from somewhere */
|
||
|
strcpy(sgInstallGui.szDefinedFont, "9");
|
||
|
strcat(sgInstallGui.szDefinedFont, ".");
|
||
|
strcat(sgInstallGui.szDefinedFont, "WarpSans");
|
||
|
|
||
|
/* get defined font */
|
||
|
GetPrivateProfileString("General", "FONTNAME", "", sgInstallGui.szFontName, sizeof(sgInstallGui.szFontName), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "FONTSIZE", "", sgInstallGui.szFontSize, sizeof(sgInstallGui.szFontSize), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "CHARSET", "", sgInstallGui.szCharSet, sizeof(sgInstallGui.szCharSet), szFileIniInstall);
|
||
|
strcpy(sgInstallGui.szDefinedFont, sgInstallGui.szFontSize);
|
||
|
strcat(sgInstallGui.szDefinedFont, ".");
|
||
|
strcat(sgInstallGui.szDefinedFont, sgInstallGui.szFontName);
|
||
|
|
||
|
GetPrivateProfileString("General", "OK_", "", sgInstallGui.szOk_, sizeof(sgInstallGui.szOk_), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "OK", "", sgInstallGui.szOk, sizeof(sgInstallGui.szOk), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "CANCEL_", "", sgInstallGui.szCancel_, sizeof(sgInstallGui.szCancel_), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "CANCEL", "", sgInstallGui.szCancel, sizeof(sgInstallGui.szCancel), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "NEXT_", "", sgInstallGui.szNext_, sizeof(sgInstallGui.szNext_), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "BACK_", "", sgInstallGui.szBack_, sizeof(sgInstallGui.szBack_), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "PROXYSETTINGS_", "", sgInstallGui.szProxySettings_, sizeof(sgInstallGui.szProxySettings_), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "PROXYSETTINGS", "", sgInstallGui.szProxySettings, sizeof(sgInstallGui.szProxySettings), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "SERVER", "", sgInstallGui.szServer, sizeof(sgInstallGui.szServer), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "PORT", "", sgInstallGui.szPort, sizeof(sgInstallGui.szPort), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "USERID", "", sgInstallGui.szUserId, sizeof(sgInstallGui.szUserId), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "PASSWORD", "", sgInstallGui.szPassword, sizeof(sgInstallGui.szPassword), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "SELECTDIRECTORY", "", sgInstallGui.szSelectDirectory, sizeof(sgInstallGui.szSelectDirectory), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "DIRECTORIES_", "", sgInstallGui.szDirectories_, sizeof(sgInstallGui.szDirectories_), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "DRIVES_", "", sgInstallGui.szDrives_, sizeof(sgInstallGui.szDrives_), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "STATUS", "", sgInstallGui.szStatus, sizeof(sgInstallGui.szStatus), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "FILE", "", sgInstallGui.szFile, sizeof(sgInstallGui.szFile), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "URL", "", sgInstallGui.szUrl, sizeof(sgInstallGui.szUrl), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "TO", "", sgInstallGui.szTo, sizeof(sgInstallGui.szTo), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "ACCEPT_", "", sgInstallGui.szAccept_, sizeof(sgInstallGui.szAccept_), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "DECLINE_", "", sgInstallGui.szDecline_, sizeof(sgInstallGui.szDecline_), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "SETUPMESSAGE", "", sgInstallGui.szSetupMessage, sizeof(sgInstallGui.szSetupMessage), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "YESRESTART", "", sgInstallGui.szYesRestart, sizeof(sgInstallGui.szYesRestart), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "NORESTART", "", sgInstallGui.szNoRestart, sizeof(sgInstallGui.szNoRestart), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "ADDITIONALCOMPONENTS_", "", sgInstallGui.szAdditionalComponents_, sizeof(sgInstallGui.szAdditionalComponents_), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "DESCRIPTION", "", sgInstallGui.szDescription, sizeof(sgInstallGui.szDescription), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "TOTALDOWNLOADSIZE", "", sgInstallGui.szTotalDownloadSize, sizeof(sgInstallGui.szTotalDownloadSize), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "SPACEAVAILABLE", "", sgInstallGui.szSpaceAvailable, sizeof(sgInstallGui.szSpaceAvailable), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "COMPONENTS_", "", sgInstallGui.szComponents_, sizeof(sgInstallGui.szComponents_), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "DESTINATIONDIRECTORY", "", sgInstallGui.szDestinationDirectory, sizeof(sgInstallGui.szDestinationDirectory), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "BROWSE_", "", sgInstallGui.szBrowse_, sizeof(sgInstallGui.szBrowse_), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "CURRENTSETTINGS", "", sgInstallGui.szCurrentSettings, sizeof(sgInstallGui.szCurrentSettings), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "INSTALL_", "", sgInstallGui.szInstall_, sizeof(sgInstallGui.szInstall_), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "DELETE_", "", sgInstallGui.szDelete_, sizeof(sgInstallGui.szDelete_), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "EXTRACTING", "", sgInstallGui.szExtracting, sizeof(sgInstallGui.szExtracting), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "README", "", sgInstallGui.szReadme_, sizeof(sgInstallGui.szReadme_), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "PAUSE_", "", sgInstallGui.szPause_, sizeof(sgInstallGui.szPause_), szFileIniInstall);
|
||
|
GetPrivateProfileString("General", "RESUME_", "", sgInstallGui.szResume_, sizeof(sgInstallGui.szResume_), szFileIniInstall);
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL LocatePreviousPath(PSZ szMainSectionName, PSZ szPath, ULONG ulPathSize)
|
||
|
{
|
||
|
ULONG ulIndex;
|
||
|
char szIndex[MAX_BUF];
|
||
|
char szSection[MAX_BUF];
|
||
|
char szValue[MAX_BUF];
|
||
|
BOOL bFound;
|
||
|
|
||
|
bFound = FALSE;
|
||
|
ulIndex = -1;
|
||
|
while(!bFound)
|
||
|
{
|
||
|
++ulIndex;
|
||
|
_itoa(ulIndex, szIndex, 10);
|
||
|
strcpy(szSection, szMainSectionName);
|
||
|
strcat(szSection, szIndex);
|
||
|
|
||
|
GetPrivateProfileString(szSection, "App", "", szValue, sizeof(szValue), szFileIniConfig);
|
||
|
if(*szValue != '\0')
|
||
|
bFound = LocatePathOS2INI(szSection, szPath, ulPathSize);
|
||
|
else
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return(bFound);
|
||
|
}
|
||
|
|
||
|
DWORD GetTotalArchivesToDownload()
|
||
|
{
|
||
|
DWORD dwIndex0;
|
||
|
DWORD dwTotalArchivesToDownload;
|
||
|
siC *siCObject = NULL;
|
||
|
char szIndex0[MAX_BUF];
|
||
|
|
||
|
dwTotalArchivesToDownload = 0;
|
||
|
dwIndex0 = 0;
|
||
|
_itoa(dwIndex0, szIndex0, 10);
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
while(siCObject)
|
||
|
{
|
||
|
if(siCObject->dwAttributes & SIC_SELECTED)
|
||
|
{
|
||
|
if(LocateJar(siCObject, NULL, 0, gbPreviousUnfinishedDownload) == AP_NOT_FOUND)
|
||
|
{
|
||
|
++dwTotalArchivesToDownload;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
++dwIndex0;
|
||
|
_itoa(dwIndex0, szIndex0, 10);
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
}
|
||
|
|
||
|
return(dwTotalArchivesToDownload);
|
||
|
}
|
||
|
|
||
|
BOOL LocatePathOS2INI(PSZ szSection, PSZ szPath, ULONG ulPathSize)
|
||
|
{
|
||
|
char szApp[MAX_BUF];
|
||
|
char szHRoot[MAX_BUF];
|
||
|
char szName[MAX_BUF];
|
||
|
char szVerifyExistence[MAX_BUF];
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szIni[MAX_BUF];
|
||
|
BOOL bDecryptKey;
|
||
|
BOOL bContainsFilename;
|
||
|
BOOL bReturn;
|
||
|
HINI hini = HINI_USERPROFILE;
|
||
|
|
||
|
bReturn = FALSE;
|
||
|
GetPrivateProfileString(szSection, "App", "", szApp, sizeof(szApp), szFileIniConfig);
|
||
|
if(*szApp != '\0')
|
||
|
{
|
||
|
bReturn = FALSE;
|
||
|
memset(szPath, 0, ulPathSize);
|
||
|
|
||
|
GetPrivateProfileString(szSection, "Key", "", szName, sizeof(szName), szFileIniConfig);
|
||
|
GetPrivateProfileString(szSection, "Decrypt App", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "FALSE") == 0)
|
||
|
bDecryptKey = FALSE;
|
||
|
else
|
||
|
bDecryptKey = TRUE;
|
||
|
|
||
|
/* check for both 'Verify Existance' and 'Verify Existence' */
|
||
|
GetPrivateProfileString(szSection, "Verify Existence", "", szVerifyExistence, sizeof(szVerifyExistence), szFileIniConfig);
|
||
|
if(*szVerifyExistence == '\0')
|
||
|
GetPrivateProfileString(szSection, "Verify Existance", "", szVerifyExistence, sizeof(szVerifyExistence), szFileIniConfig);
|
||
|
|
||
|
GetPrivateProfileString(szSection, "Contains Filename", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "TRUE") == 0)
|
||
|
bContainsFilename = TRUE;
|
||
|
else
|
||
|
bContainsFilename = FALSE;
|
||
|
|
||
|
if(bDecryptKey == TRUE)
|
||
|
{
|
||
|
DecryptString(szBuf, szApp);
|
||
|
strcpy(szApp, szBuf);
|
||
|
}
|
||
|
|
||
|
GetPrivateProfileString(szSection, "INI", "", szIni, sizeof(szIni), szFileIniConfig);
|
||
|
if (szIni[0]) {
|
||
|
BOOL bDecryptINI;
|
||
|
GetPrivateProfileString(szSection, "Decrypt INI", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "FALSE")) {
|
||
|
DecryptString(szBuf, szIni);
|
||
|
strcpy(szIni, szBuf);
|
||
|
}
|
||
|
hini = PrfOpenProfile((HAB)0, szIni);
|
||
|
}
|
||
|
|
||
|
PrfQueryProfileString(hini, szApp, szName, "", szBuf, sizeof(szBuf));
|
||
|
if (szIni[0]) {
|
||
|
PrfCloseProfile(hini);
|
||
|
}
|
||
|
if(*szBuf != '\0')
|
||
|
{
|
||
|
if(stricmp(szVerifyExistence, "FILE") == 0)
|
||
|
{
|
||
|
if(FileExists(szBuf))
|
||
|
{
|
||
|
if(bContainsFilename == TRUE)
|
||
|
ParsePath(szBuf, szPath, ulPathSize, FALSE, PP_PATH_ONLY);
|
||
|
else
|
||
|
strcpy(szPath, szBuf);
|
||
|
|
||
|
bReturn = TRUE;
|
||
|
}
|
||
|
else
|
||
|
bReturn = FALSE;
|
||
|
}
|
||
|
else if(stricmp(szVerifyExistence, "PATH") == 0)
|
||
|
{
|
||
|
if(bContainsFilename == TRUE)
|
||
|
ParsePath(szBuf, szPath, ulPathSize, FALSE, PP_PATH_ONLY);
|
||
|
else
|
||
|
strcpy(szPath, szBuf);
|
||
|
|
||
|
if(FileExists(szPath))
|
||
|
bReturn = TRUE;
|
||
|
else
|
||
|
bReturn = FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if(bContainsFilename == TRUE)
|
||
|
ParsePath(szBuf, szPath, ulPathSize, FALSE, PP_PATH_ONLY);
|
||
|
else
|
||
|
strcpy(szPath, szBuf);
|
||
|
|
||
|
bReturn = TRUE;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return(bReturn);
|
||
|
}
|
||
|
|
||
|
void SetCustomType()
|
||
|
{
|
||
|
if(diSetupType.stSetupType3.bVisible == TRUE)
|
||
|
sgProduct.ulCustomType = ST_RADIO3;
|
||
|
else if(diSetupType.stSetupType2.bVisible == TRUE)
|
||
|
sgProduct.ulCustomType = ST_RADIO2;
|
||
|
else if(diSetupType.stSetupType1.bVisible == TRUE)
|
||
|
sgProduct.ulCustomType = ST_RADIO1;
|
||
|
else if(diSetupType.stSetupType0.bVisible == TRUE)
|
||
|
sgProduct.ulCustomType = ST_RADIO0;
|
||
|
}
|
||
|
|
||
|
void STSetVisibility(st *stSetupType)
|
||
|
{
|
||
|
if(*(stSetupType->szDescriptionShort) == '\0')
|
||
|
stSetupType->bVisible = FALSE;
|
||
|
else
|
||
|
stSetupType->bVisible = TRUE;
|
||
|
}
|
||
|
|
||
|
HRESULT DecryptVariable(PSZ szVariable, ULONG ulVariableSize)
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szBuf2[MAX_BUF];
|
||
|
char szKey[MAX_BUF];
|
||
|
char szName[MAX_BUF];
|
||
|
char szValue[MAX_BUF];
|
||
|
char szLookupSection[MAX_BUF];
|
||
|
HKEY hkeyRoot;
|
||
|
|
||
|
/* zero out the memory allocations */
|
||
|
memset(szBuf, 0, sizeof(szBuf));
|
||
|
memset(szKey, 0, sizeof(szKey));
|
||
|
memset(szName, 0, sizeof(szName));
|
||
|
memset(szValue, 0, sizeof(szValue));
|
||
|
memset(szBuf2, 0, sizeof(szBuf2));
|
||
|
memset(szLookupSection, 0, sizeof(szLookupSection));
|
||
|
|
||
|
if(stricmp(szVariable, "PROGRAMFILESDIR") == 0)
|
||
|
{
|
||
|
/* @MAK Needed for install */
|
||
|
}
|
||
|
else if(stricmp(szVariable, "INSTALLDRIVE") == 0)
|
||
|
{
|
||
|
/* parse for "C:" */
|
||
|
szVariable[0] = sgProduct.szPath[0];
|
||
|
szVariable[1] = sgProduct.szPath[1];
|
||
|
szVariable[2] = '\0';
|
||
|
}
|
||
|
else if(stricmp(szVariable, "STARTUP") == 0)
|
||
|
{
|
||
|
HOBJECT hobj;
|
||
|
hobj = WinQueryObject("<WP_STARTUP>");
|
||
|
WinQueryObjectPath(hobj, szVariable, ulVariableSize);
|
||
|
}
|
||
|
else if(stricmp(szVariable, "DESKTOP") == 0)
|
||
|
{
|
||
|
HOBJECT hobj;
|
||
|
hobj = WinQueryObject("<WP_DESKTOP>");
|
||
|
WinQueryObjectPath(hobj, szVariable, ulVariableSize);
|
||
|
}
|
||
|
else if(stricmp(szVariable, "WARPCENTER") == 0)
|
||
|
{
|
||
|
HOBJECT hobj;
|
||
|
hobj = WinQueryObject("<WP_WARPCENTER????>");
|
||
|
WinQueryObjectPath(hobj, szVariable, ulVariableSize);
|
||
|
}
|
||
|
else if(stricmp(szVariable, "WIZTEMP") == 0)
|
||
|
{
|
||
|
/* parse for the "c:\Temp" path */
|
||
|
strcpy(szVariable, szTempDir);
|
||
|
if(szVariable[strlen(szVariable) - 1] == '\\')
|
||
|
szVariable[strlen(szVariable) - 1] = '\0';
|
||
|
}
|
||
|
else if(stricmp(szVariable, "TEMP") == 0)
|
||
|
{
|
||
|
/* parse for the "c:\Temp" path */
|
||
|
strcpy(szVariable, szOSTempDir);
|
||
|
if(szVariable[strlen(szVariable) - 1] == '\\')
|
||
|
szVariable[strlen(szVariable) - 1] = '\0';
|
||
|
}
|
||
|
else if(stricmp(szVariable, "OS2DISK") == 0)
|
||
|
{
|
||
|
/* Locate the drive that OS/2 is installed on, and only use the drive letter and the ':' character (C:). */
|
||
|
ULONG ulBootDrive = 0;
|
||
|
memset(szVariable, '\0', MAX_BUF);
|
||
|
DosQuerySysInfo(QSV_BOOT_DRIVE, QSV_BOOT_DRIVE,
|
||
|
&ulBootDrive, sizeof(ulBootDrive));
|
||
|
szVariable[0] = 'A' - 1 + ulBootDrive;
|
||
|
szVariable[1] = ':';
|
||
|
}
|
||
|
else if(stricmp(szVariable, "OS2DIR") == 0)
|
||
|
{
|
||
|
/* Locate the "OS2" directory */
|
||
|
ULONG ulBootDrive = 0;
|
||
|
APIRET rc;
|
||
|
char buffer[] = " :\\OS2";
|
||
|
DosQuerySysInfo(QSV_BOOT_DRIVE, QSV_BOOT_DRIVE,
|
||
|
&ulBootDrive, sizeof(ulBootDrive));
|
||
|
buffer[0] = 'A' - 1 + ulBootDrive;
|
||
|
strcpy(szVariable, buffer);
|
||
|
}
|
||
|
else if(stricmp(szVariable, "OS2SYSDIR") == 0)
|
||
|
{
|
||
|
/* Locate the "OS2\SYSTEM" directory */
|
||
|
ULONG ulBootDrive = 0;
|
||
|
APIRET rc;
|
||
|
char buffer[] = " :\\OS2\\SYSTEM";
|
||
|
DosQuerySysInfo(QSV_BOOT_DRIVE, QSV_BOOT_DRIVE,
|
||
|
&ulBootDrive, sizeof(ulBootDrive));
|
||
|
buffer[0] = 'A' - 1 + ulBootDrive;
|
||
|
strcpy(szVariable, buffer);
|
||
|
}
|
||
|
else if( (stricmp(szVariable, "JRE LIB PATH") == 0)
|
||
|
|| (stricmp(szVariable, "JRE BIN PATH") == 0) )
|
||
|
{
|
||
|
/* @MAK - we could do this */
|
||
|
}
|
||
|
else if(stricmp(szVariable, "JRE PATH") == 0)
|
||
|
{
|
||
|
/* @MAK - we could do this */
|
||
|
}
|
||
|
else if(stricmp(szVariable, "SETUP PATH") == 0)
|
||
|
{
|
||
|
strcpy(szVariable, sgProduct.szPath);
|
||
|
if(*sgProduct.szSubPath != '\0')
|
||
|
{
|
||
|
AppendBackSlash(szVariable, ulVariableSize);
|
||
|
strcat(szVariable, sgProduct.szSubPath);
|
||
|
}
|
||
|
}
|
||
|
else if(stricmp(szVariable, "Default Path") == 0)
|
||
|
{
|
||
|
strcpy(szVariable, sgProduct.szPath);
|
||
|
if(*sgProduct.szSubPath != '\0')
|
||
|
{
|
||
|
AppendBackSlash(szVariable, ulVariableSize);
|
||
|
strcat(szVariable, sgProduct.szSubPath);
|
||
|
}
|
||
|
}
|
||
|
else if(stricmp(szVariable, "SETUP STARTUP PATH") == 0)
|
||
|
{
|
||
|
strcpy(szVariable, szSetupDir);
|
||
|
}
|
||
|
else if(stricmp(szVariable, "Default Folder") == 0)
|
||
|
{
|
||
|
strcpy(szVariable, sgProduct.szProgramFolderPath);
|
||
|
AppendBackSlash(szVariable, ulVariableSize);
|
||
|
strcat(szVariable, sgProduct.szProgramFolderName);
|
||
|
}
|
||
|
else if(stricmp(szVariable, "Product CurrentVersion") == 0)
|
||
|
{
|
||
|
char szApp[MAX_BUF];
|
||
|
|
||
|
sprintf(szApp, "%s", sgProduct.szProductNameInternal);
|
||
|
|
||
|
/* parse for the current Netscape INI entry */
|
||
|
PrfQueryProfileString(HINI_USERPROFILE, szApp, "CurrentVersion", "",
|
||
|
szBuf, sizeof(szBuf));
|
||
|
|
||
|
if(*szBuf == '\0')
|
||
|
return(FALSE);
|
||
|
|
||
|
strcpy(szVariable, szBuf);
|
||
|
}
|
||
|
else if(stricmp(szVariable, "Product PreviousVersion") == 0)
|
||
|
{
|
||
|
char szApp[MAX_BUF];
|
||
|
|
||
|
sprintf(szApp, "%s", sgProduct.szProductNamePrevious);
|
||
|
|
||
|
/* parse for the current Netscape INI entry */
|
||
|
PrfQueryProfileString(HINI_USERPROFILE, szApp, "CurrentVersion", "",
|
||
|
szBuf, sizeof(szBuf));
|
||
|
|
||
|
if(*szBuf == '\0')
|
||
|
return(FALSE);
|
||
|
|
||
|
sprintf(szVariable, "%s %s", sgProduct.szProductNamePrevious, szBuf);
|
||
|
}
|
||
|
else
|
||
|
return(FALSE);
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
HRESULT DecryptString(PSZ szOutputStr, PSZ szInputStr)
|
||
|
{
|
||
|
ULONG ulLenInputStr;
|
||
|
ULONG ulCounter;
|
||
|
ULONG ulVar;
|
||
|
ULONG ulPrepend;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szOutuptStrTemp[MAX_BUF];
|
||
|
char szVariable[MAX_BUF];
|
||
|
char szPrepend[MAX_BUF];
|
||
|
char szAppend[MAX_BUF];
|
||
|
char szResultStr[MAX_BUF];
|
||
|
BOOL bFoundVar;
|
||
|
BOOL bBeginParse;
|
||
|
BOOL bDecrypted;
|
||
|
|
||
|
/* zero out the memory addresses */
|
||
|
memset(szBuf, '\0', MAX_BUF);
|
||
|
memset(szVariable, '\0', MAX_BUF);
|
||
|
memset(szPrepend, '\0', MAX_BUF);
|
||
|
memset(szAppend, '\0', MAX_BUF);
|
||
|
memset(szResultStr, '\0', MAX_BUF);
|
||
|
|
||
|
strcpy(szPrepend, szInputStr);
|
||
|
ulLenInputStr = strlen(szInputStr);
|
||
|
bBeginParse = FALSE;
|
||
|
bFoundVar = FALSE;
|
||
|
|
||
|
for(ulCounter = 0; ulCounter < ulLenInputStr; ulCounter++)
|
||
|
{
|
||
|
if((szInputStr[ulCounter] == ']') && bBeginParse)
|
||
|
break;
|
||
|
|
||
|
if(bBeginParse)
|
||
|
szVariable[ulVar++] = szInputStr[ulCounter];
|
||
|
|
||
|
if((szInputStr[ulCounter] == '[') && !bBeginParse)
|
||
|
{
|
||
|
ulVar = 0;
|
||
|
ulPrepend = ulCounter;
|
||
|
bBeginParse = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(ulCounter == ulLenInputStr)
|
||
|
/* did not find anything to expand. */
|
||
|
ulCounter = 0;
|
||
|
else
|
||
|
{
|
||
|
bFoundVar = TRUE;
|
||
|
++ulCounter;
|
||
|
}
|
||
|
|
||
|
if(bFoundVar)
|
||
|
{
|
||
|
strcpy(szAppend, &szInputStr[ulCounter]);
|
||
|
|
||
|
szPrepend[ulPrepend] = '\0';
|
||
|
|
||
|
/* if Variable is "XPI PATH", do special processing */
|
||
|
if(stricmp(szVariable, "XPI PATH") == 0)
|
||
|
{
|
||
|
strcpy(szBuf, sgProduct.szAlternateArchiveSearchPath);
|
||
|
RemoveBackSlash(szBuf);
|
||
|
strcpy(szOutuptStrTemp, szPrepend);
|
||
|
strcat(szOutuptStrTemp, szBuf);
|
||
|
strcat(szOutuptStrTemp, szAppend);
|
||
|
|
||
|
if((*sgProduct.szAlternateArchiveSearchPath != '\0') && FileExists(szOutuptStrTemp))
|
||
|
{
|
||
|
strcpy(szVariable, sgProduct.szAlternateArchiveSearchPath);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
strcpy(szBuf, szSetupDir);
|
||
|
RemoveBackSlash(szBuf);
|
||
|
strcpy(szOutuptStrTemp, szPrepend);
|
||
|
strcat(szOutuptStrTemp, szBuf);
|
||
|
strcat(szOutuptStrTemp, szAppend);
|
||
|
|
||
|
if(!FileExists(szOutuptStrTemp))
|
||
|
strcpy(szVariable, szTempDir);
|
||
|
else
|
||
|
strcpy(szVariable, szSetupDir);
|
||
|
}
|
||
|
|
||
|
RemoveBackSlash(szVariable);
|
||
|
bDecrypted = TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
bDecrypted = DecryptVariable(szVariable, sizeof(szVariable));
|
||
|
}
|
||
|
|
||
|
if(!bDecrypted)
|
||
|
{
|
||
|
/* Variable was not able to be dcripted. */
|
||
|
/* Leave the variable as it was read in by adding the '[' and ']' */
|
||
|
/* characters back to the variable. */
|
||
|
strcpy(szBuf, "[");
|
||
|
strcat(szBuf, szVariable);
|
||
|
strcat(szBuf, "]");
|
||
|
strcpy(szVariable, szBuf);
|
||
|
}
|
||
|
|
||
|
strcpy(szOutputStr, szPrepend);
|
||
|
strcat(szOutputStr, szVariable);
|
||
|
strcat(szOutputStr, szAppend);
|
||
|
|
||
|
if(bDecrypted)
|
||
|
{
|
||
|
DecryptString(szResultStr, szOutputStr);
|
||
|
strcpy(szOutputStr, szResultStr);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
strcpy(szOutputStr, szInputStr);
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
int ExtractDirEntries(char* directory, void* vZip)
|
||
|
{
|
||
|
int err;
|
||
|
int result;
|
||
|
char buf[512]; // XXX: need an XP "max path"
|
||
|
|
||
|
int paths = 1;
|
||
|
if(paths)
|
||
|
{
|
||
|
void* find = ZIP_FindInit(vZip, directory);
|
||
|
|
||
|
if(find)
|
||
|
{
|
||
|
int prefix_length = 0;
|
||
|
|
||
|
if(directory)
|
||
|
prefix_length = strlen(directory) - 1;
|
||
|
|
||
|
if(prefix_length >= sizeof(buf)-1)
|
||
|
return ZIP_ERR_GENERAL;
|
||
|
|
||
|
err = ZIP_FindNext( find, buf, sizeof(buf) );
|
||
|
while ( err == ZIP_OK )
|
||
|
{
|
||
|
CreateDirectoriesAll(buf, FALSE);
|
||
|
if(buf[strlen(buf) - 1] != '/')
|
||
|
// only extract if it's a file
|
||
|
result = ZIP_ExtractFile(vZip, buf, buf);
|
||
|
err = ZIP_FindNext( find, buf, sizeof(buf) );
|
||
|
}
|
||
|
ZIP_FindFree( find );
|
||
|
}
|
||
|
else
|
||
|
err = ZIP_ERR_GENERAL;
|
||
|
|
||
|
if ( err == ZIP_ERR_FNF )
|
||
|
return ZIP_OK; // found them all
|
||
|
}
|
||
|
|
||
|
return ZIP_ERR_GENERAL;
|
||
|
}
|
||
|
|
||
|
#define S_IFMT (S_IFDIR | S_IFREG)
|
||
|
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
|
||
|
|
||
|
HRESULT FileExists(PSZ szFile)
|
||
|
{
|
||
|
struct stat st;
|
||
|
int statrv;
|
||
|
|
||
|
statrv = stat(szFile, &st);
|
||
|
if (statrv == 0)
|
||
|
if (S_ISDIR(st.st_mode))
|
||
|
return FILE_DIRECTORY;
|
||
|
else
|
||
|
return(TRUE);
|
||
|
else if ((strlen(szFile) == 2) && (szFile[1] == ':'))
|
||
|
{
|
||
|
char temp[4] = {0};
|
||
|
strcpy(temp, szFile);
|
||
|
strcat(temp, "\\");
|
||
|
statrv = stat(temp, &st);
|
||
|
if (statrv == 0)
|
||
|
return FILE_DIRECTORY;
|
||
|
}
|
||
|
return (FALSE);
|
||
|
}
|
||
|
|
||
|
BOOL isFAT(char* szPath)
|
||
|
{
|
||
|
APIRET rc;
|
||
|
ULONG ulSize;
|
||
|
PFSQBUFFER2 pfsqbuf2;
|
||
|
CHAR szDrive[3];
|
||
|
|
||
|
ulSize = sizeof(FSQBUFFER2) + 3 * CCHMAXPATH;
|
||
|
pfsqbuf2 = (PFSQBUFFER2)malloc(ulSize);
|
||
|
strncpy(szDrive, szPath, 2);
|
||
|
szDrive[2] = '\0';
|
||
|
|
||
|
DosError(FERR_DISABLEHARDERR);
|
||
|
rc = DosQueryFSAttach(szDrive, 0, FSAIL_QUERYNAME,
|
||
|
pfsqbuf2, &ulSize);
|
||
|
DosError(FERR_ENABLEHARDERR);
|
||
|
|
||
|
if (rc == NO_ERROR) {
|
||
|
if (strcmp(pfsqbuf2->szFSDName + pfsqbuf2->cbName, "FAT") != 0)
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL NeedReboot()
|
||
|
{
|
||
|
if(diReboot.dwShowDialog == AUTO)
|
||
|
return(bReboot);
|
||
|
else
|
||
|
return(diReboot.dwShowDialog);
|
||
|
}
|
||
|
|
||
|
BOOL DeleteWGetLog(void)
|
||
|
{
|
||
|
char szFile[MAX_BUF];
|
||
|
BOOL bFileExists = FALSE;
|
||
|
|
||
|
memset(szFile, 0, sizeof(szFile));
|
||
|
|
||
|
strcpy(szFile, szTempDir);
|
||
|
AppendBackSlash(szFile, sizeof(szFile));
|
||
|
strcat(szFile, FILE_WGET_LOG);
|
||
|
|
||
|
if(FileExists(szFile))
|
||
|
bFileExists = TRUE;
|
||
|
|
||
|
DosDelete(szFile);
|
||
|
return(bFileExists);
|
||
|
}
|
||
|
|
||
|
BOOL DeleteIdiGetConfigIni()
|
||
|
{
|
||
|
char szFileIdiGetConfigIni[MAX_BUF];
|
||
|
BOOL bFileExists = FALSE;
|
||
|
|
||
|
memset(szFileIdiGetConfigIni, 0, sizeof(szFileIdiGetConfigIni));
|
||
|
|
||
|
strcpy(szFileIdiGetConfigIni, szTempDir);
|
||
|
AppendBackSlash(szFileIdiGetConfigIni, sizeof(szFileIdiGetConfigIni));
|
||
|
strcat(szFileIdiGetConfigIni, FILE_IDI_GETCONFIGINI);
|
||
|
if(FileExists(szFileIdiGetConfigIni))
|
||
|
{
|
||
|
bFileExists = TRUE;
|
||
|
}
|
||
|
DosDelete(szFileIdiGetConfigIni);
|
||
|
return(bFileExists);
|
||
|
}
|
||
|
|
||
|
BOOL DeleteInstallLogFile(char *szFile)
|
||
|
{
|
||
|
char szInstallLogFile[MAX_BUF];
|
||
|
BOOL bFileExists = FALSE;
|
||
|
|
||
|
strcpy(szInstallLogFile, szTempDir);
|
||
|
AppendBackSlash(szInstallLogFile, sizeof(szInstallLogFile));
|
||
|
strcat(szInstallLogFile, szFile);
|
||
|
|
||
|
if(FileExists(szInstallLogFile))
|
||
|
{
|
||
|
bFileExists = TRUE;
|
||
|
DosDelete(szInstallLogFile);
|
||
|
}
|
||
|
|
||
|
return(bFileExists);
|
||
|
}
|
||
|
|
||
|
BOOL DeleteIniRedirect()
|
||
|
{
|
||
|
char szFileIniRedirect[MAX_BUF];
|
||
|
BOOL bFileExists = FALSE;
|
||
|
|
||
|
memset(szFileIniRedirect, 0, sizeof(szFileIniRedirect));
|
||
|
|
||
|
strcpy(szFileIniRedirect, szTempDir);
|
||
|
AppendBackSlash(szFileIniRedirect, sizeof(szFileIniRedirect));
|
||
|
strcat(szFileIniRedirect, FILE_INI_REDIRECT);
|
||
|
if(FileExists(szFileIniRedirect))
|
||
|
{
|
||
|
bFileExists = TRUE;
|
||
|
}
|
||
|
DosDelete(szFileIniRedirect);
|
||
|
return(bFileExists);
|
||
|
}
|
||
|
|
||
|
BOOL DeleteIdiGetRedirect()
|
||
|
{
|
||
|
char szFileIdiGetRedirect[MAX_BUF];
|
||
|
BOOL bFileExists = FALSE;
|
||
|
|
||
|
memset(szFileIdiGetRedirect, 0, sizeof(szFileIdiGetRedirect));
|
||
|
|
||
|
strcpy(szFileIdiGetRedirect, szTempDir);
|
||
|
AppendBackSlash(szFileIdiGetRedirect, sizeof(szFileIdiGetRedirect));
|
||
|
strcat(szFileIdiGetRedirect, FILE_IDI_GETREDIRECT);
|
||
|
if(FileExists(szFileIdiGetRedirect))
|
||
|
{
|
||
|
bFileExists = TRUE;
|
||
|
}
|
||
|
DosDelete(szFileIdiGetRedirect);
|
||
|
return(bFileExists);
|
||
|
}
|
||
|
|
||
|
BOOL DeleteIdiGetArchives()
|
||
|
{
|
||
|
char szFileIdiGetArchives[MAX_BUF];
|
||
|
BOOL bFileExists = FALSE;
|
||
|
|
||
|
memset(szFileIdiGetArchives, 0, sizeof(szFileIdiGetArchives));
|
||
|
|
||
|
strcpy(szFileIdiGetArchives, szTempDir);
|
||
|
AppendBackSlash(szFileIdiGetArchives, sizeof(szFileIdiGetArchives));
|
||
|
strcat(szFileIdiGetArchives, FILE_IDI_GETARCHIVES);
|
||
|
if(FileExists(szFileIdiGetArchives))
|
||
|
{
|
||
|
bFileExists = TRUE;
|
||
|
}
|
||
|
DosDelete(szFileIdiGetArchives);
|
||
|
return(bFileExists);
|
||
|
}
|
||
|
|
||
|
BOOL DeleteIdiFileIniConfig()
|
||
|
{
|
||
|
char szFileIniConfig[MAX_BUF];
|
||
|
BOOL bFileExists = FALSE;
|
||
|
|
||
|
memset(szFileIniConfig, 0,sizeof(szFileIniConfig));
|
||
|
|
||
|
strcpy(szFileIniConfig, szTempDir);
|
||
|
AppendBackSlash(szFileIniConfig, sizeof(szFileIniConfig));
|
||
|
strcat(szFileIniConfig, FILE_INI_CONFIG);
|
||
|
if(FileExists(szFileIniConfig))
|
||
|
{
|
||
|
bFileExists = TRUE;
|
||
|
}
|
||
|
DosDelete(szFileIniConfig);
|
||
|
return(bFileExists);
|
||
|
}
|
||
|
|
||
|
BOOL DeleteIdiFileIniInstall()
|
||
|
{
|
||
|
char szFileIniInstall[MAX_BUF];
|
||
|
BOOL bFileExists = FALSE;
|
||
|
|
||
|
memset(szFileIniInstall, 0, sizeof(szFileIniInstall));
|
||
|
|
||
|
strcpy(szFileIniInstall, szTempDir);
|
||
|
AppendBackSlash(szFileIniInstall, sizeof(szFileIniInstall));
|
||
|
strcat(szFileIniInstall, FILE_INI_INSTALL);
|
||
|
if(FileExists(szFileIniInstall))
|
||
|
{
|
||
|
bFileExists = TRUE;
|
||
|
}
|
||
|
DosDelete(szFileIniInstall);
|
||
|
return(bFileExists);
|
||
|
}
|
||
|
|
||
|
void DeleteArchives(DWORD dwDeleteCheck)
|
||
|
{
|
||
|
DWORD dwIndex0;
|
||
|
char szArchiveName[MAX_BUF];
|
||
|
siC *siCObject = NULL;
|
||
|
|
||
|
memset(szArchiveName, 0, sizeof(szArchiveName));
|
||
|
|
||
|
if((!bSDUserCanceled) && (GetPreviousUnfinishedState() == PUS_NONE))
|
||
|
{
|
||
|
dwIndex0 = 0;
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
while(siCObject)
|
||
|
{
|
||
|
strcpy(szArchiveName, szTempDir);
|
||
|
AppendBackSlash(szArchiveName, sizeof(szArchiveName));
|
||
|
strcat(szArchiveName, siCObject->szArchiveName);
|
||
|
|
||
|
switch(dwDeleteCheck)
|
||
|
{
|
||
|
case DA_ONLY_IF_IN_ARCHIVES_LST:
|
||
|
if(IsInArchivesLst(siCObject, FALSE))
|
||
|
DosDelete(szArchiveName);
|
||
|
break;
|
||
|
|
||
|
case DA_ONLY_IF_NOT_IN_ARCHIVES_LST:
|
||
|
if(!IsInArchivesLst(siCObject, FALSE))
|
||
|
DosDelete(szArchiveName);
|
||
|
break;
|
||
|
|
||
|
case DA_IGNORE_ARCHIVES_LST:
|
||
|
default:
|
||
|
DosDelete(szArchiveName);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
++dwIndex0;
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
}
|
||
|
|
||
|
DeleteIniRedirect();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CleanTempFiles()
|
||
|
{
|
||
|
DeleteIdiGetConfigIni();
|
||
|
DeleteIdiGetArchives();
|
||
|
DeleteIdiGetRedirect();
|
||
|
|
||
|
/* do not delete config.ini file.
|
||
|
if it was uncompressed from the self-extracting .exe file,
|
||
|
then it will be deleted automatically.
|
||
|
Right now the config.ini does not get downloaded, so we
|
||
|
don't have to worry about that case
|
||
|
*/
|
||
|
DeleteIdiFileIniConfig();
|
||
|
DeleteIdiFileIniInstall();
|
||
|
DeleteArchives(DA_IGNORE_ARCHIVES_LST);
|
||
|
DeleteInstallLogFile(FILE_INSTALL_LOG);
|
||
|
DeleteInstallLogFile(FILE_INSTALL_STATUS_LOG);
|
||
|
}
|
||
|
|
||
|
void SendErrorMessage(void)
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
char *szPartialEscapedURL = NULL;
|
||
|
|
||
|
/* append to the message stream the list of components that either had
|
||
|
* network retries or crc retries */
|
||
|
LogMSDownloadFileStatus();
|
||
|
|
||
|
/* replace this function call with a call to xpnet */
|
||
|
if((szPartialEscapedURL = nsEscape(gErrorMessageStream.szMessage,
|
||
|
url_Path)) != NULL)
|
||
|
{
|
||
|
char szWGetLog[MAX_BUF];
|
||
|
char szMsg[MAX_BUF];
|
||
|
char *szFullURL = NULL;
|
||
|
DWORD dwSize;
|
||
|
|
||
|
strcpy(szWGetLog, szTempDir);
|
||
|
AppendBackSlash(szWGetLog, sizeof(szWGetLog));
|
||
|
strcat(szWGetLog, FILE_WGET_LOG);
|
||
|
|
||
|
/* take into account '?' and '\0' chars */
|
||
|
dwSize = strlen(gErrorMessageStream.szURL) +
|
||
|
strlen(szPartialEscapedURL) + 2;
|
||
|
if((szFullURL = NS_GlobalAlloc(dwSize)) != NULL)
|
||
|
{
|
||
|
sprintf(szFullURL,
|
||
|
"%s?%s",
|
||
|
gErrorMessageStream.szURL,
|
||
|
szPartialEscapedURL);
|
||
|
|
||
|
sprintf(szMsg,
|
||
|
"UnEscapedURL: %s?%s\nEscapedURL: %s",
|
||
|
gErrorMessageStream.szURL,
|
||
|
gErrorMessageStream.szMessage,
|
||
|
szFullURL);
|
||
|
|
||
|
if(gErrorMessageStream.bShowConfirmation &&
|
||
|
(*gErrorMessageStream.szConfirmationMessage != '\0'))
|
||
|
{
|
||
|
char szConfirmationMessage[MAX_BUF];
|
||
|
|
||
|
sprintf(szBuf,
|
||
|
"\n\n %s",
|
||
|
gErrorMessageStream.szMessage);
|
||
|
sprintf(szConfirmationMessage,
|
||
|
gErrorMessageStream.szConfirmationMessage,
|
||
|
szBuf);
|
||
|
if(WinMessageBox(HWND_DESKTOP, hWndMain,
|
||
|
szConfirmationMessage,
|
||
|
sgProduct.szProductName, 0,
|
||
|
MB_OKCANCEL | MB_ICONQUESTION) == MBID_OK)
|
||
|
{
|
||
|
//PrintError(szMsg, ERROR_CODE_HIDE);
|
||
|
WGet(szFullURL,
|
||
|
szWGetLog,
|
||
|
diAdvancedSettings.szProxyServer,
|
||
|
diAdvancedSettings.szProxyPort,
|
||
|
diAdvancedSettings.szProxyUser,
|
||
|
diAdvancedSettings.szProxyPasswd);
|
||
|
}
|
||
|
}
|
||
|
else if(!gErrorMessageStream.bShowConfirmation)
|
||
|
{
|
||
|
//PrintError(szMsg, ERROR_CODE_HIDE);
|
||
|
WGet(szFullURL,
|
||
|
szWGetLog,
|
||
|
diAdvancedSettings.szProxyServer,
|
||
|
diAdvancedSettings.szProxyPort,
|
||
|
diAdvancedSettings.szProxyUser,
|
||
|
diAdvancedSettings.szProxyPasswd);
|
||
|
}
|
||
|
|
||
|
FreeMemory(&szFullURL);
|
||
|
}
|
||
|
|
||
|
FreeMemory(&szPartialEscapedURL);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void DeInitialize()
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
|
||
|
LogISTime(W_END);
|
||
|
if(bCreateDestinationDir)
|
||
|
{
|
||
|
strcpy(szBuf, sgProduct.szPath);
|
||
|
AppendBackSlash(szBuf, sizeof(szBuf));
|
||
|
DirectoryRemove(szBuf, FALSE);
|
||
|
}
|
||
|
|
||
|
DeleteWGetLog();
|
||
|
CleanTempFiles();
|
||
|
DirectoryRemove(szTempDir, FALSE);
|
||
|
|
||
|
if(gErrorMessageStream.bEnabled && gErrorMessageStream.bSendMessage)
|
||
|
SendErrorMessage();
|
||
|
|
||
|
DeInitSiComponents(&siComponents);
|
||
|
DeInitSXpcomFile();
|
||
|
DeInitDlgReboot(&diReboot);
|
||
|
DeInitDlgDownload(&diDownload);
|
||
|
DeInitDlgStartInstall(&diStartInstall);
|
||
|
DeInitDlgAdditionalOptions(&diAdditionalOptions);
|
||
|
DeInitDlgAdvancedSettings(&diAdvancedSettings);
|
||
|
DeInitDlgProgramFolder(&diProgramFolder);
|
||
|
DeInitDlgOS2Integration(&diOS2Integration);
|
||
|
DeInitDlgSelectComponents(&diSelectAdditionalComponents);
|
||
|
DeInitDlgSelectComponents(&diSelectComponents);
|
||
|
DeInitDlgSetupType(&diSetupType);
|
||
|
DeInitDlgWelcome(&diWelcome);
|
||
|
DeInitDlgLicense(&diLicense);
|
||
|
DeInitDlgQuickLaunch(&diQuickLaunch);
|
||
|
DeInitSetupGeneral();
|
||
|
DeInitDSNode(&gdsnComponentDSRequirement);
|
||
|
DeInitErrorMessageStream();
|
||
|
|
||
|
FreeMemory(&szTempDir);
|
||
|
FreeMemory(&szOSTempDir);
|
||
|
FreeMemory(&szSetupDir);
|
||
|
FreeMemory(&szFileIniConfig);
|
||
|
FreeMemory(&szFileIniInstall);
|
||
|
FreeMemory(&szEGlobalAlloc);
|
||
|
FreeMemory(&szEDllLoad);
|
||
|
FreeMemory(&szEStringLoad);
|
||
|
FreeMemory(&szEStringNull);
|
||
|
|
||
|
DosFreeModule(hSetupRscInst);
|
||
|
}
|
||
|
|
||
|
char *GetSaveInstallerPath(char *szBuf, DWORD dwBufSize)
|
||
|
{
|
||
|
#ifdef XXX_INTL_HACK_WORKAROUND_FOR_NOW
|
||
|
char szBuf2[MAX_BUF];
|
||
|
#endif
|
||
|
|
||
|
/* determine the path to where the setup and downloaded files will be saved to */
|
||
|
strcpy(szBuf, sgProduct.szPath);
|
||
|
AppendBackSlash(szBuf, dwBufSize);
|
||
|
if(*sgProduct.szSubPath != '\0')
|
||
|
{
|
||
|
strcat(szBuf, sgProduct.szSubPath);
|
||
|
strcat(szBuf, " ");
|
||
|
}
|
||
|
|
||
|
#ifdef XXX_INTL_HACK_WORKAROUND_FOR_NOW
|
||
|
/* Installer can't create the Save Installer Path if the word "Setup" is localized. */
|
||
|
if(GetPrivateProfileString("Messages", "STR_SETUP", "", szBuf2, sizeof(szBuf2), szFileIniInstall))
|
||
|
strcat(szBuf, szBuf2);
|
||
|
else
|
||
|
#endif
|
||
|
strcat(szBuf, "Setup");
|
||
|
|
||
|
return(szBuf);
|
||
|
}
|
||
|
|
||
|
void SaveInstallerFiles()
|
||
|
{
|
||
|
int i;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szSource[MAX_BUF];
|
||
|
char szDestination[MAX_BUF];
|
||
|
char szMFN[MAX_BUF];
|
||
|
char szArchivePath[MAX_BUF];
|
||
|
DWORD dwIndex0;
|
||
|
siC *siCObject = NULL;
|
||
|
PPIB ppib;
|
||
|
PTIB ptib;
|
||
|
|
||
|
GetSaveInstallerPath(szDestination, sizeof(szDestination));
|
||
|
AppendBackSlash(szDestination, sizeof(szDestination));
|
||
|
|
||
|
/* copy all files from the ns_temp dir to the install dir */
|
||
|
CreateDirectoriesAll(szDestination, TRUE);
|
||
|
|
||
|
/* copy the self extracting file that spawned setup.exe, if one exists */
|
||
|
if((*sgProduct.szAlternateArchiveSearchPath != '\0') && (*sgProduct.szParentProcessFilename != '\0'))
|
||
|
{
|
||
|
strcpy(szSource, szSetupDir);
|
||
|
AppendBackSlash(szSource, sizeof(szSource));
|
||
|
strcat(szSource, "*.*");
|
||
|
|
||
|
strcpy(szSource, sgProduct.szAlternateArchiveSearchPath);
|
||
|
AppendBackSlash(szSource, sizeof(szSource));
|
||
|
strcat(szSource, sgProduct.szParentProcessFilename);
|
||
|
FileCopy(szSource, szDestination, FALSE, FALSE);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* Else if self extracting file does not exist, copy the setup files */
|
||
|
/* First get the current process' filename (in case it's not really named setup.exe */
|
||
|
/* Then copy it to the install folder */
|
||
|
char buffer[CCHMAXPATH];
|
||
|
DosGetInfoBlocks( &ptib, &ppib);
|
||
|
DosQueryModuleName( ppib->pib_hmte, sizeof(szBuf), szBuf);
|
||
|
ParsePath(szBuf, szMFN, sizeof(szMFN), FALSE, PP_FILENAME_ONLY);
|
||
|
|
||
|
strcpy(szBuf, szSetupDir);
|
||
|
AppendBackSlash(szBuf, sizeof(szBuf));
|
||
|
strcat(szBuf, szMFN);
|
||
|
FileCopy(szBuf, szDestination, FALSE, FALSE);
|
||
|
|
||
|
/* now copy the rest of the setup files */
|
||
|
i = 0;
|
||
|
while(TRUE)
|
||
|
{
|
||
|
if(*SetupFileList[i] == '\0')
|
||
|
break;
|
||
|
|
||
|
strcpy(szBuf, szSetupDir);
|
||
|
AppendBackSlash(szBuf, sizeof(szBuf));
|
||
|
strcat(szBuf, SetupFileList[i]);
|
||
|
FileCopy(szBuf, szDestination, FALSE, FALSE);
|
||
|
|
||
|
++i;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
dwIndex0 = 0;
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
while(siCObject)
|
||
|
{
|
||
|
LocateJar(siCObject, szArchivePath, sizeof(szArchivePath), TRUE);
|
||
|
if(*szArchivePath != '\0')
|
||
|
{
|
||
|
strcpy(szBuf, szArchivePath);
|
||
|
AppendBackSlash(szBuf, sizeof(szBuf));
|
||
|
strcat(szBuf, siCObject->szArchiveName);
|
||
|
FileCopy(szBuf, szDestination, FALSE, FALSE);
|
||
|
}
|
||
|
|
||
|
++dwIndex0;
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BOOL ShowAdditionalOptionsDialog(void)
|
||
|
{
|
||
|
if(diAdditionalOptions.bShowDialog == FALSE)
|
||
|
return(FALSE);
|
||
|
|
||
|
if( (diAdditionalOptions.bShowHomepageOption == FALSE) && (GetTotalArchivesToDownload() < 1) )
|
||
|
return(FALSE);
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
HWND FindWindow(PCSZ pszAtomString)
|
||
|
{
|
||
|
ATOM atom;
|
||
|
HENUM henum;
|
||
|
HWND hwndClient, hwnd = NULLHANDLE;
|
||
|
|
||
|
|
||
|
atom = WinFindAtom(WinQuerySystemAtomTable(), pszAtomString);
|
||
|
if (atom) {
|
||
|
henum = WinBeginEnumWindows(HWND_DESKTOP);
|
||
|
while ((hwnd = WinGetNextWindow(henum)) != NULLHANDLE)
|
||
|
{
|
||
|
ULONG ulWindowWord;
|
||
|
ulWindowWord = WinQueryWindowULong(hwnd, QWL_USER);
|
||
|
if (ulWindowWord == atom) {
|
||
|
break;
|
||
|
} else {
|
||
|
/* Try the class name method to support older browsers */
|
||
|
HWND hwndClient;
|
||
|
CHAR szClassName[MAX_BUF];
|
||
|
hwndClient = WinWindowFromID(hwnd, FID_CLIENT);
|
||
|
WinQueryClassName(hwndClient ? hwndClient : hwnd, MAX_BUF, szClassName);
|
||
|
if (strcmp(szClassName, pszAtomString) == 0) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
WinEndEnumWindows(henum);
|
||
|
}
|
||
|
if (!hwnd) {
|
||
|
/* Try the object windows just in case, but only for the classname */
|
||
|
henum = WinBeginEnumWindows(HWND_OBJECT);
|
||
|
while ((hwnd = WinGetNextWindow(henum)) != NULLHANDLE)
|
||
|
{
|
||
|
/* Try the class name method to support older browsers */
|
||
|
HWND hwndClient;
|
||
|
CHAR szClassName[MAX_BUF];
|
||
|
hwndClient = WinWindowFromID(hwnd, FID_CLIENT);
|
||
|
WinQueryClassName(hwndClient ? hwndClient : hwnd, MAX_BUF, szClassName);
|
||
|
if (strcmp(szClassName, pszAtomString) == 0) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return hwnd;
|
||
|
}
|
||
|
|