import "msxml.idl";
import "wbemdisp.idl";

[
	uuid(979D18F7-D1D2-4ee2-803D-A4C7A98DF75B),
	lcid(0x00),
	version(1.0),
	helpstring("Microsoft WMI XML Transformer V1.0")
]
library WmiXMLTransformer
{
    importlib("stdole32.tlb");

    interface IWmiXMLTransformer;

	typedef 
	[
		v1_enum, 
		uuid(28D1EEA5-D41E-46c2-B42D-6CE0B9B4D7A7),
		helpstring("Specifies Encoding required")
	] 
	enum WmiXMLEncoding
    {
		// TODO - integrate this enumeration with the core team's when they are ready
		wmiXML_CIM_DTD_2_0 = 0x0, // The DMTF DTD
		wmiXML_WMI_DTD_2_0 = 0x1, // Same as the WMI Nova DTD
		wmiXML_WMI_DTD_WHISTLER = 0x2
   	} WmiXMLEncoding;

	typedef 
	[
		v1_enum, 
		uuid(598BCA7A-E40E-4265-8517-C9A86E2FC07E),
		helpstring("Specifies the compilation operation to perform")
	] 
	enum WmiXMLCompilationTypeEnum
    {
		WmiXMLCompilationWellFormCheck = 0x0,
		WmiXMLCompilationValidityCheck = 0x1,
		WmiXMLCompilationFullCompileAndLoad = 0x2
    } WmiXMLCompilationTypeEnum;

	[
		uuid(A2BB0F35-458E-4075-8A4B-F92664943917),
		helpstring("WMI XML Transformer Control")
	]
    	coclass WmiXMLTransformer
    	{
        		[default] interface IWmiXMLTransformer;
    	};
};

/************************************************* 
 * A collection of IXMLDOMDocuments
 * This is used for output from enumerations and queries
 * The primary purpose of this is to prevent reading of all the data from a socket
 * in the XML/HTTP case. Instead every call to Next() on the enumerator results in further data
 * being read from the socket.
 **************************************************/
[
	local, 
	object, 
	uuid(3E46A227-5207-4603-8440-9FCC5AF16407), 
	oleautomation, 
	dual,
	hidden,
	nonextensible,
	helpstring("A collection of IXMLDOMDocument objects")
]
interface ISWbemXMLDocumentSet : IDispatch
{
	// Standard property required on all collections
	[id(DISPID_NEWENUM), propget, restricted] HRESULT _NewEnum ([out, retval] IUnknown **pUnk);

	[
		id(DISPID_VALUE),
		helpstring("Not Implemented")
	]
	HRESULT Item (
		[in] BSTR strObjectPath, 
		[in, defaultvalue(0)] long iFlags,
		[out, retval] IXMLDOMDocument **ppXMLDocument
		);

	[
		id(1), 
		propget,
		helpstring("Not Implemented")
	] 
	HRESULT Count ([out, retval] long *iCount);

	[
		id(2), 
		helpstring("The next item in this collection. This is primarily for C++ programs that dont want to use the enumerator")
	] 
	HRESULT NextDocument ([out, retval, unique] IXMLDOMDocument **ppDoc);

	[
		id(3), 
		helpstring("Skips past the next document in the enumerator")
	] 
	HRESULT SkipNextDocument ();

};

/************************************************* 
 * The primary interface for the transformer.
 * This scriptable interface allows for both read (get, enums, queries)
 * and write (compile) operations. It also exposes a few
 * properties to control the amount of information in the output,
 * for authentication credentials etc.
 **************************************************/
[
	object, 
	local, 
	uuid(FB624102-3145-4daf-B0EA-FF5A31178600), 
	dual,
	hidden,
	nonextensible,
	oleautomation,
	helpstring("WMI XML Transformer Dual Interface")
]
interface IWmiXMLTransformer  : IDispatch
{
	[
		propget, 
		id(1),
		helpstring("Specifies the type of XML Encoding to use")
	] 
	HRESULT XMLEncodingType([retval, out] WmiXMLEncoding *piEncoding);
	[
		propput, 
		id(1)
	] 
	HRESULT XMLEncodingType([in] WmiXMLEncoding iEncoding);

