Commit 34bd6a9c authored by Hans Leidekker's avatar Hans Leidekker Committed by Alexandre Julliard

wbemprox: Map CIM_UINT16 and CIM_UINT32 to VT_I4 by default.

parent 58572fc9
...@@ -227,7 +227,6 @@ static struct record *create_record( struct table *table ) ...@@ -227,7 +227,6 @@ static struct record *create_record( struct table *table )
for (i = 0; i < table->num_cols; i++) for (i = 0; i < table->num_cols; i++)
{ {
record->fields[i].type = table->columns[i].type; record->fields[i].type = table->columns[i].type;
record->fields[i].vartype = table->columns[i].vartype;
record->fields[i].u.ival = 0; record->fields[i].u.ival = 0;
} }
record->count = table->num_cols; record->count = table->num_cols;
...@@ -347,13 +346,13 @@ static HRESULT WINAPI class_object_GetQualifierSet( ...@@ -347,13 +346,13 @@ static HRESULT WINAPI class_object_GetQualifierSet(
static HRESULT record_get_value( const struct record *record, UINT index, VARIANT *var, CIMTYPE *type ) static HRESULT record_get_value( const struct record *record, UINT index, VARIANT *var, CIMTYPE *type )
{ {
VARTYPE vartype = record->fields[index].vartype; VARTYPE vartype = to_vartype( record->fields[index].type & CIM_TYPE_MASK );
if (type) *type = record->fields[index].type; if (type) *type = record->fields[index].type;
if (record->fields[index].type & CIM_FLAG_ARRAY) if (record->fields[index].type & CIM_FLAG_ARRAY)
{ {
V_VT( var ) = vartype ? vartype : to_vartype( record->fields[index].type & CIM_TYPE_MASK ) | VT_ARRAY; V_VT( var ) = vartype | VT_ARRAY;
V_ARRAY( var ) = to_safearray( record->fields[index].u.aval, record->fields[index].type & CIM_TYPE_MASK ); V_ARRAY( var ) = to_safearray( record->fields[index].u.aval, record->fields[index].type & CIM_TYPE_MASK );
return S_OK; return S_OK;
} }
...@@ -362,15 +361,12 @@ static HRESULT record_get_value( const struct record *record, UINT index, VARIAN ...@@ -362,15 +361,12 @@ static HRESULT record_get_value( const struct record *record, UINT index, VARIAN
case CIM_STRING: case CIM_STRING:
case CIM_DATETIME: case CIM_DATETIME:
case CIM_REFERENCE: case CIM_REFERENCE:
if (!vartype) vartype = VT_BSTR;
V_BSTR( var ) = SysAllocString( record->fields[index].u.sval ); V_BSTR( var ) = SysAllocString( record->fields[index].u.sval );
break; break;
case CIM_SINT32: case CIM_SINT32:
if (!vartype) vartype = VT_I4;
V_I4( var ) = record->fields[index].u.ival; V_I4( var ) = record->fields[index].u.ival;
break; break;
case CIM_UINT32: case CIM_UINT32:
if (!vartype) vartype = VT_UI4;
V_UI4( var ) = record->fields[index].u.ival; V_UI4( var ) = record->fields[index].u.ival;
break; break;
default: default:
...@@ -735,7 +731,6 @@ static HRESULT create_signature_columns_and_data( IEnumWbemClassObject *iter, UI ...@@ -735,7 +731,6 @@ static HRESULT create_signature_columns_and_data( IEnumWbemClassObject *iter, UI
{ {
static const WCHAR parameterW[] = {'P','a','r','a','m','e','t','e','r',0}; static const WCHAR parameterW[] = {'P','a','r','a','m','e','t','e','r',0};
static const WCHAR typeW[] = {'T','y','p','e',0}; static const WCHAR typeW[] = {'T','y','p','e',0};
static const WCHAR varianttypeW[] = {'V','a','r','i','a','n','t','T','y','p','e',0};
static const WCHAR defaultvalueW[] = {'D','e','f','a','u','l','t','V','a','l','u','e',0}; static const WCHAR defaultvalueW[] = {'D','e','f','a','u','l','t','V','a','l','u','e',0};
struct column *columns; struct column *columns;
BYTE *row; BYTE *row;
...@@ -764,10 +759,6 @@ static HRESULT create_signature_columns_and_data( IEnumWbemClassObject *iter, UI ...@@ -764,10 +759,6 @@ static HRESULT create_signature_columns_and_data( IEnumWbemClassObject *iter, UI
if (hr != S_OK) goto error; if (hr != S_OK) goto error;
columns[i].type = V_UI4( &val ); columns[i].type = V_UI4( &val );
hr = IWbemClassObject_Get( param, varianttypeW, 0, &val, NULL, NULL );
if (hr != S_OK) goto error;
columns[i].vartype = V_UI4( &val );
hr = IWbemClassObject_Get( param, defaultvalueW, 0, &val, NULL, NULL ); hr = IWbemClassObject_Get( param, defaultvalueW, 0, &val, NULL, NULL );
if (hr != S_OK) goto error; if (hr != S_OK) goto error;
if (V_UI4( &val )) set_default_value( columns[i].type, V_UI4( &val ), row + offset ); if (V_UI4( &val )) set_default_value( columns[i].type, V_UI4( &val ), row + offset );
......
...@@ -1025,18 +1025,25 @@ VARTYPE to_vartype( CIMTYPE type ) ...@@ -1025,18 +1025,25 @@ VARTYPE to_vartype( CIMTYPE type )
{ {
switch (type) switch (type)
{ {
case CIM_BOOLEAN: return VT_BOOL; case CIM_BOOLEAN: return VT_BOOL;
case CIM_STRING: case CIM_STRING:
case CIM_REFERENCE: case CIM_REFERENCE:
case CIM_DATETIME: return VT_BSTR; case CIM_DATETIME: return VT_BSTR;
case CIM_SINT8: return VT_I1;
case CIM_UINT8: return VT_UI1; case CIM_SINT8: return VT_I1;
case CIM_SINT16: return VT_I2; case CIM_UINT8: return VT_UI1;
case CIM_UINT16: return VT_UI2; case CIM_SINT16: return VT_I2;
case CIM_SINT32: return VT_I4;
case CIM_UINT32: return VT_UI4; case CIM_UINT16:
case CIM_SINT64: return VT_I8; case CIM_SINT32:
case CIM_UINT64: return VT_UI8; case CIM_UINT32: return VT_I4;
case CIM_SINT64: return VT_I8;
case CIM_UINT64: return VT_UI8;
case CIM_REAL32: return VT_R4;
default: default:
ERR("unhandled type %u\n", type); ERR("unhandled type %u\n", type);
break; break;
...@@ -1044,10 +1051,10 @@ VARTYPE to_vartype( CIMTYPE type ) ...@@ -1044,10 +1051,10 @@ VARTYPE to_vartype( CIMTYPE type )
return 0; return 0;
} }
SAFEARRAY *to_safearray( const struct array *array, CIMTYPE type ) SAFEARRAY *to_safearray( const struct array *array, CIMTYPE basetype )
{ {
SAFEARRAY *ret; SAFEARRAY *ret;
VARTYPE vartype = to_vartype( type ); VARTYPE vartype = to_vartype( basetype );
LONG i; LONG i;
if (!array || !(ret = SafeArrayCreateVector( vartype, 0, array->count ))) return NULL; if (!array || !(ret = SafeArrayCreateVector( vartype, 0, array->count ))) return NULL;
...@@ -1187,23 +1194,20 @@ HRESULT get_propval( const struct view *view, UINT index, const WCHAR *name, VAR ...@@ -1187,23 +1194,20 @@ HRESULT get_propval( const struct view *view, UINT index, const WCHAR *name, VAR
if (!ret) return S_OK; if (!ret) return S_OK;
vartype = table->columns[column].vartype; vartype = to_vartype( table->columns[column].type & CIM_TYPE_MASK );
if (table->columns[column].type & CIM_FLAG_ARRAY) if (table->columns[column].type & CIM_FLAG_ARRAY)
{ {
CIMTYPE basetype = table->columns[column].type & CIM_TYPE_MASK; CIMTYPE basetype = table->columns[column].type & CIM_TYPE_MASK;
val_ptr = to_safearray( (const struct array *)(INT_PTR)val, basetype ); val_ptr = to_safearray( (const struct array *)(INT_PTR)val, basetype );
if (!val_ptr) vartype = VT_NULL; if (!val_ptr) vartype = VT_NULL;
else if (!vartype) vartype = to_vartype( basetype ) | VT_ARRAY; else vartype |= VT_ARRAY;
set_variant( vartype, val, val_ptr, ret ); set_variant( vartype, val, val_ptr, ret );
return S_OK; return S_OK;
} }
switch (table->columns[column].type & COL_TYPE_MASK) switch (table->columns[column].type & COL_TYPE_MASK)
{ {
case CIM_BOOLEAN:
if (!vartype) vartype = VT_BOOL;
break;
case CIM_STRING: case CIM_STRING:
case CIM_REFERENCE: case CIM_REFERENCE:
case CIM_DATETIME: case CIM_DATETIME:
...@@ -1215,24 +1219,6 @@ HRESULT get_propval( const struct view *view, UINT index, const WCHAR *name, VAR ...@@ -1215,24 +1219,6 @@ HRESULT get_propval( const struct view *view, UINT index, const WCHAR *name, VAR
else else
vartype = VT_NULL; vartype = VT_NULL;
break; break;
case CIM_SINT8:
if (!vartype) vartype = VT_I1;
break;
case CIM_UINT8:
if (!vartype) vartype = VT_UI1;
break;
case CIM_SINT16:
if (!vartype) vartype = VT_I2;
break;
case CIM_UINT16:
if (!vartype) vartype = VT_UI2;
break;
case CIM_SINT32:
if (!vartype) vartype = VT_I4;
break;
case CIM_UINT32:
if (!vartype) vartype = VT_UI4;
break;
case CIM_SINT64: case CIM_SINT64:
vartype = VT_BSTR; vartype = VT_BSTR;
val_ptr = get_value_bstr( table, row, column ); val_ptr = get_value_bstr( table, row, column );
...@@ -1241,8 +1227,14 @@ HRESULT get_propval( const struct view *view, UINT index, const WCHAR *name, VAR ...@@ -1241,8 +1227,14 @@ HRESULT get_propval( const struct view *view, UINT index, const WCHAR *name, VAR
vartype = VT_BSTR; vartype = VT_BSTR;
val_ptr = get_value_bstr( table, row, column ); val_ptr = get_value_bstr( table, row, column );
break; break;
case CIM_BOOLEAN:
case CIM_SINT8:
case CIM_UINT8:
case CIM_SINT16:
case CIM_UINT16:
case CIM_SINT32:
case CIM_UINT32:
case CIM_REAL32: case CIM_REAL32:
if (!vartype) vartype = VT_R4;
break; break;
default: default:
ERR("unhandled column type %u\n", table->columns[column].type); ERR("unhandled column type %u\n", table->columns[column].type);
......
...@@ -216,17 +216,50 @@ static void test_associators( IWbemServices *services ) ...@@ -216,17 +216,50 @@ static void test_associators( IWbemServices *services )
} }
} }
static void _check_property( ULONG line, IWbemClassObject *obj, const WCHAR *prop, VARTYPE vartype, CIMTYPE cimtype )
{
CIMTYPE type = 0xdeadbeef;
VARIANT val;
HRESULT hr;
VariantInit( &val );
hr = IWbemClassObject_Get( obj, prop, 0, &val, &type, NULL );
ok( hr == S_OK, "%u: failed to get description %08x\n", line, hr );
ok( V_VT( &val ) == vartype, "%u: unexpected variant type 0x%x\n", line, V_VT(&val) );
ok( type == cimtype, "%u: unexpected type 0x%x\n", line, type );
switch (V_VT(&val))
{
case VT_BSTR:
trace( "%s: %s\n", wine_dbgstr_w(prop), wine_dbgstr_w(V_BSTR(&val)) );
break;
case VT_I2:
trace( "%s: %d\n", wine_dbgstr_w(prop), V_I2(&val) );
break;
case VT_I4:
trace( "%s: %d\n", wine_dbgstr_w(prop), V_I4(&val) );
break;
case VT_R4:
trace( "%s: %f\n", wine_dbgstr_w(prop), V_R4(&val) );
break;
default:
break;
}
VariantClear( &val );
}
#define check_property(a,b,c,d) _check_property(__LINE__,a,b,c,d)
static void test_Win32_Service( IWbemServices *services ) static void test_Win32_Service( IWbemServices *services )
{ {
static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
static const WCHAR pauseserviceW[] = {'P','a','u','s','e','S','e','r','v','i','c','e',0}; static const WCHAR pauseserviceW[] = {'P','a','u','s','e','S','e','r','v','i','c','e',0};
static const WCHAR processidW[] = {'P','r','o','c','e','s','s','I','D',0};
static const WCHAR resumeserviceW[] = {'R','e','s','u','m','e','S','e','r','v','i','c','e',0}; static const WCHAR resumeserviceW[] = {'R','e','s','u','m','e','S','e','r','v','i','c','e',0};
static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
static const WCHAR serviceW[] = {'W','i','n','3','2','_','S','e','r','v','i','c','e','.',
'N','a','m','e','=','"','S','p','o','o','l','e','r','"',0};
static const WCHAR startserviceW[] = {'S','t','a','r','t','S','e','r','v','i','c','e',0}; static const WCHAR startserviceW[] = {'S','t','a','r','t','S','e','r','v','i','c','e',0};
static const WCHAR stopserviceW[] = {'S','t','o','p','S','e','r','v','i','c','e',0};
static const WCHAR stateW[] = {'S','t','a','t','e',0}; static const WCHAR stateW[] = {'S','t','a','t','e',0};
static const WCHAR stoppedW[] = {'S','t','o','p','p','e','d',0}; static const WCHAR stoppedW[] = {'S','t','o','p','p','e','d',0};
static const WCHAR serviceW[] = {'W','i','n','3','2','_','S','e','r','v','i','c','e','.', static const WCHAR stopserviceW[] = {'S','t','o','p','S','e','r','v','i','c','e',0};
'N','a','m','e','=','"','S','p','o','o','l','e','r','"',0};
static const WCHAR emptyW[] = {0}; static const WCHAR emptyW[] = {0};
BSTR class = SysAllocString( serviceW ), empty = SysAllocString( emptyW ), method; BSTR class = SysAllocString( serviceW ), empty = SysAllocString( emptyW ), method;
IWbemClassObject *service, *out; IWbemClassObject *service, *out;
...@@ -240,6 +273,8 @@ static void test_Win32_Service( IWbemServices *services ) ...@@ -240,6 +273,8 @@ static void test_Win32_Service( IWbemServices *services )
win_skip( "Win32_Service not available\n" ); win_skip( "Win32_Service not available\n" );
goto out; goto out;
} }
check_property( service, processidW, VT_I4, CIM_UINT32 );
type = 0xdeadbeef; type = 0xdeadbeef;
VariantInit( &state ); VariantInit( &state );
hr = IWbemClassObject_Get( service, stateW, 0, &state, &type, NULL ); hr = IWbemClassObject_Get( service, stateW, 0, &state, &type, NULL );
...@@ -317,38 +352,6 @@ out: ...@@ -317,38 +352,6 @@ out:
SysFreeString( class ); SysFreeString( class );
} }
static void _check_property( ULONG line, IWbemClassObject *obj, const WCHAR *prop, VARTYPE vartype, CIMTYPE cimtype )
{
CIMTYPE type = 0xdeadbeef;
VARIANT val;
HRESULT hr;
VariantInit( &val );
hr = IWbemClassObject_Get( obj, prop, 0, &val, &type, NULL );
ok( hr == S_OK, "%u: failed to get description %08x\n", line, hr );
ok( V_VT( &val ) == vartype, "%u: unexpected variant type 0x%x\n", line, V_VT(&val) );
ok( type == cimtype, "%u: unexpected type 0x%x\n", line, type );
switch (V_VT(&val))
{
case VT_BSTR:
trace( "%s: %s\n", wine_dbgstr_w(prop), wine_dbgstr_w(V_BSTR(&val)) );
break;
case VT_I2:
trace( "%s: %d\n", wine_dbgstr_w(prop), V_I2(&val) );
break;
case VT_I4:
trace( "%s: %d\n", wine_dbgstr_w(prop), V_I4(&val) );
break;
case VT_R4:
trace( "%s: %f\n", wine_dbgstr_w(prop), V_R4(&val) );
break;
default:
break;
}
VariantClear( &val );
}
#define check_property(a,b,c,d) _check_property(__LINE__,a,b,c,d)
static void test_Win32_Bios( IWbemServices *services ) static void test_Win32_Bios( IWbemServices *services )
{ {
static const WCHAR queryW[] = static const WCHAR queryW[] =
...@@ -1414,6 +1417,8 @@ static void test_Win32_Processor( IWbemServices *services ) ...@@ -1414,6 +1417,8 @@ static void test_Win32_Processor( IWbemServices *services )
{'A','r','c','h','i','t','e','c','t','u','r','e',0}; {'A','r','c','h','i','t','e','c','t','u','r','e',0};
static const WCHAR captionW[] = static const WCHAR captionW[] =
{'C','a','p','t','i','o','n',0}; {'C','a','p','t','i','o','n',0};
static const WCHAR cpustatusW[] =
{'C','p','u','S','t','a','t','u','s',0};
static const WCHAR familyW[] = static const WCHAR familyW[] =
{'F','a','m','i','l','y',0}; {'F','a','m','i','l','y',0};
static const WCHAR levelW[] = static const WCHAR levelW[] =
...@@ -1451,8 +1456,9 @@ static void test_Win32_Processor( IWbemServices *services ) ...@@ -1451,8 +1456,9 @@ static void test_Win32_Processor( IWbemServices *services )
hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count ); hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
if (hr != S_OK) break; if (hr != S_OK) break;
check_property( obj, captionW, VT_BSTR, CIM_STRING );
check_property( obj, architectureW, VT_I4, CIM_UINT16 ); check_property( obj, architectureW, VT_I4, CIM_UINT16 );
check_property( obj, captionW, VT_BSTR, CIM_STRING );
check_property( obj, cpustatusW, VT_I4, CIM_UINT16 );
check_property( obj, familyW, VT_I4, CIM_UINT16 ); check_property( obj, familyW, VT_I4, CIM_UINT16 );
check_property( obj, levelW, VT_I4, CIM_UINT16 ); check_property( obj, levelW, VT_I4, CIM_UINT16 );
check_property( obj, manufacturerW, VT_BSTR, CIM_STRING ); check_property( obj, manufacturerW, VT_BSTR, CIM_STRING );
...@@ -1493,6 +1499,8 @@ static void test_Win32_Processor( IWbemServices *services ) ...@@ -1493,6 +1499,8 @@ static void test_Win32_Processor( IWbemServices *services )
static void test_Win32_VideoController( IWbemServices *services ) static void test_Win32_VideoController( IWbemServices *services )
{ {
static const WCHAR availabilityW[] =
{'A','v','a','i','l','a','b','i','l','i','t','y',0};
static const WCHAR configmanagererrorcodeW[] = static const WCHAR configmanagererrorcodeW[] =
{'C','o','n','f','i','g','M','a','n','a','g','e','r','E','r','r','o','r','C','o','d','e',0}; {'C','o','n','f','i','g','M','a','n','a','g','e','r','E','r','r','o','r','C','o','d','e',0};
static const WCHAR driverdateW[] = static const WCHAR driverdateW[] =
...@@ -1524,6 +1532,7 @@ static void test_Win32_VideoController( IWbemServices *services ) ...@@ -1524,6 +1532,7 @@ static void test_Win32_VideoController( IWbemServices *services )
hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count ); hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
if (hr != S_OK) break; if (hr != S_OK) break;
check_property( obj, availabilityW, VT_I4, CIM_UINT16 );
check_property( obj, configmanagererrorcodeW, VT_I4, CIM_UINT32 ); check_property( obj, configmanagererrorcodeW, VT_I4, CIM_UINT32 );
check_property( obj, driverdateW, VT_BSTR, CIM_DATETIME ); check_property( obj, driverdateW, VT_BSTR, CIM_DATETIME );
...@@ -1547,8 +1556,12 @@ static void test_Win32_VideoController( IWbemServices *services ) ...@@ -1547,8 +1556,12 @@ static void test_Win32_VideoController( IWbemServices *services )
static void test_Win32_Printer( IWbemServices *services ) static void test_Win32_Printer( IWbemServices *services )
{ {
static const WCHAR attributesW[] =
{'A','t','t','r','i','b','u','t','e','s',0};
static const WCHAR deviceidW[] = static const WCHAR deviceidW[] =
{'D','e','v','i','c','e','I','d',0}; {'D','e','v','i','c','e','I','d',0};
static const WCHAR horizontalresolutionW[] =
{'H','o','r','i','z','o','n','t','a','l','R','e','s','o','l','u','t','i','o','n',0};
static const WCHAR locationW[] = static const WCHAR locationW[] =
{'L','o','c','a','t','i','o','n',0}; {'L','o','c','a','t','i','o','n',0};
static const WCHAR portnameW[] = static const WCHAR portnameW[] =
...@@ -1576,7 +1589,9 @@ static void test_Win32_Printer( IWbemServices *services ) ...@@ -1576,7 +1589,9 @@ static void test_Win32_Printer( IWbemServices *services )
hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count ); hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
if (hr != S_OK) break; if (hr != S_OK) break;
check_property( obj, attributesW, VT_I4, CIM_UINT32 );
check_property( obj, deviceidW, VT_BSTR, CIM_STRING ); check_property( obj, deviceidW, VT_BSTR, CIM_STRING );
check_property( obj, horizontalresolutionW, VT_I4, CIM_UINT32 );
type = 0xdeadbeef; type = 0xdeadbeef;
memset( &val, 0, sizeof(val) ); memset( &val, 0, sizeof(val) );
......
...@@ -89,7 +89,6 @@ struct column ...@@ -89,7 +89,6 @@ struct column
{ {
const WCHAR *name; const WCHAR *name;
UINT type; UINT type;
VARTYPE vartype; /* 0 for default mapping */
}; };
enum fill_status enum fill_status
...@@ -132,7 +131,6 @@ struct array ...@@ -132,7 +131,6 @@ struct array
struct field struct field
{ {
UINT type; UINT type;
VARTYPE vartype; /* 0 for default mapping */
union union
{ {
LONGLONG ival; LONGLONG ival;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment