/**********************************************************************/ /** Microsoft Windows NT **/ /** Copyright(c) Microsoft Corp., 1993 **/ /**********************************************************************/ /* ftpmgr.cxx The file contains the classes for the FTP user sessions dialog and the security dialog. FILE HISTORY: YiHsinS 17-Mar-1992 Created */ #define INCL_NET #define INCL_NETLIB #define INCL_WINDOWS #define INCL_WINDOWS_GDI #define INCL_NETERRORS #define INCL_DOSERRORS #include #if defined(DEBUG) static const CHAR szFileName[] = __FILE__; #define _FILENAME_DEFINED_ONCE szFileName #endif #define INCL_BLT_WINDOW #define INCL_BLT_DIALOG #define INCL_BLT_CONTROL #define INCL_BLT_CLIENT #define INCL_BLT_MSGPOPUP #define INCL_BLT_EVENT #define INCL_BLT_MISC #define INCL_BLT_CC #include #include #include #include extern "C" { #include // IN_ADDR, inet_ntoa #include // For NetApiBufferFree #include // For I_Ftp... APIs #include #include } #include #include /******************************************************************* NAME: FTP_USER_LBI::FTP_USER_LBI SYNOPSIS: Constructor. Each LBI represents a user connected to the FTP service on the given computer. ENTRY: pszUserName - The name of the user ulUserID - The internal ID used by the FTP service to represent this user fAnonymous - TRUE if the user logged on as anonymous FALSE otherwise. pszInternetAddress - The address of the host the user is connected from. pszConnectTimeString - The duration of time the user has been connected EXIT: RETURNS: NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ FTP_USER_LBI::FTP_USER_LBI( const TCHAR *pszUserName, ULONG ulUserID, BOOL fAnonymous, const TCHAR *pszInternetAddress, const TCHAR *pszConnectTimeString ) : _nlsUserName ( pszUserName ), _ulUserID ( ulUserID ), _fAnonymous ( fAnonymous ), _nlsInternetAddress ( pszInternetAddress ), _nlsConnectTimeString( pszConnectTimeString ) { if ( QueryError() ) return; APIERR err = NERR_Success; // // If the user name is username@mailhost-style string, // print only the username portion ( everything left of @ ) // ISTR istr( _nlsUserName ); if ( _nlsUserName.strchr( &istr, TCH('@'))) _nlsUserName.DelSubStr( istr ); if ( ( err = _nlsUserName.QueryError() ) || ( err = _nlsInternetAddress.QueryError() ) || ( err = _nlsConnectTimeString.QueryError() ) ) { ReportError( err? err : ERROR_NOT_ENOUGH_MEMORY ); return; } } /******************************************************************* NAME: FTP_USER_LBI::FTP_USER_LBI SYNOPSIS: Destructor ENTRY: EXIT: RETURNS: NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ FTP_USER_LBI::~FTP_USER_LBI() { // Nothing to do for now } /******************************************************************* NAME: FTP_USER_LBI::Paint SYNOPSIS: Redefine Paint() method of the LBI class. ENTRY: plb - the listbox this LBI belongs to hdc prect pGUILTT EXIT: RETURNS: NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ VOID FTP_USER_LBI::Paint( LISTBOX *plb, HDC hdc, const RECT *prect, GUILTT_INFO *pGUILTT ) const { FTP_USER_LISTBOX *plbUser = ( FTP_USER_LISTBOX *) plb; STR_DTE strdteUserName( _nlsUserName ); STR_DTE strdteInternetAddress( _nlsInternetAddress ); STR_DTE strdteConnectTime( _nlsConnectTimeString ); DISPLAY_TABLE cdt( 4, plbUser->QueryColumnWidths() ); cdt[0] = (DMID_DTE *) (IsAnonymousUser()? plbUser->QueryAnonymousBitmap() : plbUser->QueryUserBitmap()); cdt[1] = &strdteUserName; cdt[2] = &strdteInternetAddress; cdt[3] = &strdteConnectTime; cdt.Paint( plb, hdc, prect, pGUILTT ); } /******************************************************************* NAME: FTP_USER_LBI::Compare SYNOPSIS: Redefine Compare() method of the LBI class. We compare the user names of the two LBIs. ENTRY: plbi - Pointer to the LBI to compare with EXIT: RETURNS: NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ INT FTP_USER_LBI::Compare( const LBI *plbi ) const { return _nlsUserName._stricmp( *( ((FTP_USER_LBI *) plbi)->QueryUserName())); } /******************************************************************* NAME: FTP_USER_LBI::QueryLeadingChar SYNOPSIS: Returns the leading character of the user name ENTRY: EXIT: RETURNS: NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ WCHAR FTP_USER_LBI::QueryLeadingChar( VOID ) const { ISTR istr( _nlsUserName ); return _nlsUserName.QueryChar( istr ); } /******************************************************************* NAME: FTP_USER_LISTBOX::FTP_USER_LISTBOX SYNOPSIS: Constructor ENTRY: powOwner - pointer to the owner window cid - resource id of the listbox pszServer - the server name to point to EXIT: RETURNS: NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ FTP_USER_LISTBOX::FTP_USER_LISTBOX( OWNER_WINDOW *powOwner, CID cid, const TCHAR *pszServer ) : BLT_LISTBOX( powOwner, cid ), _nlsServer ( pszServer ), _nlsUnknown( IDS_UI_UNKNOWN ), _pdmdteUser( NULL ), _pdmdteAnonymous( NULL ), _intlProf() { if ( QueryError() ) return; APIERR err; if ( ( err = _nlsServer.QueryError()) || ( err = _nlsUnknown.QueryError()) || ( err = _intlProf.QueryError()) || (( _pdmdteUser = new DMID_DTE( BMID_USER )) == NULL ) || (( _pdmdteAnonymous = new DMID_DTE( BMID_ANONYMOUS)) == NULL ) || ( err = _pdmdteUser->QueryError()) || ( err = _pdmdteAnonymous->QueryError()) || ( err = DISPLAY_TABLE::CalcColumnWidths( _adx, 4, powOwner, cid,TRUE)) ) { ReportError( err? err : ERROR_NOT_ENOUGH_MEMORY ); return; } } /******************************************************************* NAME: FTP_USER_LISTBOX::~FTP_USER_LISTBOX SYNOPSIS: Destructor ENTRY: EXIT: RETURNS: NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ FTP_USER_LISTBOX::~FTP_USER_LISTBOX() { delete _pdmdteUser; delete _pdmdteAnonymous; _pdmdteUser = NULL; _pdmdteAnonymous = NULL; } /******************************************************************* NAME: FTP_USER_LISTBOX::Fill SYNOPSIS: This method enumerates the users connected to the FTP service and add them to the listbox. ENTRY: EXIT: RETURNS: APIERR NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ APIERR FTP_USER_LISTBOX::Fill( VOID ) { // // Enumerate the users connected to the FTP service on the // given server. // DWORD nCount = 0; LPFTP_USER_INFO aUserInfo = NULL; APIERR err = ::I_FtpEnumerateUsers( (LPWSTR) _nlsServer.QueryPch(), &nCount, &aUserInfo ); if ( err == NERR_Success ) { NLS_STR nlsTimeString; NLS_STR nlsInternetAddress; if ( (( err = nlsTimeString.QueryError()) == NERR_Success ) && (( err = nlsInternetAddress.QueryError()) == NERR_Success ) ) { // // Loop through all the users, create LBIs for each of them, // and add them to the listbox. // LPFTP_USER_INFO pUserInfo = aUserInfo; for ( INT i = 0; i < (INT) nCount; i++ ) { err = QueryTimeString( pUserInfo->tConnect, &nlsTimeString ); if ( err != NERR_Success ) break; IN_ADDR inaddr; inaddr.s_addr = pUserInfo->inetHost; CHAR *pszInternetAddress = ::inet_ntoa( inaddr ); if ( err = nlsInternetAddress.MapCopyFrom( pszInternetAddress) ) break; const TCHAR * pszDisplayName = pUserInfo->pszUser; if( ( pszDisplayName == NULL ) || ( *pszDisplayName == '\0' ) ) { pszDisplayName = _nlsUnknown; } FTP_USER_LBI *plbi = new FTP_USER_LBI( pszDisplayName, pUserInfo->idUser, pUserInfo->fAnonymous, nlsInternetAddress, nlsTimeString ); if ( ( plbi == NULL ) || ( err = plbi->QueryError() ) || ( AddItem( plbi ) < 0 ) ) { delete plbi; plbi = NULL; err = err? err : ERROR_NOT_ENOUGH_MEMORY; break; } ++pUserInfo; } } } ::NetApiBufferFree( (LPVOID) aUserInfo ); return err; } /******************************************************************* NAME: FTP_USER_LISTBOX::Refresh SYNOPSIS: This method refresh the contents of the listbox. ENTRY: EXIT: RETURNS: APIERR NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ APIERR FTP_USER_LISTBOX::Refresh( VOID ) { SetRedraw( FALSE ); // // Delete all the original items in the listbox // DeleteAllItems(); // // Call Fill() to enumerate the users // APIERR err = Fill(); Invalidate(); SetRedraw( TRUE ); return err; } /******************************************************************* NAME: FTP_USER_LISTBOX::QueryTimeString SYNOPSIS: This method turns the time duration to a displayable string that complies with the window settings. ENTRY: ulTime - The elapsed time EXIT: pnlsTime - Pointer to the time display string returned. RETURNS: APIERR NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ #define SECONDS_PER_DAY 86400 #define SECONDS_PER_HOUR 3600 #define SECONDS_PER_MINUTE 60 APIERR FTP_USER_LISTBOX::QueryTimeString( ULONG ulTime, NLS_STR *pnlsTime ) { 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: FTP_SVCMGR_DIALOG::FTP_SVCMGR_DIALOG SYNOPSIS: Constructor. This is the user sessions dialog of FTP service manager. ENTRY: hwndOwner - Hwnd of the owner window pszServer - The name of the server to point to EXIT: RETURNS: NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ FTP_SVCMGR_DIALOG::FTP_SVCMGR_DIALOG( HWND hwndOwner, const TCHAR *pszServer ) : DIALOG_WINDOW( MAKEINTRESOURCE( IDD_FTPSVCMGRDLG), hwndOwner ), _nlsServer( pszServer ), _lbUser ( this, LB_USERS, pszServer ), _pbuttonDisconnect ( this, BUTTON_DISCONNECT ), _pbuttonDisconnectAll( this, BUTTON_DISCONNECT_ALL ) { if ( QueryError() != NERR_Success ) return; // // Call Refresh() to fill the users in the listbox // APIERR err = NERR_Success; if ( ((err = _nlsServer.QueryError()) != NERR_Success ) || ((err = Refresh()) != NERR_Success ) ) { ReportError( err ); return; } // // Set the caption to include the server name if the given // server name is not an empty string. // if ( _nlsServer.QueryTextLength() > 0 ) { RESOURCE_STR nlsCaption( IDS_FTP_USER_SESSIONS_ON_COMPUTER ); ISTR istr ( _nlsServer ); istr += 2; // Skip the two backslashes ALIAS_STR nlsSrvWithoutPrefix( _nlsServer.QueryPch( istr ) ); if ( ((err = nlsCaption.QueryError()) != NERR_Success ) || ((err = nlsCaption.InsertParams( 1, &nlsSrvWithoutPrefix)) != NERR_Success) ) { ReportError( err ); return; } SetText( nlsCaption ); } } /******************************************************************* NAME: FTP_SVCMGR_DIALOG::~FTP_SVCMGR_DIALOG SYNOPSIS: Destructor ENTRY: EXIT: RETURNS: NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ FTP_SVCMGR_DIALOG::~FTP_SVCMGR_DIALOG() { // Nothing to do for now } /******************************************************************* NAME: FTP_SVCMGR_DIALOG::Refresh SYNOPSIS: Refresh the contents of the user listbox ENTRY: EXIT: RETURNS: APIERR NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ APIERR FTP_SVCMGR_DIALOG::Refresh( VOID ) { AUTO_CURSOR autocur; APIERR err = _lbUser.Refresh(); if ( err == NERR_Success ) { // // Enable/Disable the Disconnect/DisconnectAll button // depending on whether there are users in the listbox // after the refresh. // _pbuttonDisconnect.Enable( ( _lbUser.QueryCount() > 0 ) && (_lbUser.QuerySelCount() > 0 )); _pbuttonDisconnectAll.Enable( _lbUser.QueryCount() > 0 ); } _lbUser.ClaimFocus(); return err; } /******************************************************************* NAME: FTP_SVCMGR_DIALOG::OnCommand SYNOPSIS: Process all commands for Security, Refresh, Disconnect, Disconnect All buttons. ENTRY: event - The event that occurred EXIT: RETURNS: NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ BOOL FTP_SVCMGR_DIALOG::OnCommand( const CONTROL_EVENT &event ) { APIERR err = NERR_Success; switch ( event.QueryCid() ) { case BUTTON_DISCONNECT: { INT *paSelItems = NULL; BOOL fAtLeastDeleteOneUser = FALSE; do { // not a loop INT nCount = _lbUser.QuerySelCount(); if ( nCount == 0 ) { // If no user is selected, just ignore the command. break; } else if ( nCount > 1 ) { // If more than one user is selected in the listbox, // give a warning to the user to see if he/she // really wanted to disconnect the selected users. if ( ::MsgPopup( this, IDS_CONFIRM_DISCONNECT_SELECTED_USERS, MPSEV_WARNING, MP_YESNO, MP_NO ) != IDYES ) { break; } } // // Get all the items selected in the listbox // paSelItems = (INT *) new BYTE[ sizeof(INT) * nCount ]; if ( paSelItems == NULL ) { err = ERROR_NOT_ENOUGH_MEMORY; break; } if ( err = _lbUser.QuerySelItems( paSelItems, nCount )) break; // // Pop up an warning containing the user name to be // disconnected if only one user is selected. Otherwise, // we would have already pop up the warning. // FTP_USER_LBI *pusrlbi = _lbUser.QueryItem( paSelItems[0] ); if ( nCount == 1 ) { if ( IDYES != ::MsgPopup( this, IDS_CONFIRM_DISCONNECT_ONE_USER, MPSEV_WARNING, MP_YESNO, *(pusrlbi->QueryUserName()), MP_NO )) { break; } } // // Disconnect the selected users one by one. If an error // occurred while disconnecting a user, we would break out // of the loop and the rest of the users will not be // disconnected. // AUTO_CURSOR autocur; for ( INT i = 0; i < nCount; i++ ) { pusrlbi = _lbUser.QueryItem( paSelItems[i] ); err = ::I_FtpDisconnectUser( (LPWSTR) _nlsServer.QueryPch(), pusrlbi->QueryUserID()); if( err == NERR_UserNotFound ) { // // The user is no longer connected. Since this // is what the admin wants anyway, we'll pretend // it succeeded. // err = NERR_Success; } if ( err != NERR_Success ) break; fAtLeastDeleteOneUser = TRUE; } } while ( FALSE ); if ( err ) ::MsgPopup( this, err ); // // If at least one user has be disconnected, refresh the listbox. // if ( fAtLeastDeleteOneUser ) { if ( err = Refresh() ) ::MsgPopup( this, err ); } delete paSelItems; break; } case BUTTON_DISCONNECT_ALL: { // // Give a warning to the user to see if he really wants to // disconnect all users. // if ( IDYES == ::MsgPopup( this, IDS_CONFIRM_DISCONNECT_ALL_USERS, MPSEV_WARNING, MP_YESNO, MP_NO )) { // // Disconnect all Users and refresh the listbox // AUTO_CURSOR autocur; if ( (err = ::I_FtpDisconnectUser( (LPWSTR) _nlsServer.QueryPch(), 0)) == NERR_Success ) { err = Refresh(); } if ( err != NERR_Success ) ::MsgPopup( this, err ); } break; } case BUTTON_SECURITY: { // // Show the security dialog. // AUTO_CURSOR autocur; FTP_SECURITY_DIALOG *pdlg = new FTP_SECURITY_DIALOG( QueryHwnd(), _nlsServer ); BOOL fOK = FALSE; if ( ( pdlg == NULL ) || ( err = pdlg->QueryError() ) || ( err = pdlg->Process( &fOK ) ) ) { err = err? err: ERROR_NOT_ENOUGH_MEMORY; } else if ( fOK ) { // If the user clicks OK in the security dialog, // we need to refresh the listbox since the service // might blew some users away depending on the new // read/write access. err = Refresh(); } if ( err != NERR_Success ) ::MsgPopup( this, err ); delete pdlg; pdlg = NULL; break; } case BUTTON_REFRESH: { if ( (err = Refresh()) != NERR_Success ) ::MsgPopup( this, err ); break; } case LB_USERS: // // Enable the Disconnect button only if the user has a selection // in the listbox. // _pbuttonDisconnect.Enable( ( _lbUser.QueryCount() > 0 ) && (_lbUser.QuerySelCount() > 0 )); // // Falls through // default: return DIALOG_WINDOW::OnCommand( event ); } return TRUE; } /******************************************************************* NAME: FTP_SVCMGR_DIALOG::QueryHelpContext SYNOPSIS: Get the help context for this dialog ENTRY: EXIT: RETURNS: ULONG - The help context for this dialog NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ ULONG FTP_SVCMGR_DIALOG::QueryHelpContext( VOID ) { return HC_FTPSVCMGR_DIALOG; } /******************************************************************* NAME: FTP_SECURITY_DIALOG::FTP_SECURITY_DIALOG SYNOPSIS: Constructor ENTRY: hwndOwner - Hwnd of the owner window pszServer - The name of the server name to point to EXIT: RETURNS: NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ FTP_SECURITY_DIALOG::FTP_SECURITY_DIALOG( HWND hwndOwner, const TCHAR *pszServer ) : DIALOG_WINDOW( MAKEINTRESOURCE( IDD_FTPSECDLG ), hwndOwner ), _nlsServer ( pszServer ), _fLocal ( TRUE ), _cbPartition ( this, CB_PARTITION ), _sltFileSysInfo ( this, SLT_FILESYSTEMTYPE ), _checkbReadAccess ( this, CHECKB_READ ), _checkbWriteAccess( this, CHECKB_WRITE ), _ulReadAccess ( 0 ), _ulWriteAccess ( 0 ), _nCurrentDiskIndex( 0 ) { if ( QueryError() ) return; // // Get security information on all drives // APIERR err; if ( ((err = _nlsServer.QueryError()) != NERR_Success ) || ((err = ::I_FtpQueryVolumeSecurity( (LPWSTR) _nlsServer.QueryPch(), &_ulReadAccess, &_ulWriteAccess )) != NERR_Success ) || ((err = AddDrives()) != NERR_Success ) ) { ReportError( err ); return; } if ( _cbPartition.QueryCount() > 0 ) { // // Select the first partition and show its information // _cbPartition.SelectItem( 0 ); if ((err = ShowCurrentPartitionInfo()) != NERR_Success ) { ReportError( err ); return; } } else { // Popup an error if there are not partitions on the machine to // configure. ReportError( IDS_NO_PARTITION ); return; } // // Set the caption to include the server name if the given server name // is not an empty string. // if ( _nlsServer.QueryTextLength() > 0 ) { RESOURCE_STR nlsCaption( IDS_FTP_SERVER_SECURITY_ON_COMPUTER ); ISTR istr ( _nlsServer ); istr += 2; // Skip the two backslashes ALIAS_STR nlsSrvWithoutPrefix( _nlsServer.QueryPch( istr ) ); if ( ((err = nlsCaption.QueryError()) != NERR_Success ) || ((err = nlsCaption.InsertParams( 1, &nlsSrvWithoutPrefix)) != NERR_Success) ) { ReportError( err ); return; } SetText( nlsCaption ); } } /******************************************************************* NAME: FTP_SECURITY_DIALOG::~FTP_SECURITY_DIALOG SYNOPSIS: Destructor ENTRY: EXIT: RETURNS: NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ FTP_SECURITY_DIALOG::~FTP_SECURITY_DIALOG() { // Nothing to do for now } /******************************************************************* NAME: FTP_SECURITY_DIALOG::AddDrivers SYNOPSIS: Get all drivers on the selected server and add them to the partition combo ENTRY: EXIT: RETURNS: APIERR NOTES: HISTORY: YiHsinS 6-Apr-1993 Created ********************************************************************/ APIERR FTP_SECURITY_DIALOG::AddDrives( VOID ) { APIERR err = NERR_Success; _fLocal = TRUE; // // Check if the given server is the local computer // if ( _nlsServer.QueryTextLength() > 0 ) { LOCATION loc; // local machine NLS_STR nlsLocalComputer; if ( ( (err = nlsLocalComputer.QueryError()) != NERR_Success ) || ( (err = loc.QueryError()) != NERR_Success ) || ( (err = loc.QueryDisplayName(&nlsLocalComputer)) != NERR_Success) ) { return err; } ISTR istr( _nlsServer ); istr += 2; // Skip the two backslashes if ( ::I_MNetComputerNameCompare( nlsLocalComputer, _nlsServer.QueryPch( istr)) != 0 ) _fLocal = FALSE; } // // If the machine is local, use GetDriveType to get all the possible // drives. // if ( _fLocal ) { // // Add local drive letters to the combobox // TCHAR szDevice[4]; // This will contain A:, B:, ... ::strcpyf( szDevice, SZ("?:\\")); for ( INT i = TCH('Z'); i >= TCH('A'); i-- ) { szDevice[0] = (TCHAR)i; szDevice[2] = TCH('\\'); ULONG ulRes= ::GetDriveType( szDevice ); if ( ( ulRes == DRIVE_FIXED ) || ( ulRes == DRIVE_REMOVABLE ) || ( ulRes == DRIVE_CDROM ) ) { szDevice[2] = 0; // nuke the backslash at the end if ( _cbPartition.AddItem( szDevice ) < 0 ) { err = ERROR_NOT_ENOUGH_MEMORY; break; } } } } // // If the machine is not the local one, use MNetServerDiskEnum // to get all the drives. // else { BYTE *pbBuffer = NULL; UINT nEntriesRead = 0; err = ::MNetServerDiskEnum( _nlsServer, 0, &pbBuffer, &nEntriesRead ); if ( err == NERR_Success ) { UIASSERT( pbBuffer != NULL ); for ( UINT i = 0; i < nEntriesRead; i++ ) { ALIAS_STR nls( (TCHAR *) pbBuffer ); if ( _cbPartition.AddItem( nls ) < 0 ) { err = ERROR_NOT_ENOUGH_MEMORY; break; } pbBuffer += nls.QueryTextSize(); } } ::MNetApiBufferFree( &pbBuffer ); } return err; } /******************************************************************* NAME: FTP_SECURITY_DIALOG::ShowCurrentPartitionInfo SYNOPSIS: Show the information ( i.e. file system information, read access, write access ) of the current selected partition ENTRY: EXIT: RETURNS: APIERR NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ APIERR FTP_SECURITY_DIALOG::ShowCurrentPartitionInfo( VOID ) { APIERR err = NERR_Success; // // Get the selected drive // NLS_STR nlsSelectedDrive; NLS_STR nlsFileSysInfo; if ( ((err = nlsSelectedDrive.QueryError())==NERR_Success) && ((err = _cbPartition.QueryItemText(&nlsSelectedDrive))==NERR_Success) && ((err = nlsSelectedDrive.AppendChar( TCH('\\')))==NERR_Success) ) { // // Update _nCurrentDiskIndex // ISTR istr( nlsSelectedDrive ); _nCurrentDiskIndex = nlsSelectedDrive.QueryChar( istr ) - TCH('A'); // // Show the security information // _checkbWriteAccess.Enable( TRUE ); _checkbReadAccess.SetCheck( (INT) _ulReadAccess & ( 0x1 <<_nCurrentDiskIndex )); _checkbWriteAccess.SetCheck( (INT) _ulWriteAccess & ( 0x1 <<_nCurrentDiskIndex)); if ( _fLocal ) { // // Show the file system information // ULONG ulRes = ::GetDriveType( (LPWSTR) nlsSelectedDrive.QueryPch()); if (( ulRes == DRIVE_REMOVABLE ) || ( ulRes == DRIVE_CDROM )) { err = nlsFileSysInfo.Load( ulRes == DRIVE_REMOVABLE ? IDS_DRIVE_REMOVABLE : IDS_DRIVE_CDROM ); // // Disable Allow Write checkbox when the selection is a CDROM // if ( ulRes == DRIVE_CDROM ) _checkbWriteAccess.Enable( FALSE ); } else { err = GetFileSystemInfo( nlsSelectedDrive, &nlsFileSysInfo); // If we cannot get the file system info, // then just show them as unknown type. if ( err != NERR_Success ) err = nlsFileSysInfo.Load( IDS_UI_UNKNOWN ); } } else { err = nlsFileSysInfo.Load( IDS_UI_UNKNOWN ); } } if ( err == NERR_Success ) _sltFileSysInfo.SetText( nlsFileSysInfo ); return err; } /******************************************************************* NAME: FTP_SECURITY_DIALOG::GetFileSystemInfo SYNOPSIS: Get the file system information for the given drive ENTRY: pszDrive - The drive to get information on EXIT: pnlsFileSysInfo - Pointer to a string describing the file system info of pszDrive RETURNS: NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ #define MAX_FILE_SYSTEM_INFO_LENGTH 20 APIERR FTP_SECURITY_DIALOG::GetFileSystemInfo( const TCHAR *pszDrive, NLS_STR *pnlsFileSysInfo ) { TCHAR szFileSysInfo[ MAX_FILE_SYSTEM_INFO_LENGTH ]; APIERR err = NERR_Success; if ( ::GetVolumeInformation( (LPWSTR) pszDrive, NULL, 0, NULL, NULL, NULL, szFileSysInfo, MAX_FILE_SYSTEM_INFO_LENGTH) ) { err = pnlsFileSysInfo->CopyFrom( szFileSysInfo ); } else { err = ::GetLastError(); } return err; } /******************************************************************* NAME: FTP_SECURITY_DIALOG::SaveDriveSecurity SYNOPSIS: Save the read/write access indicated by the current read/write checkbox to the drive indexed by _nCurrentDiskIndex ( 0 represents A:, 1 represents B:,...). ENTRY: EXIT: RETURNS: NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ VOID FTP_SECURITY_DIALOG::SaveDriveSecurity( VOID ) { // // Save the read access depending on the read access checkbox // if ( _checkbReadAccess.QueryCheck() ) _ulReadAccess |= ( 0x1 << _nCurrentDiskIndex ); else _ulReadAccess &= ~( 0x1 << _nCurrentDiskIndex ); // // Save the write access depending on the write access checkbox // if ( _checkbWriteAccess.QueryCheck() ) _ulWriteAccess |= ( 0x1 << _nCurrentDiskIndex ); else _ulWriteAccess &= ~( 0x1 << _nCurrentDiskIndex ); } /******************************************************************* NAME: FTP_SECURITY_DIALOG::OnOK SYNOPSIS: Set the security (read/write access) back to the service ENTRY: EXIT: RETURNS: NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ BOOL FTP_SECURITY_DIALOG::OnOK( VOID ) { // // Store the information of the last selected partition // SaveDriveSecurity(); // // Set the Read mask and Write mask of the partitions // APIERR err = ::I_FtpSetVolumeSecurity( (LPWSTR) _nlsServer.QueryPch(), _ulReadAccess, _ulWriteAccess); if ( err != NERR_Success ) ::MsgPopup( this, err ); else Dismiss( TRUE ); return TRUE; } /******************************************************************* NAME: FTP_SECURITY_DIALOG::OnCommand SYNOPSIS: When the user change selection in the partition combo, we must save the read/write access of the previous selected drive and show the info on the currently selected drive. ENTRY: event - The event that occurred EXIT: RETURNS: NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ BOOL FTP_SECURITY_DIALOG::OnCommand( const CONTROL_EVENT &event ) { if ( ( event.QueryCid() == CB_PARTITION ) && ( event.QueryCode() == CBN_SELCHANGE ) ) { // // Save read/write access of the previously selected partition // NOTE: _nCurrentDiskIndex still points to the previously selected // partition // SaveDriveSecurity(); // // Show current selected disk info // APIERR err = ShowCurrentPartitionInfo(); if ( err != NERR_Success ) ::MsgPopup( this, err ); return TRUE; } return DIALOG_WINDOW::OnCommand( event ); } /******************************************************************* NAME: FTP_SECURITY_DIALOG::QueryHelpContext SYNOPSIS: Get the help context for this dialog ENTRY: EXIT: RETURNS: ULONG - The help context for this dialog NOTES: HISTORY: YiHsinS 25-Mar-1993 Created ********************************************************************/ ULONG FTP_SECURITY_DIALOG::QueryHelpContext( VOID ) { return HC_FTPSECURITY_DIALOG; }