#ifndef _AF_IRDA_H
#define _AF_IRDA_H

/* Winsock 1.1; IrDA 1.1 */
/* Define one of _WIN32_WINNT, _WIN32_WINDOWS, _WIN32_WCE */

#ifndef _WINSOCK_H
typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned int u_int;
typedef unsigned long u_long;
#endif

#define WINDOWS_AF_IRDA  26
#define WINDOWS_PF_IRDA  WINDOWS_AF_IRDA

#define WCE_AF_IRDA  22
#define WCE_PF_IRDA  WCE_AF_IRDA

#if defined(_WIN32_WINNT) || defined(_WIN32_WINDOWS)
#ifndef AF_IRDA
#define AF_IRDA  WINDOWS_AF_IRDA
#endif
#define IRDA_PROTO_SOCK_STREAM  1
#elif defined(_WIN32_WCE)
#define AF_IRDA  WCE_AF_IRDA
#else
#pragma message("One of _WIN32_WINNT | _WIN32_WINDOWS | _WIN32_WCE must be defined.")
#endif

#define PF_IRDA  AF_IRDA

#define SOL_IRLMP  0x00FF

#define IRLMP_ENUMDEVICES  0x00000010
#define IRLMP_IAS_SET  0x00000011
#define IRLMP_IAS_QUERY  0x00000012
#define IRLMP_SEND_PDU_LEN  0x00000013
#define IRLMP_EXCLUSIVE_MODE  0x00000014
#define IRLMP_IRLPT_MODE  0x00000015
#define IRLMP_9WIRE_MODE  0x00000016
#define IRLMP_TINYTP_MODE  0x00000017
#define IRLMP_PARAMETERS  0x00000018
#define IRLMP_DISCOVERY_MODE  0x00000019
#define IRLMP_SHARP_MODE  0x00000020

#if defined(_WIN32_WINNT)
#define SIO_LAZY_DISCOVERY  _IOR('t',127,u_long)
#endif

#define IAS_ATTRIB_NO_CLASS  0x00000010
#define IAS_ATTRIB_NO_ATTRIB  0x00000000
#define IAS_ATTRIB_INT  0x00000001
#define IAS_ATTRIB_OCTETSEQ  0x00000002
#define IAS_ATTRIB_STR  0x00000003

#define IAS_MAX_USER_STRING  256
#define IAS_MAX_OCTET_STRING  1024
#define IAS_MAX_CLASSNAME  64
#define IAS_MAX_ATTRIBNAME  256

#define LmCharSetASCII  0
#define LmCharSetISO_8859_1  1
#define LmCharSetISO_8859_2  2
#define LmCharSetISO_8859_3  3
#define LmCharSetISO_8859_4  4
#define LmCharSetISO_8859_5  5
#define LmCharSetISO_8859_6  6
#define LmCharSetISO_8859_7  7
#define LmCharSetISO_8859_8  8
#define LmCharSetISO_8859_9  9
#define LmCharSetUNICODE  0xff

#define LM_BAUD_1200  1200
#define LM_BAUD_2400  2400
#define LM_BAUD_9600  9600
#define LM_BAUD_19200  19200
#define LM_BAUD_38400  38400
#define LM_BAUD_57600  57600
#define LM_BAUD_115200  115200
#define LM_BAUD_576K  576000
#define LM_BAUD_1152K  1152000
#define LM_BAUD_4M  4000000

enum {
    LM_HB_Extension = 128,
    LM_HB1_PnP = 1,
    LM_HB1_PDA_Palmtop = 2,
    LM_HB1_Computer = 4,
    LM_HB1_Printer = 8,
    LM_HB1_Modem = 16,
    LM_HB1_Fax = 32,
    LM_HB1_LANAccess = 64,
    LM_HB2_Telephony = 1,
    LM_HB2_FileServer = 2,
};

typedef u_long LM_BAUD_RATE;

typedef struct {
    u_long nTXDataBytes;
    u_long nRXDataBytes;
    LM_BAUD_RATE nBaudRate;
    u_long thresholdTime;
    u_long discTime;
    u_short nMSLinkTurn;
    u_char nTXPackets;
    u_char nRXPackets;
} LM_IRPARMS, *PLM_IRPARMS;

typedef struct _SOCKADDR_IRDA {
    u_short irdaAddressFamily;
    u_char irdaDeviceID[4];
    char irdaServiceName[25];
} SOCKADDR_IRDA, *PSOCKADDR_IRDA, *LPSOCKADDR_IRDA;

typedef struct _WINDOWS_IRDA_DEVICE_INFO {
    u_char irdaDeviceID[4];
    char irdaDeviceName[22];
    u_char irdaDeviceHints1;
    u_char irdaDeviceHints2;
    u_char irdaCharSet;
} WINDOWS_IRDA_DEVICE_INFO, *PWINDOWS_IRDA_DEVICE_INFO, *LPWINDOWS_IRDA_DEVICE_INFO;

