/**
 * Windows API header module
 *
 * Translated from MinGW Windows headers
 *
 * Authors: Stewart Gordon
 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
 * Source: $(DRUNTIMESRC src/core/sys/windows/_rassapi.d)
 */
module core.sys.windows.rassapi;
version (Windows):
@system:

private import core.sys.windows.lmcons, core.sys.windows.windef;

// FIXME: check types of constants

enum size_t
    RASSAPI_MAX_PHONENUMBER_SIZE = 128,
    RASSAPI_MAX_MEDIA_NAME       =  16,
    RASSAPI_MAX_PORT_NAME        =  16,
    RASSAPI_MAX_DEVICE_NAME      = 128,
    RASSAPI_MAX_DEVICETYPE_NAME  =  16,
    RASSAPI_MAX_PARAM_KEY_SIZE   =  32;

enum RASPRIV_NoCallback        = 0x01;
enum RASPRIV_AdminSetCallback  = 0x02;
enum RASPRIV_CallerSetCallback = 0x04;
enum RASPRIV_DialinPrivilege   = 0x08;
enum RASPRIV_CallbackType      = 0x07;

enum {
    RAS_MODEM_OPERATIONAL = 1,
    RAS_MODEM_NOT_RESPONDING,
    RAS_MODEM_HARDWARE_FAILURE,
    RAS_MODEM_INCORRECT_RESPONSE,
    RAS_MODEM_UNKNOWN  // = 5
}

enum {
    RAS_PORT_NON_OPERATIONAL = 1,
    RAS_PORT_DISCONNECTED,
    RAS_PORT_CALLING_BACK,
    RAS_PORT_LISTENING,
    RAS_PORT_AUTHENTICATING,
    RAS_PORT_AUTHENTICATED,
    RAS_PORT_INITIALIZING // = 7
}

enum {
    MEDIA_UNKNOWN,
    MEDIA_SERIAL,
    MEDIA_RAS10_SERIAL,
    MEDIA_X25,
    MEDIA_ISDN
}

enum USER_AUTHENTICATED = 0x0001;
enum MESSENGER_PRESENT  = 0x0002;
enum PPP_CLIENT         = 0x0004;
enum GATEWAY_ACTIVE     = 0x0008;
enum REMOTE_LISTEN      = 0x0010;
enum PORT_MULTILINKED   = 0x0020;

enum size_t
    RAS_IPADDRESSLEN  = 15,
    RAS_IPXADDRESSLEN = 22,
    RAS_ATADDRESSLEN  = 32;

// FIXME: should these be grouped together?
enum {
    RASDOWNLEVEL     = 10,
    RASADMIN_35      = 35,
    RASADMIN_CURRENT = 40
}

alias ULONG IPADDR;

enum RAS_PARAMS_FORMAT {
    ParamNumber = 0,
    ParamString
}

union RAS_PARAMS_VALUE {
    DWORD Number;
    struct _String {
        DWORD Length;
        PCHAR Data;
    }
    _String String;
}

struct RAS_PARAMETERS {
    CHAR[RASSAPI_MAX_PARAM_KEY_SIZE] P_Key = 0;
    RAS_PARAMS_FORMAT                P_Type;
    BYTE                             P_Attributes;
    RAS_PARAMS_VALUE                 P_Value;
}

struct RAS_USER_0 {
    BYTE                                    bfPrivilege;
    WCHAR[RASSAPI_MAX_PHONENUMBER_SIZE + 1] szPhoneNumber = 0;
}
alias RAS_USER_0* PRAS_USER_0;

struct RAS_PORT_0 {
    WCHAR[RASSAPI_MAX_PORT_NAME]       wszPortName = 0;
    WCHAR[RASSAPI_MAX_DEVICETYPE_NAME] wszDeviceType = 0;
    WCHAR[RASSAPI_MAX_DEVICE_NAME]     wszDeviceName = 0;
    WCHAR[RASSAPI_MAX_MEDIA_NAME]      wszMediaName = 0;
    DWORD                              reserved;
    DWORD                              Flags;
    WCHAR[UNLEN + 1]                   wszUserName = 0;
    WCHAR[NETBIOS_NAME_LEN]            wszComputer = 0;
    DWORD                              dwStartSessionTime; // seconds from 1/1/1970
    WCHAR[DNLEN + 1]                   wszLogonDomain = 0;
    BOOL                               fAdvancedServer;
}
alias RAS_PORT_0* PRAS_PORT_0;

struct RAS_PPP_NBFCP_RESULT {
    DWORD dwError;
    DWORD dwNetBiosError;
    CHAR[NETBIOS_NAME_LEN + 1]  szName = 0;
    WCHAR[NETBIOS_NAME_LEN + 1] wszWksta = 0;
}

