#ifndef _ACLUI_H
#define _ACLUI_H
#if __GNUC__ >= 3
#pragma GCC system_header
#endif

#ifndef __OBJC__
#include <objbase.h>
#include <commctrl.h>
#include <accctrl.h>
#endif

#if !defined(_ACLUI_)
#define ACLUIAPI	DECLSPEC_IMPORT WINAPI
#else
#define ACLUIAPI	WINAPI
#endif

#ifdef __cplusplus
extern "C" {
#endif

typedef struct _SI_OBJECT_INFO
{
	DWORD dwFlags;
	HINSTANCE hInstance;
	LPWSTR pszServerName;
	LPWSTR pszObjectName;
	LPWSTR pszPageTitle;
	GUID guidObjectType;
} SI_OBJECT_INFO, *PSI_OBJECT_INFO;

/* values for SI_OBJECT_INFO.dwFlags */
#define SI_EDIT_PERMS				0x00000000L
#define SI_EDIT_OWNER				0x00000001L
#define SI_EDIT_AUDITS				0x00000002L
#define SI_CONTAINER				0x00000004L
#define SI_READONLY					0x00000008L
#define SI_ADVANCED					0x00000010L
#define SI_RESET					0x00000020L
#define SI_OWNER_READONLY			0x00000040L
#define SI_EDIT_PROPERTIES			0x00000080L
#define SI_OWNER_RECURSE			0x00000100L
#define SI_NO_ACL_PROTECT			0x00000200L
#define SI_NO_TREE_APPLY			0x00000400L
#define SI_PAGE_TITLE				0x00000800L
#define SI_SERVER_IS_DC				0x00001000L
#define SI_RESET_DACL_TREE			0x00004000L
#define SI_RESET_SACL_TREE			0x00008000L
#define SI_OBJECT_GUID				0x00010000L
#define SI_EDIT_EFFECTIVE			0x00020000L
#define SI_RESET_DACL				0x00040000L
#define SI_RESET_SACL				0x00080000L
#define SI_RESET_OWNER				0x00100000L
#define SI_NO_ADDITIONAL_PERMISSION	0x00200000L
#define SI_MAY_WRITE				0x10000000L

#define SI_EDIT_ALL     (SI_EDIT_PERMS | SI_EDIT_OWNER | SI_EDIT_AUDITS)


typedef struct _SI_ACCESS
{
	const GUID* pguid;
	ACCESS_MASK mask;
	LPCWSTR pszName;
	DWORD dwFlags;
} SI_ACCESS, *PSI_ACCESS;

/* values for SI_ACCESS.dwFlags */
#define SI_ACCESS_SPECIFIC			0x00010000L
#define SI_ACCESS_GENERAL			0x00020000L
#define SI_ACCESS_CONTAINER			0x00040000L
#define SI_ACCESS_PROPERTY			0x00080000L


typedef struct _SI_INHERIT_TYPE
{
	const GUID* pguid;
	ULONG dwFlags;
	LPCWSTR pszName;
} SI_INHERIT_TYPE, *PSI_INHERIT_TYPE;

/* values for SI_INHERIT_TYPE.dwFlags
   INHERIT_ONLY_ACE, CONTAINER_INHERIT_ACE, OBJECT_INHERIT_ACE
   defined elsewhere */


typedef enum _SI_PAGE_TYPE
{
	SI_PAGE_PERM = 0, 
	SI_PAGE_ADVPERM, 
	SI_PAGE_AUDIT, 
	SI_PAGE_OWNER
} SI_PAGE_TYPE;


#define PSPCB_SI_INITDIALOG	(WM_USER + 1)

#ifndef __ISecurityInformation_INTERFACE_DEFINED__
#define __ISecurityInformation_INTERFACE_DEFINED__
#undef INTERFACE
#define INTERFACE ISecurityInformation
DECLARE_INTERFACE_(ISecurityInformation, IUnknown)
{
		STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
		STDMETHOD_(ULONG,AddRef)(THIS) PURE;
		STDMETHOD_(ULONG,Release)(THIS) PURE;
		
		STDMETHOD(GetObjectInformation)(THIS_ PSI_OBJECT_INFO) PURE;
		STDMETHOD(GetSecurity)(THIS_ SECURITY_INFORMATION,PSECURITY_DESCRIPTOR*,BOOL) PURE;
		STDMETHOD(SetSecurity)(THIS_ SECURITY_INFORMATION,PSECURITY_DESCRIPTOR) PURE;
		STDMETHOD(GetAccessRights)(THIS_ const GUID*,DWORD,PSI_ACCESS*,ULONG*,ULONG*) PURE;
		STDMETHOD(MapGeneric)(THIS_ const GUID*,UCHAR*,ACCESS_MASK*) PURE;
		STDMETHOD(GetInheritTypes)(THIS_ PSI_INHERIT_TYPE*,ULONG*) PURE;
		STDMETHOD(PropertySheetPageCallback)(THIS_ HWND,UINT,SI_PAGE_TYPE) PURE;
};
typedef ISecurityInformation *LPSECURITYINFO;
#endif

/*
 * TODO: ISecurityInformation2, IEffectivePermission, ISecurityObjectTypeInfo
 */

extern DECLSPEC_IMPORT const IID IID_ISecurityInformation;


HPROPSHEETPAGE ACLUIAPI CreateSecurityPage(LPSECURITYINFO psi);
BOOL ACLUIAPI EditSecurity(HWND hwndOwner, LPSECURITYINFO psi);

#ifdef __cplusplus
}
#endif

#endif