// SecurityManager.h : Declaration of the CSecurityManager

#ifndef __SECURITYMANAGER_H_
#define __SECURITYMANAGER_H_

#include "resource.h"       // main symbols
#include "AppObject.h"
#include "Advisers.h"
#include "CloneObjectImpl.h"
#include "SecurityItemImpl.h"

/////////////////////////////////////////////////////////////////////////////
// CSecurityManager
class ATL_NO_VTABLE CSecurityManager : 
	public CComObjectRootEx<CComMultiThreadModel>,
	public CComCoClass<CSecurityManager, &CLSID_SecurityManager>,
	public CAppObjectRoot,
	public ISecurityManager,
	public ISecurityGroup,
	public ISecurityItemImpl<CSecurityManager>,
	public IStructureLevelImpl,
	public ISpecifyPropertyPagesImpl<CSecurityManager>,
	public CLogHelper<CSecurityManager>,
	public ICloneObjectImpl,
	public _IApplicationStateEvents,
	protected CAdviseManager
{
public:
	CSecurityManager() :
		CAppObjectRoot( CLSID_SecurityManager ),
		IStructureLevelImpl( CLSID_SecurityManager ),
		ISecurityItemImpl<CSecurityManager> (this),
		CLogHelper<CSecurityManager> (this)
	{
	}

	STDMETHOD(FinalConstruct)();
	STDMETHOD(FinalRelease)();

	DECLARE_APP_OBJECT_SUPPORT()
	DECLARE_OBJECT_LOCKS_FUNCTIONS()
	DECLARE_ADVISE_MANAGER_SUPPORT()

DECLARE_REGISTRY_RESOURCEID(IDR_SECURITYMANAGER)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CSecurityManager)
	COM_INTERFACE_ENTRY(IAppObject)
	COM_INTERFACE_ENTRY(ICloneObject)
	COM_INTERFACE_ENTRY(ISecurityItem)
	COM_INTERFACE_ENTRY(ISecurityGroup)
	COM_INTERFACE_ENTRY(ISecurityManager)
	COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
	COM_INTERFACE_ENTRY(_IApplicationStateEvents)
	ISTRUCTURELEVELIMPL_ENTRIES
END_COM_MAP()

BEGIN_PROP_MAP(CSecurityManager)
	PROP_PAGE(CLSID_SecurityManagerPropPage)
	PROP_PAGE(CLSID_SecurityItemPropPage)
END_PROP_MAP()

DECLARE_SECURITYPROPSUPPORT
BEGIN_SECURITYPROP_MAP
	SECURITY_PROPENTRY (0,100,1,1,0)
	SECURITY_PROPENTRY (1,101,1,0,0)
END_SECURITYPROP_MAP

// ICloneObject
public:
	STDMETHOD(Assign)(IUnknown* pSourseObj);
	STDMETHOD(AssignPart)(REFIID riid, IUnknown *pSource);

// ISecurityManager
public:
	STDMETHOD(CheckPermission)(IUnknown* pObj, long nPropID, BOOL *bPermit);
	STDMETHOD(get_LoggedUser)(ISecurityUser* *pVal);
	STDMETHOD(UILogin)(HWND hWndParent);
	STDMETHOD(Login)(BSTR bsName, BSTR bsPass);

// ISecurityGroup
public:
	STDMETHOD(DeleteUser)(ISecurityUser* pUser);
	STDMETHOD(AddUser)(ISecurityUser* pUser);
	STDMETHOD(get_Users)(IEnumSecurityUsers* *pVal);
	STDMETHOD(get_UserCount)(long *pVal);
	STDMETHOD(GetUser)(BSTR bsSecurityID, ISecurityUser* *ppUser);

// IStructureItem
public:
	STDMETHOD(Init)();
	STDMETHOD(PostInit)();
	STDMETHOD_(void,PreClose)();
	STDMETHOD_(void,Close)();
	STDMETHOD(LoadItem)( IStorage* pIParentStorage, BOOL bGlobalWorkspace );
	STDMETHOD(SaveItem)( IStorage* pIParentStorage, BOOL bGlobalWorkspace );
	STDMETHOD(get_SIName)(BSTR * pVal) {
		if (pVal == NULL) return E_POINTER;
		return LoadString( 1, pVal );
	}

// _IApplicationStateEvents
public:
	STDMETHOD(OnInitComplete)() {
		return S_OK;
	}
	STDMETHOD(OnAppLoadComplete)();
	STDMETHOD_(VOID, OnShowAppWindow)() {}
	STDMETHOD(OnGUIReady)() {
		return S_OK;
	}

private:
	HRESULT AssignISecurityGroup(IUnknown *pSrc);

	HRESULT LoadSecurityData(IStorage *pStg);
	HRESULT SaveSecurityData(IStorage *pStg);

	std::vector < CComPtr < ISecurityUser > >
		m_vecUsers;		// registered users (groups are also users)

	CComPtr <ISecurityUser>
		m_oLoggedUser;
};

#endif //__SECURITYMANAGER_H_

