907 lines
29 KiB
HTML
907 lines
29 KiB
HTML
|
|
<html><head>
|
|
<title>WMI Instance Provider Wizard</title>
|
|
|
|
<style type="text/css">@import "..\..\..\..\..\1033\styles.css";
|
|
</style>
|
|
|
|
</head>
|
|
<body onkeydown=OnKey(); style="OVERFLOW: visible" bottomMargin=0
|
|
bgColor=#ebebeb leftMargin=0 topMargin=0 onload=InitDocument(document);
|
|
rightMargin=0>
|
|
<TABLE height="100%" cellSpacing=0 cellPadding=0 width="100%">
|
|
<TR align=top>
|
|
<TD height="100%">
|
|
<TABLE bgcolor="white" style="width:100%;height:65;border-style:solid;border-color:silver;border-width:1;" align=top>
|
|
<TR>
|
|
<TD>
|
|
<DIV>
|
|
<P class="titleText">WMI Instance Provider Wizard</P>
|
|
<P class="titleDesc">Specify...</P>
|
|
</DIV>
|
|
</TD>
|
|
<TD>
|
|
<DIV id="Layer1" style="z-index:1" align=right>
|
|
<IMG src="..\..\Images\Overview.bmp" width="92" height="63"></IMG>
|
|
</DIV>
|
|
</TD>
|
|
</TR>
|
|
</TABLE>
|
|
<TABLE style="BORDER-BOTTOM: silver 1px solid" height="70%" cellSpacing=0
|
|
cellPadding=0 width="100%" bgColor=#ebebeb>
|
|
<TBODY>
|
|
<TR>
|
|
<TD style="WIDTH: 187px" vAlign=top align=left>
|
|
<TABLE style="WIDTH: 200px; HEIGHT: 280px" align=left
|
|
bgColor=#ebebeb>
|
|
<TR>
|
|
<TD class=bodyText style="HEIGHT: 13%" bgColor=silver
|
|
><span class=sideBtn id=Default
|
|
onmouseover="this.style.color='blue'; this.style.cursor='hand'"
|
|
title="" onclick='Next(document, "default.htm");'
|
|
onmouseout="this.style.color='black'"><b
|
|
><LABEL for=Default
|
|
>Names</LABEL></b></span></TD></TR>
|
|
<TR>
|
|
<TD class=bodyText style="HEIGHT: 13%" bgColor=#ebebeb
|
|
><span class=sideBtn id=WMIClass
|
|
onmouseover="this.style.color='blue'; this.style.cursor='hand'"
|
|
title="" onclick='Next(document, "WMIClass.htm");'
|
|
onmouseout="this.style.color='black'"
|
|
><LABEL for=WMIClass
|
|
>WMI Class</LABEL></span></TD></TR>
|
|
<TR>
|
|
<TD class=bodyText style="HEIGHT: 13%" bgColor=silver
|
|
><span class=sideBtn id=Attributes
|
|
onmouseover="this.style.color='blue'; this.style.cursor='hand'"
|
|
title="" onclick='Next(document, "Attributes.htm");'
|
|
onmouseout="this.style.color='black'"
|
|
><LABEL for=Attributes
|
|
>Attributes</LABEL></span></TD></TR>
|
|
<!--
|
|
<TR>
|
|
<TD class=bodyText style="HEIGHT: 13%" bgColor=silver
|
|
><span class=sideBtn id=Properties
|
|
onmouseover="this.style.color='blue'; this.style.cursor='hand'"
|
|
title="" onclick='Next(document, "Properties.htm");'
|
|
onmouseout="this.style.color='black'"
|
|
><LABEL for=Properties
|
|
>Properties</LABEL></SPAN></TD></TR>-->
|
|
<TR>
|
|
<TD class=bodyText style="HEIGHT: 13%" bgColor=silver
|
|
><span></span></TD></TR>
|
|
<TR>
|
|
<TD class=bodyText style="HEIGHT: 13%" bgColor=silver
|
|
><span></span></TD></TR>
|
|
<TR>
|
|
<TD class=bodyText style="HEIGHT: 13%" bgColor=silver
|
|
><span></span></TD></TR>
|
|
<TR>
|
|
<TD class=bodyText style="HEIGHT: 13%" bgColor=silver
|
|
><span></span></TD></TR>
|
|
<TR>
|
|
<TD class=bodyText style="HEIGHT: 13%" bgColor=silver
|
|
><span></span></TD></TR>
|
|
</TABLE>
|
|
<!-- invisible controls to store ns, classname and methods-->
|
|
<input style="display:none" class=itemText id=NAMESPACE name=NAMESPACE> </input>
|
|
<input style="display:none" class=itemText id=WMICLASSNAME name=WMICLASSNAME></input>
|
|
<input style="display:none" type=radio id=HAS_IMPL_METHODS name=HAS_IMPL_METHODS CHECKED></input>
|
|
|
|
<table style="HEIGHT: 170px" width="100%" align=center
|
|
>
|
|
<TBODY>
|
|
|
|
<tr align=left>
|
|
<td>
|
|
<p class=itemText style="WIDTH: 234px; HEIGHT: 12px"
|
|
><span class=itemText
|
|
><b>Select
|
|
<u>n</u>amespace:</b></span><br><select
|
|
class=itemText id=NSPICKER style="WIDTH: 370px; HEIGHT: 13%"
|
|
onchange=OnChangeNS() align=left size=1 name=NSPICKER accessKey=n
|
|
TYPE="SELECT-ONE"> <option value=1
|
|
selected>root</option></select></SPAN>
|
|
</p></td></tr>
|
|
<tr>
|
|
<td align=left ><br>
|
|
<p class=itemText><span class=itemText
|
|
><b>Select
|
|
c<u>l</u>ass:</b></span><br><input
|
|
class=sideBtn onkeypress=OnInputKeyPress()
|
|
oncut=OnInputKeyPress() onpaste=OnInputKeyPress()
|
|
id=CLASSINPUT style="WIDTH: 369px" name=CLASSINPUT
|
|
>
|
|
<select class=itemText id=CLASSPICKER
|
|
ondblclick=OnClassDblClick()
|
|
style="WIDTH: 369px; HEIGHT: 90px"
|
|
onchange=OnChangeSelection() align=left size=12
|
|
name=CLASSPICKER accessKey=l
|
|
TYPE="SELECT-ONE"></select></SPAN></p></td></tr>
|
|
<tr align=left>
|
|
<td><br>
|
|
|
|
<span
|
|
class=itemText title=""><LABEL
|
|
for=CURRENTSELECTION><b
|
|
>Current selection:</b><BR> </LABEL>
|
|
<TEXTAREA class=itemText id=CURRENTSELECTION style="OVERFLOW: visible; WIDTH: 369px; HEIGHT: 12px" readOnly></TEXTAREA></span>
|
|
|
|
</td></tr>
|
|
</TBODY></table></TD></TR></TBODY></TABLE>
|
|
<TABLE style="width:100%;height:10%" cellpadding=0 cellspacing=4>
|
|
<TR>
|
|
<TD align=left width=85%></TD>
|
|
|
|
<TD align=right width=5%>
|
|
<BUTTON id="HelpBtn" class="buttonClass" ACCESSKEY="h" onClick='window.external.Alert("Sorry, no help is available for this wizard.");'><u>H</u>elp</BUTTON>
|
|
</TD>
|
|
<TD align=right width=5%>
|
|
<BUTTON id="FinishBtn" class="buttonClass" ACCESSKEY="f" onClick='OnFinish(this);'><u>F</u>inish</BUTTON>
|
|
</TD>
|
|
<TD align=right width=5%>
|
|
<BUTTON id="CancelBtn" class="buttonClass" ACCESSKEY="c" onClick='window.external.Finish(document, "cancel");'><u>C</u>ancel</BUTTON>
|
|
</TD>
|
|
</TR>
|
|
</TABLE>
|
|
</TD></TR></TABLE>
|
|
|
|
|
|
|
|
<SCRIPT language=jscript>
|
|
|
|
var tab_array = new Array();
|
|
tab_array[0] = Default;
|
|
tab_array[1] = WMIClass;
|
|
tab_array[2] = Attributes;
|
|
//tab_array[3] = Properties;
|
|
|
|
var arCodeComments = new Array();
|
|
arCodeComments[0] = "//TODO: put appropriate value here";
|
|
arCodeComments[1] = "//check that class name in the path is correct";
|
|
arCodeComments[2] = "//create path parser object";
|
|
arCodeComments[3] = "";
|
|
arCodeComments[4] = "//parse path to find instance for method execution";
|
|
arCodeComments[5] = "//Get values of key properties:";
|
|
arCodeComments[6] = "//TODO: save vValue for later use";
|
|
arCodeComments[7] = "//TODO: iterate through your data source to find the matching object";
|
|
arCodeComments[8] = "//Get input arguments:";
|
|
arCodeComments[9] = "//TODO: save input parameter value";
|
|
arCodeComments[10] = "//The method has no input parameters";
|
|
arCodeComments[11] = "//TODO: add code to execute the method here";
|
|
arCodeComments[12] = "//get output parameters class";
|
|
arCodeComments[13] = "//fill output parameters";
|
|
arCodeComments[14] = "//TODO: fill variant with appropriate value";
|
|
arCodeComments[15] = "// Send the output object back to the client via the sink";
|
|
arCodeComments[16] = "//The method has no output parameters";
|
|
arCodeComments[17] = "//Properties of the input parameters object:";
|
|
arCodeComments[18] = "//Properties of the output parameters object:";
|
|
|
|
|
|
var locator;
|
|
var services;
|
|
var classSink = InternalGetObject("WbemScripting.SWbemSink");
|
|
var arClassNames;
|
|
var dictLookup;
|
|
var bRestoreClassSelection;
|
|
var bFirstLoad;
|
|
|
|
var dictCIM2VT = new ActiveXObject("Scripting.Dictionary");
|
|
dictCIM2VT.Add("2", "VT_I2"); //wbemCimtypeSint16
|
|
dictCIM2VT.Add("3", "VT_I4"); //wbemCimtypeSint32
|
|
dictCIM2VT.Add("4", "VT_R4"); //wbemCimtypeReal32
|
|
dictCIM2VT.Add("5", "VT_R8"); //wbemCimtypeReal64
|
|
dictCIM2VT.Add("8", "VT_BSTR"); //wbemCimtypeString
|
|
dictCIM2VT.Add("11", "VT_BOOL"); //wbemCimtypeBoolean
|
|
dictCIM2VT.Add("13", "VT_UNKNOWN"); //wbemCimtypeObject
|
|
dictCIM2VT.Add("16", "VT_I2"); //wbemCimtypeSint8
|
|
dictCIM2VT.Add("17", "VT_UI1"); //wbemCimtypeUint8
|
|
dictCIM2VT.Add("18", "VT_I4"); //wbemCimtypeUint16
|
|
dictCIM2VT.Add("19", "VT_I4"); //wbemCimtypeUint32
|
|
dictCIM2VT.Add("20", "VT_BSTR"); //wbemCimtypeSint64
|
|
dictCIM2VT.Add("21", "VT_BSTR"); //wbemCimtypeUint64
|
|
dictCIM2VT.Add("101", "VT_BSTR"); //wbemCimtypeDatetime
|
|
dictCIM2VT.Add("102", "VT_BSTR"); //wbemCimtypeReference
|
|
dictCIM2VT.Add("103", "VT_I2"); //wbemCimtypeChar16
|
|
|
|
var propPrefix = "s_pProp";
|
|
var methPrefix = "s_pMeth";
|
|
var inparmPrefix = "s_pIn";
|
|
var outparmPrefix = "s_pOut";
|
|
|
|
function InitDocument(document)
|
|
{
|
|
try
|
|
{
|
|
bFirstLoad = window.external.FindSymbol("DOCUMENT_FIRST_LOAD");
|
|
if (bFirstLoad)
|
|
{
|
|
window.external.SetDefaults(document);
|
|
}
|
|
window.external.Load(document);
|
|
|
|
locator = InternalGetObject("WbemScripting.SWbemLocator");
|
|
|
|
EnumNamespaces("root", 1);
|
|
|
|
CURRENTSELECTION.value = "";
|
|
|
|
bRestoreClassSelection = true;
|
|
|
|
//force selection of the last selected namespace and class
|
|
//or the first elements in both listboxes
|
|
RestoreNSSelection();
|
|
|
|
OnChangeNS();
|
|
}
|
|
catch (e)
|
|
{
|
|
window.external.ReportError("Exception: " + e.description + " in InitDocument()");
|
|
}
|
|
}
|
|
|
|
function EnumNamespaces(name, num)
|
|
//recursively adds namespaces to the drop-down box
|
|
{
|
|
|
|
try
|
|
{
|
|
services = locator.ConnectServer("", name);
|
|
|
|
var instances = new Enumerator(services.InstancesOf("__NAMESPACE"));
|
|
|
|
for (; !instances.atEnd(); instances.moveNext() )
|
|
{
|
|
num++;
|
|
var oOption = document.createElement("OPTION");
|
|
|
|
NSPICKER.options.add(oOption);
|
|
|
|
var NameOut;
|
|
if (name != "")
|
|
{
|
|
NameOut = name + "\\" + instances.item().Name;
|
|
}
|
|
else
|
|
{
|
|
NameOut = instances.item().Name;
|
|
}
|
|
|
|
oOption.innerText = NameOut;
|
|
oOption.Value = num;
|
|
|
|
EnumNamespaces(NameOut, num);
|
|
}
|
|
}
|
|
catch (e)
|
|
{
|
|
window.external.ReportError("Exception: " + e.description + " in EnumNamespaces()");
|
|
return;
|
|
}
|
|
}
|
|
|
|
function OnChangeNS()
|
|
//clear array and dictionary, then call asynchronous class enumeration
|
|
{
|
|
try
|
|
{
|
|
//clear CLASSPICKER and CLASSINPUT first
|
|
while (CLASSPICKER.options.length > 0)
|
|
{
|
|
CLASSPICKER.options.remove(0);
|
|
}
|
|
CLASSINPUT.value = "";
|
|
|
|
//clear class names array and dictionary
|
|
arClassNames = "";
|
|
arClassNames = new Array();
|
|
dictLookup = "";
|
|
dictLookup = new ActiveXObject("Scripting.Dictionary");
|
|
|
|
//Display "Loading classes..." in the class list box
|
|
var oOption = document.createElement("OPTION");
|
|
CLASSPICKER.options.add(oOption);
|
|
oOption.innerText = "Loading classes...";
|
|
oOption.Value = 1;
|
|
|
|
var strNS = NSPICKER[NSPICKER.selectedIndex].innerText;
|
|
services = locator.ConnectServer("", strNS);
|
|
|
|
document.body.style.cursor = 'wait';
|
|
services.SubclassesOfAsync(classSink);
|
|
|
|
}
|
|
catch (e)
|
|
{
|
|
window.external.ReportError("Exception: " + e.description + " in OnChangeNS()");
|
|
}
|
|
}
|
|
|
|
function OnInputKeyPress()
|
|
//selects best-matching class in the listbox
|
|
{
|
|
//update text immediately, without waiting for rather lengthy processing
|
|
//CLASSINPUT.value += String.fromCharCode(event.keyCode);
|
|
|
|
try
|
|
{
|
|
var strInput = CLASSINPUT.value.toUpperCase();
|
|
|
|
var bLoopThrough = true;
|
|
|
|
for (i = 0; i < CLASSPICKER.options.length; i++)
|
|
{
|
|
var strListed = CLASSPICKER.options[i].innerText.toUpperCase();
|
|
|
|
if (strListed >= strInput)
|
|
{
|
|
CLASSPICKER.selectedIndex = i;
|
|
bLoopThrough = false;
|
|
break;
|
|
}
|
|
}
|
|
if (bLoopThrough)
|
|
{
|
|
//select the last line
|
|
CLASSPICKER.selectedIndex = CLASSPICKER.options.length - 1;
|
|
}
|
|
|
|
//we already updated text, so no need to add the character again:
|
|
//event.returnValue=false;
|
|
}
|
|
catch (e)
|
|
{
|
|
window.external.ReportError("Exception: " + e.description + " in OnInputKeyPress()");
|
|
}
|
|
}
|
|
|
|
function OnChangeSelection()
|
|
//display selected value in CLASSINPUT box
|
|
{
|
|
try
|
|
{
|
|
if (CLASSPICKER.selectedIndex == -1)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var selectionValue = CLASSPICKER[CLASSPICKER.selectedIndex].innerText;
|
|
|
|
//check to see if the selected string is a class name (i.e., appears in the map)
|
|
if (!dictLookup.Exists(selectionValue.toUpperCase()))
|
|
{
|
|
return;
|
|
}
|
|
|
|
CLASSINPUT.value = selectionValue;
|
|
}
|
|
catch (e)
|
|
{
|
|
window.external.ReportError("Exception: " + e.description + " in OnChangeSelection");
|
|
}
|
|
}
|
|
|
|
function OnClassDblClick()
|
|
{
|
|
try
|
|
{
|
|
var selNamespace = NSPICKER[NSPICKER.selectedIndex].innerText;
|
|
var selClassName = CLASSPICKER[CLASSPICKER.selectedIndex].innerText;
|
|
|
|
//see if the class already has a "provider" qualifier and warn
|
|
var classObj = services.Get(selClassName);
|
|
var strCurrentProv = GetCurrentProviderName(classObj);
|
|
if (strCurrentProv != "")
|
|
{
|
|
var bReplaceProv = confirm ("Warning: this class already has a provider: " +
|
|
strCurrentProv + ". Replacing the existing provider could destabilize your system. Are you sure you want to do this?");
|
|
if (!bReplaceProv)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
var selectionValue = selNamespace + " : " + selClassName;
|
|
|
|
//check to see if the selected string is a class name (i.e., appears in the map)
|
|
if (!dictLookup.Exists(selClassName.toUpperCase()))
|
|
return;
|
|
|
|
CURRENTSELECTION.value = selectionValue;
|
|
CURRENTSELECTION.test = "";
|
|
NAMESPACE.value = selNamespace;
|
|
WMICLASSNAME.value = selClassName;
|
|
|
|
}
|
|
catch(e)
|
|
{
|
|
window.external.ReportError("Exception: " + e.description + " in OnClassDblClick");
|
|
}
|
|
}
|
|
|
|
|
|
function Next(document, linkto)
|
|
{
|
|
GetWMIClassInfo();
|
|
bGetClassInfo = true;
|
|
window.external.Next(document, linkto);
|
|
}
|
|
|
|
function OnFinish(obj)
|
|
{
|
|
GetWMIClassInfo();
|
|
bGetClassInfo = true;
|
|
obj.style.cursor='wait';
|
|
|
|
window.external.Finish(document, "ok");
|
|
}
|
|
|
|
function InternalGetObject(progID)
|
|
{
|
|
try
|
|
{
|
|
var broker = new ActiveXObject("WMIScriptUtils.WMIObjectBroker");
|
|
if (broker.CanCreateObject(progID))
|
|
{
|
|
return broker.CreateObject(progID);
|
|
}
|
|
else
|
|
{
|
|
var registrar = new ActiveXObject("WMIScriptUtils.WMIObjectBrokerRegistration");
|
|
registrar.Register(progID);
|
|
return broker.CreateObject(progID);
|
|
}
|
|
}
|
|
catch (e)
|
|
{
|
|
window.external.ReportError ("Error in InternalGetObject(): " + e.description);
|
|
}
|
|
}
|
|
|
|
function RestoreNSSelection()
|
|
{
|
|
try
|
|
{
|
|
//select saved namespace in NSPICKER
|
|
for (i = 0; i < NSPICKER.options.length; i++)
|
|
{
|
|
var strCurrent = NSPICKER.options[i].innerText;
|
|
if (strCurrent == NAMESPACE.value)
|
|
{
|
|
NSPICKER.selectedIndex = i;
|
|
|
|
//fill CURRENTSELECTION box:
|
|
CURRENTSELECTION.value = NAMESPACE.value + " : ";
|
|
return;
|
|
}
|
|
}
|
|
//or, just select the first index
|
|
NSPICKER.selectedIndex = 0;
|
|
|
|
}
|
|
catch(e)
|
|
{
|
|
window.external.ReportError ("Error in RestoreNSSelection(): " + e.description);
|
|
}
|
|
}
|
|
|
|
function RestoreClassSelection()
|
|
{
|
|
try
|
|
{
|
|
var bRestored = false;
|
|
|
|
//select saved class in CLASSPICKER
|
|
for (i = 0; i < CLASSPICKER.options.length; i++)
|
|
{
|
|
var strCurrent = CLASSPICKER.options[i].innerText;
|
|
if (strCurrent == WMICLASSNAME.value)
|
|
{
|
|
CLASSPICKER.selectedIndex = i;
|
|
|
|
//fill CURRENTSELECTION box:
|
|
CURRENTSELECTION.value += WMICLASSNAME.value;
|
|
|
|
bRestored = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//or, just select the first index
|
|
if (!bRestored)
|
|
{
|
|
CLASSPICKER.selectedIndex = 0;
|
|
}
|
|
|
|
//update CLASSINPUT
|
|
OnChangeSelection();
|
|
|
|
|
|
}
|
|
catch(e)
|
|
{
|
|
window.external.ReportError ("Error in RestoreClassSelection(): " + e.description);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
</SCRIPT>
|
|
|
|
<script language=JScript>
|
|
|
|
function classSink::OnObjectReady(objObject, objAsyncContext)
|
|
{
|
|
//Put each qualifying object's class name into an array (in the uppercase)
|
|
//and a dictionary, mapping uppercase and case-preservant names
|
|
try
|
|
{
|
|
//Filter out abstract, system and event classes.
|
|
//Luckily, all event classes are abstract :)
|
|
if (CheckBoolQualifier(objObject, "abstract") || IsSystem(objObject))
|
|
{
|
|
return;
|
|
}
|
|
|
|
var NameOut = objObject.Path_.RelPath;
|
|
arClassNames[arClassNames.length] = NameOut.toUpperCase();
|
|
dictLookup.Add (NameOut.toUpperCase(), NameOut);
|
|
}
|
|
catch(e)
|
|
{
|
|
window.external.ReportError("Exception " + e.description + " in OnObjectReady()");
|
|
}
|
|
}
|
|
|
|
function classSink::OnCompleted(objObject, objAsyncContext)
|
|
{
|
|
//sort the uppercase array; pull case-preservant names from the dictionary
|
|
//and display them
|
|
try
|
|
{
|
|
//clear "Loading..." text from CLASSPICKER
|
|
while (CLASSPICKER.options.length > 0)
|
|
{
|
|
CLASSPICKER.options.remove(0);
|
|
}
|
|
|
|
arClassNames.sort();
|
|
|
|
for (i = 0; i < arClassNames.length; i++)
|
|
{
|
|
var oOption = document.createElement("OPTION");
|
|
CLASSPICKER.options.add(oOption);
|
|
|
|
oOption.innerText = dictLookup.Item(arClassNames[i]);
|
|
oOption.Value = i + 1;
|
|
}
|
|
|
|
if (bRestoreClassSelection) //first enumeration after InitDocument()
|
|
{
|
|
RestoreClassSelection();
|
|
bRestoreClassSelection = false;
|
|
}
|
|
else
|
|
{
|
|
//force selection of the first class in the list
|
|
CLASSPICKER.selectedIndex = 0;
|
|
OnChangeSelection();
|
|
}
|
|
|
|
document.body.style.cursor = 'default';
|
|
}
|
|
|
|
catch(e)
|
|
{
|
|
window.external.ReportError ("Exception " + e.description + " in OnCompleted()");
|
|
}
|
|
}
|
|
|
|
|
|
function IsSystem(objObject)
|
|
{
|
|
try
|
|
{
|
|
var NameOut = objObject.Path_.RelPath;
|
|
|
|
return (NameOut.slice(0, 2).toString() == "__");
|
|
}
|
|
catch(e)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function CheckBoolQualifier (obj, qualName)
|
|
{
|
|
try
|
|
{
|
|
var qual = obj.Qualifiers_(qualName);
|
|
|
|
return (qual.Value);
|
|
}
|
|
catch(e)
|
|
{
|
|
//NOTE that if the qualifier is not present, "Not found" will be returned
|
|
//Return false in this case
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function GetCurrentProviderName (obj)
|
|
{
|
|
//checks if the class already has a "provider" qualifier value and returns it.
|
|
//if the class doesn't have a "provider" qualifier or its value is empty, an empty string is
|
|
//returned.
|
|
try
|
|
{
|
|
var qual = obj.Qualifiers_("provider");
|
|
|
|
return (qual.Value.toString());
|
|
}
|
|
catch(e)
|
|
{
|
|
//NOTE that if the qualifier is not present, "Not found" will be returned
|
|
//Return empty string in this case
|
|
return "";
|
|
}
|
|
}
|
|
|
|
function GetWMIClassInfo()
|
|
{
|
|
try
|
|
{
|
|
if (WMICLASSNAME.value == "")
|
|
return;
|
|
|
|
var strStaticDecls = "";
|
|
var strStaticDefs = "";
|
|
var strInstancePopulation = "";
|
|
|
|
var classObj = services.Get(WMICLASSNAME.value);
|
|
|
|
var props = new Enumerator (classObj.Properties_);
|
|
var nKeys = 0;
|
|
|
|
for (; !props.atEnd(); props.moveNext() )
|
|
{
|
|
if (CheckBoolQualifier(props.item(), "key"))
|
|
nKeys++;
|
|
|
|
strStaticDecls += "extern const WCHAR * " + propPrefix + props.item().Name + ";\n\r";
|
|
strStaticDefs += "const static WCHAR * " + propPrefix + props.item().Name +
|
|
" = L\"" + props.item().Name + "\";\n\r";
|
|
|
|
var vt = dictCIM2VT.Item(props.item().CIMType.toString());
|
|
if (props.item().IsArray) {
|
|
vt += " | VT_ARRAY";
|
|
}
|
|
|
|
strInstancePopulation += " var.ChangeType(" + vt + ");\n\r";
|
|
strInstancePopulation += " //var = <value>; " + arCodeComments[0] + "\n\r";
|
|
strInstancePopulation += " hr = pNewInst->Put(CComBSTR(" + propPrefix +
|
|
props.item().Name + "), 0, &var, 0);\n\r";
|
|
strInstancePopulation += " var.Clear();\n\r\n\r";
|
|
}
|
|
|
|
window.external.AddSymbol("PROPERTY_DEFINITIONS", strStaticDefs);
|
|
window.external.AddSymbol("PROPERTY_DECLARATIONS", strStaticDecls);
|
|
window.external.AddSymbol("POPULATE_INSTANCE", strInstancePopulation);
|
|
window.external.AddSymbol("IS_COMPOUND_KEY", (nKeys > 1).toString());
|
|
|
|
//find if the object is a singleton
|
|
var bSingleton = CheckBoolQualifier(classObj, "Singleton");
|
|
window.external.AddSymbol("IS_SINGLETON", bSingleton);
|
|
|
|
GetMethodInfo(classObj);
|
|
|
|
|
|
}
|
|
catch(e)
|
|
{
|
|
window.external.ReportError ("Error in GetWMIClassInfo():" + e);
|
|
}
|
|
}
|
|
|
|
function GetMethodInfo(classObj)
|
|
{
|
|
try
|
|
{
|
|
if (WMICLASSNAME.value == "")
|
|
return;
|
|
|
|
var strMethDeclarations = "";
|
|
var strMethDefinitions = "";
|
|
var strExecMethodBody = "";
|
|
//find if the object has any methods
|
|
var eMeths = new Enumerator (classObj.Methods_);
|
|
var bStatic, bImplemented, bSingleton;
|
|
|
|
strExecMethodBody += " " + arCodeComments[1] + "\n\r";
|
|
strExecMethodBody += " " + arCodeComments[2] + "\n\r";
|
|
|
|
strExecMethodBody += " CComPtr<IWbemPath>pPath;\n\r";
|
|
strExecMethodBody += " hr = m_pPathFactory->CreateInstance(NULL,\n\r" +
|
|
" IID_IWbemPath,\n\r" +
|
|
" (void **) &pPath);\n\r";
|
|
strExecMethodBody += " if (FAILED(hr))\n\r {\n\r return WBEM_E_FAILED;\n\r }\n\r"
|
|
|
|
strExecMethodBody += " hr = pPath->SetText(WBEMPATH_CREATE_ACCEPT_ALL, strObjectPath);\n\r";
|
|
strExecMethodBody += " long nPathLen = CComBSTR(strObjectPath).Length();\n\r";
|
|
strExecMethodBody += " ULONG ulBufLen = nPathLen;\n\r";
|
|
strExecMethodBody += " WCHAR * wClass = new WCHAR[nPathLen];\n\r";
|
|
strExecMethodBody += " if (NULL == wClass)\n\r {\n\r return WBEM_E_OUT_OF_MEMORY;\n\r }\n\r";
|
|
strExecMethodBody += " pPath->GetClassName(&ulBufLen, wClass);\n\r";
|
|
strExecMethodBody += " if ( _wcsicmp(s_pMyClassName, wClass))\n\r {\n\r";
|
|
strExecMethodBody += " delete[] wClass;\n\r";
|
|
strExecMethodBody += " return WBEM_E_INVALID_PARAMETER;\n\r\ }\n\r";
|
|
strExecMethodBody += " delete[] wClass;\n\r";
|
|
|
|
for (var nMeths = 0, nImplMeths = 0; !eMeths.atEnd(); eMeths.moveNext(), nMeths++ )
|
|
{
|
|
strMethDeclarations += "\n\r//" + eMeths.item().Name + "\n\r";
|
|
strMethDefinitions += "\n\r//" + eMeths.item().Name + "\n\r";
|
|
|
|
strMethDeclarations += "extern const WCHAR * " + methPrefix + eMeths.item().Name + ";\n\r";
|
|
strMethDefinitions += "const static WCHAR * " + methPrefix + eMeths.item().Name +
|
|
" = L\"" + eMeths.item().Name + "\";\n\r";
|
|
|
|
bImplemented = CheckBoolQualifier(eMeths.item(), "implemented");
|
|
if (bImplemented)
|
|
nImplMeths++;
|
|
else
|
|
continue;
|
|
|
|
bStatic = CheckBoolQualifier(eMeths.item(), "static");
|
|
bSingleton = CheckBoolQualifier(classObj, "singleton");
|
|
|
|
strExecMethodBody += " if (!_wcsicmp (strMethodName, " + methPrefix +
|
|
eMeths.item().Name + "))\n\r {\n\r";
|
|
|
|
if (!bStatic && !bSingleton)
|
|
{
|
|
strExecMethodBody += " " + arCodeComments[4] + "\n\r";
|
|
|
|
strExecMethodBody += " CComPtr<IWbemPathKeyList> pIKeyList;\n\r";
|
|
strExecMethodBody += " hr = pPath->GetKeyList(&pIKeyList);\n\r";
|
|
strExecMethodBody += " if (FAILED(hr))\n\r {\n\r";
|
|
strExecMethodBody += " return WBEM_E_INVALID_PARAMETER;\n\r }\n\r";
|
|
|
|
strExecMethodBody += " ULONG ulNumKeys;\n\r";
|
|
strExecMethodBody += " hr = pIKeyList->GetCount(&ulNumKeys);\n\r";
|
|
|
|
strExecMethodBody += " " + arCodeComments[5] + "\n\r";
|
|
strExecMethodBody += " unsigned long uKeyNameBufferSize = nPathLen;\n\r";
|
|
strExecMethodBody += " WCHAR * wKeyName = new WCHAR[uKeyNameBufferSize];\n\r";
|
|
strExecMethodBody += " if (NULL == wKeyName)\n\r {\n\r return WBEM_E_OUT_OF_MEMORY;\n\r }\n\r";
|
|
strExecMethodBody += " CComVariant vValue;\n\r";
|
|
strExecMethodBody += " ULONG ulApparentCimType;\n\r";
|
|
strExecMethodBody += " for (ULONG i = 0; i < ulNumKeys; i++)\n\r {\n\r";
|
|
strExecMethodBody += " hr = pIKeyList->GetKey2(i, 0L, &uKeyNameBufferSize,\n\r";
|
|
strExecMethodBody += " wKeyName, &vValue, &ulApparentCimType);\n\r";
|
|
strExecMethodBody += " " + arCodeComments[6] + "\n\r }\n\r";
|
|
strExecMethodBody += " delete[] wKeyName;\n\r";
|
|
strExecMethodBody += " " + arCodeComments[7]+ "\n\r\n\r";
|
|
}
|
|
|
|
|
|
strExecMethodBody += " CComVariant var;\n\r";
|
|
|
|
//enumerate properties of the input parameters object
|
|
|
|
strMethDeclarations += arCodeComments[17] + "\n\r";
|
|
strMethDefinitions += arCodeComments[17] + "\n\r";
|
|
|
|
var oInParams = eMeths.item().InParameters;
|
|
if (oInParams)
|
|
{
|
|
strExecMethodBody += " " + arCodeComments[8] + "\n\r";
|
|
|
|
var inParms = new Enumerator (oInParams.Properties_);
|
|
for (; !inParms.atEnd(); inParms.moveNext() )
|
|
{
|
|
strMethDeclarations += "extern const WCHAR * " + inparmPrefix + eMeths.item().Name +
|
|
inParms.item().Name + ";\n\r";
|
|
|
|
strMethDefinitions += "const static WCHAR * " + inparmPrefix + eMeths.item().Name +
|
|
inParms.item().Name + " = L\"" + inParms.item().Name + "\";\n\r";
|
|
|
|
strExecMethodBody += " hr = pInParams->Get(" + inparmPrefix +
|
|
eMeths.item().Name + inParms.item().Name +
|
|
", 0, &var, NULL, NULL);\n\r";
|
|
strExecMethodBody += " " + arCodeComments[9] + "\n\r";
|
|
strExecMethodBody += " var.Clear();\n\r\n\r";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
strExecMethodBody += " " + arCodeComments[10] + "\n\r";
|
|
|
|
}
|
|
|
|
strExecMethodBody += " " + arCodeComments[11] + "\n\r\n\r";
|
|
|
|
//deal with the output parameters object
|
|
strMethDeclarations += arCodeComments[18] + "\n\r";
|
|
strMethDefinitions += arCodeComments[18] + "\n\r";
|
|
|
|
var oOutParams = eMeths.item().OutParameters;
|
|
if (oOutParams)
|
|
{
|
|
|
|
strExecMethodBody += " " + arCodeComments[12] + "\n\r";
|
|
strExecMethodBody += " CComPtr<IWbemClassObject> pOutClass;\n\r";
|
|
strExecMethodBody += " hr = m_pClass->GetMethod(" + methPrefix +
|
|
eMeths.item().Name +
|
|
", 0, NULL, &pOutClass);\n\r";
|
|
|
|
strExecMethodBody += " CComPtr<IWbemClassObject> pOutParams;\n\r";
|
|
strExecMethodBody += " pOutClass->SpawnInstance(0, &pOutParams);\n\r\n\r";
|
|
|
|
strExecMethodBody += " " + arCodeComments[13] + "\n\r";
|
|
|
|
var outParms = new Enumerator (oOutParams.Properties_);
|
|
for (; !outParms.atEnd(); outParms.moveNext() )
|
|
{
|
|
strMethDeclarations += "extern const WCHAR * " + outparmPrefix + eMeths.item().Name +
|
|
outParms.item().Name + ";\n\r";
|
|
|
|
strMethDefinitions += "const static WCHAR * " + outparmPrefix + eMeths.item().Name +
|
|
outParms.item().Name + " = L\"" + outParms.item().Name + "\";\n\r";
|
|
|
|
var vt = dictCIM2VT.Item(outParms.item().CIMType.toString());
|
|
if (outParms.item().IsArray) {
|
|
vt += " | VT_ARRAY";
|
|
}
|
|
|
|
strExecMethodBody += " var.ChangeType(" + vt + ");\n\r";
|
|
strExecMethodBody += " " + arCodeComments[14] + "\n\r";
|
|
strExecMethodBody += " hr = pOutParams->Put(CComBSTR(" + outparmPrefix +
|
|
eMeths.item().Name + outParms.item().Name +
|
|
"), 0, &var, 0);\n\r";
|
|
|
|
strExecMethodBody += " var.Clear();\n\r\n\r";
|
|
}
|
|
strExecMethodBody += " " + arCodeComments[15] + "\n\r";
|
|
strExecMethodBody += " hr = pResponseHandler->Indicate(1, &pOutParams);\n\r\n\r";
|
|
}
|
|
else
|
|
{
|
|
strExecMethodBody += " " + arCodeComments[16] + "\n\r\n\r";
|
|
}
|
|
strExecMethodBody += " pResponseHandler->SetStatus(0, WBEM_S_NO_ERROR, NULL, NULL);\n\r";
|
|
strExecMethodBody += " return WBEM_S_NO_ERROR;\n\r";
|
|
strExecMethodBody += " }\n\r";
|
|
}
|
|
|
|
|
|
strExecMethodBody += " return WBEM_E_NOT_SUPPORTED;\n\r";
|
|
|
|
//window.external.ReportError (strExecMethodBody);
|
|
|
|
window.external.AddSymbol("HAS_METHODS", (nMeths > 0).toString());
|
|
|
|
HAS_IMPL_METHODS.checked = (nImplMeths > 0);
|
|
|
|
window.external.AddSymbol("PROVIDE_METHODS", HAS_IMPL_METHODS.checked);
|
|
|
|
window.external.AddSymbol("EXEC_METHOD_BODY", strExecMethodBody);
|
|
|
|
window.external.AddSymbol("METHOD_DEFINITIONS", strMethDefinitions);
|
|
window.external.AddSymbol("METHOD_DECLARATIONS", strMethDeclarations);
|
|
}
|
|
|
|
catch(e)
|
|
{
|
|
window.external.ReportError ("Error in GetMethodInfo():" + e);
|
|
}
|
|
}
|
|
|
|
</script>
|
|
</TD></TR></TABLE>
|
|
|
|
<SCRIPT SRC="..\..\..\..\..\1033\common.js">
|
|
</SCRIPT>
|
|
|
|
</body></html>
|