typedef struct _WCE_IRDA_DEVICE_INFO {
    u_char irdaDeviceID[4];
    char irdaDeviceName[22];
    u_char Reserved[2];
} WCE_IRDA_DEVICE_INFO, *PWCE_IRDA_DEVICE_INFO;

typedef struct _WINDOWS_DEVICELIST {
    ULONG numDevice;
    WINDOWS_IRDA_DEVICE_INFO Device[1];
} WINDOWS_DEVICELIST, *PWINDOWS_DEVICELIST, *LPWINDOWS_DEVICELIST;

typedef struct _WCE_DEVICELIST {
    ULONG numDevice;
    WCE_IRDA_DEVICE_INFO Device[1];
} WCE_DEVICELIST, *PWCE_DEVICELIST;

typedef struct _WINDOWS_IAS_SET {
    char irdaClassName[IAS_MAX_CLASSNAME];
    char irdaAttribName[IAS_MAX_ATTRIBNAME];
    u_long irdaAttribType;
    union {
        LONG irdaAttribInt;
        struct {
            u_short Len;
            u_char OctetSeq[IAS_MAX_OCTET_STRING];
        } irdaAttribOctetSeq;
        struct {
            u_char Len;
            u_char CharSet;
            u_char UsrStr[IAS_MAX_USER_STRING];
        } irdaAttribUsrStr;
    } irdaAttribute;
} WINDOWS_IAS_SET, *PWINDOWS_IAS_SET, *LPWINDOWS_IAS_SET;

typedef struct _WINDOWS_IAS_QUERY {
    u_char  irdaDeviceID[4];
    char irdaClassName[IAS_MAX_CLASSNAME];
    char irdaAttribName[IAS_MAX_ATTRIBNAME];
    u_long irdaAttribType;
    union {
        LONG irdaAttribInt;
        struct {
            u_long Len;
            u_char OctetSeq[IAS_MAX_OCTET_STRING];
        } irdaAttribOctetSeq;
        struct {
            u_long Len;
            u_long CharSet;
            u_char UsrStr[IAS_MAX_USER_STRING];
        } irdaAttribUsrStr;
    } irdaAttribute;
} WINDOWS_IAS_QUERY, *PWINDOWS_IAS_QUERY, *LPWINDOWS_IAS_QUERY;

typedef struct _WCE_IAS_SET {
    char irdaClassName[61];
    char irdaAttribName[61];
    u_short irdaAttribType;
    union {
        int irdaAttribInt;
        struct {
            int Len;
            u_char OctetSeq[1];
            u_char Reserved[3];
        } irdaAttribOctetSeq;
        struct {
            int Len;
            u_char CharSet;
            u_char UsrStr[1];
            u_char Reserved[2];
        } irdaAttribUsrStr;
    } irdaAttribute;
} WCE_IAS_SET, *PWCE_IAS_SET;

typedef struct _WCE_IAS_QUERY {
    u_char irdaDeviceID[4];
    char irdaClassName[61];
    char irdaAttribName[61];
    u_short irdaAttribType;
    union {
        int irdaAttribInt;
        struct {
            int Len;
            u_char OctetSeq[1];
            u_char Reserved[3];
        } irdaAttribOctetSeq;
        struct {
            int Len;
            u_char CharSet;
            u_char UsrStr[1];
            u_char Reserved[2];
        } irdaAttribUsrStr;
    } irdaAttribute;
} WCE_IAS_QUERY, *PWCE_IAS_QUERY;

#if defined(_WIN32_WINNT) || defined(_WIN32_WINDOWS)
typedef WINDOWS_IRDA_DEVICE_INFO  IRDA_DEVICE_INFO, *PIRDA_DEVICE_INFO, *LPIRDA_DEVICE_INFO;
typedef WINDOWS_DEVICELIST  DEVICELIST, *PDEVICELIST, *LPDEVICELIST;
typedef WINDOWS_IAS_SET  IAS_SET, *PIAS_SET, *LPIASSET;
typedef WINDOWS_IAS_QUERY  IAS_QUERY, *PIAS_QUERY, *LPIASQUERY;
#elif defined(_WIN32_WCE)
typedef WCE_IRDA_DEVICE_INFO  IRDA_DEVICE_INFO, *PIRDA_DEVICE_INFO;
typedef WCE_DEVICELIST  DEVICELIST, *PDEVICELIST;
typedef WCE_IAS_SET  IAS_SET, *PIAS_SET;
typedef WCE_IAS_QUERY  IAS_QUERY, *PIAS_QUERY, *LPIASQUERY;
#else
#pragma message("One of _WIN32_WINNT | _WIN32_WINDOWS | _WIN32_WCE must be defined.")
#endif

#endif /* _AF_IRDA_H */
