|
|
/*
File gentab.c
Implements the ui behind the general tab for the connections dialup server ui.
Paul Mayfield, 10/2/97 */
#include "rassrv.h"
#include <tapi.h>
// Help maps
static const DWORD phmGenTab[] = { CID_GenTab_LV_Devices, IDH_GenTab_LV_Devices, CID_GenTab_CB_Multilink, IDH_GenTab_CB_Multilink, CID_GenTab_PB_Properties, IDH_GenTab_PB_Properties, CID_GenTab_CB_Vpn, IDH_GenTab_CB_Vpn, CID_GenTab_CB_ShowIcons, IDH_GenTab_CB_ShowIcons, 0, 0 };
// Fills in the property sheet structure with the information
// required to display the general tab.
//
DWORD GenTabGetPropertyPage( 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_GenTab); ppage->pfnDlgProc = GenTabDialogProc; ppage->pfnCallback = RasSrvInitDestroyPropSheetCb; ppage->lParam = lpUserData; ppage->dwFlags = PSP_USECALLBACK;
return NO_ERROR; }
// Error reporting
//
VOID GenTabDisplayError( IN HWND hwnd, IN DWORD dwErr) { ErrDisplayError( hwnd, dwErr, ERR_GENERALTAB_CATAGORY, 0, Globals.dwErrorData); }
//
// Returns the index of an to display icon based on the type of incoming
// connection and whether or not it should be checked.
//
INT GenTabGetIconIndex( IN DWORD dwType, IN BOOL bEnabled) { if (dwType == INCOMING_TYPE_PHONE) { return DI_Phone; } else { return DI_Direct; } }
//
// Fills in the device list with the list of the devices stored in the
// device database. Also, initializes the checked/unchecked status
// of each device.
//
DWORD GenTabFillDeviceList( IN HWND hwndDlg, IN HWND hwndLV, IN HANDLE hDevDatabase) { LV_ITEM lvi; LV_COLUMN lvc; DWORD dwCount, i, dwErr, dwType; HANDLE hDevice; PWCHAR pszName; char pszAName[1024]; BOOL bEnabled;
// Get the count of all the users
dwErr = devGetDeviceCount(hDevDatabase, &dwCount); if (dwErr != NO_ERROR) { GenTabDisplayError(hwndLV, ERR_DEVICE_DATABASE_CORRUPT); return dwErr; }
// Initialize the list item
ZeroMemory(&lvi, sizeof(LV_ITEM)); lvi.mask = LVIF_TEXT | LVIF_IMAGE;
// If there are devices to display then populate the list box
// with them
if (dwCount > 0) { ListView_SetDeviceImageList(hwndLV, Globals.hInstDll);
// Looop through all of the devices adding them to the list
for (i=0; i<dwCount; i++) { dwErr = devGetDeviceHandle(hDevDatabase, i, &hDevice); if (dwErr == NO_ERROR) { devGetDeviceName (hDevice, &pszName); devGetDeviceEnable (hDevice, &bEnabled); devGetDeviceType (hDevice, &dwType); lvi.iImage = GenTabGetIconIndex(dwType, bEnabled); lvi.iItem = i; lvi.pszText = pszName; lvi.cchTextMax = wcslen(pszName)+1; ListView_InsertItem(hwndLV,&lvi); ListView_SetCheck(hwndLV, i, bEnabled); } }
// Select the first item in the list view if any items exist
//
ListView_SetItemState( hwndLV, 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
// Initialize the alignment of the text that gets displayed
lvc.mask = LVCF_FMT; lvc.fmt = LVCFMT_LEFT; }
// If there are no devices then we display a message in the big
// white box explaining that we have no devices to show.
else { PWCHAR pszLine1, pszLine2; HWND hwndGenTab = NULL;
pszLine1 = (PWCHAR) PszLoadString(Globals.hInstDll, SID_NO_DEVICES1); pszLine2 = (PWCHAR) PszLoadString(Globals.hInstDll, SID_NO_DEVICES2); lvi.mask = LVIF_TEXT;
lvi.iItem = 0; lvi.pszText = pszLine1; lvi.cchTextMax = wcslen(pszLine1); ListView_InsertItem(hwndLV, &lvi); lvi.iItem = 1; lvi.pszText = pszLine2; lvi.cchTextMax = wcslen(pszLine2); ListView_InsertItem(hwndLV, &lvi);
// Initialize the alignment of the text that gets displayed
lvc.mask = LVCF_FMT; lvc.fmt = LVCFMT_CENTER;
// Disable the list view
EnableWindow(hwndLV, FALSE);
// Disable the properties button while you're at it
hwndGenTab = GetDlgItem(hwndDlg, CID_GenTab_PB_Properties); if (NULL != hwndGenTab) { EnableWindow(hwndGenTab, FALSE); } } // Add a colum so that we'll display in report view
ListView_InsertColumn(hwndLV, 0, &lvc); ListView_SetColumnWidth(hwndLV, 0, LVSCW_AUTOSIZE_USEHEADER); return NO_ERROR; }
//
// This function causes the multilink check box behave in a way that
// allows the user to see how multilink works.
//
DWORD GenTabAdjustMultilinkAppearance( IN HWND hwndDlg, IN HANDLE hDevDatabase, IN HANDLE hMiscDatabase) { DWORD dwErr = NO_ERROR, i, dwEndpointsEnabled; HWND hwndML = GetDlgItem(hwndDlg, CID_GenTab_CB_Multilink); BOOL bDisable, bUncheck, bFlag = FALSE, bIsServer;
do { // Initialize default behavior in case of an error
//
bDisable = TRUE; bUncheck = FALSE; // Find out how many endpoints are enabled for inbound calls
//
dwErr = devGetEndpointEnableCount( hDevDatabase, &dwEndpointsEnabled); if (dwErr != NO_ERROR) { break; } // If multiple devices are not enabled for inbound calls then
// multilink is meaningless. Disable the multilink control and
// uncheck it.
//
if (dwEndpointsEnabled < 2) { bUncheck = TRUE; bDisable = TRUE; dwErr = NO_ERROR; break; } // The multilink check only makes sense on NT Server. This is
// based on the following assumptions
// 1. You only disable multilink so that you can free lines
// for additional callers.
// 2. PPP will enforce that you only have one caller over
// modem device on nt wks anyway.
//
miscGetProductType(hMiscDatabase, &bIsServer); if (! bIsServer) { bDisable = TRUE; bUncheck = FALSE; dwErr = NO_ERROR; break; }
// Otherwise, multilink makes sense. Enable the multilink
// control and set its check according to what the system says
bDisable = FALSE; bUncheck = FALSE; dwErr = miscGetMultilinkEnable(hMiscDatabase, &bFlag); if (dwErr != NO_ERROR) { GenTabDisplayError(hwndDlg, ERR_DEVICE_DATABASE_CORRUPT); break; } } while (FALSE);
// Cleanup
{ if (hwndML) { EnableWindow(hwndML, !bDisable); if (bUncheck) { SendMessage( hwndML, BM_SETCHECK, BST_UNCHECKED, 0); } else { SendMessage( hwndML, BM_SETCHECK, (bFlag) ? BST_CHECKED : BST_UNCHECKED, 0); } } }
return dwErr; }
//
// Initializes the general tab. By now a handle to the general
// database has been placed in the user data of the dialog
//
DWORD GenTabInitializeDialog( IN HWND hwndDlg, IN WPARAM wParam, IN LPARAM lParam) { DWORD dwErr, dwCount; BOOL bFlag, bIsServer = FALSE; HWND hwndVPN = NULL; HWND hwndShowIcons = NULL; HANDLE hDevDatabase = NULL, hMiscDatabase = NULL; HWND hwndLV = GetDlgItem(hwndDlg, CID_GenTab_LV_Devices);
// Get handles to the databases we're interested in
//
RasSrvGetDatabaseHandle( hwndDlg, ID_DEVICE_DATABASE, &hDevDatabase); RasSrvGetDatabaseHandle( hwndDlg, ID_MISC_DATABASE, &hMiscDatabase);
// Set the logging level
//
miscSetRasLogLevel(hMiscDatabase, MISCDB_RAS_LEVEL_ERR_AND_WARN);
// Fill in the list view will all available devices
//
if (hwndLV) ListView_InstallChecks(hwndLV, Globals.hInstDll); GenTabFillDeviceList(hwndDlg, hwndLV, hDevDatabase);
// Adjust the multilink control
//
miscGetProductType(hMiscDatabase, &bIsServer); if (bIsServer) { GenTabAdjustMultilinkAppearance( hwndDlg, hDevDatabase, hMiscDatabase); } else { HWND hwndMultiLink = GetDlgItem(hwndDlg, CID_GenTab_CB_Multilink); if (hwndMultiLink) { ShowWindow(hwndMultiLink, SW_HIDE); } }
// Initialize the vpn check
//
dwErr = devGetVpnEnable(hDevDatabase, &bFlag); if (dwErr != NO_ERROR) { GenTabDisplayError(hwndDlg, ERR_DEVICE_DATABASE_CORRUPT); return dwErr; } hwndVPN = GetDlgItem(hwndDlg, CID_GenTab_CB_Vpn); if (hwndVPN) { SendMessage(hwndVPN, BM_SETCHECK, (bFlag) ? BST_CHECKED : BST_UNCHECKED, 0); }
// Initialize the show icons check
//
dwErr = miscGetIconEnable(hMiscDatabase, &bFlag); if (dwErr != NO_ERROR) { GenTabDisplayError(hwndDlg, ERR_DEVICE_DATABASE_CORRUPT); return dwErr; } hwndShowIcons = GetDlgItem(hwndDlg, CID_GenTab_CB_ShowIcons); if (hwndShowIcons) { SendMessage(hwndShowIcons, BM_SETCHECK, (bFlag) ? BST_CHECKED : BST_UNCHECKED, 0); }
//
//for bug 154607 whistler, Enable/Disable Show Icon on taskbar
//check box according to Policy
//
{ BOOL fShowStatistics = TRUE; HRESULT hr; INetConnectionUiUtilities * pNetConUtilities = NULL;
hr = HrCreateNetConnectionUtilities(&pNetConUtilities); if ( SUCCEEDED(hr)) { fShowStatistics = INetConnectionUiUtilities_UserHasPermission( pNetConUtilities, NCPERM_Statistics);
EnableWindow( GetDlgItem(hwndDlg, CID_GenTab_CB_ShowIcons), fShowStatistics ); INetConnectionUiUtilities_Release(pNetConUtilities); } }
return NO_ERROR; }
//
// Deals with changes in the check of a device
//
DWORD GenTabHandleDeviceCheck( IN HWND hwndDlg, IN INT iItem) { HANDLE hDevDatabase = NULL, hMiscDatabase = NULL, hDevice = NULL; DWORD dwErr; HWND hwndLVDevices; RasSrvGetDatabaseHandle(hwndDlg, ID_DEVICE_DATABASE, &hDevDatabase); RasSrvGetDatabaseHandle(hwndDlg, ID_MISC_DATABASE, &hMiscDatabase);
hwndLVDevices = GetDlgItem(hwndDlg, CID_GenTab_LV_Devices); // Set the enabling of the given device
dwErr = devGetDeviceHandle(hDevDatabase, (DWORD)iItem, &hDevice); if ((NO_ERROR == dwErr) && hwndLVDevices) { // Set the device
devSetDeviceEnable( hDevice, ListView_GetCheck(hwndLVDevices, iItem)); // Update the multilink check
GenTabAdjustMultilinkAppearance( hwndDlg, hDevDatabase, hMiscDatabase); } return NO_ERROR; }
//
// Go through the list view and get the device enablings and
// commit them to the database.
//
DWORD GenTabCommitDeviceSettings( IN HWND hwndLV, IN HANDLE hDevDatabase) { return NO_ERROR; }
//
// Processes the activation of the general tab. Return TRUE to
// report that the message has been handled.
//
BOOL GenTabSetActive ( IN HWND hwndDlg) { HANDLE hDevDatabase = NULL; DWORD dwErr, dwCount, dwId;
PropSheet_SetWizButtons(GetParent(hwndDlg), 0);
// Find out if we're the device page in the incoming wizard.
dwErr = RasSrvGetPageId (hwndDlg, &dwId); if (dwErr != NO_ERROR) { return dwErr; } if (dwId == RASSRVUI_DEVICE_WIZ_TAB) { // Find out if there are any devices to show
RasSrvGetDatabaseHandle( hwndDlg, ID_DEVICE_DATABASE, &hDevDatabase); dwErr = devGetDeviceCount (hDevDatabase, &dwCount);
// If there are no devices or if there's a database problem,
// don't allow this page to be activated.
if ((dwErr != NO_ERROR) || (dwCount == 0)) { SetWindowLongPtr (hwndDlg, DWLP_MSGRESULT, (LONG_PTR)-1); } } PropSheet_SetWizButtons( GetParent(hwndDlg), PSWIZB_NEXT | PSWIZB_BACK);
return TRUE; }
//
// Displays properties for the given device
//
DWORD GenTabRaiseProperties ( IN HWND hwndDlg, IN DWORD dwIndex) { HANDLE hDevDatabase = NULL, hDevice = NULL; DWORD dwId, dwErr;
// Get the device id
RasSrvGetDatabaseHandle( hwndDlg, ID_DEVICE_DATABASE, &hDevDatabase);
dwErr = devGetDeviceHandle(hDevDatabase, dwIndex, &hDevice); if (dwErr != NO_ERROR) { return ERROR_CAN_NOT_COMPLETE; } if (devGetDeviceId(hDevice, &dwId) != NO_ERROR) { return ERROR_CAN_NOT_COMPLETE; } // Launch the device properties dialog
dwErr = lineConfigDialogW(dwId, hwndDlg, NULL); if (dwErr == LINEERR_OPERATIONUNAVAIL) { GenTabDisplayError(hwndDlg, ERR_DEVICE_HAS_NO_CONFIG); dwErr = NO_ERROR; } return dwErr; }
//
// WM_COMMAND handler
//
DWORD GenTabCommand( IN HWND hwndDlg, IN WPARAM wParam) { HANDLE hMiscDatabase = NULL, hDevDatabase = NULL; RasSrvGetDatabaseHandle( hwndDlg, ID_MISC_DATABASE, &hMiscDatabase); RasSrvGetDatabaseHandle( hwndDlg, ID_DEVICE_DATABASE, &hDevDatabase);
switch (wParam) { case CID_GenTab_CB_Multilink: miscSetMultilinkEnable( hMiscDatabase, (BOOL)SendDlgItemMessage( hwndDlg, CID_GenTab_CB_Multilink, BM_GETCHECK, 0, 0)); break; case CID_GenTab_CB_Vpn: devSetVpnEnable( hDevDatabase, (BOOL)SendDlgItemMessage( hwndDlg, CID_GenTab_CB_Vpn, BM_GETCHECK, 0, 0)); break; case CID_GenTab_CB_ShowIcons: miscSetIconEnable( hMiscDatabase, (BOOL)SendDlgItemMessage( hwndDlg, CID_GenTab_CB_ShowIcons, BM_GETCHECK, 0, 0)); break; case CID_GenTab_PB_Properties: { HWND hwndLVDevices = GetDlgItem(hwndDlg, CID_GenTab_LV_Devices); if (hwndLVDevices) { GenTabRaiseProperties ( hwndDlg, ListView_GetSelectionMark(hwndLVDevices)); } break; } }
return NO_ERROR; }
//
// This is the dialog procedure that responds to messages sent
// to the general tab.
//
INT_PTR CALLBACK GenTabDialogProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN 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; }
// Process other messages as normal
switch (uMsg) { case WM_INITDIALOG: return FALSE; break;
case WM_HELP: case WM_CONTEXTMENU: RasSrvHelp (hwndDlg, uMsg, wParam, lParam, phmGenTab); break;
case WM_NOTIFY: { NM_LISTVIEW* pLvNotifyData; NMHDR* pNotifyData = (NMHDR*)lParam; switch (pNotifyData->code) { //
// Note: PSN_APPLY and PSN_CANCEL are handled
// by RasSrvMessageFilter
//
case PSN_SETACTIVE: // Initailize the dialog if it isn't already
//
if (! GetWindowLongPtr(hwndDlg, GWLP_USERDATA)) { GenTabInitializeDialog(hwndDlg, wParam, lParam); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)1); } if (GenTabSetActive (hwndDlg)) return TRUE; break;
// The check of an item is changing
case LVXN_SETCHECK: pLvNotifyData = (NM_LISTVIEW*)lParam; GenTabHandleDeviceCheck( hwndDlg, pLvNotifyData->iItem); break;
case LVXN_DBLCLK: pLvNotifyData = (NM_LISTVIEW*)lParam; GenTabRaiseProperties( hwndDlg, pLvNotifyData->iItem); break; } } break;
case WM_COMMAND: GenTabCommand(hwndDlg, wParam); break; }
return FALSE; }
|