// msclus.idl : IDL source for msclus.dll
// ~~~~~~~~~~
//
// History
// ?? Mar 1997 - Original creation.
// 12 May 1997 - Changed the collections to use Add/Remove/Create/Delete
// 14 May 1997 - Changed interface names per code review
//
//

// This file will be processed by the MIDL tool to
// produce the type library (msclus.tlb) and marshalling code.

// UUIDS for MSCLUS
// e9d74360-e986-11d0-a1cf-00a024ab73e5 -- interface IClusterApplication;
// e9d74361-e986-11d0-a1cf-00a024ab73e5 -- interface Clusters
// e9d74362-e986-11d0-a1cf-00a024ab73e5 -- interface ICluster
// e9d74363-e986-11d0-a1cf-00a024ab73e5 -- interface ClusNode
// e9d74364-e986-11d0-a1cf-00a024ab73e5 -- interface ClusNodes
// e9d74365-e986-11d0-a1cf-00a024ab73e5 -- interface ClusResGroup
// e9d74366-e986-11d0-a1cf-00a024ab73e5 -- interface ClusResGroups
// e9d74367-e986-11d0-a1cf-00a024ab73e5 -- interface ClusResource
// e9d74368-e986-11d0-a1cf-00a024ab73e5 -- interface ClusResources
// e9d74369-e986-11d0-a1cf-00a024ab73e5 -- interface ClusResType
// e9d7436a-e986-11d0-a1cf-00a024ab73e5 -- interface ClusResTypes
// e9d7436b-e986-11d0-a1cf-00a024ab73e5 -- interface ClusProperty
// e9d7436c-e986-11d0-a1cf-00a024ab73e5 -- interface ClusProperties
// e9d7436d-e986-11d0-a1cf-00a024ab73e5 -- interface IClusterDomain
// e9d7436e-e986-11d0-a1cf-00a024ab73e5 -- interface Domains
// e9d7436f-e986-11d0-a1cf-00a024ab73e5

// e9d74370-e986-11d0-a1cf-00a024ab73e5 -- library MSClusterLib
// e9d74371-e986-11d0-a1cf-00a024ab73e5 -- coclass Application
// e9d74372-e986-11d0-a1cf-00a024ab73e5 -- coclass Cluster
// e9d74373-e986-11d0-a1cf-00a024ab73e5 -- coclass ClusterDomain
// e9d74374-e986-11d0-a1cf-00a024ab73e5
// e9d74375-e986-11d0-a1cf-00a024ab73e5
// e9d74376-e986-11d0-a1cf-00a024ab73e5
// e9d74377-e986-11d0-a1cf-00a024ab73e5
// e9d74378-e986-11d0-a1cf-00a024ab73e5
// e9d74379-e986-11d0-a1cf-00a024ab73e5
// e9d7437a-e986-11d0-a1cf-00a024ab73e5
// e9d7437b-e986-11d0-a1cf-00a024ab73e5
// e9d7437c-e986-11d0-a1cf-00a024ab73e5
// e9d7437d-e986-11d0-a1cf-00a024ab73e5
// e9d7437e-e986-11d0-a1cf-00a024ab73e5
// e9d7437f-e986-11d0-a1cf-00a024ab73e5

import "oaidl.idl";
cpp_quote("#ifndef _CLUSTER_API_TYPES_")
#include "clusapi.h"
cpp_quote("#define _CLUSTER_API_TYPES_")
cpp_quote("#endif // _CLUSTER_API_TYPES_")

///////////////////////////////////////
// definitions
interface IClusterApplication;
interface IClusterDomain;
interface ICluster;

interface Domains;
interface Clusters;

//old interface ClusterNode;
interface ClusNode;
//old interface ClusterNodes;
interface ClusNodes;

//old interface ResourceGroup;
interface ClusResGroup;
//old interface ResourceGroups;
interface ClusResGroups;

//old interface Resource;
interface ClusResource;
//old interface Resources;
interface ClusResources;

//old interface ResourceType;
interface ClusResType;
//old interface ResourceTypes;
interface ClusResTypes;

//old interface ClusterProperty;
interface ClusProperty;
//old interface ClusterProperties;
interface ClusProperties;

//
///////////////////////////////////////


