583 lines
9.5 KiB
C++
583 lines
9.5 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 1996 Microsoft Corporation
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Adds properties to ds
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Steve Wilson (NT) December 1996
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
#include <precomp.h>
|
||
|
#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:
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
|
||
|
HRESULT
|
||
|
put_LONG_Property(
|
||
|
IADs * pADsObject,
|
||
|
BSTR bstrPropertyName,
|
||
|
LONG lSrcProperty
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
VARIANT varInputData;
|
||
|
|
||
|
hr = PackLONGinVariant(
|
||
|
lSrcProperty,
|
||
|
&varInputData
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
|
||
|
hr = pADsObject->Put(
|
||
|
bstrPropertyName,
|
||
|
varInputData
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
error:
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
get_LONG_Property(
|
||
|
IADs * pADsObject,
|
||
|
BSTR bstrPropertyName,
|
||
|
PLONG plDestProperty
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
VARIANT varOutputData;
|
||
|
|
||
|
VALIDATE_PTR( plDestProperty );
|
||
|
|
||
|
VariantInit( &varOutputData );
|
||
|
|
||
|
hr = pADsObject->Get(
|
||
|
bstrPropertyName,
|
||
|
&varOutputData
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
hr = UnpackLONGfromVariant(
|
||
|
varOutputData,
|
||
|
plDestProperty
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
|
||
|
error:
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
put_DATE_Property(
|
||
|
IADs * pADsObject,
|
||
|
BSTR bstrPropertyName,
|
||
|
DATE daSrcProperty
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
VARIANT varInputData;
|
||
|
|
||
|
hr = PackDATEinVariant(
|
||
|
daSrcProperty,
|
||
|
&varInputData
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
|
||
|
hr = pADsObject->Put(
|
||
|
bstrPropertyName,
|
||
|
varInputData
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
error:
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
get_DATE_Property(
|
||
|
IADs * pADsObject,
|
||
|
BSTR bstrPropertyName,
|
||
|
DATE *pdaDestProperty
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
VARIANT varOutputData;
|
||
|
|
||
|
VALIDATE_PTR( pdaDestProperty );
|
||
|
|
||
|
VariantInit( &varOutputData );
|
||
|
|
||
|
hr = pADsObject->Get(
|
||
|
bstrPropertyName,
|
||
|
&varOutputData
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
hr = UnpackDATEfromVariant(
|
||
|
varOutputData,
|
||
|
pdaDestProperty
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
|
||
|
error:
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
put_VARIANT_BOOL_Property(
|
||
|
IADs * pADsObject,
|
||
|
BSTR bstrPropertyName,
|
||
|
VARIANT_BOOL fSrcProperty
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
VARIANT varInputData;
|
||
|
|
||
|
hr = PackVARIANT_BOOLinVariant(
|
||
|
fSrcProperty,
|
||
|
&varInputData
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
|
||
|
hr = pADsObject->Put(
|
||
|
bstrPropertyName,
|
||
|
varInputData
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
error:
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
get_VARIANT_BOOL_Property(
|
||
|
IADs * pADsObject,
|
||
|
BSTR bstrPropertyName,
|
||
|
VARIANT_BOOL *pfDestProperty
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
VARIANT varOutputData;
|
||
|
|
||
|
VALIDATE_PTR( pfDestProperty );
|
||
|
|
||
|
VariantInit( &varOutputData );
|
||
|
|
||
|
hr = pADsObject->Get(
|
||
|
bstrPropertyName,
|
||
|
&varOutputData
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
hr = UnpackVARIANT_BOOLfromVariant(
|
||
|
varOutputData,
|
||
|
pfDestProperty
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
|
||
|
error:
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
get_VARIANT_Property(
|
||
|
IADs * pADsObject,
|
||
|
BSTR bstrPropertyName,
|
||
|
VARIANT *pvDestProperty
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
VARIANT varOutputData;
|
||
|
|
||
|
VALIDATE_PTR( pvDestProperty );
|
||
|
|
||
|
VariantInit( &varOutputData );
|
||
|
|
||
|
hr = pADsObject->Get(
|
||
|
bstrPropertyName,
|
||
|
&varOutputData
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
hr = UnpackVARIANTfromVariant(
|
||
|
varOutputData,
|
||
|
pvDestProperty
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
error:
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
*/
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|