You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
438 lines
16 KiB
438 lines
16 KiB
#include "precomp.h"
|
|
#include <admparse.h>
|
|
|
|
#define NUM_ICONS 3
|
|
|
|
extern TCHAR g_szCustIns[MAX_PATH];
|
|
extern TCHAR g_szBuildRoot[MAX_PATH];
|
|
extern TCHAR g_szWizRoot[MAX_PATH];
|
|
extern TCHAR g_szLoadedIns[MAX_PATH];
|
|
extern TCHAR g_szTempSign[MAX_PATH];
|
|
extern TCHAR g_szTitle[MAX_PATH];
|
|
extern TCHAR g_szLanguage[16];
|
|
extern BOOL g_fBranded, g_fIntranet;
|
|
extern PROPSHEETPAGE g_psp[NUM_PAGES];
|
|
extern int g_iCurPage;
|
|
|
|
static int s_ADMOpen, s_ADMClose, s_ADMCategory;
|
|
DWORD g_dwADMPlatformId = PLATFORM_WIN32;
|
|
|
|
// Creates image list, adds 3 bitmaps to it, and associates the image
|
|
// list with the treeview control.
|
|
LRESULT InitImageList(HWND hTreeView)
|
|
{
|
|
HIMAGELIST hWndImageList;
|
|
HICON hIcon;
|
|
|
|
hWndImageList = ImageList_Create(GetSystemMetrics (SM_CXSMICON),
|
|
GetSystemMetrics (SM_CYSMICON),
|
|
TRUE,
|
|
NUM_ICONS,
|
|
3);
|
|
if(!hWndImageList)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
hIcon = LoadIcon(g_rvInfo.hInst, MAKEINTRESOURCE(IDI_ICON2));
|
|
s_ADMOpen = ImageList_AddIcon(hWndImageList, hIcon);
|
|
DestroyIcon(hIcon);
|
|
|
|
hIcon = LoadIcon(g_rvInfo.hInst, MAKEINTRESOURCE(IDI_ICON3));
|
|
s_ADMClose = ImageList_AddIcon(hWndImageList, hIcon);
|
|
DestroyIcon(hIcon);
|
|
|
|
hIcon = LoadIcon(g_rvInfo.hInst, MAKEINTRESOURCE(IDI_ICON4));
|
|
s_ADMCategory = ImageList_AddIcon(hWndImageList, hIcon);
|
|
DestroyIcon(hIcon);
|
|
|
|
// Fail if not all images were added.
|
|
if (ImageList_GetImageCount(hWndImageList) < NUM_ICONS)
|
|
{
|
|
// ERROR: Unable to add all images to image list.
|
|
return FALSE;
|
|
}
|
|
|
|
// Associate image list with treeView control.
|
|
TreeView_SetImageList(hTreeView, hWndImageList, TVSIL_NORMAL);
|
|
return TRUE;
|
|
}
|
|
|
|
void DeleteOldAdmFiles(LPCTSTR pcszImportIns, LPCTSTR pcszBrandDir)
|
|
{
|
|
TCHAR szBuf[8];
|
|
TCHAR szFile[MAX_PATH];
|
|
LPTSTR pszDot;
|
|
HANDLE hFind;
|
|
WIN32_FIND_DATA fd;
|
|
|
|
GetPrivateProfileString(BRANDING, LANG_LOCALE, TEXT("EN"), szBuf, countof(szBuf), pcszImportIns);
|
|
PathCombine(szFile, g_szWizRoot, TEXT("policies"));
|
|
PathAppend(szFile, szBuf); // language
|
|
PathAppend(szFile, TEXT("*.adm"));
|
|
|
|
if ((hFind = FindFirstFile(szFile, &fd)) != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
StrCpy(szFile, fd.cFileName);
|
|
if ((pszDot = StrRChr(szFile, NULL, TEXT('.'))) != NULL)
|
|
{
|
|
*pszDot = TEXT('\0');
|
|
WritePrivateProfileString(IS_EXTREGINF, szFile, NULL, g_szCustIns);
|
|
StrCpy(pszDot, TEXT(".inf"));
|
|
DeleteFileInDir(szFile, pcszBrandDir);
|
|
}
|
|
} while (FindNextFile(hFind, &fd));
|
|
}
|
|
}
|
|
|
|
// FUNCTION: ADMParse(HWND, UINT, UINT, LONG)
|
|
//
|
|
// PURPOSE: Processes messages for ADM page
|
|
//
|
|
// MESSAGES:
|
|
//
|
|
// WM_INITDIALOG - intializes the page
|
|
// WM_NOTIFY - processes the notifications sent to the page
|
|
// WM_COMMAND - saves the id of the choice selected
|
|
|
|
INT_PTR CALLBACK ADMParse(
|
|
HWND hDlg,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam)
|
|
{
|
|
HWND hTreeView = GetDlgItem(hDlg, IDC_ADMTREE);
|
|
LPNM_TREEVIEW lpNMTreeView = (LPNM_TREEVIEW) lParam;
|
|
TV_ITEM tvitem, tvitem1;
|
|
HTREEITEM hItem;
|
|
HTREEITEM hParentItem;
|
|
TCHAR szMessage[512];
|
|
TCHAR szTemp[MAX_PATH];
|
|
RECT rect;
|
|
RECT rectDlg;
|
|
RECT rectDscr;
|
|
static TCHAR szWorkDir[MAX_PATH];
|
|
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
InitSysFont( hDlg, IDC_ADMTREE);
|
|
g_hWizard = hDlg;
|
|
InitImageList(hTreeView);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADMDELETE), FALSE);
|
|
#ifdef UNICODE
|
|
TreeView_SetUnicodeFormat(hTreeView, TRUE);
|
|
#else
|
|
TreeView_SetUnicodeFormat(hTreeView, FALSE);
|
|
#endif
|
|
break;
|
|
|
|
case IDM_BATCHADVANCE:
|
|
DoBatchAdvance(hDlg);
|
|
break;
|
|
|
|
case WM_HELP:
|
|
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (HIWORD(wParam))
|
|
{
|
|
case BN_CLICKED:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDC_ADMIMPORT:
|
|
wnsprintf(szTemp, countof(szTemp), TEXT("%sPolicies%s"), g_szWizRoot, g_szLanguage);
|
|
ImportADMFile(hDlg, hTreeView, szTemp, szWorkDir, GetRole(g_fBranded, g_fIntranet), g_szCustIns);
|
|
|
|
if((hItem = TreeView_GetSelection(hTreeView)) == NULL ||
|
|
TreeView_GetParent(hTreeView, hItem) != NULL ||
|
|
!CanDeleteADM(hTreeView, hItem)) {
|
|
EnsureDialogFocus(hDlg, IDC_ADMDELETE, IDC_ADMIMPORT);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADMDELETE), FALSE);
|
|
}
|
|
else
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADMDELETE), TRUE);
|
|
break;
|
|
|
|
case IDC_ADMDELETE:
|
|
LoadString(g_rvInfo.hInst, IDS_ADMDELWARN, szMessage, countof(szMessage));
|
|
if(MessageBox(hDlg, szMessage, g_szTitle, MB_ICONQUESTION|MB_YESNO) == IDYES)
|
|
{
|
|
hItem = TreeView_GetSelection(hTreeView);
|
|
DeleteADMItem(hTreeView, hItem, szWorkDir, g_szCustIns, TRUE, TRUE);
|
|
|
|
if ((hItem = TreeView_GetSelection(hTreeView)) == NULL ||
|
|
TreeView_GetParent(hTreeView, hItem) != NULL ||
|
|
!CanDeleteADM(hTreeView, hItem)) {
|
|
EnsureDialogFocus(hDlg, IDC_ADMDELETE, IDC_ADMIMPORT);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADMDELETE), FALSE);
|
|
}
|
|
else
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADMDELETE), TRUE);
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
switch (((NMHDR FAR *) lParam)->code)
|
|
{
|
|
case PSN_HELP:
|
|
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
|
|
break;
|
|
|
|
case PSN_SETACTIVE:
|
|
SetBannerText(hDlg);
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
|
|
|
|
GetWindowRect(hDlg, &rectDlg);
|
|
GetWindowRect(GetDlgItem(hDlg, IDC_ADMINSTR), &rect);
|
|
|
|
rectDscr.left = rect.left - rectDlg.left + 1;
|
|
rectDscr.top = rect.top - rectDlg.top + 1;
|
|
rectDscr.right = rectDscr.left + (rect.right - rect.left) - 2;
|
|
rectDscr.bottom = rectDscr.top + (rect.bottom - rect.top) - 2;
|
|
|
|
CreateADMWindow(hTreeView, GetDlgItem(hDlg, IDC_ADMDELETE), rectDscr.left,
|
|
rectDscr.top, rectDscr.right - rectDscr.left,
|
|
rectDscr.bottom - rectDscr.top);
|
|
|
|
wnsprintf(szTemp, countof(szTemp), TEXT("%sPolicies%s"), g_szWizRoot, g_szLanguage);
|
|
PathCombine(szWorkDir, g_szBuildRoot, TEXT("INS"));
|
|
PathAppend(szWorkDir, GetOutputPlatformDir());
|
|
PathAppend(szWorkDir, g_szLanguage);
|
|
PathRemoveBackslash(szWorkDir);
|
|
{
|
|
CNewCursor cur(IDC_WAIT);
|
|
int nRole = GetRole(g_fBranded, g_fIntranet);
|
|
|
|
if(!LoadADMFiles(hTreeView, NULL, szTemp, szWorkDir, g_dwADMPlatformId, nRole,
|
|
s_ADMClose, s_ADMCategory))
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADMIMPORT), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADMDELETE), FALSE);
|
|
}
|
|
else
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADMIMPORT), TRUE);
|
|
if(TreeView_GetSelection(hTreeView) == NULL)
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADMDELETE), FALSE);
|
|
else
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADMDELETE), TRUE);
|
|
}
|
|
|
|
// delete old adm files from an imported ins file
|
|
|
|
if (GetPrivateProfileInt(IS_BRANDING, TEXT("DeleteAdms"), 0, g_szCustIns))
|
|
{
|
|
TCHAR szImportInsFile[MAX_PATH];
|
|
|
|
if (ISNULL(g_szLoadedIns))
|
|
{
|
|
GetPrivateProfileString(IS_BRANDING, TEXT("ImportIns"), TEXT(""),
|
|
szImportInsFile, countof(szImportInsFile), g_szCustIns);
|
|
}
|
|
else
|
|
StrCpy(szImportInsFile, g_szLoadedIns);
|
|
|
|
// only do process if we got the path of the ins file and extreginf section
|
|
// is not empty
|
|
|
|
if (ISNONNULL(szImportInsFile) &&
|
|
!InsIsSectionEmpty(IS_EXTREGINF, szImportInsFile))
|
|
DeleteOldAdmFiles(szImportInsFile, g_szTempSign);
|
|
}
|
|
}
|
|
CheckBatchAdvance(hDlg);
|
|
break;
|
|
|
|
case PSN_WIZBACK:
|
|
case PSN_WIZNEXT:
|
|
DeleteADMItems(hTreeView, szWorkDir, g_szCustIns, TRUE);
|
|
TreeView_DeleteAllItems(hTreeView);
|
|
DestroyADMWindow(hTreeView);
|
|
|
|
g_iCurPage = PPAGE_ADM;
|
|
EnablePages();
|
|
if (((NMHDR FAR *) lParam)->code == PSN_WIZNEXT)
|
|
PageNext(hDlg);
|
|
else
|
|
PagePrev(hDlg);
|
|
break;
|
|
|
|
case PSN_QUERYCANCEL:
|
|
if(QueryCancel(hDlg) == TRUE)
|
|
{
|
|
DeleteADMItems(hTreeView, szWorkDir, g_szCustIns, FALSE);
|
|
DestroyADMWindow(hTreeView);
|
|
}
|
|
break;
|
|
|
|
case TVN_SELCHANGED:
|
|
hParentItem = TreeView_GetParent(hTreeView, lpNMTreeView->itemNew.hItem);
|
|
SelectADMItem(hDlg, hTreeView, &lpNMTreeView->itemOld, FALSE, FALSE);
|
|
// display the information for the newly selected item
|
|
DisplayADMItem(hDlg, hTreeView, &lpNMTreeView->itemNew, FALSE);
|
|
if (hParentItem != NULL ||
|
|
(lpNMTreeView->itemNew.hItem != NULL && !CanDeleteADM(hTreeView, lpNMTreeView->itemNew.hItem))) {
|
|
EnsureDialogFocus(hDlg, IDC_ADMDELETE, IDC_ADMIMPORT);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADMDELETE), FALSE);
|
|
}
|
|
else
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ADMDELETE), TRUE);
|
|
break;
|
|
|
|
case TVN_ITEMEXPANDED:
|
|
tvitem.mask = TVIF_IMAGE;
|
|
tvitem.hItem = lpNMTreeView->itemNew.hItem;
|
|
TreeView_GetItem(hTreeView, &tvitem);
|
|
|
|
// If tree item is EXPANDING (opening up) and
|
|
// current icon == CloseFolder, change icon to OpenFolder
|
|
if((lpNMTreeView->action == TVE_EXPAND) &&
|
|
(tvitem.iImage == s_ADMClose))
|
|
{
|
|
tvitem1.hItem = lpNMTreeView->itemNew.hItem;
|
|
tvitem1.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
|
|
tvitem1.iImage = s_ADMOpen;
|
|
tvitem1.iSelectedImage = s_ADMOpen;
|
|
|
|
TreeView_SetItem(hTreeView, &tvitem1);
|
|
}
|
|
|
|
// If tree item is COLLAPSING (closing up) and
|
|
// current icon == OpenFolder, change icon to CloseFolder
|
|
else if((lpNMTreeView->action == TVE_COLLAPSE) &&
|
|
(tvitem.iImage == s_ADMOpen))
|
|
{
|
|
tvitem1.hItem = lpNMTreeView->itemNew.hItem;
|
|
tvitem1.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
|
|
tvitem1.iImage = s_ADMClose;
|
|
tvitem1.iSelectedImage = s_ADMClose;
|
|
|
|
TreeView_SetItem(hTreeView, &tvitem1);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
// Indicates whether to display/hide the adm page in the wizard
|
|
// If the correct Roles are set or no Roles set at all in the adm file,
|
|
// the page is displayed
|
|
BOOL ADMEnablePage()
|
|
{
|
|
TCHAR szFileName[MAX_PATH];
|
|
TCHAR szFilePath[MAX_PATH];
|
|
WIN32_FIND_DATA FindFileData;
|
|
|
|
wnsprintf(szFilePath, countof(szFilePath), TEXT("%sPolicies%s*.adm"), g_szWizRoot, g_szLanguage);
|
|
HANDLE hFind = FindFirstFile(szFilePath, &FindFileData);
|
|
if(hFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
wnsprintf(szFileName, countof(szFileName), TEXT("%sPolicies%s%s"), g_szWizRoot, g_szLanguage, FindFileData.cFileName);
|
|
if(IsADMFileVisible(szFileName, GetRole(g_fBranded, g_fIntranet), g_dwADMPlatformId))
|
|
{
|
|
FindClose(hFind);
|
|
return TRUE;
|
|
}
|
|
}while(FindNextFile(hFind, &FindFileData));
|
|
FindClose(hFind);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
INT_PTR CALLBACK ADMDesc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
UNREFERENCED_PARAMETER(wParam);
|
|
|
|
switch (message)
|
|
{
|
|
case IDM_BATCHADVANCE:
|
|
DoBatchAdvance(hDlg);
|
|
break;
|
|
|
|
case WM_HELP:
|
|
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
|
|
break;
|
|
|
|
case WM_INITDIALOG:
|
|
return(FALSE);
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDC_ADMWIN32:
|
|
g_dwADMPlatformId = PLATFORM_WIN32;
|
|
break;
|
|
|
|
case IDC_ADMWIN2K:
|
|
g_dwADMPlatformId = PLATFORM_W2K;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
switch (((NMHDR FAR *) lParam)->code)
|
|
{
|
|
case PSN_HELP:
|
|
IeakPageHelp(hDlg, g_psp[g_iCurPage].pszTemplate);
|
|
break;
|
|
|
|
case PSN_SETACTIVE:
|
|
SetBannerText(hDlg);
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
|
|
|
|
if (InsGetBool(IS_ADM, IK_ADMIN, 1, g_szCustIns))
|
|
{
|
|
CheckRadioButton(hDlg, IDC_ADMWIN32, IDC_ADMWIN2K, IDC_ADMWIN32);
|
|
g_dwADMPlatformId = PLATFORM_WIN32;
|
|
}
|
|
else
|
|
{
|
|
CheckRadioButton(hDlg, IDC_ADMWIN32, IDC_ADMWIN2K, IDC_ADMWIN2K);
|
|
g_dwADMPlatformId = PLATFORM_W2K;
|
|
}
|
|
|
|
CheckBatchAdvance(hDlg);
|
|
break;
|
|
|
|
case PSN_WIZBACK:
|
|
case PSN_WIZNEXT:
|
|
InsWriteBoolEx(IS_ADM, IK_ADMIN, (g_dwADMPlatformId == PLATFORM_WIN32) ? 1 : 0, g_szCustIns);
|
|
InsFlushChanges(g_szCustIns);
|
|
|
|
g_iCurPage = PPAGE_ADMDESC;
|
|
EnablePages();
|
|
if (((NMHDR FAR *) lParam)->code == PSN_WIZNEXT)
|
|
PageNext(hDlg);
|
|
else
|
|
PagePrev(hDlg);
|
|
break;
|
|
|
|
case PSN_QUERYCANCEL:
|
|
QueryCancel(hDlg);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|