|
|
/**********************************************************************/ /** Microsoft Windows NT **/ /** Copyright(c) Microsoft Corp., 1991 **/ /**********************************************************************/
/*
volprop.cxx This file contains the definitions of VOLUME_PROPERTIES_DIALOG class.
History: NarenG 11/18/92 Modified SHARE_DIALOG_BASE 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 <lmui.hxx>
#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 <blt.hxx>
extern "C" { #include <afpmgr.h>
#include <macfile.h>
}
#include <string.hxx>
#include <uitrace.hxx>
#include <dbgstr.hxx>
#include <netname.hxx>
#include "util.hxx"
#include "perms.hxx"
#include "volprop.hxx"
/*******************************************************************
NAME: VOLUME_PROPERTIES_DIALOG::VOLUME_PROPERTIES_DIALOG
SYNOPSIS: Constructor for VOLUME_PROPERTIES_DIALOG class
ENTRY: hwndParent - handle of parent window
EXIT:
RETURNS:
NOTES:
HISTORY: NarenG 11/18/92 Modified for AFPMGR
********************************************************************/
VOLUME_PROPERTIES_DIALOG::VOLUME_PROPERTIES_DIALOG( HWND hwndParent, AFP_SERVER_HANDLE hServer, const TCHAR * pszVolumeName, const TCHAR * pszServerName, BOOL fCalledBySrvMgr ) : DIALOG_WINDOW ( MAKEINTRESOURCE(IDD_VOLUME_PROPERTIES_DIALOG),hwndParent), _sltpVolumeName( this, IDVP_SLT_NAME, ELLIPSIS_RIGHT ), _sltpVolumePath( this, IDVP_SLT_PATH, ELLIPSIS_PATH ), _slePassword( this, IDVP_SLE_PASSWORD, AFP_VOLPASS_LEN ), _slePasswordConfirm( this, IDVP_SLE_CONFIRM_PASSWORD, AFP_VOLPASS_LEN ), _chkReadOnly( this, IDVP_CHK_READONLY ), _chkGuestAccess( this, IDVP_CHK_GUEST_ACCESS ), _mgrpUserLimit( this, IDVP_RB_UNLIMITED, 2, IDVP_RB_UNLIMITED), _spsleUsers( this, IDVP_SLE_USERS,1,1,AFP_VOLUME_UNLIMITED_USES-1, TRUE, IDVP_SLE_USERS_GROUP ), _spgrpUsers(this,IDVP_SB_USERS_GROUP,IDVP_SB_USERS_UP,IDVP_SB_USERS_DOWN), _pbPermissions( this, IDVP_PB_PERMISSIONS ), _pbOK( this, IDOK ), _pbCancel( this, IDCANCEL ), _nlsVolumePath(), _nlsVolumeName( pszVolumeName ), _nlsServerName( pszServerName ), _fCalledBySrvMgr( fCalledBySrvMgr ), _hServer( hServer ) {
//
// Make sure everything constructed OK
//
if ( QueryError() != NERR_Success ) return;
APIERR err; if ( ((err = _sltpVolumeName.QueryError()) != NERR_Success ) || ((err = _sltpVolumePath.QueryError()) != NERR_Success ) || ((err = _nlsVolumePath.QueryError()) != NERR_Success ) || ((err = _nlsVolumeName.QueryError()) != NERR_Success ) || ((err = _nlsServerName.QueryError()) != NERR_Success ) || ((err = _slePassword.QueryError()) != NERR_Success ) || ((err = _slePasswordConfirm.QueryError()) != NERR_Success ) || ((err = _mgrpUserLimit.QueryError()) != NERR_Success ) || ((err = _spgrpUsers.AddAssociation( &_spsleUsers )) != NERR_Success ) || ((err = _mgrpUserLimit.AddAssociation( IDVP_RB_USERS, &_spgrpUsers )) != NERR_Success ) || ((err = _chkReadOnly.QueryError()) != NERR_Success ) || ((err = _chkGuestAccess.QueryError()) != NERR_Success ) ) { ReportError( err ); return; }
//
// This may take a while
//
AUTO_CURSOR Cursor;
if ( fCalledBySrvMgr ) { //
// Set the caption to "Volume Properties on Server".
//
err = ::SetCaption(this, IDS_CAPTION_VOLUME_PROPERTIES, pszServerName);
if( err != NERR_Success ) { ReportError( err ); return; } }
//
// Get the volume information
//
PAFP_VOLUME_INFO pAfpVolumeInfo;
DWORD error = ::AfpAdminVolumeGetInfo( _hServer, (LPWSTR)pszVolumeName, (LPBYTE*)&pAfpVolumeInfo );
if ( error != NO_ERROR ) { ReportError( error ); return; } //
// Set the name
//
_sltpVolumeName.SetText( pszVolumeName );
//
// Set the path
//
if ((( err = _sltpVolumePath.SetText(pAfpVolumeInfo->afpvol_path)) != NERR_Success ) || (( err = _nlsVolumePath.CopyFrom( pAfpVolumeInfo->afpvol_path ) ) != NERR_Success )) { ReportError( err ); return; }
//
// Set the password SLE to AFP_NULL_PASSWORD if there is a password
//
if ( ( pAfpVolumeInfo->afpvol_password != NULL ) && ( (pAfpVolumeInfo->afpvol_password)[0] != TEXT('\0') )) { _slePassword.SetText( (LPWSTR)AFP_NULL_PASSWORD );
_slePasswordConfirm.SetText( (LPWSTR)AFP_NULL_PASSWORD );
_slePassword.SelectString(); }
//
// Set the security options
//
_chkReadOnly.SetCheck( (INT)( pAfpVolumeInfo->afpvol_props_mask & AFP_VOLUME_READONLY ));
//
// If this is a CDFS volume, then disable this checkbox
// The way we find out if this is CDFS partition is by calling
// AfpAdminDirectoryGetInfo. If it returns AFPERR_SecurityNotSupported
// then we know that is is CDFS and is readonly
//
PAFP_DIRECTORY_INFO pDirInfo; err = AfpAdminDirectoryGetInfo( _hServer, pAfpVolumeInfo->afpvol_path, (LPBYTE*)&pDirInfo );
if ( err == AFPERR_SecurityNotSupported || err == AFPERR_UnsupportedFS ) { _chkReadOnly.Enable( FALSE ); } else if ( err != NO_ERROR ) { ReportError( err ); return; } else { ::AfpAdminBufferFree( pDirInfo ); }
_chkGuestAccess.SetCheck( (INT)( pAfpVolumeInfo->afpvol_props_mask & AFP_VOLUME_GUESTACCESS ));
//
// Set the max uses limit
//
SetUserLimit( pAfpVolumeInfo->afpvol_max_uses ) ;
//
// Free the returned buffer
//
::AfpAdminBufferFree( pAfpVolumeInfo );
_slePassword.ClaimFocus();
_fPasswordChanged = FALSE;
}
/*******************************************************************
NAME: VOLUME_PROPERTIES_DIALOG::OnCommand
SYNOPSIS: Handle the case where the user clicked the permission button
ENTRY: event - the CONTROL_EVENT that occurred
EXIT:
RETURNS:
NOTES:
HISTORY: NarenG 11/18/92 Modified for AFPMGR
********************************************************************/
BOOL VOLUME_PROPERTIES_DIALOG::OnCommand( const CONTROL_EVENT &event ) {
DWORD err;
if ( event.QueryCid() == IDVP_PB_PERMISSIONS ) { //
// This may take a while
//
AUTO_CURSOR Cursor;
//
// Get the password if there is one.
//
DIRECTORY_PERMISSIONS_DLG *pdlg = new DIRECTORY_PERMISSIONS_DLG( QueryHwnd(), _hServer, _nlsServerName.QueryPch(), _fCalledBySrvMgr, _nlsVolumePath.QueryPch(), _nlsVolumePath.QueryPch() );
if (( pdlg == NULL ) || (( err = pdlg->QueryError()) != NERR_Success ) || (( err = pdlg->Process()) != NERR_Success )) { err = err ? err: ERROR_NOT_ENOUGH_MEMORY; }
delete pdlg;
if ( err != NERR_Success ) { ::MsgPopup( this, AFPERR_TO_STRINGID( err ) ); }
return TRUE; }
if ( ( event.QueryCid() == IDVP_SLE_PASSWORD ) || ( event.QueryCid() == IDVP_SLE_CONFIRM_PASSWORD ) ) { if ( event.QueryCode() == EN_CHANGE ) { _fPasswordChanged = TRUE; } }
return DIALOG_WINDOW::OnCommand( event );
}
/*******************************************************************
NAME: VOLUME_PROPERTIES_DIALOG::OnOK
SYNOPSIS: Validate all the information and create the volume.
ENTRY:
EXIT:
RETURNS:
NOTES:
HISTORY: NarenG 11/18/92 Modified for AFPMGR
********************************************************************/
BOOL VOLUME_PROPERTIES_DIALOG::OnOK( VOID ) { APIERR err;
//
// This may take a while
//
AUTO_CURSOR Cursor;
DWORD dwParmNum = AFP_VOL_PARMNUM_MAXUSES | AFP_VOL_PARMNUM_PROPSMASK; NLS_STR nlsPassword; NLS_STR nlsPasswordConfirm;
//
// This is not a loop.
//
do {
//
// Get the password if there is one.
//
if ( ( err = nlsPassword.QueryError() ) != NERR_Success ) break;
if ( ( err = _slePassword.QueryText( &nlsPassword )) != NERR_Success ) break;
//
// Get the password confirmation.
//
if ( ( err = nlsPasswordConfirm.QueryError() ) != NERR_Success ) break;
if ( ( err = _slePasswordConfirm.QueryText( &nlsPasswordConfirm )) != NERR_Success ) break;
} while ( FALSE );
if ( err != NERR_Success ) { ::MsgPopup( this, err );
return TRUE; }
//
// Set up the volume structure
//
AFP_VOLUME_INFO AfpVolume;
AfpVolume.afpvol_name = (LPWSTR)(_nlsVolumeName.QueryPch());
//
// Validate the password that was typed in
//
if ( nlsPassword.strcmp( nlsPasswordConfirm ) ) { ::MsgPopup( this, IDS_PASSWORD_MISMATCH );
SetFocusOnPasswordConfirm();
return TRUE; }
//
// If the user changed the password then set it to the new one.
//
AfpVolume.afpvol_password = (LPWSTR)NULL;
if ( _fPasswordChanged ) { dwParmNum |= AFP_VOL_PARMNUM_PASSWORD;
AfpVolume.afpvol_password = (LPWSTR)(nlsPassword.QueryPch()); }
//
// Set the properties
//
AfpVolume.afpvol_props_mask = _chkReadOnly.QueryCheck() ? AFP_VOLUME_READONLY : 0;
AfpVolume.afpvol_props_mask |= _chkGuestAccess.QueryCheck() ? AFP_VOLUME_GUESTACCESS : 0;
AfpVolume.afpvol_max_uses = QueryUserLimit();
//
// Try to set the information
//
DWORD error = ::AfpAdminVolumeSetInfo( _hServer, (LPBYTE)&AfpVolume, dwParmNum );
if ( error == NO_ERROR ) { Dismiss( TRUE ); } else { ::MsgPopup( this, AFPERR_TO_STRINGID( error ) ); }
return TRUE; }
/*******************************************************************
NAME: VOLUME_PROPERTIES_DIALOG::QueryUserLimit
SYNOPSIS: Get the user limit from the magic group
ENTRY:
EXIT:
RETURNS: The user limit stored in the user limit magic group
NOTES:
HISTORY: NarenG 11/18/92 Modified for AFPMGR
********************************************************************/
DWORD VOLUME_PROPERTIES_DIALOG::QueryUserLimit( VOID ) const {
switch ( _mgrpUserLimit.QuerySelection() ) {
case IDVP_RB_UNLIMITED:
return( AFP_VOLUME_UNLIMITED_USES );
case IDVP_RB_USERS:
return( _spsleUsers.QueryValue() );
default:
//
// Should never get here but in case we do, return unlimited
//
return( AFP_VOLUME_UNLIMITED_USES ); }
}
/*******************************************************************
NAME: VOLUME_PROPERTIES_DIALOG::SetUserLimit
SYNOPSIS: Sets the user limit on the magic group
ENTRY: dwUserLimit - maximum number of users allowed
EXIT:
RETURNS:
NOTES:
HISTORY: NarenG 11/18/92 Modified for AFPMGR
********************************************************************/
VOID VOLUME_PROPERTIES_DIALOG::SetUserLimit( DWORD dwUserLimit ) {
if ( dwUserLimit == AFP_VOLUME_UNLIMITED_USES ) { //
// Set selection to the Unlimited button
//
_mgrpUserLimit.SetSelection( IDVP_RB_UNLIMITED );
} else { //
// Set the Users button to the value
//
_mgrpUserLimit.SetSelection( IDVP_RB_USERS );
_spsleUsers.SetValue( dwUserLimit );
_spsleUsers.Update();
}
}
/*******************************************************************
NAME: VOLUME_PROPERTIES_DIALOG::QueryHelpContext
SYNOPSIS: Query the help context of the dialog
ENTRY:
EXIT:
RETURNS: Return the help context of the dialog
NOTES:
HISTORY: NarenG 11/18/92 Modified for AFPMGR
********************************************************************/
ULONG VOLUME_PROPERTIES_DIALOG::QueryHelpContext( VOID ) { return HC_VOLUME_PROPERTIES_DIALOG; }
|