/////////////////////////////////////////////////
// Application
[
	object,
	uuid(e9d74360-e986-11d0-a1cf-00a024ab73e5),
	dual,
	helpstring("Application Interface"),
	hidden,
	pointer_default(unique)
]
interface IClusterApplication : IDispatch
{
	[propget]
	HRESULT Domains( [out, retval] Domains ** ppDomains );

	HRESULT OpenCluster( [in] BSTR bstrClusterName, [out, retval] ICluster ** pCluster );
};

/////////////////////////////////////////////////
// Domains
[
	object,
	uuid(e9d7436e-e986-11d0-a1cf-00a024ab73e5),
	dual,
	helpstring("Domains collection"),
	pointer_default(unique)
]
interface Domains : IDispatch
{
	[propget]
	HRESULT Count( [out, retval] long * pnCount );

	[propget, id(DISPID_VALUE)]
	HRESULT Item( [in] VARIANT varIndex, [out, retval] IClusterDomain ** ppClusterDomain );
	HRESULT AddItem( [in] IClusterDomain * pClusterDomain );
};


/////////////////////////////////////////////////
// ClusterDomain
[
	object,
	uuid(e9d7436d-e986-11d0-a1cf-00a024ab73e5),
	dual,
	helpstring("ClusterDomain Interface"),
	hidden,
	pointer_default(unique)
]
interface IClusterDomain : IDispatch
{    
	/////////////////////////////////
	// ClusterDomain

	[propget]
	HRESULT DomainName( [out, retval] BSTR * pbstrDomainName );

	[propget]
	HRESULT Clusters( [out, retval] Clusters ** ppClusters );

};

/////////////////////////////////////////////////
// Clusters
[
	object,
	uuid(e9d74361-e986-11d0-a1cf-00a024ab73e5),
	dual,
	helpstring("Clusters collection"),
	pointer_default(unique)
]
interface Clusters : IDispatch
{
	[propget]
	HRESULT DomainName( [out, retval] BSTR * pbstrDomainName );

	[propget]
	HRESULT Count( [out, retval] long * pnCount );

	[propget, id(DISPID_VALUE), helpstring("Index by integer")]
	HRESULT Item( [in] LONG nIndex, [out, retval] BSTR * bstrClusterName );
};


/////////////////////////////////////////////////
// Cluster
[
	object,
	uuid(e9d74362-e986-11d0-a1cf-00a024ab73e5),
	dual,
	helpstring("Cluster Interface"),
	hidden,
	pointer_default(unique)
]
interface ICluster : IDispatch
{    
	/////////////////////////////////
	// Cluster 
    [propget, hidden]
    HRESULT Handle( [out, retval] LONG * phandle );

	HRESULT Open( [in] BSTR bstrClusterName );

	HRESULT Close();

	[propput]
	HRESULT Name( [in] BSTR bstrClusterName );  

	[propget]
	HRESULT Name( [out, retval] BSTR * pbstrClusterName );

	HRESULT GetVersion( 
		[out] BSTR * pbstrClusterName,
		[out] SHORT * MajorVersion,
		[out] SHORT * MinorVersion,
		[out] SHORT * BuildNumber,
		[out] BSTR * pbstrVendorId,
		[out] BSTR * pbstrCSDVersion );


	/////////////////////////////////
	// Quorum Resource
	[propput]
	HRESULT QuorumResource( [in] ClusResource * pClusterResource );

	[propget]
	HRESULT QuorumResource( [out, retval] ClusResource ** pClusterResource );


	/////////////////////////////////
	// Cluster Nodes

	[propget]
	HRESULT Nodes( [out, retval] ClusNodes ** ppClusterNodes );


	/////////////////////////////////
	// Cluster Resource Groups


	[propget]
	HRESULT ResourceGroups( [out, retval] ClusResGroups ** ppClusterResourceGroups );


	/////////////////////////////////
	// Cluster Resources

	[propget]
	HRESULT Resources( [out, retval] ClusResources ** ppClusterResources );


	/////////////////////////////////
	// Cluster Resource Types

	[propget]
	HRESULT ResourceTypes( [out, retval] ClusResTypes ** ppResourceTypes );

};



/////////////////////////////////////////////////
// ClusNode
[
	object,
	uuid(e9d74363-e986-11d0-a1cf-00a024ab73e5),
	dual,
	helpstring("Cluster Node Interface"),
	pointer_default(unique)
]
interface ClusNode : IDispatch
{
    [propget, hidden]
    HRESULT Handle( [out, retval] LONG * phandle );

