813 lines
18 KiB
C++
813 lines
18 KiB
C++
|
/**********************************************************************/
|
||
|
/** Microsoft Windows NT **/
|
||
|
/** Copyright(c) Microsoft Corp., 1991 **/
|
||
|
/**********************************************************************/
|
||
|
|
||
|
/*
|
||
|
vvolbase.cxx
|
||
|
Contains the base dialog for used by the delete volume dialog
|
||
|
the volume management dialog and the edit volume dialog.
|
||
|
|
||
|
FILE HISTORY:
|
||
|
NarenG 11/11/92 Stole and modified sharestp.cxx
|
||
|
*/
|
||
|
|
||
|
#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
|
||
|
#include <blt.hxx>
|
||
|
|
||
|
|
||
|
extern "C"
|
||
|
{
|
||
|
#include <afpmgr.h>
|
||
|
#include <macfile.h>
|
||
|
}
|
||
|
|
||
|
#include <ellipsis.hxx>
|
||
|
#include <string.hxx>
|
||
|
#include <uitrace.hxx>
|
||
|
|
||
|
#include <strnumer.hxx>
|
||
|
|
||
|
#include "curusers.hxx"
|
||
|
#include "vvolbase.hxx"
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: VIEW_VOLUMES_LBI::VIEW_VOLUMES_LBI
|
||
|
|
||
|
SYNOPSIS: Listbox items used in the VIEW_VOLUMES_LISTBOX
|
||
|
|
||
|
ENTRY: dwVolumeId - Id of this volume.
|
||
|
pszVolumeName - Name of volume.
|
||
|
pszVolumePath - Path of volume.
|
||
|
fGoodVolume - If this volume was successfully shared.
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
NarenG 11/11/92 Modified for AFPMGR
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
VIEW_VOLUMES_LBI::VIEW_VOLUMES_LBI( DWORD dwVolumeId,
|
||
|
const TCHAR * pszVolumeName,
|
||
|
const TCHAR * pszVolumePath,
|
||
|
BOOL fGoodVolume )
|
||
|
: _dwVolumeId( dwVolumeId ),
|
||
|
_nlsVolumeName( pszVolumeName ),
|
||
|
_nlsVolumePath( pszVolumePath ),
|
||
|
_fGoodVolume( fGoodVolume )
|
||
|
{
|
||
|
if ( QueryError() != NERR_Success )
|
||
|
return;
|
||
|
|
||
|
APIERR err;
|
||
|
|
||
|
if ( (( err = _nlsVolumeName.QueryError()) != NERR_Success )
|
||
|
|| (( err = _nlsVolumePath.QueryError()) != NERR_Success ))
|
||
|
{
|
||
|
ReportError( err );
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: VIEW_VOLUMES_LBI::~VIEW_VOLUMES_LBI
|
||
|
|
||
|
SYNOPSIS: Destructor
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
NarenG 11/11/92 Modified for AFPMGR
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
VIEW_VOLUMES_LBI::~VIEW_VOLUMES_LBI()
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// This space intentionally left blank
|
||
|
//
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: VIEW_VOLUMES_LBI::QueryLeadingChar
|
||
|
|
||
|
SYNOPSIS: Returns the leading character of the listbox item.
|
||
|
The enables shortcut keys in the listbox
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS: Returns the first char of the volume name
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
NarenG 11/11/92 Modified for AFPMGR
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
WCHAR VIEW_VOLUMES_LBI::QueryLeadingChar( VOID ) const
|
||
|
{
|
||
|
|
||
|
ISTR istr( _nlsVolumeName );
|
||
|
|
||
|
return _nlsVolumeName.QueryChar( istr );
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: VIEW_VOLUMES_LBI::Paint
|
||
|
|
||
|
SYNOPSIS: Redefine Paint() method of LBI class
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
NarenG 11/11/92 Modified for AFPMGR
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
VOID VIEW_VOLUMES_LBI::Paint( LISTBOX *plb,
|
||
|
HDC hdc,
|
||
|
const RECT *prect,
|
||
|
GUILTT_INFO *pGUILTT ) const
|
||
|
{
|
||
|
|
||
|
STR_DTE_ELLIPSIS strdteVolumeName( _nlsVolumeName.QueryPch(),
|
||
|
plb, ELLIPSIS_RIGHT );
|
||
|
STR_DTE_ELLIPSIS strdteVolumePath( _nlsVolumePath, plb, ELLIPSIS_PATH );
|
||
|
|
||
|
DISPLAY_TABLE dt(COLS_VV_LB_VOLUMES,
|
||
|
((VIEW_VOLUMES_LISTBOX *) plb)->QueryColumnWidths() );
|
||
|
|
||
|
dt[0] = _fGoodVolume
|
||
|
? ((VIEW_VOLUMES_LISTBOX *) plb)->QueryGoodVolumeBitmap()
|
||
|
: ((VIEW_VOLUMES_LISTBOX *) plb)->QueryBadVolumeBitmap();
|
||
|
|
||
|
dt[1] = &strdteVolumeName;
|
||
|
dt[2] = &strdteVolumePath;
|
||
|
|
||
|
dt.Paint( plb, hdc, prect, pGUILTT );
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: VIEW_VOLUMES_LBI::Compare
|
||
|
|
||
|
SYNOPSIS: Redefine Compare() method of LBI class
|
||
|
We compare the share names of two LBIs.
|
||
|
|
||
|
ENTRY: plbi - pointer to the LBI to compare with
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
NarenG 11/11/92 Modified for AFPMGR
|
||
|
|
||
|
********************************************************************/
|
||
|
INT VIEW_VOLUMES_LBI::Compare( const LBI *plbi ) const
|
||
|
{
|
||
|
return( _nlsVolumeName._stricmp(
|
||
|
((const VIEW_VOLUMES_LBI *)plbi)->_nlsVolumeName ));
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: VIEW_VOLUMES_LISTBOX::VIEW_VOLUMES_LISTBOX
|
||
|
|
||
|
SYNOPSIS: Constructor
|
||
|
|
||
|
ENTRY: powin - owner window
|
||
|
cid - resource id of the share listbox
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
NarenG 11/11/92 Modified for AFPMGR
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
VIEW_VOLUMES_LISTBOX::VIEW_VOLUMES_LISTBOX(
|
||
|
OWNER_WINDOW *powin,
|
||
|
BOOL fDisplayBadVolumes,
|
||
|
CID cid,
|
||
|
AFP_SERVER_HANDLE hServer )
|
||
|
: BLT_LISTBOX( powin, cid ),
|
||
|
_hServer( hServer ),
|
||
|
_fDisplayBadVolumes( fDisplayBadVolumes ),
|
||
|
_dmdteGoodVolume( IDBM_LB_GOOD_VOLUME ),
|
||
|
_dmdteBadVolume( IDBM_LB_BAD_VOLUME )
|
||
|
{
|
||
|
if ( QueryError() != NERR_Success )
|
||
|
return;
|
||
|
|
||
|
APIERR err = NERR_Success;
|
||
|
|
||
|
if ( ((err = _dmdteGoodVolume.QueryError()) != NERR_Success ) ||
|
||
|
((err = _dmdteBadVolume.QueryError()) != NERR_Success ))
|
||
|
{
|
||
|
ReportError( err );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( ( err = DISPLAY_TABLE::CalcColumnWidths( _adx,
|
||
|
COLS_VV_LB_VOLUMES,
|
||
|
powin,
|
||
|
cid,
|
||
|
TRUE ) ) != NERR_Success )
|
||
|
{
|
||
|
ReportError( err );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: VIEW_VOLUMES_LISTBOX::~VIEW_VOLUMES_LISTBOX
|
||
|
|
||
|
SYNOPSIS: Destructor
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
NarenG 11/11/92 Modified for AFPMGR
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
VIEW_VOLUMES_LISTBOX::~VIEW_VOLUMES_LISTBOX()
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// This space intentionally left blank
|
||
|
//
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: VIEW_VOLUMES_LISTBOX::Refresh
|
||
|
|
||
|
SYNOPSIS: Update the volumes in the listbox
|
||
|
|
||
|
ENTRY: hServer - handle to the target server.
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
NarenG 11/11/92 Modified for AFPMGR
|
||
|
|
||
|
*******************************************************************/
|
||
|
|
||
|
DWORD VIEW_VOLUMES_LISTBOX::Refresh( VOID )
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// Enumerate all successfully shared volumes.
|
||
|
//
|
||
|
|
||
|
PAFP_VOLUME_INFO pAfpVolumes;
|
||
|
DWORD cgvEntriesRead;
|
||
|
DWORD cTotalAvail;
|
||
|
|
||
|
DWORD err = ::AfpAdminVolumeEnum( _hServer,
|
||
|
(LPBYTE*)&pAfpVolumes,
|
||
|
(DWORD)-1, // Get all volumes
|
||
|
&cgvEntriesRead,
|
||
|
&cTotalAvail,
|
||
|
NULL );
|
||
|
|
||
|
//
|
||
|
// See if the volumes are available.
|
||
|
//
|
||
|
|
||
|
if( err != NO_ERROR )
|
||
|
{
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get all the bad volumes if so requested.
|
||
|
//
|
||
|
|
||
|
PAFP_VOLUME_INFO pAfpBadVolumes;
|
||
|
DWORD cbvEntriesRead;
|
||
|
|
||
|
if ( _fDisplayBadVolumes )
|
||
|
{
|
||
|
err = ::AfpAdminInvalidVolumeEnum( _hServer,
|
||
|
(LPBYTE*)&pAfpBadVolumes,
|
||
|
&cbvEntriesRead );
|
||
|
if( err != NO_ERROR )
|
||
|
{
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Now that we know the volume info is available,
|
||
|
// let's nuke everything in the listbox.
|
||
|
//
|
||
|
|
||
|
SetRedraw( FALSE );
|
||
|
DeleteAllItems();
|
||
|
|
||
|
//
|
||
|
// For iterating volumes
|
||
|
//
|
||
|
|
||
|
PAFP_VOLUME_INFO pVolIter = pAfpVolumes;
|
||
|
|
||
|
//
|
||
|
// Iterate the volumes adding them to the listbox.
|
||
|
//
|
||
|
|
||
|
err = NO_ERROR;
|
||
|
|
||
|
while( ( err == NO_ERROR ) && ( cgvEntriesRead-- ) )
|
||
|
{
|
||
|
|
||
|
VIEW_VOLUMES_LBI * plbi = new VIEW_VOLUMES_LBI(
|
||
|
pVolIter->afpvol_id,
|
||
|
pVolIter->afpvol_name,
|
||
|
pVolIter->afpvol_path,
|
||
|
TRUE );
|
||
|
|
||
|
if( AddItem( plbi ) < 0 )
|
||
|
{
|
||
|
//
|
||
|
// CODEWORK: What should we do in error conditions?
|
||
|
// As currently spec'd, we do nothing. If the data
|
||
|
// cannot be retrieved, we display "n/a" in the
|
||
|
// statistics strings. Should we hide the listbox
|
||
|
// and display a message a'la WINNET??
|
||
|
//
|
||
|
|
||
|
err = ERROR_NOT_ENOUGH_MEMORY;
|
||
|
}
|
||
|
|
||
|
pVolIter++;
|
||
|
}
|
||
|
|
||
|
::AfpAdminBufferFree( pAfpVolumes );
|
||
|
|
||
|
//
|
||
|
// If we have to display bad volumes.
|
||
|
//
|
||
|
|
||
|
if ( _fDisplayBadVolumes && ( err == NO_ERROR ) )
|
||
|
{
|
||
|
|
||
|
pVolIter = pAfpBadVolumes;
|
||
|
|
||
|
//
|
||
|
// Iterate the volumes adding them to the listbox.
|
||
|
//
|
||
|
|
||
|
while( ( err == NO_ERROR ) && ( cbvEntriesRead-- ) )
|
||
|
{
|
||
|
|
||
|
VIEW_VOLUMES_LBI * plbi = new VIEW_VOLUMES_LBI(
|
||
|
pVolIter->afpvol_id,
|
||
|
pVolIter->afpvol_name,
|
||
|
pVolIter->afpvol_path,
|
||
|
FALSE );
|
||
|
|
||
|
if( AddItem( plbi ) < 0 )
|
||
|
{
|
||
|
//
|
||
|
// CODEWORK: What should we do in error conditions?
|
||
|
// As currently spec'd, we do nothing. If the data
|
||
|
// cannot be retrieved, we display "n/a" in the
|
||
|
// statistics strings. Should we hide the listbox
|
||
|
// and display a message a'la WINNET??
|
||
|
//
|
||
|
|
||
|
err = ERROR_NOT_ENOUGH_MEMORY;
|
||
|
}
|
||
|
|
||
|
pVolIter++;
|
||
|
}
|
||
|
|
||
|
::AfpAdminBufferFree( pAfpBadVolumes );
|
||
|
}
|
||
|
|
||
|
|
||
|
SetRedraw( TRUE );
|
||
|
Invalidate( TRUE );
|
||
|
|
||
|
return err;
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: VIEW_VOLUMES_DIALOG_BASE::VIEW_VOLUMES_DIALOG_BASE
|
||
|
|
||
|
SYNOPSIS: Constructor
|
||
|
|
||
|
ENTRY:
|
||
|
idrsrcDialog - dialog resources id
|
||
|
hwndOwner - handle of the parent
|
||
|
pszServerName - current focus server
|
||
|
ulHelpContextBase - the base help context
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
NarenG 11/11/92 Modified for AFPMGR
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
VIEW_VOLUMES_DIALOG_BASE::VIEW_VOLUMES_DIALOG_BASE(
|
||
|
const IDRESOURCE &idrsrcDialog,
|
||
|
const PWND2HWND &hwndOwner,
|
||
|
AFP_SERVER_HANDLE hServer,
|
||
|
const TCHAR *pszServerName,
|
||
|
BOOL fDisplayBadVolumes,
|
||
|
DWORD cidVolumeTitle,
|
||
|
DWORD cidVolumesLb )
|
||
|
: DIALOG_WINDOW( idrsrcDialog, hwndOwner ),
|
||
|
_sltVolumeTitle( this, cidVolumeTitle ),
|
||
|
_lbVolumes( this, fDisplayBadVolumes, cidVolumesLb, hServer ),
|
||
|
_pszServerName( pszServerName ),
|
||
|
_hServer( hServer ),
|
||
|
_cidVolumesLb( cidVolumesLb )
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// Make sure everything constructed OK
|
||
|
//
|
||
|
|
||
|
if ( QueryError() != NERR_Success )
|
||
|
return;
|
||
|
|
||
|
APIERR err;
|
||
|
if ( ((err = _sltVolumeTitle.QueryError()) != NERR_Success ) ||
|
||
|
((err = _lbVolumes.QueryError()) != NERR_Success ))
|
||
|
{
|
||
|
ReportError( err );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
err = BASE_ELLIPSIS::Init();
|
||
|
|
||
|
if( err != NO_ERROR )
|
||
|
{
|
||
|
ReportError( err );
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: VIEW_VOLUMES_DIALOG_BASE::~VIEW_VOLUMES_DIALOG_BASE
|
||
|
|
||
|
SYNOPSIS: Destructor
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
NarenG 11/11/92 Modified for AFPMGR
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
VIEW_VOLUMES_DIALOG_BASE::~VIEW_VOLUMES_DIALOG_BASE()
|
||
|
{
|
||
|
|
||
|
BASE_ELLIPSIS::Term();
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: VIEW_VOLUMES_DIALOG_BASE::SelectVolumeItem
|
||
|
|
||
|
SYNOPSIS: Selects the item which has the same path as the
|
||
|
supplied path.
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
NarenG 11/11/92 Modified for AFPMGR
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
APIERR VIEW_VOLUMES_DIALOG_BASE::SelectVolumeItem( const TCHAR * pszPath )
|
||
|
{
|
||
|
NLS_STR nlsPath( pszPath );
|
||
|
|
||
|
APIERR err = nlsPath.QueryError();
|
||
|
|
||
|
if ( err != NERR_Success )
|
||
|
{
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
INT ilbCount = _lbVolumes.QueryCount();
|
||
|
|
||
|
for ( INT i = 0; i < ilbCount; i++ )
|
||
|
{
|
||
|
VIEW_VOLUMES_LBI *pvvlbi = _lbVolumes.QueryItem(i);
|
||
|
|
||
|
if ( nlsPath._stricmp( pvvlbi->QueryVolumePath() ) == 0 )
|
||
|
{
|
||
|
_lbVolumes.SelectItem(i);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return NERR_Success;
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: VIEW_VOLUMES_DIALOG_BASE::Refresh
|
||
|
|
||
|
SYNOPSIS: Refresh the volumes listbox
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
NarenG 11/11/92 Modified for AFPMGR
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
DWORD VIEW_VOLUMES_DIALOG_BASE::Refresh( VOID )
|
||
|
{
|
||
|
APIERR err = _lbVolumes.Refresh();
|
||
|
|
||
|
_lbVolumes.Enable( _lbVolumes.QueryCount() > 0 );
|
||
|
|
||
|
_sltVolumeTitle.Enable( _lbVolumes.QueryCount() > 0 );
|
||
|
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: VIEW_VOLUMES_DIALOG_BASE::OnCommand
|
||
|
|
||
|
SYNOPSIS: Check if the user double clicks on a volume
|
||
|
|
||
|
ENTRY: event - the event that occurred
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
NarenG 11/11/92 Modified for AFPMGR
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
BOOL VIEW_VOLUMES_DIALOG_BASE::OnCommand( const CONTROL_EVENT &event )
|
||
|
{
|
||
|
APIERR err = NERR_Success;
|
||
|
|
||
|
if ( event.QueryCid() == _cidVolumesLb )
|
||
|
{
|
||
|
if ((event.QueryCode() == LBN_DBLCLK) && (_lbVolumes.QuerySelCount()>0))
|
||
|
{
|
||
|
return OnVolumeLbDblClk();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return DIALOG_WINDOW::OnCommand( event );
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: VIEW_VOLUMES_DIALOG_BASE::VolumeDelete
|
||
|
|
||
|
SYNOPSIS: Helper method to Delete a volume and popup any
|
||
|
warning if some users are connected to the volume
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
NarenG 11/11/92 Modified for AFPMGR
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
DWORD VIEW_VOLUMES_DIALOG_BASE::VolumeDelete( VIEW_VOLUMES_LBI * pvlbi,
|
||
|
BOOL * pfCancel )
|
||
|
{
|
||
|
|
||
|
*pfCancel = FALSE;
|
||
|
|
||
|
//
|
||
|
// If this is a bad volume simply delete it
|
||
|
//
|
||
|
|
||
|
if ( !(pvlbi->IsVolumeValid()) )
|
||
|
{
|
||
|
DWORD err = ::AfpAdminInvalidVolumeDelete(
|
||
|
_hServer,
|
||
|
(LPWSTR)pvlbi->QueryVolumeName() );
|
||
|
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
BOOL fOK = TRUE;
|
||
|
|
||
|
//
|
||
|
// Check if there are any users connected to the volume
|
||
|
// by enumerating the connections to this volume.
|
||
|
//
|
||
|
PAFP_CONNECTION_INFO pAfpConnections;
|
||
|
DWORD cEntriesRead;
|
||
|
DWORD cTotalAvail;
|
||
|
|
||
|
|
||
|
DWORD err = ::AfpAdminConnectionEnum( _hServer,
|
||
|
(LPBYTE*)&pAfpConnections,
|
||
|
AFP_FILTER_ON_VOLUME_ID,
|
||
|
pvlbi->QueryVolumeId(),
|
||
|
(DWORD)-1, // Get all conenctions
|
||
|
&cEntriesRead,
|
||
|
&cTotalAvail,
|
||
|
NULL );
|
||
|
|
||
|
//
|
||
|
// See if the connections are available.
|
||
|
//
|
||
|
|
||
|
if( err != NO_ERROR )
|
||
|
{
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
if ( cEntriesRead > 0 )
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// There are users currently connected to the share to be deleted,
|
||
|
// hence, popup a dialog displaying all uses to the volume.
|
||
|
//
|
||
|
|
||
|
CURRENT_USERS_WARNING_DIALOG *pdlg =
|
||
|
new CURRENT_USERS_WARNING_DIALOG( QueryRobustHwnd(),
|
||
|
_hServer,
|
||
|
pAfpConnections,
|
||
|
cEntriesRead,
|
||
|
pvlbi->QueryVolumeName());
|
||
|
|
||
|
if ( ( pdlg == NULL )
|
||
|
|| ((err = pdlg->QueryError()) != NERR_Success )
|
||
|
|| ((err = pdlg->Process( &fOK )) != NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
err = pdlg == NULL ? ERROR_NOT_ENOUGH_MEMORY : err;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// User clicked CANCEL for the pdlg
|
||
|
//
|
||
|
|
||
|
if ( ( err != NO_ERROR ) || !fOK )
|
||
|
{
|
||
|
*pfCancel = TRUE;
|
||
|
}
|
||
|
|
||
|
delete pdlg;
|
||
|
}
|
||
|
|
||
|
::AfpAdminBufferFree( pAfpConnections );
|
||
|
|
||
|
//
|
||
|
// If user gave the go ahead to close the volume then go ahead and
|
||
|
// try to close it.
|
||
|
//
|
||
|
|
||
|
if ( err == NO_ERROR && fOK )
|
||
|
{
|
||
|
err = ::AfpAdminVolumeDelete( _hServer,
|
||
|
(LPWSTR)pvlbi->QueryVolumeName() );
|
||
|
}
|
||
|
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: VIEW_VOLUMES_DIALOG_BASE::IsFocusOnGoodVolume
|
||
|
|
||
|
SYNOPSIS: Will check to see if the current selection is a good or
|
||
|
bad volume.
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS: Returns TRUE if current selection is a valid volume.
|
||
|
FALSE otherwise.
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
NarenG 11/11/92 Modified for AFPMGR
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
BOOL VIEW_VOLUMES_DIALOG_BASE::IsFocusOnGoodVolume( VOID ) const
|
||
|
{
|
||
|
|
||
|
if( _lbVolumes.QuerySelCount() > 0 )
|
||
|
{
|
||
|
return( _lbVolumes.QueryItem()->IsVolumeValid() );
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|