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.
 
 
 
 
 
 

243 lines
6.5 KiB

/*-----------------------------------------------------------------------------
*
* File: wiautil.cpp
* Author: Samuel Clement (samclem)
* Date: Mon Aug 16 13:22:36 1999
*
* Copyright (c) 1999 Microsoft Corporation
*
* Description:
* Contains the implementation of the Wia utility methods.
*
* History:
* 16 Aug 1999: Created.
*----------------------------------------------------------------------------*/
#include "stdafx.h"
/*-----------------------------------------------------------------------------
* GetStringForVal
*
* This returns the string assioctiated with value (dwVal) in the string
* table. If it is not found it will return the default value, or NULL if
* not default was provided.
*
* pStrTable: the table to search for the given string
* dwVal: what value ypu want to look for.
*--(samclem)-----------------------------------------------------------------*/
WCHAR* GetStringForVal( const STRINGTABLE* pStrTable, DWORD dwVal )
{
Assert( pStrTable != NULL );
// there is always at least 2 entries in the
// string table. the 0th entry is what to return
// if we don't find anything.
int iStr = 1;
while ( pStrTable[iStr].pwchValue )
{
if ( pStrTable[iStr].dwStartRange >= dwVal &&
pStrTable[iStr].dwEndRange <= dwVal )
return pStrTable[iStr].pwchValue;
iStr++;
}
// didn't find anything return the value at entry 0
return pStrTable->pwchValue;
}
/*-----------------------------------------------------------------------------
* GetWiaProperty
*
* This will get the desired property from the given property storage and
* fill the our param pvaProp with the value. This prop variant doesn't have
* to be initialized.
*
* pStg: the IWiaPropertyStorage to query for the property
* propid: the property id of the property that we want
* pvaProp: Out, recieves the value of the prop, or VT_EMPTY if not found.
*--(samclem)-----------------------------------------------------------------*/
HRESULT GetWiaProperty( IWiaPropertyStorage* pStg, PROPID propid, PROPVARIANT* pvaProp )
{
Assert( pStg != NULL );
Assert( pvaProp != NULL );
PROPSPEC pr;
HRESULT hr;
pr.ulKind = PRSPEC_PROPID;
pr.propid = propid;
PropVariantInit( pvaProp );
hr = pStg->ReadMultiple( 1, &pr, pvaProp );
return hr;
}
/*-----------------------------------------------------------------------------
* GetWiaPropertyBSTR
*
* This will get the desired property for the given property storage, and
* then attempt to convert it to a BSTR. If it can't convert the property
* then an error is returned, and the out param is null.
*
* pStg: The IWiaPropertyStorage that we want to read the property from
* propid: the property that we want to read and coherce
* pbstrProp: Out, recieves the value of the property, or NULL on error
*--(samclem)-----------------------------------------------------------------*/
HRESULT GetWiaPropertyBSTR( IWiaPropertyStorage* pStg, PROPID propid, BSTR* pbstrProp )
{
Assert( pbstrProp != NULL );
Assert( pStg != NULL );
PROPVARIANT vaProp;
*pbstrProp = NULL;
if ( FAILED( GetWiaProperty( pStg, propid, &vaProp ) ) )
return E_FAIL;
switch ( vaProp.vt )
{
case VT_EMPTY:
*pbstrProp = SysAllocString( L"" );
break;
case VT_BSTR:
case VT_LPWSTR:
*pbstrProp = SysAllocString( vaProp.pwszVal );
break;
case VT_CLSID:
{
OLECHAR rgoch[100] = { 0 }; // more than enough for a clsid
if ( SUCCEEDED( StringFromGUID2( *vaProp.puuid, rgoch, 100 ) ) )
{
*pbstrProp = SysAllocString( rgoch );
}
}
break;
}
PropVariantClear( &vaProp );
if ( NULL == *pbstrProp )
return E_FAIL;
return S_OK;
}
// helper macro
#define SETVAR( vti, in, out, field ) \
(out)->vt = vti; \
(out)->field = (in)->field; \
break
#define SETVAR_( vti, val, out, field, err ) \
(out)->vt = vti; \
(out)->field = val; \
if ( !((out)->field) ) \
return (err); \
break
/*-----------------------------------------------------------------------------
* PropVariantToVariant
*
* This copies the contents of the PropVariant to a variant.
*
* pvaProp: the prop variant to copy from
* pvaOut: the variant to copy into
*--(samclem)-----------------------------------------------------------------*/
HRESULT PropVariantToVariant( const PROPVARIANT* pvaProp, VARIANT* pvaOut )
{
Assert( pvaProp && pvaOut );
// init the out param
VariantInit( pvaOut );
switch ( pvaProp->vt )
{
case VT_EMPTY:
VariantInit( pvaOut );
pvaOut->vt = VT_EMPTY;
break;
case VT_UI1:
SETVAR( VT_UI1, pvaProp, pvaOut, bVal );
case VT_I2:
SETVAR( VT_I2, pvaProp, pvaOut, iVal );
case VT_I4:
SETVAR( VT_I4, pvaProp, pvaOut, lVal );
case VT_R4:
SETVAR( VT_R4, pvaProp, pvaOut, fltVal );
case VT_R8:
SETVAR( VT_R8, pvaProp, pvaOut, dblVal );
case VT_CY:
SETVAR( VT_CY, pvaProp, pvaOut, cyVal );
case VT_DATE:
SETVAR( VT_DATE, pvaProp, pvaOut, date );
case VT_BSTR:
SETVAR_( VT_BSTR, SysAllocString( pvaProp->bstrVal ), pvaOut, bstrVal, E_OUTOFMEMORY );
case VT_BOOL:
SETVAR( VT_BOOL, pvaProp, pvaOut, boolVal );
case VT_LPWSTR:
SETVAR_( VT_BSTR, SysAllocString( pvaProp->pwszVal ), pvaOut, bstrVal, E_OUTOFMEMORY );
case VT_LPSTR:
{
if ( pvaProp->pszVal )
{
WCHAR* pwch = NULL;
size_t len = strlen( pvaProp->pszVal ) + 1;
pwch = new WCHAR[len];
if ( !pwch )
return E_OUTOFMEMORY;
if ( !MultiByteToWideChar( CP_ACP, 0,
pvaProp->pszVal, -1, pwch, len ) )
{
delete[] pwch;
return E_FAIL;
}
pvaOut->vt = VT_BSTR;
pvaOut->bstrVal = SysAllocString( pwch );
delete[] pwch;
if ( !pvaOut->bstrVal )
return E_OUTOFMEMORY;
break;
}
else
{
SETVAR_( VT_BSTR, SysAllocString( L"" ), pvaOut, bstrVal, E_OUTOFMEMORY );
}
}
#if defined(LATERW2K_PLATSDK)
case VT_UNKNOWN:
pvaOut->vt = VT_UNKNOWN;
pvaOut->punkVal = pvaProp->punkVal;
pvaOut->punkVal->AddRef();
break;
case VT_DISPATCH:
pvaOut->vt = VT_DISPATCH;
pvaOut->pdispVal = pvaProp->pdispVal;
pvaOut->pdispVal->AddRef();
break;
case VT_SAFEARRAY:
if ( FAILED( SafeArrayCopy( pvaProp->parray, &pvaOut->parray ) ) )
return E_FAIL;
pvaOut->vt = VT_SAFEARRAY;
break;
#endif //defined(LATERW2K_PLATSDK)
default:
return E_FAIL;
}
return S_OK;
}
HRESULT VariantToPropVariant( const VARIANT* pvaIn, PROPVARIANT* pvaProp )
{
return E_NOTIMPL;
}