/*++ Copyright (c) 1996 Microsoft Corporation Abstract: Adds properties to ds Author: Steve Wilson (NT) December 1996 Revision History: --*/ #include #pragma hdrstop #define VALIDATE_PTR(pPtr) \ if (!pPtr) { \ hr = E_ADS_BAD_PARAMETER;\ }\ BAIL_ON_FAILURE(hr); HRESULT put_BSTR_Property( IADs * pADsObject, BSTR bstrPropertyName, BSTR pSrcStringProperty ) { HRESULT hr; VARIANT varInputData; hr = PackString2Variant( pSrcStringProperty, &varInputData ); BAIL_ON_FAILURE(hr); if (!pSrcStringProperty || !*pSrcStringProperty) { hr = pADsObject->PutEx( ADS_PROPERTY_CLEAR, bstrPropertyName, varInputData ); BAIL_ON_FAILURE(hr); } else { hr = pADsObject->Put( bstrPropertyName, varInputData ); BAIL_ON_FAILURE(hr); } error: VariantClear(&varInputData); return hr; } HRESULT get_BSTR_Property( IADs *pADsObject, BSTR bstrPropertyName, BSTR *ppDestStringProperty ) { HRESULT hr = S_OK; VARIANT varOutputData; VALIDATE_PTR( ppDestStringProperty ); VariantInit( &varOutputData ); hr = pADsObject->Get( bstrPropertyName, &varOutputData ); BAIL_ON_FAILURE(hr); hr = UnpackStringfromVariant( varOutputData, ppDestStringProperty ); BAIL_ON_FAILURE(hr); error: return hr; } HRESULT put_DWORD_Property( IADs *pADsObject, BSTR bstrPropertyName, DWORD *pdwSrcProperty ) { HRESULT hr = S_OK; VARIANT varInputData; if (!pdwSrcProperty) return S_OK; hr = PackDWORD2Variant( *pdwSrcProperty, &varInputData ); BAIL_ON_FAILURE(hr); hr = pADsObject->Put( bstrPropertyName, varInputData ); BAIL_ON_FAILURE(hr); error: return hr; } HRESULT get_DWORD_Property( IADs *pADsObject, BSTR bstrPropertyName, PDWORD pdwDestProperty ) { HRESULT hr = S_OK; VARIANT varOutputData; VALIDATE_PTR( pdwDestProperty ); VariantInit( &varOutputData ); hr = pADsObject->Get( bstrPropertyName, &varOutputData ); BAIL_ON_FAILURE(hr); hr = UnpackDWORDfromVariant( varOutputData, pdwDestProperty ); BAIL_ON_FAILURE(hr); error: return hr; } HRESULT put_Dispatch_Property( IADs *pADsObject, BSTR bstrPropertyName, IDispatch *pdwSrcProperty ) { HRESULT hr = S_OK; VARIANT varInputData; if (!pdwSrcProperty) return S_OK; hr = PackDispatch2Variant( pdwSrcProperty, &varInputData ); BAIL_ON_FAILURE(hr); hr = pADsObject->Put( bstrPropertyName, varInputData ); BAIL_ON_FAILURE(hr); error: return hr; } HRESULT get_Dispatch_Property( IADs *pADsObject, BSTR bstrPropertyName, IDispatch **ppDispatch ) { HRESULT hr = S_OK; VARIANT varOutputData; VariantInit( &varOutputData ); hr = pADsObject->Get( bstrPropertyName, &varOutputData ); BAIL_ON_FAILURE(hr); hr = UnpackDispatchfromVariant( varOutputData, ppDispatch ); BAIL_ON_FAILURE(hr); error: return hr; } HRESULT put_MULTISZ_Property( IADs *pADsObject, BSTR bstrPropertyName, BSTR pSrcStringProperty ) { HRESULT hr = S_OK; VARIANT var; VARIANT varInputData; BSTR pStr; BSTR *pStrArray; DWORD i; BSTR pMultiString; if (!pSrcStringProperty || !*pSrcStringProperty) pMultiString = L""; else pMultiString = pSrcStringProperty; VariantInit(&var); // Convert MULTI_SZ to string array (last element of array must be NULL) for (i = 0, pStr = pMultiString ; *pStr ; ++i, pStr += wcslen(pStr) + 1) ; if (!(pStrArray = (BSTR *) AllocSplMem((i + 1)*sizeof(BSTR)))) { hr = MAKE_HRESULT( SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); BAIL_ON_FAILURE(hr); } for (i = 0, pStr = pMultiString ; *pStr ; ++i, pStr += wcslen(pStr) + 1) pStrArray[i] = pStr; pStrArray[i] = NULL; MakeVariantFromStringArray(pStrArray, &var); FreeSplMem(pStrArray); hr = PackVARIANTinVariant( var, &varInputData ); BAIL_ON_FAILURE(hr); if (!pSrcStringProperty || !*pSrcStringProperty) { hr = pADsObject->PutEx( ADS_PROPERTY_CLEAR, bstrPropertyName, varInputData ); BAIL_ON_FAILURE(hr); } else { hr = pADsObject->Put( bstrPropertyName, varInputData ); BAIL_ON_FAILURE(hr); } error: VariantClear(&var); VariantClear(&varInputData); return hr; } HRESULT put_BOOL_Property( IADs *pADsObject, BSTR bstrPropertyName, BOOL *bSrcProperty ) { HRESULT hr = S_OK; VARIANT varInputData; BOOL bVal; bVal = bSrcProperty ? *bSrcProperty : 0; hr = PackBOOL2Variant( bVal, &varInputData ); BAIL_ON_FAILURE(hr); if (!bSrcProperty) { hr = pADsObject->PutEx( ADS_PROPERTY_CLEAR, bstrPropertyName, varInputData ); BAIL_ON_FAILURE(hr); } else { hr = pADsObject->Put( bstrPropertyName, varInputData ); BAIL_ON_FAILURE(hr); } error: return hr; } HRESULT get_UI1Array_Property( IADs *pADsObject, BSTR bstrPropertyName, IID *pIID ) { HRESULT hr = S_OK; VARIANT varOutputData; VariantInit( &varOutputData ); hr = pADsObject->Get( bstrPropertyName, &varOutputData ); BAIL_ON_FAILURE(hr); hr = UI1Array2IID( varOutputData, pIID ); BAIL_ON_FAILURE(hr); error: VariantClear(&varOutputData); return hr; } HRESULT get_SID_Property( IADs *pADsObject, BSTR bstrPropertyName, LPWSTR *ppszSID ) { HRESULT hr = S_OK; VARIANT varOutputData; VariantInit( &varOutputData ); hr = pADsObject->Get( bstrPropertyName, &varOutputData ); BAIL_ON_FAILURE(hr); hr = UI1Array2SID( varOutputData, ppszSID ); BAIL_ON_FAILURE(hr); error: VariantClear(&varOutputData); return hr; }