windows-nt/Source/XPSP1/NT/net/rras/ras/ui/rassrvui/nettab.c

920 lines
21 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*
File nettab.c
Implementation of the ui behind the networking tab in the dialup server
ui.
Paul Mayfield 10/8/97.
*/
#include <rassrv.h>
// Help maps
static const DWORD phmNetTab[] =
{
CID_NetTab_LV_Components, IDH_NetTab_LV_Components,
CID_NetTab_PB_Add, IDH_NetTab_PB_Add,
CID_NetTab_PB_Remove, IDH_NetTab_PB_Remove,
CID_NetTab_PB_Properties, IDH_NetTab_PB_Properties,
0, 0
};
//
// Fills in the property sheet structure with the information
// required to display the networking tab.
//
DWORD
NetTabGetPropertyPage(
IN LPPROPSHEETPAGE ppage,
IN LPARAM lpUserData)
{
// Initialize
ZeroMemory(ppage, sizeof(PROPSHEETPAGE));
// Fill in the values
ppage->dwSize = sizeof(PROPSHEETPAGE);
ppage->hInstance = Globals.hInstDll;
ppage->pszTemplate = MAKEINTRESOURCE(PID_NetTab);
ppage->pfnDlgProc = NetTabDialogProc;
ppage->pfnCallback = RasSrvInitDestroyPropSheetCb;
ppage->dwFlags = PSP_USECALLBACK;
ppage->lParam = lpUserData;
return NO_ERROR;
}
// Error reporting
VOID
NetTabDisplayError(
IN HWND hwnd,
IN DWORD dwErr)
{
ErrDisplayError(
hwnd,
dwErr,
ERR_ADVANCEDTAB_CATAGORY,
0,
Globals.dwErrorData);
}
//
// Returns the index of an to display icon based on the
// type of incoming connection.
//
INT
NetTabGetIconIndex(
IN DWORD dwType)
{
switch (dwType)
{
case NETCFGDB_SERVICE:
return NI_Service;
case NETCFGDB_CLIENT:
return NI_Client;
case NETCFGDB_PROTOCOL:
return NI_Protocol;
}
return 0;
}
//
// Sets up the UI so that the user is forced to complete the
// config they've started. Triggered when a non-reversable option
// is taken such as adding/removing a networking component.
//
DWORD
NetTabDisableRollback(
IN HWND hwndDlg)
{
DWORD dwErr, dwId = 0;
do
{
dwErr = RasSrvGetPageId (hwndDlg, &dwId);
if (dwErr != NO_ERROR)
{
break;
}
if (dwId == RASSRVUI_ADVANCED_TAB)
{
PropSheet_CancelToClose(GetParent(hwndDlg));
}
} while (FALSE);
// Cleanup
{
}
return dwErr;
}
//
// Fills in the given list view with the names of the components
// stored in the database provided.
//
DWORD
NetTabFillComponentList(
IN HWND hwndLV,
IN HANDLE hNetCompDatabase)
{
LV_ITEM lvi;
DWORD dwCount, i, dwErr, dwProtCount, dwType;
PWCHAR pszName;
BOOL bManip, bEnabled;
// Get the count of all the components
//
dwErr = netDbGetCompCount (hNetCompDatabase, &dwCount);
if (dwErr != NO_ERROR)
{
return dwErr;
}
// Initialize the list item
ZeroMemory(&lvi, sizeof(LV_ITEM));
lvi.mask = LVIF_TEXT | LVIF_IMAGE;
// Looop through all of the network components
// adding their names as we go
for (i = 0; i < dwCount; i++)
{
netDbGetType (hNetCompDatabase, i, &dwType);
netDbIsRasManipulatable (hNetCompDatabase, i, &bManip);
netDbGetEnable (hNetCompDatabase, i, &bEnabled);
// Fill in the data
//
netDbGetName (hNetCompDatabase, i, &pszName);
lvi.iImage = NetTabGetIconIndex(dwType);
lvi.iItem = i;
lvi.pszText = pszName;
lvi.cchTextMax = wcslen(pszName)+1;
ListView_InsertItem(hwndLV,&lvi);
ListView_SetCheck(hwndLV, i, bEnabled);
// If this is not a ras manipulateable component,
// disable the check since it can't be set anyway.
if (!bManip)
{
ListView_DisableCheck(hwndLV, i);
}
}
return NO_ERROR;
}
//
// Updates the description of the currently selected protocol
//
DWORD
NetTabUpdateDescription(
IN HWND hwndDlg,
IN DWORD i)
{
HANDLE hNetCompDatabase = NULL, hProt = NULL;
PWCHAR pszDesc;
DWORD dwErr = NO_ERROR;
// Get handles to the databases we're interested in
RasSrvGetDatabaseHandle(
hwndDlg,
ID_NETCOMP_DATABASE,
&hNetCompDatabase);
do
{
dwErr = netDbGetDesc(hNetCompDatabase, i, &pszDesc);
if (dwErr != NO_ERROR)
{
break;
}
// Set the description
SetDlgItemTextW(
hwndDlg,
CID_NetTab_ST_Description,
pszDesc);
} while (FALSE);
// Cleanup
{
if (dwErr != NO_ERROR)
{
SetDlgItemTextW(
hwndDlg,
CID_NetTab_ST_Description,
L"");
}
}
return dwErr;
}
//
//When an Item in the listview is selected, check if the user can Uninstall it
//for whistler bug 347355 gangz
//
DWORD
NetTabEnableDisableRemoveButton (
IN HWND hwndDlg,
IN DWORD iItem)
{
HANDLE hNetCompDatabase = NULL;
DWORD dwErr;
HWND hwndRemove = NULL;
BOOL bHasPermit = FALSE;
if ( !hwndDlg )
{
return ERROR_INVALID_PARAMETER;
}
hwndRemove = GetDlgItem(hwndDlg, CID_NetTab_PB_Remove);
dwErr = RasSrvGetDatabaseHandle(
hwndDlg,
ID_NETCOMP_DATABASE,
&hNetCompDatabase);
if ( NO_ERROR != dwErr ||
NULL == hwndRemove )
{
return ERROR_CAN_NOT_COMPLETE;
}
dwErr = netDbHasRemovePermission(
hNetCompDatabase,
iItem,
&bHasPermit);
if( NO_ERROR == dwErr )
{
EnableWindow( hwndRemove, bHasPermit);
}
return dwErr;
}
//
// Enables or disables the properties button based on whether
// the index of the given item in the list view can have properties
// invoked on it. Currently, only non-ras-manaipulatable protocols
// can not have their properties invoked.
//
DWORD
NetTabEnableDisablePropButton(
IN HWND hwndDlg,
IN INT iItem)
{
HANDLE hNetCompDatabase = NULL;
DWORD dwErr;
BOOL bHasUi;
// Get a reference to the network component database
//
RasSrvGetDatabaseHandle(
hwndDlg,
ID_NETCOMP_DATABASE,
&hNetCompDatabase);
// Get the type and whether it is manipulatable
//
dwErr = netDbHasPropertiesUI (hNetCompDatabase, iItem, &bHasUi);
if (dwErr != NO_ERROR)
{
return dwErr;
}
// Enable or disable properties
EnableWindow(
GetDlgItem(hwndDlg, CID_NetTab_PB_Properties),
bHasUi);
return NO_ERROR;
}
//
// Refreshes the list view
//
DWORD
NetTabRefreshListView(
IN HWND hwndLV,
IN HANDLE hNetCompDatabase)
{
DWORD dwCount, dwErr;
HWND hwndDlg = GetParent(hwndLV);
// Get rid of all of the old elements in the list view
//
ListView_DeleteAllItems(hwndLV);
// Re-stock the list views
//
dwErr = NetTabFillComponentList(hwndLV, hNetCompDatabase);
if (dwErr != NO_ERROR)
{
return dwErr;
}
// Select the first protocol in the list view if any items exist.
// Also in this case, make sure that "remove" is enabled/disabled
// according to the the first item in the list view
//
netDbGetCompCount(hNetCompDatabase, &dwCount);
if (dwCount)
{
ListView_SetItemState(
hwndLV,
0,
LVIS_SELECTED | LVIS_FOCUSED,
LVIS_SELECTED | LVIS_FOCUSED);
//for whistler bug 406698 gangz
//
NetTabEnableDisableRemoveButton (
hwndDlg,
0);
}
// If there are no components, disable the properties
// and remove buttons
else
{
EnableWindow(
GetDlgItem(hwndDlg, CID_NetTab_PB_Properties),
FALSE);
EnableWindow(
GetDlgItem(hwndDlg, CID_NetTab_PB_Remove),
FALSE);
}
return NO_ERROR;
}
//
// Initializes the networking tab. By now a handle to the advanced
// database has been placed in the user data of the dialog
//
DWORD
NetTabInitializeDialog(
HWND hwndDlg,
WPARAM wParam)
{
DWORD dwErr, dwCount, i;
BOOL bFlag;
HANDLE hNetCompDatabase = NULL, hMiscDatabase = NULL;
HWND hwndLV;
LV_COLUMN lvc;
BOOL bExpose = FALSE, bIsServer;
// Get handles to the databases we're interested in
//
RasSrvGetDatabaseHandle(
hwndDlg,
ID_MISC_DATABASE,
&hMiscDatabase);
RasSrvGetDatabaseHandle(
hwndDlg,
ID_NETCOMP_DATABASE,
&hNetCompDatabase);
// Fill in the list view will all available protocols followed
// by all of the installed network components.
//
hwndLV = GetDlgItem(hwndDlg, CID_NetTab_LV_Components);
ListView_InstallChecks(hwndLV, Globals.hInstDll);
ListView_SetNetworkComponentImageList(hwndLV, Globals.hInstDll);
// Fill the list view
NetTabRefreshListView(hwndLV, hNetCompDatabase);
//for whistler bug 347355 gangz
//
NetTabEnableDisablePropButton(
hwndDlg,
0);
NetTabEnableDisableRemoveButton (
hwndDlg,
0);
// Add a colum so that we'll display in report view
lvc.mask = LVCF_FMT;
lvc.fmt = LVCFMT_LEFT;
ListView_InsertColumn(hwndLV,0,&lvc);
ListView_SetColumnWidth(hwndLV, 0, LVSCW_AUTOSIZE_USEHEADER);
return NO_ERROR;
}
// Handles a check being made
DWORD
NetTabHandleProtCheck(
IN HWND hwndDlg,
IN DWORD dwIndex)
{
BOOL bEnable = FALSE, bEnabled = FALSE;
DWORD dwErr = NO_ERROR, dwId = 0;
HANDLE hNetCompDatabase = NULL;
HWND hwndLV =
GetDlgItem(hwndDlg, CID_NetTab_LV_Components);
MSGARGS MsgArgs;
INT iRet;
PWCHAR pszName = NULL;
// Initailize the message arguments
//
ZeroMemory(&MsgArgs, sizeof(MsgArgs));
// Find out whether the component is being enabled or
// disabled
bEnable = !!ListView_GetCheck(hwndLV, dwIndex);
// Get the handle for the Prot database
//
RasSrvGetDatabaseHandle(
hwndDlg,
ID_NETCOMP_DATABASE,
&hNetCompDatabase);
// Get component id
//
dwErr = netDbGetId(
hNetCompDatabase,
dwIndex,
&dwId);
if (dwErr != NO_ERROR)
{
return dwErr;
}
// Get component name
//
dwErr = netDbGetName(
hNetCompDatabase,
dwIndex,
&pszName);
if (dwErr != NO_ERROR)
{
return dwErr;
}
// Get component enabling
//
dwErr = netDbGetEnable(
hNetCompDatabase,
dwIndex,
&bEnabled);
if (dwErr != NO_ERROR)
{
return dwErr;
}
// If F&P is being unchecked, then popup the mmc warning
//
if ((dwId == NETCFGDB_ID_FILEPRINT) &&
(bEnable == FALSE) &&
(bEnabled == TRUE))
{
// Ask the user whether we should bring up the
// mmc console to allow him/her to stop FPS.
//
MsgArgs.apszArgs[0] = pszName;
MsgArgs.dwFlags = MB_YESNO;
iRet = MsgDlgUtil(
GetActiveWindow(),
SID_STOP_FP_SERVICE,
&MsgArgs,
Globals.hInstDll,
WRN_TITLE);
// If the user agrees, bring up the console
//
if (iRet == IDYES)
{
dwErr = RassrvLaunchMMC(RASSRVUI_SERVICESCONSOLE);
if (dwErr != NO_ERROR)
{
return dwErr;
}
}
}
// If F&P is not being unchecked, treat the component
// normally.
//
else
{
// Update the check
dwErr = netDbSetEnable(hNetCompDatabase, dwIndex, bEnable);
if (dwErr != NO_ERROR)
{
return dwErr;
}
}
return NO_ERROR;
}
//
// Adds networking components
//
DWORD
NetTabAddComponent(
IN HWND hwndDlg)
{
HANDLE hNetCompDatabase = NULL;
DWORD dwErr;
RasSrvGetDatabaseHandle(
hwndDlg,
ID_NETCOMP_DATABASE,
&hNetCompDatabase);
dwErr = netDbRaiseInstallDialog(hNetCompDatabase, hwndDlg);
if (dwErr == NO_ERROR || dwErr == NETCFG_S_REBOOT)
{
NetTabRefreshListView(
GetDlgItem(hwndDlg, CID_NetTab_LV_Components),
hNetCompDatabase);
NetTabDisableRollback(hwndDlg);
}
if (dwErr == NETCFG_S_REBOOT)
{
RasSrvReboot(hwndDlg);
}
return dwErr;
}
//
// Removes networking components
//
DWORD
NetTabRemoveComponent(
IN HWND hwndDlg,
IN DWORD dwIndex)
{
HANDLE hNetCompDatabase = NULL;
DWORD dwCount, dwErr;
RasSrvGetDatabaseHandle(
hwndDlg,
ID_NETCOMP_DATABASE,
&hNetCompDatabase);
// or else, remove the requested component
//
dwErr = netDbRaiseRemoveDialog(
hNetCompDatabase,
dwIndex,
hwndDlg);
if (dwErr == NO_ERROR || dwErr == NETCFG_S_REBOOT)
{
NetTabRefreshListView(
GetDlgItem(hwndDlg, CID_NetTab_LV_Components),
hNetCompDatabase);
NetTabDisableRollback(hwndDlg);
}
if (dwErr == NETCFG_S_REBOOT)
{
RasSrvReboot(hwndDlg);
}
return dwErr;
}
// Edits network component properties
//
DWORD
NetTabEditProperties(
IN HWND hwndDlg,
IN DWORD dwIndex)
{
HANDLE hNetCompDatabase = NULL;
DWORD dwCount, dwErr;
RasSrvGetDatabaseHandle(
hwndDlg,
ID_NETCOMP_DATABASE,
&hNetCompDatabase);
dwErr = netDbRaisePropertiesDialog (
hNetCompDatabase,
dwIndex,
hwndDlg);
if (dwErr == NETCFG_S_REBOOT)
{
RasSrvReboot(hwndDlg);
}
return dwErr;
}
//
// Switch to mmc
//
DWORD
NetTabSwitchToMMC(
IN HWND hwndDlg)
{
if (RassrvWarnMMCSwitch(hwndDlg))
{
// Commit the changes to this property sheet
// and close it
PropSheet_PressButton(GetParent(hwndDlg), PSBTN_OK);
return RassrvLaunchMMC(RASSRVUI_NETWORKCONSOLE);
}
return ERROR_CANCELLED;
}
//
// Handles the activation call
//
BOOL
NetTabSetActive(
IN HWND hwndDlg,
IN WPARAM wParam)
{
HANDLE hNetCompDatabase = NULL;
DWORD dwErr;
BOOL bRet = FALSE;
PropSheet_SetWizButtons(GetParent(hwndDlg), 0);
RasSrvGetDatabaseHandle(
hwndDlg,
ID_NETCOMP_DATABASE,
&hNetCompDatabase);
if (! netDbIsLoaded(hNetCompDatabase))
{
dwErr = netDbLoad(hNetCompDatabase);
if (dwErr == NO_ERROR)
{
NetTabInitializeDialog(
hwndDlg,
wParam);
}
else
{
NetTabDisplayError(
hwndDlg,
ERR_CANT_SHOW_NETTAB_INETCFG);
// reject activation
SetWindowLongPtr(
hwndDlg,
DWLP_MSGRESULT,
-1);
bRet = TRUE;
}
}
PropSheet_SetWizButtons(
GetParent(hwndDlg),
PSWIZB_NEXT | PSWIZB_BACK);
return bRet;
}
//
// When the net tab receives WM_ACTIVATE, it means that
// the user left the IC property sheet/wizard and is now coming back
// to it. Since this occurs when switching to MMC update the UI as
// here appropriate.
//
DWORD
NetTabActivate(
IN HWND hwndDlg,
IN WPARAM wParam)
{
HANDLE hNetCompDatabase = NULL;
DWORD dwErr = NO_ERROR;
if (LOWORD(wParam) == WA_INACTIVE)
{
return NO_ERROR;
}
DbgOutputTrace("NetTabActivate: updating components.");
// Get the database handle
//
dwErr = RasSrvGetDatabaseHandle(
hwndDlg,
ID_NETCOMP_DATABASE,
&hNetCompDatabase);
if (dwErr != NO_ERROR)
{
return dwErr;
}
// Update the appropriate components
//
dwErr = netDbReloadComponent(hNetCompDatabase, NETCFGDB_ID_FILEPRINT);
if (dwErr != NO_ERROR)
{
return dwErr;
}
// Refresh the net component list view
//
NetTabRefreshListView(
GetDlgItem(hwndDlg, CID_NetTab_LV_Components),
hNetCompDatabase);
return NO_ERROR;
}
//
// Handles commands
//
DWORD
NetTabCommand(
IN HWND hwndDlg,
IN WPARAM wParam)
{
switch (wParam)
{
case CID_NetTab_PB_Properties:
NetTabEditProperties(
hwndDlg,
ListView_GetSelectionMark(
GetDlgItem(hwndDlg, CID_NetTab_LV_Components)));
break;
case CID_NetTab_PB_Add:
NetTabAddComponent(hwndDlg);
break;
case CID_NetTab_PB_Remove:
NetTabRemoveComponent(
hwndDlg,
ListView_GetSelectionMark(
GetDlgItem(hwndDlg, CID_NetTab_LV_Components)));
break;
case CID_NetTab_PB_SwitchToMMC:
NetTabSwitchToMMC(hwndDlg);
break;
}
return NO_ERROR;
}
//
// This is the dialog procedure that responds to messages sent
// to the networking tab.
//
INT_PTR
CALLBACK
NetTabDialogProc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
// Filter the customized list view messages
if (ListView_OwnerHandler(
hwndDlg,
uMsg,
wParam,
lParam,
LvDrawInfoCallback )
)
{
return TRUE;
}
// Filter the customized ras server ui page messages.
// By filtering messages through here, we are able to
// call RasSrvGetDatabaseHandle below
//
if (RasSrvMessageFilter(hwndDlg, uMsg, wParam, lParam))
{
return TRUE;
}
switch (uMsg)
{
case WM_INITDIALOG:
return 0;
case WM_HELP:
case WM_CONTEXTMENU:
{
RasSrvHelp (hwndDlg, uMsg, wParam, lParam, phmNetTab);
break;
}
case WM_NOTIFY:
{
NMHDR* pNotifyData;
NM_LISTVIEW* pLvNotifyData;
pNotifyData = (NMHDR*)lParam;
switch (pNotifyData->code)
{
//
// Note: PSN_APPLY and PSN_CANCEL are handled
// by RasSrvMessageFilter
//
// The item focus is changing -- update the
// protocol description
case LVN_ITEMCHANGING:
pLvNotifyData = (NM_LISTVIEW*)lParam;
if (pLvNotifyData->uNewState & LVIS_SELECTED)
{
NetTabUpdateDescription(
hwndDlg,
pLvNotifyData->iItem);
NetTabEnableDisablePropButton(
hwndDlg,
pLvNotifyData->iItem);
//for whistler bug 347355 gangz
//
NetTabEnableDisableRemoveButton (
hwndDlg,
(DWORD)pLvNotifyData->iItem);
}
break;
// The check of an item is changing
case LVXN_SETCHECK:
pLvNotifyData = (NM_LISTVIEW*)lParam;
NetTabHandleProtCheck(
hwndDlg,
(DWORD)pLvNotifyData->iItem);
break;
case LVXN_DBLCLK:
pLvNotifyData = (NM_LISTVIEW*)lParam;
NetTabEditProperties(
hwndDlg,
pLvNotifyData->iItem);
break;
// The networking tab is becoming active.
// Attempt to load the netcfg database at
// this time. If unsuccessful, pop up a
// message and don't allow the activation.
case PSN_SETACTIVE:
return NetTabSetActive(hwndDlg, wParam);
break;
}
}
break;
case WM_ACTIVATE:
NetTabActivate(hwndDlg, wParam);
break;
case WM_COMMAND:
NetTabCommand(hwndDlg, wParam);
break;
}
return FALSE;
}