/* ----------------------------------------------------------------------

	Module:		ULS.DLL (Service Provider)
	File:		splapp.h
	Content:	This file contains the local application object definition.
	History:
	10/15/96	Chu, Lon-Chan [lonchanc]
				Created.

	Copyright (c) Microsoft Corporation 1996-1997

   ---------------------------------------------------------------------- */

#ifndef _ULS_SP_APPOBJ_H_
#define _ULS_SP_APPOBJ_H_

#include <pshpack8.h>

enum
{
	ENUM_APPATTR_NAME,
	ENUM_APPATTR_MIME_TYPE,
	ENUM_APPATTR_GUID,

	ENUM_APPATTR_PROT_NAME,
	ENUM_APPATTR_PROT_MIME,
	ENUM_APPATTR_PROT_PORT,

	COUNT_ENUM_APPATTR
};

#define COUNT_ENUM_STDAPPATTR	ENUM_APPATTR_PROT_NAME

#define APPOBJ_F_NAME		0x0001
#define APPOBJ_F_MIME_TYPE	0x0002
#define APPOBJ_F_GUID		0x0004


extern const TCHAR *c_apszAppStdAttrNames[COUNT_ENUM_APPATTR];

#define STR_APP_NAME	((TCHAR *) c_apszAppStdAttrNames[ENUM_APPATTR_NAME])


typedef struct
{
	DWORD	dwFlags;
	TCHAR	*apszStdAttrValues[COUNT_ENUM_APPATTR];
	TCHAR	szGuid[sizeof (GUID) * 2 + 2];
}
	APP_INFO;


#define APPOBJ_SIGNATURE	((ULONG) 0x56781234UL)


class UlsLdap_CLocalApp : public UlsLdap_CStdAttrs, public UlsLdap_CAnyAttrs
{
	friend class UlsLdap_CLocalProt;

public:

	UlsLdap_CLocalApp ( UlsLdap_CLocalUser *pUser );
	~UlsLdap_CLocalApp ( VOID );

	ULONG AddRef ( VOID );
	ULONG Release ( VOID );

	HRESULT Register ( ULONG *puRespID, LDAP_APPINFO *pInfo );
	HRESULT UnRegister ( ULONG *puRespID );

	HRESULT SetStdAttrs ( ULONG *puRespID, LDAP_APPINFO *pInfo );
	HRESULT SetAnyAttrs ( ULONG *puRespID, ULONG cAttrs, TCHAR *pszAttrs );
	HRESULT RemoveAnyAttrs ( ULONG *puRespID, ULONG cAttrs, TCHAR *pszAttrs );

	VOID SetRegNone ( VOID ) { m_RegStatus = ULS_REG_STATUS_NONE; }
	VOID SetRegLocally ( VOID ) { m_RegStatus = ULS_REG_STATUS_LOCALLY; }
	VOID SetRegRemotely ( VOID ) { m_RegStatus = ULS_REG_STATUS_REMOTELY; }

	BOOL IsRegistered ( VOID ) { return (m_RegStatus > ULS_REG_STATUS_NONE &&
									 		m_pUser->IsRegistered ()); }
	BOOL IsRegLocally ( VOID ) { return (m_RegStatus == ULS_REG_STATUS_LOCALLY &&
											m_pUser->IsRegistered ()); }
	BOOL IsRegRemotely ( VOID ) { return (m_RegStatus == ULS_REG_STATUS_REMOTELY &&
											m_pUser->IsRegRemotely ()); }

	BOOL IsValidObject ( VOID ) { return m_uSignature == APPOBJ_SIGNATURE; }

protected:

	TCHAR *GetDN ( VOID ) { return m_pUser->GetDN (); }
	SERVER_INFO *GetServerInfo ( VOID ) { return m_pUser->GetServerInfo ();	}

	ULONG GetUserPrefixCount ( VOID ) { return m_pUser->GetPrefixCount (); }
	TCHAR *GetUserPrefixString ( VOID ) { return m_pUser->GetPrefixString (); }

	ULONG GetPrefixCount ( VOID ) { return m_cPrefix; }
	TCHAR *GetPrefixString ( VOID ) { return m_pszPrefix; }

private:

	HRESULT CacheInfo ( VOID *pInfo );
	HRESULT CacheAppInfo ( LDAP_APPINFO *pInfo );
	HRESULT CreateRegisterModArr ( LDAPMod ***pppMod );
	HRESULT CreateUnRegisterModArr ( LDAPMod ***pppMod );
	HRESULT CreateSetStdAttrsModArr ( LDAPMod ***pppMod );
	VOID FillModArrAttr ( LDAPMod *pMod, LONG AttrIdx );

	ULONG				m_uSignature;
	LONG				m_cRefs;
	UlsLdap_CLocalUser	*m_pUser;

	APP_INFO			m_AppInfo;
	REG_STATUS			m_RegStatus;

	ULONG				m_cPrefix;
	TCHAR				*m_pszPrefix;
};


#include <poppack.h>

#endif // _ULS_SP_APPOBJ_H_