mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
470 lines
9.2 KiB
470 lines
9.2 KiB
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1995
|
|
//
|
|
// File: cclsobj.cxx
|
|
//
|
|
// Contents: Microsoft ADs NDS Provider Generic Object
|
|
//
|
|
//
|
|
// History: 01-30-95 krishnag Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
#include "nds.hxx"
|
|
#pragma hdrstop
|
|
|
|
|
|
// Class CNDSProperty
|
|
|
|
DECLARE_INFOLEVEL( Syntax );
|
|
DECLARE_DEBUG( Syntax );
|
|
#define SyntaxDebugOut(x) SyntaxInlineDebugOut x
|
|
|
|
DEFINE_IDispatch_Implementation(CNDSProperty)
|
|
DEFINE_IADs_Implementation(CNDSProperty)
|
|
|
|
CNDSProperty::CNDSProperty()
|
|
: _pDispMgr( NULL ),
|
|
_bstrOID( NULL ),
|
|
_bstrSyntax( NULL ),
|
|
_lMaxRange( 0 ),
|
|
_lMinRange( 0 ),
|
|
_fMultiValued( FALSE )
|
|
{
|
|
|
|
ENLIST_TRACKING(CNDSProperty);
|
|
}
|
|
|
|
CNDSProperty::~CNDSProperty()
|
|
{
|
|
delete _pDispMgr;
|
|
}
|
|
|
|
HRESULT
|
|
CNDSProperty::CreateProperty(
|
|
BSTR bstrParent,
|
|
BSTR bstrName,
|
|
LPNDS_ATTR_DEF lpAttrDef,
|
|
CCredentials& Credentials,
|
|
DWORD dwObjectState,
|
|
REFIID riid,
|
|
void **ppvObj
|
|
)
|
|
{
|
|
CNDSProperty FAR * pProperty = NULL;
|
|
HRESULT hr = S_OK;
|
|
WCHAR szADsSyntax[MAX_PATH];
|
|
WCHAR szNDSSyntax[MAX_PATH];
|
|
|
|
hr = AllocatePropertyObject( &pProperty );
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pProperty->InitializeCoreObject(
|
|
bstrParent,
|
|
bstrName,
|
|
PROPERTY_CLASS_NAME,
|
|
L"",
|
|
CLSID_NDSProperty,
|
|
dwObjectState
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pProperty->QueryInterface( riid, ppvObj );
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
#if DBG
|
|
SyntaxDebugOut((DEB_TRACE,
|
|
"Property %s : SyntaxId %d\n",
|
|
lpAttrDef->szAttributeName,
|
|
lpAttrDef->dwSyntaxID));
|
|
#endif
|
|
|
|
MapSyntaxIdtoADsSyntax(
|
|
lpAttrDef->dwSyntaxID,
|
|
szADsSyntax
|
|
);
|
|
|
|
hr = ADsAllocString(
|
|
szADsSyntax,
|
|
&pProperty->_bstrSyntax
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
MapSyntaxIdtoNDSSyntax(
|
|
lpAttrDef->dwSyntaxID,
|
|
szNDSSyntax
|
|
);
|
|
|
|
hr = ADsAllocString(
|
|
szNDSSyntax,
|
|
&pProperty->_bstrOID
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
pProperty->_lMaxRange = lpAttrDef->dwUpperLimit;
|
|
pProperty->_lMinRange = lpAttrDef->dwLowerLimit;
|
|
pProperty->_fMultiValued = !(lpAttrDef->dwFlags & NDS_SINGLE_VALUED_ATTR);
|
|
|
|
pProperty->Release();
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
|
|
delete pProperty;
|
|
RRETURN_EXP_IF_ERR(hr);
|
|
}
|
|
|
|
HRESULT
|
|
CNDSProperty::CreateProperty(
|
|
BSTR bstrParent,
|
|
BSTR bstrName,
|
|
HANDLE hTree,
|
|
CCredentials& Credentials,
|
|
DWORD dwObjectState,
|
|
REFIID riid,
|
|
void **ppvObj
|
|
)
|
|
{
|
|
DWORD dwStatus = 0;
|
|
HRESULT hr = S_OK;
|
|
LPNDS_ATTR_DEF lpAttrDefs = NULL;
|
|
DWORD dwNumberOfEntries = 0;
|
|
DWORD dwInfoType = 0;
|
|
HANDLE hOperationData = NULL;
|
|
|
|
dwStatus = NwNdsCreateBuffer(
|
|
NDS_SCHEMA_READ_ATTR_DEF,
|
|
&hOperationData
|
|
);
|
|
CHECK_AND_SET_EXTENDED_ERROR(dwStatus, hr);
|
|
|
|
dwStatus = NwNdsPutInBuffer(
|
|
bstrName,
|
|
0,
|
|
NULL,
|
|
0,
|
|
0,
|
|
hOperationData
|
|
);
|
|
|
|
CHECK_AND_SET_EXTENDED_ERROR(dwStatus, hr);
|
|
|
|
dwStatus = NwNdsReadAttrDef(
|
|
hTree,
|
|
NDS_INFO_NAMES_DEFS,
|
|
&hOperationData
|
|
);
|
|
|
|
CHECK_AND_SET_EXTENDED_ERROR(dwStatus, hr);
|
|
|
|
dwStatus = NwNdsGetAttrDefListFromBuffer(
|
|
hOperationData,
|
|
&dwNumberOfEntries,
|
|
&dwInfoType,
|
|
(LPVOID *) &lpAttrDefs
|
|
);
|
|
|
|
CHECK_AND_SET_EXTENDED_ERROR(dwStatus, hr);
|
|
|
|
if (!lpAttrDefs) {
|
|
hr = E_FAIL;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
hr = CNDSProperty::CreateProperty(
|
|
bstrParent,
|
|
bstrName,
|
|
lpAttrDefs,
|
|
Credentials,
|
|
dwObjectState,
|
|
riid,
|
|
ppvObj
|
|
);
|
|
|
|
|
|
error:
|
|
if (hOperationData) {
|
|
NwNdsFreeBuffer(hOperationData);
|
|
}
|
|
RRETURN_EXP_IF_ERR(hr);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::QueryInterface(
|
|
REFIID iid,
|
|
LPVOID FAR* ppv
|
|
)
|
|
{
|
|
if (ppv == NULL) {
|
|
RRETURN(E_POINTER);
|
|
}
|
|
|
|
if (IsEqualIID(iid, IID_IUnknown))
|
|
{
|
|
*ppv = (IADsProperty FAR *) this;
|
|
}
|
|
else if (IsEqualIID(iid, IID_IDispatch))
|
|
{
|
|
*ppv = (IADsProperty FAR *) this;
|
|
}
|
|
else if (IsEqualIID(iid, IID_ISupportErrorInfo))
|
|
{
|
|
*ppv = (ISupportErrorInfo FAR *) this;
|
|
}
|
|
else if (IsEqualIID(iid, IID_IADsProperty))
|
|
{
|
|
*ppv = (IADsProperty FAR *) this;
|
|
}
|
|
else if (IsEqualIID(iid, IID_IADs))
|
|
{
|
|
*ppv = (IADsProperty FAR *) this;
|
|
}
|
|
else
|
|
{
|
|
*ppv = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
/* IADs methods */
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::SetInfo(THIS)
|
|
{
|
|
RRETURN_EXP_IF_ERR(E_NOTIMPL);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::GetInfo(THIS)
|
|
{
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::GetInfoEx(THIS_ VARIANT vProperties, long lnReserved)
|
|
{
|
|
RRETURN_EXP_IF_ERR(E_NOTIMPL);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
CNDSProperty::AllocatePropertyObject(
|
|
CNDSProperty FAR * FAR * ppProperty
|
|
)
|
|
{
|
|
CNDSProperty FAR *pProperty = NULL;
|
|
CDispatchMgr FAR *pDispMgr = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
pProperty = new CNDSProperty();
|
|
if ( pProperty == NULL )
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
pDispMgr = new CDispatchMgr;
|
|
if ( pDispMgr == NULL )
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = LoadTypeInfoEntry(
|
|
pDispMgr,
|
|
LIBID_ADs,
|
|
IID_IADsProperty,
|
|
(IADsProperty *) pProperty,
|
|
DISPID_REGULAR
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
pProperty->_pDispMgr = pDispMgr;
|
|
*ppProperty = pProperty;
|
|
|
|
RRETURN(hr);
|
|
|
|
error:
|
|
|
|
delete pDispMgr;
|
|
delete pProperty;
|
|
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
/* ISupportErrorInfo method */
|
|
STDMETHODIMP
|
|
CNDSProperty::InterfaceSupportsErrorInfo(
|
|
THIS_ REFIID riid
|
|
)
|
|
{
|
|
if (IsEqualIID(riid, IID_IADs) ||
|
|
IsEqualIID(riid, IID_IADsProperty)) {
|
|
RRETURN(S_OK);
|
|
} else {
|
|
RRETURN(S_FALSE);
|
|
}
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::Get(
|
|
THIS_ BSTR bstrName,
|
|
VARIANT FAR* pvProp
|
|
)
|
|
{
|
|
RRETURN_EXP_IF_ERR(E_NOTIMPL);
|
|
}
|
|
|
|
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::Put(
|
|
THIS_ BSTR bstrName,
|
|
VARIANT vProp
|
|
)
|
|
{
|
|
RRETURN_EXP_IF_ERR(E_NOTIMPL);
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::GetEx(
|
|
THIS_ BSTR bstrName,
|
|
VARIANT FAR* pvProp
|
|
)
|
|
{
|
|
RRETURN_EXP_IF_ERR(E_NOTIMPL);
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::PutEx(
|
|
THIS_ long lnControlCode,
|
|
BSTR bstrName,
|
|
VARIANT vProp
|
|
)
|
|
{
|
|
RRETURN_EXP_IF_ERR(E_NOTIMPL);
|
|
}
|
|
|
|
|
|
/* IADsProperty methods */
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::get_OID( THIS_ BSTR FAR *pbstrOID )
|
|
{
|
|
RRETURN_EXP_IF_ERR(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::put_OID( THIS_ BSTR bstrOID )
|
|
{
|
|
RRETURN_EXP_IF_ERR(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::get_Syntax( THIS_ BSTR FAR *pbstrSyntax )
|
|
{
|
|
if ( !pbstrSyntax )
|
|
RRETURN_EXP_IF_ERR(E_ADS_BAD_PARAMETER);
|
|
|
|
HRESULT hr;
|
|
hr = ( ADsAllocString( _bstrSyntax, pbstrSyntax ));
|
|
RRETURN_EXP_IF_ERR(hr);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::put_Syntax( THIS_ BSTR bstrSyntax )
|
|
{
|
|
RRETURN_EXP_IF_ERR(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::get_MaxRange( THIS_ long FAR *plMaxRange )
|
|
{
|
|
if ( !plMaxRange )
|
|
RRETURN_EXP_IF_ERR(E_ADS_BAD_PARAMETER);
|
|
|
|
*plMaxRange = _lMaxRange;
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::put_MaxRange( THIS_ long lMaxRange )
|
|
{
|
|
RRETURN_EXP_IF_ERR(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::get_MinRange( THIS_ long FAR *plMinRange )
|
|
{
|
|
if ( !plMinRange )
|
|
RRETURN_EXP_IF_ERR(E_ADS_BAD_PARAMETER);
|
|
|
|
*plMinRange = _lMinRange;
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::put_MinRange( THIS_ long lMinRange )
|
|
{
|
|
RRETURN_EXP_IF_ERR(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::get_MultiValued( THIS_ VARIANT_BOOL FAR *pfMultiValued )
|
|
{
|
|
if ( !pfMultiValued )
|
|
RRETURN_EXP_IF_ERR(E_ADS_BAD_PARAMETER);
|
|
|
|
*pfMultiValued = _fMultiValued? VARIANT_TRUE : VARIANT_FALSE;
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::put_MultiValued( THIS_ VARIANT_BOOL fMultiValued )
|
|
{
|
|
RRETURN_EXP_IF_ERR(E_ADS_PROPERTY_NOT_SUPPORTED);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CNDSProperty::Qualifiers(THIS_ IADsCollection FAR* FAR* ppQualifiers)
|
|
{
|
|
RRETURN_EXP_IF_ERR(E_NOTIMPL);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
MapSyntaxIdtoADsSyntax(
|
|
DWORD dwSyntaxId,
|
|
LPWSTR pszADsSyntax
|
|
)
|
|
{
|
|
|
|
if (dwSyntaxId >= g_cNDSSyntaxMap) {
|
|
wcscpy(pszADsSyntax, L"Out of Bounds");
|
|
}else {
|
|
wcscpy(pszADsSyntax, g_aNDSSyntaxMap[dwSyntaxId].bstrName);
|
|
}
|
|
RRETURN(S_OK);
|
|
|
|
}
|
|
|
|
HRESULT
|
|
MapSyntaxIdtoNDSSyntax(
|
|
DWORD dwSyntaxId,
|
|
LPWSTR pszNDSSyntax
|
|
)
|
|
{
|
|
|
|
if (dwSyntaxId > g_cNDSSyntaxMap) {
|
|
wcscpy(pszNDSSyntax, L"Out of Bounds");
|
|
}else {
|
|
wcscpy(pszNDSSyntax, g_aNDSSyntaxMap[dwSyntaxId].bstrNDSName);
|
|
}
|
|
RRETURN(S_OK);
|
|
|
|
}
|