/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corp., 1991 **/ /**********************************************************************/ /* srvprop.cxx Class definitions for the SERVER_PROPERTIES class. This file contains the class declarations for the SERVER_PROPERTIES. The SERVER_PROPERTIES class implements the Server Manager main property sheet. FILE HISTORY: NarenG 1-Oct-1992 Stole from NETUI server manager. Removed LM specific stuff and put AFP specific stuff */ #define INCL_NET #define INCL_WINDOWS #define INCL_WINDOWS_GDI #define INCL_NETERRORS #define INCL_DOSERRORS #define INCL_NETLIB #include #define INCL_BLT_WINDOW #define INCL_BLT_DIALOG #define INCL_BLT_CONTROL #define INCL_BLT_MISC #define INCL_BLT_CLIENT #define INCL_BLT_MSGPOPUP #define INCL_BLT_SPIN_GROUP #define INCL_BLT_GROUP #include #if defined(DEBUG) static const CHAR szFileName[] = __FILE__; #define _FILENAME_DEFINED_ONCE szFileName #endif // DEBUG #include #include #include extern "C" { #include #include } // extern "C" #include #include #include #include #include #include #define PATH_SEPARATOR TCH('\\') // // This macro is used in the SERVER_PROPERTIES::OnCommand() method to // invoke the appropriate dialog when one of the graphical buttons is // pressed. If DIALOG_WINDOW's destructor were virtual, we could do // all of this in a common worker function, thus reducing code size. // // NOTE: This macro assumes that the dialog constructor takes an HWND // and a AFP_SERVER_HANDLE. This macro further assumes that there // is a variable named _hserver of type AFP_SERVER_HANDLE in some // visible scope. // #define SUBPROPERTY( DlgClass ) \ if( TRUE ) \ { \ DlgClass * pDlg = new DlgClass( QueryHwnd(), \ _hServer, \ _pszServerName ); \ \ DWORD err = ( pDlg == NULL ) ? ERROR_NOT_ENOUGH_MEMORY \ : pDlg->Process(); \ \ if( err != NERR_Success ) \ { \ MsgPopup( this, err ); \ } \ \ delete pDlg; \ \ RepaintNow(); \ Refresh(); \ \ return TRUE; \ } \ else // // SERVER_PROPERTIES methods. // /******************************************************************* NAME: SERVER_PROPERTIES :: SERVER_PROPERTIES SYNOPSIS: SERVER_PROPERTIES class constructor. ENTRY: hWndOwner - Handle to the "owning" window. pszServerName - Name of the target server. EXIT: The object is constructed. RETURNS: No return value. NOTES: All SERVER_PROPERTIES methods assume that the current user has sufficient privilege to adminster the target server. HISTORY: NarenG 1-Oct-1992 Replaced LM stuff with AFP stuff ********************************************************************/ SERVER_PROPERTIES :: SERVER_PROPERTIES( HWND hWndOwner, AFP_SERVER_HANDLE hServer, const TCHAR * pszServerName ) : DIALOG_WINDOW( IDD_SERVER_PROPERTIES, hWndOwner ), _pszServerName( pszServerName ), _sltCurrentActiveSessions( this, IDSP_DT_CURRENT_SESSIONS ), _sltCurrentOpenFiles( this, IDSP_DT_CURRENT_OPENFILES ), _sltCurrentFileLocks( this, IDSP_DT_CURRENT_FILELOCKS ), _hServer( hServer ), /* MSKK NaotoN Appended for Localizing into Japanese 8/24/93 */ #ifdef JAPAN _fontHelv( (TCHAR *)"‚l‚r ƒSƒVƒbƒN", FIXED_PITCH | FF_MODERN, 8, FONT_ATT_DEFAULT ), #else _fontHelv( FONT_DEFAULT ), #endif /* end */ _gbUsers( this, IDSP_GB_USERS, MAKEINTRESOURCE( IDBM_USERS )), _gbVolumes( this, IDSP_GB_VOLUMES, MAKEINTRESOURCE(IDBM_FILES) ), _gbOpenFiles( this, IDSP_GB_OPENFILES, MAKEINTRESOURCE(IDBM_OPENRES) ), _gbServerParms( this, IDSP_GB_SERVERPARMS, MAKEINTRESOURCE(IDBM_SERVERPARMS) ) { AUTO_CURSOR Cursor; // // Let's make sure everything constructed OK. // if( QueryError() != NERR_Success ) { return; } if( !_fontHelv ) { ReportError( _fontHelv.QueryError() ); return; } // // Display the dynamic server data. // DWORD err = Refresh(); if ( err != NO_ERROR ) { ReportError( err ); return; } // // Initialize our magic button bar. // err = SetupButtonBar(); if( err != NERR_Success ) { ReportError( err ); return; } // // Set the dialog caption. // err = ::SetCaption( this, IDS_CAPTION_PROPERTIES, _pszServerName ); if( err != NERR_Success ) { ReportError( err ); return; } } // SERVER_PROPERTIES :: SERVER_PROPERTIES /******************************************************************* NAME: SERVER_PROPERTIES :: ~SERVER_PROPERTIES SYNOPSIS: SERVER_PROPERTIES class destructor. ENTRY: None. EXIT: The object is destroyed. RETURNS: No return value. NOTES: HISTORY: NarenG 1-Oct-1992 Replaced LM stuff with AFP stuff ********************************************************************/ SERVER_PROPERTIES :: ~SERVER_PROPERTIES() { // // This space intentionally left blank // } // SERVER_PROPERTIES :: ~SERVER_PROPERTIES /******************************************************************* NAME: SERVER_PROPERTIES :: OnCommand SYNOPSIS: This method is called whenever a WM_COMMAND message is sent to the dialog procedure. In this case, we're only interested in commands sent as a result of the user clicking one of the graphical buttons. ENTRY: cid - The control ID from the generating control. lParam - Varies. EXIT: The command has been handled. RETURNS: BOOL - TRUE if we handled the command. FALSE if we did not handle the command. NOTES: HISTORY: NarenG 1-Oct-1992 Replaced LM stuff with AFP stuff ********************************************************************/ BOOL SERVER_PROPERTIES :: OnCommand( const CONTROL_EVENT & event ) { AUTO_CURSOR Cursor; switch ( event.QueryCid() ) { case IDSP_GB_USERS: // // The Users dialog. // SUBPROPERTY( SESSIONS_DIALOG ); break; case IDSP_GB_VOLUMES: // // The Files dialog. // SUBPROPERTY( VOLUMES_DIALOG ); break; case IDSP_GB_OPENFILES: // // The In Use dialog. // SUBPROPERTY( OPENS_DIALOG ); break; case IDSP_GB_SERVERPARMS: // // The Server Parameters dialog // SUBPROPERTY( SERVER_PARAMETERS_DIALOG ); break; default: // // If we made it this far, then we're not interested // in the command. // return FALSE; } } // SERVER_PROPERTIES :: OnCommand /******************************************************************* NAME: SERVER_PROPERTIES :: QueryHelpContext SYNOPSIS: This function returns the appropriate help context value (HC_*) for this particular dialog. ENTRY: None. EXIT: None. RETURNS: ULONG - The help context for this dialog. NOTES: HISTORY: NarenG 1-Oct-1992 Replaced LM stuff with AFP stuff ********************************************************************/ ULONG SERVER_PROPERTIES :: QueryHelpContext( void ) { return HC_SERVER_PROPERTIES; } // SERVER_PROPERITES :: QueryHelpContext /******************************************************************* NAME: SERVER_PROPERTIES :: Refresh SYNOPSIS: This method will display any server data which may need to be refreshed during the lifetime of the properties dialog. This includes the number of active sessions, open files, etc. ENTRY: None. EXIT: The dynamic server data has been displayed. RETURNS: No return value. NOTES: HISTORY: NarenG 1-Oct-1992 Replaced LM stuff with AFP stuff ********************************************************************/ DWORD SERVER_PROPERTIES :: Refresh( VOID ) { // // This may take a while... // AUTO_CURSOR Cursor; // // This string will contain our "??" string. // const TCHAR * pszNotAvail = SZ("??"); // // Retrieve the statitistics server info. // PAFP_STATISTICS_INFO pAfpStats; DWORD err = ::AfpAdminStatisticsGet( _hServer, (LPBYTE*)&pAfpStats ); if( err == NO_ERROR ) { _sltCurrentActiveSessions.Enable( TRUE ); _sltCurrentActiveSessions.SetValue( pAfpStats->stat_CurrentSessions); _sltCurrentOpenFiles.Enable( TRUE ); _sltCurrentOpenFiles.SetValue( pAfpStats->stat_CurrentFilesOpen ); _sltCurrentFileLocks.Enable( TRUE ); _sltCurrentFileLocks.SetValue( pAfpStats->stat_CurrentFileLocks ); ::AfpAdminBufferFree( pAfpStats ); } else { _sltCurrentActiveSessions.SetText( pszNotAvail ); _sltCurrentActiveSessions.Enable( FALSE ); _sltCurrentOpenFiles.SetText( pszNotAvail ); _sltCurrentOpenFiles.Enable( FALSE ); _sltCurrentFileLocks.SetText( pszNotAvail ); _sltCurrentFileLocks.Enable( FALSE ); } return err; } // SERVER_PROPERTIES :: Refresh /******************************************************************* NAME: SERVER_PROPERTIES :: SetupButtonBar SYNOPSIS: The method initializes the magic scrolling button bar. ENTRY: None. EXIT: The button bar has been initialized. RETURNS: APIERR - Any errors encountered. NOTES: HISTORY: NarenG 1-Oct-1992 Replaced LM stuff with AFP stuff ********************************************************************/ APIERR SERVER_PROPERTIES :: SetupButtonBar( VOID ) { // // Setup the graphical buttons. // InitializeButton( &_gbUsers, IDS_BUTTON_USERS, NULL ); InitializeButton( &_gbVolumes, IDS_BUTTON_VOLUMES, NULL ); InitializeButton( &_gbOpenFiles, IDS_BUTTON_OPENFILES, NULL ); InitializeButton( &_gbServerParms,IDS_BUTTON_SERVERPARMS,NULL ); // // Success! // return NO_ERROR; } // SERVER_PROPERTIES :: SetupButtonBar /******************************************************************* NAME: SERVER_PROPERTIES :: InitializeButton SYNOPSIS: Initialize a single graphical button for use in the graphical button bar. ENTRY: pgb - Pointer to a GRAPHICAL_BUTTON. msg - The resource ID of the string to be used as button text. bmid - The bitmap ID for the button status bitmap. This is the tiny bitmap displayed in the upper left corner of the button. EXIT: The button has been initialized. RETURNS: No return value. NOTES: HISTORY: NarenG 1-Oct-1992 Replaced LM stuff with AFP stuff ********************************************************************/ VOID SERVER_PROPERTIES :: InitializeButton( GRAPHICAL_BUTTON * pgb, MSGID msg, BMID bmid ) { // // This NLS_STR is used to retrieve strings // from the resource string table. // STACK_NLS_STR( nlsButtonText, MAX_RES_STR_LEN ); nlsButtonText.Load( msg ); UIASSERT( nlsButtonText.QueryError() == NERR_Success ); pgb->SetFont( _fontHelv ); pgb->SetStatus( bmid ); pgb->SetText( nlsButtonText.QueryPch() ); } // SERVER_PROPERTIES :: InitializeButton