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