Hans Leidekker : wbemprox: Support overriding the CIM to VARIANT type mapping for method parameters.
Alexandre Julliard
julliard at winehq.org
Fri Oct 12 11:37:45 CDT 2012
Module: wine
Branch: master
Commit: 248049f36e64b96e5f4d64f616073208372243e8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=248049f36e64b96e5f4d64f616073208372243e8
Author: Hans Leidekker <hans at 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;
More information about the wine-cvs
mailing list