Hans Leidekker : wbemprox: Parse the object path passed to IWbemServices:: GetObject.
Alexandre Julliard
julliard at winehq.org
Fri Jul 27 13:13:56 CDT 2012
Module: wine
Branch: master
Commit: f3b93f26159873f35e32f71f523b943b7ba37b59
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f3b93f26159873f35e32f71f523b943b7ba37b59
Author: Hans Leidekker <hans at codeweavers.com>
Date: Fri Jul 27 14:04:28 2012 +0200
wbemprox: Parse the object path passed to IWbemServices::GetObject.
---
dlls/wbemprox/services.c | 112 ++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 99 insertions(+), 13 deletions(-)
diff --git a/dlls/wbemprox/services.c b/dlls/wbemprox/services.c
index e8c5461..8c9c2f4 100644
--- a/dlls/wbemprox/services.c
+++ b/dlls/wbemprox/services.c
@@ -235,35 +235,108 @@ static HRESULT WINAPI wbem_services_QueryObjectSink(
return WBEM_E_FAILED;
}
-static HRESULT create_instance_enum( const WCHAR *class, IEnumWbemClassObject **iter )
+struct path
{
- static const WCHAR selectW[] = {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',0};
- WCHAR *query;
- HRESULT hr;
+ WCHAR *class;
+ UINT class_len;
+ WCHAR *filter;
+ UINT filter_len;
+};
+
+static HRESULT parse_path( const WCHAR *str, struct path **ret )
+{
+ struct path *path;
+ const WCHAR *p = str, *q;
+ UINT len;
- query = heap_alloc( strlenW( class ) * sizeof(WCHAR) + sizeof(selectW) );
- if (!query) return E_OUTOFMEMORY;
+ if (!(path = heap_alloc_zero( sizeof(*path) ))) return E_OUTOFMEMORY;
- strcpyW( query, selectW );
- strcatW( query, class );
+ while (*p && *p != '.') p++;
+ len = p - str;
+ if (!(path->class = heap_alloc( (len + 1) * sizeof(WCHAR) )))
+ {
+ heap_free( path );
+ return E_OUTOFMEMORY;
+ }
+ memcpy( path->class, str, len * sizeof(WCHAR) );
+ path->class[len] = 0;
+ path->class_len = len;
+
+ if (p[0] == '.' && p[1])
+ {
+ q = ++p;
+ while (*q) q++;
+
+ len = q - p;
+ if (!(path->filter = heap_alloc( (len + 1) * sizeof(WCHAR) )))
+ {
+ heap_free( path->class );
+ heap_free( path );
+ return E_OUTOFMEMORY;
+ }
+ memcpy( path->filter, p, len * sizeof(WCHAR) );
+ path->filter[len] = 0;
+ path->filter_len = len;
+ }
+ *ret = path;
+ return S_OK;
+}
+
+static void free_path( struct path *path )
+{
+ heap_free( path->class );
+ heap_free( path->filter );
+ heap_free( path );
+}
+
+static HRESULT create_instance_enum( const struct path *path, IEnumWbemClassObject **iter )
+{
+ static const WCHAR selectW[] =
+ {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','%','s',' ',
+ 'W','H','E','R','E',' ','%','s',0};
+ 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;
+ 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;
+ strcpyW( query, select_allW );
+ strcatW( query, path->class );
+ }
hr = exec_query( query, iter );
heap_free( query );
return hr;
}
-HRESULT get_object( const WCHAR *path, IWbemClassObject **obj )
+HRESULT get_object( const WCHAR *object_path, IWbemClassObject **obj )
{
IEnumWbemClassObject *iter;
+ struct path *path;
HRESULT hr;
- /* FIXME: parse path */
-
- hr = create_instance_enum( path, &iter );
+ hr = parse_path( object_path, &path );
if (hr != S_OK) return hr;
+ hr = create_instance_enum( path, &iter );
+ if (hr != S_OK)
+ {
+ free_path( path );
+ return hr;
+ }
hr = WbemClassObject_create( NULL, iter, 0, (void **)obj );
IEnumWbemClassObject_Release( iter );
+ free_path( path );
return hr;
}
@@ -280,6 +353,11 @@ static HRESULT WINAPI wbem_services_GetObject(
if (lFlags) FIXME("unsupported flags 0x%08x\n", lFlags);
+ if (!strObjectPath)
+ {
+ FIXME("no support for creating new classes\n");
+ return WBEM_E_FAILED;
+ }
return get_object( strObjectPath, ppObject );
}
@@ -411,11 +489,19 @@ static HRESULT WINAPI wbem_services_CreateInstanceEnum(
IWbemContext *pCtx,
IEnumWbemClassObject **ppEnum )
{
+ struct path *path;
+ HRESULT hr;
+
TRACE("%p, %s, 0%08x, %p, %p\n", iface, debugstr_w(strClass), lFlags, pCtx, ppEnum);
if (lFlags) FIXME("unsupported flags 0x%08x\n", lFlags);
- return create_instance_enum( strClass, ppEnum );
+ hr = parse_path( strClass, &path );
+ if (hr != S_OK) return hr;
+
+ hr = create_instance_enum( path, ppEnum );
+ free_path( path );
+ return hr;
}
static HRESULT WINAPI wbem_services_CreateInstanceEnumAsync(
More information about the wine-cvs
mailing list