	[propget]
	HRESULT Name( [out, retval] BSTR * pbstrNodeName );

	[propget]
	HRESULT NodeID( [out, retval] BSTR * pbstrNodeID );

	[propget]
	HRESULT State( [out,retval] LONG * dwState );

	HRESULT Pause();

	HRESULT Resume();

	HRESULT Evict();

	[propget]
	HRESULT ResourceGroups( [out, retval] ClusResGroups ** ppResourceGroups );

	[propget]
	HRESULT CommonProperties( [out, retval] ClusProperties ** ppProperties );

	[propget]
	HRESULT PrivateProperties( [out, retval] ClusProperties ** ppProperties );

	[propget]
	HRESULT CommonROProperties( [out, retval] ClusProperties ** ppProperties );

	[propget]
	HRESULT PrivateROProperties( [out, retval] ClusProperties ** ppProperties );
};



/////////////////////////////////////////////////
// ClusNodes
[
	object,
	uuid(e9d74364-e986-11d0-a1cf-00a024ab73e5),
	dual,
	helpstring("Cluster Nodes Interface"),
	pointer_default(unique)
]
interface ClusNodes : IDispatch
{
	[propget]
	HRESULT Count( [out, retval] long * pnCount );

	[propget, id(DISPID_VALUE), helpstring("Index by name or integer")]
	HRESULT Item( [in] VARIANT varIndex, [out, retval] ClusNode ** ppClusterNode );

	[propget, restricted, id(DISPID_NEWENUM)]
	HRESULT _NewEnum( [out, retval] IUnknown ** ppEnum );	
};



/////////////////////////////////////////////////
// ClusResGroup
[
	object,
	uuid(e9d74365-e986-11d0-a1cf-00a024ab73e5),
	dual,
	helpstring("Cluster Resource Group Interface"),
	pointer_default(unique)
]
interface ClusResGroup : IDispatch
{
    [propget, hidden]
    HRESULT Handle( [out, retval] LONG * phandle );

	[propput]
	HRESULT Name( [in] BSTR bstrGroupName );

	[propget]
	HRESULT Name( [out, retval] BSTR * pbstrGroupName );

	[propget]
	HRESULT State( [out,retval] LONG * dwState );

	[propget]
	HRESULT OwnerNode( [out,retval] ClusNode ** ppOwnerNode );

	[propget]
	HRESULT Resources( [out, retval] ClusResources ** ppClusterResources );

	[propget]
	HRESULT PreferredOwnerNodes( [out, retval] ClusNodes ** ppOwnerNodes );

	HRESULT Delete();

	HRESULT Online( [in, optional] ClusNode * pDestinationNode );

	HRESULT Move( [in, optional] ClusNode * pDestinationNode );

	HRESULT Offline();

	[propget]
	HRESULT CommonProperties( [out, retval] ClusProperties ** ppProperties );

	[propget]
	HRESULT PrivateProperties( [out, retval] ClusProperties ** ppProperties );

	[propget]
	HRESULT CommonROProperties( [out, retval] ClusProperties ** ppProperties );

	[propget]
	HRESULT PrivateROProperties( [out, retval] ClusProperties ** ppProperties );
};


/////////////////////////////////////////////////
// ClusResGroups
[
	object,
	uuid(e9d74366-e986-11d0-a1cf-00a024ab73e5),
	dual,
	helpstring("Cluster Resource Groups Interface"),
	pointer_default(unique)
]
interface ClusResGroups : IDispatch
{
	[propget]
	HRESULT Count( [out, retval] long * pnCount );

	[propget, id(DISPID_VALUE)]
	HRESULT Item( [in] VARIANT varIndex, [out, retval] ClusResGroup ** ppResourceGroup );

	[propget, restricted, id(DISPID_NEWENUM)]
	HRESULT _NewEnum( [out, retval] IUnknown ** ppEnum );	

	[helpstring("Create a new resource group")]
	HRESULT CreateItem( [in] BSTR bstrResourceGroupName, [out, retval] ClusResGroup ** ppResourceGroup );

	[helpstring("Delete a resource group")]
	HRESULT DeleteItem( [in] VARIANT varIndex );

