namespace Microsoft.VSDesigner.WMI
{
using System;
using System.ComponentModel;
//using System.Core;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Management;
using System.Collections;
using System.Data;
internal enum ComparisonOperators
{
Equals = 0,
NotEquals,
LessThan,
LessThanOrEquals,
GreaterThan,
GreaterThanOrEquals
}
internal class WMIObjectPropertyTable : DataTable
{
private void InitializeComponent ()
{
}
private ManagementBaseObject mgmtObj = null;
private PropertyFilters propFilters = new PropertyFilters(false, false);
private GridMode gridMode = GridMode.ViewMode;
private DataColumn propOrigin = null;
private DataColumn propIsKey = null;
private DataColumn propNameColumn = null;
private DataColumn propTypeColumn = null;
private DataColumn propValueColumn = null;
private DataColumn propDescrColumn = null;
private DataColumn operatorColumn = null;
private DataColumn selectionBoxColumn = null;
private bool showOperators = false;
private bool showOrigin = false;
private bool showKeys = false;
private bool showSelectionBoxes = false;
private bool showValues = true;
private bool expandEmbedded = false;
private bool showEmbeddedObjValue = true; //NOTE: this overrides showValues
private Hashtable rowPropertyMap = new Hashtable(50);
public WMIObjectPropertyTable(ManagementBaseObject mgmtObjIn,
PropertyFilters propFiltersIn,
GridMode gridModeIn,
bool showOperatorsIn,
bool showOriginIn,
bool showKeysIn,
bool showSelectionBoxesIn,
bool showValuesIn,
bool expandEmbeddedIn,
bool showEmbeddedObjValueIn)
{
try
{
if (mgmtObjIn == null)
{
throw (new ArgumentNullException("mgmtObjIn"));
}
mgmtObj = mgmtObjIn;
propFilters = propFiltersIn;
gridMode = gridModeIn;
showOperators = showOperatorsIn;
showOrigin = showOriginIn;
showKeys = showKeysIn;
showSelectionBoxes = showSelectionBoxesIn;
showValues = showValuesIn;
expandEmbedded = expandEmbeddedIn;
showEmbeddedObjValue = showEmbeddedObjValueIn;
Initialize();
}
catch (Exception exc)
{
MessageBox.Show(WMISys.GetString("WMISE_Exception", exc.Message, exc.StackTrace));
}
}
public ManagementBaseObject WMIObject
{
get
{
return mgmtObj;
}
}
///
/// Creates and adds to grid a single row corresponding to a single property. Can be called recursively for embedded
/// objects.
///
///
/// This is used for embedded objects, so that the propertyof an embedded object
/// appears to have name of form "Parent.Child"
private DataRow CreatePropertyRow( Property prop, string namePrefix)
{
if (prop == null)
{
return null;
}
if (propFilters.HideInherited && !prop.IsLocal)
{
return null; //skip this property
}
DataRow propRow = NewRow();
propRow[propNameColumn] = namePrefix + prop.Name;
propRow[propTypeColumn] = CimTypeMapper.ToString(prop.Type);
if (showOperators)
{
//TODO: initialize drop-down. How: in Beta2, a DataGridColumnStyle derived class
//can be added, DataGridComboBoxColumn. Ask urtuser if they are planning to
//to add one themselves
propRow[operatorColumn] = string.Empty;
}
if (prop.Type == CimType.Object)
{
if ((showValues || showEmbeddedObjValue)
&& prop.Value is ManagementBaseObject)
{
if (showOperators)
{
propRow[operatorColumn] = "ISA";
}
propRow[propValueColumn] = ((ManagementBaseObject)prop.Value).SystemProperties["__CLASS"].Value.ToString();
}
else
{
propRow[propValueColumn] = string.Empty;
}
}
else
{
if (showValues)
{
propRow[propValueColumn] = prop.Value;
}
else
{
propRow[propValueColumn] = string.Empty;
}
}
//propRow[propDescrColumn] = WmiHelper.GetPropertyDescription(prop, wmiObj);
//set property origin column
if (showOrigin)
{
if (prop.IsLocal)
{
propRow[propOrigin] = true;
}
else
{
propRow[propOrigin] = false;
}
}
if (showKeys)
{
propRow[propIsKey] = WmiHelper.IsKeyProperty(prop);
}
//grey selectionBoxColumn for expanded embedded object properties:
if (propRow[propNameColumn].ToString().IndexOf(".") > 0)
{
//NOTE: this doesn't work!!! is there a way to disable input on an individual cell?
propRow.SetUnspecified(selectionBoxColumn);
}
Rows.Add (propRow);
if (prop.Type == CimType.Object && expandEmbedded)
{
if (prop.Value != null && prop.Value is ManagementBaseObject)
{
ManagementBaseObject embeddedObj = (ManagementBaseObject)prop.Value;
foreach (Property embeddedProp in embeddedObj.Properties)
{
CreatePropertyRow(embeddedProp, prop.Name + ".");
}
}
}
rowPropertyMap.Add(propRow, prop);
return propRow;
}
private void Initialize ()
{
try
{
try
{
this.TableName = mgmtObj.ClassPath.ClassName;
}
catch (Exception)
{
//if mgmtObj is a newly created instance of an abstract class,
//ClassPath will be unavailable. Don't set TableName in this case.
}
propNameColumn = new DataColumn (WMISys.GetString("WMISE_PropTable_ColumnName"));
//propNameColumn.AllowNull = false;
propNameColumn.Unique = true;
propNameColumn.DataType = typeof(string);
propTypeColumn = new DataColumn (WMISys.GetString("WMISE_PropTable_ColumnType"));
//propTypeColumn.AllowNull = false;
propTypeColumn.DataType = typeof(string);
propValueColumn = new DataColumn (WMISys.GetString("WMISE_PropTable_ColumnValue"));
propValueColumn.DefaultValue = null;
propDescrColumn = new DataColumn(WMISys.GetString("WMISE_PropTable_ColumnDescription"));
propDescrColumn.ReadOnly = true;
propDescrColumn.DefaultValue = string.Empty;
propDescrColumn.DataType = typeof(string);
if (showOperators)
{
operatorColumn = new DataColumn(WMISys.GetString("WMISE_PropTable_ColumnComparison"),
typeof(/*ComparisonOperators*/ string));
operatorColumn.DefaultValue = string.Empty;
operatorColumn.DataType = typeof(string);
operatorColumn.ReadOnly = false;
}
/*
ValueEditor dropDownEditor = new ValueEditor();
dropDownEditor.Style = ValueEditorStyles.DropdownArrow;
operatorColumn.DataValueEditorType = dropDownEditor.GetType();
*/
if (showKeys)
{
propIsKey = new DataColumn (WMISys.GetString("WMISE_PropTable_ColumnIsKey"), typeof(Boolean));
//propIsKey.AllowNull = false;
propIsKey.DefaultValue = false;
}
if (showOrigin)
{
propOrigin = new DataColumn (WMISys.GetString("WMISE_PropTable_ColumnIsLocal"), typeof(Boolean));
//propOrigin.AllowNull = false;
propOrigin.DefaultValue = true;
}
if (showSelectionBoxes)
{
selectionBoxColumn = new DataColumn(WMISys.GetString("WMISE_PropertyInResultset"),
typeof (bool));
//selectionBoxColumn.AllowNull = false;
selectionBoxColumn.DefaultValue = true;
}
//set read/write permissions on columns
//Note that DefaultView takes care of the rest of the restrictions
//(see below)
if (gridMode == GridMode.EditMode ||
gridMode == GridMode.LocalEditMode)
{
propNameColumn.ReadOnly = true;
propTypeColumn.ReadOnly = true;
propValueColumn.ReadOnly = false;
if (showOrigin)
{
propOrigin.ReadOnly = true;
}
if (showKeys)
{
propIsKey.ReadOnly = true;
}
}
if (gridMode == GridMode.DesignMode && showOrigin)
{
propOrigin.ReadOnly = true;
}
Columns.Add(propNameColumn);
Columns.Add(propTypeColumn);
if (showOperators)
{
//operatorColumn.DataValueEditorType = typeof(OperatroDataColumnEditor);
operatorColumn.ReadOnly = false;
Columns.Add(operatorColumn);
}
Columns.Add(propValueColumn);
//Columns.Add(propDescrColumn);
if (showOrigin)
{
Columns.Add(propOrigin);
}
if (showKeys)
{
Columns.Add(propIsKey);
}
if (showSelectionBoxes)
{
Columns.Add (selectionBoxColumn);
}
foreach (Property prop in mgmtObj.Properties)
{
CreatePropertyRow(prop, string.Empty);
}
//Add system properties here (if PropertyFilters.ShowAll)
if (!propFilters.HideSystem)
{
foreach (Property sysProp in mgmtObj.SystemProperties)
{
CreatePropertyRow(sysProp, string.Empty);
}
}
this.CaseSensitive = false;
this.RowChanged += new DataRowChangeEventHandler(this.RowChangedEventHandler);
this.RowChanging += new DataRowChangeEventHandler(this.RowChangingEventHandler);
DataView view = this.DefaultView;
switch (gridMode)
{
case (GridMode.ViewMode):
{
view.AllowEdit = false; //wmi raid 2866?
view.AllowDelete = false;
view.AllowNew = false;
break;
}
case (GridMode.EditMode):
{
view.AllowEdit = true;
view.AllowDelete = false;
view.AllowNew = false;
break;
}
case (GridMode.LocalEditMode) :
{
view.AllowEdit = true;
view.AllowDelete = false;
view.AllowNew = false;
break;
}
case (GridMode.DesignMode):
{
view.AllowEdit = true;
view.AllowDelete = true;
view.AllowNew = true;
break;
}
}
}
catch (Exception exc)
{
MessageBox.Show(WMISys.GetString("WMISE_Exception", exc.Message, exc.StackTrace));
}
}
protected void RowChangedEventHandler(object sender,
DataRowChangeEventArgs e)
{
try
{
DataRow RowAffected = e.Row;
switch (e.Action)
{
case(DataRowAction.Add):
{
/*
MessageBox.Show("Cannot Add Rows. Deleting...");
RowAffected.Delete();
*/
break;
}
case(DataRowAction.Change):
{
DataRow row = e.Row;
if (gridMode == GridMode.EditMode)
{
//this can only be value change
Property propAffected = (Property)this.rowPropertyMap[row];
Object newValue = WmiHelper.GetTypedObjectFromString(propAffected.Type,
row[propValueColumn].ToString());
propAffected.Value = newValue;
}
//possibly handle other modes here
break;
}
case(DataRowAction.Commit):
{
//MessageBox.Show("DataRowAction.Commit");
break;
}
case(DataRowAction.Delete):
{
MessageBox.Show("Cannot delete nodes.Adding back...");
RowAffected.CancelEdit();
break;
}
case(DataRowAction.Nothing):
{
MessageBox.Show("DataRowAction.Nothing");
break;
}
case(DataRowAction.Rollback):
{
MessageBox.Show("DataRowAction.Rollback");
break;
}
}
}
catch (Exception exc)
{
MessageBox.Show(WMISys.GetString("WMISE_Exception", exc.Message, exc.StackTrace));
}
}
protected void RowChangingEventHandler(object sender,
DataRowChangeEventArgs e)
{
try
{
DataRow row = e.Row;
switch (e.Action)
{
case(DataRowAction.Add):
{
//throw (new Exception("Cannot add rows"));
break;
}
case(DataRowAction.Change):
{
//if this is an object, datetime, enum or ref property changing,
//bring up custom UI for editing these!!!!
if (gridMode == GridMode.EditMode)
{
//this can only be value change
Property propAffected = (Property)this.rowPropertyMap[row]; //mgmtObj.Properties[row[propNameColumn].ToString()];
if (propAffected.Type == CimType.Object)
{
////MessageBox.Show("should bring up custom type editor for objects");
}
if (propAffected.Type == CimType.Reference)
{
//MessageBox.Show("should bring up custom type editor for refs");
}
if (propAffected.Type == CimType.DateTime)
{
//MessageBox.Show("should bring up custom type editor for datetime");
}
if (WmiHelper.IsValueMap(propAffected))
{
//MessageBox.Show("should bring up custom type editor for enums");
}
}
break;
}
case(DataRowAction.Commit):
{
//MessageBox.Show("DataRowAction.Commit");
break;
}
case(DataRowAction.Delete):
{
throw (new Exception("Cannot delete rows"));
}
case(DataRowAction.Nothing):
{
MessageBox.Show("DataRowAction.Nothing");
break;
}
case(DataRowAction.Rollback):
{
MessageBox.Show("DataRowAction.Rollback");
break;
}
}
}
catch (Exception exc)
{
MessageBox.Show(WMISys.GetString("WMISE_Exception", exc.Message, exc.StackTrace));
throw(exc);
}
}
internal void SetPropertyValue (int rowNum, String val)
{
try
{
DataRow row = this.Rows[rowNum];
Property propAffected = (Property)this.rowPropertyMap[row]; //mgmtObj.Properties[row[propNameColumn].ToString()];
Object newValue = WmiHelper.GetTypedObjectFromString(propAffected.Type,
val);
propAffected.Value = newValue;
}
catch (Exception exc)
{
MessageBox.Show(WMISys.GetString("WMISE_Exception", exc.Message, exc.StackTrace));
throw (exc);
}
}
public string WhereClause
{
get
{
if (!showOperators || Rows.Count == 0)
{
return string.Empty;
}
const String strWhere = " WHERE ";
const String strAnd = " AND ";
String clause = strWhere;
for (int i = 0; i < Rows.Count; i++)
{
DataRow curRow = Rows[i];
Property curProp = (Property)rowPropertyMap[curRow]; //mgmtObj.Properties[curRow[propNameColumn].ToString()];
if (curRow[propValueColumn].ToString() == "")
{
continue;
}
clause += curRow[propNameColumn] + " " +
curRow[operatorColumn] + " ";
//if the property is a string, datetime or object,
//put quotes around the value
if (curProp.Type == CimType.DateTime ||
curProp.Type == CimType.Object ||
curProp.Type == CimType.String) //any others?
{
clause += "\"" + curRow[propValueColumn] + "\"" + strAnd;
}
else
{
clause += curRow[propValueColumn] + strAnd;
}
}
if (clause == strWhere)
{
return string.Empty;
}
//get rid of the last " AND "
if (clause.Substring (clause.Length - strAnd.Length, strAnd.Length) == strAnd)
{
clause = clause.Substring(0, clause.Length - strAnd.Length);
}
return clause;
}
}
public void AddSystemProperties()
{
if (!propFilters.HideSystem)
{
//already there
return;
}
propFilters.HideSystem = false;
foreach (Property sysProp in mgmtObj.SystemProperties)
{
CreatePropertyRow(sysProp, string.Empty);
}
}
public void RemoveSystemProperties()
{
if (propFilters.HideSystem)
{
//already not there
return;
}
propFilters.HideSystem = true;
ArrayList forRemoval = new ArrayList(this.Rows.Count);
foreach (DataRow thisRow in this.Rows)
{
if (thisRow[propNameColumn].ToString().StartsWith("__"))
{
forRemoval.Add(thisRow);
}
}
for (int i = 0; i < forRemoval.Count; i++)
{
this.Rows.Remove((DataRow)forRemoval[i]);
this.rowPropertyMap.Remove((DataRow)forRemoval[i]);
}
}
public void AddInheritedProperties()
{
if (!propFilters.HideInherited)
{
//already there
return;
}
propFilters.HideInherited = false;
foreach (Property curProp in mgmtObj.Properties)
{
if (!curProp.IsLocal)
{
CreatePropertyRow(curProp, string.Empty);
}
}
}
///
///
///
public void RemoveInheritedProperties()
{
if (propFilters.HideInherited)
{
//already not there
return;
}
propFilters.HideInherited = true;
ArrayList forRemoval = new ArrayList(this.Rows.Count);
foreach (DataRow thisRow in this.Rows)
{
//special-case expanded embedded properties
//if a property name contains a dot, that means
//this is an expanded embedded property name
if (thisRow[propNameColumn].ToString().IndexOf(".") >= 0)
{
continue;
}
Property curProp = (Property)this.rowPropertyMap[thisRow]; //mgmtObj.Properties[thisRow[propNameColumn].ToString()];
if (!curProp.IsLocal)
{
forRemoval.Add(thisRow);
}
}
for (int i = 0; i < forRemoval.Count; i++)
{
this.Rows.Remove((DataRow)forRemoval[i]);
this.rowPropertyMap.Remove((DataRow)forRemoval[i]);
}
}
}
}