/* File nettab.c Implementation of the ui behind the networking tab in the dialup server ui. Paul Mayfield 10/8/97. */ #include // 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; }