/*++

Copyright (c) 1996  Microsoft Corporation

Module Name:

    NETDFS.IDL

Abstract:

    Contains the Netr (Net Remote) RPC interface specification for the
    API associated with the Dfs Manager Service.  This includes the following
    APIs:

        NetDfsEnum

    Also contains the RPC specific data structures for these API.

Author:

    Milan Shah    (milans)  08-Jan-1996

Environment:

    User Mode - Win32 - MIDL

Revision History:

    08-Jan-1996         Milans Created.

--*/


//
// Interface Attributes
//

[
    uuid(4fc742e0-4a10-11cf-8273-00aa004ae673),
    version(3.0),
#ifdef __midl
        ms_union,
#endif // __midl
    pointer_default(unique)
]


interface netdfs

{

import "import.idl";
#include <lmcons.h>

//
// Data structures used by the public Dfs interface
//

typedef struct _DFS_INFO_1_CONTAINER {
        DWORD   EntriesRead;
        [size_is(EntriesRead)] LPDFS_INFO_1 Buffer;
} DFS_INFO_1_CONTAINER, *LPDFS_INFO_1_CONTAINER;

typedef struct _DFS_INFO_2_CONTAINER {
        DWORD   EntriesRead;
        [size_is(EntriesRead)] LPDFS_INFO_2 Buffer;
} DFS_INFO_2_CONTAINER, *LPDFS_INFO_2_CONTAINER;

typedef struct _DFS_INFO_3_CONTAINER {
        DWORD   EntriesRead;
        [size_is(EntriesRead)] LPDFS_INFO_3 Buffer;
} DFS_INFO_3_CONTAINER, *LPDFS_INFO_3_CONTAINER;

typedef struct _DFS_INFO_4_CONTAINER {
        DWORD   EntriesRead;
        [size_is(EntriesRead)] LPDFS_INFO_4 Buffer;
} DFS_INFO_4_CONTAINER, *LPDFS_INFO_4_CONTAINER;

typedef struct _DFS_INFO_200_CONTAINER {
        DWORD   EntriesRead;
        [size_is(EntriesRead)] LPDFS_INFO_200 Buffer;
} DFS_INFO_200_CONTAINER, *LPDFS_INFO_200_CONTAINER;


typedef struct _DFS_INFO_300_CONTAINER {
        DWORD   EntriesRead;
        [size_is(EntriesRead)] LPDFS_INFO_300 Buffer;
} DFS_INFO_300_CONTAINER, *LPDFS_INFO_300_CONTAINER;

typedef struct _DFS_INFO_ENUM_STRUCT {
        DWORD   Level;
        [switch_is(Level)] union {
            [case(1)]
                LPDFS_INFO_1_CONTAINER DfsInfo1Container;
            [case(2)]
                LPDFS_INFO_2_CONTAINER DfsInfo2Container;
            [case(3)]
                LPDFS_INFO_3_CONTAINER DfsInfo3Container;
            [case(4)]
                LPDFS_INFO_4_CONTAINER DfsInfo4Container;
            [case(200)]
                LPDFS_INFO_200_CONTAINER DfsInfo200Container;
            [case(300)]
                LPDFS_INFO_300_CONTAINER DfsInfo300Container;
        } DfsInfoContainer;
} DFS_INFO_ENUM_STRUCT, *LPDFS_INFO_ENUM_STRUCT;

typedef [switch_type(unsigned long)] union _DFS_INFO_STRUCT {
        [case(1)]
                LPDFS_INFO_1    DfsInfo1;
        [case(2)]
                LPDFS_INFO_2    DfsInfo2;
        [case(3)]
                LPDFS_INFO_3    DfsInfo3;
        [case(4)]
                LPDFS_INFO_4    DfsInfo4;
        [case(100)]
                LPDFS_INFO_100  DfsInfo100;
        [case(101)]
                LPDFS_INFO_101  DfsInfo101;
        [case(102)]
                LPDFS_INFO_102  DfsInfo102;
        [default]
                ;
} DFS_INFO_STRUCT, *LPDFS_INFO_STRUCT;

//
// Data structures are used by the private Dfs Manager interface
//

typedef struct _DFSM_ENTRY_ID {
        GUID idSubordinate;
        [string, unique] LPWSTR wszSubordinate;
} DFSM_ENTRY_ID, *LPDFSM_ENTRY_ID;

typedef struct _DFSM_RELATION_INFO {
        DWORD   cSubordinates;
        [size_is(cSubordinates)] DFSM_ENTRY_ID eid[];
} DFSM_RELATION_INFO, *LPDFSM_RELATION_INFO;

typedef struct _DFSM_ROOT_LIST_ENTRY {
        [string, unique] LPWSTR ServerShare;
} DFSM_ROOT_LIST_ENTRY, *PDFSM_ROOT_LIST_ENTRY, *LPDFSM_ROOT_LIST_ENTRY;

typedef struct _DFSM_ROOT_LIST {
        DWORD   cEntries;
        [size_is(cEntries)] DFSM_ROOT_LIST_ENTRY Entry[];
} DFSM_ROOT_LIST, *PDFSM_ROOT_LIST, *LPDFSM_ROOT_LIST;

//
// The public Dfs interface methods
//

DWORD NetrDfsManagerGetVersion();

NET_API_STATUS NetrDfsAdd(
        [in,string]             LPWSTR DfsEntryPath,
        [in,string]             LPWSTR ServerName,
        [in,unique,string]      LPWSTR ShareName,
        [in,unique,string]      LPWSTR Comment,
        [in]                    DWORD  Flags);

NET_API_STATUS NetrDfsRemove(
        [in,string]             LPWSTR DfsEntryPath,
        [in,unique,string]      LPWSTR ServerName,
        [in,unique,string]      LPWSTR ShareName);

NET_API_STATUS NetrDfsSetInfo(
        [in,string]             LPWSTR DfsEntryPath,
        [in,unique,string]      LPWSTR ServerName,
        [in,unique,string]      LPWSTR ShareName,
        [in]                    DWORD  Level,
        [in,switch_is(Level)]   LPDFS_INFO_STRUCT DfsInfo);

NET_API_STATUS NetrDfsGetInfo(
        [in,string]             LPWSTR  DfsEntryPath,
        [in,unique,string]      LPWSTR  ServerName,
        [in,unique,string]      LPWSTR  ShareName,
        [in]                    DWORD   Level,
        [out,switch_is(Level)]  LPDFS_INFO_STRUCT DfsInfo);

NET_API_STATUS NetrDfsEnum(
        [in]                    DWORD   Level,
        [in]                    DWORD   PrefMaxLen,
        [in,out,unique]         LPDFS_INFO_ENUM_STRUCT DfsEnum,
        [in,out,unique]         LPDWORD ResumeHandle);

NET_API_STATUS NetrDfsMove(
        [in,string]             LPWSTR DfsEntryPath,
        [in,string]             LPWSTR NewDfsEntryPath);

NET_API_STATUS NetrDfsRename(
        [in,string]             LPWSTR Path,
        [in,string]             LPWSTR NewPath);

//
// The private Dfs Manager methods
//

NET_API_STATUS NetrDfsManagerGetConfigInfo(
        [in, string]    LPWSTR wszServer,
        [in, string]    LPWSTR wszLocalVolumeEntryPath,
        [in]            GUID   idLocalVolume,
        [in, out, unique] LPDFSM_RELATION_INFO *ppRelationInfo);

NET_API_STATUS NetrDfsManagerSendSiteInfo(
        [in, string]    LPWSTR wszServer,
        [in]            LPDFS_SITELIST_INFO pSiteInfo);

//
// Remote setup/teardown apis
//

NET_API_STATUS NetrDfsAddFtRoot(
        [in,string]             LPWSTR ServerName,
        [in,string]             LPWSTR DcName,
        [in,string]             LPWSTR RootShare,
        [in,string]             LPWSTR FtDfsName,
        [in,string]             LPWSTR Comment,
        [in,string]             LPWSTR ConfigDN,
        [in]                    BOOLEAN NewFtDfs,
        [in]                    DWORD  Flags,
        [in,out,unique]         PDFSM_ROOT_LIST *ppRootList);

NET_API_STATUS NetrDfsRemoveFtRoot(
        [in,string]             LPWSTR ServerName,
        [in,string]             LPWSTR DcName,
        [in,string]             LPWSTR RootShare,
        [in,string]             LPWSTR FtDfsName,
        [in]                    DWORD  Flags,
        [in,out,unique]         PDFSM_ROOT_LIST *ppRootList);

NET_API_STATUS NetrDfsAddStdRoot(
        [in,string]             LPWSTR ServerName,
        [in,string]             LPWSTR RootShare,
        [in,string]             LPWSTR Comment,
        [in]                    DWORD  Flags);

NET_API_STATUS NetrDfsRemoveStdRoot(
        [in,string]             LPWSTR ServerName,
        [in,string]             LPWSTR RootShare,
        [in]                    DWORD  Flags);


// Reinitialize the Dfs Manager
//

NET_API_STATUS NetrDfsManagerInitialize(
        [in,string]             LPWSTR ServerName,
        [in]                    DWORD  Flags);

//
// Create a root with the share offline
//

NET_API_STATUS NetrDfsAddStdRootForced(
        [in,string]             LPWSTR ServerName,
        [in,string]             LPWSTR RootShare,
        [in,string]             LPWSTR Comment,
        [in,string]             LPWSTR Share);

//
// Api's for setting up an FtDfs root
//

NET_API_STATUS NetrDfsGetDcAddress(
        [in,string]             LPWSTR  ServerName,
        [in,out,string]         LPWSTR  *DcName,
        [in,out]                BOOLEAN *IsRoot,
        [in,out]                ULONG   *Timeout);

//
// Api to direct an FtDfs root server to a specific DC
//

NET_API_STATUS NetrDfsSetDcAddress(
        [in,string]             LPWSTR ServerName,
        [in,string]             LPWSTR DcName,
        [in]                    DWORD  Timeout,
        [in]                    DWORD  Flags);


//
// Api to tell a DC to flush an FtDfs entry from its cache
//

NET_API_STATUS NetrDfsFlushFtTable(
        [in,string]             LPWSTR DcName,
        [in,string]             LPWSTR wszFtDfsName);

//
// New apis to work with Ft roots
//

NET_API_STATUS NetrDfsAdd2(
        [in,string]             LPWSTR DfsEntryPath,
        [in,string]             LPWSTR DcName,
        [in,string]             LPWSTR ServerName,
        [in,unique,string]      LPWSTR ShareName,
        [in,unique,string]      LPWSTR Comment,
        [in]                    DWORD  Flags,
        [in,out,unique]         PDFSM_ROOT_LIST *ppRootList);

NET_API_STATUS NetrDfsRemove2(
        [in,string]             LPWSTR DfsEntryPath,
        [in,string]             LPWSTR DcName,
        [in,unique,string]      LPWSTR ServerName,
        [in,unique,string]      LPWSTR ShareName,
        [in,out,unique]         PDFSM_ROOT_LIST *ppRootList);

NET_API_STATUS NetrDfsEnumEx(
        [in,string]             LPWSTR  DfsEntryPath,
        [in]                    DWORD   Level,
        [in]                    DWORD   PrefMaxLen,
        [in,out,unique]         LPDFS_INFO_ENUM_STRUCT DfsEnum,
        [in,out,unique]         LPDWORD ResumeHandle);

NET_API_STATUS NetrDfsSetInfo2(
        [in,string]             LPWSTR DfsEntryPath,
        [in,string]             LPWSTR DcName,
        [in,unique,string]      LPWSTR ServerName,
        [in,unique,string]      LPWSTR ShareName,
        [in]                    DWORD  Level,
        [in,switch_is(Level)]   LPDFS_INFO_STRUCT pDfsInfo,
        [in,out,unique]         PDFSM_ROOT_LIST *ppRootList);
}
