/**********************************************************************/
/**                       Microsoft LAN Manager                      **/
/**                Copyright(c) Microsoft Corp., 1991                **/
/**********************************************************************/

/*
    LMOAcces.hxx

    This file contains the NEW_LM_OBJ rendition of the NetAccess APIs.


    FILE HISTORY:
        06-Aug-1991     Johnl       Reworked from Rustan's ACCPERM class
        21-Aug-1991     rustanl     Changed BufferQuery[...] methods to
                                    QueryBuffer[...].
        07-Oct-1991     terryk      type changes for NT
        17-Oct-1991     terryk      change the Required size of the
                                    structure
        21-Oct-1991     terryk      type changes for NT

*/

#ifndef _LMOACCES_HXX_
#define _LMOACCES_HXX_

#include "lmobj.hxx"

extern "C"
{
    #include <lmaccess.h>
}

#include "string.hxx"
#include "strlst.hxx"

typedef UINT PERM;
#define PERM_NO_SETTING         (0x0000)
#define PERM_READ               ACCESS_READ
#define PERM_WRITE              ACCESS_WRITE
#define PERM_EXEC               ACCESS_EXEC
#define PERM_CREATE             ACCESS_CREATE
#define PERM_DELETE             ACCESS_DELETE
#define PERM_ATTRIB             ACCESS_ATRIB    // sic.
#define PERM_PERM               ACCESS_PERM
#define PERM_DENY_ACCESS        ACCESS_GROUP    // Note, the PERM_ deny access
                                                // bit uses the ACCESS_
                                                // group bit, since the PERM_
                                                // bits don't include a
                                                // group bit, and vice versa.

/*************************************************************************

    NAME:       NET_ACCESS

    SYNOPSIS:   Base class for the NET_ACCESS LM objects

    INTERFACE:

        Delete
            Deletes the ACL from the resource.

    PARENT:

    USES:

    CAVEATS:

    NOTES:

    HISTORY:

**************************************************************************/

DLL_CLASS NET_ACCESS : public LOC_LM_OBJ
{
private:
    NLS_STR _nlsServer ;
    NLS_STR _nlsResource ;

protected:
    NET_ACCESS( const TCHAR * pszServer, const TCHAR * pszResource );
    ~NET_ACCESS() ;

public:
    virtual const TCHAR * QueryName( VOID ) const;
    const TCHAR * QueryServerName( VOID ) const;

    APIERR SetName( const TCHAR * pszResName ) ;
    APIERR SetServerName( const TCHAR * pszServerName ) ;

    APIERR Delete( void ) ;

};  // class NET_ACCESS


enum PERMNAME_TYPE      // nametype (for Name Type)
{
    PERMNAME_USER,
    PERMNAME_GROUP

};  // enum PERMNAME_TYPE

/*************************************************************************

    NAME:       NET_ACCESS_1

    SYNOPSIS:   LM OBJ class that encapsulates the NetAccess APIs at info
                level 1

    INTERFACE:

    PARENT:     NET_ACCESS

    USES:

    CAVEATS:

    NOTES:

    HISTORY:
        Johnl   06-Aug-1991     Reworked from Rustan's LM_OBJ class
        KeithMo 29-Oct-1991     Changed _cACE from ULONG to UINT.

**************************************************************************/

DLL_CLASS NET_ACCESS_1 : public NET_ACCESS
{
private:
    UINT _cACE;

    access_list * FindACE( const TCHAR * pszName, enum PERMNAME_TYPE nametype ) const;

#ifdef WIN32
    UINT QueryRequiredSpace( UINT cACE ) const
    { return ( sizeof( access_info_1 ) + MAX_PATH*sizeof(TCHAR) + sizeof(TCHAR) +
        cACE *( sizeof( access_list ) + UNLEN*sizeof(TCHAR) + sizeof(TCHAR) )); }

    /* Under Win32, the account names are not stored as inline arrays but
     * pointers into the API buffer.  If we add new names we will create
     * new NLS_STRs and store them in here.
     */
    STRLIST _strlstAccountNames ;

#else
    UINT QueryRequiredSpace( UINT cACE ) const
    { return ( sizeof( access_info_1 ) + cACE * (sizeof(access_list) )); }

#endif

    APIERR I_WriteInfoAux( VOID ) ;

protected:
    //  Note, Clone does the same thing as GetInfo does, only it gets
    //  the info from another object, rather than from the network.
    virtual APIERR I_GetInfo( VOID );
    //virtual APIERR I_Clone( const ACCPERM & accpermSource );
    virtual APIERR I_WriteInfo( VOID );
    virtual APIERR I_CreateNew( VOID ) ;
    virtual APIERR I_WriteNew( VOID ) ;

public:
    NET_ACCESS_1( const TCHAR * pszServer, const TCHAR * pszResource );
    ~NET_ACCESS_1() ;

    //  The following nametype parameter indicates whether the pszName
    //  is the name of a group or a user.
    PERM QueryPerm( const TCHAR * pszName, enum PERMNAME_TYPE nametype ) const;
    APIERR SetPerm( const TCHAR * pszName, enum PERMNAME_TYPE nametype, PERM perm );

    /* Copies the access permissions from the passed NET_ACCESS_1
     * parameter to this.
     */
    APIERR CopyAccessPerms( const NET_ACCESS_1 & netaccess1Src ) ;

    /*  The following method removes all ACEs
     */
    APIERR ClearPerms( VOID );

    UINT QueryACECount( VOID ) const;

    APIERR QueryFailingName( NLS_STR * pnls, enum PERMNAME_TYPE * pnametype ) const;

#ifdef WIN32
    access_list * QueryACE( UINT uiACE ) const
    { return (access_list *) (((BYTE*) QueryBufferPtr()) +
       ( sizeof( access_info_1 ) + uiACE * sizeof( access_list ))) ; }

#else
    access_list * QueryACE( UINT uiACE ) const
    { return (access_list *)
             (((TCHAR *)QueryBufferPtr()) + QueryRequiredSpace( uiACE )); }
#endif

    BOOL CompareACL( NET_ACCESS_1 * pnetacc1 ) ;

    UINT QueryAuditFlags( VOID ) const
    { return ((access_info_1 *)QueryBufferPtr())->acc1_attr ; }

    APIERR SetAuditFlags( short sAuditFlags ) ;

};  // class NET_ACCESS_1


#endif  // _LMOACCES_HXX_