	[helpstring("Add a resource group to the list.")]
	HRESULT AddItem( [in] ClusResGroup* pResourceGroup );

	[helpstring("Remove a resource group from the list by name or index.")]
	HRESULT RemoveItem( [in] VARIANT varIndex );


	[helpstring("Refresh data in collection")]
	HRESULT Refresh();
};


/////////////////////////////////////////////////
// ClusResource
[
	object,
	uuid(e9d74367-e986-11d0-a1cf-00a024ab73e5),
	dual,
	helpstring("Cluster Resource Interface"),
	pointer_default(unique)
]
interface ClusResource : IDispatch
{
    [propget, hidden]
    HRESULT Handle( [out, retval] LONG * phandle );

	[propput]
	HRESULT Name( [in] BSTR bstrResourceName );
  
	[propget]
	HRESULT Name( [out, retval] BSTR * pbstrResourceName );

	[propget]
	HRESULT State( [out,retval] LONG * dwState );

	HRESULT BecomeQuorumResource( [in] BSTR bstrDevicePath, [in] long lMaxLogSize );

	HRESULT Delete();

	HRESULT Fail();
	HRESULT Online();
	HRESULT Offline();

	HRESULT ChangeResourceGroup( [in] ClusResGroup * pResourceGroup );

	HRESULT AddResourceNode( [in] ClusNode * pNode );
	HRESULT RemoveResourceNode( [in] ClusNode * pNode );

	HRESULT AddResourceDependency( [in] ClusResource * pResource );
	HRESULT RemoveResourceDependency( [in] ClusResource * pResource );
	HRESULT CanResourceBeDependent( [in] ClusResource * pResource, [out, retval] BOOL * bDependent );

    [propget]
    HRESULT AllowedNodes( [out, retval] ClusNodes ** ppNodes );

    [propget]
    HRESULT Dependencies( [out, retval] ClusResources ** ppResources );

	[propget]
	HRESULT CommonProperties( [out, retval] ClusProperties ** ppProperties );

	[propget]
	HRESULT PrivateProperties( [out, retval] ClusProperties ** ppProperties );

	[propget]
	HRESULT CommonROProperties( [out, retval] ClusProperties ** ppProperties );

	[propget]
	HRESULT PrivateROProperties( [out, retval] ClusProperties ** ppProperties );
};



/////////////////////////////////////////////////
// ClusResources
[
	object,
	uuid(e9d74368-e986-11d0-a1cf-00a024ab73e5),
	dual,
	helpstring("Cluster Resources Interface"),
	pointer_default(unique)
]
interface ClusResources : IDispatch
{
	[propget]
	HRESULT Count( [out, retval] long * pnCount );

	[propget, id(DISPID_VALUE)]
	HRESULT Item( [in] VARIANT varIndex, [out, retval] ClusResource ** ppClusterResource );

	[propget, restricted, id(DISPID_NEWENUM)]
	HRESULT _NewEnum( [out, retval] IUnknown ** ppEnum );	

	[helpstring("Create a new resource.")]
	HRESULT CreateItem( 
		[in] BSTR bstrResourceName,
		[in] BSTR bstrResourceType,
		[in] long dwFlags,
		[out, retval] ClusResource ** ppClusterResource );

	[helpstring("Delete a resource by name or index.")]
	HRESULT DeleteItem( [in] VARIANT varIndex );

	[helpstring("Add a resource to the list.")]
	HRESULT AddItem( [in] ClusResource* pResource );

	[helpstring("Remove a resource from the list by name or index.")]
	HRESULT RemoveItem( [in] VARIANT varIndex );

	[helpstring("Refresh data in collection")]
	HRESULT Refresh();
};



/////////////////////////////////////////////////
// ClusResType
[
	object,
	uuid(e9d74369-e986-11d0-a1cf-00a024ab73e5),
	dual,
	helpstring("Cluster Resource Type"),
	pointer_default(unique)
]
interface ClusResType : IDispatch
{
	[propget]
	HRESULT Name( [out, retval] BSTR * strTypeName );

	HRESULT Delete();

	[propget]
	HRESULT CommonProperties( [out, retval] ClusProperties ** ppProperties );

	[propget]
	HRESULT PrivateProperties( [out, retval] ClusProperties ** ppProperties );

	[propget]
	HRESULT CommonROProperties( [out, retval] ClusProperties ** ppProperties );

