/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef _INC_DAVCLNT
#define _INC_DAVCLNT

#ifdef __cplusplus
extern "C" {
#endif

#if (_WIN32_WINNT >= 0x0600)
#define DAV_AUTHN_SCHEME_BASIC      0x00000001
#define DAV_AUTHN_SCHEME_NTLM       0x00000002
#define DAV_AUTHN_SCHEME_PASSPORT   0x00000004
#define DAV_AUTHN_SCHEME_DIGEST     0x00000008
#define DAV_AUTHN_SCHEME_NEGOTIATE  0x00000010
#define DAV_AUTHN_SCHEME_CERT       0x00010000
#define DAV_AUTHN_SCHEME_FBA        0x00100000

typedef DWORD OPAQUE_HANDLE;

typedef enum AUTHNEXTSTEP {
  DefaultBehavior   = 0,
  RetryRequest      = 1,
  CancelRequest     = 2 
} AUTHNEXTSTEP;

typedef struct _DAV_CALLBACK_AUTH_BLOB {
  PVOID pBuffer;
  ULONG ulSize;
  ULONG ulType;
}DAV_CALLBACK_AUTH_BLOB, *PDAV_CALLBACK_AUTH_BLOB;

typedef struct _DAV_CALLBACK_AUTH_UNP {
  LPWSTR pszUserName;
  ULONG  ulUserNameLength;
  LPWSTR pszPassword;
  ULONG  ulPasswordLength;
}DAV_CALLBACK_AUTH_UNP, *PDAV_CALLBACK_AUTH_UNP;

typedef struct _DAV_CALLBACK_CRED {
  DAV_CALLBACK_AUTH_BLOB AuthBlob;
  DAV_CALLBACK_AUTH_UNP  UNPBlob;
  WINBOOL                bAuthBlobValid;
  WINBOOL                bSave;
}DAV_CALLBACK_CRED, *PDAV_CALLBACK_CRED;

typedef DWORD (*PFNDAVAUTHCALLBACK_FREECRED)(
  PVOID pbuffer
);

typedef DWORD (*PFNDAVAUTHCALLBACK)(
  LPWSTR lpwzServerName,
  LPWSTR lpwzRemoteName,
  DWORD dwAuthScheme,
  DWORD dwFlags,
  PDAV_CALLBACK_CRED pCallbackCred,
  AUTHNEXTSTEP *NextStep,
  PFNDAVAUTHCALLBACK_FREECRED *pFreeCred
);

OPAQUE_HANDLE WINAPI DavRegisterAuthCallback(
  PFNDAVAUTHCALLBACK CallBack,
  ULONG Version
);

VOID WINAPI DavUnregisterAuthCallback(
  OPAQUE_HANDLE hCallback
);

DWORD WINAPI DavAddConnection(
  HANDLE *ConnectionHandle,
  LPCWSTR RemoteName,
  LPCWSTR UserName,
  LPCWSTR Password,
  PBYTE ClientCert,
  DWORD CertSize
);

DWORD WINAPI DavCancelConnectionsToServer(
  LPWSTR lpName,
  WINBOOL fForce
);

DWORD WINAPI DavDeleteConnection(
  HANDLE ConnectionHandle
);

DWORD WINAPI DavFlushFile(
  HANDLE hFile
);

DWORD WINAPI DavGetExtendedError(
  HANDLE hFile,
  DWORD *ExtError,
  LPWSTR ExtErrorString,
  DWORD *cChSize
);

DWORD WINAPI DavGetHTTPFromUNCPath(
  LPCWSTR UncPath,
  LPWSTR HttpPath,
  LPDWORD lpSize
);

DWORD WINAPI DavGetTheLockOwnerOfTheFile(
  LPCWSTR FileName,
  PWSTR LockOwnerName,
  PULONG LockOwnerNameLengthInBytes
);

DWORD WINAPI DavGetUNCFromHTTPPath(
  LPCWSTR HttpPath,
  LPWSTR UncPath,
  LPDWORD lpSize
);

DWORD WINAPI DavInvalidateCache(
  LPWSTR URLName
);

OPAQUE_HANDLE WINAPI DavRegisterAuthCallback(
  PFNDAVAUTHCALLBACK CallBack,
  ULONG Version
);

VOID WINAPI DavUnregisterAuthCallback(
  OPAQUE_HANDLE hCallback
);

#endif /*(_WIN32_WINNT >= 0x0600)*/

#ifdef __cplusplus
}
#endif

#endif /*_INC_DAVCLNT*/
