/**********************************************************************/ /** Microsoft Windows NT **/ /** Copyright(c) Microsoft Corp., 1991 **/ /**********************************************************************/ /* curusers.cxx Contain the dialog for enumerating current users to a volume FILE HISTORY: NarenG 11/13/92 Modified for AFPMGR */ #define INCL_WINDOWS_GDI #define INCL_WINDOWS #define INCL_DOSERRORS #define INCL_NETERRORS #define INCL_NETSHARE #define INCL_NETSERVER #define INCL_NETCONS #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 #include extern "C" { #include #include } #include #include #include #include #include #include #include "curusers.hxx" /******************************************************************* NAME: CURRENT_USERS_WARNING_DIALOG::CURRENT_USERS_WARNING_DIALOG SYNOPSIS: Constructor ENTRY: hwndParent - hwnd of Parent Window pAfpConnections - pointer to a list of current users. nConnections - number of current users pszServerName - Server Name pszvolumeName - volume Name ulHelpContextBase - the base help context EXIT: RETURNS: NOTES: HISTORY: NarenG 11/13/92 Modified for AFPMGR ********************************************************************/ CURRENT_USERS_WARNING_DIALOG::CURRENT_USERS_WARNING_DIALOG( HWND hwndParent, AFP_SERVER_HANDLE hServer, PAFP_CONNECTION_INFO pAfpConnections, DWORD nConnections, const TCHAR *pszVolumeName ) : DIALOG_WINDOW( IDD_CURRENT_USERS_WARNING_DLG, hwndParent ), _sltVolumeText( this, IDCU_SLT_VOL_TEXT ), _lbUsers( this, IDCU_LB_CURRENT_USERS ), _hServer( hServer ) { // // Make sure everything constructed OK // if ( QueryError() != NERR_Success ) return; APIERR err; ALIAS_STR nlsVolume( pszVolumeName ); RESOURCE_STR nlsVolumeText( IDS_VOLUME_CURRENT_USERS_TEXT ); if (( err = nlsVolumeText.InsertParams( nlsVolume )) != NERR_Success ) { ReportError( err ); return; } _sltVolumeText.SetText( nlsVolumeText ); err = BASE_ELLIPSIS::Init(); if( err != NO_ERROR ) { ReportError( err ); return; } if ( ( err = _lbUsers.Fill( pAfpConnections, nConnections) ) != NERR_Success ) { ReportError( err ); return; } } /******************************************************************* NAME: CURRENT_USERS_WARNING_DIALOG :: ~CURRENT_USERS_WARNING_DIALOG SYNOPSIS: CURRENT_USERS_WARNING_DIALOG class destructor. EXIT: The object is destroyed. HISTORY: NarenG 02-Oct-1993 Stole from Server Manager and folded BASE_RES_DIALOG and FILES_DIALOG into one. ********************************************************************/ CURRENT_USERS_WARNING_DIALOG :: ~CURRENT_USERS_WARNING_DIALOG() { BASE_ELLIPSIS::Term(); } // CURRENT_USERS_WARNING_DIALOG :: ~CURRENT_USERS_WARNING_DIALOG /******************************************************************* NAME: CURRENT_USERS_WARNING_DIALOG::QueryHelpContext SYNOPSIS: Get the help context of the dialog ENTRY: EXIT: RETURNS: Returns the help context NOTES: HISTORY: NarenG 11/13/92 Modified for AFPMGR ********************************************************************/ ULONG CURRENT_USERS_WARNING_DIALOG::QueryHelpContext( VOID ) { return HC_CURRENT_USERS_WARNING_DIALOG; } /******************************************************************* NAME: CURRENT_USERS_WARNING_DIALOG :: OnCommand SYNOPSIS: This method is called whenever a WM_COMMAND message is sent to the dialog procedure. ENTRY: cid - The control ID from the generating control. EXIT: The command has been handled. RETURNS: BOOL - TRUE if we handled the command. FALSE if we did not handle the command. HISTORY: NarenG 12/15/92 Created ********************************************************************/ BOOL CURRENT_USERS_WARNING_DIALOG :: OnCommand( const CONTROL_EVENT & event ) { DWORD err; if( event.QueryCid() == IDYES ) { AUTO_CURSOR; INT nCount = _lbUsers.QueryCount(); for ( INT Index = 0; Index < nCount; Index++ ) { CURRENT_USERS_LBI * pculbi = _lbUsers.QueryItem( Index ); // // Blow away this connection // err = :: AfpAdminConnectionClose( _hServer, pculbi->QueryId() ); if ( ( err != NO_ERROR ) && ( err != AFPERR_InvalidId ) ) { break; } } if ( ( err != NO_ERROR ) && ( err != AFPERR_InvalidId ) ) { ::MsgPopup( this, AFPERR_TO_STRINGID( err ) ); Dismiss( FALSE ); return FALSE; } Dismiss( TRUE ); return TRUE; } if( event.QueryCid() == IDNO ) { Dismiss( FALSE ); return FALSE; } return DIALOG_WINDOW::OnCommand( event ); } /******************************************************************* NAME: CURRENT_USERS_LISTBOX::CURRENT_USERS_LISTBOX SYNOPSIS: Constructor - list box used in CURRENT_USERS_WARNING_DIALOG ENTRY: powin - owner window cid - resource id of the listbox EXIT: RETURNS: NOTES: This is a read-only listbox. HISTORY: NarenG 11/13/92 Modified for AFPMGR ********************************************************************/ CURRENT_USERS_LISTBOX::CURRENT_USERS_LISTBOX( OWNER_WINDOW *powin, CID cid ) : BLT_LISTBOX( powin, cid, TRUE ) { // // Make sure everything constructed OK // if ( QueryError() != NERR_Success ) return; APIERR err = DISPLAY_TABLE::CalcColumnWidths( _adx, COLS_CU_LB_USERS, powin, cid, FALSE); if ( err != NERR_Success ) { ReportError( err ); return; } } /******************************************************************* NAME: CURRENT_USERS_LISTBOX::Fill SYNOPSIS: Fills the listbox with the current users. ENTRY: pAfpConnections - Pointer to connections info nConnections - Number of connections. EXIT: RETURNS: NOTES: This is a read-only listbox. HISTORY: NarenG 11/13/92 Modified for AFPMGR ********************************************************************/ APIERR CURRENT_USERS_LISTBOX::Fill( PAFP_CONNECTION_INFO pAfpConnections, DWORD nConnections ) { APIERR err = NERR_Success; // // Gather all connections to the volume that the user wants to delete. // SetRedraw( FALSE ); while ( ( err == NERR_Success ) && ( nConnections-- ) ) { CURRENT_USERS_LBI *pCurUserslbi = new CURRENT_USERS_LBI( pAfpConnections->afpconn_username, pAfpConnections->afpconn_num_opens, pAfpConnections->afpconn_time, pAfpConnections->afpconn_id ); if ( AddItem( pCurUserslbi ) < 0 ) { err = ERROR_NOT_ENOUGH_MEMORY; } pAfpConnections++; } Invalidate( TRUE ); SetRedraw( TRUE ); return err; } /******************************************************************* NAME: CURRENT_USERS_LBI::CURRENT_USERS_LBI SYNOPSIS: List box items used in CURRENT_USERS_WARNING_DIALOG ENTRY: pszUserName - Pointer to the current username dwNumOpens - Number of files opened by this users. dwTime - Time since connected. EXIT: RETURNS: NOTES: HISTORY: NarenG 11/13/92 Modified for AFPMGR ********************************************************************/ CURRENT_USERS_LBI::CURRENT_USERS_LBI( const TCHAR * pszUserName, DWORD dwNumOpens, DWORD dwTime, DWORD dwId ) : _nlsUserName(), _dwNumOpens( dwNumOpens ), _ulTime( dwTime ), _dwId( dwId ) { // // Make sure everything constructed OK // if ( QueryError() != NERR_Success ) return; APIERR err = _nlsUserName.QueryError(); if ( err != NERR_Success ) { ReportError( err ); return; } // // Fill in Guest for username if it is null // if ( pszUserName == NULL ) { err = _nlsUserName.Load( IDS_GUEST ); } else { err = _nlsUserName.CopyFrom( pszUserName ); } } /******************************************************************* NAME: CURRENT_USERS_LBI::Paint SYNOPSIS: Redefine Paint() method of LBI class ENTRY: EXIT: RETURNS: NOTES: HISTORY: NarenG 11/13/92 Modified for AFPMGR ********************************************************************/ VOID CURRENT_USERS_LBI::Paint( LISTBOX *plb, HDC hdc, const RECT *prect, GUILTT_INFO *pGUILTT ) const { APIERR err; DEC_STR nlsNumOpens( _dwNumOpens ); NLS_STR nlsTime; if ( ((err = nlsNumOpens.QueryError()) != NERR_Success ) || ((err = nlsTime.QueryError()) != NERR_Success ) || ((err = ConvertTime( _ulTime, &nlsTime )) != NERR_Success ) ) { ::MsgPopup( plb->QueryOwnerHwnd(), err); return; } STR_DTE_ELLIPSIS strdteUserName( _nlsUserName.QueryPch(), plb, ELLIPSIS_RIGHT ); STR_DTE strdteNumOpens( nlsNumOpens.QueryPch() ); STR_DTE strdteTime( nlsTime.QueryPch() ); DISPLAY_TABLE dt( COLS_CU_LB_USERS, ((CURRENT_USERS_LISTBOX *) plb)->QueryColumnWidths() ); dt[0] = &strdteUserName; dt[1] = &strdteNumOpens; dt[2] = &strdteTime; dt.Paint( plb, hdc, prect, pGUILTT ); } /******************************************************************* NAME: CURRENT_USERS_LBI::ConvertTime SYNOPSIS: Convert the time given from ULONG (seconds) to a string to be shown. It complies with the internationalization of time using INTL_PROFILE. ENTRY: EXIT: RETURNS: NOTES: HISTORY: NarenG 11/13/92 Modified for AFPMGR ********************************************************************/ #define SECONDS_PER_DAY 86400 #define SECONDS_PER_HOUR 3600 #define SECONDS_PER_MINUTE 60 APIERR CURRENT_USERS_LBI::ConvertTime( ULONG ulTime, NLS_STR *pnlsTime) const { INTL_PROFILE intlProf; INT nDay = (INT) ulTime / SECONDS_PER_DAY; ulTime %= SECONDS_PER_DAY; INT nHour = (INT) ulTime / SECONDS_PER_HOUR; ulTime %= SECONDS_PER_HOUR; INT nMinute = (INT) ulTime / SECONDS_PER_MINUTE; INT nSecond = (INT) ulTime % SECONDS_PER_MINUTE; return intlProf.QueryDurationStr( nDay, nHour, nMinute, nSecond, pnlsTime); } /******************************************************************* NAME: CURRENT_USERS_LBI::Compare SYNOPSIS: Redefine Compare() method of LBI class ENTRY: EXIT: RETURNS: NOTES: HISTORY: NarenG 11/13/92 Modified for AFPMGR ********************************************************************/ INT CURRENT_USERS_LBI::Compare( const LBI *plbi ) const { return( _nlsUserName._stricmp( ((const CURRENT_USERS_LBI *) plbi)->_nlsUserName )); }