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
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;
|
|
}
|