Source code of Windows XP (NT5)
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

//---------------------------------------------------------------------------
//
// 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);
}