|
|
//
// AppList.C
//
// Copyright (C) Microsoft, 1994, 1995, All Rights Reserved.
//
// History:
// ral 5/23/94 - First pass
// ral 9/09/94 - Clean up
// 3/20/95 [stevecat] - NT port & real clean up, unicode, etc.
//
//
#include "priv.h"
#include "appwiz.h"
#include "regstr.h"
#ifdef DOWNLEVEL
static const DWORD aApplistHelpIDs[] = { IDC_BUTTONSETUPFROMLIST, IDH_APPWIZ_NETINTALLL_BUTTON, IDC_APPLIST, IDH_APPWIZ_NETINSTALL_LIST, 0, 0 };
#define INST_SECTION TEXT("AppInstallList") // RESOURCE?
#define MAX_KEY_SIZE 45000
//
// Fills in the name of the INF file in the wiz data structure. If
// no INF file is specified then returns FALSE, else TRUE.
//
BOOL AppListGetInfName(LPWIZDATA lpwd) { HKEY hk; LONG RegResult; DWORD cbFileName = sizeof(lpwd->szIniFile); DWORD dwType; BOOL bFileExists = FALSE;
if (RegOpenKey(HKEY_LOCAL_MACHINE, REGSTR_PATH_SETUP, &hk) != ERROR_SUCCESS) { return(FALSE); } RegResult = RegQueryValueEx(hk, REGSTR_VAL_APPINSTPATH, NULL, &dwType, (LPBYTE) lpwd->szIniFile, &cbFileName); RegCloseKey(hk);
if (RegResult == ERROR_SUCCESS && dwType == REG_SZ) { bFileExists = PathFileExists(lpwd->szIniFile); }
if (!bFileExists) { lpwd->szIniFile[0] = 0; }
return(bFileExists); }
#ifdef DEBUG
void ValidateINIEntry(LPWIZDATA lpwd, LPTSTR lpszKeyName) { TCHAR szFileName[MAX_PATH];
if (GetPrivateProfileString(INST_SECTION, lpszKeyName, TEXT(""), szFileName, ARRAYSIZE(szFileName), lpwd->szIniFile)) { LPTSTR lpszRealName = szFileName;
if (*lpszRealName == TEXT('*')) { lpszRealName++; }
if (!PathFileExists(lpszRealName)) { ShellMessageBox(g_hinst, lpwd->hwnd, TEXT("Entry for %1%s points to non-existant setup program: %2%s"), 0, MB_OK | MB_ICONEXCLAMATION, lpszKeyName, szFileName); } } else { ShellMessageBox(g_hinst, lpwd->hwnd, TEXT("Bad INI file format for entry %1%s."), 0, MB_OK | MB_ICONEXCLAMATION, lpszKeyName); } } #endif // DEBUG
//
// Initializes the applist property sheet. This function assumes that
// someone else (appwiz.c) has already called AppListGetInfName and the
// inf file name has already been filled in in the wizard data structure.
// If the string is empty, then this function simply returns.
//
void AppList_InitListBox(HWND hDlg, LPPROPSHEETPAGE lpp) { LPWIZDATA lpwd = (LPWIZDATA)lpp->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)lpp);
if (lpwd->szIniFile[0] != 0) { HWND hLB = GetDlgItem(hDlg, IDC_APPLIST); LPTSTR lpszKeys = (LPTSTR)GlobalAllocPtr(GPTR, MAX_KEY_SIZE*sizeof(TCHAR));
ListBox_ResetContent(hLB);
//
// If the localalloc failed then we'll just have a
// empty list.
//
if (lpszKeys) { HCURSOR hcurOld = SetCursor(LoadCursor(NULL, IDC_WAIT));
if (GetPrivateProfileString(INST_SECTION, NULL, NULL, lpszKeys, MAX_KEY_SIZE, lpwd->szIniFile)) { LPTSTR lpszCurPos = lpszKeys; int iCurLBPos = 0;
while (*lpszCurPos) { ListBox_InsertString(hLB, iCurLBPos++, lpszCurPos); #ifdef DEBUG
ValidateINIEntry(lpwd, lpszCurPos); #endif
while (*lpszCurPos != 0) { lpszCurPos = CharNext(lpszCurPos); } lpszCurPos++; } } GlobalFreePtr(lpszKeys); SetCursor(hcurOld); } ListBox_SetCurSel(hLB, 0); } }
//
// Copies the name of the setup program into the wizard data
//
BOOL GetListSel(HWND hLB, int iCurSel, LPWIZDATA lpwd) { TCHAR szKeyName[MAX_PATH];
if ((iCurSel != LB_ERR) && (ListBox_GetTextLen(hLB, iCurSel) <= ARRAYSIZE(szKeyName))) { ListBox_GetText(hLB, iCurSel, szKeyName);
if (GetPrivateProfileString(INST_SECTION, szKeyName, TEXT(""), lpwd->szExeName, ARRAYSIZE(lpwd->szExeName), lpwd->szIniFile)) { lpwd->szParams[0] = 0; // Make sure this string is empty
return(TRUE); } } return(FALSE); }
//
// Dismisses the property sheet by pressing the "OK" button.
//
void DismissCPL(LPWIZDATA lpwd) { PropSheet_PressButton(GetParent(lpwd->hwnd), PSBTN_OK); }
//
// Install property sheet page -- Used only if there is an AppInstallPath
// specified in the registry. Otherwise, use NoListInstallDlgProc.
//
BOOL_PTR CALLBACK AppListDlgProc(HWND hDlg, UINT message , WPARAM wParam, LPARAM lParam) { NMHDR FAR *lpnm; LPPROPSHEETPAGE lpPropSheet = (LPPROPSHEETPAGE)(GetWindowLongPtr(hDlg, DWLP_USER)); LPWIZDATA lpwd;
if (lpPropSheet) { lpwd = (LPWIZDATA)lpPropSheet->lParam; } switch(message) { case WM_NOTIFY: lpnm = (NMHDR FAR *)lParam;
switch(lpnm->code) { case PSN_SETACTIVE: lpwd->hwnd = hDlg; break;
default: return FALSE; } break;
case WM_INITDIALOG: lpPropSheet = (LPPROPSHEETPAGE)lParam; AppList_InitListBox(hDlg, lpPropSheet); break;
case WM_DESTROY: break;
case WM_HELP: WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle, NULL, HELP_WM_HELP, (DWORD_PTR)aApplistHelpIDs); break;
case WM_CONTEXTMENU: WinHelp((HWND)wParam, NULL, HELP_CONTEXTMENU, (DWORD_PTR)aApplistHelpIDs); break;
case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_BUTTONSETUPFROMLIST: if (GET_WM_COMMAND_CMD(wParam, lParam) == BN_CLICKED) { HWND hLB = GetDlgItem(hDlg, IDC_APPLIST); int iCurSel = ListBox_GetCurSel(hLB);
if (iCurSel != LB_ERR && GetListSel(hLB, iCurSel, lpwd) && ExecSetupProg(lpwd, FALSE, TRUE)) { DismissCPL(lpwd); } }
case IDC_APPLIST: if (GET_WM_COMMAND_CMD(wParam, lParam) == LBN_DBLCLK) { SendMessage(hDlg, WM_COMMAND, GET_WM_COMMAND_MPS(IDC_BUTTONSETUPFROMLIST, GetDlgItem(hDlg, IDC_BUTTONSETUPFROMLIST), BN_CLICKED)); } break;
} break;
default: return FALSE;
} // end of switch on message
return TRUE;
} // AppListdlgProc
#endif // DOWNLEVEL
//
// Executes the appropriate setup program
//
BOOL ExecSetupProg(LPWIZDATA lpwd, BOOL ForceWx86, BOOL bMinimizeWiz) { SHELLEXECUTEINFO ei; BOOL fWorked= FALSE;
#ifdef WX86
DWORD Len; WCHAR ProcArchValue[32]; #endif
HWND hDlgPropSheet = GetParent(lpwd->hwnd); LPTSTR lpszTarget = NULL;
ei.cbSize = sizeof(ei); ei.hwnd = lpwd->hwnd; ei.lpVerb = NULL; ei.fMask = 0;
lpszTarget = (lpwd->dwFlags & WDFLAG_EXPSZ) ? lpwd->szExpExeName : lpwd->szExeName; if (lpszTarget[0] == TEXT('*')) { ei.lpFile = CharNext(lpszTarget); ei.fMask |= SEE_MASK_CONNECTNETDRV; } else { ei.lpFile = lpszTarget; }
if (lpwd->szParams[0] == 0) { ei.lpParameters = NULL; } else { ei.lpParameters = lpwd->szParams; }
if (lpwd->szWorkingDir[0] == TEXT('\0')) { ei.lpDirectory = NULL; } else { ei.lpDirectory = lpwd->szWorkingDir; }
ei.lpClass = NULL; ei.nShow = SW_SHOWDEFAULT; ei.hInstApp = g_hinst;
if (bMinimizeWiz) SetWindowPos(hDlgPropSheet, 0, 0, 0, 0, 0, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER);
#ifdef WX86
if (ForceWx86) { Len = GetEnvironmentVariableW(ProcArchName, ProcArchValue, sizeof(ProcArchValue) );
if (!Len || Len >= sizeof(ProcArchValue)) { ProcArchValue[0]=L'\0'; }
SetEnvironmentVariableW(ProcArchName, L"x86"); ei.fMask |= SEE_MASK_FLAG_SEPVDM;
} #endif
fWorked = ShellExecuteEx(&ei);
#ifdef WX86
if (ForceWx86) { SetEnvironmentVariableW(ProcArchName, ProcArchValue); } #endif
if (!fWorked) { //
// Something went wrong. Put the dialog back up.
//
SetWindowPos(hDlgPropSheet, 0, 0, 0, 0, 0, SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER); ShellMessageBox(g_hinst, lpwd->hwnd, MAKEINTRESOURCE(IDS_BADSETUP), 0, MB_OK | MB_ICONEXCLAMATION); }
return(fWorked); }
|