	[propget]
	HRESULT PrivateROProperties( [out, retval] ClusProperties ** ppProperties );
};


/////////////////////////////////////////////////
// ClusResTypes
[
	object,
	uuid(e9d7436a-e986-11d0-a1cf-00a024ab73e5),
	dual,
	helpstring("Cluster Resource Types"),
	pointer_default(unique)
]
interface ClusResTypes : IDispatch
{
	[propget]
	HRESULT Count( [out, retval] long * pnCount );

	[propget, id(DISPID_VALUE)]
	HRESULT Item( [in] VARIANT varIndex, [out, retval] ClusResType ** ppResourceType );

	[propget, restricted, id(DISPID_NEWENUM)]
	HRESULT _NewEnum( [out, retval] IUnknown ** ppEnum );	

	[helpstring("Create a resource type")]
	HRESULT CreateItem(
		[in] BSTR bstrResourceTypeName,
		[in] BSTR bstrDisplayName,
		[in] BSTR bstrResourceTypeDll,
		[in] LONG dwLooksAlivePollInterval,
		[in] LONG dwIsAlivePollInterval,
		[out, retval] ClusResType ** ppResourceType );

	[helpstring("Delete a resource type")]
	HRESULT DeleteItem( [in] VARIANT varIndex );

	[helpstring("Add a resource type to the list.")]
	HRESULT AddItem( [in] ClusResType * pResourceType );

	[helpstring("Remove a resource type from the list by name or index.")]
	HRESULT RemoveItem( [in] VARIANT varIndex );

	[helpstring("Refresh data in collection")]
	HRESULT Refresh();
};





/////////////////////////////////////////////////
// ClusProperty
[
	object,
	uuid(e9d7436b-e986-11d0-a1cf-00a024ab73e5),
	dual,
	helpstring("Property of an object in the cluster"),
	pointer_default(unique)
]
interface ClusProperty : IDispatch
{
	[propget]
	HRESULT Name( [out, retval] BSTR * pbstrName );

	[propget]
	HRESULT Value( [out, retval] VARIANT * pvarValue );

	[propput, id(DISPID_VALUE)]
	HRESULT Value( [in] VARIANT varValue );
};



/////////////////////////////////////////////////
// ClusProperties
[
	object,
	uuid(e9d7436c-e986-11d0-a1cf-00a024ab73e5),
	dual,
	helpstring("ClusProperty collection"),
	pointer_default(unique)
]
interface ClusProperties : IDispatch
{
	[propget]
	HRESULT Count( [out, retval] long * pnCount );

	[propget, id(DISPID_VALUE)]
	HRESULT Item( [in] VARIANT varIndex, [out, retval] ClusProperty ** ppProperty );

	[propget, restricted, id(DISPID_NEWENUM)]
	HRESULT _NewEnum( [out, retval] IUnknown ** ppEnum );	

	[helpstring("Add an object")]
	HRESULT Add( [in] BSTR bstrName, [in] VARIANT varValue, [out, retval] ClusProperty ** pProperty );

	[helpstring("Remove an object")]
	HRESULT Remove( [in] VARIANT varIndex );

	[helpstring("Refresh data in collection")]
	HRESULT Refresh();

	[helpstring("Save all property changes")]
	HRESULT SaveChanges();
};



/////////////////////////////////////////////////////////
// MSClusterLib
[
	uuid(e9d74370-e986-11d0-a1cf-00a024ab73e5),
	version(1.0),
	helpstring("MS Cluster 1.0 Type Library")
]
library MSClusterLib
{
	importlib("stdole2.tlb");

	// Temporary include file for CLUSAPI constants.
	//	#include "cluconst.idl"


	[
		uuid(e9d74371-e986-11d0-a1cf-00a024ab73e5),
		helpstring("Application Class")
	]
	coclass Application
	{
		[default] interface IClusterApplication;
	};

	[
		uuid(e9d74372-e986-11d0-a1cf-00a024ab73e5),
		helpstring("Cluster Class")
	]
	coclass Cluster
	{
		[default] interface ICluster;
	};

	[
		uuid(e9d74373-e986-11d0-a1cf-00a024ab73e5),
		helpstring("ClusterDomain Class")
	]
	coclass ClusterDomain
	{
		[default] interface IClusterDomain;
	};

};
