#include "idl_types.h"

import "misc.idl";

[
  uuid("ccd8c074-d0e5-4a40-92b4-d074faa6ba28"),
  version(1.1),
  pointer_default(unique),
  helpstring("SMB Witness Service"),
  helper("../librpc/ndr/ndr_witness.h"),
  endpoint("ncacn_ip_tcp:")
]
interface witness
{
	typedef [v1_enum] enum {
		WITNESS_V1 = 0x00010001,
		WITNESS_V2 = 0x00020000,
		WITNESS_UNSPECIFIED_VERSION = 0xFFFFFFFF
	} witness_version;

	/*****************/
	/* Function 0x00 */

	typedef [enum16bit] enum {
		WITNESS_STATE_UNKNOWN     = 0x00,
		WITNESS_STATE_AVAILABLE   = 0x01,
		WITNESS_STATE_UNAVAILABLE = 0xff
	} witness_interfaceInfo_state;

	typedef [bitmap32bit] bitmap {
		WITNESS_INFO_IPv4_VALID = 0x01,
		WITNESS_INFO_IPv6_VALID = 0x02,
		WITNESS_INFO_WITNESS_IF = 0x04
	} witness_interfaceInfo_flags;

	typedef struct {
		[charset(UTF16),to_null] uint16 group_name[260];
		witness_version version;
		witness_interfaceInfo_state state;
		[flag(NDR_BIG_ENDIAN)] ipv4address ipv4;
		[flag(NDR_BIG_ENDIAN)] ipv6address ipv6;
		witness_interfaceInfo_flags flags;
	} witness_interfaceInfo;

	typedef struct {
		uint32 num_interfaces;
		[size_is(num_interfaces)] witness_interfaceInfo *interfaces;
	} witness_interfaceList;

	[public] WERROR witness_GetInterfaceList(
		[out] witness_interfaceList **interface_list
		);

	/*****************/
	/* Function 0x01 */

	[public] WERROR witness_Register(
		[out,ref] policy_handle *context_handle,
		[in] witness_version version,
		[in,unique,string,charset(UTF16)] uint16 *net_name,
		[in,unique,string,charset(UTF16)] uint16 *ip_address,
		[in,unique,string,charset(UTF16)] uint16 *client_computer_name
		);

	/*****************/
	/* Function 0x02 */

	[public] WERROR witness_UnRegister(
		[in] policy_handle context_handle
		);

	/*****************/
	/* Function 0x03 */

	typedef [v1_enum,public] enum {
		WITNESS_NOTIFY_RESOURCE_CHANGE = 1,
		WITNESS_NOTIFY_CLIENT_MOVE     = 2,
		WITNESS_NOTIFY_SHARE_MOVE      = 3,
		WITNESS_NOTIFY_IP_CHANGE       = 4
	} witness_notifyResponse_type;

	typedef [v1_enum] enum {
		WITNESS_RESOURCE_STATE_UNKNOWN     = 0x00,
		WITNESS_RESOURCE_STATE_AVAILABLE   = 0x01,
		WITNESS_RESOURCE_STATE_UNAVAILABLE = 0xff
	} witness_ResourceChange_type;

	typedef [flag(NDR_NOALIGN|NDR_LITTLE_ENDIAN),gensize,public] struct {
		[value(ndr_size_witness_ResourceChange(r,ndr->flags))] uint32 length;
		witness_ResourceChange_type type;
		nstring name;
	} witness_ResourceChange;

	typedef [bitmap32bit] bitmap {
		WITNESS_IPADDR_V4      = 0x01,
		WITNESS_IPADDR_V6      = 0x02,
		WITNESS_IPADDR_ONLINE  = 0x08,
		WITNESS_IPADDR_OFFLINE = 0x10
	} witness_IPaddrInfo_flags;

	typedef [flag(NDR_NOALIGN|NDR_LITTLE_ENDIAN),gensize] struct {
		witness_IPaddrInfo_flags flags;
		[flag(NDR_BIG_ENDIAN)] ipv4address ipv4;
		[flag(NDR_BIG_ENDIAN)] ipv6address ipv6;
	} witness_IPaddrInfo;

	typedef [flag(NDR_NOALIGN|NDR_LITTLE_ENDIAN)] struct {
		[value(12+(r->num*ndr_size_witness_IPaddrInfo(r->addr, ndr->flags)))] uint32 length;
		[value(0)] uint32 reserved;
		uint32 num;
		witness_IPaddrInfo addr[num];
	} witness_IPaddrInfoList;

	typedef [public,switch_type(witness_notifyResponse_type),nodiscriminant, flag(NDR_NOALIGN|NDR_LITTLE_ENDIAN)] union {
		[case(WITNESS_NOTIFY_RESOURCE_CHANGE)] witness_ResourceChange resource_change;
		[case(WITNESS_NOTIFY_CLIENT_MOVE)]     witness_IPaddrInfoList client_move;
		[case(WITNESS_NOTIFY_SHARE_MOVE)]      witness_IPaddrInfoList share_move;
		[case(WITNESS_NOTIFY_IP_CHANGE)]       witness_IPaddrInfoList ip_change;
		[default,flag(NDR_REMAINING)]          DATA_BLOB data;
	} witness_notifyResponse_message;

	typedef [flag(NDR_PAHEX),gensize,public,nopush,nopull] struct {
		witness_notifyResponse_type type;
		[value(ndr_size_witness_notifyResponse(r, ndr->flags)-20)] uint32 length;
		uint32 num;
		[subcontext(4), subcontext_size(length), flag(NDR_REMAINING), switch_is(type)] witness_notifyResponse_message messages[num];
	} witness_notifyResponse;

	[public] WERROR witness_AsyncNotify(
		[in] policy_handle context_handle,
		[out] witness_notifyResponse **response
		);

	/*****************/
	/* Function 0x04 */

	typedef [bitmap32bit] bitmap {
		WITNESS_REGISTER_NONE            = 0x00,
		WITNESS_REGISTER_IP_NOTIFICATION = 0x01
	} witness_RegisterEx_flags;

	WERROR witness_RegisterEx(
		[out,ref] policy_handle *context_handle,
		[in] witness_version version,
		[in,unique,string,charset(UTF16)] uint16 *net_name,
		[in,unique,string,charset(UTF16)] uint16 *share_name,
		[in,unique,string,charset(UTF16)] uint16 *ip_address,
		[in,unique,string,charset(UTF16)] uint16 *client_computer_name,
		[in] witness_RegisterEx_flags flags,
		[in] uint32 timeout
		);
}
