windows-nt/Source/XPSP1/NT/admin/netui/shellui/share/sharebas.hxx
2020-09-26 16:20:57 +08:00

493 lines
15 KiB
C++

/**********************************************************************/
/** Microsoft Windows NT **/
/** Copyright(c) Microsoft Corp., 1991 **/
/**********************************************************************/
/*
* sharebas.hxx
* This file contains the Base Classes of the Share Dialogs in
* File Manager Extensions.
*
* The hierarchy of Share Dialogs is as follows:
*
* SHARE_DIALOG_BASE // in this file
* ADD_SHARE_DIALOG_BASE // in sharecrt.hxx
* FILEMGR_NEW_SHARE_DIALOG // in sharecrt.hxx
* SVRMGR_NEW_SHARE_DIALOG // in sharecrt.hxx
* SVRMGR_SHARE_PROP_DIALOG // in sharecrt.hxx
* FILEMGR_SHARE_PROP_DIALOG // in sharecrt.hxx
*
* VIEW_SHARE_DIALOG_BASE // in sharestp.hxx
* STOP_SHARING_DIALOG // in sharestp.hxx
* SHARE_MANAGEMENT_DIALOG // in sharemgt.hxx
*
* SHARE_LEVEL_PERMISSIONS_DIALOG // in this file
* CURRENT_USERS_WARNING_DIALOG // in sharestp.hxx
*
* PERMISSION_GROUP // in this file
*
* The following are some miscellaneous classes used.
* SHARE_NAME_WITH_PATH_ENUM_ITER // in this file
*
* The following class are used to manipulate path names.
* SHARE_NET_NAME // in this file
*
* FILE HISTORY:
* Yi-HsinS 8/15/91 Created
* Yi-HsinS 11/15/91 Changed all USHORT to UINT
* Yi-HsinS 12/5/91 Separated FULL_SHARE_NAME, UNC_NAME,
* RELATIVE_PATH_NAME into netname.hxx
* and combine them into NET_NAME
* Yi-HsinS 12/15/91 Added SHARE_NET_NAME
* Yi-HsinS 12/18/91 Make destructor of SHARE_PROPERTIES_BASE
* virtual
* Yi-HsinS 12/31/91 Unicode work - move ADMIN_SHARE to
* strchlit.hxx
* Yi-HsinS 1/8/92 Moved SHARE_PROPERTIES_BASE to
* sharewnp.hxx
* Terryk 4/17/92 Changed User limit from long to ulong
* Yi-HsinS 8/3/92 Rearrange the hierarchy again to match
* Winball dialogs
* Yi-HsinS 10/9/92 Add ulHelpContextBase to
* SHARE_DIALOG_BASE
* Yi-HsinS 11/20/92 Remove _sltAdminInfo
* ChuckC 31/1/93 Moved SERVER_WITH_PASSWORD_PROMPT to
* aprompt.hxx
*/
#ifndef _SHAREBAS_HXX_
#define _SHAREBAS_HXX_
#include <lmoesh.hxx> // for SHARE2_ENUM_ITER
#include <lmosrv.hxx> // for SERVER_2
#include <netname.hxx> // for NET_NAME
#include <security.hxx> // for OS_SECURITY_DESCRIPTOR
#include <slestrip.hxx> // for SLE_STRIP
#include <aprompt.hxx> // SERVER_WITH_PASSWORD_PROMPT
#define SHARE_NAME_LENGTH LM20_NNLEN // vs. NNLEN
#define SHARE_COMMENT_LENGTH LM20_MAXCOMMENTSZ // vs. MAXCOMMENTSZ
#define LANMAN_USERS_MAX 0xFFFE // Down-level Servers
// NOTE : There are some problems on what structure to send from
// WIN16 to NT servers or OS2 servers. For now, just assume that the
// maximum user limit that can be set on WIN16 to NT servers
// are the same as to OS2 servers.
#ifndef WIN32
#define NT_USERS_MAX LANMAN_USERS_MAX
#else
#define NT_USERS_MAX 0xFFFFFFFE // NT Servers
#endif
/*************************************************************************
NAME: SHARE_DIALOG_BASE
SYNOPSIS: The base class for new share dialogs and share
properties dialog contained in the file manager or
server manager. It contains the magic group
for User Limit, SLE for Comment field, SLE for the path,
the OK, Cancel, Permissions button and an SLT for showing
admin information.
INTERFACE: SHARE_DIALOG_BASE() - Constructor
~SHARE_DIALOG_BASE() - Destructor
QueryPBOK() - Return a pointer to the OK button
QueryPBCancel() - Return a pointer to the Cancel button
QueryPBPermissions() - Return a pointer to the Permission button
QueryServer2() - Return the SERVER_WITH_PASSWORD_PROMPT
object. Pure virtual method to be defined
in the derived classes.
QueryShare() - Query the name of the share in the dialog
This is a pure virtual method to be
defined in the derived classes.
PARENT: DIALOG_WINDOW
USES: SLE, SLT, MAGIC_GROUP, SPIN_SLE_NUM, SPIN_GROUP, PUSH_BUTTON
CAVEATS:
NOTES:
HISTORY:
Yi-HsinS 8/25/91 Created
Yi-HsinS 4/20/92 Got rid of uiSpecialUserLimit
**************************************************************************/
class SHARE_DIALOG_BASE : public DIALOG_WINDOW
{
private:
SLE _slePath;
SLE _sleComment;
MAGIC_GROUP _mgrpUserLimit;
SPIN_SLE_NUM _spsleUsers;
SPIN_GROUP _spgrpUsers;
PUSH_BUTTON _buttonOK;
PUSH_BUTTON _buttonCancel;
PUSH_BUTTON _buttonPermissions;
// Below are stored information for share permissions on NT
OS_SECURITY_DESCRIPTOR *_pStoredSecDesc;
BOOL _fSecDescModified;
// Below are stored information for share permissions on
// LM share-level server
NLS_STR _nlsStoredPassword;
UINT _uiStoredPermissions;
// Below are stored information about whether the share is admin only or not
BOOL _fStoredAdminOnly;
//
// Place to store the help context base
//
ULONG _ulHelpContextBase;
protected:
virtual BOOL OnCommand( const CONTROL_EVENT & event );
//
// Helper method called when the permissions button is pressed
//
VOID OnPermissions( VOID );
//
// Helper method for changing share properties of a share
//
APIERR OnChangeShareProperty( SERVER_WITH_PASSWORD_PROMPT *psvr,
const TCHAR *pszShare );
//
// Display the properties of the share on the server in the dialog
//
APIERR UpdateInfo( SERVER_WITH_PASSWORD_PROMPT *psvr,
const TCHAR *pszShare );
//
// Update the permissions information which will be displayed if
// the user hits the permissions button. Also called when a share
// will be "renamed" i.e. deleted and recreated.
//
APIERR UpdatePermissionsInfo( SERVER_WITH_PASSWORD_PROMPT *psvr,
SHARE_2 * psh2,
const TCHAR *pszShare );
//
// Used when the share is on NT servers - Write the share permissions out
//
APIERR ApplySharePermissions( const TCHAR *pszServer,
const TCHAR *pszShare,
const OS_SECURITY_DESCRIPTOR * posSecDesc) ;
//
// Used when the share is on NT servers - Query the permissions of the
// share.
//
APIERR QuerySharePermissions( const TCHAR *pszServer,
const TCHAR *pszShare,
OS_SECURITY_DESCRIPTOR ** pposSecDesc) ;
//
// Used by subclasses which want to force permissions to be written,
// in particular, by SVRMGR_SHARE_PROP_DIALOG when the user changes
// the path to a share.
//
VOID SetSecDescModified()
{ _fSecDescModified = TRUE; }
//
// Used only when the share is on LM 2.x share-level servers - query
// the permissions of the share
//
UINT QueryStoredPermissions( VOID ) const
{ return _uiStoredPermissions; }
//
// Used only when the share is on LM 2.x share-level servers - query
// the password of the share
//
const TCHAR *QueryStoredPassword( VOID ) const
{ return _nlsStoredPassword.QueryPch(); }
//
// Used only when the share is on NT servers - query the
// the security descriptor of the share
//
OS_SECURITY_DESCRIPTOR *QueryStoredSecDesc( VOID ) const
{ return _pStoredSecDesc; }
//
// Reset all the stored information - permission, password,
// security descriptors
//
APIERR ClearStoredInfo( VOID );
//
// Set the maximum number that will appear on the spin button
//
APIERR SetMaxUserLimit( ULONG ulMaxUserLimit );
//
// Query or set the contents of Path
//
APIERR QueryPath( NLS_STR *pnlsPath ) const
{ return _slePath.QueryText( pnlsPath ); }
VOID SetPath( const TCHAR *pszPath )
{ _slePath.SetText( pszPath ); }
//
// Query or set the contents of the SLE comment
//
APIERR QueryComment( NLS_STR *pnlsComment ) const
{ return _sleComment.QueryText( pnlsComment ); }
VOID SetComment( const TCHAR *pszComment )
{ _sleComment.SetText( pszComment ); }
//
// Query or set the contents of User Limit
//
ULONG QueryUserLimit( VOID ) const;
APIERR SetUserLimit( ULONG ulUserLimit );
//
// Set Focus on the controls - SLE comment or User Limit magic group
// This will be used by derived classes when error occurs.
//
VOID SetFocusOnPath( VOID )
{ _slePath.ClaimFocus(); _slePath.SelectString(); }
VOID SetFocusOnComment( VOID )
{ _sleComment.ClaimFocus(); _sleComment.SelectString(); }
VOID SetFocusOnUserLimit( VOID )
{ _mgrpUserLimit.SetControlValueFocus(); }
//
// Query pointers to the controls
//
SLE *QuerySLEPath( VOID )
{ return &_slePath; }
SLE *QuerySLEComment( VOID )
{ return &_sleComment; }
SPIN_SLE_NUM *QuerySpinSLEUsers( VOID )
{ return &_spsleUsers; }
public:
SHARE_DIALOG_BASE( const TCHAR *pszDlgResource,
HWND hwndParent,
ULONG ulHelpContextBase,
ULONG ulMaxUserLimit = NT_USERS_MAX );
virtual ~SHARE_DIALOG_BASE();
PUSH_BUTTON *QueryPBOK( VOID )
{ return &_buttonOK; }
PUSH_BUTTON *QueryPBCancel( VOID )
{ return &_buttonCancel; }
PUSH_BUTTON *QueryPBPermissions( VOID )
{ return &_buttonPermissions; }
virtual APIERR QueryServer2( SERVER_WITH_PASSWORD_PROMPT **ppsvr ) = 0;
virtual APIERR QueryShare( NLS_STR *pnlsShare ) const = 0;
ULONG QueryHelpContextBase( VOID ) const
{ return _ulHelpContextBase; }
};
/*************************************************************************
NAME: PERMISSION_GROUP
SYNOPSIS: The class contains a group to access permissions
on a LM 2.1 share level server. This class is used in
SHARE_LEVEL_PERMISSIONS_DIALOG.
INTERFACE: PERMISSION_GROUP()- Constructor
QueryPermission() - Query the permission in a bitmask
SetPermission() - Set the permission given a bitmask
ClaimFocus() - Set the focus to this group
SetFocusOnOther() - Set focus on Other Edit Field of the
magic group
PARENT: BASE
USES: SLE_STRIP, MAGIC_GROUP
CAVEATS:
NOTES:
HISTORY:
Yi-HsinS 8/25/91 Created
**************************************************************************/
class PERMISSION_GROUP: public BASE
{
private:
MAGIC_GROUP _mgrpPermission;
SLE_STRIP _sleOther;
//
// Check if the permission entered into the Other edit field is valid
// If valid, stored it in *pusPermission. Otherwise, return an error.
//
APIERR GetAndCheckOtherField( UINT *pusPermission ) const;
public:
PERMISSION_GROUP( OWNER_WINDOW *powin,
CID cidBase,
CID cidOtherEditField,
CID cidInitialSelection = RG_NO_SEL,
CONTROL_GROUP *pgroupOwner = NULL );
APIERR QueryPermission( UINT *pusPermission ) const;
APIERR SetPermission( UINT usPermission );
VOID ClaimFocus( VOID )
{ _mgrpPermission.SetControlValueFocus(); }
VOID SetFocusOnOther( VOID )
{ _sleOther.SelectString(); _sleOther.ClaimFocus(); }
};
/*************************************************************************
NAME: SHARE_LEVEL_PERMISSIONS_DIALOG
SYNOPSIS: This is the dialog for displaying the password and
permissions of the share if it's on a LM 2.x share-level server
INTERFACE: SHARE_LEVEL_PERMISSIONS_DIALOG() - Constructor
PARENT: DIALOG_WINDOW
USES: NLS_STR, SLE, PERMISSION_GROUP
CAVEATS:
NOTES: OnCancel is not redefined here. The default in the
DIALOG_WINDOW class serves the purpose - Dismiss( FALSE )
HISTORY:
Yi-HsinS 8/25/91 Created
**************************************************************************/
class SHARE_LEVEL_PERMISSIONS_DIALOG : public DIALOG_WINDOW
{
private:
//
// Place to store the password typed by the user
//
NLS_STR *_pnlsPassword;
//
// Place to store the permissions entered by the user
//
UINT *_puiPermissions;
PERMISSION_GROUP _permgrp;
SLE _slePassword;
//
// Place to store the help context base
//
ULONG _ulHelpContextBase;
protected:
virtual BOOL OnOK( VOID );
virtual ULONG QueryHelpContext( VOID );
public:
SHARE_LEVEL_PERMISSIONS_DIALOG( HWND hwndParent,
NLS_STR *pnlsPassword,
UINT *puiPermissions,
ULONG ulHelpContextBase );
};
/*************************************************************************
NAME: SHARE_NAME_WITH_PATH_ENUM_ITER
SYNOPSIS: The class for iterating the share names on the server with
the selected path. It is similar to SHARE2_ENUM_ITER
except that a pointer to share name is returned instead
of the whole share_info_2 and only the share names with
the same path as the selected path is returned.
INTERFACE: SHARE_NAME_WITH_PATH_ENUM_ITER() - Constructor
operator()() - Iterator
PARENT: BASE
USES: SHARE2_ENUM_ITER, NLS_STR
CAVEATS:
NOTES:
HISTORY:
Yi-HsinS 8/25/91 Created
**************************************************************************/
class SHARE_NAME_WITH_PATH_ENUM_ITER : public BASE
{
private:
SHARE2_ENUM_ITER _sh2EnumIter;
//
// The path that we want to match with the path of the shares returned.
//
NLS_STR _nlsActPath;
public:
SHARE_NAME_WITH_PATH_ENUM_ITER( SHARE2_ENUM &shPathEnum,
const NLS_STR &nlsActPath );
const TCHAR *operator()( VOID );
};
/*************************************************************************
NAME: SHARE_NET_NAME
SYNOPSIS: This class is actually the same as the NET_NAME class
except that its constructor checks for the errors of local
computer. If it's not sharable, find out whether the
local machine is not an NT machine or the Server service
on NT has not been started.
INTERFACE: SHARE_NET_NAME() - Constructor
PARENT: NET_NAME
USES:
CAVEATS:
NOTES:
HISTORY:
Yi-HsinS 12/15/91 Created
**************************************************************************/
class SHARE_NET_NAME : public NET_NAME
{
public:
SHARE_NET_NAME( const TCHAR *pszSharePath,
NETNAME_TYPE netNameType = TYPE_UNKNOWN );
};
#endif