wbemprox: Support overriding the CIM to VARIANT type mapping for method parameters.
This commit is contained in:
parent
3b8266d20b
commit
248049f36e
@ -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 }
|
||||
};
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user