	[
		propget, 
		id(2),
		helpstring("Specifies the level of Qualifier information in the output XML")
	] 
	HRESULT QualifierFilter([retval, out] VARIANT_BOOL *bQualifierFilter);
	[
		propput, 
		id(2)
	] 
	HRESULT QualifierFilter([in] VARIANT_BOOL bQualifierFilter);

	[
		propget, 
		id(3),
		helpstring("Specifies whether to decorate elements with Class origin information")
	] 
	HRESULT ClassOriginFilter([retval, out] VARIANT_BOOL *bClassOriginFilter);
	[
		propput, 
		id(3)
	] 
	HRESULT ClassOriginFilter([in] VARIANT_BOOL bClassOriginFilter);

	[
		propget, 
		id(4),
		helpstring("Specifies the user name to be used for the operation")
	] 
	HRESULT User([retval, out] BSTR * strUser);
	[
		propput, 
		id(4)
	] 
	HRESULT User ([in] BSTR strUser);

	[
		propget, 
		id(5),
		helpstring("Specifies the password name to be used for the operation")
	] 
	HRESULT Password([retval, out] BSTR * strPassword);
	[
		propput, 
		id(5)
	] 
	HRESULT Password ([in] BSTR strPassword);

	[
		propget, 
		id(6),
		helpstring("Specifies the Authority (domain/machine)name to be used for the operation")
	] 
	HRESULT Authority([retval, out] BSTR * strAuthority);
	[
		propput, 
		id(6)
	] 
	HRESULT Authority ([in] BSTR strAuthority);

	[
		propget, 
		id(7),
		helpstring("Specifies the Impersonation level used for the operation. Standard RPC constants")
	] 
	HRESULT ImpersonationLevel([retval, out] DWORD * pdwImpersonationLevel);
	[
		propput, 
		id(7)
	] 
	HRESULT ImpersonationLevel ([in] DWORD dwImpersonationLevel);

	[
		propget, 
		id(8),
		helpstring("Specifies the AuthenticationLevel  used for the operation. Standard RPC constants")
	] 
	HRESULT AuthenticationLevel([retval, out] DWORD * pdwAuthenticationLevel);
	[
		propput, 
		id(8)
	] 
	HRESULT AuthenticationLevel ([in] DWORD dwAuthenticationLevel);

	[
		propget, 
		id(9),
		helpstring("Specifies the locale name to be used for the operation")
	] 
	HRESULT Locale([retval, out] BSTR * strLocale);
	[
		propput, 
		id(9)
	] 
	HRESULT Locale ([in] BSTR strLocale);


	[
		propget, 
		id(10),
		helpstring("Specifies whether only local elements (properties and methods) are to be included in output")
	] 
	HRESULT LocalOnly([retval, out] VARIANT_BOOL *bLocalOnly);
	[
		propput, 
		id(10)
	] 
	HRESULT LocalOnly([in] VARIANT_BOOL bLocalOnly);


	[
		helpstring("Maps a single class or instance to XML"),
		id(11)
	]
	HRESULT GetObject(
	// Identifies an object name to get
		[in]	BSTR	strObjectPath,
	// The IWbemContext object
		[in, defaultvalue(0)]	/*ISWbemNamedValueSet*/IDispatch *pCtx,
	// On successful return contains XML document stream
        [out,retval]   IXMLDOMDocument **ppXMLDocument
    	);

