windows-nt/Source/XPSP1/NT/ds/adsi/ldap/cprops.hxx
2020-09-26 16:20:57 +08:00

521 lines
10 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1996.
//
// File: cprops.hxx
//
// Contents:
//
// History: 06-16-96 yihsins Created.
//
//----------------------------------------------------------------------------
typedef struct _dispproperty{
LPWSTR szPropertyName; // Property name
}DISPPROPERTY, *PDISPPROPERTY;
typedef struct _property{
LPWSTR szPropertyName; // Property name
LDAPOBJECTARRAY ldapObjectArray; // An array of LDAP Objects ( values )
DWORD dwFlags; // Status of the value
DWORD dwSyntaxId; // LDAP Syntax Id
}PROPERTY, *PPROPERTY;
typedef struct _savingentry{
LIST_ENTRY ListEntry;
LPWSTR entryData;
}SAVINGENTRY, *PSAVINGENTRY;
#define PROPERTY_NAME(pProperty) pProperty->szPropertyName
#define PROPERTY_LDAPOBJECTARRAY(pProperty) pProperty->ldapObjectArray
#define PROPERTY_SYNTAX(pProperty) pProperty->dwSyntaxId
#define PROPERTY_FLAGS(pProperty) pProperty->dwFlags
//
// A test to see if a returned property entry actually has data.
//
#define PROPERTY_EMPTY(pProperty) \
(((pProperty)->ldapObjectArray.pLdapObjects) == NULL)
#define INDEX_EMPTY(dwIndex) PROPERTY_EMPTY(_pProperties + (dwIndex))
#define PROPERTY_INIT 0
#define PROPERTY_UPDATE 1
#define PROPERTY_ADD 2
#define PROPERTY_DELETE 3
#define PROPERTY_DELETE_VALUE 4
#define PROPERTY_DELETED(pProperty) \
((pProperty)->dwFlags == PROPERTY_DELETE)
#define PROP_DELETED(dwIndex) PROPERTY_DELETED(_pProperties + (dwIndex))
//
// This is used to tag the flags value so that we can make sure we
// use the correct seInfo when the SD has been updated.
//
#define INVALID_SE_VALUE 0xffffffff
class CPropertyCache : public IPropertyCache {
public:
HRESULT
CPropertyCache::
addproperty(
LPWSTR szPropertyName
);
HRESULT
CPropertyCache::
updateproperty(
LPWSTR szPropertyName,
DWORD dwSyntaxId,
LDAPOBJECTARRAY ldapObjectArray,
BOOL fExplicit
);
//
// This one will automatically add to cace as needed.
//
HRESULT
CPropertyCache::
putpropertyext(
LPWSTR szPropertyName,
DWORD dwFlags,
DWORD dwSyntaxId,
LDAPOBJECTARRAY ldapObjectArray
);
HRESULT
CPropertyCache::
findproperty(
LPWSTR szPropertyName,
PDWORD pdwIndex
);
HRESULT
CPropertyCache::
deleteproperty(
DWORD dwIndex
);
HRESULT
CPropertyCache::
getproperty(
LPWSTR szPropertyName,
PDWORD pdwSyntaxId,
PDWORD pwStatusFlag,
LDAPOBJECTARRAY *pLdapObjectArray
);
// This should not be there but to force compile
HRESULT
CPropertyCache::
getproperty(
DWORD dwIndex,
LDAPOBJECTARRAY *pLdapObjectArray
);
HRESULT
CPropertyCache::
unboundgetproperty(
LPWSTR szPropertyName,
PDWORD pdwSyntaxId,
PDWORD pdwStatusFlag,
LDAPOBJECTARRAY *pLdapObjectArray
);
HRESULT
CPropertyCache::
putproperty(
LPWSTR szPropertyName,
DWORD dwFlags,
DWORD dwSyntaxId,
LDAPOBJECTARRAY ldapObjectArray
);
//
// Helper for Umi functionality.
//
HRESULT
CPropertyCache::
GetPropertyNames(UMI_PROPERTY_VALUES **ppUmiPropVals);
CPropertyCache::
CPropertyCache();
CPropertyCache::
~CPropertyCache();
static
HRESULT
CPropertyCache::
createpropertycache(
CCoreADsObject *pCoreADsObject,
IGetAttributeSyntax *pGetAttributeSyntax,
CPropertyCache FAR * FAR * ppPropertyCache
);
//
// PropCache needs the credentials, server and port no
// to work properly on dynaminc dispid calls
//
HRESULT
CPropertyCache::
SetObjInformation(
CCredentials* pCredentials,
LPWSTR pszServerName,
DWORD dwPortNo
);
VOID
CPropertyCache::
flushpropertycache();
HRESULT
CPropertyCache::
unmarshallproperty(
LPWSTR szPropertyName,
PADSLDP pLdapHandle,
LDAPMessage *entry,
DWORD dwSyntaxId,
BOOL fExplicit,
BOOL * pfRangeRetrieval = NULL
);
HRESULT
CPropertyCache::
LDAPUnMarshallProperties(
LPWSTR pszServerPath,
PADSLDP pLdapHandle,
LDAPMessage *ldapmsg,
BOOL fExplicit,
CCredentials& Credentials
);
HRESULT
CPropertyCache::
LDAPUnMarshallProperties2(
LPWSTR pszServerPath,
PADSLDP pLdapHandle,
LDAPMessage *ldapmsg,
BOOL fExplicit,
CCredentials& Credentials,
BOOL * pfRangeRetrieval
);
HRESULT
CPropertyCache::
LDAPUnMarshallPropertyAs(
LPWSTR pszServerPath,
PADSLDP pLdapHandle,
LDAPMessage *ldapmsg,
LPWSTR szPropertyName,
DWORD dwSyntaxId,
BOOL fExplicit,
CCredentials& Credentials
);
HRESULT
CPropertyCache::
LDAPUnMarshallPropertiesAs(
LPWSTR pszServerPath,
PADSLDP pLdapHandle,
LDAPMessage *ldapmsg,
DWORD dwSyntaxId,
BOOL fExplicit,
CCredentials& Credentials
);
HRESULT
CPropertyCache::
LDAPMarshallProperties(
LDAPModW ***aMods,
PBOOL pfNTSecDes,
SECURITY_INFORMATION *pSeInfo
);
HRESULT
CPropertyCache::
LDAPMarshallProperties2(
LDAPModW ***aMods,
DWORD *pdwNumOfMods
);
HRESULT
CPropertyCache::
ClearMarshalledProperties(
VOID
);
HRESULT
CPropertyCache::
ClearAllPropertyFlags(
VOID
);
HRESULT
CPropertyCache::
ClearPropertyFlag(
LPWSTR szPropertyName
);
HRESULT
CPropertyCache::
SetPropertyFlag(
LPWSTR szPropertyName,
DWORD dwFlag
);
HRESULT
CPropertyCache::
IsPropertyUpdated(
LPWSTR szPropertyName,
BOOL *pfUpdated
);
HRESULT
CPropertyCache::
unboundgetproperty(
DWORD dwIndex,
PDWORD pdwSyntaxId,
PDWORD pdwStatusFlag,
LDAPOBJECTARRAY *pLdapObjectArray
);
void
CPropertyCache::
reset_propindex(
);
//
// All methods which use the _dwCurrentIndex attribute must check that the
// index is valid using this test and ONLY then proceed
//
BOOL
CPropertyCache::
index_valid(
);
BOOL
CPropertyCache::
index_valid(
DWORD dwIndex
);
LPWSTR
CPropertyCache::
get_PropName(
DWORD dwIndex
);
HRESULT
CPropertyCache::
skip_propindex(
DWORD dwElements
);
HRESULT
CPropertyCache::
get_PropertyCount(
PDWORD pdwMaxProperties
);
DWORD
CPropertyCache::
get_CurrentIndex(
);
LPWSTR
CPropertyCache::
get_CurrentPropName(
);
void
setGetInfoFlag();
//
// Returns the status of the GetInfo flag. TRUE indicates that GetInfo
// has been performed and FALSE indicates that GetInfo has not yet been
// called on this object.
//
BOOL
getGetInfoFlag()
{
return _fGetInfoDone;
}
//
// The following three are for dynamic dispid's, so they shouldn't
// return any ADSI return values.
//
HRESULT
locateproperty(
LPWSTR szPropertyName,
PDWORD pdwIndex
);
//
// Because of the IPropertyCache interface, we need to get
// rid of it
//
// NO ! DO NOT GET RID OF THIS FUNCTION!!!
//
HRESULT
getproperty(
DWORD dwIndex,
VARIANT *pVarResult,
CCredentials &Credentials
);
HRESULT
putproperty(
DWORD dwIndex,
VARIANT varValue
);
HRESULT
CPropertyCache::
DispatchFindProperty(
LPWSTR szPropertyName,
PDWORD pdwIndex
);
// No longer private
//
// This is the "real" putproperty, called by the other two.
//
HRESULT
CPropertyCache::
putproperty(
DWORD dwIndex,
DWORD dwFlags,
DWORD dwSyntaxId,
LDAPOBJECTARRAY ldapObjectArray
);
//
// add entry to the GlobalListSavingEntries, the entries are the properties requested in GetInfoEx
//
HRESULT
CPropertyCache::
AddSavingEntry(
LPWSTR propertyName
);
//
// compare the property with the entries in the list to determine whether we will go on wire again
//
BOOL
CPropertyCache::
FindSavingEntry(
LPWSTR propertyName
);
//
// delete the entry in the GlobalListSavingEntries, so after a SetInfo, we will have a fresh start
//
HRESULT
CPropertyCache::
DeleteSavingEntry();
private:
HRESULT
getproperty(
DWORD dwIndex,
PDWORD dwStatusFlag,
VARIANT *pVarResult,
CCredentials &Credentials
);
protected:
DWORD _dwMaxProperties;
PPROPERTY _pProperties;
DWORD _cb;
DWORD _dwCurrentIndex;
DWORD _dwDispMaxProperties;
PDISPPROPERTY _pDispProperties;
DWORD _cbDisp;
CCoreADsObject *_pCoreADsObject;
IGetAttributeSyntax *_pGetAttributeSyntax;
BOOL _fGetInfoDone;
CCredentials* _pCredentials;
LPWSTR _pszServerName;
DWORD _dwPort;
LIST_ENTRY _ListSavingEntries;
};
//
// In-lined methods of CPropertyCache
//
inline
BOOL
CPropertyCache::
index_valid(
)
{
//
// NOTE: - _dwCurrentIndex is of type DWORD which is unsigned long.
// - _dwMaxProperties -1 is also of type unsigned long (so
// if _dwMaxProperites = 0, _dwMaxproperties -1 = 0xffffff)
// - comparision checking must taken the above into account
// for proper checking
//
if ( (_dwMaxProperties==0) || (_dwCurrentIndex >_dwMaxProperties-1) )
return(FALSE);
else
return(TRUE);
}
inline
BOOL
CPropertyCache::
index_valid(
DWORD dwIndex
)
{
//
// NOTE: - _dwIndex is of type DWORD which is unsigned long.
// - _dwMaxProperties -1 is also of type unsigned long (so
// if _dwMaxProperites = 0, _dwMaxproperties -1 = 0xffffff)
// - comparision checking must taken the above into account
// for proper checking
//
if ( (_dwMaxProperties==0) || (dwIndex >_dwMaxProperties-1) )
return(FALSE);
else
return(TRUE);
}