windows-nt/Source/XPSP1/NT/ds/adsi/ldap/cpropmgr.hxx

387 lines
9.1 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+---------------------------------------------------------------------------
//
// 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__