//--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1999 // // File: CDNWithBinary.cxx // // Contents: DNWithBinary object // // History: 4-23-99 AjayR Created. // //---------------------------------------------------------------------------- #include "oleds.hxx" #pragma hdrstop // Class CDNWithBinary DEFINE_IDispatch_Implementation(CDNWithBinary) CDNWithBinary::CDNWithBinary(): _pDispMgr(NULL), _pszDNStr(NULL), _dwLength(0), _lpOctetStr(NULL) { ENLIST_TRACKING(CDNWithBinary); } HRESULT CDNWithBinary::CreateDNWithBinary( REFIID riid, void **ppvObj ) { CDNWithBinary FAR * pDNWithBinary = NULL; HRESULT hr = S_OK; hr = AllocateDNWithBinaryObject(&pDNWithBinary); BAIL_ON_FAILURE(hr); hr = pDNWithBinary->QueryInterface(riid, ppvObj); BAIL_ON_FAILURE(hr); pDNWithBinary->Release(); RRETURN(hr); error: delete pDNWithBinary; RRETURN_EXP_IF_ERR(hr); } CDNWithBinary::~CDNWithBinary( ) { delete _pDispMgr; if (_lpOctetStr) { FreeADsMem(_lpOctetStr); } if (_pszDNStr) { FreeADsStr(_pszDNStr); } } STDMETHODIMP CDNWithBinary::QueryInterface( REFIID iid, LPVOID FAR* ppv ) { if (IsEqualIID(iid, IID_IUnknown)) { *ppv = (IADsDNWithBinary FAR *) this; } else if (IsEqualIID(iid, IID_IADsDNWithBinary)) { *ppv = (IADsDNWithBinary FAR *) this; } else if (IsEqualIID(iid, IID_IDispatch)) { *ppv = (IADsDNWithBinary FAR *) this; } else if (IsEqualIID(iid, IID_ISupportErrorInfo)) { *ppv = (ISupportErrorInfo FAR *) this; } else { *ppv = NULL; return E_NOINTERFACE; } AddRef(); return NOERROR; } HRESULT CDNWithBinary::AllocateDNWithBinaryObject( CDNWithBinary ** ppDNWithBinary ) { CDNWithBinary FAR * pDNWithBinary = NULL; CDispatchMgr FAR * pDispMgr = NULL; HRESULT hr = S_OK; pDNWithBinary = new CDNWithBinary(); if (pDNWithBinary == 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_IADsDNWithBinary, (IADsDNWithBinary *)pDNWithBinary, DISPID_REGULAR ); BAIL_ON_FAILURE(hr); pDNWithBinary->_pDispMgr = pDispMgr; *ppDNWithBinary = pDNWithBinary; RRETURN(hr); error: delete pDNWithBinary; delete pDispMgr; RRETURN_EXP_IF_ERR(hr); } STDMETHODIMP CDNWithBinary::InterfaceSupportsErrorInfo(THIS_ REFIID riid) { if (IsEqualIID(riid, IID_IADsDNWithBinary)) { return S_OK; } else { return S_FALSE; } } // // Methods to get and put the octet string part. // STDMETHODIMP CDNWithBinary::get_BinaryValue(THIS_ VARIANT FAR* pvBinaryValue) { HRESULT hr = S_OK; SAFEARRAY *aList = NULL; SAFEARRAYBOUND aBound; CHAR HUGEP *pArray = NULL; /* if (!pvBinaryValue) { } RRETURN_EXP_IF_ERR(hr = E_ADS_BAD_PARAMETER); } */ aBound.lLbound = 0; aBound.cElements = _dwLength; aList = SafeArrayCreate( VT_UI1, 1, &aBound ); if ( aList == NULL ) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); } hr = SafeArrayAccessData( aList, (void HUGEP * FAR *) &pArray ); BAIL_ON_FAILURE(hr); memcpy( pArray, _lpOctetStr, aBound.cElements ); SafeArrayUnaccessData( aList ); V_VT(pvBinaryValue) = VT_ARRAY | VT_UI1; V_ARRAY(pvBinaryValue) = aList; RRETURN(hr); error: if ( aList ) SafeArrayDestroy( aList ); RRETURN(hr); } STDMETHODIMP CDNWithBinary::put_BinaryValue(THIS_ VARIANT vBinaryValue) { HRESULT hr = S_OK; VARIANT *pvProp = NULL; LONG dwSLBound = 0; LONG dwSUBound = 0; CHAR HUGEP *pArray = NULL; // // Check for variant by ref. // pvProp = &vBinaryValue; if (V_VT(pvProp) == (VT_BYREF|VT_VARIANT)) { pvProp = V_VARIANTREF(&vBinaryValue); } if (_lpOctetStr) { FreeADsMem(_lpOctetStr); _lpOctetStr = NULL; _dwLength = 0; } if( pvProp->vt != (VT_ARRAY | VT_UI1)) { RRETURN(hr = E_ADS_BAD_PARAMETER); } hr = SafeArrayGetLBound( V_ARRAY(pvProp), 1, (long FAR *) &dwSLBound ); BAIL_ON_FAILURE(hr); hr = SafeArrayGetUBound( V_ARRAY(pvProp), 1, (long FAR *) &dwSUBound ); BAIL_ON_FAILURE(hr); _dwLength = dwSUBound -dwSLBound + 1; _lpOctetStr = (LPBYTE) AllocADsMem(_dwLength); if (!_lpOctetStr) { BAIL_ON_FAILURE(hr = E_OUTOFMEMORY); } hr = SafeArrayAccessData( V_ARRAY(pvProp), (void HUGEP * FAR *) &pArray ); BAIL_ON_FAILURE(hr); memcpy(_lpOctetStr, pArray, _dwLength); SafeArrayUnaccessData( V_ARRAY(pvProp) ); error: if (_lpOctetStr && FAILED(hr)) { FreeADsMem(_lpOctetStr); _lpOctetStr = NULL; _dwLength = NULL; } RRETURN(hr); } // // Methods to get and put the DN string. // STDMETHODIMP CDNWithBinary::get_DNString(THIS_ BSTR FAR* pbstrDNString) { HRESULT hr = S_OK; if (FAILED(hr = ValidateOutParameter(pbstrDNString))){ RRETURN_EXP_IF_ERR(hr); } hr = ADsAllocString(_pszDNStr, pbstrDNString); RRETURN_EXP_IF_ERR(hr); } STDMETHODIMP CDNWithBinary::put_DNString(THIS_ BSTR bstrDNString) { HRESULT hr = S_OK; if (_pszDNStr) { FreeADsStr(_pszDNStr); _pszDNStr = NULL; } _pszDNStr = AllocADsStr(bstrDNString); if (bstrDNString && !_pszDNStr) { hr = E_OUTOFMEMORY; } RRETURN(hr); }