	[
		helpstring("Maps a query result set to XML"),
		id(12)
	]
	HRESULT ExecQuery(
	// Identifies a namespace to connect to
		[in]	BSTR	strNamespacePath,
	// CIM query to be evaluated
		[in]	BSTR	strQuery,
	// The language name of the query to be evaluated
		[in, defaultvalue("WQL")]	BSTR	strQueryLanguage,
	// The IWbemContext object
		[in, defaultvalue(0)]	/*ISWbemNamedValueSet*/IDispatch *pCtx,
	// On successful return contains a collection of documents
        [out,retval]   ISWbemXMLDocumentSet **ppXMLDocumentSet
   	 );

	[
		helpstring("Enumerates sub classes of a specified class"),
		id(13)
	]
	HRESULT EnumClasses(
		// Identifies the class path of the super class
		[in]	BSTR	strSuperClassPath,
		// Whether to do a deep enumeration
		[in]	VARIANT_BOOL bDeep,
		// The IWbemContext object
		[in, defaultvalue(0)]	/*ISWbemNamedValueSet*/IDispatch *pCtx,
		// On successful return contains a collection of documents
        [out,retval]   ISWbemXMLDocumentSet **ppXMLDocumentSet
    	);

	[
		helpstring("Enumerates instances of a specific class"),
		id(14)
	]
	HRESULT EnumInstances(
		// Identifies the class path of the class whose instances are to be enumerated
		[in]	BSTR	strClassPath,
		// Whether to do a deep enumeration
		[in]	VARIANT_BOOL bDeep,
		// The IWbemContext object
		[in, defaultvalue(0)]	/*ISWbemNamedValueSet*/IDispatch *pCtx,
		// On successful return contains a collection of documents
        [out,retval]   ISWbemXMLDocumentSet **ppXMLDocumentSet
    	);

	[
		helpstring("Enumerates sub class names of a specific class"),
		id(15)
	]
	HRESULT EnumClassNames(
		// Identifies the class path of the super class
		[in]	BSTR	strSuperClassPath,
		// Whether to do a deep enumeration
		[in]	VARIANT_BOOL bDeep,
		// The IWbemContext object
		[in, defaultvalue(0)]	/*ISWbemNamedValueSet*/IDispatch *pCtx,
		// On successful return contains a collection of documents
        [out,retval]   ISWbemXMLDocumentSet **ppXMLDocumentSet
    	);

	[
		helpstring("Enumerate instance names of a specific class"),
		id(16)
	]
	HRESULT EnumInstanceNames(
		// Identifies the class path of the class whose instances are to be enumerated
		[in]	BSTR	strClassPath,
		// The IWbemContext object
		[in, defaultvalue(0)]	/*ISWbemNamedValueSet*/IDispatch *pCtx,
		// On successful return contains a collection of documents
        [out,retval]   ISWbemXMLDocumentSet **ppXMLDocumentSet
    	);

	[
		helpstring("Compile a specified file"),
		id(17)
	]
	HRESULT Compile (
	// If this is a VT_BSTR, then it the string is used as the input XML data
	// If this is a VT_UNKNOWN, then it is queried for Istream and the result is used
	// as the input stream
	[in]	VARIANT 	*pvInputSource,
	// Identifies a namespace to connect to
	[in]	BSTR	strNamespacePath,
	// Class Flags - A combination of the flags used for PutClass WMI call
	[in]	LONG	lClassFlags,
	// Instance Flags - A combination of the flags used for PutInstance WMI call
	[in]	LONG	lInstanceFlags,
	// What operation to do
	[in]	WmiXMLCompilationTypeEnum iOperation,
	// The IWbemContext object
	[in]	/*ISWbemNamedValueSet*/IDispatch *pCtx,
	// Whether the compilation was successful
	[out, retval]	VARIANT_BOOL *pStatus
	);

	[
		id(18),
		propget,
		helpstring ("The collection of privileges for this object")
	]
	HRESULT Privileges ([out, retval] ISWbemPrivilegeSet **objWbemPrivilegeSet);

	[
		id(19),
		propget,
		helpstring ("The last compilation error, if any")
	]
	HRESULT CompilationErrors ([out, retval] BSTR *pstrErrors);

};