windows-nt/Source/XPSP1/NT/printscan/ui/uicommon/pshelper.cpp
2020-09-26 16:20:57 +08:00

560 lines
22 KiB
C++

#include "precomp.h"
#pragma hdrstop
#if defined(DBG)
WIA_PROPID_TO_NAME g_wiaPropIdToName[] =
{
{ WIA_DIP_DEV_ID, WIA_DIP_DEV_ID_STR },
{ WIA_DIP_VEND_DESC, WIA_DIP_VEND_DESC_STR },
{ WIA_DIP_DEV_DESC, WIA_DIP_DEV_DESC_STR },
{ WIA_DIP_DEV_TYPE, WIA_DIP_DEV_TYPE_STR },
{ WIA_DIP_PORT_NAME, WIA_DIP_PORT_NAME_STR },
{ WIA_DIP_DEV_NAME, WIA_DIP_DEV_NAME_STR },
{ WIA_DIP_SERVER_NAME, WIA_DIP_SERVER_NAME_STR },
{ WIA_DIP_REMOTE_DEV_ID, WIA_DIP_REMOTE_DEV_ID_STR },
{ WIA_DIP_UI_CLSID, WIA_DIP_UI_CLSID_STR },
{ WIA_DIP_HW_CONFIG, WIA_DIP_HW_CONFIG_STR },
{ WIA_DIP_BAUDRATE, WIA_DIP_BAUDRATE_STR },
{ WIA_DIP_STI_GEN_CAPABILITIES, WIA_DIP_STI_GEN_CAPABILITIES_STR },
{ WIA_DPA_FIRMWARE_VERSION, WIA_DPA_FIRMWARE_VERSION_STR },
{ WIA_DPA_CONNECT_STATUS, WIA_DPA_CONNECT_STATUS_STR },
{ WIA_DPA_DEVICE_TIME, WIA_DPA_DEVICE_TIME_STR },
{ WIA_DPC_PICTURES_TAKEN, WIA_DPC_PICTURES_TAKEN_STR },
{ WIA_DPC_PICTURES_REMAINING, WIA_DPC_PICTURES_REMAINING_STR },
{ WIA_DPC_EXPOSURE_MODE, WIA_DPC_EXPOSURE_MODE_STR },
{ WIA_DPC_EXPOSURE_COMP, WIA_DPC_EXPOSURE_COMP_STR },
{ WIA_DPC_EXPOSURE_TIME, WIA_DPC_EXPOSURE_TIME_STR },
{ WIA_DPC_FNUMBER, WIA_DPC_FNUMBER_STR },
{ WIA_DPC_FLASH_MODE, WIA_DPC_FLASH_MODE_STR },
{ WIA_DPC_FOCUS_MODE, WIA_DPC_FOCUS_MODE_STR },
{ WIA_DPC_FOCUS_MANUAL_DIST, WIA_DPC_FOCUS_MANUAL_DIST_STR },
{ WIA_DPC_ZOOM_POSITION, WIA_DPC_ZOOM_POSITION_STR },
{ WIA_DPC_PAN_POSITION, WIA_DPC_PAN_POSITION_STR },
{ WIA_DPC_TILT_POSITION, WIA_DPC_TILT_POSITION_STR },
{ WIA_DPC_TIMER_MODE, WIA_DPC_TIMER_MODE_STR },
{ WIA_DPC_TIMER_VALUE, WIA_DPC_TIMER_VALUE_STR },
{ WIA_DPC_POWER_MODE, WIA_DPC_POWER_MODE_STR },
{ WIA_DPC_BATTERY_STATUS, WIA_DPC_BATTERY_STATUS_STR },
{ WIA_DPC_THUMB_WIDTH, WIA_DPC_THUMB_WIDTH_STR },
{ WIA_DPC_THUMB_HEIGHT, WIA_DPC_THUMB_HEIGHT_STR },
{ WIA_DPC_PICT_WIDTH, WIA_DPC_PICT_WIDTH_STR },
{ WIA_DPC_PICT_HEIGHT, WIA_DPC_PICT_HEIGHT_STR },
{ WIA_DPC_DIMENSION, WIA_DPC_DIMENSION_STR },
{ WIA_DPC_COMPRESSION_SETTING, WIA_DPC_COMPRESSION_SETTING_STR },
{ WIA_DPC_FOCUS_METERING_MODE, WIA_DPC_FOCUS_METERING_MODE_STR },
{ WIA_DPC_TIMELAPSE_INTERVAL, WIA_DPC_TIMELAPSE_INTERVAL_STR },
{ WIA_DPC_TIMELAPSE_NUMBER, WIA_DPC_TIMELAPSE_NUMBER_STR },
{ WIA_DPC_BURST_INTERVAL, WIA_DPC_BURST_INTERVAL_STR },
{ WIA_DPC_BURST_NUMBER, WIA_DPC_BURST_NUMBER_STR },
{ WIA_DPC_EFFECT_MODE, WIA_DPC_EFFECT_MODE_STR },
{ WIA_DPC_DIGITAL_ZOOM, WIA_DPC_DIGITAL_ZOOM_STR },
{ WIA_DPC_SHARPNESS, WIA_DPC_SHARPNESS_STR },
{ WIA_DPC_CONTRAST, WIA_DPC_CONTRAST_STR },
{ WIA_DPC_CAPTURE_MODE, WIA_DPC_CAPTURE_MODE_STR },
{ WIA_DPC_CAPTURE_DELAY, WIA_DPC_CAPTURE_DELAY_STR },
{ WIA_DPC_EXPOSURE_INDEX, WIA_DPC_EXPOSURE_INDEX_STR },
{ WIA_DPC_EXPOSURE_METERING_MODE, WIA_DPC_EXPOSURE_METERING_MODE_STR },
{ WIA_DPC_FOCUS_DISTANCE, WIA_DPC_FOCUS_DISTANCE_STR },
{ WIA_DPC_FOCAL_LENGTH, WIA_DPC_FOCAL_LENGTH_STR },
{ WIA_DPC_RGB_GAIN, WIA_DPC_RGB_GAIN_STR },
{ WIA_DPC_WHITE_BALANCE, WIA_DPC_WHITE_BALANCE_STR },
{ WIA_DPC_UPLOAD_URL, WIA_DPC_UPLOAD_URL_STR },
{ WIA_DPC_ARTIST, WIA_DPC_ARTIST_STR },
{ WIA_DPC_COPYRIGHT_INFO, WIA_DPC_COPYRIGHT_INFO_STR },
{ WIA_DPS_HORIZONTAL_BED_SIZE, WIA_DPS_HORIZONTAL_BED_SIZE_STR },
{ WIA_DPS_VERTICAL_BED_SIZE, WIA_DPS_VERTICAL_BED_SIZE_STR },
{ WIA_DPS_HORIZONTAL_SHEET_FEED_SIZE, WIA_DPS_HORIZONTAL_SHEET_FEED_SIZE_STR },
{ WIA_DPS_VERTICAL_SHEET_FEED_SIZE, WIA_DPS_VERTICAL_SHEET_FEED_SIZE_STR },
{ WIA_DPS_SHEET_FEEDER_REGISTRATION, WIA_DPS_SHEET_FEEDER_REGISTRATION_STR },
{ WIA_DPS_HORIZONTAL_BED_REGISTRATION, WIA_DPS_HORIZONTAL_BED_REGISTRATION_STR },
{ WIA_DPS_VERTICAL_BED_REGISTRATION, WIA_DPS_VERTICAL_BED_REGISTRATION_STR },
{ WIA_DPS_PLATEN_COLOR, WIA_DPS_PLATEN_COLOR_STR },
{ WIA_DPS_PAD_COLOR, WIA_DPS_PAD_COLOR_STR },
{ WIA_DPS_FILTER_SELECT, WIA_DPS_FILTER_SELECT_STR },
{ WIA_DPS_DITHER_SELECT, WIA_DPS_DITHER_SELECT_STR },
{ WIA_DPS_DITHER_PATTERN_DATA, WIA_DPS_DITHER_PATTERN_DATA_STR },
{ WIA_DPS_DOCUMENT_HANDLING_CAPABILITIES, WIA_DPS_DOCUMENT_HANDLING_CAPABILITIES_STR },
{ WIA_DPS_DOCUMENT_HANDLING_STATUS, WIA_DPS_DOCUMENT_HANDLING_STATUS_STR },
{ WIA_DPS_DOCUMENT_HANDLING_SELECT, WIA_DPS_DOCUMENT_HANDLING_SELECT_STR },
{ WIA_DPS_DOCUMENT_HANDLING_CAPACITY, WIA_DPS_DOCUMENT_HANDLING_CAPACITY_STR },
{ WIA_DPS_OPTICAL_XRES, WIA_DPS_OPTICAL_XRES_STR },
{ WIA_DPS_OPTICAL_YRES, WIA_DPS_OPTICAL_YRES_STR },
{ WIA_DPS_ENDORSER_CHARACTERS, WIA_DPS_ENDORSER_CHARACTERS_STR },
{ WIA_DPS_ENDORSER_STRING, WIA_DPS_ENDORSER_STRING_STR },
{ WIA_DPS_SCAN_AHEAD_PAGES, WIA_DPS_SCAN_AHEAD_PAGES_STR },
{ WIA_DPS_MAX_SCAN_TIME, WIA_DPS_MAX_SCAN_TIME_STR },
{ WIA_DPS_PAGES, WIA_DPS_PAGES_STR },
{ WIA_DPS_PAGE_SIZE, WIA_DPS_PAGE_SIZE_STR },
{ WIA_DPS_PAGE_WIDTH, WIA_DPS_PAGE_WIDTH_STR },
{ WIA_DPS_PAGE_HEIGHT, WIA_DPS_PAGE_HEIGHT_STR },
{ WIA_DPS_PREVIEW, WIA_DPS_PREVIEW_STR },
{ WIA_DPS_TRANSPARENCY, WIA_DPS_TRANSPARENCY_STR },
{ WIA_DPS_TRANSPARENCY_SELECT, WIA_DPS_TRANSPARENCY_SELECT_STR },
{ WIA_DPS_SHOW_PREVIEW_CONTROL, WIA_DPS_SHOW_PREVIEW_CONTROL_STR },
{ WIA_DPS_MIN_HORIZONTAL_SHEET_FEED_SIZE, WIA_DPS_MIN_HORIZONTAL_SHEET_FEED_SIZE_STR },
{ WIA_DPS_MIN_VERTICAL_SHEET_FEED_SIZE, WIA_DPS_MIN_VERTICAL_SHEET_FEED_SIZE_STR },
{ WIA_DPF_MOUNT_POINT, WIA_DPF_MOUNT_POINT_STR },
{ WIA_DPV_LAST_PICTURE_TAKEN, WIA_DPV_LAST_PICTURE_TAKEN_STR },
{ WIA_DPV_IMAGES_DIRECTORY, WIA_DPV_IMAGES_DIRECTORY_STR },
{ WIA_DPV_DSHOW_DEVICE_PATH, WIA_DPV_DSHOW_DEVICE_PATH_STR },
{ WIA_IPA_ITEM_NAME, WIA_IPA_ITEM_NAME_STR },
{ WIA_IPA_FULL_ITEM_NAME, WIA_IPA_FULL_ITEM_NAME_STR },
{ WIA_IPA_ITEM_TIME, WIA_IPA_ITEM_TIME_STR },
{ WIA_IPA_ITEM_FLAGS, WIA_IPA_ITEM_FLAGS_STR },
{ WIA_IPA_ACCESS_RIGHTS, WIA_IPA_ACCESS_RIGHTS_STR },
{ WIA_IPA_DATATYPE, WIA_IPA_DATATYPE_STR },
{ WIA_IPA_DEPTH, WIA_IPA_DEPTH_STR },
{ WIA_IPA_PREFERRED_FORMAT, WIA_IPA_PREFERRED_FORMAT_STR },
{ WIA_IPA_FORMAT, WIA_IPA_FORMAT_STR },
{ WIA_IPA_COMPRESSION, WIA_IPA_COMPRESSION_STR },
{ WIA_IPA_TYMED, WIA_IPA_TYMED_STR },
{ WIA_IPA_CHANNELS_PER_PIXEL, WIA_IPA_CHANNELS_PER_PIXEL_STR },
{ WIA_IPA_BITS_PER_CHANNEL, WIA_IPA_BITS_PER_CHANNEL_STR },
{ WIA_IPA_PLANAR, WIA_IPA_PLANAR_STR },
{ WIA_IPA_PIXELS_PER_LINE, WIA_IPA_PIXELS_PER_LINE_STR },
{ WIA_IPA_BYTES_PER_LINE, WIA_IPA_BYTES_PER_LINE_STR },
{ WIA_IPA_NUMBER_OF_LINES, WIA_IPA_NUMBER_OF_LINES_STR },
{ WIA_IPA_GAMMA_CURVES, WIA_IPA_GAMMA_CURVES_STR },
{ WIA_IPA_ITEM_SIZE, WIA_IPA_ITEM_SIZE_STR },
{ WIA_IPA_COLOR_PROFILE, WIA_IPA_COLOR_PROFILE_STR },
{ WIA_IPA_MIN_BUFFER_SIZE, WIA_IPA_MIN_BUFFER_SIZE_STR },
{ WIA_IPA_REGION_TYPE, WIA_IPA_REGION_TYPE_STR },
{ WIA_IPA_ICM_PROFILE_NAME, WIA_IPA_ICM_PROFILE_NAME_STR },
{ WIA_IPA_APP_COLOR_MAPPING, WIA_IPA_APP_COLOR_MAPPING_STR },
{ WIA_IPA_PROP_STREAM_COMPAT_ID, WIA_IPA_PROP_STREAM_COMPAT_ID_STR },
{ WIA_IPA_FILENAME_EXTENSION, WIA_IPA_FILENAME_EXTENSION_STR },
{ WIA_IPA_SUPPRESS_PROPERTY_PAGE, WIA_IPA_SUPPRESS_PROPERTY_PAGE_STR },
{ WIA_IPC_THUMBNAIL, WIA_IPC_THUMBNAIL_STR },
{ WIA_IPC_THUMB_WIDTH, WIA_IPC_THUMB_WIDTH_STR },
{ WIA_IPC_THUMB_HEIGHT, WIA_IPC_THUMB_HEIGHT_STR },
{ WIA_IPC_AUDIO_AVAILABLE, WIA_IPC_AUDIO_AVAILABLE_STR },
{ WIA_IPC_AUDIO_DATA_FORMAT, WIA_IPC_AUDIO_DATA_FORMAT_STR },
{ WIA_IPC_AUDIO_DATA, WIA_IPC_AUDIO_DATA_STR },
{ WIA_IPC_NUM_PICT_PER_ROW, WIA_IPC_NUM_PICT_PER_ROW_STR },
{ WIA_IPC_SEQUENCE, WIA_IPC_SEQUENCE_STR },
{ WIA_IPC_TIMEDELAY, WIA_IPC_TIMEDELAY_STR },
{ WIA_IPS_CUR_INTENT, WIA_IPS_CUR_INTENT_STR },
{ WIA_IPS_XRES, WIA_IPS_XRES_STR },
{ WIA_IPS_YRES, WIA_IPS_YRES_STR },
{ WIA_IPS_XPOS, WIA_IPS_XPOS_STR },
{ WIA_IPS_YPOS, WIA_IPS_YPOS_STR },
{ WIA_IPS_XEXTENT, WIA_IPS_XEXTENT_STR },
{ WIA_IPS_YEXTENT, WIA_IPS_YEXTENT_STR },
{ WIA_IPS_PHOTOMETRIC_INTERP, WIA_IPS_PHOTOMETRIC_INTERP_STR },
{ WIA_IPS_BRIGHTNESS, WIA_IPS_BRIGHTNESS_STR },
{ WIA_IPS_CONTRAST, WIA_IPS_CONTRAST_STR },
{ WIA_IPS_ORIENTATION, WIA_IPS_ORIENTATION_STR },
{ WIA_IPS_ROTATION, WIA_IPS_ROTATION_STR },
{ WIA_IPS_MIRROR, WIA_IPS_MIRROR_STR },
{ WIA_IPS_THRESHOLD, WIA_IPS_THRESHOLD_STR },
{ WIA_IPS_INVERT, WIA_IPS_INVERT_STR },
{ WIA_IPS_WARM_UP_TIME, WIA_IPS_WARM_UP_TIME_STR },
{0, L"Not a WIA property"}
};
#endif
namespace PropStorageHelpers
{
CPropertyId::CPropertyId(void)
: m_strPropId(L""), m_nPropId(0), m_bIsStringPropId(false)
{
}
CPropertyId::CPropertyId( const CSimpleStringWide &strPropId )
: m_strPropId(strPropId), m_nPropId(0), m_bIsStringPropId(true)
{
}
CPropertyId::CPropertyId( PROPID propId )
: m_strPropId(L""), m_nPropId(propId), m_bIsStringPropId(false)
{
}
CPropertyId::CPropertyId( const CPropertyId &other )
: m_strPropId(other.PropIdString()), m_nPropId(other.PropIdNumber()), m_bIsStringPropId(other.IsString())
{
}
CPropertyId::~CPropertyId(void)
{
}
CPropertyId &CPropertyId::operator=( const CPropertyId &other )
{
if (this != &other)
{
m_strPropId = other.PropIdString();
m_nPropId = other.PropIdNumber();
m_bIsStringPropId = other.IsString();
}
return(*this);
}
CSimpleStringWide CPropertyId::PropIdString(void) const
{
return(m_strPropId);
}
PROPID CPropertyId::PropIdNumber(void) const
{
return(m_nPropId);
}
bool CPropertyId::IsString(void) const
{
return(m_bIsStringPropId);
}
CSimpleString PropertyName( const CPropertyId &propertyName )
{
#if defined(DBG)
if (propertyName.IsString())
{
return CSimpleStringConvert::NaturalString(propertyName.PropIdString());
}
for (int i=0;g_wiaPropIdToName[i].propid;i++)
{
if (propertyName.PropIdNumber() == g_wiaPropIdToName[i].propid)
{
return CSimpleStringConvert::NaturalString(CSimpleStringWide(g_wiaPropIdToName[i].pszName));
}
}
return CSimpleString().Format( TEXT("Unknown property %d"), propertyName.PropIdNumber() );
#endif
return TEXT("");
}
bool SetProperty( IUnknown *pIUnknown, const CPropertyId &propertyName, PROPVARIANT &pv, PROPID nNameFirst )
{
WIA_PUSH_FUNCTION((TEXT("PropStorageHelpers::SetProperty(\"%s\")"), PropertyName(propertyName).String() ));
PROPSPEC ps = {0};
if (propertyName.IsString())
{
ps.ulKind = PRSPEC_LPWSTR;
ps.lpwstr = const_cast<LPWSTR>(propertyName.PropIdString().String());
}
else
{
ps.ulKind = PRSPEC_PROPID;
ps.propid = propertyName.PropIdNumber();
}
CComPtr<IWiaPropertyStorage> pIWiaPropertyStorage;
HRESULT hr = pIUnknown->QueryInterface(IID_IWiaPropertyStorage, (void**)&pIWiaPropertyStorage);
if (FAILED(hr))
{
return(false);
}
hr = pIWiaPropertyStorage->WriteMultiple( 1, &ps, &pv, nNameFirst );
return(SUCCEEDED(hr));
}
bool SetProperty( IUnknown *pIUnknown, const CPropertyId &propertyName, LONG nValue, PROPID nNameFirst )
{
PROPVARIANT pv = {0};
pv.vt = VT_I4;
pv.lVal = nValue;
return(SetProperty( pIUnknown, propertyName, pv, nNameFirst ));
}
bool SetProperty( IUnknown *pIUnknown, const CPropertyId &propertyName, const GUID &guidValue, PROPID nNameFirst )
{
PROPVARIANT pv = {0};
pv.vt = VT_CLSID;
pv.puuid = const_cast<GUID*>(&guidValue);
return(SetProperty( pIUnknown, propertyName, pv, nNameFirst ));
}
bool GetProperty( IUnknown *pIUnknown, const CPropertyId &propertyName, PROPVARIANT &pPropVar )
{
WIA_PUSH_FUNCTION((TEXT("PropStorageHelpers::GetProperty(\"%s\")"), PropertyName(propertyName).String() ));
ZeroMemory(&pPropVar,sizeof(pPropVar));
if (pIUnknown)
{
PROPSPEC ps = {0};
if (propertyName.IsString())
{
ps.ulKind = PRSPEC_LPWSTR;
ps.lpwstr = const_cast<LPWSTR>(propertyName.PropIdString().String());
}
else
{
ps.ulKind = PRSPEC_PROPID;
ps.propid = propertyName.PropIdNumber();
}
CComPtr<IWiaPropertyStorage> pIWiaPropertyStorage;
HRESULT hr = pIUnknown->QueryInterface(IID_IWiaPropertyStorage, (void**)&pIWiaPropertyStorage);
if (FAILED(hr))
{
WIA_PRINTHRESULT((hr,TEXT("GetProperty: pIUnknown->QueryInterface failed:")));
return(false);
}
hr = pIWiaPropertyStorage->ReadMultiple( 1, &ps, &pPropVar );
if (FAILED(hr) || S_FALSE==hr)
{
WIA_PRINTHRESULT((hr,TEXT("GetProperty: pIUnknown->ReadMultiple failed:")));
return(false);
}
return(SUCCEEDED(hr));
}
else
{
WIA_ERROR((TEXT("GetProperty: pIUnknown is NULL")));
return(false);
}
}
bool GetProperty( IUnknown *pIUnknown, const CPropertyId &propertyName, CSimpleStringWide &strPropertyValue )
{
strPropertyValue = L"";
PROPVARIANT pvPropValue;
if (!GetProperty( pIUnknown, propertyName, pvPropValue ))
{
PropVariantClear(&pvPropValue);
return(false);
}
if (VT_LPWSTR != pvPropValue.vt && VT_BSTR != pvPropValue.vt)
{
PropVariantClear(&pvPropValue);
return(false);
}
strPropertyValue = pvPropValue.pwszVal;
PropVariantClear(&pvPropValue);
return(true);
}
bool GetProperty( IUnknown *pIUnknown, const CPropertyId &propertyName, LONG &nValue )
{
nValue = 0;
PROPVARIANT pvPropValue;
if (!GetProperty( pIUnknown, propertyName, pvPropValue ))
{
PropVariantClear(&pvPropValue);
return(false);
}
if (VT_I4 != pvPropValue.vt && VT_UI4 != pvPropValue.vt)
{
WIA_ERROR((TEXT("GetProperty: Property value type must be VT_I4 or VT_UI4 and it was 0x%08X (%d)"),pvPropValue.vt,pvPropValue.vt));
PropVariantClear(&pvPropValue);
return(false);
}
nValue = pvPropValue.lVal;
PropVariantClear(&pvPropValue);
return(true);
}
bool GetProperty( IUnknown *pIUnknown, const CPropertyId &propertyName, GUID &guidValue )
{
guidValue = IID_NULL;
PROPVARIANT pvPropValue;
if (!GetProperty( pIUnknown, propertyName, pvPropValue ))
{
PropVariantClear(&pvPropValue);
return(false);
}
if (VT_CLSID != pvPropValue.vt)
{
WIA_ERROR((TEXT("GetProperty: Property value type must be VT_I4 or VT_UI4 and it was 0x%08X (%d)"),pvPropValue.vt,pvPropValue.vt));
PropVariantClear(&pvPropValue);
return(false);
}
if (!pvPropValue.puuid)
{
WIA_ERROR((TEXT("GetProperty: NULL pvPropValue.puuid")));
PropVariantClear(&pvPropValue);
return(false);
}
guidValue = *(pvPropValue.puuid);
PropVariantClear(&pvPropValue);
return(true);
}
bool GetPropertyAttributes( IUnknown *pIUnknown, const CPropertyId &propertyName, ULONG &nAccessFlags, PROPVARIANT &pvAttributes )
{
WIA_PUSH_FUNCTION((TEXT("PropStorageHelpers::GetPropertyAttributes(\"%s\")"), PropertyName(propertyName).String() ));
ZeroMemory( &pvAttributes, sizeof(pvAttributes) );
if (!pIUnknown)
{
WIA_ERROR((TEXT("pIUnknown is NULL")));
return false;
}
CComPtr<IWiaPropertyStorage> pIWiaPropertyStorage;
HRESULT hr = pIUnknown->QueryInterface(IID_IWiaPropertyStorage, (void**)&pIWiaPropertyStorage);
if (SUCCEEDED(hr))
{
PROPSPEC ps;
if (propertyName.IsString())
{
ps.ulKind = PRSPEC_LPWSTR;
ps.lpwstr = const_cast<LPWSTR>(propertyName.PropIdString().String());
}
else
{
ps.ulKind = PRSPEC_PROPID;
ps.propid = propertyName.PropIdNumber();
}
hr = pIWiaPropertyStorage->GetPropertyAttributes( 1, &ps, &nAccessFlags, &pvAttributes );
if (SUCCEEDED(hr))
{
hr = S_OK;
}
else
{
WIA_PRINTHRESULT((hr,TEXT("pIWiaPropertyStorage->GetPropertyAttributes failed")));
}
}
else
{
WIA_PRINTHRESULT((hr,TEXT("pIUnknown->QueryInterface failed")));
}
WIA_PRINTHRESULT((hr,TEXT("PropStorageHelpers::GetPropertyAttributes is returning")));
return (SUCCEEDED(hr) != FALSE);
}
bool GetPropertyAttributes( IUnknown *pIUnknown, const CPropertyId &propertyName, PROPVARIANT &pvAttributes )
{
ULONG nAccessFlags;
bool bResult = GetPropertyAttributes( pIUnknown, propertyName, nAccessFlags, pvAttributes );
return (bResult);
}
bool GetPropertyAccessFlags( IUnknown *pIUnknown, const CPropertyId &propertyName, ULONG &nAccessFlags )
{
PROPVARIANT pvAttributes;
bool bResult = GetPropertyAttributes( pIUnknown, propertyName, nAccessFlags, pvAttributes );
if (bResult)
PropVariantClear(&pvAttributes);
return (bResult);
}
bool IsReadOnlyProperty( IUnknown *pIUnknown, const CPropertyId &propertyName )
{
WIA_PUSH_FUNCTION((TEXT("PropStorageHelpers::IsReadOnlyProperty")));
bool bResult = true;
ULONG nAccessFlags = 0;
if (GetPropertyAccessFlags(pIUnknown,propertyName,nAccessFlags))
{
WIA_TRACE((TEXT("nAccessFlags = %08X"),nAccessFlags));
bResult = ((nAccessFlags & WIA_PROP_WRITE) == 0);
WIA_TRACE((TEXT("bResult = %d"),bResult));
}
return bResult;
}
bool GetPropertyRange( IUnknown *pIUnknown, const CPropertyId &propertyName, CPropertyRange &propertyRange )
{
ZeroMemory( &propertyRange, sizeof(propertyRange) );
PROPVARIANT pvAttributes;
ULONG nAccessFlags;
bool bResult = false;
if (GetPropertyAttributes( pIUnknown, propertyName, nAccessFlags, pvAttributes ))
{
if ((WIA_PROP_RANGE & nAccessFlags) &&
(pvAttributes.vt & VT_VECTOR) &&
((pvAttributes.vt & VT_I4) || (pvAttributes.vt & VT_UI4)))
{
propertyRange.nMin = (LONG)pvAttributes.caul.pElems[WIA_RANGE_MIN];
propertyRange.nMax = (LONG)pvAttributes.caul.pElems[WIA_RANGE_MAX];
propertyRange.nStep = (LONG)pvAttributes.caul.pElems[WIA_RANGE_STEP];
bResult = true;
}
else
{
WIA_ERROR((TEXT("\"%s\" is not a WIA_PROP_RANGE value"), PropertyName(propertyName).String() ));
}
PropVariantClear(&pvAttributes);
}
return bResult;
}
bool GetPropertyList( IUnknown *pIUnknown, const CPropertyId &propertyName, CSimpleDynamicArray<LONG> &aProp )
{
aProp.Destroy();
PROPVARIANT pvAttributes;
ULONG nAccessFlags;
bool bResult = false;
if (GetPropertyAttributes( pIUnknown, propertyName, nAccessFlags, pvAttributes ))
{
if ((WIA_PROP_LIST & nAccessFlags) &&
(pvAttributes.vt & VT_VECTOR) &&
((pvAttributes.vt & VT_I4) || (pvAttributes.vt & VT_UI4)))
{
for (ULONG i=0;i<pvAttributes.cal.cElems - WIA_LIST_VALUES;i++)
aProp.Append((LONG)pvAttributes.cal.pElems[WIA_LIST_VALUES + i]);
bResult = true;
}
else
{
WIA_ERROR((TEXT("\"%s\" is not a WIA_PROP_LIST value"), PropertyName(propertyName).String() ));
}
PropVariantClear(&pvAttributes);
}
return bResult;
}
bool GetPropertyList( IUnknown *pIUnknown, const CPropertyId &propertyName, CSimpleDynamicArray<GUID> &aProp )
{
aProp.Destroy();
PROPVARIANT pvAttributes;
ULONG nAccessFlags;
bool bResult = false;
if (GetPropertyAttributes( pIUnknown, propertyName, nAccessFlags, pvAttributes ))
{
if ((WIA_PROP_LIST & nAccessFlags) &&
(pvAttributes.vt & VT_VECTOR) &&
(pvAttributes.vt & VT_CLSID))
{
for (ULONG i=0;i<pvAttributes.cal.cElems - WIA_LIST_VALUES;i++)
aProp.Append(pvAttributes.cauuid.pElems[WIA_LIST_VALUES + i]);
bResult = true;
}
else
{
WIA_ERROR((TEXT("\"%s\" is not a WIA_PROP_LIST value"), PropertyName(propertyName).String() ));
}
PropVariantClear(&pvAttributes);
}
return bResult;
}
bool GetPropertyFlags( IUnknown *pIUnknown, const CPropertyId &propertyName, LONG &nFlags )
{
WIA_PUSH_FUNCTION((TEXT("PropStorageHelpers::GetPropertyFlags(\"%s\")"), PropertyName(propertyName).String() ));
nFlags = 0;
PROPVARIANT pvAttributes;
ULONG nAccessFlags;
bool bResult = false;
if (GetPropertyAttributes( pIUnknown, propertyName, nAccessFlags, pvAttributes ))
{
if (WIA_PROP_FLAG & nAccessFlags)
{
nFlags = pvAttributes.caul.pElems[WIA_FLAG_VALUES];
WIA_TRACE((TEXT("nFlags = %08X"), nFlags ));
bResult = true;
}
else
{
WIA_ERROR((TEXT("\"%s\" is not a WIA_PROP_FLAG value"), PropertyName(propertyName).String() ));
}
PropVariantClear(&pvAttributes);
}
else
{
WIA_ERROR((TEXT("GetPropertyAttributes failed")));
}
return bResult;
}
} // Namespace PropStorageHelpers