/*
 * lmrepl.h
 *
 * This file is part of the ReactOS PSDK package.
 *
 * THIS SOFTWARE IS NOT COPYRIGHTED
 *
 * This source code is offered for use in the public domain. You may
 * use, modify or distribute it freely.
 *
 * This code is distributed in the hope that it will be useful but
 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
 * DISCLAIMED. This includes but is not limited to warranties of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 */

#pragma once
#define _LMREPL_

#ifdef __cplusplus
extern "C" {
#endif

#define REPL_ROLE_EXPORT 1
#define REPL_ROLE_IMPORT 2
#define REPL_ROLE_BOTH   3

#define REPL_INTERVAL_INFOLEVEL  (PARMNUM_BASE_INFOLEVEL+0)
#define REPL_PULSE_INFOLEVEL     (PARMNUM_BASE_INFOLEVEL+1)
#define REPL_GUARDTIME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+2)
#define REPL_RANDOM_INFOLEVEL    (PARMNUM_BASE_INFOLEVEL+3)

#define REPL_UNLOCK_NOFORCE 0
#define REPL_UNLOCK_FORCE   1

#define REPL_STATE_OK 0
#define REPL_STATE_NO_MASTER 1
#define REPL_STATE_NO_SYNC 2
#define REPL_STATE_NEVER_REPLICATED 3

#define REPL_INTEGRITY_FILE 1
#define REPL_INTEGRITY_TREE 2

#define REPL_EXTENT_FILE 1
#define REPL_EXTENT_TREE 2

#define REPL_EXPORT_INTEGRITY_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+0)
#define REPL_EXPORT_EXTENT_INFOLEVEL    (PARMNUM_BASE_INFOLEVEL+1)

typedef struct _REPL_INFO_0
{
    DWORD rp0_role;
    LPWSTR rp0_exportpath;
    LPWSTR rp0_exportlist;
    LPWSTR rp0_importpath;
    LPWSTR rp0_importlist;
    LPWSTR rp0_logonusername;
    DWORD rp0_interval;
    DWORD rp0_pulse;
    DWORD rp0_guardtime;
    DWORD rp0_random;
} REPL_INFO_0, * PREPL_INFO_0, * LPREPL_INFO_0;

typedef struct _REPL_INFO_1000
{
    DWORD rp1000_interval;
} REPL_INFO_1000,*PREPL_INFO_1000,*LPREPL_INFO_1000;

typedef struct _REPL_INFO_1001
{
    DWORD rp1001_pulse;
} REPL_INFO_1001,*PREPL_INFO_1001,*LPREPL_INFO_1001;

typedef struct _REPL_INFO_1002
{
    DWORD rp1002_guardtime;
} REPL_INFO_1002,*PREPL_INFO_1002,*LPREPL_INFO_1002;

typedef struct _REPL_INFO_1003
{
    DWORD rp1003_random;
} REPL_INFO_1003,*PREPL_INFO_1003,*LPREPL_INFO_1003;

NET_API_STATUS
NET_API_FUNCTION
NetReplGetInfo(
    _In_ LPCWSTR servername OPTIONAL,
    _In_ DWORD level,
    _Out_ LPBYTE* bufptr);

NET_API_STATUS
WINAPI
NetReplSetInfo(
    _In_opt_ LPCWSTR servername,
    _In_ DWORD level,
    _In_ const LPBYTE buf,
    _Out_opt_ LPDWORD parm_err);

typedef struct _REPL_EDIR_INFO_0
{
    LPWSTR rped0_dirname;
} REPL_EDIR_INFO_0, * PREPL_EDIR_INFO_0, * LPREPL_EDIR_INFO_0;

typedef struct _REPL_EDIR_INFO_1
{
    LPWSTR rped1_dirname;
    DWORD rped1_integrity;
    DWORD rped1_extent;
} REPL_EDIR_INFO_1, * PREPL_EDIR_INFO_1, * LPREPL_EDIR_INFO_1;

typedef struct _REPL_EDIR_INFO_2
{
    LPWSTR rped2_dirname;
    DWORD rped2_integrity;
    DWORD rped2_extent;
    DWORD rped2_lockcount;
    DWORD rped2_locktime;
} REPL_EDIR_INFO_2, * PREPL_EDIR_INFO_2, * LPREPL_EDIR_INFO_2;

typedef struct _REPL_EDIR_INFO_1000
{
    DWORD rped1000_integrity;
} REPL_EDIR_INFO_1000, * PREPL_EDIR_INFO_1000, * LPREPL_EDIR_INFO_1000;

typedef struct _REPL_EDIR_INFO_1001
{
    DWORD rped1001_extent;
} REPL_EDIR_INFO_1001, * PREPL_EDIR_INFO_1001, * LPREPL_EDIR_INFO_1001;

typedef struct _REPL_IDIR_INFO_0
{
    LPWSTR rpid0_dirname;
} REPL_IDIR_INFO_0, * PREPL_IDIR_INFO_0, * LPREPL_IDIR_INFO_0;

typedef struct _REPL_IDIR_INFO_1
{
    LPWSTR rpid1_dirname;
    DWORD rpid1_state;
    LPWSTR rpid1_mastername;
    DWORD rpid1_last_update_time;
    DWORD rpid1_lockcount;
    DWORD rpid1_locktime;
} REPL_IDIR_INFO_1, * PREPL_IDIR_INFO_1, * LPREPL_IDIR_INFO_1;

NET_API_STATUS
NET_API_FUNCTION
NetReplExportDirAdd(
    _In_opt_ LPCWSTR servername,
    _In_ DWORD level,
    _In_ const LPBYTE buf,
    _Out_opt_ LPDWORD parm_err);

NET_API_STATUS
NET_API_FUNCTION
NetReplExportDirDel(
    _In_opt_ LPCWSTR servername,
    _In_ LPCWSTR dirname);

NET_API_STATUS
NET_API_FUNCTION
NetReplExportDirEnum(
    _In_opt_ LPCWSTR servername,
    _In_ DWORD level,
    _Out_ LPBYTE* bufptr,
    _In_ DWORD prefmaxlen,
    _Out_ LPDWORD entriesread,
    _Out_ LPDWORD totalentries,
    _Inout_opt_ LPDWORD resumehandle);

NET_API_STATUS
NET_API_FUNCTION
NetReplExportDirGetInfo(
    _In_opt_ LPCWSTR servername,
    _In_ LPCWSTR dirname,
    _In_ DWORD level,
    _Out_ LPBYTE* bufptr);

NET_API_STATUS
NET_API_FUNCTION
NetReplExportDirSetInfo(
    _In_opt_ LPCWSTR servername,
    _In_ LPCWSTR dirname,
    _In_ DWORD level,
    _In_ const LPBYTE buf,
    _Out_opt_ LPDWORD parm_err);

NET_API_STATUS
NET_API_FUNCTION
NetReplExportDirLock(
    _In_opt_ LPCWSTR servername,
    _In_ LPCWSTR dirname);

NET_API_STATUS
NET_API_FUNCTION
NetReplExportDirUnlock(
    _In_opt_ LPCWSTR servername,
    _In_ LPCWSTR dirname,
    _In_ DWORD unlockforce);

NET_API_STATUS
NET_API_FUNCTION
NetReplImportDirAdd(
    _In_opt_ LPCWSTR servername,
    _In_ DWORD level,
    _In_ const LPBYTE buf,
    _Out_opt_ LPDWORD parm_err);

NET_API_STATUS
NET_API_FUNCTION
NetReplImportDirDel(
    _In_opt_ LPCWSTR servername,
    _In_ LPCWSTR dirname);

NET_API_STATUS
NET_API_FUNCTION
NetReplImportDirEnum(
    _In_opt_ LPCWSTR servername,
    _In_ DWORD level,
    _Out_ LPBYTE* bufptr,
    _In_ DWORD prefmaxlen,
    _Out_ LPDWORD entriesread,
    _Out_ LPDWORD totalentries,
    _Inout_opt_ LPDWORD resumehandle);

NET_API_STATUS
NET_API_FUNCTION
NetReplImportDirGetInfo(
    _In_opt_ LPCWSTR servername,
    _In_ LPCWSTR dirname,
    _In_ DWORD level,
    _Out_ LPBYTE* bufptr);

NET_API_STATUS
NET_API_FUNCTION
NetReplImportDirLock(
    _In_opt_ LPCWSTR servername,
    _In_ LPCWSTR dirname);

NET_API_STATUS
NET_API_FUNCTION
NetReplImportDirUnlock(
    _In_opt_ LPCWSTR servername,
    _In_ LPCWSTR dirname,
    _In_ DWORD unlockforce);

#ifdef __cplusplus
}
#endif