//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//
//  Copyright (C) Microsoft Corporation, 1996 - 1999
//
//  File:       permset.h
//
//  This file contains the definition of the CPermissionSet class
//
//--------------------------------------------------------------------------

#ifndef _PERMSET_H_
#define _PERMSET_H_

typedef struct _PERMISSION
{
    ACCESS_MASK mask;       // permission bits
    DWORD       dwFlags;    // AceFlags (e.g. inheritance bits)
    GUID        guid;       // often GUID_NULL
} PERMISSION, *PPERMISSION;

class CPermissionSet
{
private:
    HDSA m_hPermList;       // Dynamic array of PERMISSION structures
    HDPA m_hAdvPermList;    // Dynamic array of ACE pointers
    BOOL m_fObjectAcesPresent;

public:
    CPermissionSet() : m_hPermList(NULL), m_hAdvPermList(NULL), m_fObjectAcesPresent(FALSE) {}
    ~CPermissionSet() { Reset(); }

    void Reset();
    void ResetAdvanced();
    BOOL AddAce(const GUID *pguid, ACCESS_MASK mask, DWORD dwFlags);
    BOOL AddPermission(PPERMISSION pPerm);
    BOOL AddAdvancedAce(PACE_HEADER pAce);
    UINT GetPermCount(BOOL fIncludeAdvAces = FALSE) const;
    PPERMISSION GetPermission(UINT i) const { if (m_hPermList) return (PPERMISSION)DSA_GetItemPtr(m_hPermList, i); return NULL; }
    PPERMISSION operator[](UINT i) const { return GetPermission(i); }
    ULONG GetAclLength(ULONG cbSid) const;
    BOOL AppendToAcl(PACL pAcl, PACE_HEADER *ppAcePos, PSID pSid, BOOL fAllowAce, DWORD dwFlags) const;
    void ConvertInheritedAces(CPermissionSet &permInherited);
    void RemovePermission(PPERMISSION pPerm, BOOL bInheritFlag = FALSE);
};

// Flags for AppendToAcl
#define PS_NONOBJECT        0x00000001L
#define PS_OBJECT           0x00000002L


#endif  // _PERMSET_H_