HRESULT get_value( const struct table *table, UINT row, UINT column, LONGLONG *val ) { UINT col_offset, row_size; const BYTE *ptr; col_offset = get_column_offset( table, column ); row_size = get_row_size( table ); ptr = table->data + row * row_size + col_offset; if (table->columns[column].type & CIM_FLAG_ARRAY) { *val = (INT_PTR)*(const void **)ptr; return S_OK; } switch (table->columns[column].type & COL_TYPE_MASK) { case CIM_BOOLEAN: *val = *(const int *)ptr; break; case CIM_DATETIME: case CIM_STRING: *val = (INT_PTR)*(const WCHAR **)ptr; break; case CIM_SINT8: *val = *(const INT8 *)ptr; break; case CIM_UINT8: *val = *(const UINT8 *)ptr; break; case CIM_SINT16: *val = *(const INT16 *)ptr; break; case CIM_UINT16: *val = *(const UINT16 *)ptr; break; case CIM_SINT32: *val = *(const INT32 *)ptr; break; case CIM_UINT32: *val = *(const UINT32 *)ptr; break; case CIM_SINT64: *val = *(const INT64 *)ptr; break; case CIM_UINT64: *val = *(const UINT64 *)ptr; break; default: ERR("invalid column type %u\n", table->columns[column].type & COL_TYPE_MASK); *val = 0; break; } return S_OK; }
HRESULT set_value( const struct table *table, UINT row, UINT column, LONGLONG val, CIMTYPE type ) { UINT col_offset, row_size; BYTE *ptr; if ((table->columns[column].type & COL_TYPE_MASK) != type) return WBEM_E_TYPE_MISMATCH; col_offset = get_column_offset( table, column ); row_size = get_row_size( table ); ptr = table->data + row * row_size + col_offset; switch (table->columns[column].type & COL_TYPE_MASK) { case CIM_DATETIME: case CIM_STRING: *(WCHAR **)ptr = (WCHAR *)(INT_PTR)val; break; case CIM_SINT8: *(INT8 *)ptr = val; break; case CIM_UINT8: *(UINT8 *)ptr = val; break; case CIM_SINT16: *(INT16 *)ptr = val; break; case CIM_UINT16: *(UINT16 *)ptr = val; break; case CIM_SINT32: *(INT32 *)ptr = val; break; case CIM_UINT32: *(UINT32 *)ptr = val; break; case CIM_SINT64: *(INT64 *)ptr = val; break; case CIM_UINT64: *(UINT64 *)ptr = val; break; default: FIXME("unhandled column type %u\n", type); return WBEM_E_FAILED; } return S_OK; }
static UINT get_row_size( const struct table *table ) { return get_column_offset( table, table->num_cols - 1 ) + get_column_size( table, table->num_cols - 1 ); }