581 lines
12 KiB
C++
581 lines
12 KiB
C++
|
/**********************************************************************/
|
||
|
/** 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;
|
||
|
}
|