Hans Leidekker : wbemprox: Rewrite IWbemServices:: ExecMethod with low-level functions so we can reuse the object instance.

Alexandre Julliard julliard at winehq.org
Tue Jun 4 15:48:35 CDT 2013


Module: wine
Branch: master
Commit: f4da96bb29d38f67dae6d2868ff41f62af4ae1e4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f4da96bb29d38f67dae6d2868ff41f62af4ae1e4

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Tue Jun  4 13:27:48 2013 +0200

wbemprox: Rewrite IWbemServices::ExecMethod with low-level functions so we can reuse the object instance.

---

 dlls/wbemprox/query.c            |   12 +++----
 dlls/wbemprox/services.c         |   70 +++++++++++++++++++++++++-------------
 dlls/wbemprox/wbemprox_private.h |    3 ++
 3 files changed, 54 insertions(+), 31 deletions(-)

diff --git a/dlls/wbemprox/query.c b/dlls/wbemprox/query.c
index bff3f8e..e1a10a4 100644
--- a/dlls/wbemprox/query.c
+++ b/dlls/wbemprox/query.c
@@ -238,7 +238,7 @@ HRESULT eval_cond( const struct table *table, UINT row, const struct expr *cond,
     return WBEM_E_INVALID_QUERY;
 }
 
-static HRESULT execute_view( struct view *view )
+HRESULT execute_view( struct view *view )
 {
     UINT i, j = 0, len;
 
@@ -272,7 +272,7 @@ static HRESULT execute_view( struct view *view )
     return S_OK;
 }
 
-static struct query *create_query(void)
+struct query *create_query(void)
 {
     struct query *query;
 
@@ -282,15 +282,13 @@ static struct query *create_query(void)
     return query;
 }
 
-static void free_query( struct query *query )
+void free_query( struct query *query )
 {
     struct list *mem, *next;
 
+    if (!query) return;
     destroy_view( query->view );
-    LIST_FOR_EACH_SAFE( mem, next, &query->mem )
-    {
-        heap_free( mem );
-    }
+    LIST_FOR_EACH_SAFE( mem, next, &query->mem ) { heap_free( mem ); }
     heap_free( query );
 }
 
diff --git a/dlls/wbemprox/services.c b/dlls/wbemprox/services.c
index 10036ae..ac5eb74 100644
--- a/dlls/wbemprox/services.c
+++ b/dlls/wbemprox/services.c
@@ -377,7 +377,7 @@ static void free_path( struct path *path )
     heap_free( path );
 }
 
