wbemprox: Support overriding the CIM to VARIANT type mapping for method parameters.

This commit is contained in:
Hans Leidekker 2012-10-12 14:25:39 +02:00 committed by Alexandre Julliard
parent 3b8266d20b
commit 248049f36e
3 changed files with 32 additions and 18 deletions

View File

@ -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 }
};

View File

@ -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;

View File

@ -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;