Module: wine Branch: master Commit: 248049f36e64b96e5f4d64f616073208372243e8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=248049f36e64b96e5f4d64f616...
Author: Hans Leidekker hans@codeweavers.com Date: Fri Oct 12 14:25:39 2012 +0200
wbemprox: Support overriding the CIM to VARIANT type mapping for method parameters.
---
dlls/wbemprox/builtin.c | 12 ++++++++---- dlls/wbemprox/class.c | 36 ++++++++++++++++++++++-------------- dlls/wbemprox/wbemprox_private.h | 2 ++ 3 files changed, 32 insertions(+), 18 deletions(-)
diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c index 063c16d..ccb6d53 100644 --- a/dlls/wbemprox/builtin.c +++ b/dlls/wbemprox/builtin.c @@ -186,6 +186,8 @@ static const WCHAR prop_typeW[] = {'T','y','p','e',0}; static const WCHAR prop_uniqueidW[] = {'U','n','i','q','u','e','I','d',0}; +static const WCHAR prop_varianttypeW[] = + {'V','a','r','i','a','n','t','T','y','p','e',0}; static const WCHAR prop_versionW[] = {'V','e','r','s','i','o','n',0};
@@ -277,6 +279,7 @@ static const struct column col_params[] = { prop_directionW, CIM_SINT32 }, { prop_parameterW, CIM_STRING }, { prop_typeW, CIM_UINT32 }, + { prop_varianttypeW, CIM_UINT32 }, { prop_defaultvalueW, CIM_UINT32 } }; static const struct column col_process[] = @@ -452,6 +455,7 @@ struct record_params INT32 direction; const WCHAR *parameter; UINT32 type; + UINT32 varianttype; UINT32 defaultvalue; }; struct record_process @@ -537,13 +541,13 @@ static const struct record_diskdrive data_diskdrive[] = }; static const struct record_params data_params[] = { - { class_stdregprovW, method_enumkeyW, 1, param_defkeyW, CIM_UINT32, 0x80000002 }, + { class_stdregprovW, method_enumkeyW, 1, param_defkeyW, CIM_SINT32, 0, 0x80000002 }, { class_stdregprovW, method_enumkeyW, 1, param_subkeynameW, CIM_STRING }, - { class_stdregprovW, method_enumkeyW, -1, param_returnvalueW, CIM_UINT32 }, + { class_stdregprovW, method_enumkeyW, -1, param_returnvalueW, CIM_UINT32, VT_I4 }, { class_stdregprovW, method_enumkeyW, -1, param_namesW, CIM_STRING|CIM_FLAG_ARRAY }, - { class_stdregprovW, method_enumvaluesW, 1, param_defkeyW, CIM_UINT32, 0x80000002 }, + { class_stdregprovW, method_enumvaluesW, 1, param_defkeyW, CIM_SINT32, 0, 0x80000002 }, { class_stdregprovW, method_enumvaluesW, 1, param_subkeynameW, CIM_STRING }, - { class_stdregprovW, method_enumvaluesW, -1, param_returnvalueW, CIM_UINT32 }, + { class_stdregprovW, method_enumvaluesW, -1, param_returnvalueW, CIM_UINT32, VT_I4 }, { class_stdregprovW, method_enumvaluesW, -1, param_namesW, CIM_STRING|CIM_FLAG_ARRAY }, { class_stdregprovW, method_enumvaluesW, -1, param_typesW, CIM_SINT32|CIM_FLAG_ARRAY } }; diff --git a/dlls/wbemprox/class.c b/dlls/wbemprox/class.c index c17e1b3..a2d7068 100644 --- a/dlls/wbemprox/class.c +++ b/dlls/wbemprox/class.c @@ -225,8 +225,9 @@ static struct record *create_record( const struct column *columns, UINT num_cols } for (i = 0; i < num_cols; i++) { - record->fields[i].type = columns[i].type; - record->fields[i].u.ival = 0; + record->fields[i].type = columns[i].type; + record->fields[i].vartype = columns[i].vartype; + record->fields[i].u.ival = 0; } record->count = num_cols; return record; @@ -341,34 +342,37 @@ static HRESULT WINAPI class_object_GetQualifierSet(
static HRESULT record_get_value( const struct record *record, UINT index, VARIANT *var, CIMTYPE *type ) { + VARTYPE vartype = record->fields[index].vartype; + if (type) *type = record->fields[index].type;
if (record->fields[index].type & CIM_FLAG_ARRAY) { - V_VT( var ) = VT_ARRAY; - V_ARRAY( var ) = to_safearray( record->fields[index].u.aval, record->fields[index].type & COL_TYPE_MASK ); + V_VT( var ) = vartype ? vartype : to_vartype( record->fields[index].type & CIM_TYPE_MASK ) | VT_ARRAY; + V_ARRAY( var ) = to_safearray( record->fields[index].u.aval, record->fields[index].type & CIM_TYPE_MASK ); return S_OK; } switch (record->fields[index].type) { case CIM_STRING: case CIM_DATETIME: - V_VT( var ) = VT_BSTR; + if (!vartype) vartype = VT_BSTR; V_BSTR( var ) = SysAllocString( record->fields[index].u.sval ); - return S_OK; + break; case CIM_SINT32: - V_VT( var ) = VT_I4; + if (!vartype) vartype = VT_I4; V_I4( var ) = record->fields[index].u.ival; - return S_OK; + break; case CIM_UINT32: - V_VT( var ) = VT_UI4; + if (!vartype) vartype = VT_UI4; V_UI4( var ) = record->fields[index].u.ival; - return S_OK; + break; default: FIXME("unhandled type %u\n", record->fields[index].type); - break; + return WBEM_E_INVALID_PARAMETER; } - return WBEM_E_INVALID_PARAMETER; + V_VT( var ) = vartype; + return S_OK; }
static HRESULT WINAPI class_object_Get( @@ -713,6 +717,7 @@ 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 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}; struct column *columns; BYTE *row; @@ -739,8 +744,11 @@ static HRESULT create_signature_columns_and_data( IEnumWbemClassObject *iter, UI
hr = IWbemClassObject_Get( param, typeW, 0, &val, NULL, NULL ); if (hr != S_OK) goto error; - columns[i].type = V_UI4( &val ); - columns[i].vartype = 0; + 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 ); if (hr != S_OK) goto error; diff --git a/dlls/wbemprox/wbemprox_private.h b/dlls/wbemprox/wbemprox_private.h index 8de3a0c..f2dff02 100644 --- a/dlls/wbemprox/wbemprox_private.h +++ b/dlls/wbemprox/wbemprox_private.h @@ -78,6 +78,7 @@ struct array struct field { UINT type; + VARTYPE vartype; /* 0 for default mapping */ union { LONGLONG ival; @@ -179,6 +180,7 @@ HRESULT get_propval( const struct view *, UINT, const WCHAR *, VARIANT *, HRESULT put_propval( const struct view *, UINT, const WCHAR *, VARIANT *, CIMTYPE ) DECLSPEC_HIDDEN; HRESULT to_longlong( VARIANT *, LONGLONG *, CIMTYPE * ) DECLSPEC_HIDDEN; SAFEARRAY *to_safearray( const struct array *, CIMTYPE ) DECLSPEC_HIDDEN; +VARTYPE to_vartype( CIMTYPE ) DECLSPEC_HIDDEN; void destroy_array( struct array *, CIMTYPE ) DECLSPEC_HIDDEN; HRESULT get_properties( const struct view *, SAFEARRAY ** ) DECLSPEC_HIDDEN; HRESULT get_object( const WCHAR *, IWbemClassObject ** ) DECLSPEC_HIDDEN;