/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef _INC_EAPMETHODAUTHENTICATORAPIS
#define _INC_EAPMETHODAUTHENTICATORAPIS
#if (_WIN32_WINNT >= 0x0600)
#include <eaptypes.h>
#ifdef __cplusplus
extern "C" {
#endif

typedef struct _EAP_AUTHENTICATOR_METHOD_ROUTINES {
  DWORD           dwSizeInBytes;
  EAP_METHOD_TYPE *pEapType;
  DWORD (APIENTRY *EapMethodAuthenticatorInitialize)(
      EAP_METHOD_TYPE pEapType, 
      EAP_ERROR ppEapError);
  DWORD (APIENTRY *EapMethodAuthenticatorBeginSession)(
      DWORD dwFlags, 
      LPCWSTR pwszIdentity, 
      EapAttributes pAttributeArray, 
      DWORD dwSizeOfConnectionData, 
      BYTE pConnectionData, 
      DWORD dwMaxSendPacketSize, 
      EAP_SESSION_HANDLE pSessionHandle, 
      EAP_ERROR ppEapError);
  DWORD (APIENTRY *EapMethodAuthenticatorUpdateInnerMethodParams)(
      EAP_SESSION_HANDLE sessionHandle, 
      DWORD dwFlags, 
      WCHAR pwszIdentity, 
      EapAttributes pAttributeArray, 
      EAP_ERROR ppEapError);
  DWORD (APIENTRY *EapMethodAuthenticatorReceivePacket)(
      EAP_SESSION_HANDLE sessionHandle, 
      DWORD cbReceivePacket, 
      EapPacket pReceivePacket, 
      EAP_METHOD_AUTHENTICATOR_RESPONSE_ACTION pEapOutput, 
      EAP_ERROR ppEapError);
  DWORD (APIENTRY *EapMethodAuthenticatorSendPacket)(
      EAP_SESSION_HANDLE sessionHandle, 
      BYTE bPacketId, 
      DWORD pcbSendPacket, 
      EapPacket pSendPacket, 
      EAP_AUTHENTICATOR_SEND_TIMEOUT pTimeout, 
      EAP_ERROR ppEapError);
  DWORD (APIENTRY *EapMethodAuthenticatorGetAttributes)(
      EAP_SESSION_HANDLE sessionHandle, 
      EapAttributes pAttribs, 
      EAP_ERROR ppEapError);
  DWORD (APIENTRY *EapMethodAuthenticatorSetAttributes)(
      EAP_SESSION_HANDLE sessionHandle, 
      EapAttributes pAttribs, 
      EAP_METHOD_AUTHENTICATOR_RESPONSE_ACTION pEapOutput, 
      EAP_ERROR ppEapError);
  DWORD (APIENTRY *EapMethodAuthenticatorGetResult)(
      EAP_SESSION_HANDLE sessionHandle, 
      EAP_METHOD_AUTHENTICATOR_RESULT pResult, 
      EAP_ERROR ppEapError);
  DWORD (APIENTRY *EapMethodAuthenticatorEndSession)(
      EAP_SESSION_HANDLE sessionHandle, 
      EAP_ERROR ppEapError);
  DWORD (APIENTRY *EapMethodAuthenticatorShutdown)(
      EAP_METHOD_TYPE pEapType, 
      EAP_ERROR ppEapError);
} EAP_AUTHENTICATOR_METHOD_ROUTINES;

VOID WINAPI EapMethodAuthenticatorFreeMemory(
  void *pUIContextData
);

DWORD WINAPI EapMethodAuthenticatorInitialize(
  EAP_METHOD_TYPE *pEapType,
  EAP_ERROR **ppEapError
);

VOID WINAPI EapPeerFreeErrorMemory(
  EAP_ERROR *ppEapError
);

DWORD WINAPI EapMethodAuthenticatorGetResult(
  EAP_SESSION_HANDLE sessionHandle,
  EAP_METHOD_AUTHENTICATOR_RESULT *pResult,
  EAP_ERROR **ppEapError
);

DWORD WINAPI EapMethodAuthenticatorBeginSession(
  DWORD dwFlags,
  LPCWSTR pwszIdentity,
  const EapAttributes *pAttributeArray,
  DWORD dwSizeOfConnectionData,
  const BYTE *pConnectionData,
  DWORD dwMaxSendPacketSize,
  EAP_SESSION_HANDLE *pSessionHandle,
  EAP_ERROR **ppEapError
);

DWORD WINAPI EapMethodAuthenticatorFreeErrorMemory(
  EAP_ERROR *ppEapError
);

DWORD EapMethodAuthenticatorEndSession(
  EAP_SESSION_HANDLE sessionHandle,
  EAP_ERROR **ppEapError
);

DWORD EapMethodAuthenticatorGetAttributes(
  EAP_SESSION_HANDLE sessionHandle,
  EapAttributes *pAttribs,
  EAP_ERROR **ppEapError
);

DWORD EapMethodAuthenticatorGetInfo(
  EAP_METHOD_TYPE *pEapType,
  EAP_AUTHENTICATOR_METHOD_ROUTINES *pEapInfo,
  EAP_ERROR **ppEapError
);

DWORD EapMethodAuthenticatorGetResult(
  EAP_SESSION_HANDLE sessionHandle,
  EAP_METHOD_AUTHENTICATOR_RESULT *pResult,
  EAP_ERROR **ppEapError
);

DWORD WINAPI EapMethodAuthenticatorInvokeConfigUI(
  EAP_METHOD_TYPE *pEapMethodType,
  HWND hwndParent,
  DWORD dwFlags,
  LPCWSTR pwszMachineName,
  DWORD dwSizeOfConfigIn,
  BYTE *pConfigIn,
  DWORD *pdwSizeOfConfigOut,
  BYTE **ppConfigOut,
  EAP_ERROR **pEapError
);

DWORD WINAPI EapMethodAuthenticatorReceivePacket(
  EAP_SESSION_HANDLE sessionHandle,
  DWORD cbReceivePacket,
  const EapPacket *pReceivePacket,
  EAP_METHOD_AUTHENTICATOR_RESPONSE_ACTION *pEapOutput,
  EAP_ERROR **ppEapError
);

DWORD WINAPI EapMethodAuthenticatorSendPacket(
  EAP_SESSION_HANDLE sessionHandle,
  BYTE bPacketId,
  DWORD *pcbSendPacket,
  EapPacket *pSendPacket,
  EAP_AUTHENTICATOR_SEND_TIMEOUT *pTimeout,
  EAP_ERROR **ppEapError
);

DWORD WINAPI EapMethodAuthenticatorSetAttributes(
  EAP_SESSION_HANDLE sessionHandle,
  const EapAttributes *pAttribs,
  EAP_METHOD_AUTHENTICATOR_RESPONSE_ACTION *pEapOutput,
  EAP_ERROR **ppEapError
);

DWORD WINAPI EapMethodAuthenticatorShutdown(
  EAP_METHOD_TYPE *peapType,
  EAP_ERROR **ppEapError
);

DWORD WINAPI EapMethodAuthenticatorUpdateInnerMethodParams(
  EAP_SESSION_HANDLE sessionHandle,
  DWORD dwFlags,
  const WCHAR *pwszIdentity,
  const EapAttributes *pAttributeArray,
  EAP_ERROR **ppEapError
);

#ifdef __cplusplus
}
#endif
#endif /*(_WIN32_WINNT >= 0x0600)*/
#endif /*_INC_EAPMETHODAUTHENTICATORAPIS*/