mirror of
https://github.com/rn10950/RetroZilla.git
synced 2024-11-14 03:30:17 +01:00
1748 lines
56 KiB
C
1748 lines
56 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 "shortcut.h"
|
||
|
#include "ifuncns.h"
|
||
|
#include "wizverreg.h"
|
||
|
#include "logging.h"
|
||
|
#include <logkeys.h>
|
||
|
|
||
|
HRESULT TimingCheck(DWORD dwTiming, LPSTR szSection, LPSTR szFile)
|
||
|
{
|
||
|
char szBuf[MAX_BUF_TINY];
|
||
|
|
||
|
GetPrivateProfileString(szSection, "Timing", "", szBuf, sizeof(szBuf), szFile);
|
||
|
if(*szBuf != '\0')
|
||
|
{
|
||
|
switch(dwTiming)
|
||
|
{
|
||
|
case T_PRE_DOWNLOAD:
|
||
|
if(stricmp(szBuf, "pre download") == 0)
|
||
|
return(TRUE);
|
||
|
break;
|
||
|
|
||
|
case T_POST_DOWNLOAD:
|
||
|
if(stricmp(szBuf, "post download") == 0)
|
||
|
return(TRUE);
|
||
|
break;
|
||
|
|
||
|
case T_PRE_XPCOM:
|
||
|
if(stricmp(szBuf, "pre xpcom") == 0)
|
||
|
return(TRUE);
|
||
|
break;
|
||
|
|
||
|
case T_POST_XPCOM:
|
||
|
if(stricmp(szBuf, "post xpcom") == 0)
|
||
|
return(TRUE);
|
||
|
break;
|
||
|
|
||
|
case T_PRE_SMARTUPDATE:
|
||
|
if(stricmp(szBuf, "pre smartupdate") == 0)
|
||
|
return(TRUE);
|
||
|
break;
|
||
|
|
||
|
case T_POST_SMARTUPDATE:
|
||
|
if(stricmp(szBuf, "post smartupdate") == 0)
|
||
|
return(TRUE);
|
||
|
break;
|
||
|
|
||
|
case T_PRE_LAUNCHAPP:
|
||
|
if(stricmp(szBuf, "pre launchapp") == 0)
|
||
|
return(TRUE);
|
||
|
break;
|
||
|
|
||
|
case T_POST_LAUNCHAPP:
|
||
|
if(stricmp(szBuf, "post launchapp") == 0)
|
||
|
return(TRUE);
|
||
|
break;
|
||
|
|
||
|
case T_PRE_ARCHIVE:
|
||
|
if(stricmp(szBuf, "pre archive") == 0)
|
||
|
return(TRUE);
|
||
|
break;
|
||
|
|
||
|
case T_POST_ARCHIVE:
|
||
|
if(stricmp(szBuf, "post archive") == 0)
|
||
|
return(TRUE);
|
||
|
break;
|
||
|
|
||
|
case T_DEPEND_REBOOT:
|
||
|
if(stricmp(szBuf, "depend reboot") == 0)
|
||
|
return(TRUE);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
char *BuildNumberedString(DWORD dwIndex, char *szInputStringPrefix, char *szInputString, char *szOutBuf, DWORD dwOutBufSize)
|
||
|
{
|
||
|
if((szInputStringPrefix) && (*szInputStringPrefix != '\0'))
|
||
|
sprintf(szOutBuf, "%s-%s%d", szInputStringPrefix, szInputString, dwIndex);
|
||
|
else
|
||
|
sprintf(szOutBuf, "%s%d", szInputString, dwIndex);
|
||
|
|
||
|
return(szOutBuf);
|
||
|
}
|
||
|
|
||
|
void GetUserAgentShort(char *szUserAgent, char *szOutUAShort, DWORD dwOutUAShortSize)
|
||
|
{
|
||
|
char *ptrFirstSpace = NULL;
|
||
|
|
||
|
memset(szOutUAShort, 0, dwOutUAShortSize);
|
||
|
if((szUserAgent == NULL) || (*szUserAgent == '\0'))
|
||
|
return;
|
||
|
|
||
|
ptrFirstSpace = strstr(szUserAgent, " ");
|
||
|
if(ptrFirstSpace != NULL)
|
||
|
{
|
||
|
*ptrFirstSpace = '\0';
|
||
|
strcpy(szOutUAShort, szUserAgent);
|
||
|
*ptrFirstSpace = ' ';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CleanupPreviousVersionINIKeys(void)
|
||
|
{
|
||
|
char szIndex[MAX_BUF];
|
||
|
char szSection[MAX_BUF];
|
||
|
char szValue[MAX_BUF];
|
||
|
char szPath[MAX_BUF];
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szDecrypt[MAX_BUF];
|
||
|
char szMainSectionName[] = "Cleanup Previous Product INIApps";
|
||
|
char szApp[MAX_BUF];
|
||
|
char szKey[MAX_BUF];
|
||
|
char szDirKey[MAX_BUF];
|
||
|
char szCleanupProduct[MAX_BUF];
|
||
|
char szCurrentVersion[MAX_BUF_TINY];
|
||
|
char szUserAgent[MAX_BUF];
|
||
|
char szIni[MAX_BUF];
|
||
|
BOOL bFound;
|
||
|
ULONG ulAppsLength, ulIndex;
|
||
|
CHAR* szApps;
|
||
|
HINI hini = HINI_USERPROFILE;
|
||
|
|
||
|
strcpy(szPath, sgProduct.szPath);
|
||
|
if(*sgProduct.szSubPath != '\0')
|
||
|
{
|
||
|
AppendBackSlash(szPath, sizeof(szPath));
|
||
|
strcat(szPath, sgProduct.szSubPath);
|
||
|
}
|
||
|
AppendBackSlash(szPath, sizeof(szPath));
|
||
|
|
||
|
bFound = FALSE;
|
||
|
ulIndex = -1;
|
||
|
while(!bFound)
|
||
|
{
|
||
|
++ulIndex;
|
||
|
itoa(ulIndex, szIndex, 10);
|
||
|
strcpy(szSection, szMainSectionName);
|
||
|
strcat(szSection, szIndex);
|
||
|
|
||
|
GetPrivateProfileString(szSection, "Product Name", "", szValue, sizeof(szValue), szFileIniConfig);
|
||
|
if(*szValue != '\0') {
|
||
|
GetPrivateProfileString(szSection, "Product Name", "", szCleanupProduct, sizeof(szCleanupProduct), szFileIniConfig);
|
||
|
GetPrivateProfileString(szSection, "Current Version", "", szCurrentVersion, sizeof(szCurrentVersion), szFileIniConfig);
|
||
|
|
||
|
GetPrivateProfileString(szSection, "Key", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
GetPrivateProfileString(szSection, "Decrypt Key", "", szDecrypt, sizeof(szDecrypt), szFileIniConfig);
|
||
|
memset(szKey, 0, sizeof(szKey));
|
||
|
if(stricmp(szDecrypt, "TRUE") == 0)
|
||
|
DecryptString(szDirKey, szBuf);
|
||
|
else
|
||
|
strcpy(szDirKey, szBuf);
|
||
|
|
||
|
sprintf(szUserAgent, "%s %s", szCleanupProduct, szCurrentVersion);
|
||
|
|
||
|
PrfQueryProfileSize(HINI_USERPROFILE, NULL, NULL, &ulAppsLength);
|
||
|
szApps = (char*)malloc(ulAppsLength+1);
|
||
|
PrfQueryProfileString(HINI_USERPROFILE, NULL, NULL, NULL, szApps, ulAppsLength);
|
||
|
szApps[ulAppsLength] = '\0';
|
||
|
while (*szApps) {
|
||
|
if (strncmp(szApps, szCleanupProduct, strlen(szCleanupProduct)) == 0) {
|
||
|
if (strncmp(szApps, szUserAgent, strlen(szUserAgent)) != 0) {
|
||
|
char szKey[MAX_BUF];
|
||
|
PrfQueryProfileString(HINI_USERPROFILE, szApps, szDirKey, "", szKey, MAX_BUF);
|
||
|
if (szKey[0]) {
|
||
|
AppendBackSlash(szKey, sizeof(szKey));
|
||
|
if (stricmp(szKey, szPath) == 0) {
|
||
|
PrfWriteProfileString(HINI_USER, szApps, NULL, NULL);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
szApps = strchr(szApps, '\0')+1;
|
||
|
}
|
||
|
} else {
|
||
|
GetPrivateProfileString(szSection, "App", "", szValue, sizeof(szValue), szFileIniConfig);
|
||
|
if(*szValue != '\0') {
|
||
|
GetPrivateProfileString(szSection, "App", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
GetPrivateProfileString(szSection, "Decrypt App", "", szDecrypt, sizeof(szDecrypt), szFileIniConfig);
|
||
|
memset(szApp, 0, sizeof(szApp));
|
||
|
if(stricmp(szDecrypt, "TRUE") == 0)
|
||
|
DecryptString(szApp, szBuf);
|
||
|
else
|
||
|
strcpy(szApp, szBuf);
|
||
|
|
||
|
GetPrivateProfileString(szSection, "Key", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
GetPrivateProfileString(szSection, "Decrypt Key", "", szDecrypt, sizeof(szDecrypt), szFileIniConfig);
|
||
|
memset(szDirKey, 0, sizeof(szKey));
|
||
|
if(stricmp(szDecrypt, "TRUE") == 0)
|
||
|
DecryptString(szDirKey, szBuf);
|
||
|
else
|
||
|
strcpy(szDirKey, 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, szDirKey, "", szKey, MAX_BUF);
|
||
|
if (szKey[0]) {
|
||
|
AppendBackSlash(szKey, sizeof(szKey));
|
||
|
if (stricmp(szKey, szPath) == 0) {
|
||
|
PrfWriteProfileString(hini, szApp, NULL, NULL);
|
||
|
}
|
||
|
}
|
||
|
if (szIni[0]) {
|
||
|
PrfCloseProfile(hini);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ProcessFileOps(DWORD dwTiming, char *szSectionPrefix)
|
||
|
{
|
||
|
ProcessUncompressFile(dwTiming, szSectionPrefix);
|
||
|
ProcessCreateDirectory(dwTiming, szSectionPrefix);
|
||
|
ProcessMoveFile(dwTiming, szSectionPrefix);
|
||
|
ProcessCopyFile(dwTiming, szSectionPrefix);
|
||
|
ProcessCopyFileSequential(dwTiming, szSectionPrefix);
|
||
|
ProcessDeleteFile(dwTiming, szSectionPrefix);
|
||
|
ProcessRemoveDirectory(dwTiming, szSectionPrefix);
|
||
|
if(!gbIgnoreRunAppX)
|
||
|
ProcessRunApp(dwTiming, szSectionPrefix);
|
||
|
ProcessOS2INI(dwTiming, szSectionPrefix);
|
||
|
ProcessProgramFolder(dwTiming, szSectionPrefix);
|
||
|
ProcessSetVersionRegistry(dwTiming, szSectionPrefix);
|
||
|
}
|
||
|
|
||
|
void ProcessFileOpsForSelectedComponents(DWORD dwTiming)
|
||
|
{
|
||
|
DWORD dwIndex0;
|
||
|
siC *siCObject = NULL;
|
||
|
|
||
|
dwIndex0 = 0;
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
while(siCObject)
|
||
|
{
|
||
|
if(siCObject->dwAttributes & SIC_SELECTED)
|
||
|
/* Since the archive is selected, we need to process the file ops here */
|
||
|
ProcessFileOps(dwTiming, siCObject->szReferenceName);
|
||
|
|
||
|
++dwIndex0;
|
||
|
siCObject = SiCNodeGetObject(dwIndex0, TRUE, AC_ALL);
|
||
|
} /* while(siCObject) */
|
||
|
}
|
||
|
|
||
|
void ProcessFileOpsForAll(DWORD dwTiming)
|
||
|
{
|
||
|
ProcessFileOps(dwTiming, NULL);
|
||
|
ProcessFileOpsForSelectedComponents(dwTiming);
|
||
|
ProcessCreateCustomFiles(dwTiming);
|
||
|
}
|
||
|
|
||
|
int VerifyArchive(LPSTR szArchive)
|
||
|
{
|
||
|
void *vZip;
|
||
|
int iTestRv;
|
||
|
|
||
|
/* Check for the existance of the from (source) file */
|
||
|
if(!FileExists(szArchive))
|
||
|
return(FO_ERROR_FILE_NOT_FOUND);
|
||
|
|
||
|
if((iTestRv = ZIP_OpenArchive(szArchive, &vZip)) == ZIP_OK)
|
||
|
{
|
||
|
/* 1st parameter should be NULL or it will fail */
|
||
|
/* It indicates extract the entire archive */
|
||
|
iTestRv = ZIP_TestArchive(vZip);
|
||
|
ZIP_CloseArchive(&vZip);
|
||
|
}
|
||
|
return(iTestRv);
|
||
|
}
|
||
|
|
||
|
HRESULT ProcessSetVersionRegistry(DWORD dwTiming, char *szSectionPrefix)
|
||
|
{
|
||
|
DWORD dwIndex;
|
||
|
BOOL bIsDirectory;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szSection[MAX_BUF_TINY];
|
||
|
char szRegistryKey[MAX_BUF];
|
||
|
char szPath[MAX_BUF];
|
||
|
char szVersion[MAX_BUF_TINY];
|
||
|
|
||
|
dwIndex = 0;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "Version Registry", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Registry Key", "", szRegistryKey, sizeof(szRegistryKey), szFileIniConfig);
|
||
|
while(*szRegistryKey != '\0')
|
||
|
{
|
||
|
if(TimingCheck(dwTiming, szSection, szFileIniConfig))
|
||
|
{
|
||
|
GetPrivateProfileString(szSection, "Version", "", szVersion, sizeof(szVersion), szFileIniConfig);
|
||
|
GetPrivateProfileString(szSection, "Path", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(szPath, szBuf);
|
||
|
if(FileExists(szPath) & FILE_DIRECTORY)
|
||
|
bIsDirectory = TRUE;
|
||
|
else
|
||
|
bIsDirectory = FALSE;
|
||
|
|
||
|
strcpy(szBuf, sgProduct.szPath);
|
||
|
if(sgProduct.szSubPath != '\0')
|
||
|
{
|
||
|
AppendBackSlash(szBuf, sizeof(szBuf));
|
||
|
strcat(szBuf, sgProduct.szSubPath);
|
||
|
}
|
||
|
|
||
|
VR_CreateRegistry(VR_DEFAULT_PRODUCT_NAME, szBuf, NULL);
|
||
|
VR_Install(szRegistryKey, szPath, szVersion, bIsDirectory);
|
||
|
VR_Close();
|
||
|
}
|
||
|
|
||
|
++dwIndex;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "Version Registry", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Registry Key", "", szRegistryKey, sizeof(szRegistryKey), szFileIniConfig);
|
||
|
}
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT FileUncompress(LPSTR szFrom, LPSTR szTo)
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
ULONG ulBuf, ulDiskNum, ulDriveMap;
|
||
|
DWORD dwReturn;
|
||
|
void *vZip;
|
||
|
APIRET rc;
|
||
|
|
||
|
dwReturn = FO_SUCCESS;
|
||
|
/* Check for the existance of the from (source) file */
|
||
|
if(!FileExists(szFrom))
|
||
|
return(FO_ERROR_FILE_NOT_FOUND);
|
||
|
|
||
|
/* Check for the existance of the to (destination) path */
|
||
|
dwReturn = FileExists(szTo);
|
||
|
if(dwReturn && !(dwReturn & FILE_DIRECTORY))
|
||
|
{
|
||
|
/* found a file with the same name as the destination path */
|
||
|
return(FO_ERROR_DESTINATION_CONFLICT);
|
||
|
}
|
||
|
else if(!dwReturn)
|
||
|
{
|
||
|
strcpy(szBuf, szTo);
|
||
|
AppendBackSlash(szBuf, sizeof(szBuf));
|
||
|
CreateDirectoriesAll(szBuf, FALSE);
|
||
|
}
|
||
|
|
||
|
ulBuf = MAX_BUF-3;
|
||
|
rc = DosQueryCurrentDir(0, &szBuf[3], &ulBuf);
|
||
|
// Directory does not start with 'x:\', so add it.
|
||
|
rc = DosQueryCurrentDisk(&ulDiskNum, &ulDriveMap);
|
||
|
|
||
|
// Follow the case of the first letter in the path.
|
||
|
if (isupper(szBuf[3]))
|
||
|
szBuf[0] = (char)('A' - 1 + ulDiskNum);
|
||
|
else
|
||
|
szBuf[0] = (char)('a' - 1 + ulDiskNum);
|
||
|
szBuf[1] = ':';
|
||
|
szBuf[2] = '\\';
|
||
|
|
||
|
if (toupper(szBuf[0]) != toupper(szTo[0]))
|
||
|
rc = DosSetDefaultDisk(toupper(szTo[0]) - 'A' + 1);
|
||
|
if(DosSetCurrentDir(szTo) != NO_ERROR)
|
||
|
return(FO_ERROR_CHANGE_DIR);
|
||
|
|
||
|
if((dwReturn = ZIP_OpenArchive(szFrom, &vZip)) != ZIP_OK)
|
||
|
return(dwReturn);
|
||
|
|
||
|
/* 1st parameter should be NULL or it will fail */
|
||
|
/* It indicates extract the entire archive */
|
||
|
dwReturn = ExtractDirEntries(NULL, vZip);
|
||
|
ZIP_CloseArchive(&vZip);
|
||
|
|
||
|
if (toupper(szBuf[0]) != toupper(szTo[0]))
|
||
|
DosSetDefaultDisk(toupper(szBuf[0]) -1 + 'A');
|
||
|
if(DosSetCurrentDir(szBuf) != NO_ERROR)
|
||
|
return(FO_ERROR_CHANGE_DIR);
|
||
|
|
||
|
return(dwReturn);
|
||
|
}
|
||
|
|
||
|
HRESULT ProcessXpcomFile()
|
||
|
{
|
||
|
char szSource[MAX_BUF];
|
||
|
char szDestination[MAX_BUF];
|
||
|
DWORD dwErr;
|
||
|
|
||
|
if(*siCFXpcomFile.szMessage != '\0')
|
||
|
ShowMessage(siCFXpcomFile.szMessage, TRUE);
|
||
|
|
||
|
if((dwErr = FileUncompress(siCFXpcomFile.szSource, siCFXpcomFile.szDestination)) != FO_SUCCESS)
|
||
|
{
|
||
|
char szMsg[MAX_BUF];
|
||
|
char szErrorString[MAX_BUF];
|
||
|
|
||
|
if(*siCFXpcomFile.szMessage != '\0')
|
||
|
ShowMessage(siCFXpcomFile.szMessage, FALSE);
|
||
|
|
||
|
LogISProcessXpcomFile(LIS_FAILURE, dwErr);
|
||
|
GetPrivateProfileString("Strings", "Error File Uncompress", "", szErrorString, sizeof(szErrorString), szFileIniConfig);
|
||
|
sprintf(szMsg, szErrorString, siCFXpcomFile.szSource, dwErr);
|
||
|
PrintError(szMsg, ERROR_CODE_HIDE);
|
||
|
return(dwErr);
|
||
|
}
|
||
|
LogISProcessXpcomFile(LIS_SUCCESS, dwErr);
|
||
|
|
||
|
/* copy msvcrt.dll and msvcirt.dll to the bin of the Xpcom temp dir:
|
||
|
* (c:\temp\Xpcom.ns\bin)
|
||
|
* This is incase these files do not exist on the system */
|
||
|
strcpy(szSource, siCFXpcomFile.szDestination);
|
||
|
AppendBackSlash(szSource, sizeof(szSource));
|
||
|
strcat(szSource, "ms*.dll");
|
||
|
|
||
|
strcpy(szDestination, siCFXpcomFile.szDestination);
|
||
|
AppendBackSlash(szDestination, sizeof(szDestination));
|
||
|
strcat(szDestination, "bin");
|
||
|
|
||
|
FileCopy(szSource, szDestination, TRUE, FALSE);
|
||
|
|
||
|
if(*siCFXpcomFile.szMessage != '\0')
|
||
|
ShowMessage(siCFXpcomFile.szMessage, FALSE);
|
||
|
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT CleanupXpcomFile()
|
||
|
{
|
||
|
if(siCFXpcomFile.bCleanup == TRUE)
|
||
|
DirectoryRemove(siCFXpcomFile.szDestination, TRUE);
|
||
|
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT CleanupArgsRegistry()
|
||
|
{
|
||
|
char szApp[MAX_BUF];
|
||
|
|
||
|
sprintf(szApp, "%s %s", sgProduct.szProductNameInternal, sgProduct.szUserAgent);
|
||
|
PrfWriteProfileString(HINI_USERPROFILE, szApp, "browserargs", NULL);
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT ProcessUncompressFile(DWORD dwTiming, char *szSectionPrefix)
|
||
|
{
|
||
|
DWORD dwIndex;
|
||
|
BOOL bOnlyIfExists;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szSection[MAX_BUF];
|
||
|
char szSource[MAX_BUF];
|
||
|
char szDestination[MAX_BUF];
|
||
|
|
||
|
dwIndex = 0;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "Uncompress File", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Source", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
while(*szBuf != '\0')
|
||
|
{
|
||
|
if(TimingCheck(dwTiming, szSection, szFileIniConfig))
|
||
|
{
|
||
|
DecryptString(szSource, szBuf);
|
||
|
GetPrivateProfileString(szSection, "Destination", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(szDestination, szBuf);
|
||
|
GetPrivateProfileString(szSection, "Only If Exists", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "TRUE") == 0)
|
||
|
bOnlyIfExists = TRUE;
|
||
|
else
|
||
|
bOnlyIfExists = FALSE;
|
||
|
|
||
|
if((!bOnlyIfExists) || (bOnlyIfExists && FileExists(szDestination)))
|
||
|
{
|
||
|
DWORD dwErr;
|
||
|
|
||
|
GetPrivateProfileString(szSection, "Message", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
ShowMessage(szBuf, TRUE);
|
||
|
if((dwErr = FileUncompress(szSource, szDestination)) != FO_SUCCESS)
|
||
|
{
|
||
|
char szMsg[MAX_BUF];
|
||
|
char szErrorString[MAX_BUF];
|
||
|
|
||
|
ShowMessage(szBuf, FALSE);
|
||
|
GetPrivateProfileString("Strings", "Error File Uncompress", "", szErrorString, sizeof(szErrorString), szFileIniConfig);
|
||
|
sprintf(szMsg, szErrorString, szSource, dwErr);
|
||
|
PrintError(szMsg, ERROR_CODE_HIDE);
|
||
|
return(dwErr);
|
||
|
}
|
||
|
|
||
|
ShowMessage(szBuf, FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
++dwIndex;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "Uncompress File", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Source", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
}
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT FileMove(LPSTR szFrom, LPSTR szTo)
|
||
|
{
|
||
|
HDIR hFile;
|
||
|
FILEFINDBUF3 fdFile;
|
||
|
ULONG ulFindCount;
|
||
|
ULONG ulAttrs;
|
||
|
char szFromDir[MAX_BUF];
|
||
|
char szFromTemp[MAX_BUF];
|
||
|
char szToTemp[MAX_BUF];
|
||
|
char szBuf[MAX_BUF];
|
||
|
BOOL bFound;
|
||
|
|
||
|
/* From file path exists and To file path does not exist */
|
||
|
if((FileExists(szFrom)) && (!FileExists(szTo)))
|
||
|
{
|
||
|
|
||
|
/* @MAK - need to handle OS/2 case where they are not the same drive*/
|
||
|
DosMove(szFrom, szTo);
|
||
|
|
||
|
/* log the file move command */
|
||
|
sprintf(szBuf, "%s to %s", szFrom, szTo);
|
||
|
UpdateInstallLog(KEY_MOVE_FILE, szBuf, FALSE);
|
||
|
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
/* From file path exists and To file path exists */
|
||
|
if(FileExists(szFrom) && FileExists(szTo))
|
||
|
{
|
||
|
/* Since the To file path exists, assume it to be a directory and proceed. */
|
||
|
/* We don't care if it's a file. If it is a file, then config.ini needs to be */
|
||
|
/* corrected to remove the file before attempting a MoveFile(). */
|
||
|
strcpy(szToTemp, szTo);
|
||
|
AppendBackSlash(szToTemp, sizeof(szToTemp));
|
||
|
ParsePath(szFrom, szBuf, sizeof(szBuf), FALSE, PP_FILENAME_ONLY);
|
||
|
strcat(szToTemp, szBuf);
|
||
|
DosMove(szFrom, szToTemp);
|
||
|
|
||
|
/* log the file move command */
|
||
|
sprintf(szBuf, "%s to %s", szFrom, szToTemp);
|
||
|
UpdateInstallLog(KEY_MOVE_FILE, szBuf, FALSE);
|
||
|
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
ParsePath(szFrom, szFromDir, sizeof(szFromDir), FALSE, PP_PATH_ONLY);
|
||
|
|
||
|
strcat(szFrom, "*.*");
|
||
|
ulFindCount = 1;
|
||
|
hFile = HDIR_CREATE;
|
||
|
ulAttrs = FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY | FILE_ARCHIVED;
|
||
|
if((DosFindFirst(szFrom, &hFile, ulAttrs, &fdFile, sizeof(fdFile), &ulFindCount, FIL_STANDARD)) != NO_ERROR)
|
||
|
bFound = FALSE;
|
||
|
else
|
||
|
bFound = TRUE;
|
||
|
|
||
|
while(bFound)
|
||
|
{
|
||
|
if((stricmp(fdFile.achName, ".") != 0) && (stricmp(fdFile.achName, "..") != 0))
|
||
|
{
|
||
|
/* create full path string including filename for source */
|
||
|
strcpy(szFromTemp, szFromDir);
|
||
|
AppendBackSlash(szFromTemp, sizeof(szFromTemp));
|
||
|
strcat(szFromTemp, fdFile.achName);
|
||
|
|
||
|
/* create full path string including filename for destination */
|
||
|
strcpy(szToTemp, szTo);
|
||
|
AppendBackSlash(szToTemp, sizeof(szToTemp));
|
||
|
strcat(szToTemp, fdFile.achName);
|
||
|
|
||
|
DosMove(szFromTemp, szToTemp);
|
||
|
|
||
|
/* log the file move command */
|
||
|
sprintf(szBuf, "%s to %s", szFromTemp, szToTemp);
|
||
|
UpdateInstallLog(KEY_MOVE_FILE, szBuf, FALSE);
|
||
|
}
|
||
|
|
||
|
ulFindCount = 1;
|
||
|
if (DosFindNext(hFile, &fdFile, sizeof(fdFile), &ulFindCount) == NO_ERROR) {
|
||
|
bFound = TRUE;
|
||
|
} else {
|
||
|
bFound = FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DosFindClose(hFile);
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT ProcessMoveFile(DWORD dwTiming, char *szSectionPrefix)
|
||
|
{
|
||
|
DWORD dwIndex;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szSection[MAX_BUF];
|
||
|
char szSource[MAX_BUF];
|
||
|
char szDestination[MAX_BUF];
|
||
|
|
||
|
dwIndex = 0;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "Move File", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Source", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
while(*szBuf != '\0')
|
||
|
{
|
||
|
if(TimingCheck(dwTiming, szSection, szFileIniConfig))
|
||
|
{
|
||
|
DecryptString(szSource, szBuf);
|
||
|
GetPrivateProfileString(szSection, "Destination", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(szDestination, szBuf);
|
||
|
FileMove(szSource, szDestination);
|
||
|
}
|
||
|
|
||
|
++dwIndex;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "Move File", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Source", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
}
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT FileCopy(LPSTR szFrom, LPSTR szTo, BOOL bFailIfExists, BOOL bDnu)
|
||
|
{
|
||
|
HDIR hFile;
|
||
|
FILEFINDBUF3 fdFile;
|
||
|
ULONG ulFindCount;
|
||
|
ULONG ulAttrs;
|
||
|
char szFromDir[MAX_BUF];
|
||
|
char szFromTemp[MAX_BUF];
|
||
|
char szToTemp[MAX_BUF];
|
||
|
char szBuf[MAX_BUF];
|
||
|
BOOL bFound;
|
||
|
|
||
|
if(FileExists(szFrom))
|
||
|
{
|
||
|
/* The file in the From file path exists */
|
||
|
ParsePath(szFrom, szBuf, sizeof(szBuf), FALSE, PP_FILENAME_ONLY);
|
||
|
strcpy(szToTemp, szTo);
|
||
|
AppendBackSlash(szToTemp, sizeof(szToTemp));
|
||
|
strcat(szToTemp, szBuf);
|
||
|
if (bFailIfExists) {
|
||
|
DosCopy(szFrom, szToTemp, 0);
|
||
|
} else {
|
||
|
DosCopy(szFrom, szToTemp, DCPY_EXISTING);
|
||
|
}
|
||
|
sprintf(szBuf, "%s to %s", szFrom, szToTemp);
|
||
|
UpdateInstallLog(KEY_COPY_FILE, szBuf, bDnu);
|
||
|
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
/* The file in the From file path does not exist. Assume to contain wild args and */
|
||
|
/* proceed acordingly. */
|
||
|
ParsePath(szFrom, szFromDir, sizeof(szFromDir), FALSE, PP_PATH_ONLY);
|
||
|
|
||
|
ulFindCount = 1;
|
||
|
hFile = HDIR_CREATE;
|
||
|
ulAttrs = FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY | FILE_ARCHIVED;
|
||
|
if((DosFindFirst(szFrom, &hFile, ulAttrs, &fdFile, sizeof(fdFile), &ulFindCount, FIL_STANDARD)) != NO_ERROR)
|
||
|
bFound = FALSE;
|
||
|
else
|
||
|
bFound = TRUE;
|
||
|
|
||
|
while(bFound)
|
||
|
{
|
||
|
if((stricmp(fdFile.achName, ".") != 0) && (stricmp(fdFile.achName, "..") != 0))
|
||
|
{
|
||
|
/* create full path string including filename for source */
|
||
|
strcpy(szFromTemp, szFromDir);
|
||
|
AppendBackSlash(szFromTemp, sizeof(szFromTemp));
|
||
|
strcat(szFromTemp, fdFile.achName);
|
||
|
|
||
|
/* create full path string including filename for destination */
|
||
|
strcpy(szToTemp, szTo);
|
||
|
AppendBackSlash(szToTemp, sizeof(szToTemp));
|
||
|
strcat(szToTemp, fdFile.achName);
|
||
|
|
||
|
if (bFailIfExists) {
|
||
|
DosCopy(szFromTemp, szToTemp, 0);
|
||
|
} else {
|
||
|
DosCopy(szFromTemp, szToTemp, DCPY_EXISTING);
|
||
|
}
|
||
|
|
||
|
/* log the file copy command */
|
||
|
sprintf(szBuf, "%s to %s", szFromTemp, szToTemp);
|
||
|
UpdateInstallLog(KEY_COPY_FILE, szBuf, bDnu);
|
||
|
}
|
||
|
|
||
|
ulFindCount = 1;
|
||
|
if (DosFindNext(hFile, &fdFile, sizeof(fdFile), &ulFindCount) == NO_ERROR) {
|
||
|
bFound = TRUE;
|
||
|
} else {
|
||
|
bFound = FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DosFindClose(hFile);
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT FileCopySequential(LPSTR szSourcePath, LPSTR szDestPath, LPSTR szFilename)
|
||
|
{
|
||
|
int iFilenameOnlyLen;
|
||
|
char szDestFullFilename[MAX_BUF];
|
||
|
char szSourceFullFilename[MAX_BUF];
|
||
|
char szSearchFilename[MAX_BUF];
|
||
|
char szSearchDestFullFilename[MAX_BUF];
|
||
|
char szFilenameOnly[MAX_BUF];
|
||
|
char szFilenameExtensionOnly[MAX_BUF];
|
||
|
char szNumber[MAX_BUF];
|
||
|
long dwNumber;
|
||
|
long dwMaxNumber;
|
||
|
LPSTR szDotPtr;
|
||
|
HDIR hFile;
|
||
|
FILEFINDBUF3 fdFile;
|
||
|
ULONG ulFindCount;
|
||
|
ULONG ulAttrs;
|
||
|
BOOL bFound;
|
||
|
|
||
|
strcpy(szSourceFullFilename, szSourcePath);
|
||
|
AppendBackSlash(szSourceFullFilename, sizeof(szSourceFullFilename));
|
||
|
strcat(szSourceFullFilename, szFilename);
|
||
|
|
||
|
if(FileExists(szSourceFullFilename))
|
||
|
{
|
||
|
/* zero out the memory */
|
||
|
memset(szSearchFilename, 0, sizeof(szSearchFilename));
|
||
|
memset(szFilenameOnly, 0, sizeof(szFilenameOnly));
|
||
|
memset(szFilenameExtensionOnly, 0, sizeof(szFilenameExtensionOnly));
|
||
|
|
||
|
/* parse for the filename w/o extention and also only the extension */
|
||
|
if((szDotPtr = strstr(szFilename, ".")) != NULL)
|
||
|
{
|
||
|
*szDotPtr = '\0';
|
||
|
strcpy(szSearchFilename, szFilename);
|
||
|
strcpy(szFilenameOnly, szFilename);
|
||
|
strcpy(szFilenameExtensionOnly, &szDotPtr[1]);
|
||
|
*szDotPtr = '.';
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
strcpy(szFilenameOnly, szFilename);
|
||
|
strcpy(szSearchFilename, szFilename);
|
||
|
}
|
||
|
|
||
|
/* create the wild arg filename to search for in the szDestPath */
|
||
|
strcat(szSearchFilename, "*.*");
|
||
|
strcpy(szSearchDestFullFilename, szDestPath);
|
||
|
AppendBackSlash(szSearchDestFullFilename, sizeof(szSearchDestFullFilename));
|
||
|
strcat(szSearchDestFullFilename, szSearchFilename);
|
||
|
|
||
|
iFilenameOnlyLen = strlen(szFilenameOnly);
|
||
|
dwNumber = 0;
|
||
|
dwMaxNumber = 0;
|
||
|
|
||
|
/* find the largest numbered filename in the szDestPath */
|
||
|
ulFindCount = 1;
|
||
|
hFile = HDIR_CREATE;
|
||
|
ulAttrs = FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY | FILE_ARCHIVED;
|
||
|
if((DosFindFirst(szSearchDestFullFilename, &hFile, ulAttrs, &fdFile, sizeof(fdFile), &ulFindCount, FIL_STANDARD)) != NO_ERROR)
|
||
|
bFound = FALSE;
|
||
|
else
|
||
|
bFound = TRUE;
|
||
|
|
||
|
while(bFound)
|
||
|
{
|
||
|
memset(szNumber, 0, sizeof(szNumber));
|
||
|
if((stricmp(fdFile.achName, ".") != 0) && (stricmp(fdFile.achName, "..") != 0))
|
||
|
{
|
||
|
strcpy(szNumber, &fdFile.achName[iFilenameOnlyLen]);
|
||
|
dwNumber = atoi(szNumber);
|
||
|
if(dwNumber > dwMaxNumber)
|
||
|
dwMaxNumber = dwNumber;
|
||
|
}
|
||
|
|
||
|
ulFindCount = 1;
|
||
|
if (DosFindNext(hFile, &fdFile, sizeof(fdFile), &ulFindCount) == NO_ERROR) {
|
||
|
bFound = TRUE;
|
||
|
} else {
|
||
|
bFound = FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DosFindClose(hFile);
|
||
|
|
||
|
strcpy(szDestFullFilename, szDestPath);
|
||
|
AppendBackSlash(szDestFullFilename, sizeof(szDestFullFilename));
|
||
|
strcat(szDestFullFilename, szFilenameOnly);
|
||
|
_itoa(dwMaxNumber + 1, szNumber, 10);
|
||
|
strcat(szDestFullFilename, szNumber);
|
||
|
|
||
|
if(*szFilenameExtensionOnly != '\0')
|
||
|
{
|
||
|
strcat(szDestFullFilename, ".");
|
||
|
strcat(szDestFullFilename, szFilenameExtensionOnly);
|
||
|
}
|
||
|
|
||
|
DosCopy(szSourceFullFilename, szDestFullFilename, 0);
|
||
|
}
|
||
|
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT ProcessCopyFile(DWORD dwTiming, char *szSectionPrefix)
|
||
|
{
|
||
|
DWORD dwIndex;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szSection[MAX_BUF];
|
||
|
char szSource[MAX_BUF];
|
||
|
char szDestination[MAX_BUF];
|
||
|
BOOL bFailIfExists;
|
||
|
BOOL bDnu;
|
||
|
|
||
|
dwIndex = 0;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "Copy File", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Source", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
while(*szBuf != '\0')
|
||
|
{
|
||
|
if(TimingCheck(dwTiming, szSection, szFileIniConfig))
|
||
|
{
|
||
|
DecryptString(szSource, szBuf);
|
||
|
GetPrivateProfileString(szSection, "Destination", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(szDestination, szBuf);
|
||
|
|
||
|
GetPrivateProfileString(szSection, "Do Not Uninstall", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "TRUE") == 0)
|
||
|
bDnu = TRUE;
|
||
|
else
|
||
|
bDnu = FALSE;
|
||
|
|
||
|
GetPrivateProfileString(szSection, "Fail If Exists", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "TRUE") == 0)
|
||
|
bFailIfExists = TRUE;
|
||
|
else
|
||
|
bFailIfExists = FALSE;
|
||
|
|
||
|
FileCopy(szSource, szDestination, bFailIfExists, bDnu);
|
||
|
}
|
||
|
|
||
|
++dwIndex;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "Copy File", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Source", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
}
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT ProcessCopyFileSequential(DWORD dwTiming, char *szSectionPrefix)
|
||
|
{
|
||
|
DWORD dwIndex;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szSection[MAX_BUF];
|
||
|
char szSource[MAX_BUF];
|
||
|
char szDestination[MAX_BUF];
|
||
|
char szFilename[MAX_BUF];
|
||
|
|
||
|
dwIndex = 0;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "Copy File Sequential", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Filename", "", szFilename, sizeof(szFilename), szFileIniConfig);
|
||
|
while(*szFilename != '\0')
|
||
|
{
|
||
|
if(TimingCheck(dwTiming, szSection, szFileIniConfig))
|
||
|
{
|
||
|
GetPrivateProfileString(szSection, "Source", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(szSource, szBuf);
|
||
|
|
||
|
GetPrivateProfileString(szSection, "Destination", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(szDestination, szBuf);
|
||
|
|
||
|
FileCopySequential(szSource, szDestination, szFilename);
|
||
|
}
|
||
|
|
||
|
++dwIndex;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "Copy File Sequential", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Filename", "", szFilename, sizeof(szFilename), szFileIniConfig);
|
||
|
}
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
void UpdateInstallLog(PSZ szKey, PSZ szString, BOOL bDnu)
|
||
|
{
|
||
|
FILE *fInstallLog;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szFileInstallLog[MAX_BUF];
|
||
|
|
||
|
if(gbILUseTemp)
|
||
|
{
|
||
|
strcpy(szFileInstallLog, szTempDir);
|
||
|
AppendBackSlash(szFileInstallLog, sizeof(szFileInstallLog));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
strcpy(szFileInstallLog, sgProduct.szPath);
|
||
|
AppendBackSlash(szFileInstallLog, sizeof(szFileInstallLog));
|
||
|
strcat(szFileInstallLog, sgProduct.szSubPath);
|
||
|
AppendBackSlash(szFileInstallLog, sizeof(szFileInstallLog));
|
||
|
}
|
||
|
|
||
|
CreateDirectoriesAll(szFileInstallLog, FALSE);
|
||
|
strcat(szFileInstallLog, FILE_INSTALL_LOG);
|
||
|
|
||
|
if((fInstallLog = fopen(szFileInstallLog, "a+")) != NULL)
|
||
|
{
|
||
|
if(bDnu)
|
||
|
sprintf(szBuf, " ** (*dnu*) %s%s\n", szKey, szString);
|
||
|
else
|
||
|
sprintf(szBuf, " ** %s%s\n", szKey, szString);
|
||
|
|
||
|
fwrite(szBuf, sizeof(char), strlen(szBuf), fInstallLog);
|
||
|
fclose(fInstallLog);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void UpdateInstallStatusLog(PSZ szString)
|
||
|
{
|
||
|
FILE *fInstallLog;
|
||
|
char szFileInstallStatusLog[MAX_BUF];
|
||
|
|
||
|
if(gbILUseTemp)
|
||
|
{
|
||
|
strcpy(szFileInstallStatusLog, szTempDir);
|
||
|
AppendBackSlash(szFileInstallStatusLog, sizeof(szFileInstallStatusLog));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
strcpy(szFileInstallStatusLog, sgProduct.szPath);
|
||
|
AppendBackSlash(szFileInstallStatusLog, sizeof(szFileInstallStatusLog));
|
||
|
strcat(szFileInstallStatusLog, sgProduct.szSubPath);
|
||
|
AppendBackSlash(szFileInstallStatusLog, sizeof(szFileInstallStatusLog));
|
||
|
}
|
||
|
|
||
|
CreateDirectoriesAll(szFileInstallStatusLog, FALSE);
|
||
|
strcat(szFileInstallStatusLog, FILE_INSTALL_STATUS_LOG);
|
||
|
|
||
|
if((fInstallLog = fopen(szFileInstallStatusLog, "a+")) != NULL)
|
||
|
{
|
||
|
fwrite(szString, sizeof(char), strlen(szString), fInstallLog);
|
||
|
fclose(fInstallLog);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void UpdateJSProxyInfo()
|
||
|
{
|
||
|
FILE *fJSFile;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szJSFile[MAX_BUF];
|
||
|
|
||
|
if((*diAdvancedSettings.szProxyServer != '\0') || (*diAdvancedSettings.szProxyPort != '\0'))
|
||
|
{
|
||
|
strcpy(szJSFile, sgProduct.szPath);
|
||
|
if(*sgProduct.szSubPath != '\0')
|
||
|
{
|
||
|
AppendBackSlash(szJSFile, sizeof(szJSFile));
|
||
|
strcat(szJSFile, sgProduct.szSubPath);
|
||
|
}
|
||
|
AppendBackSlash(szJSFile, sizeof(szJSFile));
|
||
|
strcat(szJSFile, "defaults\\pref\\");
|
||
|
CreateDirectoriesAll(szJSFile, TRUE);
|
||
|
strcat(szJSFile, FILE_ALL_JS);
|
||
|
|
||
|
if((fJSFile = fopen(szJSFile, "a+")) != NULL)
|
||
|
{
|
||
|
memset(szBuf, 0, sizeof(szBuf));
|
||
|
if(*diAdvancedSettings.szProxyServer != '\0')
|
||
|
{
|
||
|
if(diAdditionalOptions.dwUseProtocol == UP_FTP)
|
||
|
sprintf(szBuf,
|
||
|
"pref(\"network.proxy.ftp\", \"%s\");\n",
|
||
|
diAdvancedSettings.szProxyServer);
|
||
|
else
|
||
|
sprintf(szBuf,
|
||
|
"pref(\"network.proxy.http\", \"%s\");\n",
|
||
|
diAdvancedSettings.szProxyServer);
|
||
|
}
|
||
|
|
||
|
if(*diAdvancedSettings.szProxyPort != '\0')
|
||
|
{
|
||
|
if(diAdditionalOptions.dwUseProtocol == UP_FTP)
|
||
|
sprintf(szBuf,
|
||
|
"pref(\"network.proxy.ftp_port\", %s);\n",
|
||
|
diAdvancedSettings.szProxyPort);
|
||
|
else
|
||
|
sprintf(szBuf,
|
||
|
"pref(\"network.proxy.http_port\", %s);\n",
|
||
|
diAdvancedSettings.szProxyPort);
|
||
|
}
|
||
|
|
||
|
strcat(szBuf, "pref(\"network.proxy.type\", 1);\n");
|
||
|
|
||
|
fwrite(szBuf, sizeof(char), strlen(szBuf), fJSFile);
|
||
|
fclose(fJSFile);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
HRESULT CreateDirectoriesAll(char* szPath, BOOL bLogForUninstall)
|
||
|
{
|
||
|
int i;
|
||
|
int iLen = strlen(szPath);
|
||
|
char szCreatePath[MAX_BUF];
|
||
|
HRESULT hrResult = 0;
|
||
|
|
||
|
memset(szCreatePath, 0, MAX_BUF);
|
||
|
memcpy(szCreatePath, szPath, iLen);
|
||
|
for(i = 0; i < iLen; i++)
|
||
|
{
|
||
|
if((iLen > 1) &&
|
||
|
((i != 0) && ((szPath[i] == '\\') || (szPath[i] == '/'))) &&
|
||
|
(!((szPath[0] == '\\') && (i == 1)) && !((szPath[1] == ':') && (i == 2))))
|
||
|
{
|
||
|
szCreatePath[i] = '\0';
|
||
|
if(FileExists(szCreatePath) == FALSE)
|
||
|
{
|
||
|
APIRET rc = DosCreateDir(szCreatePath, NULL);
|
||
|
if (rc == NO_ERROR) {
|
||
|
hrResult = 1;
|
||
|
}
|
||
|
|
||
|
if(bLogForUninstall)
|
||
|
UpdateInstallLog(KEY_CREATE_FOLDER, szCreatePath, FALSE);
|
||
|
}
|
||
|
szCreatePath[i] = szPath[i];
|
||
|
}
|
||
|
}
|
||
|
return(hrResult);
|
||
|
}
|
||
|
|
||
|
HRESULT ProcessCreateDirectory(DWORD dwTiming, char *szSectionPrefix)
|
||
|
{
|
||
|
DWORD dwIndex;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szSection[MAX_BUF];
|
||
|
char szDestination[MAX_BUF];
|
||
|
|
||
|
dwIndex = 0;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "Create Directory", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Destination", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
while(*szBuf != '\0')
|
||
|
{
|
||
|
if(TimingCheck(dwTiming, szSection, szFileIniConfig))
|
||
|
{
|
||
|
DecryptString(szDestination, szBuf);
|
||
|
AppendBackSlash(szDestination, sizeof(szDestination));
|
||
|
CreateDirectoriesAll(szDestination, TRUE);
|
||
|
}
|
||
|
|
||
|
++dwIndex;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "Create Directory", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Destination", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
}
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT FileDelete(LPSTR szDestination)
|
||
|
{
|
||
|
HDIR hFile;
|
||
|
FILEFINDBUF3 fdFile;
|
||
|
ULONG ulFindCount;
|
||
|
ULONG ulAttrs;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szPathOnly[MAX_BUF];
|
||
|
BOOL bFound;
|
||
|
|
||
|
if(FileExists(szDestination))
|
||
|
{
|
||
|
/* The file in the From file path exists */
|
||
|
DosDelete(szDestination);
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
/* The file in the From file path does not exist. Assume to contain wild args and */
|
||
|
/* proceed acordingly. */
|
||
|
ParsePath(szDestination, szPathOnly, sizeof(szPathOnly), FALSE, PP_PATH_ONLY);
|
||
|
|
||
|
ulFindCount = 1;
|
||
|
hFile = HDIR_CREATE;
|
||
|
ulAttrs = FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY | FILE_ARCHIVED;
|
||
|
if((DosFindFirst(szDestination, &hFile, ulAttrs, &fdFile, sizeof(fdFile), &ulFindCount, FIL_STANDARD)) != NO_ERROR)
|
||
|
bFound = FALSE;
|
||
|
else
|
||
|
bFound = TRUE;
|
||
|
|
||
|
while(bFound)
|
||
|
{
|
||
|
if(!(fdFile.attrFile & FILE_DIRECTORY))
|
||
|
{
|
||
|
strcpy(szBuf, szPathOnly);
|
||
|
AppendBackSlash(szBuf, sizeof(szBuf));
|
||
|
strcat(szBuf, fdFile.achName);
|
||
|
|
||
|
DosDelete(szBuf);
|
||
|
}
|
||
|
|
||
|
ulFindCount = 1;
|
||
|
if (DosFindNext(hFile, &fdFile, sizeof(fdFile), &ulFindCount) == NO_ERROR) {
|
||
|
bFound = TRUE;
|
||
|
} else {
|
||
|
bFound = FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DosFindClose(hFile);
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT ProcessDeleteFile(DWORD dwTiming, char *szSectionPrefix)
|
||
|
{
|
||
|
DWORD dwIndex;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szSection[MAX_BUF];
|
||
|
char szDestination[MAX_BUF];
|
||
|
|
||
|
dwIndex = 0;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "Delete File", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Destination", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
while(*szBuf != '\0')
|
||
|
{
|
||
|
if(TimingCheck(dwTiming, szSection, szFileIniConfig))
|
||
|
{
|
||
|
DecryptString(szDestination, szBuf);
|
||
|
FileDelete(szDestination);
|
||
|
}
|
||
|
|
||
|
++dwIndex;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "Delete File", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Destination", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
}
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT DirectoryRemove(LPSTR szDestination, BOOL bRemoveSubdirs)
|
||
|
{
|
||
|
HDIR hFile;
|
||
|
FILEFINDBUF3 fdFile;
|
||
|
ULONG ulFindCount;
|
||
|
ULONG ulAttrs;
|
||
|
char szDestTemp[MAX_BUF];
|
||
|
BOOL bFound;
|
||
|
|
||
|
if(!FileExists(szDestination))
|
||
|
return(FO_SUCCESS);
|
||
|
|
||
|
if(bRemoveSubdirs == TRUE)
|
||
|
{
|
||
|
strcpy(szDestTemp, szDestination);
|
||
|
AppendBackSlash(szDestTemp, sizeof(szDestTemp));
|
||
|
strcat(szDestTemp, "*");
|
||
|
|
||
|
ulFindCount = 1;
|
||
|
hFile = HDIR_CREATE;
|
||
|
ulAttrs = FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY | FILE_ARCHIVED;
|
||
|
if((DosFindFirst(szDestTemp, &hFile, ulAttrs, &fdFile, sizeof(fdFile), &ulFindCount, FIL_STANDARD)) != NO_ERROR)
|
||
|
bFound = FALSE;
|
||
|
else
|
||
|
bFound = TRUE;
|
||
|
while(bFound == TRUE)
|
||
|
{
|
||
|
if((stricmp(fdFile.achName, ".") != 0) && (stricmp(fdFile.achName, "..") != 0))
|
||
|
{
|
||
|
/* create full path */
|
||
|
strcpy(szDestTemp, szDestination);
|
||
|
AppendBackSlash(szDestTemp, sizeof(szDestTemp));
|
||
|
strcat(szDestTemp, fdFile.achName);
|
||
|
|
||
|
if(fdFile.attrFile & FILE_DIRECTORY)
|
||
|
{
|
||
|
DirectoryRemove(szDestTemp, bRemoveSubdirs);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DosDelete(szDestTemp);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ulFindCount = 1;
|
||
|
if (DosFindNext(hFile, &fdFile, sizeof(fdFile), &ulFindCount) == NO_ERROR) {
|
||
|
bFound = TRUE;
|
||
|
} else {
|
||
|
bFound = FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DosFindClose(hFile);
|
||
|
}
|
||
|
|
||
|
DosDeleteDir(szDestination);
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT ProcessRemoveDirectory(DWORD dwTiming, char *szSectionPrefix)
|
||
|
{
|
||
|
DWORD dwIndex;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szSection[MAX_BUF];
|
||
|
char szDestination[MAX_BUF];
|
||
|
BOOL bRemoveSubdirs;
|
||
|
|
||
|
dwIndex = 0;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "Remove Directory", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Destination", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
while(*szBuf != '\0')
|
||
|
{
|
||
|
if(TimingCheck(dwTiming, szSection, szFileIniConfig))
|
||
|
{
|
||
|
DecryptString(szDestination, szBuf);
|
||
|
GetPrivateProfileString(szSection, "Remove subdirs", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
bRemoveSubdirs = FALSE;
|
||
|
if(stricmp(szBuf, "TRUE") == 0)
|
||
|
bRemoveSubdirs = TRUE;
|
||
|
|
||
|
DirectoryRemove(szDestination, bRemoveSubdirs);
|
||
|
}
|
||
|
|
||
|
++dwIndex;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "Remove Directory", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Destination", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
}
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT ProcessRunApp(DWORD dwTiming, char *szSectionPrefix)
|
||
|
{
|
||
|
DWORD dwIndex;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szSection[MAX_BUF];
|
||
|
char szTarget[MAX_BUF];
|
||
|
char szParameters[MAX_BUF];
|
||
|
char szWorkingDir[MAX_BUF];
|
||
|
BOOL bRunApp;
|
||
|
BOOL bWait;
|
||
|
|
||
|
dwIndex = 0;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "RunApp", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Target", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
while(*szBuf != '\0')
|
||
|
{
|
||
|
if(TimingCheck(dwTiming, szSection, szFileIniConfig))
|
||
|
{
|
||
|
DecryptString(szTarget, szBuf);
|
||
|
GetPrivateProfileString(szSection, "Parameters", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(szParameters, szBuf);
|
||
|
|
||
|
// If we are given a criterion to test against, we expect also to be told whether we should run
|
||
|
// the app when that criterion is true or when it is false. If we are not told, we assume that
|
||
|
// we are to run the app when the criterion is true.
|
||
|
bRunApp = TRUE;
|
||
|
GetPrivateProfileString(szSection, "Criterion ID", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "RecaptureHP") == 0)
|
||
|
{
|
||
|
GetPrivateProfileString(szSection, "Run App If Criterion", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "FALSE") == 0)
|
||
|
{
|
||
|
if(diAdditionalOptions.bRecaptureHomepage == TRUE)
|
||
|
bRunApp = FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if(diAdditionalOptions.bRecaptureHomepage == FALSE)
|
||
|
bRunApp = FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
GetPrivateProfileString(szSection, "WorkingDir", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(szWorkingDir, szBuf);
|
||
|
|
||
|
GetPrivateProfileString(szSection, "Wait", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(stricmp(szBuf, "FALSE") == 0)
|
||
|
bWait = FALSE;
|
||
|
else
|
||
|
bWait = TRUE;
|
||
|
|
||
|
if ((bRunApp == TRUE) && FileExists(szTarget))
|
||
|
{
|
||
|
if((dwTiming == T_DEPEND_REBOOT) && (NeedReboot() == TRUE))
|
||
|
{
|
||
|
strcat(szTarget, " ");
|
||
|
strcat(szTarget, szParameters);
|
||
|
#ifdef OLDCODE /* @MAK */
|
||
|
/* Add an object to the startup folder that points to szTarget and uses szParameters */
|
||
|
/* and perhaps an xtra string that only we know (like deleteinstall)
|
||
|
/* Then add code to nsNativeAppSupportOS2.cpp that when it sees this string, it */
|
||
|
/* deletes the object from the startup folder */
|
||
|
/* This is used to allow the app to run automatically on reboot, but clean up */
|
||
|
/* after itself */
|
||
|
#endif
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
GetPrivateProfileString(szSection, "Message", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if ( szBuf[0] != '\0' )
|
||
|
ShowMessage(szBuf, TRUE);
|
||
|
WinSpawn(szTarget, szParameters, szWorkingDir, bWait);
|
||
|
if ( szBuf[0] != '\0' )
|
||
|
ShowMessage(szBuf, FALSE);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
++dwIndex;
|
||
|
BuildNumberedString(dwIndex, szSectionPrefix, "RunApp", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "Target", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
}
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT ProcessOS2INI(ULONG ulTiming, char *szSectionPrefix)
|
||
|
{
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szApp[MAX_BUF];
|
||
|
char szKey[MAX_BUF];
|
||
|
char szValue[MAX_BUF];
|
||
|
char szDecrypt[MAX_BUF];
|
||
|
char szSection[MAX_BUF];
|
||
|
BOOL bDnu;
|
||
|
ULONG ulIndex;
|
||
|
ULONG ulSize;
|
||
|
|
||
|
ulIndex = 0;
|
||
|
BuildNumberedString(ulIndex, szSectionPrefix, "OS2 INI", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "App", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
while(*szBuf != '\0')
|
||
|
{
|
||
|
if(TimingCheck(ulTiming, szSection, szFileIniConfig))
|
||
|
{
|
||
|
GetPrivateProfileString(szSection, "App", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
GetPrivateProfileString(szSection, "Decrypt App", "", szDecrypt, sizeof(szDecrypt), szFileIniConfig);
|
||
|
memset(szApp, 0, sizeof(szApp));
|
||
|
if(stricmp(szDecrypt, "TRUE") == 0)
|
||
|
DecryptString(szApp, szBuf);
|
||
|
else
|
||
|
strcpy(szApp, szBuf);
|
||
|
|
||
|
GetPrivateProfileString(szSection, "Key", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
GetPrivateProfileString(szSection, "Decrypt Key", "", szDecrypt, sizeof(szDecrypt), szFileIniConfig);
|
||
|
memset(szKey, 0, sizeof(szKey));
|
||
|
if(stricmp(szDecrypt, "TRUE") == 0)
|
||
|
DecryptString(szKey, szBuf);
|
||
|
else
|
||
|
strcpy(szKey, szBuf);
|
||
|
|
||
|
GetPrivateProfileString(szSection, "Key Value", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
GetPrivateProfileString(szSection, "Decrypt Key Value", "", szDecrypt, sizeof(szDecrypt), szFileIniConfig);
|
||
|
memset(szValue, 0, sizeof(szValue));
|
||
|
if(stricmp(szDecrypt, "TRUE") == 0)
|
||
|
DecryptString(szValue, szBuf);
|
||
|
else
|
||
|
strcpy(szValue, szBuf);
|
||
|
|
||
|
GetPrivateProfileString(szSection, "Size", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if(*szBuf != '\0')
|
||
|
ulSize = atoi(szBuf);
|
||
|
else
|
||
|
ulSize = 0;
|
||
|
|
||
|
GetPrivateProfileString(szSection,
|
||
|
"Do Not Uninstall",
|
||
|
"",
|
||
|
szBuf,
|
||
|
sizeof(szBuf),
|
||
|
szFileIniConfig);
|
||
|
if(stricmp(szBuf, "TRUE") == 0)
|
||
|
bDnu = TRUE;
|
||
|
else
|
||
|
bDnu = FALSE;
|
||
|
|
||
|
PrfWriteProfileString(HINI_USERPROFILE, szApp, szKey, szValue);
|
||
|
/* log the win reg command */
|
||
|
sprintf(szBuf, "%s [%s]", szApp, szKey);
|
||
|
UpdateInstallLog(KEY_STORE_INI_ENTRY, szBuf, bDnu);
|
||
|
}
|
||
|
|
||
|
++ulIndex;
|
||
|
BuildNumberedString(ulIndex, szSectionPrefix, "OS2 INI", szSection, sizeof(szSection));
|
||
|
GetPrivateProfileString(szSection, "App", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
}
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
/* Helper function that moves a given hobject to the front of */
|
||
|
/* an association string in OS2.INI */
|
||
|
|
||
|
void MoveHOBJToFront(HOBJECT hobject, char* szApp, char* szKey)
|
||
|
{
|
||
|
CHAR szhobj[CCHMAXPATH];
|
||
|
CHAR *szOrigBuffer, *szNewBuffer, *szCurrNew, *szCurrOrig;
|
||
|
ULONG ulSize;
|
||
|
int i;
|
||
|
|
||
|
sprintf(szhobj, "%d\0", hobject);
|
||
|
PrfQueryProfileSize(HINI_USERPROFILE, szApp, szKey, &ulSize );
|
||
|
szOrigBuffer = (char*)malloc(sizeof(char)*ulSize);
|
||
|
szNewBuffer = (char*)malloc(sizeof(char)*ulSize);
|
||
|
PrfQueryProfileData(HINI_USERPROFILE, szApp, szKey, szOrigBuffer, &ulSize);
|
||
|
szCurrOrig = szOrigBuffer;
|
||
|
szCurrNew = szNewBuffer;
|
||
|
strncpy(szCurrNew, szhobj, 7);
|
||
|
szCurrNew +=7;
|
||
|
for (i=0; i<ulSize/7; i++) {
|
||
|
if (strcmp(szCurrOrig, szhobj)) {
|
||
|
strncpy(szCurrNew, szCurrOrig, 7);
|
||
|
szCurrNew += 7;
|
||
|
}
|
||
|
szCurrOrig += 7;
|
||
|
}
|
||
|
PrfWriteProfileData(HINI_USERPROFILE, szApp, szKey, szNewBuffer, ulSize);
|
||
|
free(szOrigBuffer);
|
||
|
free(szNewBuffer);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT ProcessProgramFolder(DWORD dwTiming, char *szSectionPrefix)
|
||
|
{
|
||
|
DWORD dwIndex0;
|
||
|
DWORD dwIndex1;
|
||
|
char szIndex1[MAX_BUF];
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szBuf2[MAX_BUF];
|
||
|
char szSection0[MAX_BUF];
|
||
|
char szSection1[MAX_BUF];
|
||
|
char szProgramFolder[MAX_BUF];
|
||
|
|
||
|
char szClassName[MAX_BUF];
|
||
|
char szTitle[MAX_BUF];
|
||
|
char szObjectID[MAX_BUF];
|
||
|
char szSetupString[MAX_BUF];
|
||
|
char szLocation[MAX_BUF];
|
||
|
char szAssocFilters[MAX_BUF];
|
||
|
char szAssocTypes[MAX_BUF];
|
||
|
|
||
|
ULONG ulFlags = CO_REPLACEIFEXISTS;
|
||
|
|
||
|
dwIndex0 = 0;
|
||
|
BuildNumberedString(dwIndex0, szSectionPrefix, "Program Folder", szSection0, sizeof(szSection0));
|
||
|
GetPrivateProfileString(szSection0, "Timing", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
while(*szBuf != '\0')
|
||
|
{
|
||
|
if(TimingCheck(dwTiming, szSection0, szFileIniConfig))
|
||
|
{
|
||
|
DecryptString(szProgramFolder, szBuf);
|
||
|
|
||
|
dwIndex1 = 0;
|
||
|
_itoa(dwIndex1, szIndex1, 10);
|
||
|
strcpy(szSection1, szSection0);
|
||
|
strcat(szSection1, "-Object");
|
||
|
strcat(szSection1, szIndex1);
|
||
|
GetPrivateProfileString(szSection1, "Title", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
while(*szBuf != '\0')
|
||
|
{
|
||
|
*szSetupString = '\0';
|
||
|
DecryptString(szTitle, szBuf);
|
||
|
GetPrivateProfileString(szSection1, "Location", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(szLocation, szBuf);
|
||
|
GetPrivateProfileString(szSection1, "File", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(szBuf2, szBuf);
|
||
|
if (szBuf2[0]) {
|
||
|
if (szSetupString[0]) {
|
||
|
strcat(szSetupString, ";");
|
||
|
}
|
||
|
strcat(szSetupString, "EXENAME=");
|
||
|
strcat(szSetupString, szBuf2);
|
||
|
}
|
||
|
GetPrivateProfileString(szSection1, "Parameters", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(szBuf2, szBuf);
|
||
|
if (szBuf2[0]) {
|
||
|
if (szSetupString[0]) {
|
||
|
strcat(szSetupString, ";");
|
||
|
}
|
||
|
strcat(szSetupString, "PARAMETERS=");
|
||
|
strcat(szSetupString, szBuf2);
|
||
|
}
|
||
|
GetPrivateProfileString(szSection1, "Working Dir", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(szBuf2, szBuf);
|
||
|
if (szBuf2[0]) {
|
||
|
if (szSetupString[0]) {
|
||
|
strcat(szSetupString, ";");
|
||
|
}
|
||
|
strcat(szSetupString, "STARTUPDIR=");
|
||
|
strcat(szSetupString, szBuf2);
|
||
|
}
|
||
|
GetPrivateProfileString(szSection1, "Object ID", "", szObjectID, sizeof(szObjectID), szFileIniConfig);
|
||
|
if (szObjectID[0]) {
|
||
|
if (szSetupString[0]) {
|
||
|
strcat(szSetupString, ";");
|
||
|
}
|
||
|
strcat(szSetupString, "OBJECTID=");
|
||
|
strcat(szSetupString, szObjectID);
|
||
|
}
|
||
|
GetPrivateProfileString(szSection1, "Association Filters", "", szAssocFilters, sizeof(szAssocFilters), szFileIniConfig);
|
||
|
if (szAssocFilters[0]) {
|
||
|
if (diOS2Integration.oiCBAssociateHTML.bCheckBoxState == TRUE) {
|
||
|
if (szSetupString[0]) {
|
||
|
strcat(szSetupString, ";");
|
||
|
}
|
||
|
strcat(szSetupString, "ASSOCFILTER=");
|
||
|
strcat(szSetupString, szAssocFilters);
|
||
|
}
|
||
|
}
|
||
|
GetPrivateProfileString(szSection1, "Association Types", "", szAssocTypes, sizeof(szAssocTypes), szFileIniConfig);
|
||
|
if (szAssocTypes[0]) {
|
||
|
if (diOS2Integration.oiCBAssociateHTML.bCheckBoxState == TRUE) {
|
||
|
if (szSetupString[0]) {
|
||
|
strcat(szSetupString, ";");
|
||
|
}
|
||
|
strcat(szSetupString, "ASSOCTYPE=");
|
||
|
strcat(szSetupString, szAssocTypes);
|
||
|
}
|
||
|
}
|
||
|
GetPrivateProfileString(szSection1, "Setup String", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(szBuf2, szBuf);
|
||
|
if (szBuf2[0]) {
|
||
|
if (szSetupString[0]) {
|
||
|
strcat(szSetupString, ";");
|
||
|
}
|
||
|
strcat(szSetupString, szBuf2);
|
||
|
}
|
||
|
GetPrivateProfileString(szSection1, "ClassName", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if (szBuf[0]) {
|
||
|
strcpy(szClassName, szBuf);
|
||
|
} else {
|
||
|
strcpy(szClassName, "WPProgram");
|
||
|
}
|
||
|
|
||
|
GetPrivateProfileString(szSection1, "Attributes", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
if (szBuf[0]) {
|
||
|
if (strcmp(szBuf, "UPDATE") == 0) {
|
||
|
ulFlags = CO_UPDATEIFEXISTS;
|
||
|
} else if (strcmp(szBuf, "FAIL") == 0) {
|
||
|
ulFlags = CO_FAILIFEXISTS;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
WinCreateObject(szClassName, szTitle, szSetupString, szLocation, ulFlags);
|
||
|
|
||
|
if (szObjectID[0]) {
|
||
|
strcpy(szBuf, szObjectID);
|
||
|
} else {
|
||
|
strcpy(szBuf, szProgramFolder);
|
||
|
AppendBackSlash(szBuf, sizeof(szBuf));
|
||
|
strcat(szBuf, szTitle);
|
||
|
}
|
||
|
UpdateInstallLog(KEY_OS2_OBJECT, szBuf, FALSE);
|
||
|
|
||
|
if ((diOS2Integration.oiCBAssociateHTML.bCheckBoxState == TRUE) &&
|
||
|
(szAssocFilters[0] || szAssocTypes[0])) {
|
||
|
HOBJECT hobj = WinQueryObject(szBuf);
|
||
|
if (szAssocFilters[0]) {
|
||
|
char *currFilter = strtok(szAssocFilters, ",");
|
||
|
while (currFilter) {
|
||
|
MoveHOBJToFront(hobj, "PMWP_ASSOC_FILTER", currFilter);
|
||
|
currFilter = strtok(NULL, ",");
|
||
|
}
|
||
|
}
|
||
|
if (szAssocTypes[0]) {
|
||
|
char *currType = strtok(szAssocTypes, ",");
|
||
|
while (currType) {
|
||
|
MoveHOBJToFront(hobj, "PMWP_ASSOC_TYPE", currType);
|
||
|
currType = strtok(NULL, ",");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
++dwIndex1;
|
||
|
_itoa(dwIndex1, szIndex1, 10);
|
||
|
strcpy(szSection1, szSection0);
|
||
|
strcat(szSection1, "-Object");
|
||
|
strcat(szSection1, szIndex1);
|
||
|
GetPrivateProfileString(szSection1, "Title", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
++dwIndex0;
|
||
|
BuildNumberedString(dwIndex0, szSectionPrefix, "Program Folder", szSection0, sizeof(szSection0));
|
||
|
GetPrivateProfileString(szSection0, "Program Folder", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
}
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT ProcessProgramFolderShowCmd()
|
||
|
{
|
||
|
DWORD dwIndex0;
|
||
|
int iShowFolder;
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szSection0[MAX_BUF];
|
||
|
char szProgramFolder[MAX_BUF];
|
||
|
|
||
|
dwIndex0 = 0;
|
||
|
BuildNumberedString(dwIndex0, NULL, "Program Folder", szSection0, sizeof(szSection0));
|
||
|
GetPrivateProfileString(szSection0, "Program Folder", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
while(*szBuf != '\0')
|
||
|
{
|
||
|
DecryptString(szProgramFolder, szBuf);
|
||
|
GetPrivateProfileString(szSection0, "Show Folder", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
|
||
|
#ifdef OLDCODE
|
||
|
if(stricmp(szBuf, "HIDE") == 0)
|
||
|
iShowFolder = SW_HIDE;
|
||
|
else if(stricmp(szBuf, "MAXIMIZE") == 0)
|
||
|
iShowFolder = SW_MAXIMIZE;
|
||
|
else if(stricmp(szBuf, "MINIMIZE") == 0)
|
||
|
iShowFolder = SW_MINIMIZE;
|
||
|
else if(stricmp(szBuf, "RESTORE") == 0)
|
||
|
iShowFolder = SW_RESTORE;
|
||
|
else if(stricmp(szBuf, "SHOW") == 0)
|
||
|
iShowFolder = SW_SHOW;
|
||
|
else if(stricmp(szBuf, "SHOWMAXIMIZED") == 0)
|
||
|
iShowFolder = SW_SHOWMAXIMIZED;
|
||
|
else if(stricmp(szBuf, "SHOWMINIMIZED") == 0)
|
||
|
iShowFolder = SW_SHOWMINIMIZED;
|
||
|
else if(stricmp(szBuf, "SHOWMINNOACTIVE") == 0)
|
||
|
iShowFolder = SW_SHOWMINNOACTIVE;
|
||
|
else if(stricmp(szBuf, "SHOWNA") == 0)
|
||
|
iShowFolder = SW_SHOWNA;
|
||
|
else if(stricmp(szBuf, "SHOWNOACTIVATE") == 0)
|
||
|
iShowFolder = SW_SHOWNOACTIVATE;
|
||
|
else if(stricmp(szBuf, "SHOWNORMAL") == 0)
|
||
|
iShowFolder = SW_SHOWNORMAL;
|
||
|
|
||
|
if(iShowFolder != SW_HIDE)
|
||
|
if(sgProduct.dwMode != SILENT)
|
||
|
WinSpawn(szProgramFolder, NULL, NULL, TRUE);
|
||
|
|
||
|
#endif
|
||
|
++dwIndex0;
|
||
|
BuildNumberedString(dwIndex0, NULL, "Program Folder", szSection0, sizeof(szSection0));
|
||
|
GetPrivateProfileString(szSection0, "Program Folder", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
}
|
||
|
return(FO_SUCCESS);
|
||
|
}
|
||
|
|
||
|
HRESULT ProcessCreateCustomFiles(DWORD dwTiming)
|
||
|
{
|
||
|
DWORD dwCompIndex;
|
||
|
DWORD dwFileIndex;
|
||
|
DWORD dwSectIndex;
|
||
|
DWORD dwKVIndex;
|
||
|
siC *siCObject = NULL;
|
||
|
char szBufTiny[MAX_BUF_TINY];
|
||
|
char szSection[MAX_BUF_TINY];
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szFileName[MAX_BUF];
|
||
|
char szDefinedSection[MAX_BUF];
|
||
|
char szDefinedKey[MAX_BUF];
|
||
|
char szDefinedValue[MAX_BUF];
|
||
|
|
||
|
dwCompIndex = 0;
|
||
|
siCObject = SiCNodeGetObject(dwCompIndex, TRUE, AC_ALL);
|
||
|
|
||
|
while(siCObject)
|
||
|
{
|
||
|
dwFileIndex = 0;
|
||
|
sprintf(szSection,"%s-Configuration File%d",siCObject->szReferenceName,dwFileIndex);
|
||
|
siCObject = SiCNodeGetObject(++dwCompIndex, TRUE, AC_ALL);
|
||
|
if(TimingCheck(dwTiming, szSection, szFileIniConfig) == FALSE)
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
GetPrivateProfileString(szSection, "FileName", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
while (*szBuf != '\0')
|
||
|
{
|
||
|
DecryptString(szFileName, szBuf);
|
||
|
if(FileExists(szFileName))
|
||
|
{
|
||
|
DosDelete(szFileName);
|
||
|
}
|
||
|
|
||
|
/* TO DO - Support a File Type for something other than .ini */
|
||
|
dwSectIndex = 0;
|
||
|
sprintf(szBufTiny, "Section%d",dwSectIndex);
|
||
|
GetPrivateProfileString(szSection, szBufTiny, "", szDefinedSection, sizeof(szDefinedSection), szFileIniConfig);
|
||
|
while(*szDefinedSection != '\0')
|
||
|
{
|
||
|
dwKVIndex =0;
|
||
|
sprintf(szBufTiny,"Section%d-Key%d",dwSectIndex,dwKVIndex);
|
||
|
GetPrivateProfileString(szSection, szBufTiny, "", szDefinedKey, sizeof(szDefinedKey), szFileIniConfig);
|
||
|
while(*szDefinedKey != '\0')
|
||
|
{
|
||
|
sprintf(szBufTiny,"Section%d-Value%d",dwSectIndex,dwKVIndex);
|
||
|
GetPrivateProfileString(szSection, szBufTiny, "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
DecryptString(szDefinedValue, szBuf);
|
||
|
if(WritePrivateProfileString(szDefinedSection, szDefinedKey, szDefinedValue, szFileName) == 0)
|
||
|
{
|
||
|
char szEWPPS[MAX_BUF];
|
||
|
char szBuf[MAX_BUF];
|
||
|
char szBuf2[MAX_BUF];
|
||
|
if(GetPrivateProfileString("Messages", "ERROR_WRITEPRIVATEPROFILESTRING", "", szEWPPS, sizeof(szEWPPS), szFileIniInstall))
|
||
|
{
|
||
|
sprintf(szBuf, "%s\n [%s]\n %s=%s", szFileName, szDefinedSection, szDefinedKey, szDefinedValue);
|
||
|
sprintf(szBuf2, szEWPPS, szBuf);
|
||
|
PrintError(szBuf2, ERROR_CODE_SHOW);
|
||
|
}
|
||
|
return(FO_ERROR_WRITE);
|
||
|
}
|
||
|
sprintf(szBufTiny,"Section%d-Key%d",dwSectIndex,++dwKVIndex);
|
||
|
GetPrivateProfileString(szSection, szBufTiny, "", szDefinedKey, sizeof(szDefinedKey), szFileIniConfig);
|
||
|
} /* while(*szDefinedKey != '\0') */
|
||
|
|
||
|
sprintf(szBufTiny, "Section%d",++dwSectIndex);
|
||
|
GetPrivateProfileString(szSection, szBufTiny, "", szDefinedSection, sizeof(szDefinedSection), szFileIniConfig);
|
||
|
} /* while(*szDefinedSection != '\0') */
|
||
|
|
||
|
sprintf(szSection,"%s-Configuration File%d",siCObject->szReferenceName,++dwFileIndex);
|
||
|
GetPrivateProfileString(szSection, "FileName", "", szBuf, sizeof(szBuf), szFileIniConfig);
|
||
|
} /* while(*szBuf != '\0') */
|
||
|
} /* while(siCObject) */
|
||
|
return (FO_SUCCESS);
|
||
|
}
|
||
|
|