#include "idl_types.h"

import "misc.idl";
/*
dfs blobs interface definition
*/


[
	pointer_default(unique),
	helpstring("dfs referral blobs"),
	uuid("12345778-1234-abcd-0001-00000003")
]


interface dfsblobs
{
	typedef [bitmap32bit] bitmap {
		DFS_HEADER_FLAG_REFERAL_SVR	= 0x00000001,
		DFS_HEADER_FLAG_STORAGE_SVR	= 0x00000002,
		DFS_HEADER_FLAG_TARGET_BCK	= 0x00000004
	} DFS_HEADER_FLAG;

	typedef [enum16bit] enum {
		DFS_SERVER_NON_ROOT	= 0x0000,
		DFS_SERVER_ROOT		= 0x0001
	} DFS_SERVER_TYPE;

	typedef [enum16bit] enum {
		DFS_FLAG_REFERRAL_DOMAIN_RESP		= 0x0002,
		DFS_FLAG_REFERRAL_FIRST_TARGET_SET	= 0x0004
	} DFS_FLAGS_REFERRAL;

	typedef struct {
		uint16 size;
		uint16 server_type;
		uint16 entry_flags;
		nstring *share_name;
	} dfs_referral_v1;

	typedef struct {
		uint16 size;
		DFS_SERVER_TYPE server_type;
		DFS_FLAGS_REFERRAL entry_flags;
		uint32 proximity;
		uint32 ttl;
		[relative_short] nstring *DFS_path;
		[relative_short] nstring *DFS_alt_path;
		[relative_short] nstring *netw_address;
	} dfs_referral_v2;

	typedef struct {
		[relative_short] nstring *DFS_path;
		[relative_short] nstring *DFS_alt_path;
		[relative_short] nstring *netw_address;
		/* As stated in MS DFSC 2.2.4.3.1 this array was guid but now MUST be 16 null bytes*/
		uint8	service_site_guid[16];
	} dfs_normal_referral;

	typedef struct {
		[relative_short] nstring *special_name;
		uint16 nb_expanded_names;
		[relative_short] [flag(STR_NOTERM|NDR_REMAINING)] string_array *expanded_names;
		/*[relative_short] nstring_array expanded_names2;*/
		/* As stated in MS DFSC 2.2.4.3.1 this array was guid but now MUST be 16 null bytes*/
		uint8	service_site_guid[16];
	} dfs_domain_referral;

	typedef [nodiscriminant] union {
		[case(0)] dfs_normal_referral r1;
		[case(2)] dfs_domain_referral r2;
		[default];
	} dfs_referral;

	typedef [flag(NDR_NOALIGN)] struct {
		uint16 size;
		DFS_SERVER_TYPE server_type;
		DFS_FLAGS_REFERRAL entry_flags;
		uint32 ttl;
		[switch_is(entry_flags & DFS_FLAG_REFERRAL_DOMAIN_RESP)] dfs_referral referrals;
	} dfs_referral_v3;

	typedef struct {
		uint16 size;
		DFS_SERVER_TYPE server_type;
		DFS_FLAGS_REFERRAL entry_flags;
		uint32 ttl;
		dfs_normal_referral referrals;
	} dfs_referral_v4;

	typedef [nodiscriminant] union {
		[case(1)] dfs_referral_v1 v1;
		[case(2)] dfs_referral_v2 v2;
		[case(3)] dfs_referral_v3 v3;
		[case(4)] dfs_referral_v4 v4;
		[default];
	} dfs_referral_version;

	typedef [flag(NDR_NOALIGN)] [relative_base] struct {
		uint16	version;
		[switch_is(version)] dfs_referral_version referral;
	} dfs_referral_type;

	typedef [public] struct {
		uint16	path_consumed;
		uint16	nb_referrals;
		uint32	header_flags;
		dfs_referral_type referral_entries[nb_referrals];
	} dfs_referral_resp;

	[public] void dfs_GetDFSReferral(
		[in]		uint16 max_referral_level,
		[in]		nstring servername,
		[out,ref]	dfs_referral_resp *resp
		);
}