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

965 lines
34 KiB

#include "precomp.h"
#include "rsop.h"
#include "favsproc.h"
#include <tchar.h>
static INT_PTR CALLBACK addEditFavoriteRSoPProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
/////////////////////////////////////////////////////////////////////
struct _FAV4RSOP
{
WORD wType;
TCHAR szName[MAX_PATH];
TCHAR szDisplayName[MAX_PATH];
TCHAR szUrl[INTERNET_MAX_URL_LENGTH];
TCHAR szIconFile[MAX_PATH];
BOOL fOffline;
};
typedef _FAV4RSOP FAV4RSOP, *LPFAV4RSOP;
//////////////////////////////////////////////////////////////////////
BOOL ItemHasText(HWND htv, HTREEITEM hti, LPCTSTR szText)
{
BOOL bRet = FALSE;
__try
{
if (NULL != hti)
{
TCHAR szBuffer[MAX_PATH];
TVITEM tvi;
ZeroMemory((void*)&tvi, sizeof(tvi));
tvi.hItem = hti;
tvi.mask = TVIF_TEXT;
tvi.pszText = szBuffer;
tvi.cchTextMax = countof(szBuffer);
if (TreeView_GetItem(htv, &tvi))
bRet = (!StrCmpI(tvi.pszText, szText)) ? TRUE : FALSE;
}
}
__except(TRUE)
{
ASSERT(0);
}
return bRet;
}
//////////////////////////////////////////////////////////////////////
LPARAM GetTVItemLParam(HWND htv, HTREEITEM hti)
{
LPARAM lpResult = 0;
__try
{
if (NULL != hti)
{
TVITEM tvi;
ZeroMemory((void*)&tvi, sizeof(tvi));
tvi.hItem = hti;
tvi.mask = TVIF_PARAM;
if (TreeView_GetItem(htv, &tvi))
lpResult = tvi.lParam;
}
}
__except(TRUE)
{
ASSERT(0);
}
return lpResult;
}
/////////////////////////////////////////////////////////////////////
void DestroyTVItemData(HWND htv, HTREEITEM hti)
{
__try
{
HTREEITEM htiCur = hti;
if (NULL == hti)
htiCur = TreeView_GetRoot(htv);
HTREEITEM htiFirstChild = TreeView_GetChild(htv, htiCur);
if (NULL != htiFirstChild)
DestroyTVItemData(htv, htiFirstChild);
while (NULL != htiCur)
{
htiCur = TreeView_GetNextSibling(htv, htiCur);
if (NULL != htiCur)
DestroyTVItemData(htv, htiCur);
}
LPARAM lp = GetTVItemLParam(htv, hti);
if (NULL != hti && NULL != (void*)lp)
CoTaskMemFree((void*)lp);
}
__except(TRUE)
{
}
}
/////////////////////////////////////////////////////////////////////
HTREEITEM FindFolderItem(HWND htv, LPCTSTR szText, HTREEITEM htiParent = NULL)
{
HTREEITEM htiResult = NULL;
__try
{
HTREEITEM htiFirstChild = NULL;
if (NULL == htiParent)
{
HTREEITEM htiTempParent = TreeView_GetRoot(htv);
htiFirstChild = TreeView_GetNextSibling(htv, TreeView_GetChild(htv, htiTempParent));
}
else
htiFirstChild = TreeView_GetChild(htv, htiParent);
// pass the "Favorites" marker at the top - 1st child of root
HTREEITEM htiCur = htiFirstChild;
while (NULL != htiCur)
{
// look at the current folder
if (ItemHasText(htv, htiCur, szText))
break;
// then the folder's children
htiCur = FindFolderItem(htv, szText, htiCur);
if (ItemHasText(htv, htiCur, szText))
break;
// then the folder's siblings
htiCur = TreeView_GetNextSibling(htv, htiCur);
}
htiResult = htiCur;
}
__except(TRUE)
{
}
return htiResult;
}
/////////////////////////////////////////////////////////////////////
HTREEITEM InsertTreeItem(HWND htv, LPFAV4RSOP pFav, LPCTSTR szText, WORD wType,
HTREEITEM htiParent = NULL, HTREEITEM htiPrevious = NULL,
UINT nChildren = 0)
{
HTREEITEM htiResult = NULL;
__try
{
if (NULL != pFav)
{
LPFAV4RSOP pNewFav = (LPFAV4RSOP)CoTaskMemAlloc(sizeof(FAV4RSOP));
if (NULL != pNewFav)
{
pNewFav->wType = wType;
StrCpy(pNewFav->szDisplayName, szText);
StrCpy(pNewFav->szName, pFav->szName);
StrCpy(pNewFav->szUrl, pFav->szUrl);
StrCpy(pNewFav->szIconFile, pFav->szIconFile);
pNewFav->fOffline = pFav->fOffline;
TV_ITEM tvi;
ZeroMemory(&tvi, sizeof(tvi));
tvi.mask = TVIF_TEXT | TVIF_PARAM;
if (pFav->wType != FTYPE_URL)
{
tvi.mask |= TVIF_CHILDREN;
tvi.cChildren = nChildren;
}
if (pFav->wType != FTYPE_URL && pFav->wType != FTYPE_FOLDER)
{
tvi.mask |= TVIF_STATE;
tvi.stateMask = TVIS_BOLD;
tvi.state = TVIS_BOLD;
}
tvi.lParam = (LPARAM)pNewFav;
tvi.pszText = (LPTSTR)pNewFav->szDisplayName;
tvi.cchTextMax = StrLen(pNewFav->szDisplayName) + 1;
TVINSERTSTRUCT tvins;
ZeroMemory(&tvins, sizeof(tvins));
tvins.hParent = htiParent;
tvins.hInsertAfter = htiPrevious;
CopyMemory(&tvins.item, &tvi, sizeof(tvi));
htiResult = TreeView_InsertItem(htv, &tvins);
}
}
}
__except(TRUE)
{
}
return htiResult;
}
/////////////////////////////////////////////////////////////////////
HTREEITEM InsertFavoriteItem(HWND htv, LPFAV4RSOP pFav, LPCTSTR szRemainingPath,
HTREEITEM htiPrevious, HTREEITEM htiParent = NULL,
BOOL bLink = FALSE)
{
HTREEITEM htiResult = NULL;
__try
{
// Find the first folder in the path
LPTSTR szSlash = StrChr(szRemainingPath, _T('\\'));
if (NULL != szSlash)
{
TCHAR szCurFolder[MAX_PATH];
ZeroMemory(szCurFolder, countof(szCurFolder));
StrCpyN(szCurFolder, szRemainingPath, (int)(szSlash - szRemainingPath) + 1);
// See if the folder exists in the tree
// If so, store the HTREEITEM in a param.
HTREEITEM htiCurFolder = FindFolderItem(htv, szCurFolder, htiParent);
if (NULL == htiCurFolder)
{
// If not, create the folder with the lParam set to NULL.
htiCurFolder = InsertTreeItem(htv, pFav, szCurFolder, FTYPE_FOLDER,
htiParent, htiPrevious);
}
// Pass the remainder of the string to InsertFavoriteItem
htiResult = InsertFavoriteItem(htv, pFav, ++szSlash, htiPrevious,
htiCurFolder, bLink);
}
else
{
// If no more folders, create a new item under current folder
htiResult = InsertTreeItem(htv, pFav, szRemainingPath, FTYPE_URL,
htiParent, htiPrevious);
TreeView_Expand(htv, htiParent, TVE_EXPAND);
}
}
__except(TRUE)
{
}
return htiResult;
}
/////////////////////////////////////////////////////////////////////
DWORD AddItemsToTree(HWND hwndTree, CDlgRSoPData *pDRD, BSTR bstrTempClass,
BOOL bLink)
{
DWORD dwRet = 0;
__try
{
_bstr_t bstrClass = bstrTempClass;
CPSObjData **paFavObj = NULL;
long nFavObjects = 0;
HRESULT hr = pDRD->GetArrayOfPSObjects(bstrClass, L"rsopPrecedence",
&paFavObj, &nFavObjects);
if (SUCCEEDED(hr))
{
FAV4RSOP tempFav;
ZeroMemory(&tempFav, sizeof(FAV4RSOP));
// Add "Favorites" or "Links" entry to tree
LoadString(g_hUIInstance, bLink ? IDS_LINKS : IDS_FAVFOLDER,
tempFav.szName, countof(tempFav.szName));
HTREEITEM htiParent = InsertTreeItem(hwndTree, &tempFav, tempFav.szName, FTYPE_UNUSED,
NULL, TVI_LAST, nFavObjects);
// For each favorite returned from any GPO
long nObj;
for (nObj = 0; nObj < nFavObjects; nObj++)
{
_bstr_t bstrGPOName = L" (";
bstrGPOName += pDRD->GetGPONameFromPSAssociation(paFavObj[nObj]->pObj,
L"rsopPrecedence") +
L")";
tempFav.wType = FTYPE_URL;
// name field
_variant_t vtValue;
hr = paFavObj[nObj]->pObj->Get(L"name", 0, &vtValue, NULL, NULL);
if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
{
_bstr_t bstrValue = vtValue;
_bstr_t bstrEntry = bstrValue + bstrGPOName;
StrCpy(tempFav.szName, (LPCTSTR)bstrValue);
// url field
hr = paFavObj[nObj]->pObj->Get(L"url", 0, &vtValue, NULL, NULL);
if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
{
bstrValue = vtValue;
StrCpy(tempFav.szUrl, (LPCTSTR)bstrValue);
}
// iconPath field
hr = paFavObj[nObj]->pObj->Get(L"iconPath", 0, &vtValue, NULL, NULL);
if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
{
bstrValue = vtValue;
StrCpy(tempFav.szIconFile, (LPCTSTR)bstrValue);
}
// makeAvailableOffline field
hr = paFavObj[nObj]->pObj->Get(L"makeAvailableOffline", 0, &vtValue, NULL, NULL);
if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
tempFav.fOffline = (bool)vtValue ? TRUE : FALSE;
InsertFavoriteItem(hwndTree, &tempFav, (LPCTSTR)bstrEntry, NULL, htiParent, bLink);
}
}
dwRet = nObj;
}
}
__except(TRUE)
{
}
return dwRet;
}
/////////////////////////////////////////////////////////////////////
DWORD InitFavsDlgInRSoPMode(HWND hDlg, CDlgRSoPData *pDRD)
{
DWORD dwRet = 0;
__try
{
// First go through all PS objects and look for favorites data
_bstr_t bstrClass = L"RSOP_IEAKPolicySetting";
HRESULT hr = pDRD->GetArrayOfPSObjects(bstrClass);
if (SUCCEEDED(hr))
{
CPSObjData **paPSObj = pDRD->GetPSObjArray();
long nPSObjects = pDRD->GetPSObjCount();
BOOL bPlaceAtTopHandled = FALSE;
BOOL bDeleteHandled = FALSE;
for (long nObj = 0; nObj < nPSObjects; nObj++)
{
// placeFavoritesAtTopOfList field
_variant_t vtValue;
if (!bPlaceAtTopHandled)
{
hr = paPSObj[nObj]->pObj->Get(L"placeFavoritesAtTopOfList", 0, &vtValue, NULL, NULL);
if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
{
if ((bool)vtValue)
CheckDlgButton(hDlg, IDC_FAVONTOP, BST_CHECKED);
bPlaceAtTopHandled = TRUE;
}
}
// deleteExistingChannels field
if (!bDeleteHandled)
{
hr = paPSObj[nObj]->pObj->Get(L"deleteExistingChannels", 0, &vtValue, NULL, NULL);
if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
{
if ((bool)vtValue)
CheckDlgButton(hDlg, IDC_DELETECHANNELS, BST_CHECKED);
bDeleteHandled = TRUE;
}
}
// deleteExistingFavorites field
if (!bDeleteHandled)
{
hr = paPSObj[nObj]->pObj->Get(L"deleteExistingFavorites", 0, &vtValue, NULL, NULL);
if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
{
if ((bool)vtValue)
CheckDlgButton(hDlg, IDC_DELFAVORITES, BST_CHECKED);
bDeleteHandled = TRUE;
// deleteAdminCreatedFavoritesOnly field
hr = paPSObj[nObj]->pObj->Get(L"deleteAdminCreatedFavoritesOnly", 0, &vtValue, NULL, NULL);
if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
{
if ((bool)vtValue)
CheckDlgButton(hDlg, IDC_DELIEAKFAVORITES, BST_CHECKED);
}
}
}
// no need to process other GPOs since enabled properties have been found
if (bPlaceAtTopHandled && bDeleteHandled)
break;
}
}
EnableDlgItem2(hDlg, IDC_FAVONTOP, FALSE);
EnableDlgItem2(hDlg, IDC_DELFAVORITES, FALSE);
EnableDlgItem2(hDlg, IDC_DELIEAKFAVORITES, FALSE);
EnableDlgItem2(hDlg, IDC_DELETECHANNELS, FALSE);
// Now go through all Favorite & Link objects and populate the tree ctrl
HWND hwndTree = GetDlgItem(hDlg, IDC_TREE1);
TreeView_DeleteAllItems(hwndTree);
dwRet = AddItemsToTree(hwndTree, pDRD, L"RSOP_IEFavoriteItem", FALSE);
dwRet += AddItemsToTree(hwndTree, pDRD, L"RSOP_IELinkItem", TRUE);
TreeView_SelectItem(hwndTree, TreeView_GetRoot(hwndTree));
EnableDlgItem2(hDlg, IDC_FAVUP, FALSE);
EnableDlgItem2(hDlg, IDC_FAVDOWN, FALSE);
EnableDlgItem2(hDlg, IDC_ADDURL, FALSE);
EnableDlgItem2(hDlg, IDC_ADDFOLDER, FALSE);
EnableDlgItem2(hDlg, IDC_MODIFY, FALSE);
EnableDlgItem2(hDlg, IDC_REMOVE, FALSE);
EnableDlgItem2(hDlg, IDC_TESTFAVURL, FALSE);
EnableDlgItem2(hDlg, IDC_IMPORT, FALSE);
}
__except(TRUE)
{
}
return dwRet;
}
/////////////////////////////////////////////////////////////////////
HRESULT InitFavsPlacementPrecPage(CDlgRSoPData *pDRD, HWND hwndList)
{
HRESULT hr = NOERROR;
__try
{
_bstr_t bstrClass = L"RSOP_IEAKPolicySetting";
hr = pDRD->GetArrayOfPSObjects(bstrClass);
if (SUCCEEDED(hr))
{
CPSObjData **paPSObj = pDRD->GetPSObjArray();
long nPSObjects = pDRD->GetPSObjCount();
for (long nObj = 0; nObj < nPSObjects; nObj++)
{
_bstr_t bstrGPOName = pDRD->GetGPONameFromPS(paPSObj[nObj]->pObj);
// placeFavoritesAtTopOfList field
BOOL bAtTop = FALSE;
_variant_t vtValue;
hr = paPSObj[nObj]->pObj->Get(L"placeFavoritesAtTopOfList", 0, &vtValue, NULL, NULL);
if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
bAtTop = (bool)vtValue ? TRUE : FALSE;
_bstr_t bstrSetting;
if (bAtTop)
{
TCHAR szTemp[MAX_PATH];
LoadString(g_hInstance, IDS_PLACEATTOP_SETTING, szTemp, countof(szTemp));
bstrSetting = szTemp;
}
else
bstrSetting = GetDisabledString();
InsertPrecedenceListItem(hwndList, nObj, bstrGPOName, bstrSetting);
}
}
}
__except(TRUE)
{
}
return hr;
}
/////////////////////////////////////////////////////////////////////
HRESULT InitFavsDeletionPrecPage(CDlgRSoPData *pDRD, HWND hwndList)
{
HRESULT hr = NOERROR;
__try
{
_bstr_t bstrClass = L"RSOP_IEAKPolicySetting";
hr = pDRD->GetArrayOfPSObjects(bstrClass);
if (SUCCEEDED(hr))
{
CPSObjData **paPSObj = pDRD->GetPSObjArray();
long nPSObjects = pDRD->GetPSObjCount();
for (long nObj = 0; nObj < nPSObjects; nObj++)
{
_bstr_t bstrGPOName = pDRD->GetGPONameFromPS(paPSObj[nObj]->pObj);
// deleteExistingFavorites field
BOOL bDeleteExisting = FALSE;
BOOL bAdminOnly = FALSE;
_variant_t vtValue;
hr = paPSObj[nObj]->pObj->Get(L"deleteExistingFavorites", 0, &vtValue, NULL, NULL);
if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
// deleteAdminCreatedFavoritesOnly field
hr = paPSObj[nObj]->pObj->Get(L"deleteExistingFavorites", 0, &vtValue, NULL, NULL);
if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
{
bDeleteExisting = (bool)vtValue ? TRUE : FALSE;
// deleteAdminCreatedFavoritesOnly field
hr = paPSObj[nObj]->pObj->Get(L"deleteAdminCreatedFavoritesOnly", 0, &vtValue, NULL, NULL);
if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
bAdminOnly = (bool)vtValue;
}
_bstr_t bstrSetting;
if (bDeleteExisting > 0)
{
TCHAR szTemp[MAX_PATH];
if (bAdminOnly)
LoadString(g_hInstance, IDS_DELADMINCREATED_SETTING, szTemp, countof(szTemp));
else
LoadString(g_hInstance, IDS_DELEXISTING_SETTING, szTemp, countof(szTemp));
bstrSetting = szTemp;
}
else
bstrSetting = GetDisabledString();
InsertPrecedenceListItem(hwndList, nObj, bstrGPOName, bstrSetting);
}
}
}
__except(TRUE)
{
}
return hr;
}
/////////////////////////////////////////////////////////////////////
HRESULT InitFavsPrecPage(CDlgRSoPData *pDRD, HWND hwndList)
{
HRESULT hr = NOERROR;
__try
{
_bstr_t bstrClass = L"RSOP_IEAKPolicySetting";
hr = pDRD->GetArrayOfPSObjects(bstrClass);
if (SUCCEEDED(hr))
{
CPSObjData **paPSObj = pDRD->GetPSObjArray();
long nPSObjects = pDRD->GetPSObjCount();
for (long nObj = 0; nObj < nPSObjects; nObj++)
{
_bstr_t bstrGPOName = pDRD->GetGPONameFromPS(paPSObj[nObj]->pObj);
// customFavorites field
long nFavs = 0, nLinks = 0;
_variant_t vtValue;
hr = paPSObj[nObj]->pObj->Get(L"customFavorites", 0, &vtValue, NULL, NULL);
if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
nFavs = vtValue;
// customLinks field
hr = paPSObj[nObj]->pObj->Get(L"customLinks", 0, &vtValue, NULL, NULL);
if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
nLinks = vtValue;
_bstr_t bstrSetting;
if (nFavs > 0 || nLinks > 0)
{
TCHAR szTemp[MAX_PATH];
LoadString(g_hInstance, IDS_FAVS_AND_LINKS_SETTING, szTemp, countof(szTemp));
TCHAR szSetting[MAX_PATH];
wnsprintf(szSetting, countof(szSetting), szTemp, nFavs, nLinks);
bstrSetting = szSetting;
}
else
bstrSetting = GetDisabledString();
InsertPrecedenceListItem(hwndList, nObj, bstrGPOName, bstrSetting);
}
}
}
__except(TRUE)
{
}
return hr;
}
/////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK FavoritesDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
// Retrieve Property Sheet Page info for each call into dlg proc.
LPPROPSHEETCOOKIE psCookie = (LPPROPSHEETCOOKIE)GetWindowLongPtr(hDlg, DWLP_USER);
TCHAR szWorkDir[MAX_PATH],
szValue[16],
szUrl[INTERNET_MAX_URL_LENGTH];
HWND htv = GetDlgItem(hDlg, IDC_TREE1);
LPCTSTR pszValue;
BOOL fQL,
fFavoritesOnTop, fFavoritesDelete, fIEAKFavoritesDelete;
DWORD dwFavoritesDeleteFlags;
switch (msg) {
case WM_SETFONT:
//a change to mmc requires us to do this logic for all our property pages that use common controls
INITCOMMONCONTROLSEX iccx;
iccx.dwSize = sizeof(INITCOMMONCONTROLSEX);
iccx.dwICC = ICC_ANIMATE_CLASS | ICC_BAR_CLASSES | ICC_LISTVIEW_CLASSES |ICC_TREEVIEW_CLASSES;
InitCommonControlsEx(&iccx);
break;
case WM_INITDIALOG:
SetPropSheetCookie(hDlg, lParam);
EnableDBCSChars(hDlg, IDC_TREE1);
ReadBoolAndCheckButton(IS_DESKTOPOBJS, IK_DELETECHANNELS, FALSE, GetInsFile(hDlg),
hDlg, IDC_DELETECHANNELS);
// find out if this dlg is in RSoP mode
psCookie = (LPPROPSHEETCOOKIE)GetWindowLongPtr(hDlg, DWLP_USER);
if (psCookie->pCS->IsRSoP())
{
TCHAR szView[64];
LoadString(g_hInstance, IDS_VIEW, szView, countof(szView));
SetDlgItemText(hDlg, IDC_MODIFY, szView);
CDlgRSoPData *pDRD = GetDlgRSoPData(hDlg, psCookie->pCS);
InitFavsDlgInRSoPMode(hDlg, pDRD);
}
else
{
MigrateFavorites(GetInsFile(hDlg));
}
#ifdef _UNICODE
TreeView_SetUnicodeFormat(htv, TRUE);
#else
TreeView_SetUnicodeFormat(htv, FALSE);
#endif
break;
case WM_DESTROY:
if (psCookie->pCS->IsRSoP())
{
DestroyDlgRSoPData(hDlg);
DestroyTVItemData(htv, NULL);
}
break;
case WM_COMMAND:
if (BN_CLICKED != GET_WM_COMMAND_CMD(wParam, lParam))
return FALSE;
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDC_FAVONTOP:
if (BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_FAVONTOP)) {
HTREEITEM hti;
TV_ITEM tvi;
EnableDlgItem(hDlg, IDC_FAVONTOP);
hti = TreeView_GetSelection(htv);
if (NULL != hti) {
ZeroMemory(&tvi, sizeof(tvi));
tvi.mask = TVIF_STATE;
tvi.hItem = hti;
TreeView_GetItem(htv, &tvi);
if (!HasFlag(tvi.state, TVIS_BOLD)) {
EnableDlgItem2(hDlg, IDC_FAVUP, (NULL != TreeView_GetPrevSibling(htv, hti)));
EnableDlgItem2(hDlg, IDC_FAVDOWN, (NULL != TreeView_GetNextSibling(htv, hti)));
}
}
}
else {
DisableDlgItem(hDlg, IDC_FAVUP);
DisableDlgItem(hDlg, IDC_FAVDOWN);
}
break;
case IDC_DELFAVORITES:
fFavoritesDelete = (BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_DELFAVORITES));
EnableWindow(GetDlgItem(hDlg, IDC_DELIEAKFAVORITES), fFavoritesDelete);
break;
case IDC_FAVUP:
MoveUpFavorite(htv, TreeView_GetSelection(htv));
break;
case IDC_FAVDOWN:
MoveDownFavorite(htv, TreeView_GetSelection(htv));
break;
case IDC_ADDURL:
fQL = !IsFavoriteItem(htv, TreeView_GetSelection(htv));
if (GetFavoritesNumber(htv, fQL) >= GetFavoritesMaxNumber(fQL)) {
UINT nID;
nID = (!fQL ? IDS_ERROR_MAXFAVS : IDS_ERROR_MAXQLS);
ErrorMessageBox(hDlg, nID);
break;
}
CreateWorkDir(GetInsFile(hDlg), IEAK_GPE_BRANDING_SUBDIR TEXT("\\favs"), szWorkDir);
NewUrl(htv, szWorkDir, PLATFORM_WIN32, IEM_GP);
break;
case IDC_ADDFOLDER:
ASSERT(IsFavoriteItem(htv, TreeView_GetSelection(htv)));
if (GetFavoritesNumber(htv) >= GetFavoritesMaxNumber()) {
ErrorMessageBox(hDlg, IDS_ERROR_MAXFAVS);
break;
}
NewFolder(htv);
break;
case IDC_MODIFY:
if (psCookie->pCS->IsRSoP())
{
LPFAV4RSOP pFav = (LPFAV4RSOP)GetTVItemLParam(htv, TreeView_GetSelection(htv));
if (NULL != pFav)
{
DialogBoxParam(g_hUIInstance, MAKEINTRESOURCE(IDD_FAVPOPUP), GetParent(htv),
addEditFavoriteRSoPProc, (LPARAM)pFav);
}
}
else
{
CreateWorkDir(GetInsFile(hDlg), IEAK_GPE_BRANDING_SUBDIR TEXT("\\favs"), szWorkDir);
ModifyFavorite(htv, TreeView_GetSelection(htv), szWorkDir, szWorkDir, PLATFORM_WIN32, IEM_GP);
}
break;
case IDC_REMOVE:
CreateWorkDir(GetInsFile(hDlg), IEAK_GPE_BRANDING_SUBDIR TEXT("\\favs"), szWorkDir);
DeleteFavorite(htv, TreeView_GetSelection(htv), szWorkDir);
break;
case IDC_TESTFAVURL:
if (GetFavoriteUrl(htv, TreeView_GetSelection(htv), szUrl, countof(szUrl)))
TestURL(szUrl);
break;
case IDC_IMPORT: {
CNewCursor cursor(IDC_WAIT);
CreateWorkDir(GetInsFile(hDlg), IEAK_GPE_BRANDING_SUBDIR TEXT("\\favs"), szWorkDir);
ImportFavoritesCmd(htv, szWorkDir);
break;
}
default:
return FALSE;
}
break;
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code) {
case PSN_SETACTIVE:
// don't do any of this stuff in RSoP mode
if (!psCookie->pCS->IsRSoP())
{
CreateWorkDir(GetInsFile(hDlg), IEAK_GPE_BRANDING_SUBDIR TEXT("\\favs"), szWorkDir);
ASSERT(0 == GetFavoritesNumber(htv, FALSE) && 0 == GetFavoritesNumber(htv, TRUE));
ImportFavorites (htv, NULL, GetInsFile(hDlg), szWorkDir, NULL, FALSE);
ImportQuickLinks(htv, NULL, GetInsFile(hDlg), szWorkDir, NULL, FALSE);
TreeView_SelectItem(htv, TreeView_GetRoot(htv));
fFavoritesOnTop = InsGetBool(IS_BRANDING, IK_FAVORITES_ONTOP, FALSE, GetInsFile(hDlg));
CheckDlgButton(hDlg, IDC_FAVONTOP, fFavoritesOnTop ? BST_CHECKED : BST_UNCHECKED);
if (!fFavoritesOnTop) {
DisableDlgItem(hDlg, IDC_FAVUP);
DisableDlgItem(hDlg, IDC_FAVDOWN);
}
dwFavoritesDeleteFlags = (DWORD)InsGetInt(IS_BRANDING, IK_FAVORITES_DELETE, (int)FD_DEFAULT, GetInsFile(hDlg));
fFavoritesDelete = HasFlag(dwFavoritesDeleteFlags, ~FD_REMOVE_IEAK_CREATED);
CheckDlgButton(hDlg, IDC_DELFAVORITES, fFavoritesDelete ? BST_CHECKED : BST_UNCHECKED);
fIEAKFavoritesDelete = HasFlag(dwFavoritesDeleteFlags, FD_REMOVE_IEAK_CREATED);
CheckDlgButton(hDlg, IDC_DELIEAKFAVORITES, fIEAKFavoritesDelete ? BST_CHECKED : BST_UNCHECKED);
// only if delete Favorites is TRUE should the delete IEAK Favorites checkbox be enabled
EnableWindow(GetDlgItem(hDlg, IDC_DELIEAKFAVORITES), fFavoritesDelete);
}
break;
case TVN_GETINFOTIP:
ASSERT(IDC_TREE1 == wParam);
if (!psCookie->pCS->IsRSoP())
GetFavoritesInfoTip((LPNMTVGETINFOTIP)lParam);
break;
case NM_DBLCLK:
ASSERT(IDC_TREE1 == wParam);
if (IsWindowEnabled(GetDlgItem(hDlg, IDC_MODIFY)))
SendMessage(hDlg, WM_COMMAND, GET_WM_COMMAND_MPS(IDC_MODIFY, GetDlgItem(hDlg, IDC_MODIFY), BN_CLICKED));
break;
case TVN_KEYDOWN:
ASSERT(wParam == IDC_TREE1);
if (((LPNMTVKEYDOWN)lParam)->wVKey == VK_DELETE && IsWindowEnabled(GetDlgItem(hDlg, IDC_REMOVE)))
SendMessage(hDlg, WM_COMMAND, GET_WM_COMMAND_MPS(IDC_REMOVE, GetDlgItem(hDlg, IDC_REMOVE), BN_CLICKED));
break;
case TVN_SELCHANGED:
ASSERT(IDC_TREE1 == wParam);
if (psCookie->pCS->IsRSoP())
{
LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam;
LPFAV4RSOP pFav = (LPFAV4RSOP)pnmtv->itemNew.lParam;
if (NULL != pFav)
EnableDlgItem2(hDlg, IDC_MODIFY, (FTYPE_UNUSED == pFav->wType) ? FALSE : TRUE);
}
else
ProcessFavSelChange(hDlg, htv, (LPNMTREEVIEW)lParam);
break;
case PSN_HELP:
ShowHelpTopic(hDlg);
break;
case PSN_APPLY:
if (psCookie->pCS->IsRSoP())
return FALSE;
else
{
fFavoritesOnTop = (BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_FAVONTOP));
dwFavoritesDeleteFlags = 0;
szValue[0] = TEXT('\0');
pszValue = NULL;
fFavoritesDelete = (BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_DELFAVORITES));
fIEAKFavoritesDelete = (BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_DELIEAKFAVORITES));
if (fFavoritesDelete) {
// NOTE. (andrewgu) flags explanation:
// 1. FD_FAVORITES means "empty favorites";
// 2. FD_CHANNELS means "don't delete channels folder";
// 3. FD_SOFTWAREUPDATES means "don't delete sofware updates folder";
// 4. FD_QUICKLINKS means "don't delete quick links folder";
// 5. FD_EMPTY_QUICKLINKS means "but make it empty";
// 6. FD_REMOVE_HIDDEN means "don't hesitate to party on HIDDEN folders and favorites";
// 7. FD_REMOVE_SYSTEM means "don't hesitate to party on SYSTEM folders and favorites";
dwFavoritesDeleteFlags |= FD_FAVORITES |
FD_CHANNELS | FD_SOFTWAREUPDATES | FD_QUICKLINKS | FD_EMPTY_QUICKLINKS |
FD_REMOVE_HIDDEN | FD_REMOVE_SYSTEM;
}
if (fIEAKFavoritesDelete)
// FD_REMOVE_IEAK_CREATED means "delete those items created by the IEAK";
dwFavoritesDeleteFlags |= FD_REMOVE_IEAK_CREATED;
if (dwFavoritesDeleteFlags) {
wnsprintf(szValue, countof(szValue), TEXT("0x%X"), dwFavoritesDeleteFlags);
pszValue = szValue;
}
if (!AcquireWriteCriticalSection(hDlg)) {
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
break;
}
InsWriteString(IS_BRANDING, IK_FAVORITES_DELETE, pszValue, GetInsFile(hDlg));
InsWriteBool(IS_BRANDING, IK_FAVORITES_ONTOP, fFavoritesOnTop, GetInsFile(hDlg));
CheckButtonAndWriteBool(hDlg, IDC_DELETECHANNELS, IS_DESKTOPOBJS, IK_DELETECHANNELS, GetInsFile(hDlg));
CreateWorkDir(GetInsFile(hDlg), IEAK_GPE_BRANDING_SUBDIR TEXT("\\favs"), szWorkDir);
ExportFavorites (htv, GetInsFile(hDlg), szWorkDir, TRUE);
ExportQuickLinks(htv, GetInsFile(hDlg), szWorkDir, TRUE);
MigrateToOldFavorites(GetInsFile(hDlg));
DeleteFavorite(htv, TreeView_GetRoot(htv), NULL);
DeleteFavorite(htv, TreeView_GetRoot(htv), NULL);
if (PathIsDirectoryEmpty(szWorkDir))
PathRemovePath(szWorkDir);
SignalPolicyChanged(hDlg, FALSE, TRUE, &g_guidClientExt, &g_guidSnapinExt);
}
break;
case PSN_QUERYCANCEL:
if (!psCookie->pCS->IsRSoP())
{
DeleteFavorite(htv, TreeView_GetRoot(htv), NULL);
DeleteFavorite(htv, TreeView_GetRoot(htv), NULL);
}
break;
default:
return FALSE;
}
break;
case WM_HELP:
ShowHelpTopic(hDlg);
break;
default:
return FALSE;
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK addEditFavoriteRSoPProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
BOOL fResult = FALSE;
switch (message) {
case WM_INITDIALOG:
{
LPFAV4RSOP pFav = (LPFAV4RSOP)lParam;
//----- Initialize contols -----
EnableDBCSChars(hDlg, IDE_FAVNAME);
EnableDBCSChars(hDlg, IDE_FAVURL);
EnableDBCSChars(hDlg, IDE_FAVICON);
Edit_LimitText(GetDlgItem(hDlg, IDE_FAVNAME), _MAX_FNAME);
Edit_LimitText(GetDlgItem(hDlg, IDE_FAVURL), INTERNET_MAX_URL_LENGTH-1);
Edit_LimitText(GetDlgItem(hDlg, IDE_FAVICON), _MAX_FNAME);
EnableWindow(GetDlgItem(hDlg, IDE_FAVNAME), FALSE);
EnableWindow(GetDlgItem(hDlg, IDE_FAVURL), FALSE);
EnableWindow(GetDlgItem(hDlg, IDE_FAVICON), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_FAVICONBROWSE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_AVAILOFFLINE), FALSE);
//----- Populate controls -----
if (FTYPE_FOLDER == pFav->wType)
SetDlgItemText(hDlg, IDE_FAVNAME, pFav->szDisplayName);
else
{
LPTSTR szLastSlash = StrRChr(pFav->szName, NULL, _T('\\'));
SetDlgItemText(hDlg, IDE_FAVNAME, (NULL != szLastSlash) ? szLastSlash + 1 : pFav->szName);
SetDlgItemText(hDlg, IDE_FAVURL, pFav->szUrl);
SetDlgItemText(hDlg, IDE_FAVICON, pFav->szIconFile);
if (pFav->fOffline)
CheckDlgButton(hDlg, IDC_AVAILOFFLINE, BST_CHECKED);
}
fResult = TRUE;
break;
}
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
EndDialog(hDlg, IDOK);
fResult = TRUE;
break;
case IDCANCEL:
EndDialog(hDlg, IDCANCEL);
fResult = TRUE;
break;
}
break;
}
return fResult;
}