windows-nt/Source/XPSP1/NT/sdktools/tweakui/ie4.cpp
2020-09-26 16:20:57 +08:00

516 lines
14 KiB
C++

/*
* ie4 - IE4 settings
*/
#include "tweakui.h"
#include <lmcons.h>
#include <lmjoin.h>
#include <lmerr.h>
#pragma BEGIN_CONST_DATA
KL const c_klSingleClick = {&g_hkCUSMWCV, c_tszExplorerAdvanced,
c_tszUseDoubleClickTimer };
const static DWORD CODESEG rgdwHelp[] = {
IDC_SETTINGSGROUP, IDH_GROUP,
IDC_LISTVIEW, IDH_IE4LV,
0, 0,
};
#pragma END_CONST_DATA
/*****************************************************************************
*
* IE4_GetDword
*
* Read a DWORD somewhere.
*
* Always returns exactly 0 or 1.
*
*****************************************************************************/
BOOL PASCAL
IE4_GetDword(LPARAM lParam, LPVOID pvRef)
{
PKL pkl = (PKL)lParam;
return GetDwordPkl(pkl, TRUE) != 0;
}
/*****************************************************************************
*
* IE4_SetDword
*
* Save a DWORD somewhere.
*
* Always given exactly 0 or 1.
*
*****************************************************************************/
BOOL PASCAL
IE4_SetDword(BOOL f, LPARAM lParam, LPVOID pvRef)
{
PKL pkl = (PKL)lParam;
PBOOL pf = (PBOOL)pvRef;
if (pf) {
*pf = TRUE;
}
return SetDwordPkl(pkl, f);
}
/*****************************************************************************
*
* IE4_GetRest
*
* Read a restriction. The first character of the restriction is
* `+' if it is positive sense. All restrictions default to 0.
*
* Always returns exactly 0 or 1.
*
*****************************************************************************/
BOOL PASCAL
IE4_GetRest(LPARAM lParam, LPVOID pvRef)
{
LPCTSTR ptszRest = (LPCTSTR)lParam;
if (ptszRest[0] == TEXT('+')) {
return !GetRestriction(ptszRest+1);
} else {
return GetRestriction(ptszRest);
}
}
/*****************************************************************************
*
* IE4_GetRest4
*
* Just like IE4_GetRest, except fails if shell version 5 or better.
*
*****************************************************************************/
BOOL PASCAL
IE4_GetRest4(LPARAM lParam, LPVOID pvRef)
{
if (g_fShell5) {
return -1;
} else {
return IE4_GetRest(lParam, pvRef);
}
}
/*****************************************************************************
*
* IE4_GetRest5
*
* Just like IE4_GetRest, except requires shell version 5 or better.
*
*****************************************************************************/
BOOL PASCAL
IE4_GetRest5(LPARAM lParam, LPVOID pvRef)
{
if (g_fShell5) {
return IE4_GetRest(lParam, pvRef);
} else {
return -1;
}
}
/*****************************************************************************
*
* IE4_GetRest55
*
* Just like IE4_GetRest, except requires shell version 5.5 or better.
*
*****************************************************************************/
BOOL PASCAL
IE4_GetRest55(LPARAM lParam, LPVOID pvRef)
{
if (g_fShell55) {
return IE4_GetRest(lParam, pvRef);
} else {
return -1;
}
}
/*****************************************************************************
*
* HasComputersNearMe
*
* See if "Computers Near Me" is enabled.
*
* Shell 4 or lower: Disabled.
*
* Shell 5 on 9x: Enabled.
*
* Shell 5 on NT: Only if you are joined to a workgroup.
*
*****************************************************************************/
typedef NET_API_STATUS (CALLBACK *NETGETJOININFORMATION)(LPCWSTR, LPWSTR*, PNETSETUP_JOIN_STATUS);
typedef NET_API_STATUS (CALLBACK *NETAPIBUFFERFREE)(LPVOID);
BOOL s_bHasComputersNearMe = -1;
BOOL PASCAL
HasComputersNearMe(void)
{
if (!g_fShell5) {
return FALSE;
}
if (!g_fNT) {
return TRUE;
}
if (s_bHasComputersNearMe < 0) {
NETSETUP_JOIN_STATUS nsjs = NetSetupUnknownStatus;
HINSTANCE hinst = LoadLibrary("netapi32.dll");
if (hinst) {
NETGETJOININFORMATION _NetGetJoinInformation =
(NETGETJOININFORMATION)GetProcAddress(hinst, "NetGetJoinInformation");
NETAPIBUFFERFREE _NetApiBufferFree =
(NETAPIBUFFERFREE)GetProcAddress(hinst, "NetApiBufferFree");
if (_NetGetJoinInformation && _NetApiBufferFree) {
LPWSTR pszDomain;
if (_NetGetJoinInformation(NULL, &pszDomain, &nsjs) == NERR_Success) {
_NetApiBufferFree(pszDomain);
}
}
FreeLibrary(hinst);
}
s_bHasComputersNearMe = (nsjs == NetSetupWorkgroupName);
}
return s_bHasComputersNearMe;
}
/*****************************************************************************
*
* IE4_GetRestCNM
*
* Special function just for "Computers Near Me".
*
*****************************************************************************/
BOOL PASCAL
IE4_GetRestCNM(LPARAM lParam, LPVOID pvRef)
{
if (HasComputersNearMe()) {
return IE4_GetRest(lParam, pvRef);
} else {
return -1;
}
}
/*****************************************************************************
*
* IE4_SetRest
*
* Set the new restriction setting.
*
* The first character of the restriction is
* `+' if it is positive sense.
*
*****************************************************************************/
BOOL PASCAL
IE4_SetRest(BOOL f, LPARAM lParam, LPVOID pvRef)
{
LPCTSTR ptszRest = (LPCTSTR)lParam;
PBOOL pf = (PBOOL)pvRef;
if (pf) {
*pf = ptszRest ? TRUE : FALSE;
}
if (ptszRest[0] == TEXT('+')) {
f = !f;
ptszRest++;
}
return SetRestriction(ptszRest, f);
}
/*****************************************************************************
*
* IE4_GetLinksFolderName
*
*****************************************************************************/
KL const c_klLinksFolder = {&g_hkCUSMIE, TEXT("Toolbar"), TEXT("LinksFolderName") };
KL const c_klLinksFolder2= {&g_hkLMSMWCV, NULL, TEXT("LinksFolderName") };
BOOL PASCAL
IE4_GetLinksFolderName(LPTSTR pszBuf, UINT cchBuf)
{
PIDL pidl;
BOOL fRc = FALSE;
if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &pidl))) {
if (SHGetPathFromIDList(pidl, pszBuf)) {
/*
* Find the name of the links folder underneath Favorites.
*/
TCHAR szLinks[MAX_PATH];
if (!GetStrPkl(szLinks, sizeof(szLinks), &c_klLinksFolder) &&
!GetStrPkl(szLinks, sizeof(szLinks), &c_klLinksFolder2)) {
lstrcpy(szLinks, TEXT("Links"));
}
Path_Append(pszBuf, szLinks);
fRc = TRUE;
}
Ole_Free(pidl);
}
return fRc;
}
/*****************************************************************************
*
* IE4_GetFavLink
*
* Say whether the Favorites\Links directory is hidden.
*
* -1 = No links directory at all
* 0 = Links is hidden
* 1 = Links is visible
*
*****************************************************************************/
BOOL PASCAL
IE4_GetFavLink(LPARAM lParam, LPVOID pvRef)
{
BOOL fRc = -1;
TCHAR szFavLink[MAX_PATH];
if (IE4_GetLinksFolderName(szFavLink, cA(szFavLink))) {
DWORD dwAttrib = GetFileAttributes(szFavLink);
if (dwAttrib != 0xFFFFFFFF) {
fRc = !(dwAttrib & FILE_ATTRIBUTE_HIDDEN);
}
}
return fRc;
}
/*****************************************************************************
*
* IE4_SetFavLink
*
* 0 = Make links hidden
* 1 = Make links visible
*
*****************************************************************************/
BOOL PASCAL
IE4_SetFavLink(BOOL f, LPARAM lParam, LPVOID pvRef)
{
BOOL fRc = FALSE;
PBOOL pf = (PBOOL)pvRef;
TCHAR szFavLink[MAX_PATH];
if (IE4_GetLinksFolderName(szFavLink, cA(szFavLink))) {
DWORD dwAttrib = GetFileAttributes(szFavLink);
if (dwAttrib != 0xFFFFFFFF) {
dwAttrib &= ~FILE_ATTRIBUTE_HIDDEN;
if (!f)
dwAttrib |= FILE_ATTRIBUTE_HIDDEN;
if (SetFileAttributes(szFavLink, dwAttrib)) {
fRc = TRUE;
*pf = TRUE;
}
}
}
return fRc;
}
/*
* Note that this needs to be in sync with the IDS_IE4 strings.
*/
CHECKLISTITEM c_rgcliIE4[] = {
#ifdef NOINTERNET_WORKS
// WARNING! If you turn this on, make sure to renumber the IDS_IE4
// strings and fix IE4_OnWhatsThis
{ IE4_GetRest, IE4_SetRest, (LPARAM)c_tszNoInternetIcon, },
#endif
{ IE4_GetRest, IE4_SetRest, (LPARAM)c_tszNoRecentDocsHistory, },
{ IE4_GetRest, IE4_SetRest, (LPARAM)c_tszNoRecentDocsMenu, },
{ IE4_GetRest, IE4_SetRest, (LPARAM)c_tszNoActiveDesktop, },
{ IE4_GetRest, IE4_SetRest, (LPARAM)c_tszNoActiveDesktopChanges,},
/*
* Sigh. Shell5 changed the restriction key for NoFavoritesMenu.
* Fortunately, it's in the UI so I don't need to expose it any more.
*/
{ IE4_GetRest4, IE4_SetRest, (LPARAM)c_tszNoFavoritesMenu, },
{ IE4_GetRest, IE4_SetRest, (LPARAM)c_tszClearRecentDocsOnExit, },
{ IE4_GetRest, IE4_SetRest, (LPARAM)c_tszClassicShell, },
{ IE4_GetRest, IE4_SetRest, (LPARAM)c_tszNoLogoff, },
{ IE4_GetDword, IE4_SetDword, (LPARAM)&c_klSingleClick, },
{ IE4_GetFavLink, IE4_SetFavLink, 0, },
{ IE4_GetRest5, IE4_SetRest, (LPARAM)TEXT("NoSMHelp"), },
{ IE4_GetRest5, IE4_SetRest, (LPARAM)TEXT("NoControlPanel") },
{ IE4_GetRest5, IE4_SetRest, (LPARAM)TEXT("NoNetworkConnections")},
{ IE4_GetRest5, IE4_SetRest, (LPARAM)TEXT("NoWinKeys") },
{ IE4_GetRestCNM,IE4_SetRest, (LPARAM)TEXT("NoComputersNearMe") },
{ IE4_GetRest5, IE4_SetRest, (LPARAM)TEXT("NoSMMyDocs") },
{ IE4_GetRest55,IE4_SetRest, (LPARAM)TEXT("NoSMMyPictures") },
};
/*****************************************************************************
*
* IE4_OnWhatsThis
*
*****************************************************************************/
void PASCAL
IE4_OnWhatsThis(HWND hwnd, int iItem)
{
LV_ITEM lvi;
Misc_LV_GetItemInfo(hwnd, &lvi, iItem, LVIF_PARAM);
WinHelp(hwnd, c_tszMyHelp, HELP_CONTEXTPOPUP,
IDH_ADDTODOCSMENU + lvi.lParam);
}
/*****************************************************************************
*
* IE4_OnCommand
*
* Ooh, we got a command.
*
*****************************************************************************/
void PASCAL
IE4_OnCommand(HWND hdlg, int id, UINT codeNotify)
{
}
/*****************************************************************************
*
* IE4_OnInitDialog
*
* Initialize the listview with the current restrictions.
*
*****************************************************************************/
BOOL PASCAL
IE4_OnInitDialog(HWND hwnd)
{
#if 0
HWND hdlg = GetParent(hwnd);
TCHAR tsz[MAX_PATH];
int dids;
for (dids = 0; dids < cA(c_rgrest); dids++) {
BOOL fState;
#ifdef NOINTERNET_WORKS
LoadString(hinstCur, IDS_IE4+dids, tsz, cA(tsz));
#else
LoadString(hinstCur, IDS_IE4+1+dids, tsz, cA(tsz));
#endif
fState = GetRestriction(c_rgrest[dids].ptsz);
LV_AddItem(hwnd, dids, tsz, -1, fState);
}
#endif
#ifdef NOINTERNET_WORKS
Checklist_OnInitDialog(hwnd, c_rgcliIE4, cA(c_rgcliIE4), IDS_IE4, 0);
#else
Checklist_OnInitDialog(hwnd, c_rgcliIE4, cA(c_rgcliIE4), IDS_IE4+1, 0);
#endif
return 1;
}
/*****************************************************************************
*
* IE4_OnApply
*
*****************************************************************************/
void PASCAL
IE4_OnApply(HWND hdlg)
{
BOOL fChanged = FALSE;
Checklist_OnApply(hdlg, c_rgcliIE4, &fChanged, FALSE);
if (fChanged) {
PIDL pidl;
/*
* Tell the shell that we changed the policies.
*/
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
(LPARAM)c_tszIE4RegKeyChange);
/*
* Tickle the Start Menu folder to force the Start Menu
* to rebuild with the new policies in effect.
*/
if (SUCCEEDED(SHGetSpecialFolderLocation(hdlg,
CSIDL_STARTMENU, &pidl))) {
SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_IDLIST, pidl, 0);
Ole_Free(pidl);
}
}
}
/*****************************************************************************
*
* Oh yeah, we need this too.
*
*****************************************************************************/
#pragma BEGIN_CONST_DATA
LVCI lvciIE4[] = {
{ IDC_WHATSTHIS, IE4_OnWhatsThis },
{ 0, 0 },
};
LVV lvvIE4 = {
IE4_OnCommand,
0, /* IE4_OnInitContextMenu */
0, /* IE4_Dirtify */
0, /* IE4_GetIcon */
IE4_OnInitDialog,
IE4_OnApply,
0, /* IE4_OnDestroy */
0, /* IE4_OnSelChange */
6, /* iMenu */
rgdwHelp,
0, /* Double-click action */
lvvflCanCheck, /* We need check boxes */
lvciIE4,
};
#pragma END_CONST_DATA
/*****************************************************************************
*
* Our window procedure.
*
*****************************************************************************/
INT_PTR EXPORT
IE4_DlgProc(HWND hdlg, UINT wm, WPARAM wParam, LPARAM lParam)
{
return LV_DlgProc(&lvvIE4, hdlg, wm, wParam, lParam);
}