|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 2000.
//
// File: cpropmgr.hxx
//
// Contents: Header for property manager - object that implements/helps
// implement IUMIPropList functions.
// The property manager needs to be initialized in one of 2 modes
// 1) PropertyCache mode in which case it uses the objects existing
// property cache to provide IUMIPropList support and
// 2) Interface property mode in which case a list of the properties,
// this object should support is passed in (refer to constructor
// for complete details).
//
// History: 02-07-00 AjayR Created.
//
//----------------------------------------------------------------------------
#ifndef __CPROPMGR_H__
#define __CPROPMGR_H__
//
// Global fucntions that are used to free the umi properties/values arrays
//
HRESULT FreeOneUmiProperty(UMI_PROPERTY *pUmiProperty); HRESULT FreeUmiPropertyValues(UMI_PROPERTY_VALUES *pUmiProps); HRESULT ConvertUmiPropCodeToLdapCode(ULONG uUmiFlags, DWORD &dwLdapOpCode); HRESULT ConvertLdapCodeToUmiPropCode(DWORD dwLdapCode, ULONG &uUmiFlags); HRESULT ConvertLdapSyntaxIdToUmiType(DWORD dwLdapSyntax, ULONG &uUmiType);
//
// Default number of properties in prop mgr mode.
//
#define MAX_PROPMGR_PROP_COUNT 15
typedef ULONG UMIPROPS; typedef LONG UMIPROP;
typedef struct _intfproperty{ LPWSTR pszPropertyName; // Property name.
DWORD dwNumElements; DWORD dwFlags; // Status of the value.
DWORD dwSyntaxId; // Syntax Id of the stored value.
PUMI_PROPERTY pUmiProperty; // Umi property with values.
}INTF_PROPERTY, *PINTF_PROPERTY;
const DWORD OPERATION_CODE_READABLE = 1; const DWORD OPERATION_CODE_WRITEABLE = 2; const DWORD OPERATION_CODE_READWRITE = 3;
//
// These are the codes used by the property cache.
//
#define PROPERTY_INIT 0
#define PROPERTY_UPDATE 1
#define PROPERTY_ADD 2
#define PROPERTY_DELETE 3
#define PROPERTY_DELETE_VALUE 4
class CPropertyManager : INHERIT_TRACKING, public IUmiPropList {
public:
//
// IUknown support.
//
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) ;
//
// We cannot use standard refCounting cause the release method is
// different. This should be similar to the DECLARE_STD_REFCOUNTING
// except that in release we release a ref to the pIADs also.
//
STDMETHOD_(ULONG, AddRef)() { if (!_fPropCacheMode && _pUnk) { //
// This is to make sure we are not left with a
// dangling IADs ref.
//
_pUnk->AddRef(); }
# if DBG == 1
return StdAddRef(); #else
//
// We need to use the stuff directly from the definition as
// the fn is not defined for fre builds.
//
InterlockedIncrement((long*)&_ulRefs); return _ulRefs; #endif
};
STDMETHOD_(ULONG, Release)() { #if DBG == 1
//
// Delete is handled by the owning IADs Object.
//
ULONG ul = StdRelease();
//
// Need to releas the ref only if we are in intf prop mode.
// In the propCache mode, this object does not need to be ref
// counted cause it's lifetime is similar to that of the
// owning object (one implementing IADs).
//
if (!_fPropCacheMode && _pUnk) { _pUnk->Release(); }
return ul; #else
InterlockedDecrement((long*)&_ulRefs);
if (!_fPropCacheMode && _pUnk) { _pUnk->Release(); }
return _ulRefs; #endif
};
//
// IUmiPropList methods.
//
STDMETHOD(Put)( IN LPCWSTR pszName, IN ULONG uFlags, OUT UMI_PROPERTY_VALUES *pProp );
STDMETHOD(Get)( IN LPCWSTR pszName, IN ULONG uFlags, OUT UMI_PROPERTY_VALUES **pProp );
STDMETHOD(GetAt)( IN LPCWSTR pszName, IN ULONG uFlags, IN ULONG uBufferLength, OUT LPVOID pExistingMem );
STDMETHOD(GetAs)( IN LPCWSTR pszName, IN ULONG uFlags, IN ULONG uCoercionType, OUT UMI_PROPERTY_VALUES **pProp );
STDMETHOD (Delete)( IN LPCWSTR pszUrl, IN OPTIONAL ULONG uFlags );
STDMETHOD(FreeMemory)( ULONG uReserved, LPVOID pMem );
STDMETHOD(GetProps)( IN LPCWSTR *pszNames, IN ULONG uNameCount, IN ULONG uFlags, OUT UMI_PROPERTY_VALUES **pProps );
STDMETHOD(PutProps)( IN LPCWSTR *pszNames, IN ULONG uNameCount, IN ULONG uFlags, IN UMI_PROPERTY_VALUES *pProps );
STDMETHOD(PutFrom)( IN LPCWSTR pszName, IN ULONG uFlags, IN ULONG uBufferLength, IN LPVOID pExistingMem ); //
// Other public methods.
//
CPropertyManager:: CPropertyManager();
CPropertyManager:: ~CPropertyManager();
//
// Use this to initialize with property cache object.
//
static HRESULT CPropertyManager:: CreatePropertyManager( IADs *pADsObj, IUnknown *pUnk, CPropertyCache *pPropCache, CCredentials *pCreds, LPWSTR pszServerName, CPropertyManager FAR * FAR * ppPropertyManager = NULL );
static HRESULT CPropertyManager:: CreatePropertyManager( IUnknown *pUnk, IUnknown *pADs, CCredentials *pCredentials, INTF_PROP_DATA intfPropTable[], CPropertyManager FAR * FAR * ppPropertyManager );
//
// Helper functions that are not part of the interfaces supported.
//
HRESULT CPropertyManager::GetStringProperty( LPCWSTR pszPropName, LPWSTR *pszRetStrVal );
HRESULT CPropertyManager::GetLongProperty( LPCWSTR pszPropName, LONG *plVal ); HRESULT CPropertyManager::GetBoolProperty( LPCWSTR pszPropName, BOOL *pfFlag );
HRESULT CPropertyManager::GetLastStatus( ULONG uFlags, ULONG *puSpecificStatus, REFIID riid, LPVOID *pStatusObj );
//
// Helper to delete SD on commit calls if needed.
//
HRESULT CPropertyManager::DeleteSDIfPresent();
protected: //
// These are internal methods.
//
HRESULT CPropertyManager:: AddProperty( LPCWSTR szPropertyName, UMI_PROPERTY umiProperty );
HRESULT CPropertyManager:: UpdateProperty( DWORD dwIndex, UMI_PROPERTY umiProperty );
HRESULT CPropertyManager:: FindProperty( LPCWSTR szPropertyName, PDWORD pdwIndex );
HRESULT CPropertyManager:: DeleteProperty( DWORD dwIndex );
VOID CPropertyManager:: flushpropertycache();
HRESULT CPropertyManager:: ClearAllPropertyFlags(VOID);
//
// Way to get a list of the names of the properties.
//
HRESULT CPropertyManager:: GetPropertyNames(PUMI_PROPERTY_VALUES *pUmiProps);
//
// Way to get a list of the names and types for schema objects.
//
HRESULT CPropertyManager:: GetPropertyNamesSchema(PUMI_PROPERTY_VALUES *pUmiProps); //
// Add Property to table and return index of entry.
//
HRESULT CPropertyManager:: AddToTable( LPCWSTR pszPropertyName, PDWORD pdwIndex );
//
// Check if this is a valid interfaceProperty.
//
BOOL CPropertyManager:: VerifyIfValidProperty( LPCWSTR pszPropertyName, UMI_PROPERTY umiProperty );
//
// More helper routines.
//
HRESULT CPropertyManager::GetIndexInStaticTable( LPCWSTR pszName, DWORD &dwIndex );
void CPropertyManager::SetLastStatus(ULONG ulStatus){ _ulStatus = ulStatus; }
//
// Does all the hard work for interface properties.
//
HRESULT CPropertyManager::GetInterfaceProperty( LPCWSTR pszName, ULONG uFlags, UMI_PROPERTY_VALUES **ppProp, DWORD dwTableIndex );
protected:
//
// Not all are used in all cases. If in propCache mode, a lot of
// these are not used, the _pPropCache already has the info we
// need.
// Likewise if we are in intfProperties mode, the _pPropCache is
// not valid, the other member variables have useful information
// though.
//
DWORD _dwMaxProperties; CPropertyCache * _pPropCache; PINTF_PROPERTY _pIntfProperties; DWORD _dwMaxLimit; BOOL _fPropCacheMode; INTF_PROP_DATA * _pStaticPropData; ULONG _ulStatus;
IADs* _pIADs; IUnknown* _pUnk; //
// All these are part of the owning object, do not free.
//
CCredentials* _pCreds; LPWSTR _pszServerName; }; #endif // __CPROPMGR_H__
|