Leaked source code of windows server 2003
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.
 
 
 
 
 
 

317 lines
9.4 KiB

#ifndef _PROPUTIL_H
#define _PROPUTIL_H
#ifndef __wizchain_h__
#include "wizchain.h"
#endif
// delete
inline HRESULT DeleteProperty (IPropertyPagePropertyBag * pPPPBag, LPOLESTR szGUID)
{
USES_CONVERSION;
if( !pPPPBag || !szGUID ) return E_POINTER;
HRESULT hr = S_OK;
BSTR szGuid = SysAllocString (szGUID);
if (!szGuid)
hr = E_OUTOFMEMORY;
else {
VARIANT var;
VariantInit (&var);
hr = pPPPBag->SetProperty (szGuid, &var, PPPBAG_TYPE_DELETION);
SysFreeString (szGuid);
}
return hr;
}
// readers
inline HRESULT ReadInt4 (IPropertyPagePropertyBag * pPPPBag, LPOLESTR szGUID, long * pl, BOOL * pbReadOnly)
{
USES_CONVERSION;
if( !pPPPBag || !szGUID || !pl || !pbReadOnly ) return E_POINTER;
*pbReadOnly = FALSE; // default
HRESULT hr = S_OK;
BSTR szGuid = SysAllocString (szGUID);
if (!szGuid)
hr = E_OUTOFMEMORY;
else {
VARIANT var;
VariantInit (&var);
PPPBAG_TYPE dwFlags = PPPBAG_TYPE_UNINITIALIZED;
BOOL bIsOwner = FALSE;
hr = pPPPBag->GetProperty (szGuid, &var, &dwFlags, &bIsOwner);
if (hr == S_OK) {
*pbReadOnly = FALSE;
if (dwFlags == PPPBAG_TYPE_READONLY)
if (bIsOwner == FALSE)
*pbReadOnly = TRUE;
if (V_VT(&var) == VT_I4) // make sure variant is a i4
*pl = V_I4(&var);
else
if (V_VT(&var) == VT_I2) // VBScript uses i2
*pl = V_I2(&var);
else
hr = E_UNEXPECTED;
VariantClear (&var);
}
SysFreeString (szGuid);
}
return hr;
}
inline HRESULT ReadString (IPropertyPagePropertyBag * pPPPBag, LPOLESTR szGUID, CString& str, BOOL * pbReadOnly)
{
USES_CONVERSION;
if( !pPPPBag || !szGUID || !pbReadOnly ) return E_POINTER;
*pbReadOnly = FALSE; // default
HRESULT hr = S_OK;
BSTR szGuid = SysAllocString (szGUID);
if (!szGuid)
hr = E_OUTOFMEMORY;
else {
VARIANT var;
VariantInit (&var);
PPPBAG_TYPE dwFlags = PPPBAG_TYPE_UNINITIALIZED;
BOOL bIsOwner = FALSE;
hr = pPPPBag->GetProperty (szGuid, &var, &dwFlags, &bIsOwner);
if (hr == S_OK) {
if (V_VT(&var) != VT_BSTR) // make sure variant is a bstr
hr = E_UNEXPECTED;
else {
*pbReadOnly = FALSE;
if (dwFlags == PPPBAG_TYPE_READONLY)
if (bIsOwner == FALSE)
*pbReadOnly = TRUE;
str = V_BSTR(&var);
}
VariantClear (&var);
}
SysFreeString (szGuid);
}
return hr;
}
inline HRESULT ReadBool (IPropertyPagePropertyBag * pPPPBag, LPOLESTR szGUID, BOOL * pb, BOOL * pbReadOnly)
{
USES_CONVERSION;
if( !pPPPBag || !szGUID || !pb || !pbReadOnly) return E_POINTER;
*pbReadOnly = FALSE; // defaults
HRESULT hr = S_OK;
BSTR szGuid = SysAllocString (szGUID);
if ( NULL == szGuid )
hr = E_OUTOFMEMORY;
else {
VARIANT var;
VariantInit (&var);
PPPBAG_TYPE dwFlags = PPPBAG_TYPE_UNINITIALIZED;
BOOL bIsOwner = FALSE;
hr = pPPPBag->GetProperty (szGuid, &var, &dwFlags, &bIsOwner);
if ( S_OK == hr ) {
if ( VT_BOOL != V_VT( &var )) // make sure variant is a bool
hr = E_INVALIDARG;
else {
*pbReadOnly = FALSE;
if ( PPPBAG_TYPE_READONLY == dwFlags )
if ( FALSE == bIsOwner )
*pbReadOnly = TRUE;
if ( VARIANT_FALSE == V_BOOL( &var ))
*pb = FALSE;
else
*pb = TRUE;
}
VariantClear (&var);
}
SysFreeString (szGuid);
}
return hr;
}
inline HRESULT ReadSafeArray (IPropertyPagePropertyBag * pPPPBag, LPOLESTR szGUID, SAFEARRAY ** ppSA, BOOL * pbReadOnly)
{
USES_CONVERSION;
if( !pPPPBag || !szGUID || !ppSA || !pbReadOnly ) return E_POINTER;
*ppSA = NULL;
*pbReadOnly = FALSE; // defaults
HRESULT hr = S_OK;
BSTR szGuid = SysAllocString (szGUID);
if (!szGuid)
hr = E_OUTOFMEMORY;
else {
VARIANT var;
VariantInit (&var);
PPPBAG_TYPE dwFlags = PPPBAG_TYPE_UNINITIALIZED;
BOOL bIsOwner = FALSE;
hr = pPPPBag->GetProperty (szGuid, &var, &dwFlags, &bIsOwner);
if (hr == S_OK) {
if (!(V_VT(&var) & VT_ARRAY))// make sure variant is a safearray
hr = E_UNEXPECTED;
else {
*pbReadOnly = FALSE;
if (dwFlags == PPPBAG_TYPE_READONLY)
if (bIsOwner == FALSE)
*pbReadOnly = TRUE;
if (V_VT(&var) & VT_BYREF) // VBScript does stuff byref
hr = SafeArrayCopy (*V_ARRAYREF(&var), ppSA);
else
hr = SafeArrayCopy (V_ARRAY(&var), ppSA);
}
VariantClear (&var);
}
SysFreeString (szGuid);
}
return hr;
}
inline HRESULT ReadVariant (IPropertyPagePropertyBag * pPPPBag, LPOLESTR szGUID, VARIANT& var, BOOL * pbReadOnly)
{
USES_CONVERSION;
if( !pPPPBag || !szGUID || !pbReadOnly ) return E_POINTER;
*pbReadOnly = FALSE; // default
HRESULT hr = S_OK;
BSTR szGuid = SysAllocString (szGUID);
if (!szGuid)
hr = E_OUTOFMEMORY;
else {
VariantInit (&var);
PPPBAG_TYPE dwFlags = PPPBAG_TYPE_UNINITIALIZED;
BOOL bIsOwner = FALSE;
hr = pPPPBag->GetProperty (szGuid, &var, &dwFlags, &bIsOwner);
if (hr == S_OK) {
*pbReadOnly = FALSE;
if (dwFlags == PPPBAG_TYPE_READONLY)
if (bIsOwner == FALSE)
*pbReadOnly = TRUE;
}
SysFreeString (szGuid);
}
return hr;
}
// writers
inline HRESULT WriteInt4 (IPropertyPagePropertyBag * pPPPBag, LPOLESTR szGUID, long l, BOOL bReadOnly)
{
USES_CONVERSION;
if( !pPPPBag || !szGUID ) return E_POINTER;
HRESULT hr = S_OK;
BSTR szGuid = SysAllocString (szGUID);
if (!szGuid)
hr = E_OUTOFMEMORY;
else {
VARIANT var;
VariantInit (&var);
V_VT(&var) = VT_I4;
V_INT(&var) = l; // signed int (I4, I hope)
hr = pPPPBag->SetProperty (szGuid, &var, bReadOnly == FALSE ? PPPBAG_TYPE_READWRITE : PPPBAG_TYPE_READONLY);
VariantClear (&var);
SysFreeString (szGuid);
}
return hr;
}
inline HRESULT WriteString (IPropertyPagePropertyBag * pPPPBag, LPOLESTR szGUID, CString& str, BOOL bReadOnly)
{
USES_CONVERSION;
if( !pPPPBag || !szGUID ) return E_POINTER;
HRESULT hr = S_OK;
BSTR szGuid = SysAllocString (szGUID);
if (!szGuid)
hr = E_OUTOFMEMORY;
else {
BSTR bstr = SysAllocString (T2BSTR(str));
if (!bstr)
hr = E_OUTOFMEMORY;
else {
VARIANT var;
VariantInit (&var);
V_VT(&var) = VT_BSTR;
V_BSTR(&var) = bstr;
hr = pPPPBag->SetProperty (szGuid, &var, bReadOnly == FALSE ? PPPBAG_TYPE_READWRITE : PPPBAG_TYPE_READONLY);
VariantClear (&var);
// the line above frees the bstr.
}
SysFreeString (szGuid);
}
return hr;
}
inline HRESULT WriteBool (IPropertyPagePropertyBag * pPPPBag, LPOLESTR szGUID, BOOL b, BOOL bReadOnly)
{
USES_CONVERSION;
if( !pPPPBag || !szGUID ) return E_POINTER;
HRESULT hr = S_OK;
BSTR szGuid = SysAllocString (szGUID);
if (!szGuid)
hr = E_OUTOFMEMORY;
else {
VARIANT var;
VariantInit (&var);
V_VT(&var) = VT_BOOL;
V_BOOL(&var) = b == FALSE ? VARIANT_FALSE : VARIANT_TRUE;
hr = pPPPBag->SetProperty (szGuid, &var, bReadOnly == FALSE ? PPPBAG_TYPE_READWRITE : PPPBAG_TYPE_READONLY);
VariantClear (&var);
SysFreeString (szGuid);
}
return hr;
}
inline HRESULT WriteSafeArray (IPropertyPagePropertyBag * pPPPBag, LPOLESTR szGUID, SAFEARRAY * pSA, BOOL bReadOnly)
{
USES_CONVERSION;
if( !pPPPBag || !szGUID || !pSA ) return E_POINTER;
HRESULT hr = S_OK;
BSTR szGuid = SysAllocString (szGUID);
if (!szGuid)
hr = E_OUTOFMEMORY;
else {
VARIANT var;
VariantInit (&var);
V_VT(&var) = VT_ARRAY | VT_VARIANT;
SAFEARRAY * pSACopy = NULL;
hr = SafeArrayCopy (pSA, &pSACopy);
if (pSACopy) {
V_ARRAY(&var) = pSACopy;
hr = pPPPBag->SetProperty (szGuid, &var, bReadOnly == FALSE ? PPPBAG_TYPE_READWRITE : PPPBAG_TYPE_READONLY);
// DON'T call VariantClear!
}
SysFreeString (szGuid);
}
return hr;
}
inline HRESULT WriteVariant (IPropertyPagePropertyBag * pPPPBag, LPOLESTR szGUID, VARIANT var, BOOL bReadOnly)
{
USES_CONVERSION;
if( !pPPPBag || !szGUID ) return E_POINTER;
HRESULT hr = S_OK;
BSTR szGuid = SysAllocString (szGUID);
if (!szGuid)
hr = E_OUTOFMEMORY;
else {
hr = pPPPBag->SetProperty (szGuid, &var, bReadOnly == FALSE ? PPPBAG_TYPE_READWRITE : PPPBAG_TYPE_READONLY);
SysFreeString (szGuid);
}
return hr;
}
#endif