//

// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
//
// ***************************************************************************
//
//	Original Author: Rajesh Rao
//
// 	$Author: rajeshr $
//	$Date: 6/11/98 4:43p $
// 	$Workfile:ldapcach.h $
//
//	$Modtime: 6/11/98 11:21a $
//	$Revision: 1 $	
//	$Nokeywords:  $
//
// 
//  Description: Cache for LDAP Schema objects (Properties and Classes)
//
//***************************************************************************


#ifndef LDAP_CACHE_H
#define LDAP_CACHE_H


class CLDAPCache
{
public:
	static DWORD dwLDAPCacheCount;

	//***************************************************************************
	//
	// CLDAPCache::CLDAPCache
	//
	// Purpose : Constructor. Fills in the cache with all the properties in LDAP.
	//
	// Parameters: 
	//	plogObject : Pointer to the ProvDebugLog object  onto which logging will be done.
	//***************************************************************************
	CLDAPCache(ProvDebugLog *plogObject);

	//***************************************************************************
	//
	// CLDAPCache::~CLDAPCache
	//
	// Purpose : Destructor 
	//
	//***************************************************************************
	~CLDAPCache();

	//***************************************************************************
	//
	// CLDAPCache::IsInitialized
	//
	// Purpose : Indicates whether the cache was created and initialized succeddfully
	//
	// Parameters: 
	//	None
	//
	//	Return value:
	//		A boolean value indicating the status
	//		
	//***************************************************************************
	BOOLEAN IsInitialized();

	//***************************************************************************
	//
	// CLDAPCache::GetProperty
	//
	// Purpose : Retreives the IDirectory interface of an LDAP property. 
	//
	// Parameters: 
	//	lpszPropertyName : The name of the LDAP Property to be retreived
	//	ppADSIProperty : The address of the pointer where the CADSIProperty object will be placed
	//	bWBEMName : True if the lpszPropertyName is the WBEM name. False, if it is the LDAP name
	//
	//	Return value:
	//		The COM value representing the return status. The user should delete the returned object when done.
	//		
	//***************************************************************************
	HRESULT GetProperty(LPCWSTR lpszPropertyName, CADSIProperty **ppADSIProperty, BOOLEAN bWBEMName);

	//***************************************************************************
	//
	// CLDAPCache::GetClass
	//
	// Purpose : Retreives the IDirectory interface of an LDAP Class
	//
	// Parameters: 
	//	lpszClassName : The name of the Class to be retreived. 
	//	ppADSIClass : The address of the pointer where the CADSIClass object will be placed
	//
	//	Return value:
	//		The COM value representing the return status. The user should delete the returned object when done.
	//		
	//***************************************************************************
	HRESULT GetClass(LPCWSTR lpszWBEMClassName, LPCWSTR lpszClassName, CADSIClass **ppADSIClass);

	//***************************************************************************
	//
	// CLDAPCache::EnumerateClasses
	//
	// Purpose : Retreives the IDirectory interface of an LDAP Class
	//
	// Parameters: 
	//		lppszWBEMSuperClass : The WBEM name of the immediate superclass of the classes to be retreived. This is optional
	//			and is ignored if NULL
	//		bDeep : Indicates whether a deep enumeration is required. Otherwise a shallow enumeration is done
	//		pppszClassNames : The address of the array of LPWSTR pointers where the resulting objects will be
	//			placed. The user should deallocate this array as well as its contents when done with them.
	//		pdwNumRows : The number of elements in the above array returned
	//
	//	Return value:
	//		The COM value representing the return status. The user should delete the returned object when done.
	//		
	//***************************************************************************
	HRESULT EnumerateClasses(LPCWSTR lpszSuperclass,
		BOOLEAN bDeep,
		LPWSTR **pppADSIClasses,
		DWORD *pdwNumRows,
		BOOLEAN bArtificialClass
		);

	//***************************************************************************
	//
	// CLDAPCache::GetSchemaContainerSearch
	//
	// Purpose : To return the IDirectorySearch interface on the schema container
	//
	// Parameters:
	//	ppDirectorySearch : The address where the pointer to the required interface will
	//		be stored.
	//
	// 
	//	Return Value: The COM result representing the status. The user should release
	//	the interface pointer when done with it.
	//***************************************************************************
	HRESULT GetSchemaContainerSearch(IDirectorySearch ** ppDirectorySearch);

	//***************************************************************************
	//
	// CLDAPCache::GetSchemaContainerObject
	//
	// Purpose : To return the IDirectoryObject interface on the schema container
	//
	// Parameters:
	//	ppDirectoryObject : The address where the pointer to the required interface will
	//		be stored.
	//
	// 
	//	Return Value: The COM result representing the status. The user should release
	//	the interface pointer when done with it.
	//***************************************************************************
	HRESULT GetSchemaContainerObject(IDirectoryObject ** ppDirectorySearch);
	
	//***************************************************************************
	//
	// CLDAPCache :: CreateEmptyADSIClass
	//
	// Purpose: Creates a new ADSI class from a WBEM class
	//
	// Parameters:
	//	lpszWBEMName : The WBEM Name of the class
	//
	//
	// Return Value: 
	//
	//***************************************************************************
	HRESULT CreateEmptyADSIClass( 
		LPCWSTR lpszWBEMName,
		CADSIClass **ppADSIClass);


	HRESULT FillInAProperty(CADSIProperty *pNextProperty, ADS_SEARCH_HANDLE hADSSearchOuter);


private:

	// The storage for cached properties
	CObjectTree m_objectTree;

	// The object on whihc all logging is done
	ProvDebugLog *m_pLogObject;

	// Whether the cache was created successfully
	BOOLEAN m_isInitialized;

	// These are the search preferences often used
	ADS_SEARCHPREF_INFO m_pSearchInfo[3];

	// The path to the schema container
	LPWSTR m_lpszSchemaContainerSuffix;
	LPWSTR m_lpszSchemaContainerPath;
	// The IDirectorySearch interface of the schema container
	IDirectorySearch *m_pDirectorySearchSchemaContainer;

	// Some other literals
	static LPCWSTR ROOT_DSE_PATH;
	static LPCWSTR SCHEMA_NAMING_CONTEXT;
	static LPCWSTR LDAP_PREFIX;
	static LPCWSTR LDAP_TOP_PREFIX;
	static LPCWSTR RIGHT_BRACKET;
	static LPCWSTR OBJECT_CATEGORY_EQUALS_ATTRIBUTE_SCHEMA;

	// A function to fill in the object tree
	// This can be called only after the m_pDirectorySearchSchemaContainer member
	// is initialized
	HRESULT InitializeObjectTree();


};

#endif /* LDAP_CACHE_H */