Module: wine Branch: master Commit: 2ea3258c5467643804803d8b26098c567e036242 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2ea3258c5467643804803d8b26...
Author: Hans Leidekker hans@codeweavers.com Date: Wed Jun 20 12:06:40 2012 +0200
wbemprox: Append key properties to the class path.
---
dlls/wbemprox/query.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 111 insertions(+), 1 deletions(-)
diff --git a/dlls/wbemprox/query.c b/dlls/wbemprox/query.c index afb419c..7a2b545 100644 --- a/dlls/wbemprox/query.c +++ b/dlls/wbemprox/query.c @@ -118,6 +118,49 @@ static HRESULT get_value( const struct table *table, UINT row, UINT column, INT_ return S_OK; }
+static BSTR get_value_bstr( const struct table *table, UINT row, UINT column ) +{ + static const WCHAR fmt_signedW[] = {'%','d',0}; + static const WCHAR fmt_unsignedW[] = {'%','u',0}; + static const WCHAR fmt_strW[] = {'"','%','s','"',0}; + INT_PTR val; + BSTR ret; + WCHAR number[12]; + UINT len; + + if (table->columns[column].type & CIM_FLAG_ARRAY) + { + FIXME("array to string conversion not handled\n"); + return NULL; + } + if (get_value( table, row, column, &val ) != S_OK) return NULL; + + switch (table->columns[column].type & COL_TYPE_MASK) + { + case CIM_DATETIME: + case CIM_STRING: + len = strlenW( (const WCHAR *)val ) + 2; + if (!(ret = SysAllocStringLen( NULL, len ))) return NULL; + sprintfW( ret, fmt_strW, (const WCHAR *)val ); + return ret; + + case CIM_SINT16: + case CIM_SINT32: + sprintfW( number, fmt_signedW, val ); + return SysAllocString( number ); + + case CIM_UINT16: + case CIM_UINT32: + sprintfW( number, fmt_unsignedW, val ); + return SysAllocString( number ); + + default: + FIXME("unhandled column type %u\n", table->columns[column].type & COL_TYPE_MASK); + break; + } + return NULL; +} + HRESULT create_view( const struct property *proplist, const WCHAR *class, const struct expr *cond, struct view **ret ) { @@ -416,10 +459,77 @@ static BSTR build_namespace( const struct view *view ) return SysAllocString( cimv2W ); }
+static BSTR build_proplist( const struct view *view, UINT index, UINT count, UINT *len ) +{ + static const WCHAR fmtW[] = {'%','s','=','%','s',0}; + UINT i, j, offset, row = view->result[index]; + BSTR *values, ret = NULL; + + if (!(values = heap_alloc( count * sizeof(BSTR) ))) return NULL; + + *len = j = 0; + for (i = 0; i < view->table->num_cols; i++) + { + if (view->table->columns[i].type & COL_FLAG_KEY) + { + const WCHAR *name = view->table->columns[i].name; + + values[j] = get_value_bstr( view->table, row, i ); + *len += strlenW( fmtW ) + strlenW( name ) + strlenW( values[j] ); + j++; + } + } + if ((ret = SysAllocStringLen( NULL, *len ))) + { + offset = j = 0; + for (i = 0; i < view->table->num_cols; i++) + { + if (view->table->columns[i].type & COL_FLAG_KEY) + { + const WCHAR *name = view->table->columns[i].name; + + offset += sprintfW( ret + offset, fmtW, name, values[j] ); + if (j < count - 1) ret[offset++] = ','; + j++; + } + } + } + for (i = 0; i < count; i++) SysFreeString( values[i] ); + heap_free( values ); + return ret; +} + +static UINT count_key_columns( const struct view *view ) +{ + UINT i, num_keys = 0; + + for (i = 0; i < view->table->num_cols; i++) + { + if (view->table->columns[i].type & COL_FLAG_KEY) num_keys++; + } + return num_keys; +} + static BSTR build_relpath( const struct view *view, UINT index, const WCHAR *name ) { + static const WCHAR fmtW[] = {'%','s','.','%','s',0}; + BSTR class, proplist, ret = NULL; + UINT num_keys, len; + if (view->proplist) return NULL; - return build_classname( view ); /* FIXME: append list of key properties */ + + if (!(class = build_classname( view ))) return NULL; + if (!(num_keys = count_key_columns( view ))) return class; + if (!(proplist = build_proplist( view, index, num_keys, &len ))) goto done; + + len += strlenW( fmtW ) + SysStringLen( class ); + if (!(ret = SysAllocStringLen( NULL, len ))) goto done; + sprintfW( ret, fmtW, class, proplist ); + +done: + SysFreeString( class ); + SysFreeString( proplist ); + return ret; }
static BSTR build_path( const struct view *view, UINT index, const WCHAR *name )