struct RAS_PPP_IPCP_RESULT {
    DWORD dwError;
    WCHAR[RAS_IPADDRESSLEN + 1] wszAddress = 0;
}

struct RAS_PPP_IPXCP_RESULT {
    DWORD dwError;
    WCHAR[RAS_IPXADDRESSLEN + 1] wszAddress = 0;
}

struct RAS_PPP_ATCP_RESULT {
    DWORD dwError;
    WCHAR[RAS_ATADDRESSLEN + 1] wszAddress = 0;
}

struct RAS_PPP_PROJECTION_RESULT {
    RAS_PPP_NBFCP_RESULT nbf;
    RAS_PPP_IPCP_RESULT  ip;
    RAS_PPP_IPXCP_RESULT ipx;
    RAS_PPP_ATCP_RESULT  at;
}

struct RAS_PORT_1 {
    RAS_PORT_0 rasport0;
    DWORD      LineCondition;
    DWORD      HardwareCondition;
    DWORD      LineSpeed;
    WORD       NumStatistics;
    WORD       NumMediaParms;
    DWORD      SizeMediaParms;
    RAS_PPP_PROJECTION_RESULT ProjResult;
}
alias RAS_PORT_1* PRAS_PORT_1;

struct RAS_PORT_STATISTICS {
    DWORD dwBytesXmited;
    DWORD dwBytesRcved;
    DWORD dwFramesXmited;
    DWORD dwFramesRcved;
    DWORD dwCrcErr;
    DWORD dwTimeoutErr;
    DWORD dwAlignmentErr;
    DWORD dwHardwareOverrunErr;
    DWORD dwFramingErr;
    DWORD dwBufferOverrunErr;
    DWORD dwBytesXmitedUncompressed;
    DWORD dwBytesRcvedUncompressed;
    DWORD dwBytesXmitedCompressed;
    DWORD dwBytesRcvedCompressed;
    DWORD dwPortBytesXmited;
    DWORD dwPortBytesRcved;
    DWORD dwPortFramesXmited;
    DWORD dwPortFramesRcved;
    DWORD dwPortCrcErr;
    DWORD dwPortTimeoutErr;
    DWORD dwPortAlignmentErr;
    DWORD dwPortHardwareOverrunErr;
    DWORD dwPortFramingErr;
    DWORD dwPortBufferOverrunErr;
    DWORD dwPortBytesXmitedUncompressed;
    DWORD dwPortBytesRcvedUncompressed;
    DWORD dwPortBytesXmitedCompressed;
    DWORD dwPortBytesRcvedCompressed;
}
alias RAS_PORT_STATISTICS* PRAS_PORT_STATISTICS;

struct RAS_SERVER_0 {
    WORD TotalPorts;
    WORD PortsInUse;
    DWORD RasVersion;
}
alias RAS_SERVER_0* PRAS_SERVER_0;

extern (Windows) {
    DWORD RasAdminServerGetInfo(const(WCHAR)*, PRAS_SERVER_0);
    DWORD RasAdminGetUserAccountServer(const(WCHAR)*, const(WCHAR)*, LPWSTR);
    DWORD RasAdminUserGetInfo(const(WCHAR)*, const(WCHAR)*, PRAS_USER_0);
    DWORD RasAdminUserSetInfo(const(WCHAR)*, const(WCHAR)*, PRAS_USER_0);
    DWORD RasAdminPortEnum(WCHAR*, PRAS_PORT_0*, WORD*);
    DWORD RasAdminPortGetInfo(const(WCHAR)*, const(WCHAR)*, RAS_PORT_1*,
     RAS_PORT_STATISTICS*, RAS_PARAMETERS**);
    DWORD RasAdminPortClearStatistics(const(WCHAR)*, const(WCHAR)*);
    DWORD RasAdminPortDisconnect(const(WCHAR)*, const(WCHAR)*);
    DWORD RasAdminFreeBuffer(PVOID);
    DWORD RasAdminGetErrorString(UINT, WCHAR*, DWORD);
    BOOL RasAdminAcceptNewConnection(RAS_PORT_1*, RAS_PORT_STATISTICS*,
     RAS_PARAMETERS*);
    VOID RasAdminConnectionHangupNotification(RAS_PORT_1*,
      RAS_PORT_STATISTICS*, RAS_PARAMETERS*);
    DWORD RasAdminGetIpAddressForUser (WCHAR*, WCHAR*, IPADDR*, BOOL*);
    VOID RasAdminReleaseIpAddress (WCHAR*, WCHAR*,IPADDR*);
    DWORD RasAdminGetUserParms(WCHAR*, PRAS_USER_0);
    DWORD RasAdminSetUserParms(WCHAR*, DWORD, PRAS_USER_0);
}
