2386 lines
62 KiB
C++
2386 lines
62 KiB
C++
|
/**********************************************************************/
|
||
|
/** Microsoft Windows NT **/
|
||
|
/** Copyright(c) Microsoft Corp., 1991 **/
|
||
|
/**********************************************************************/
|
||
|
|
||
|
/*
|
||
|
* sharecrt.cxx
|
||
|
* Contains dialogs for creating shares
|
||
|
*
|
||
|
* FILE HISTORY:
|
||
|
* Yi-HsinS 1/6/92 Created, separated from sharefmx.cxx
|
||
|
* and added SHARE_CREATE_BASE
|
||
|
* Yi-HsinS 3/12/92 Added CREATE_SHARE_GROUP
|
||
|
* Yi-HsinS 4/2/92 Added MayRun
|
||
|
* Yi-HsinS 8/6/92 Reorganized to match Winball
|
||
|
* YiHsinS 4/2/93 Disable viewing/changing permission on special
|
||
|
* shares ( [A-Z]$, IPC$, ADMIN$ )
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include <ntincl.hxx>
|
||
|
|
||
|
#define INCL_WINDOWS_GDI
|
||
|
#define INCL_WINDOWS
|
||
|
#define INCL_DOSERRORS
|
||
|
#define INCL_NETERRORS
|
||
|
#define INCL_NETSERVER
|
||
|
#define INCL_NETUSE
|
||
|
#define INCL_NETSHARE
|
||
|
#define INCL_NETCONS
|
||
|
#define INCL_NETLIB
|
||
|
#define INCL_ICANON
|
||
|
#include <lmui.hxx>
|
||
|
|
||
|
extern "C"
|
||
|
{
|
||
|
#include <sharedlg.h>
|
||
|
#include <helpnums.h>
|
||
|
#include <mnet.h>
|
||
|
}
|
||
|
|
||
|
#define INCL_BLT_DIALOG
|
||
|
#define INCL_BLT_CONTROL
|
||
|
#define INCL_BLT_MSGPOPUP
|
||
|
#define INCL_BLT_SPIN_GROUP
|
||
|
#include <blt.hxx>
|
||
|
|
||
|
#include <string.hxx>
|
||
|
#include <uitrace.hxx>
|
||
|
#include <dbgstr.hxx>
|
||
|
|
||
|
#include <lmoshare.hxx>
|
||
|
#include <lmoesh.hxx>
|
||
|
#include <lmoeconn.hxx>
|
||
|
#include <lmosrv.hxx>
|
||
|
|
||
|
#include <strchlit.hxx> // for string and character constants
|
||
|
#include "sharecrt.hxx"
|
||
|
#include "sharestp.hxx"
|
||
|
#include <errmap.hxx>
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: DetermineUserLimit
|
||
|
|
||
|
SYNOPSIS: A utility function to determine the maximum number of
|
||
|
users allowed on a share.
|
||
|
|
||
|
ENTRY: psvr - the server object where the share will be placed
|
||
|
|
||
|
RETURNS: The maximum number of users for shares on that server
|
||
|
|
||
|
NOTES: The maximum number of users is determined as follows:
|
||
|
|
||
|
if (not an NT machine) then
|
||
|
LANMAN_USERS_MAX
|
||
|
else
|
||
|
whatever the server returned to us. If they return
|
||
|
unlimited, 0xffffffff, then use NT_USERS_MAX to avoid
|
||
|
maxing out the spin control
|
||
|
|
||
|
HISTORY:
|
||
|
BruceFo 9/12/95 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
ULONG DetermineUserLimit(SERVER_WITH_PASSWORD_PROMPT* psvr)
|
||
|
{
|
||
|
if (NULL == psvr)
|
||
|
{
|
||
|
return NT_USERS_MAX;
|
||
|
}
|
||
|
|
||
|
if (psvr->IsNT())
|
||
|
{
|
||
|
ULONG users = psvr->QueryMaxUsers();
|
||
|
return (users > NT_USERS_MAX) ? NT_USERS_MAX : users;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return LANMAN_USERS_MAX;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: ADD_SHARE_DIALOG_BASE::ADD_SHARE_DIALOG_BASE
|
||
|
|
||
|
SYNOPSIS: Constructor
|
||
|
|
||
|
ENTRY: pszDlgResource - resource name of the dialog
|
||
|
hwndParent - hwnd of the parent window
|
||
|
ulHelpContextBase - the base help context
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/3/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
ADD_SHARE_DIALOG_BASE::ADD_SHARE_DIALOG_BASE( const TCHAR *pszDlgResource,
|
||
|
HWND hwndParent,
|
||
|
ULONG ulHelpContextBase )
|
||
|
: SHARE_DIALOG_BASE( pszDlgResource, hwndParent, ulHelpContextBase ),
|
||
|
_sleShare( this, SLE_SHARE, SHARE_NAME_LENGTH )
|
||
|
|
||
|
{
|
||
|
if ( QueryError() != NERR_Success )
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: ADD_SHARE_DIALOG_BASE::~ADD_SHARE_DIALOG_BASE
|
||
|
|
||
|
SYNOPSIS: Destructor
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/3/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
ADD_SHARE_DIALOG_BASE::~ADD_SHARE_DIALOG_BASE()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: ADD_SHARE_DIALOG_BASE::QueryPathErrorMsg
|
||
|
|
||
|
SYNOPSIS: Default error message when the path entered
|
||
|
by the user is invalid. Depending on whether
|
||
|
the dialog is used in the server manager or
|
||
|
file manager, different error message for the
|
||
|
invalid path will be displayed.
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES: This error message is the message used when the
|
||
|
dialog exist in the server manager.
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/3/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
APIERR ADD_SHARE_DIALOG_BASE::QueryPathErrorMsg( VOID )
|
||
|
{
|
||
|
return IERR_SHARE_INVALID_LOCAL_PATH;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: ADD_SHARE_DIALOG_BASE::OnAddShare
|
||
|
|
||
|
SYNOPSIS: Gather information and create a new share
|
||
|
|
||
|
ENTRY: psvr - the server on which to create the share
|
||
|
|
||
|
pnlsNewShareName - optional parameter to store
|
||
|
the name of the newly created share if all went well
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS: TRUE if the share has been created successfully,
|
||
|
and FALSE otherwise.
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/25/91 Created
|
||
|
Yi-HsinS 11/25/91 Made slestrpSharePath accepts local
|
||
|
full path name
|
||
|
Yi-HsinS 1/22/92 Check for sharing ADMIN$ or IPC$
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
BOOL ADD_SHARE_DIALOG_BASE::OnAddShare( SERVER_WITH_PASSWORD_PROMPT *psvr,
|
||
|
NLS_STR *pnlsNewShareName )
|
||
|
{
|
||
|
APIERR err = NERR_Success;
|
||
|
BOOL fAddedShare = FALSE;
|
||
|
SLE *psle = QuerySLEPath(); // Store the control window
|
||
|
// to set focus on if error
|
||
|
|
||
|
UIASSERT( psvr != NULL );
|
||
|
|
||
|
do { // Not a loop, just for breaking out to the end if error occurs
|
||
|
|
||
|
//
|
||
|
// Get the path and computer
|
||
|
//
|
||
|
NLS_STR nlsPath;
|
||
|
NLS_STR nlsServer;
|
||
|
if ( ((err = nlsPath.QueryError() ) != NERR_Success )
|
||
|
|| ((err = nlsServer.QueryError()) != NERR_Success )
|
||
|
|| ((err = GetAndValidateComputerPath( psvr, &nlsServer, &nlsPath ))
|
||
|
!= NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get the share name
|
||
|
//
|
||
|
NLS_STR nlsShare;
|
||
|
if ( ((err = nlsShare.QueryError()) != NERR_Success )
|
||
|
|| ((err = QueryShare( &nlsShare )) != NERR_Success)
|
||
|
|| ( nlsShare.QueryTextLength() == 0 )
|
||
|
)
|
||
|
{
|
||
|
psle = QuerySLEShare();
|
||
|
err = err ? err : (APIERR) IERR_SHARE_INVALID_SHARE;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Validate the share name
|
||
|
//
|
||
|
if ( ::I_MNetNameValidate( NULL, nlsShare,
|
||
|
NAMETYPE_SHARE, 0L) != NERR_Success )
|
||
|
{
|
||
|
err = (APIERR) IERR_SHARE_INVALID_SHARE;
|
||
|
psle = QuerySLEShare();
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Check if the name of the share is accessible from DOS machine
|
||
|
//
|
||
|
ULONG nType;
|
||
|
if ( ::I_MNetPathType(NULL, nlsShare, &nType, INPT_FLAGS_OLDPATHS )
|
||
|
!= NERR_Success )
|
||
|
{
|
||
|
if ( ::MsgPopup( this, IERR_SHARE_NOT_ACCESSIBLE_FROM_DOS,
|
||
|
MPSEV_INFO, MP_YESNO, nlsShare, MP_NO ) == IDNO )
|
||
|
{
|
||
|
psle = QuerySLEShare();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get the comment
|
||
|
//
|
||
|
NLS_STR nlsComment;
|
||
|
if ( ((err = nlsComment.QueryError() ) != NERR_Success )
|
||
|
|| ((err = QueryComment( &nlsComment )) != NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
psle = QuerySLEComment();
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Check whether it is a special share name -- ADMIN$ or IPC$
|
||
|
// If creating the special share, the path and comment
|
||
|
// has to be empty.
|
||
|
//
|
||
|
|
||
|
BOOL fAdminShare = (::stricmpf( nlsShare, ADMIN_SHARE) == 0);
|
||
|
BOOL fIPCShare = (::stricmpf( nlsShare, IPC_SHARE) == 0);
|
||
|
BOOL fPathEmpty = nlsPath.QueryTextLength() == 0;
|
||
|
|
||
|
if ( fAdminShare || fIPCShare )
|
||
|
{
|
||
|
if ( !fPathEmpty )
|
||
|
{
|
||
|
err = (APIERR) IERR_SPECIAL_SHARE_INVALID_PATH;
|
||
|
}
|
||
|
else if ( nlsComment.QueryTextLength() != 0)
|
||
|
{
|
||
|
err = (APIERR) IERR_SPECIAL_SHARE_INVALID_COMMENT;
|
||
|
psle = QuerySLEComment();
|
||
|
}
|
||
|
|
||
|
if ( err != NERR_Success )
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get the right error message when the path is invalid
|
||
|
//
|
||
|
if ( fPathEmpty && !fAdminShare && !fIPCShare )
|
||
|
{
|
||
|
err = QueryPathErrorMsg();
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
UINT uiResourceType = ( fIPCShare? STYPE_IPC : STYPE_DISKTREE);
|
||
|
SHARE_2 sh2( nlsShare, nlsServer);
|
||
|
if ( ((err = sh2.QueryError()) != NERR_Success )
|
||
|
|| ((err = sh2.CreateNew()) != NERR_Success )
|
||
|
|| ((err = sh2.SetResourceType( uiResourceType )) != NERR_Success)
|
||
|
|| ((err = sh2.SetPath( nlsPath )) != NERR_Success)
|
||
|
)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Set the comment
|
||
|
//
|
||
|
if ( (err = sh2.SetComment( nlsComment )) != NERR_Success )
|
||
|
{
|
||
|
if ( err == ERROR_INVALID_PARAMETER )
|
||
|
err = IERR_SHARE_INVALID_COMMENT;
|
||
|
psle = QuerySLEComment();
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get and set user limit
|
||
|
//
|
||
|
UINT uiUserLimit = (UINT) QueryUserLimit();
|
||
|
BOOL fNT = psvr->IsNT();
|
||
|
if ( (( !fNT ) && ( uiUserLimit != SHI_USES_UNLIMITED )
|
||
|
&& ( uiUserLimit > LANMAN_USERS_MAX ))
|
||
|
|| (( err = sh2.SetMaxUses( uiUserLimit ) ) != NERR_Success)
|
||
|
)
|
||
|
{
|
||
|
err = err ? err : IERR_SHARE_INVALID_USERLIMIT;
|
||
|
psle = QuerySpinSLEUsers();
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Set the permissions/password if the server is a LM share-level server
|
||
|
//
|
||
|
if ( !fNT && psvr->IsShareLevel() )
|
||
|
{
|
||
|
// Error already checked when dismissing
|
||
|
// SHARE_LEVEL_PERMISSIONS _DIALOG. So, we don't need
|
||
|
// to set focus when error!
|
||
|
|
||
|
// We upper case the password => same as netcmd
|
||
|
// since password are used in Share level servers which are
|
||
|
// always down-level servers.
|
||
|
ALIAS_STR nlsPassword( QueryStoredPassword() );
|
||
|
nlsPassword._strupr();
|
||
|
|
||
|
if ( ((err = sh2.SetPermissions( QueryStoredPermissions() ))
|
||
|
!= NERR_Success)
|
||
|
|| ((err = sh2.SetPassword( nlsPassword ))
|
||
|
!= NERR_Success)
|
||
|
)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Write out the share
|
||
|
//
|
||
|
if (( err = sh2.WriteNew()) == NERR_Success )
|
||
|
{
|
||
|
fAddedShare = TRUE;
|
||
|
if ( pnlsNewShareName )
|
||
|
err = pnlsNewShareName->CopyFrom( sh2.QueryName() );
|
||
|
|
||
|
// If the server is an NT server, set the permissions.
|
||
|
if ( ( fNT )
|
||
|
&& ( err == NERR_Success )
|
||
|
&& ( QueryStoredSecDesc() != NULL)
|
||
|
)
|
||
|
{
|
||
|
err = ApplySharePermissions( sh2.QueryServer(),
|
||
|
sh2.QueryName(),
|
||
|
QueryStoredSecDesc() );
|
||
|
|
||
|
// The permissions on special shares [A-Z]$, IPC$, ADMIN$
|
||
|
// cannot be set.
|
||
|
if ( err == ERROR_INVALID_PARAMETER )
|
||
|
err = IERR_SPECIAL_SHARE_CANNOT_SET_PERMISSIONS;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} while (FALSE);
|
||
|
|
||
|
if ( err != NERR_Success )
|
||
|
{
|
||
|
// Map some errors
|
||
|
switch ( err )
|
||
|
{
|
||
|
case ERROR_NOT_READY:
|
||
|
err = IERR_SHARE_DRIVE_NOT_READY;
|
||
|
break;
|
||
|
|
||
|
case NERR_DuplicateShare:
|
||
|
psle = QuerySLEShare();
|
||
|
break;
|
||
|
|
||
|
case NERR_BadTransactConfig:
|
||
|
Dismiss( FALSE );
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if ( err != NERR_Success )
|
||
|
{
|
||
|
::MsgPopup( this,
|
||
|
err,
|
||
|
err == IERR_SPECIAL_SHARE_CANNOT_SET_PERMISSIONS
|
||
|
? MPSEV_WARNING
|
||
|
: MPSEV_ERROR );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Set focus to the appropriate control that contains invalid information
|
||
|
//
|
||
|
if ( !fAddedShare )
|
||
|
{
|
||
|
psle->SelectString();
|
||
|
psle->ClaimFocus();
|
||
|
}
|
||
|
|
||
|
return fAddedShare;
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: ADD_SHARE_DIALOG_BASE::GetAndValidateComputerPath
|
||
|
|
||
|
SYNOPSIS: Helper method to get the path of the share
|
||
|
and the computer on which to create the share
|
||
|
|
||
|
|
||
|
ENTRY: psvr - the server on which to create the share
|
||
|
|
||
|
EXIT: pnlsComputer - pointer to the computer name
|
||
|
pnlsPath - pointer to the path
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES: This is a default virtual method used only when
|
||
|
the dialogs derived from this class are used in the
|
||
|
server manager.
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/3/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
APIERR ADD_SHARE_DIALOG_BASE::GetAndValidateComputerPath(
|
||
|
SERVER_WITH_PASSWORD_PROMPT *psvr,
|
||
|
NLS_STR *pnlsComputer,
|
||
|
NLS_STR *pnlsPath )
|
||
|
{
|
||
|
|
||
|
UIASSERT( psvr != NULL );
|
||
|
|
||
|
APIERR err;
|
||
|
|
||
|
do { // NOT a loop
|
||
|
|
||
|
*pnlsComputer = psvr->QueryName();
|
||
|
if ( ((err = pnlsComputer->QueryError()) != NERR_Success )
|
||
|
|| ((err = QueryPath( pnlsPath )) != NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if ( pnlsPath->QueryTextLength() == 0 )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Path should only be absolute path
|
||
|
//
|
||
|
NET_NAME netName( *pnlsPath, TYPE_PATH_ABS );
|
||
|
|
||
|
if (( err = netName.QueryError()) != NERR_Success )
|
||
|
{
|
||
|
if ( err == ERROR_INVALID_NAME )
|
||
|
err = (APIERR) IERR_SHARE_INVALID_LOCAL_PATH;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Validated successfully, so check to see if it's in the
|
||
|
// form "x:". If so, append a "\" into the path.
|
||
|
//
|
||
|
if ( pnlsPath->QueryTextLength() == 2)
|
||
|
pnlsPath->AppendChar( PATH_SEPARATOR );
|
||
|
|
||
|
} while ( FALSE );
|
||
|
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_NEW_SHARE_DIALOG::FILEMGR_NEW_SHARE_DIALOG
|
||
|
|
||
|
SYNOPSIS: Constructor
|
||
|
|
||
|
ENTRY: hwndParent - hwnd of the parent window
|
||
|
pszSelectedDir - the selected directory in the file manager
|
||
|
ulHelpContextBase - the base help context
|
||
|
fShowDefault - TRUE if we want to display the default share
|
||
|
name, FALSE otherwise.
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/25/91 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
FILEMGR_NEW_SHARE_DIALOG::FILEMGR_NEW_SHARE_DIALOG( HWND hwndParent,
|
||
|
const TCHAR *pszSelectedDir,
|
||
|
ULONG ulHelpContextBase,
|
||
|
BOOL fShowDefault,
|
||
|
NLS_STR *pnlsNewShareName )
|
||
|
: ADD_SHARE_DIALOG_BASE( MAKEINTRESOURCE(IDD_SHARECREATEDLG),
|
||
|
hwndParent,
|
||
|
ulHelpContextBase ),
|
||
|
_newShareGrp( this, QuerySLEShare(), QuerySLEPath()),
|
||
|
_pnlsNewShareName( pnlsNewShareName ),
|
||
|
_psvr( NULL )
|
||
|
{
|
||
|
if ( QueryError() != NERR_Success )
|
||
|
return;
|
||
|
|
||
|
APIERR err;
|
||
|
if ( ((err = _newShareGrp.QueryError()) != NERR_Success )
|
||
|
|| ((err = SetDefaults( pszSelectedDir, fShowDefault)) != NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
ReportError( err );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
QuerySLEShare()->SelectString();
|
||
|
QuerySLEShare()->ClaimFocus();
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_NEW_SHARE_DIALOG::~FILEMGR_NEW_SHARE_DIALOG
|
||
|
|
||
|
SYNOPSIS: Destructor
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/25/91 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
FILEMGR_NEW_SHARE_DIALOG::~FILEMGR_NEW_SHARE_DIALOG()
|
||
|
{
|
||
|
delete _psvr;
|
||
|
_psvr = NULL;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_NEW_SHARE_DIALOG::QueryPathErrorMsg
|
||
|
|
||
|
SYNOPSIS: Query the error message when the user
|
||
|
entered an invalid path in the new share dialog
|
||
|
used in the file manager.
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS: Returns the error message for invalid path
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/25/91 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
APIERR FILEMGR_NEW_SHARE_DIALOG::QueryPathErrorMsg( VOID )
|
||
|
{
|
||
|
return IERR_SHARE_INVALID_SHAREPATH;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_NEW_SHARE_DIALOG::QueryServer2
|
||
|
|
||
|
SYNOPSIS: Get the SERVER_2 object by determining which server
|
||
|
the path is on.
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT: *ppsvr - pointer to the server object
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/25/91 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
APIERR FILEMGR_NEW_SHARE_DIALOG::QueryServer2(
|
||
|
SERVER_WITH_PASSWORD_PROMPT **ppsvr )
|
||
|
{
|
||
|
APIERR err;
|
||
|
NLS_STR nlsPath;
|
||
|
NLS_STR nlsComputer;
|
||
|
|
||
|
do { // Not a loop
|
||
|
|
||
|
if ( ((err = nlsPath.QueryError()) != NERR_Success )
|
||
|
|| ((err = nlsComputer.QueryError()) != NERR_Success )
|
||
|
|| ((err = QueryPath( &nlsPath )) != NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// When the path is empty, ( probably because of ADMIN$/IPC$ )
|
||
|
// assume the server is the local computer.
|
||
|
//
|
||
|
if ( nlsPath.QueryTextLength() == 0 )
|
||
|
{
|
||
|
nlsComputer = EMPTY_STRING;
|
||
|
err = nlsComputer.QueryError();
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Let the type be unknown so that SHARE_NET_NAME will set the
|
||
|
// type accordingly. This is only valid when the path is not empty.
|
||
|
//
|
||
|
SHARE_NET_NAME netName( nlsPath, TYPE_UNKNOWN );
|
||
|
|
||
|
if ( ( err = netName.QueryError()) != NERR_Success )
|
||
|
{
|
||
|
if ( err == ERROR_INVALID_NAME )
|
||
|
err = (APIERR) IERR_SHARE_INVALID_SHAREPATH;
|
||
|
SetFocusOnPath();
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get the Computer Name
|
||
|
//
|
||
|
if ((err = netName.QueryComputerName( &nlsComputer )) != NERR_Success )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if ( netName.IsLocal( &err ) && ( err == NERR_Success ))
|
||
|
{
|
||
|
nlsComputer = EMPTY_STRING;
|
||
|
err = nlsComputer.QueryError();
|
||
|
}
|
||
|
|
||
|
} while ( FALSE );
|
||
|
|
||
|
//
|
||
|
// Check to see the computer is the same the one stored before
|
||
|
// If so, we don't need a new server object.
|
||
|
// Else, delete the old server object and get a new one.
|
||
|
//
|
||
|
if ( ( err == NERR_Success )
|
||
|
&& ( ( _psvr == NULL )
|
||
|
|| ::I_MNetComputerNameCompare( nlsComputer, _psvr->QueryName() )
|
||
|
)
|
||
|
)
|
||
|
{
|
||
|
if ( _psvr != NULL )
|
||
|
delete _psvr;
|
||
|
|
||
|
//
|
||
|
// We need to clear the security desc when the user switched to
|
||
|
// a different computer.
|
||
|
//
|
||
|
if ( (err = ClearStoredInfo()) == NERR_Success )
|
||
|
{
|
||
|
_psvr = new SERVER_WITH_PASSWORD_PROMPT( nlsComputer,
|
||
|
QueryHwnd(),
|
||
|
QueryHelpContextBase() );
|
||
|
if ( ( _psvr == NULL )
|
||
|
|| ((err = _psvr->QueryError()) != NERR_Success )
|
||
|
|| ((err = _psvr->GetInfo()) != NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
err = err? err : ERROR_NOT_ENOUGH_MEMORY;
|
||
|
delete _psvr;
|
||
|
_psvr = NULL;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*ppsvr = _psvr;
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_NEW_SHARE_DIALOG::SetDefaults
|
||
|
|
||
|
SYNOPSIS: Set the default share and path in the SLEs
|
||
|
|
||
|
ENTRY: pszSelectedDir - name of the selected directory
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES: We'll only set the default share name if the name has
|
||
|
not been used before, i.e. when fShowDefault is TRUE
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/3/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
APIERR FILEMGR_NEW_SHARE_DIALOG::SetDefaults( const TCHAR *pszSelectedDir,
|
||
|
BOOL fShowDefault )
|
||
|
{
|
||
|
APIERR err = NERR_Success;
|
||
|
|
||
|
ALIAS_STR nlsSelectedDir( pszSelectedDir );
|
||
|
if ( nlsSelectedDir.QueryTextLength() == 0 )
|
||
|
{
|
||
|
QueryPBCancel()->MakeDefault();
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get Information on the selected directory
|
||
|
//
|
||
|
SHARE_NET_NAME netName( pszSelectedDir, TYPE_UNKNOWN );
|
||
|
|
||
|
if ((err = netName.QueryError()) == NERR_Success )
|
||
|
{
|
||
|
|
||
|
BOOL fLocal = netName.IsLocal( &err );
|
||
|
|
||
|
if ( err == NERR_Success )
|
||
|
{
|
||
|
|
||
|
NLS_STR nlsSharePath; // of the form "\\server\share\path"
|
||
|
// or "x:\path"
|
||
|
NLS_STR nlsShareName; // EMPTY_STRING is default
|
||
|
NLS_STR nlsComputer;
|
||
|
|
||
|
if ( (( err = nlsSharePath.QueryError()) == NERR_Success )
|
||
|
&& (( err = nlsShareName.QueryError()) == NERR_Success )
|
||
|
&& (( err = nlsComputer.QueryError()) == NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// Set the default value of SLEs
|
||
|
// If the path is on a local computer, display the
|
||
|
// absolute path. If it's not on a local computer,
|
||
|
// display the UNC path
|
||
|
//
|
||
|
if ( fLocal )
|
||
|
err = netName.QueryLocalPath( &nlsSharePath );
|
||
|
else
|
||
|
err = netName.QueryUNCPath( &nlsSharePath );
|
||
|
|
||
|
err = err? err : netName.QueryComputerName( &nlsComputer );
|
||
|
|
||
|
if ( fShowDefault )
|
||
|
err = err? err : netName.QueryLastComponent( &nlsShareName);
|
||
|
|
||
|
if ( err == NERR_Success )
|
||
|
{
|
||
|
UINT nShareLen = nlsShareName.QueryTextLength();
|
||
|
if ( nShareLen == 0 )
|
||
|
{
|
||
|
QueryPBCancel()->MakeDefault();
|
||
|
QueryPBPermissions()->Enable( FALSE );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
QueryPBOK()->MakeDefault();
|
||
|
QueryPBPermissions()->Enable( TRUE );
|
||
|
|
||
|
if ( nShareLen > SHARE_NAME_LENGTH )
|
||
|
{
|
||
|
ISTR istr( nlsShareName );
|
||
|
istr += SHARE_NAME_LENGTH;
|
||
|
nlsShareName.DelSubStr( istr );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
SetPath ( nlsSharePath );
|
||
|
SetShare( nlsShareName );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_NEW_SHARE_DIALOG::GetAndValidateComputerPath
|
||
|
|
||
|
SYNOPSIS: Helper method to get the path of the share
|
||
|
and the computer on which to create the share
|
||
|
|
||
|
|
||
|
ENTRY: psvr - the server on which to create the share
|
||
|
|
||
|
EXIT: pnlsComputer - pointer to the computer name
|
||
|
pnlsPath - pointer to the path
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES: This is the virtual method used when the dialog belongs
|
||
|
to the file manager.
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/3/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
APIERR FILEMGR_NEW_SHARE_DIALOG::GetAndValidateComputerPath(
|
||
|
SERVER_WITH_PASSWORD_PROMPT *psvr,
|
||
|
NLS_STR *pnlsComputer,
|
||
|
NLS_STR *pnlsPath )
|
||
|
{
|
||
|
|
||
|
APIERR err;
|
||
|
|
||
|
do { // NOT a loop
|
||
|
|
||
|
*pnlsComputer = psvr->QueryName();
|
||
|
|
||
|
if ( ((err = pnlsComputer->QueryError()) != NERR_Success )
|
||
|
|| ((err = QueryPath( pnlsPath )) != NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if ( pnlsPath->QueryTextLength() == 0 )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Let the type be unknown so that SHARE_NET_NAME will set the
|
||
|
// type accordingly. This is only valid when the path is not empty.
|
||
|
//
|
||
|
SHARE_NET_NAME netName( *pnlsPath, TYPE_UNKNOWN );
|
||
|
|
||
|
if ( ( err = netName.QueryError()) != NERR_Success )
|
||
|
{
|
||
|
if ( err == ERROR_INVALID_NAME )
|
||
|
err = (APIERR) IERR_SHARE_INVALID_SHAREPATH;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get the path that is local to the computer.
|
||
|
//
|
||
|
if ((err = netName.QueryLocalPath( pnlsPath )) != NERR_Success )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
} while ( FALSE );
|
||
|
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_NEW_SHARE_DIALOG::OnOK
|
||
|
|
||
|
SYNOPSIS: Create the share if the user clicks on the OK button
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 1/8/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
BOOL FILEMGR_NEW_SHARE_DIALOG::OnOK( VOID )
|
||
|
{
|
||
|
AUTO_CURSOR autocur;
|
||
|
|
||
|
SERVER_WITH_PASSWORD_PROMPT *psvr = NULL;
|
||
|
APIERR err = QueryServer2( &psvr );
|
||
|
if ( err == NERR_Success )
|
||
|
{
|
||
|
if ( OnAddShare( psvr, _pnlsNewShareName ) )
|
||
|
Dismiss( TRUE );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Don't popup the error if the user clicks cancel button in the
|
||
|
// password dialog.
|
||
|
if ( err != IERR_USER_CLICKED_CANCEL )
|
||
|
::MsgPopup( this, err );
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_NEW_SHARE_DIALOG::QueryHelpContext
|
||
|
|
||
|
SYNOPSIS: Get the help context of the dialog
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS: Return the help context
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 1/8/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
ULONG FILEMGR_NEW_SHARE_DIALOG::QueryHelpContext( VOID )
|
||
|
{
|
||
|
return QueryHelpContextBase() + HC_FILEMGRNEWSHARE;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_NEW_SHARE_GROUP::FILEMGR_NEW_SHARE_GROUP
|
||
|
|
||
|
SYNOPSIS: Constructor
|
||
|
|
||
|
ENTRY: pdlg - pointer to the dialog
|
||
|
psleShare - pointer to the Share SLE
|
||
|
pslePath - pointer to teh Path SLE
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 3/12/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
FILEMGR_NEW_SHARE_GROUP::FILEMGR_NEW_SHARE_GROUP(
|
||
|
ADD_SHARE_DIALOG_BASE *pdlg,
|
||
|
SLE *psleShare, SLE *pslePath )
|
||
|
: _psleShare( psleShare ),
|
||
|
_pslePath( pslePath ),
|
||
|
_pdlg( pdlg )
|
||
|
{
|
||
|
UIASSERT( psleShare );
|
||
|
UIASSERT( pslePath );
|
||
|
UIASSERT( pdlg );
|
||
|
|
||
|
_psleShare->SetGroup( this );
|
||
|
_pslePath->SetGroup( this );
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_NEW_SHARE_GROUP::~FILEMGR_NEW_SHARE_GROUP
|
||
|
|
||
|
SYNOPSIS: Destructor
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 3/12/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
FILEMGR_NEW_SHARE_GROUP::~FILEMGR_NEW_SHARE_GROUP()
|
||
|
{
|
||
|
_psleShare = NULL;
|
||
|
_pslePath = NULL;
|
||
|
_pdlg = NULL;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_NEW_SHARE_GROUP::OnUserAction
|
||
|
|
||
|
SYNOPSIS: If the share name is not empty, make OK the default button.
|
||
|
Else, make CANCEL the default button.
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 3/12/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
APIERR FILEMGR_NEW_SHARE_GROUP::OnUserAction( CONTROL_WINDOW *pcw,
|
||
|
const CONTROL_EVENT &e )
|
||
|
{
|
||
|
if ( ( pcw == _pslePath )
|
||
|
|| ( pcw == _psleShare )
|
||
|
)
|
||
|
{
|
||
|
if ( e.QueryCode() == EN_CHANGE )
|
||
|
{
|
||
|
BOOL fShareEmpty = ( _psleShare->QueryTextLength() == 0 );
|
||
|
BOOL fPathEmpty = ( _pslePath->QueryTextLength() == 0 );
|
||
|
|
||
|
BOOL fEnable = FALSE;
|
||
|
|
||
|
// If both share and path are not empty
|
||
|
if ( !fShareEmpty && !fPathEmpty )
|
||
|
{
|
||
|
fEnable = TRUE;
|
||
|
|
||
|
}
|
||
|
// If share is not empty and path is empty,
|
||
|
// check if the share name is ADMIN$ or IPC$
|
||
|
else if ( !fShareEmpty && fPathEmpty )
|
||
|
{
|
||
|
APIERR err;
|
||
|
NLS_STR nlsShare;
|
||
|
if ( ((err = nlsShare.QueryError()) != NERR_Success )
|
||
|
|| ((err = _psleShare->QueryText( &nlsShare ))
|
||
|
!= NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
::MsgPopup( pcw->QueryOwnerHwnd(), err );
|
||
|
return GROUP_NO_CHANGE;
|
||
|
}
|
||
|
|
||
|
ALIAS_STR nlsAdmin( ADMIN_SHARE );
|
||
|
ALIAS_STR nlsIPC( IPC_SHARE );
|
||
|
|
||
|
if ( ( nlsShare._stricmp( nlsAdmin ) == 0 )
|
||
|
|| ( nlsShare._stricmp( nlsIPC ) == 0 )
|
||
|
)
|
||
|
{
|
||
|
fEnable = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_pdlg->QueryPBPermissions()->Enable( fEnable );
|
||
|
|
||
|
if ( !fShareEmpty )
|
||
|
_pdlg->QueryPBOK()->MakeDefault();
|
||
|
else
|
||
|
_pdlg->QueryPBCancel()->MakeDefault();
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
UIASSERT( FALSE );
|
||
|
}
|
||
|
|
||
|
return GROUP_NO_CHANGE;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SVRMGR_NEW_SHARE_DIALOG::SVRMGR_NEW_SHARE_DIALOG
|
||
|
|
||
|
SYNOPSIS: Constructor
|
||
|
|
||
|
ENTRY: hwndParent - hwnd of the parent window
|
||
|
pszComputer - the selected directory in the file manager
|
||
|
ulHelpContextBase - the base help context
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/25/91 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
SVRMGR_NEW_SHARE_DIALOG::SVRMGR_NEW_SHARE_DIALOG( HWND hwndParent,
|
||
|
SERVER_WITH_PASSWORD_PROMPT *psvr,
|
||
|
ULONG ulHelpContextBase )
|
||
|
: ADD_SHARE_DIALOG_BASE( MAKEINTRESOURCE(IDD_SHARECREATEDLG),
|
||
|
hwndParent,
|
||
|
ulHelpContextBase ),
|
||
|
_shareGrp( this, QuerySLEShare() ),
|
||
|
_psvr( psvr )
|
||
|
{
|
||
|
UIASSERT( psvr != NULL );
|
||
|
|
||
|
if ( QueryError() != NERR_Success )
|
||
|
return;
|
||
|
|
||
|
APIERR err;
|
||
|
if ( ((err = _shareGrp.QueryError()) != NERR_Success)
|
||
|
|| ((err = SetMaxUserLimit(DetermineUserLimit(_psvr))) != NERR_Success)
|
||
|
)
|
||
|
{
|
||
|
ReportError( err );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
QueryPBCancel()->MakeDefault();
|
||
|
QueryPBPermissions()->Enable( FALSE );
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SVRMGR_NEW_SHARE_DIALOG::~SVRMGR_NEW_SHARE_DIALOG
|
||
|
|
||
|
SYNOPSIS: Destructor
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/25/91 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
SVRMGR_NEW_SHARE_DIALOG::~SVRMGR_NEW_SHARE_DIALOG()
|
||
|
{
|
||
|
_psvr = NULL;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SVRMGR_NEW_SHARE_DIALOG::QueryServer2
|
||
|
|
||
|
SYNOPSIS: Get the server object
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT: *ppsvr - pointer to the server object
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/25/91 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
APIERR SVRMGR_NEW_SHARE_DIALOG::QueryServer2(
|
||
|
SERVER_WITH_PASSWORD_PROMPT **ppsvr )
|
||
|
{
|
||
|
UIASSERT( _psvr != NULL );
|
||
|
*ppsvr = _psvr;
|
||
|
return NERR_Success;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SVRMGR_NEW_SHARE_DIALOG::OnOK
|
||
|
|
||
|
SYNOPSIS: Create the share when the user clicks on the OK button
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 1/8/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
BOOL SVRMGR_NEW_SHARE_DIALOG::OnOK( VOID )
|
||
|
{
|
||
|
AUTO_CURSOR autocur;
|
||
|
|
||
|
if ( OnAddShare( _psvr ) )
|
||
|
Dismiss( TRUE );
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SVRMGR_NEW_SHARE_DIALOG::QueryHelpContext
|
||
|
|
||
|
SYNOPSIS: Get the help context of the dialog
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS: Return the help context
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 1/8/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
ULONG SVRMGR_NEW_SHARE_DIALOG::QueryHelpContext( VOID )
|
||
|
{
|
||
|
return QueryHelpContextBase() + HC_SVRMGRNEWSHARE;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SVRMGR_NEW_SHARE_GROUP::SVRMGR_NEW_SHARE_GROUP
|
||
|
|
||
|
SYNOPSIS: Constructor
|
||
|
|
||
|
ENTRY: pdlg - pointer to the server manager new share dialog
|
||
|
psleShare - pointer to the Share SLE
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 3/12/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
SVRMGR_NEW_SHARE_GROUP::SVRMGR_NEW_SHARE_GROUP( SVRMGR_NEW_SHARE_DIALOG *pdlg,
|
||
|
SLE *psleShare )
|
||
|
: _psleShare( psleShare ),
|
||
|
_pdlg( pdlg )
|
||
|
{
|
||
|
UIASSERT( psleShare );
|
||
|
UIASSERT( pdlg );
|
||
|
|
||
|
_psleShare->SetGroup( this );
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SVRMGR_NEW_SHARE_GROUP::~SVRMGR_NEW_SHARE_GROUP
|
||
|
|
||
|
SYNOPSIS: Destructor
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 3/12/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
SVRMGR_NEW_SHARE_GROUP::~SVRMGR_NEW_SHARE_GROUP()
|
||
|
{
|
||
|
_psleShare = NULL;
|
||
|
_pdlg = NULL;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SVRMGR_NEW_SHARE_GROUP::OnUserAction
|
||
|
|
||
|
SYNOPSIS: If share name SLE is empty, set the default button
|
||
|
to CANCEL, else set the default button to OK.
|
||
|
We will also disable the permissions button if
|
||
|
necessary.
|
||
|
|
||
|
ENTRY: pcw - the control window that the event was sent to
|
||
|
e - the event that occurred
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 3/12/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
APIERR SVRMGR_NEW_SHARE_GROUP::OnUserAction( CONTROL_WINDOW *pcw,
|
||
|
const CONTROL_EVENT &e )
|
||
|
{
|
||
|
if ( pcw == _psleShare )
|
||
|
{
|
||
|
if ( e.QueryCode() == EN_CHANGE )
|
||
|
{
|
||
|
SERVER_WITH_PASSWORD_PROMPT *psvr;
|
||
|
APIERR err = _pdlg->QueryServer2( &psvr );
|
||
|
|
||
|
if ( err != NERR_Success )
|
||
|
{
|
||
|
::MsgPopup( pcw->QueryOwnerHwnd(), err );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
|
||
|
BOOL fShareEmpty = ( _psleShare->QueryTextLength() == 0 );
|
||
|
|
||
|
if ( !fShareEmpty )
|
||
|
{
|
||
|
_pdlg->QueryPBOK()->MakeDefault();
|
||
|
|
||
|
// Enable the permissions button if the server
|
||
|
// is an NT server or an LM share-level server.
|
||
|
// LM user-level servers should already have
|
||
|
// the permissions button grayed.
|
||
|
if ( psvr->IsNT() || psvr->IsShareLevel() )
|
||
|
_pdlg->QueryPBPermissions()->Enable( TRUE );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
_pdlg->QueryPBCancel()->MakeDefault();
|
||
|
|
||
|
// Disable the permissions button if the server
|
||
|
// is an NT server or an LM share-level server
|
||
|
// LM user-level servers should already have
|
||
|
// the permissions button grayed.
|
||
|
if ( psvr->IsNT() || psvr->IsShareLevel() )
|
||
|
_pdlg->QueryPBPermissions()->Enable( FALSE );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return GROUP_NO_CHANGE;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SVRMGR_SHARE_PROP_DIALOG::SVRMGR_SHARE_PROP_DIALOG
|
||
|
|
||
|
SYNOPSIS: Constructor
|
||
|
|
||
|
ENTRY: hwndParent - hwnd of the parent window
|
||
|
pszComputer - the computer that the share is on
|
||
|
pszShare - the name of the share
|
||
|
ulHelpContextBase - the base help context
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/3/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
SVRMGR_SHARE_PROP_DIALOG::SVRMGR_SHARE_PROP_DIALOG( HWND hwndParent,
|
||
|
SERVER_WITH_PASSWORD_PROMPT *psvr,
|
||
|
const TCHAR *pszShare,
|
||
|
ULONG ulHelpContextBase )
|
||
|
: ADD_SHARE_DIALOG_BASE( MAKEINTRESOURCE(IDD_SVRMGRSHAREPROPDLG),
|
||
|
hwndParent,
|
||
|
ulHelpContextBase ),
|
||
|
_nlsStoredPath(), // the original path of the share
|
||
|
_psvr( psvr ),
|
||
|
_fDeleted( FALSE )
|
||
|
{
|
||
|
UIASSERT( psvr != NULL );
|
||
|
|
||
|
if ( QueryError() != NERR_Success )
|
||
|
return;
|
||
|
|
||
|
APIERR err;
|
||
|
if ( ((err = _nlsStoredPath.QueryError()) != NERR_Success )
|
||
|
|| ((err = SetMaxUserLimit( DetermineUserLimit(_psvr) )) != NERR_Success)
|
||
|
|| ((err = UpdateInfo( _psvr, pszShare )) != NERR_Success )
|
||
|
|| ((err = QueryPath( &_nlsStoredPath )) != NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
ReportError( err );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( !_psvr->IsNT() && _psvr->IsUserLevel() )
|
||
|
QueryPBPermissions()->Enable( FALSE );
|
||
|
|
||
|
SetShare( pszShare );
|
||
|
SetFocusOnComment();
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SVRMGR_SHARE_PROP_DIALOG::~SVRMGR_SHARE_PROP_DIALOG
|
||
|
|
||
|
SYNOPSIS: Destructor
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES: We don't need to delete _psvr. We'll leave it to whoever
|
||
|
that creates it.
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/3/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
SVRMGR_SHARE_PROP_DIALOG::~SVRMGR_SHARE_PROP_DIALOG()
|
||
|
{
|
||
|
_psvr = NULL;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SVRMGR_SHARE_PROP_DIALOG::QueryServer2
|
||
|
|
||
|
SYNOPSIS: Get the server object
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT: *ppsvr - pointer to the server object
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/3/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
APIERR SVRMGR_SHARE_PROP_DIALOG::QueryServer2(
|
||
|
SERVER_WITH_PASSWORD_PROMPT **ppsvr )
|
||
|
{
|
||
|
UIASSERT( _psvr != NULL );
|
||
|
*ppsvr = _psvr;
|
||
|
return NERR_Success;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SVRMGR_SHARE_PROP_DIALOG::StopShareIfNecessary
|
||
|
|
||
|
SYNOPSIS: Check if the user has changed the path of the directory
|
||
|
If so, stop sharing the old share.
|
||
|
|
||
|
ENTRY: pszShare - the name of the share
|
||
|
pfDeleteShare - pointer to a flag indicating whether
|
||
|
the share has been deleted or not
|
||
|
pfCancel - pointer to a flag indicating whether
|
||
|
the user has cancelled changing the
|
||
|
properties of the share
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/3/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
APIERR SVRMGR_SHARE_PROP_DIALOG::StopShareIfNecessary( const TCHAR *pszShare,
|
||
|
BOOL *pfDeleteShare,
|
||
|
BOOL *pfCancel )
|
||
|
{
|
||
|
|
||
|
UIASSERT( pfCancel != NULL );
|
||
|
*pfCancel = FALSE;
|
||
|
UIASSERT( pfDeleteShare != NULL );
|
||
|
*pfDeleteShare = FALSE;
|
||
|
|
||
|
//
|
||
|
// If the share has already been deleted,
|
||
|
// just return
|
||
|
//
|
||
|
if ( _fDeleted )
|
||
|
{
|
||
|
*pfDeleteShare = TRUE;
|
||
|
return NERR_Success;
|
||
|
}
|
||
|
|
||
|
APIERR err;
|
||
|
ALIAS_STR nlsShare( pszShare );
|
||
|
do { // Not a loop
|
||
|
|
||
|
//
|
||
|
// Get and validate the path
|
||
|
//
|
||
|
NLS_STR nlsPath;
|
||
|
if ( ((err = nlsPath.QueryError()) != NERR_Success )
|
||
|
|| ((err = QueryPath( &nlsPath )) != NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
ALIAS_STR nlsAdmin( ADMIN_SHARE );
|
||
|
ALIAS_STR nlsIPC( IPC_SHARE );
|
||
|
|
||
|
if ( ( nlsPath.QueryTextLength() != 0 )
|
||
|
|| ( nlsShare._stricmp( nlsIPC ) != 0 )
|
||
|
)
|
||
|
{
|
||
|
NET_NAME netName( nlsPath, TYPE_PATH_ABS );
|
||
|
if ((err = netName.QueryError()) != NERR_Success )
|
||
|
{
|
||
|
if ( err == ERROR_INVALID_NAME )
|
||
|
err = IERR_SHARE_INVALID_LOCAL_PATH;
|
||
|
SetFocusOnPath();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// If the path is of the form "x:", append a "\"
|
||
|
//
|
||
|
if ( nlsPath.QueryTextLength() == 2 )
|
||
|
{
|
||
|
if ((err = nlsPath.AppendChar( PATH_SEPARATOR)) != NERR_Success)
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
BOOL fPathSame;
|
||
|
if ( nlsPath._stricmp( _nlsStoredPath ) == 0 )
|
||
|
{
|
||
|
fPathSame = TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
fPathSame = FALSE;
|
||
|
}
|
||
|
|
||
|
MSGID msgid;
|
||
|
NLS_STR *apnlsParams[ 5 ];
|
||
|
apnlsParams[0] = &_nlsStoredPath;
|
||
|
apnlsParams[1] = &nlsShare;
|
||
|
INT i = 2;
|
||
|
|
||
|
//
|
||
|
// If the share is ADMIN$ or IPC$, and the path has changed
|
||
|
// popup an error.
|
||
|
//
|
||
|
if ( ( nlsShare._stricmp( nlsAdmin ) == 0 )
|
||
|
|| ( nlsShare._stricmp( nlsIPC) == 0 )
|
||
|
)
|
||
|
{
|
||
|
if ( !fPathSame )
|
||
|
{
|
||
|
if ( IDNO == ::MsgPopup( this,
|
||
|
IERR_SPECIAL_SHARE_CANNOT_CHANGE_PATH,
|
||
|
MPSEV_WARNING, MP_YESNO, MP_YES ) )
|
||
|
{
|
||
|
*pfCancel = TRUE;
|
||
|
SetPath( _nlsStoredPath );
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// If the path has changed, popup an warning asking the
|
||
|
// user if he really wants to change the path.
|
||
|
//
|
||
|
if ( !fPathSame )
|
||
|
{
|
||
|
msgid = IDS_CHANGE_PATH_WARNING;
|
||
|
apnlsParams[ i++ ] = &nlsPath;
|
||
|
apnlsParams[ i++ ] = &nlsShare;
|
||
|
apnlsParams[ i ] = NULL;
|
||
|
|
||
|
if ( IDNO == ::MsgPopup( this, msgid, MPSEV_WARNING,
|
||
|
HC_DEFAULT_HELP, MP_YESNO,
|
||
|
apnlsParams, MP_NO ))
|
||
|
{
|
||
|
*pfCancel = TRUE;
|
||
|
SetPath( _nlsStoredPath );
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// If there are users connected to the share, popup the
|
||
|
// warning dialog listing all users currently connected to the share.
|
||
|
//
|
||
|
|
||
|
SHARE_2 sh2( nlsShare, _psvr->QueryName(), FALSE );
|
||
|
|
||
|
if ( (( err = sh2.QueryError()) == NERR_Success )
|
||
|
&& (( err = sh2.GetInfo()) == NERR_Success )
|
||
|
&& ( sh2.QueryCurrentUses() > 0 )
|
||
|
)
|
||
|
{
|
||
|
|
||
|
BOOL fOK = TRUE;
|
||
|
// There are users currently connected to the share to be deleted,
|
||
|
// hence, popup a warning.
|
||
|
CURRENT_USERS_WARNING_DIALOG *pdlg =
|
||
|
new CURRENT_USERS_WARNING_DIALOG( QueryRobustHwnd(),
|
||
|
_psvr->QueryName(),
|
||
|
nlsShare,
|
||
|
QueryHelpContextBase() );
|
||
|
|
||
|
|
||
|
if ( ( pdlg == NULL )
|
||
|
|| ((err = pdlg->QueryError()) != NERR_Success )
|
||
|
|| ((err = pdlg->Process( &fOK )) != NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
err = err? err : (APIERR) ERROR_NOT_ENOUGH_MEMORY;
|
||
|
}
|
||
|
|
||
|
delete pdlg;
|
||
|
|
||
|
// User clicked CANCEL for the pdlg
|
||
|
if ( !err && !fOK )
|
||
|
{
|
||
|
*pfCancel = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
if ( err != NERR_Success )
|
||
|
break;
|
||
|
|
||
|
//
|
||
|
// If all is well so far, read the share permissions. When the
|
||
|
// share is deleted and recreated, the permissions will be
|
||
|
// reinstantiated as if the user had pressed "Permissions" in
|
||
|
// the New Share dialog. Otherwise the permissions will be lost
|
||
|
// when the share is "renamed".
|
||
|
//
|
||
|
|
||
|
if ( (err = UpdatePermissionsInfo( _psvr,
|
||
|
&sh2,
|
||
|
pszShare )) != NERR_Success )
|
||
|
{
|
||
|
DBGEOL( "SRVMGR_SHARE_PROP_DIALOG::StopShareIfNecessary: error loading permissions" );
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// We also must set this flag to ensure that permissions will be
|
||
|
// written on the new share
|
||
|
//
|
||
|
SetSecDescModified();
|
||
|
|
||
|
//
|
||
|
// Delete the share if everything went fine.
|
||
|
//
|
||
|
if ( (err = sh2.Delete()) == NERR_Success )
|
||
|
*pfDeleteShare = TRUE;
|
||
|
|
||
|
// falls through if error occurs
|
||
|
} while ( FALSE );
|
||
|
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SVRMGR_SHARE_PROP_DIALOG::OnOK
|
||
|
|
||
|
SYNOPSIS: Change the properties of the share when the user
|
||
|
clicks OK button
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 1/8/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
BOOL SVRMGR_SHARE_PROP_DIALOG::OnOK( VOID )
|
||
|
{
|
||
|
AUTO_CURSOR autocur;
|
||
|
|
||
|
BOOL fDeleteShare;
|
||
|
BOOL fCancel;
|
||
|
APIERR err;
|
||
|
NLS_STR nlsShare;
|
||
|
|
||
|
if ( ((err = nlsShare.QueryError()) == NERR_Success )
|
||
|
&& ((err = QueryShare( &nlsShare )) == NERR_Success )
|
||
|
&& ((err = StopShareIfNecessary( nlsShare, &fDeleteShare, &fCancel ))
|
||
|
== NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
if ( !fCancel )
|
||
|
{
|
||
|
//
|
||
|
// If the share is deleted because the user change the path,
|
||
|
// create a new share with the same name.
|
||
|
//
|
||
|
if ( fDeleteShare )
|
||
|
{
|
||
|
_fDeleted = TRUE;
|
||
|
if ( OnAddShare( _psvr ) )
|
||
|
{
|
||
|
Dismiss( TRUE );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Else change the properties of the existing share
|
||
|
//
|
||
|
else
|
||
|
{
|
||
|
err = OnChangeShareProperty( _psvr, nlsShare );
|
||
|
|
||
|
switch ( err )
|
||
|
{
|
||
|
case NERR_Success:
|
||
|
Dismiss( FALSE );
|
||
|
break;
|
||
|
|
||
|
case NERR_NetNameNotFound:
|
||
|
Dismiss( TRUE );
|
||
|
break;
|
||
|
|
||
|
case NERR_BadTransactConfig:
|
||
|
Dismiss( FALSE );
|
||
|
break;
|
||
|
|
||
|
case IERR_USER_CLICKED_CANCEL:
|
||
|
err = NERR_Success;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ( err == NERR_BadTransactConfig )
|
||
|
Dismiss( FALSE );
|
||
|
QuerySLEPath()->SelectString();
|
||
|
QuerySLEPath()->ClaimFocus();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( err != NERR_Success )
|
||
|
::MsgPopup( this, err );
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SVRMGR_SHARE_PROP_DIALOG::OnCancel
|
||
|
|
||
|
SYNOPSIS: Dismiss the dialog when the user clicks the CANCEL
|
||
|
button.
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 1/8/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
BOOL SVRMGR_SHARE_PROP_DIALOG::OnCancel( VOID )
|
||
|
{
|
||
|
Dismiss( _fDeleted );
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SVRMGR_SHARE_PROP_DIALOG::QueryHelpContext
|
||
|
|
||
|
SYNOPSIS: Get the help context of the dialog
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS: Return the help context
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 1/8/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
ULONG SVRMGR_SHARE_PROP_DIALOG::QueryHelpContext( VOID )
|
||
|
{
|
||
|
return QueryHelpContextBase() + HC_SVRMGRSHAREPROP;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_SHARE_PROP_DIALOG::FILEMGR_SHARE_PROP_DIALOG
|
||
|
|
||
|
SYNOPSIS: Constructor
|
||
|
|
||
|
ENTRY: hwndParent - hwnd of the parent window
|
||
|
pszSelectedDir - name of the selected directory.
|
||
|
ulHelpContextBase - the base help context
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/25/91 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
FILEMGR_SHARE_PROP_DIALOG::FILEMGR_SHARE_PROP_DIALOG( HWND hwndParent,
|
||
|
const TCHAR *pszSelectedDir,
|
||
|
ULONG ulHelpContextBase )
|
||
|
: SHARE_DIALOG_BASE( MAKEINTRESOURCE(IDD_FILEMGRSHAREPROPDLG),
|
||
|
hwndParent,
|
||
|
ulHelpContextBase ),
|
||
|
_cbShare( this, CB_SHARE ),
|
||
|
_nlsLocalPath(),
|
||
|
_fShowDefault( TRUE ),
|
||
|
_fCreatedShare( FALSE ),
|
||
|
_psvr( NULL )
|
||
|
{
|
||
|
if ( QueryError() != NERR_Success )
|
||
|
return;
|
||
|
|
||
|
UIASSERT( pszSelectedDir != NULL );
|
||
|
|
||
|
APIERR err;
|
||
|
if ( ((err = _nlsLocalPath.QueryError()) != NERR_Success )
|
||
|
|| ((err = Init( pszSelectedDir )) != NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
ReportError( err );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( !_psvr->IsNT() && _psvr->IsUserLevel() )
|
||
|
QueryPBPermissions()->Enable( FALSE );
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_SHARE_PROP_DIALOG::~FILEMGR_SHARE_PROP_DIALOG
|
||
|
|
||
|
SYNOPSIS: Destructor
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/25/91 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
FILEMGR_SHARE_PROP_DIALOG::~FILEMGR_SHARE_PROP_DIALOG()
|
||
|
{
|
||
|
delete _psvr;
|
||
|
_psvr = NULL;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_SHARE_PROP_DIALOG::QueryServer2
|
||
|
|
||
|
SYNOPSIS: Get the server object
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT: *ppsvr - pointer to server object
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/25/91 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
APIERR FILEMGR_SHARE_PROP_DIALOG::QueryServer2(
|
||
|
SERVER_WITH_PASSWORD_PROMPT **ppsvr )
|
||
|
{
|
||
|
UIASSERT( _psvr != NULL );
|
||
|
*ppsvr = _psvr;
|
||
|
return NERR_Success;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_SHARE_PROP_DIALOG::Init
|
||
|
|
||
|
SYNOPSIS: 2nd stage constructor
|
||
|
|
||
|
ENTRY: pszSelectedDir - name of the selected directory
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES: Set up all internal variables and display the
|
||
|
correct information in the dialog
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 4/2/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
APIERR FILEMGR_SHARE_PROP_DIALOG::Init( const TCHAR *pszSelectedDir )
|
||
|
{
|
||
|
|
||
|
APIERR err;
|
||
|
|
||
|
NLS_STR nlsComputer;
|
||
|
NLS_STR nlsUNCPath;
|
||
|
SHARE_NET_NAME netName( pszSelectedDir, TYPE_PATH_ABS );
|
||
|
|
||
|
if ( ((err = nlsComputer.QueryError()) == NERR_Success )
|
||
|
&& ((err = nlsUNCPath.QueryError()) == NERR_Success )
|
||
|
&& ((err = netName.QueryError()) == NERR_Success )
|
||
|
&& ((err = netName.QueryComputerName( &nlsComputer)) == NERR_Success)
|
||
|
&& ((err = netName.QueryLocalPath( &_nlsLocalPath)) == NERR_Success)
|
||
|
)
|
||
|
{
|
||
|
if ( netName.IsLocal( &err ) && ( err == NERR_Success ))
|
||
|
{
|
||
|
nlsComputer = EMPTY_STRING;
|
||
|
if ( nlsComputer.QueryError() != NERR_Success )
|
||
|
return nlsComputer.QueryError();
|
||
|
}
|
||
|
|
||
|
_psvr = new SERVER_WITH_PASSWORD_PROMPT( nlsComputer,
|
||
|
QueryHwnd(),
|
||
|
QueryHelpContextBase() );
|
||
|
if ( ( _psvr != NULL )
|
||
|
&& ((err = _psvr->QueryError()) == NERR_Success )
|
||
|
&& ((err = _psvr->GetInfo()) == NERR_Success )
|
||
|
&& ((err = SetMaxUserLimit( DetermineUserLimit(_psvr) )) == NERR_Success)
|
||
|
&& ((err = Refresh()) == NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
BOOL fLocal = netName.IsLocal( &err );
|
||
|
if (( err == NERR_Success ) && !fLocal )
|
||
|
{
|
||
|
if ((err = netName.QueryUNCPath( &nlsUNCPath )) == NERR_Success)
|
||
|
SetPath( nlsUNCPath );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
SetPath( _nlsLocalPath );
|
||
|
}
|
||
|
|
||
|
_cbShare.ClaimFocus();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
err = err? err : ERROR_NOT_ENOUGH_MEMORY;
|
||
|
delete _psvr;
|
||
|
_psvr = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_SHARE_PROP_DIALOG::Refresh
|
||
|
|
||
|
SYNOPSIS: Refresh the combo box after the user created a new
|
||
|
share
|
||
|
|
||
|
ENTRY: pszNewShareName - Optional parameter indicating
|
||
|
what share to select after the refresh
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 4/2/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
APIERR FILEMGR_SHARE_PROP_DIALOG::Refresh( const TCHAR *pszNewShareName )
|
||
|
{
|
||
|
AUTO_CURSOR autocur;
|
||
|
|
||
|
APIERR err;
|
||
|
SHARE2_ENUM sh2Enum( _psvr->QueryName() );
|
||
|
NET_NAME netName( _nlsLocalPath, TYPE_PATH_ABS );
|
||
|
NLS_STR nlsDefaultShare;
|
||
|
|
||
|
do {
|
||
|
|
||
|
if ( ((err = sh2Enum.QueryError()) != NERR_Success )
|
||
|
|| ((err = netName.QueryError()) != NERR_Success )
|
||
|
|| ((err = nlsDefaultShare.QueryError()) != NERR_Success )
|
||
|
|| ((err = sh2Enum.GetInfo()) != NERR_Success )
|
||
|
|| ((err = netName.QueryLastComponent( &nlsDefaultShare))
|
||
|
!= NERR_Success)
|
||
|
)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
_cbShare.DeleteAllItems();
|
||
|
|
||
|
SHARE2_ENUM_ITER sh2EnumIter( sh2Enum );
|
||
|
const SHARE2_ENUM_OBJ *pshi2;
|
||
|
while ( (pshi2 = sh2EnumIter()) != NULL )
|
||
|
{
|
||
|
if ( ::stricmpf( pshi2->QueryPath(), _nlsLocalPath ) == 0 )
|
||
|
{
|
||
|
ALIAS_STR nlsTemp( pshi2->QueryName() );
|
||
|
if ( _cbShare.AddItem( nlsTemp ) < 0 )
|
||
|
{
|
||
|
err = ERROR_NOT_ENOUGH_MEMORY;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( ::stricmpf( pshi2->QueryName(), nlsDefaultShare ) == 0 )
|
||
|
_fShowDefault = FALSE;
|
||
|
|
||
|
}
|
||
|
|
||
|
if ( err != NERR_Success )
|
||
|
break;
|
||
|
|
||
|
if ( _cbShare.QueryCount() == 0 )
|
||
|
{
|
||
|
err = IERR_SHARE_DIR_NOT_SHARED;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
INT nSel = 0;
|
||
|
if ( pszNewShareName )
|
||
|
nSel = _cbShare.FindItemExact( pszNewShareName );
|
||
|
|
||
|
_cbShare.SelectItem( nSel >= 0 ? nSel : 0 );
|
||
|
|
||
|
NLS_STR nlsShare;
|
||
|
if ( ((err = nlsShare.QueryError()) != NERR_Success )
|
||
|
|| ((err = QueryShare( &nlsShare )) != NERR_Success )
|
||
|
|| ((err = UpdateInfo( _psvr, nlsShare )) != NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
} while ( FALSE );
|
||
|
|
||
|
return err;
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_SHARE_PROP_DIALOG::OnCommand
|
||
|
|
||
|
SYNOPSIS: Check when the user changes the selection in the combobox
|
||
|
or when the user clicks on the new share button
|
||
|
|
||
|
ENTRY: event - the event that occurred
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 1/8/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
BOOL FILEMGR_SHARE_PROP_DIALOG::OnCommand( const CONTROL_EVENT &event )
|
||
|
{
|
||
|
APIERR err = NERR_Success;
|
||
|
|
||
|
if ( ( event.QueryCid() == CB_SHARE )
|
||
|
&& ( event.QueryCode() == CBN_SELCHANGE )
|
||
|
)
|
||
|
{
|
||
|
//
|
||
|
// When the user changes the selection in the listbox,
|
||
|
// get the share the user has selected and display its
|
||
|
// information in the dialog
|
||
|
//
|
||
|
NLS_STR nlsShare;
|
||
|
if ( ((err = nlsShare.QueryError()) != NERR_Success )
|
||
|
|| ((err = QueryShare( &nlsShare )) != NERR_Success )
|
||
|
|| ((err = UpdateInfo( _psvr, nlsShare )) != NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
// Nothing to do
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else if ( event.QueryCid() == BUTTON_NEWSHARE )
|
||
|
{
|
||
|
//
|
||
|
// The user clicked on the new share button, hence, show
|
||
|
// the new share dialog.
|
||
|
//
|
||
|
NLS_STR nlsPath;
|
||
|
NLS_STR nlsNewShareName;
|
||
|
|
||
|
if ( ((err = nlsPath.QueryError()) == NERR_Success )
|
||
|
&& ((err = nlsNewShareName.QueryError()) == NERR_Success )
|
||
|
&& ((err = QueryPath( &nlsPath)) == NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
FILEMGR_NEW_SHARE_DIALOG *pdlg =
|
||
|
new FILEMGR_NEW_SHARE_DIALOG( QueryHwnd(),
|
||
|
nlsPath,
|
||
|
QueryHelpContextBase(),
|
||
|
_fShowDefault,
|
||
|
&nlsNewShareName );
|
||
|
|
||
|
BOOL fCreated;
|
||
|
if ( ( pdlg != NULL )
|
||
|
&& ((err = pdlg->QueryError()) == NERR_Success )
|
||
|
&& ((err = pdlg->Process( &fCreated )) == NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
if ( fCreated )
|
||
|
{
|
||
|
err = Refresh( nlsNewShareName );
|
||
|
_fCreatedShare = TRUE;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
err = err? err : ERROR_NOT_ENOUGH_MEMORY;
|
||
|
}
|
||
|
|
||
|
delete pdlg;
|
||
|
pdlg = NULL;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return SHARE_DIALOG_BASE::OnCommand( event );
|
||
|
}
|
||
|
|
||
|
if ( err != NERR_Success )
|
||
|
{
|
||
|
::MsgPopup( this, err );
|
||
|
if ( err == IERR_SHARE_DIR_NOT_SHARED )
|
||
|
Dismiss( TRUE );
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_SHARE_PROP_DIALOG::OnOK
|
||
|
|
||
|
SYNOPSIS: Change the property of the selected share
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 1/8/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
BOOL FILEMGR_SHARE_PROP_DIALOG::OnOK( VOID )
|
||
|
{
|
||
|
AUTO_CURSOR autocur;
|
||
|
NLS_STR nlsShare;
|
||
|
APIERR err;
|
||
|
|
||
|
if ( ((err = nlsShare.QueryError()) == NERR_Success )
|
||
|
&& ((err = QueryShare( &nlsShare )) == NERR_Success )
|
||
|
)
|
||
|
{
|
||
|
|
||
|
err = OnChangeShareProperty( _psvr, nlsShare );
|
||
|
|
||
|
switch ( err )
|
||
|
{
|
||
|
case NERR_Success:
|
||
|
Dismiss( _fCreatedShare );
|
||
|
break;
|
||
|
|
||
|
case NERR_NetNameNotFound:
|
||
|
Dismiss( TRUE );
|
||
|
break;
|
||
|
|
||
|
case NERR_BadTransactConfig:
|
||
|
Dismiss( FALSE );
|
||
|
break;
|
||
|
|
||
|
case IERR_USER_CLICKED_CANCEL:
|
||
|
err = NERR_Success;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
if ( err != NERR_Success )
|
||
|
::MsgPopup( this, err );
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_SHARE_PROP_DIALOG::OnCancel
|
||
|
|
||
|
SYNOPSIS: Dismiss the dialog when the user clicks the Cancel
|
||
|
button
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS:
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 1/8/92 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
BOOL FILEMGR_SHARE_PROP_DIALOG::OnCancel( VOID )
|
||
|
{
|
||
|
Dismiss( _fCreatedShare );
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: FILEMGR_SHARE_PROP_DIALOG::QueryHelpContext
|
||
|
|
||
|
SYNOPSIS: Get the help context of the dialog
|
||
|
|
||
|
ENTRY:
|
||
|
|
||
|
EXIT:
|
||
|
|
||
|
RETURNS: Return the help context
|
||
|
|
||
|
NOTES:
|
||
|
|
||
|
HISTORY:
|
||
|
Yi-HsinS 8/25/91 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
ULONG FILEMGR_SHARE_PROP_DIALOG::QueryHelpContext( VOID )
|
||
|
{
|
||
|
return QueryHelpContextBase() + HC_FILEMGRSHAREPROP;
|
||
|
}
|
||
|
|