#include "idl_types.h"

/**
  DCOM interfaces
  http://www.grimes.demon.co.uk/DCOM/DCOMSpec.htm
 */

/* 
 The OXID Resolver can turn a OXID (Object Exporter ID) into a 
 RPC binding string that can be used to contact an object

 (used by DCOM)
 */

[ 
	uuid("99fcfec4-5260-101b-bbcb-00aa0021347a"),
	helpstring("Object Exporter ID Resolver"),
	endpoint("ncacn_np:[\\pipe\\epmapper]", "ncacn_ip_tcp:[135]", "ncalrpc:"),
	pointer_default(unique),
  	pointer_default_top(unique),
	depends(dcom)
]
interface IOXIDResolver
{
#define OXID hyper
#define SETID hyper
#define IPID GUID
#define OID GUID

	/* Method to get the protocol sequences, string bindings */
	/* and machine id for an object server given its OXID. */

	[idempotent] WERROR ResolveOxid (
		 [in] OXID pOxid,
		 [in] uint16 cRequestedProtseqs,
		 [in, size_is(cRequestedProtseqs)] uint16 arRequestedProtseqs[],
		 [out] DUALSTRINGARRAY *ppdsaOxidBindings,
		 [out] IPID pipidRemUnknown,
		 [out] uint32 pAuthnHint
			 );

	/* Simple ping is used to ping a Set. Client machines use this */
	/* to inform the object exporter that it is still using the */
	/* members of the set. */
	/* Returns S_TRUE if the SetId is known by the object exporter, */
	/* S_FALSE if not. */
	[idempotent] WERROR SimplePing (
		[in] SETID *SetId /* Must not be zero */
		);
	
	/* Complex ping is used to create sets of OIDs to ping. The */
	/* whole set can subsequently be pinged using SimplePing, */
	/* thus reducing network traffic. */
	[idempotent] WERROR ComplexPing (
		[in] SETID *SetId, /* In of 0 on first call for new set. */
		[out] SETID SetId,
		[in] uint16 SequenceNum,
		[in] uint16 cAddToSet,
		[in] uint16 cDelFromSet,
		/* add these OIDs to the set */
		[in, size_is(cAddToSet)] OID AddToSet[],
		/*remove these OIDs from the set */
		[in, size_is(cDelFromSet)] OID DelFromSet[],
		[out] uint16 PingBackoffFactor/* 2^factor = multipler */
			 );

	/* In some cases the client maybe unsure that a particular */
	/* binding will reach the server. (For example, when the oxid */
	/* bindings have more then one TCP/IP binding) This call */
	/* can be used to validate the binding */
	/* from the client. */
	[idempotent] WERROR ServerAlive ();

	/* Method to get the protocol sequences, string bindings, */
	/* RemoteUnknown IPID and COM version for an object server */
	/* given its OXID. Supported by DCOM */
	/* version 5.2 and above. Looks like that means 
	 * Windows 2003/XP and above */
	[idempotent] WERROR ResolveOxid2 (
											  [in] OXID pOxid,
											  [in] uint16 cRequestedProtseqs,
											  [in, size_is(cRequestedProtseqs)] uint16 arRequestedProtseqs[],
											  [out] DUALSTRINGARRAY *pdsaOxidBindings,
											  [out] IPID ipidRemUnknown,
											  [out] uint32 AuthnHint,
											  [out] COMVERSION ComVersion
											 );
	typedef struct {
		COMVERSION version;
	  	uint32 unknown1;
	} COMINFO;

	[idempotent] WERROR ServerAlive2 (
	  [out] COMINFO info,
	  [out] DUALSTRINGARRAY dualstring,
	  [out] uint8 unknown2[3]);
}