[WBEMPROX] Sync with Wine Staging 4.0. CORE-15682
[reactos.git] / dll / win32 / wbemprox / class.c
index 27229bd..a005204 100644 (file)
@@ -532,8 +532,11 @@ static HRESULT WINAPI class_object_Next(
             SysFreeString( prop );
             return hr;
         }
+
         obj->index_property = i + 1;
-        *strName = prop;
+        if (strName) *strName = prop;
+        else SysFreeString( prop );
+
         return S_OK;
     }
     return WBEM_S_NO_MORE_DATA;
@@ -582,7 +585,7 @@ static BSTR get_body_text( const struct table *table, UINT row, UINT *len )
     {
         if ((value = get_value_bstr( table, row, i )))
         {
-            *len += sizeof(fmtW) / sizeof(fmtW[0]);
+            *len += ARRAY_SIZE( fmtW );
             *len += strlenW( table->columns[i].name );
             *len += SysStringLen( value );
             SysFreeString( value );
@@ -608,7 +611,7 @@ static BSTR get_object_text( const struct view *view, UINT index )
     UINT len, len_body, row = view->result[index];
     BSTR ret, body;
 
-    len = sizeof(fmtW) / sizeof(fmtW[0]);
+    len = ARRAY_SIZE( fmtW );
     len += strlenW( view->table->name );
     if (!(body = get_body_text( view->table, row, &len_body ))) return NULL;
     len += len_body;
@@ -804,7 +807,7 @@ static WCHAR *build_signature_table_name( const WCHAR *class, const WCHAR *metho
     static const WCHAR fmtW[] = {'_','_','%','s','_','%','s','_','%','s',0};
     static const WCHAR outW[] = {'O','U','T',0};
     static const WCHAR inW[] = {'I','N',0};
-    UINT len = SIZEOF(fmtW) + SIZEOF(outW) + strlenW( class ) + strlenW( method );
+    UINT len = ARRAY_SIZE(fmtW) + ARRAY_SIZE(outW) + strlenW( class ) + strlenW( method );
     WCHAR *ret;
 
     if (!(ret = heap_alloc( len * sizeof(WCHAR) ))) return NULL;
@@ -823,7 +826,7 @@ HRESULT create_signature( const WCHAR *class, const WCHAR *method, enum param_di
          'D','i','r','e','c','t','i','o','n','%','s',0};
     static const WCHAR geW[] = {'>','=','0',0};
     static const WCHAR leW[] = {'<','=','0',0};
-    UINT len = SIZEOF(selectW) + SIZEOF(geW);
+    UINT len = ARRAY_SIZE(selectW) + ARRAY_SIZE(geW);
     IEnumWbemClassObject *iter;
     WCHAR *query, *name;
     HRESULT hr;
@@ -836,6 +839,13 @@ HRESULT create_signature( const WCHAR *class, const WCHAR *method, enum param_di
     heap_free( query );
     if (hr != S_OK) return hr;
 
+    if (!count_instances( iter ))
+    {
+        *sig = NULL;
+        IEnumWbemClassObject_Release( iter );
+        return S_OK;
+    }
+
     if (!(name = build_signature_table_name( class, method, dir )))
     {
         IEnumWbemClassObject_Release( iter );
@@ -870,9 +880,9 @@ static HRESULT WINAPI class_object_GetMethod(
     if (hr == S_OK)
     {
         if (ppInSignature) *ppInSignature = in;
-        else IWbemClassObject_Release( in );
+        else if (in) IWbemClassObject_Release( in );
         if (ppOutSignature) *ppOutSignature = out;
-        else IWbemClassObject_Release( out );
+        else if (out) IWbemClassObject_Release( out );
     }
     else IWbemClassObject_Release( in );
     return hr;
@@ -907,11 +917,6 @@ static HRESULT WINAPI class_object_BeginMethodEnumeration(
 
     if (lEnumFlags) FIXME("flags 0x%08x not supported\n", lEnumFlags);
 
-    if (co->iter)
-    {
-        WARN("not allowed on instance\n");
-        return WBEM_E_ILLEGAL_OPERATION;
-    }
     co->index_method = 0;
     return S_OK;
 }
@@ -941,7 +946,8 @@ static HRESULT WINAPI class_object_NextMethod(
     if (hr != S_OK)
     {
         SysFreeString( method );
-        IWbemClassObject_Release( *ppInSignature );
+        if (*ppInSignature)
+            IWbemClassObject_Release( *ppInSignature );
     }
     else
     {