387 lines
9.1 KiB
C++
387 lines
9.1 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// 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__
|