/*++ Copyright (C) Microsoft Corporation, 1995 - 1998 All rights reserved. Module Name: portdlg.cxx Abstract: Printer Port Add / Delete and Monitor Add / Delete dialogs Author: Steve Kiraly (SteveKi) 11/06/95 Revision History: --*/ #include "precomp.hxx" #pragma hdrstop #include "psetup.hxx" #include "drvsetup.hxx" #include "portdlg.hxx" #include "portslv.hxx" /*++ Routine Name: TAddPort Routine Description: Constructs the add port dialog. Arguments: hWnd - parent window handle strServerName - Print server name, NULL if local machine bAdministrator - Administrator flag TRUE if we --*/ TAddPort:: TAddPort( IN const HWND hWnd, IN LPCTSTR pszServerName, IN const BOOL bAdministrator ) : _hWnd( hWnd ), _bAdministrator( bAdministrator ), _bValid( FALSE ), _hPSetupMonitorInfo( NULL ), _pPSetup( NULL ), _pszServerName( pszServerName ), _bPortAdded( FALSE ) { DBGMSG( DBG_TRACE, ( "TAddPort::ctor\n") ); // // Load the setup library. // _pPSetup = new TPSetup; if( !VALID_PTR( _pPSetup ) ) { DBGMSG( DBG_WARN, ( "_pPSetup failed instantiation with %d.\n", GetLastError() ) ); return; } // // Create the setup monitor handle. // _hPSetupMonitorInfo = _pPSetup->PSetupCreateMonitorInfo( pszServerName, _hDlg); if( !_hPSetupMonitorInfo ){ DBGMSG( DBG_WARN, ( "_pPSetup.PSetupCreateMonitorInfo failed with %d.\n", GetLastError() ) ); return; } _bValid = TRUE; } /*++ Routine Name: TAddPort Routine Description: Destructor releases add port resources. Arguments: None. Return Value: Nothing. --*/ TAddPort:: ~TAddPort( ) { DBGMSG( DBG_TRACE, ( "TAddPort::dtor\n") ); // // Release the monitor info handle. // if( _hPSetupMonitorInfo ) _pPSetup->PSetupDestroyMonitorInfo( _hPSetupMonitorInfo ); // // Unload the setup library. // if( _pPSetup ) delete _pPSetup; } /*++ Routine Name: bValid Routine Description: Returns object validity Arguments: None. Return Value: Current object state. --*/ BOOL TAddPort:: bValid( VOID ) { return _bValid; } /*++ Routine Name: bDoModal Routine Description: Eexcutes the modal dialog. Arguments: None. Return Value: TRUE port was added successfully FALSE port was not added. --*/ BOOL TAddPort:: bDoModal( VOID ) { // // Create a modal dialog. // return (BOOL)DialogBoxParam( ghInst, MAKEINTRESOURCE( kResourceId ), _hWnd, MGenericDialog::SetupDlgProc, (LPARAM)this ); } /*++ Routine Name: bSetUI Routine Description: Sets the data on the UI. Arguments: None. Return Value: TRUE data placed on UI. FALSE error occurred. --*/ BOOL TAddPort:: bSetUI( VOID ) { DBGMSG( DBG_TRACE, ( "TAddPort::bSetUI\n") ); // // Create local copies of the control ID's this saves // some execution time and alot of typing. // _hctlMonitorList = GetDlgItem( _hDlg, IDC_ADD_PORT_MONITOR_LIST ); _hctlBrowse = GetDlgItem( _hDlg, IDC_ADD_PORT_BROWSE ); _bPortAdded = FALSE; SPLASSERT( _hctlMonitorList ); SPLASSERT( _hctlBrowse ); // // Reset the monitor list box contents. // ListBox_ResetContent( _hctlMonitorList ); // // Fill the list box with the list of installed monitors. // BOOL bStatus; TCHAR pszName[kStrMax]; DWORD dwSize = COUNTOF( pszName ); for( UINT i = 0 ; ; i++ ){ bStatus = _pPSetup->PSetupEnumMonitor( _hPSetupMonitorInfo, i, pszName, &dwSize ); if( bStatus ) { DBGMSG( DBG_TRACE, ( "Adding Monitor " TSTR " \n", pszName ) ); // // Hide the fax monitor, users are not allowed to // add fax ports. // if( _tcsicmp( pszName, FAX_MONITOR_NAME ) ) { ListBox_AddString( _hctlMonitorList, pszName ); } dwSize = COUNTOF( pszName ); } else { break; } } // // If we are an administrator selection the first monitor in the list. // if( _bAdministrator ){ ListBox_SetCurSel( _hctlMonitorList, 0 ); } // // Disable the controls if not an administrator. // vEnableCtl( _hDlg, IDC_ADD_PORT_MONITOR_LIST, _bAdministrator ); vEnableCtl( _hDlg, IDC_ADD_PORT_BROWSE, _bAdministrator ); vEnableCtl( _hDlg, IDC_ADD_PORT_TEXT, _bAdministrator ); vEnableCtl( _hDlg, IDC_ADD_PORT, _bAdministrator ); // // We cannot add new port monitors remotly, this is a monitor setup // and spooler limitation. // if( _pszServerName ){ vEnableCtl( _hDlg, IDC_ADD_PORT_BROWSE, FALSE ); } return TRUE; } /*++ Routine Name: bReadUI Routine Description: Reads the data from the UI. Arguments: None. Return Value: TRUE UI data read successfully. FALSE failure reading UI data. --*/ BOOL TAddPort:: bReadUI( VOID ) { TCHAR pszName[kStrMax]; BOOL bStatus = TRUE; DBGMSG( DBG_TRACE, ( "TAddPort::bReadUI\n") ); // // Ge the currently selected item. // UINT uSel = ListBox_GetCurSel( _hctlMonitorList ); // // Get the name of the currently selected item. // if( ListBox_GetText( _hctlMonitorList, uSel, pszName ) == LB_ERR ){ DBGMSG( DBG_WARN, ( "Monitor find string failed.\n" ) ); vShowUnexpectedError( _hDlg, IDS_ERR_MONITOR_TITLE ); bStatus = FALSE; } else { // // Save the selected monitor name. // bStatus = _strMonitorName.bUpdate( pszName ); } return bStatus; } /*++ Routine Name: bSaveUI Routine Description: Saves the UI data, this routien will do an AddPort call with the montior selected in the list box. Arguments: None. Return Value: Return value of the AddPort api call. --*/ BOOL TAddPort:: bSaveUI( VOID ) { DBGMSG( DBG_TRACE, ( "TAddPort::bSavetUI\n") ); DBGMSG( DBG_TRACE, ( "Adding port to Monitor " TSTR "\n", (LPCTSTR)_strMonitorName ) ); TStatusB bStatus; // // Add the port using the selected montior. // bStatus DBGCHK = AddPort( (LPTSTR)_pszServerName, _hDlg, (LPTSTR)(LPCTSTR)_strMonitorName ); if( !bStatus ){ // // If not a cancel request then display error message. // if( GetLastError() != ERROR_CANCELLED ){ DBGMSG( DBG_WARN, ( "Error adding port with %d.\n", GetLastError() ) ); extern MSG_ERRMAP gaMsgErrMapPorts[]; iMessage( _hDlg, IDS_ERR_MONITOR_TITLE, IDS_ERR_ADD_PORT, MB_OK|MB_ICONSTOP, kMsgGetLastError, gaMsgErrMapPorts ); return FALSE; } } else { // // Indicate at least one port has been added. This // flag will be used to indicate to the caller if the ports // list needs to be refreshed. // _bPortAdded = TRUE; // // A port has changed modify the cancel button to close. // TString strClose; if( strClose.bLoadString( ghInst, IDS_TEXT_CLOSE ) ){ SetWindowText( GetDlgItem( _hDlg, IDCANCEL ), strClose ); } // // The followng code modfies the default button // style because on return from adding a port // the Ok has the default button style. // i.e. has a bold border. // // Make the OK button a normal button state. // SendMessage( GetDlgItem( _hDlg, IDC_ADD_PORT ), BM_SETSTYLE, MAKEWPARAM( BS_PUSHBUTTON, 0 ), MAKELPARAM( TRUE, 0 ) ); // // Set the focus to the cancel button. // SetFocus( GetDlgItem( _hDlg, IDCANCEL ) ); // // Change the cancel button to the default button. // SendMessage( GetDlgItem( _hDlg, IDCANCEL ), BM_SETSTYLE, MAKEWPARAM( BS_DEFPUSHBUTTON, 0 ), MAKELPARAM( TRUE, 0 ) ); } return TRUE; } /*++ Routine Name: bAddNewMonitor Routine Description: Handles destroying the current monitor list and calling setup to get a new monitor potentialy form another dirve or network resources. Arguments: None. Return Value: TRUE if new monitor updated and UI reflects this. FALSE error occured UI remains unchanged. --*/ BOOL TAddPort:: bAddNewMonitor( VOID ) { DBGMSG( DBG_TRACE, ( "TAddPort::bAddNewMonitor\n") ); // // Get a new monitor form a location or disk. // if( !_pPSetup->PSetupInstallMonitor(_hDlg ) ) { // // If the user canceled the request. // if( GetLastError() == ERROR_CANCELLED ){ DBGMSG( DBG_TRACE, ( "Monitor install cancel request.\n" ) ); return TRUE; } // // Some other error occured. // return FALSE; } // // Release the old monitor info // if( _hPSetupMonitorInfo ) _pPSetup->PSetupDestroyMonitorInfo( _hPSetupMonitorInfo ); // // Update current monitor info. // _hPSetupMonitorInfo = _pPSetup->PSetupCreateMonitorInfo( _pszServerName, _hDlg ); if (!_hPSetupMonitorInfo) { DBGMSG( DBG_WARN, ( "PSetupCreateMonitorInfo failed with %d.\n", GetLastError() ) ); } // // Refresh the UI with the new montiors. // bSetUI(); // // The followng code modfies the default button // style because on return from the user // hitting the browse button it has become the default // button. i.e. has a bold border. // Make the new button a normal button state. // SendMessage( GetDlgItem( _hDlg, IDC_ADD_PORT_BROWSE ), BM_SETSTYLE, MAKEWPARAM( BS_PUSHBUTTON, 0 ), MAKELPARAM( TRUE, 0 ) ); // // Change the focus to the ok button. // SetFocus( GetDlgItem( _hDlg, IDC_ADD_PORT ) ); // // Change the ok button to the default button. // SendMessage( GetDlgItem( _hDlg, IDC_ADD_PORT ), BM_SETSTYLE, MAKEWPARAM( BS_DEFPUSHBUTTON, 0 ), MAKELPARAM( TRUE, 0 ) ); return TRUE; } /*++ Routine Name: bHandleMesage Routine Description: Dialog message handler. Arguments: IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam Return Value: TRUE message was handled. FALSE message was not handled. --*/ BOOL TAddPort:: bHandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam ) { BOOL bStatus = FALSE; switch( uMsg ){ case WM_INITDIALOG: bStatus = bSetUI (); bStatus = TRUE; break; case WM_HELP: case WM_CONTEXTMENU: bStatus = PrintUIHelp( uMsg, _hDlg, wParam, lParam ); break; case WM_COMMAND: switch( GET_WM_COMMAND_ID( wParam, lParam )){ // // Cancel add port // case IDCANCEL: EndDialog( _hDlg, _bPortAdded ); bStatus = TRUE; break; // // OK will add a port. // case IDC_ADD_PORT: bReadUI(); bSaveUI(); bStatus = TRUE; break; // // Browse for new monitor. // case IDC_ADD_PORT_BROWSE: bStatus = bAddNewMonitor(); bStatus = TRUE; break; // // Handle a list box event. // case IDC_ADD_PORT_MONITOR_LIST: switch ( GET_WM_COMMAND_CMD( wParam, lParam ) ){ // // This forces an OK event. // case LBN_DBLCLK: PostMessage( _hDlg, WM_COMMAND, MAKEWPARAM( IDC_ADD_PORT, 0 ), lParam ); bStatus = TRUE; break; } break; default: bStatus = FALSE; break; } default: bStatus = FALSE; break; } return bStatus; }