/*
  dfs interface definition
*/

#include "idl_types.h"

[ uuid(4fc742e0-4a10-11cf-8273-00aa004ae673),
  version(3.0),
  pointer_default(unique)
] interface netdfs
{
	/******************/
	/* Function: 0x00 */
	void dfs_Exist(
		[out,ref] uint32 *exist_flag
		);


	/******************/
	/* Function: 0x01 */
	WERROR dfs_Add (
		[in,ref]     unistr *path,
		[in,ref]     unistr *server,
		[in]         unistr *share,
		[in]         unistr *comment,
		[in]         uint32  flags
		);

	/******************/
	/* Function: 0x02 */
	WERROR dfs_Remove (
		[in,ref] unistr *path,
		[in]     unistr *server,
		[in]     unistr *share
		);

	/******************/
	/* Function: 0x03 */
	WERROR dfs_SetInfo ();

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

	typedef struct {
		unistr *path;
	} dfs_Info1;

	typedef struct {
		unistr *path;
		unistr *comment;
		uint32 state;
		uint32 num_stores;
	} dfs_Info2;

	typedef struct {
		uint32 state;
		unistr *server;
		unistr *share;
	} dfs_StorageInfo;

	typedef struct {
		unistr *path;
		unistr *comment;
		uint32 state;
		uint32 num_stores;
		[size_is(num_stores)] dfs_StorageInfo *stores;
	} dfs_Info3;

	typedef struct {
		unistr *path;
		unistr *comment;
		uint32 state;
		uint32 timeout;
		GUID   guid;
		uint32 num_stores;
		[size_is(num_stores)] dfs_StorageInfo *stores;
	} dfs_Info4;

	typedef struct {
		unistr *comment;
	} dfs_Info100;

	typedef struct {
		uint32 state;
	} dfs_Info101;

	typedef struct {
		uint32 timeout;
	} dfs_Info102;

	typedef struct {
		unistr *dom_root;
	} dfs_Info200;

	typedef struct {
		uint32 flags;
		unistr *dom_root;
	} dfs_Info300;

	typedef union {
		[case(1)]   dfs_Info1 *info1;
		[case(2)]   dfs_Info2 *info2;
		[case(3)]   dfs_Info3 *info3;
		[case(4)]   dfs_Info4 *info4;
		[case(100)] dfs_Info100 *info100;
		[case(101)] dfs_Info101 *info101;
		[case(102)] dfs_Info102 *info102;
		[default] ;
	} dfs_Info;

	WERROR dfs_GetInfo (
		[in,ref] unistr *path,
		[in]     unistr *server,
		[in]     unistr *share,
		[in]     uint32 level,
		[out,switch_is(level)] dfs_Info info
		);

	/******************/
	/* Function: 0x05 */

	typedef struct {
		uint32 count;
		[size_is(count)] dfs_Info1 *s;
	} dfs_EnumArray1;

	typedef struct {
		uint32 count;
		[size_is(count)] dfs_Info2 *s;
	} dfs_EnumArray2;

	typedef struct {
		uint32 count;
		[size_is(count)] dfs_Info3 *s;
	} dfs_EnumArray3;

	typedef struct {
		uint32 count;
		[size_is(count)] dfs_Info4 *s;
	} dfs_EnumArray4;

	typedef struct {
		uint32 count;
		[size_is(count)] dfs_Info200 *s;
	} dfs_EnumArray200;

	typedef struct {
		uint32 count;
		[size_is(count)] dfs_Info300 *s;
	} dfs_EnumArray300;


	typedef union {
		[case(1)] dfs_EnumArray1 *info1;
		[case(2)] dfs_EnumArray2 *info2;
		[case(3)] dfs_EnumArray3 *info3;
		[case(4)] dfs_EnumArray4 *info4;
		[case(200)] dfs_EnumArray200 *info200;
		[case(300)] dfs_EnumArray300 *info300;
	} dfs_EnumInfo;

	typedef struct {
		uint32 level;
		[switch_is(level)] dfs_EnumInfo e;
	} dfs_EnumStruct;

	WERROR dfs_Enum (
		[in] uint32 level,
		[in] uint32 bufsize,
		[in,out] dfs_EnumStruct *info,
		[in]     uint32 *unknown,
		[in,out] uint32 *total
		);
}