-static HRESULT create_instance_enum( const struct path *path, IEnumWbemClassObject **iter )
+static WCHAR *query_from_path( const struct path *path )
 {
     static const WCHAR selectW[] =
         {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','%','s',' ',
@@ -385,22 +385,30 @@ static HRESULT create_instance_enum( const struct path *path, IEnumWbemClassObje
     static const WCHAR select_allW[] =
         {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',0};
     WCHAR *query;
-    HRESULT hr;
     UINT len;
 
     if (path->filter)
     {
         len = path->class_len + path->filter_len + SIZEOF(selectW);
-        if (!(query = heap_alloc( len * sizeof(WCHAR) ))) return E_OUTOFMEMORY;
+        if (!(query = heap_alloc( len * sizeof(WCHAR) ))) return NULL;
         sprintfW( query, selectW, path->class, path->filter );
     }
     else
     {
         len = path->class_len + SIZEOF(select_allW);
-        if (!(query = heap_alloc( len * sizeof(WCHAR) ))) return E_OUTOFMEMORY;
+        if (!(query = heap_alloc( len * sizeof(WCHAR) ))) return NULL;
         strcpyW( query, select_allW );
         strcatW( query, path->class );
     }
+    return query;
+}
+
+static HRESULT create_instance_enum( const struct path *path, IEnumWbemClassObject **iter )
+{
+    WCHAR *query;
+    HRESULT hr;
+
+    if (!(query = query_from_path( path ))) return E_OUTOFMEMORY;
     hr = exec_query( query, iter );
     heap_free( query );
     return hr;
@@ -778,10 +786,12 @@ static HRESULT WINAPI wbem_services_ExecMethod(
     IWbemClassObject **ppOutParams,
     IWbemCallResult **ppCallResult )
 {
-    IWbemClassObject *obj;
-    struct table *table;
-    class_method *func;
+    IEnumWbemClassObject *result = NULL;
+    IWbemClassObject *obj = NULL;
+    struct query *query = NULL;
     struct path *path;
+    WCHAR *str;
+    class_method *func;
     HRESULT hr;
 
     TRACE("%p, %s, %s, %08x, %p, %p, %p, %p\n", iface, debugstr_w(strObjectPath),
@@ -789,28 +799,40 @@ static HRESULT WINAPI wbem_services_ExecMethod(
 
     if (lFlags) FIXME("flags %08x not supported\n", lFlags);
 
-    if ((hr = get_object( strObjectPath, &obj ))) return hr;
-    if ((hr = parse_path( strObjectPath, &path )) != S_OK)
+    if ((hr = parse_path( strObjectPath, &path )) != S_OK) return hr;
+    if (!(str = query_from_path( path )))
     {
-        IWbemClassObject_Release( obj );
-        return hr;
-    }
-    table = grab_table( path->class );
-    free_path( path );
-    if (!table)
-    {
-        IWbemClassObject_Release( obj );
-        return WBEM_E_NOT_FOUND;
+        hr = E_OUTOFMEMORY;
+        goto done;
     }
-    hr = get_method( table, strMethodName, &func );
-    release_table( table );
-    if (hr != S_OK)
+    if (!(query = create_query()))
     {
-        IWbemClassObject_Release( obj );
-        return hr;
+        hr = E_OUTOFMEMORY;
+        goto done;
     }
+    hr = parse_query( str, &query->view, &query->mem );
+    if (hr != S_OK) goto done;
+
+    hr = execute_view( query->view );
+    if (hr != S_OK) goto done;
+
+    hr = EnumWbemClassObject_create( NULL, query, (void **)&result );
+    if (hr != S_OK) goto done;
+
+    hr = create_class_object( query->view->table->name, result, 0, NULL, &obj );
+    if (hr != S_OK) goto done;
+
+    hr = get_method( query->view->table, strMethodName, &func );
+    if (hr != S_OK) goto done;
+
     hr = func( obj, pInParams, ppOutParams );
-    IWbemClassObject_Release( obj );
+
+done:
+    if (result) IEnumWbemClassObject_Release( result );
+    if (obj) IWbemClassObject_Release( obj );
+    free_query( query );
+    free_path( path );
+    heap_free( str );
     return hr;
 }
 
diff --git a/dlls/wbemprox/wbemprox_private.h b/dlls/wbemprox/wbemprox_private.h
index 7c5ee89..e11cdff 100644
--- a/dlls/wbemprox/wbemprox_private.h
+++ b/dlls/wbemprox/wbemprox_private.h
@@ -163,6 +163,8 @@ struct query
     struct list mem;
 };
 
+struct query *create_query(void) DECLSPEC_HIDDEN;
+void free_query( struct query * ) DECLSPEC_HIDDEN;
 struct query *addref_query( struct query * ) DECLSPEC_HIDDEN;
 void release_query( struct query *query ) DECLSPEC_HIDDEN;
 HRESULT exec_query( const WCHAR *, IEnumWbemClassObject ** ) DECLSPEC_HIDDEN;
@@ -170,6 +172,7 @@ HRESULT parse_query( const WCHAR *, struct view **, struct list * ) DECLSPEC_HID
 HRESULT create_view( const struct property *, const WCHAR *, const struct expr *,
                      struct view ** ) DECLSPEC_HIDDEN;
 void destroy_view( struct view * ) DECLSPEC_HIDDEN;
+HRESULT execute_view( struct view * ) DECLSPEC_HIDDEN;
 void init_table_list( void ) DECLSPEC_HIDDEN;
 struct table *grab_table( const WCHAR * ) DECLSPEC_HIDDEN;
 struct table *addref_table( struct table * ) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list