/*++ Copyright (C) Microsoft Corporation, 1995 - 1998 All rights reserved. Module Name: F:\nt\private\windows\spooler\printui.pri\sepdlg.cxx Abstract: Separator page dialog. Author: Steve Kiraly (SteveKi) 11/10/95 Revision History: --*/ #include "precomp.hxx" #pragma hdrstop #include "sepdlg.hxx" /*++ Routine Name: TSeparatorPage Routine Description: TSeparatorPage constructor Arguments: hWnd - Parent window handle TString - String or current separator page. Return Value: Nothing. --*/ TSeparatorPage:: TSeparatorPage( IN const HWND hWnd, IN const TString &strSeparatorPage, IN const BOOL bAdministrator, IN const BOOL bLocal ) : _hWnd( hWnd ), _bAdministrator( bAdministrator ), _bValid( FALSE ), _bLocal( bLocal ) { // // Copy the separator page string. // if( !_strSeparatorPage.bUpdate( strSeparatorPage ) ){ DBGMSG( DBG_WARN, ( "_strSeparatorPage failed update with %d.\n", GetLastError() ) ); return; } _bValid = TRUE; } /*++ Routine Name: TSeparatorPage Routine Description: TSeparatorPage destructor Arguments: None. Return Value: Nothing. --*/ TSeparatorPage:: ~TSeparatorPage( ) { } /*++ Routine Name: bValid Routine Description: Valid object member function. Arguments: None. Return Value: TRUE valid object constructor successful FALSE error during construction. --*/ BOOL TSeparatorPage:: bValid( VOID ) const { return _bValid; } /*++ Routine Name: bDoModal Routine Description: Create and starts modal execution of this dialog. Arguments: None. Return Value: TRUE Separator page changed. FALSE no separator page change, or error occurred. --*/ BOOL TSeparatorPage:: bDoModal( VOID ) { // // Create a modal dialog. // return (BOOL)DialogBoxParam( ghInst, MAKEINTRESOURCE( TSeparatorPage::kResourceId ), _hWnd, MGenericDialog::SetupDlgProc, (LPARAM)this ); } /*++ Routine Name: bSetUI Routine Description: Set the data on the user interface. Arguments: None. Return Value: TRUE UI data is set. FALSE error setting UI data. --*/ BOOL TSeparatorPage:: bSetUI( VOID ) { BOOL bStatus = bSetEditText( _hDlg, IDC_SEPARATOR_PAGE_EDIT, _strSeparatorPage ); vEnableCtl( _hDlg, IDC_SEPARATOR_PAGE_EDIT, _bAdministrator ); vEnableCtl( _hDlg, IDC_SEPARATOR_PAGE_BROWSE, _bAdministrator ); vEnableCtl( _hDlg, IDOK, _bAdministrator ); vEnableCtl( _hDlg, IDC_SEPARATOR_PAGE_DESC, _bAdministrator ); vEnableCtl( _hDlg, IDC_SEPARATOR_PAGE_TEXT, _bAdministrator ); // // Browse button disable for remote machines. Common dialogs // cannot look at files on a remote machine. // if( !_bLocal ) vEnableCtl( _hDlg, IDC_SEPARATOR_PAGE_BROWSE, FALSE ); return bStatus; } /*++ Routine Name: bReadUI Routine Description: Read the data from the user interface. Arguments: None. Return Value: TRUE UI data read ok. FALSE UI data could not be read. --*/ BOOL TSeparatorPage:: bReadUI( VOID ) { TStatusB bStatus; // // If not an administration return with out reading the UI. // if( !_bAdministrator ) return FALSE; // // Ensure the separator file is a valid file or null. // bStatus DBGCHK = bValidateSeparatorFile(); if( !bStatus ) return FALSE; // // Get the Separator page text. // bStatus DBGCHK = bGetEditText( _hDlg, IDC_SEPARATOR_PAGE_EDIT, _strSeparatorPage ); return bStatus; } /*++ 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 TSeparatorPage:: bHandleMessage( IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) { UNREFERENCED_PARAMETER( lParam ); BOOL bStatus = FALSE; switch( uMsg ){ case WM_INITDIALOG: bStatus = bSetUI(); break; case WM_HELP: case WM_CONTEXTMENU: bStatus = PrintUIHelp( uMsg, _hDlg, wParam, lParam ); break; case WM_COMMAND: switch( GET_WM_COMMAND_ID( wParam, lParam )){ case IDOK: if( !bReadUI() ){ iMessage( _hDlg, kSeparatorPageTitle, kErrorSeparatorDoesNotExist, MB_OK|MB_ICONSTOP, kMsgNone, NULL ); } else { EndDialog( _hDlg, TRUE ); } bStatus = TRUE; break; case IDCANCEL: EndDialog( _hDlg, FALSE ); bStatus = TRUE; break; case IDC_SEPARATOR_PAGE_BROWSE: bSelectSeparatorFile(); bStatus = TRUE; break; default: bStatus = FALSE; break; } default: bStatus = FALSE; break; } return bStatus; } /*++ Routine Name: bSelectSeparatorFile Routine Description: Display file selection dialog to chose a separator file. Arguments: Nothing. Return Value: TRUE separator file was chosen ok. FALSE error or canceled separator selection. --*/ BOOL TSeparatorPage:: bSelectSeparatorFile( VOID ) { TCHAR szFile[MAX_PATH]; TCHAR szInitialDirectory[MAX_PATH]; TCHAR szFileFilter[kStrMax]; TString strFormat; TStatusB bStatus; UINT uPos = 0; // // Define filter string initializer structure. // struct FilterInitializer { UINT Id; }; // // Declare filter string initializer structure. // FilterInitializer aFilterInit [] = { IDS_SEPARATOR_PAGE_DESC, IDS_SEPARATOR_PAGE_EXT, IDS_SEPARATOR_PAGE_ALL, IDS_SEPARATOR_PAGE_ALL_EXT }; // // Initialize all the filters // for( UINT i = 0; i < COUNTOF( aFilterInit ); i++ ) { bStatus DBGCHK = strFormat.bLoadString( ghInst, aFilterInit[i].Id ); if( bStatus ) { if( uPos < ARRAYSIZE(szFileFilter) ) { StringCchCopy( szFileFilter + uPos, ARRAYSIZE(szFileFilter) - uPos, strFormat ); uPos += (strFormat.uLen() + 1); } else { // // This should never happen. // ASSERT(FALSE); SetLastError(ERROR_INSUFFICIENT_BUFFER); bStatus DBGCHK = FALSE; return FALSE; } } } // // Null terminate the strings. // if( uPos < ARRAYSIZE(szFileFilter) ) { szFileFilter[uPos++] = 0; szFile[0] = 0; } else { // // This should never happen. // ASSERT(FALSE); SetLastError(ERROR_INSUFFICIENT_BUFFER); bStatus DBGCHK = FALSE; return FALSE; } // // Get the initial directory. // if( !GetSystemDirectory( szInitialDirectory, COUNTOF( szInitialDirectory ) ) ) { szInitialDirectory[0] = 0; } // // Get the open file dialog title string. // TString strTitle; bStatus DBGCHK = strTitle.bLoadString( ghInst, kSeparatorPageTitle ); if( !bStatus ) { vShowResourceError( _hDlg ); return FALSE; } // // Create the open file structure. // OPENFILENAME OpenFileName; OpenFileName.lStructSize = sizeof(OPENFILENAME); OpenFileName.hwndOwner = _hDlg; OpenFileName.hInstance = ghInst; OpenFileName.lpstrFilter = szFileFilter; OpenFileName.lpstrCustomFilter = NULL; OpenFileName.nMaxCustFilter = 0; OpenFileName.nFilterIndex = 1; OpenFileName.lpstrFile = szFile; OpenFileName.nMaxFile = COUNTOF( szFile ); OpenFileName.lpstrFileTitle = NULL; OpenFileName.nMaxFileTitle = 0; OpenFileName.lpstrInitialDir = szInitialDirectory; OpenFileName.lpstrTitle = strTitle; OpenFileName.nFileOffset = 0; OpenFileName.nFileExtension = 0; OpenFileName.lpstrDefExt = NULL; OpenFileName.lCustData = 0; OpenFileName.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; // // If success copy back the selected string. // bStatus DBGNOCHK = GetOpenFileName(&OpenFileName); if( bStatus ) { bStatus DBGCHK = bSetEditText( _hDlg, IDC_SEPARATOR_PAGE_EDIT, szFile ); } return bStatus; } /*++ Routine Name: bValidateSeparatorFile Routine Description: Validate the name specified in the separator file edit box. An empty sting is considered a valid separator file, it is defined as no separator file. Arguments: Nothing. Return Value: TRUE separator file in edit box is valid. FALSE separator file is invalid. --*/ BOOL TSeparatorPage:: bValidateSeparatorFile( VOID ) { TStatusB bStatus; TString strTempSeparatorFile; DBGMSG( DBG_TRACE, ( "bValidSeparatorFile\n" ) ); // // Get separator file from edit box. // bStatus DBGCHK = bGetEditText( _hDlg, IDC_SEPARATOR_PAGE_EDIT, strTempSeparatorFile ); // // A null string is a valid separator file. // if( !lstrlen( strTempSeparatorFile ) || ((LPCTSTR)strTempSeparatorFile == NULL) ) return TRUE; // // If we are administrating the separator page remotely then do // not validate the sparator file name against the local file system. // if( bStatus && !_bLocal ){ return TRUE; } // // Check status of reading edit box. // if( bStatus ){ // // Get the file attributes. // DWORD dwFileAttributes = GetFileAttributes( strTempSeparatorFile ); // // If file has some attributes. // if( dwFileAttributes != -1 ){ // // If file has anyone of these attributes then ok and not a directory // if( dwFileAttributes & ( FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_ARCHIVE ) ) { if( !( dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) ){ return TRUE; } } } } return FALSE; }