restemplate/indy/System/IdStackConsts.pas

945 lines
37 KiB
Plaintext

{
$Project$
$Workfile$
$Revision$
$DateUTC$
$Id$
This file is part of the Indy (Internet Direct) project, and is offered
under the dual-licensing agreement described on the Indy website.
(http://www.indyproject.org/)
Copyright:
(c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
}
{
$Log$
}
{
Rev 1.0 2004.02.07 12:25:16 PM czhower
Recheckin to fix case of filename
Rev 1.1 2/7/2004 5:20:06 AM JPMugaas
Added some constants that were pasted from other places. DotNET uses the
standard Winsock 2 error consstants. We don't want to link to IdWInsock or
Windows though because that causes other problems.
Rev 1.0 2004.02.03 3:14:44 PM czhower
Move and updates
Rev 1.12 2003.12.28 6:53:46 PM czhower
Added some consts.
Rev 1.11 10/28/2003 9:14:54 PM BGooijen
.net
Rev 1.10 10/19/2003 10:46:18 PM BGooijen
Added more consts
Rev 1.9 10/19/2003 9:15:28 PM BGooijen
added some SocketOptionName consts for dotnet
Rev 1.8 10/19/2003 5:21:30 PM BGooijen
SetSocketOption
Rev 1.7 10/2/2003 7:31:18 PM BGooijen
.net
Rev 1.6 2003.10.02 10:16:32 AM czhower
.Net
Rev 1.5 2003.10.01 5:05:18 PM czhower
.Net
Rev 1.4 2003.10.01 1:12:40 AM czhower
.Net
Rev 1.3 2003.09.30 12:09:38 PM czhower
DotNet changes.
Rev 1.2 9/29/2003 10:28:30 PM BGooijen
Added constants for DotNet
Rev 1.1 12-14-2002 14:58:34 BGooijen
Added definition for Id_SOCK_RDM and Id_SOCK_SEQPACKET
Rev 1.0 11/13/2002 08:59:14 AM JPMugaas
}
unit IdStackConsts;
interface
{$I IdCompilerDefines.inc}
{ This should be the only unit except OS Stack units that reference
Winsock or lnxsock }
uses
{$IFDEF DOTNET}
System.Net.Sockets;
{$ENDIF}
//TODO: I'm not really sure how other platforms are supported with asockets header
//Do I use the sockets unit or do something totally different for each platform
{$IFDEF WINDOWS}
IdWship6, //for some constants that supplement IdWinsock
IdWinsock2;
{$ENDIF}
{$IFDEF OS2}
pmwsock;
{$ENDIF}
{$IFDEF SOCKETTYPE_IS_CINT}
IdCTypes,
{$ENDIF}
{$IFDEF NETWARE_CLIB}
winsock; //not sure if this is correct
{$ENDIF}
{$IFDEF NETWARE_LIBC}
winsock; //not sure if this is correct
{$ENDIF}
{$IFDEF MACOS_CLASSIC}
{$ENDIF}
{$IFDEF UNIX}
{$IFDEF USE_VCL_POSIX}
{
IMPORTANT!!!
The new Posix units have platform specific stuff. Since this code and
the definitions are not intented to be compiled in non-Unix-like operating
systems, platform warnings are not going to be too helpful.
}
{$I IdSymbolPlatformOff.inc}
IdVCLPosixSupplemental,
Posix.Errno,Posix.NetDB, Posix.NetinetIn, Posix.SysSocket;
{$ENDIF}
{$IFDEF KYLIXCOMPAT}
libc;
{$ENDIF}
{$IFDEF USE_BASEUNIX}
Sockets, BaseUnix, Unix; // FPC "native" Unix units.
//Marco may want to change the socket interface unit
//so we don't use the libc header.
{$ENDIF}
{$ENDIF}
type
{$IFDEF USE_BASEUNIX}
TSocket = cint; // TSocket is afaik not POSIX, so we have to add it
// (Socket() returns a C int according to opengroup)
{$ENDIF}
TIdStackSocketHandle =
{$IFDEF DOTNET}
Socket
{$ELSE}
{$IFDEF USE_VCL_POSIX}
Integer
{$ELSE}
TSocket
{$ENDIF}
{$ENDIF};
var
Id_SO_True: Integer = 1;
Id_SO_False: Integer = 0;
const
{$IFDEF DOTNET}
Id_IPV6_UNICAST_HOPS = SocketOptionName.IpTimeToLive;
Id_IPV6_MULTICAST_IF = SocketOptionName.MulticastInterface;
Id_IPV6_MULTICAST_HOPS = SocketOptionName.MulticastTimeToLive;
Id_IPV6_MULTICAST_LOOP = SocketOptionName.MulticastLoopback;
Id_IPV6_ADD_MEMBERSHIP = SocketOptionName.AddMembership;
Id_IPV6_DROP_MEMBERSHIP = SocketOptionName.DropMembership;
Id_IPV6_PKTINFO = SocketOptionName.PacketInformation;
Id_IP_MULTICAST_TTL = SocketOptionName.MulticastTimeToLive;
Id_IP_MULTICAST_LOOP = SocketOptionName.MulticastLoopback;
Id_IP_ADD_MEMBERSHIP = SocketOptionName.AddMembership;
Id_IP_DROP_MEMBERSHIP = SocketOptionName.DropMembership;
Id_IP_HDR_INCLUDED = SocketOptionName.HeaderIncluded;
{$ENDIF}
{$IFDEF UNIX}
Id_IPV6_UNICAST_HOPS = IPV6_UNICAST_HOPS;
Id_IPV6_MULTICAST_IF = IPV6_MULTICAST_IF;
Id_IPV6_MULTICAST_HOPS = IPV6_MULTICAST_HOPS;
Id_IPV6_MULTICAST_LOOP = IPV6_MULTICAST_LOOP;
{$IFDEF LINUX}
// These are probably leftovers from the non-final IPV6 KAME standard
// in Linux. They only seem to exist in Linux, others use
// the standarised versions.
// Probably the JOIN_GROUP ones replaced these,
// but they have different numbers in Linux, and possibly
// also different behaviour?
{$IFNDEF KYLIX}
{$IFDEF USE_BASEUNIX}
//In Linux, the libc.pp header maps the old values to new ones,
//probably for consistancy. I'm doing this because we can't link
//to Libc for Basic Unix stuff and some people may want to use this API
//in Linux instead of the libc API.
IPV6_ADD_MEMBERSHIP = IPV6_JOIN_GROUP;
IPV6_DROP_MEMBERSHIP = IPV6_LEAVE_GROUP;
{$ENDIF}
{$ENDIF}
{$ELSE}
// FIXME: Android compiler is using these definitions, but maybe some
// EXTERNALSYM-work is needed above.
IPV6_ADD_MEMBERSHIP = IPV6_JOIN_GROUP;
{$EXTERNALSYM IPV6_ADD_MEMBERSHIP}
IPV6_DROP_MEMBERSHIP = IPV6_LEAVE_GROUP;
{$EXTERNALSYM IPV6_DROP_MEMBERSHIP}
{$IFNDEF USE_VCL_POSIX}
IPV6_CHECKSUM = 26;
{$ENDIF}
{$ENDIF}
Id_IPV6_ADD_MEMBERSHIP = IPV6_ADD_MEMBERSHIP;
Id_IPV6_DROP_MEMBERSHIP = IPV6_DROP_MEMBERSHIP;
Id_IPV6_PKTINFO = IPV6_PKTINFO;
Id_IPV6_HOPLIMIT = IPV6_HOPLIMIT;
Id_IP_MULTICAST_TTL = IP_MULTICAST_TTL; // TODO integrate into IdStackConsts
Id_IP_MULTICAST_LOOP = IP_MULTICAST_LOOP; // TODO integrate into IdStackConsts
Id_IP_ADD_MEMBERSHIP = IP_ADD_MEMBERSHIP; // TODO integrate into IdStackConsts
Id_IP_DROP_MEMBERSHIP = IP_DROP_MEMBERSHIP; // TODO integrate into IdStackConsts
//In Windows CE 4.2, IP_HDRINCL may not be supported.
Id_IP_HDR_INCLUDED = IP_HDRINCL; // TODO integrate into IdStackConsts
{$ENDIF}
{$IFDEF WINDOWS}
Id_IPV6_HDRINCL = IPV6_HDRINCL;
Id_IPV6_UNICAST_HOPS = IPV6_UNICAST_HOPS;
Id_IPV6_MULTICAST_IF = IPV6_MULTICAST_IF;
Id_IPV6_MULTICAST_HOPS = IPV6_MULTICAST_HOPS;
Id_IPV6_MULTICAST_LOOP = IPV6_MULTICAST_LOOP;
Id_IPV6_ADD_MEMBERSHIP = IPV6_ADD_MEMBERSHIP;
Id_IPV6_DROP_MEMBERSHIP = IPV6_DROP_MEMBERSHIP;
Id_IPV6_PKTINFO = IPV6_PKTINFO;
Id_IPV6_HOPLIMIT = IPV6_HOPLIMIT;
Id_IP_MULTICAST_TTL = 10; // TODO integrate into IdStackConsts FIX ERROR in IdWinsock
Id_IP_MULTICAST_LOOP = 11; // TODO integrate into IdStackConsts FIX ERROR in IdWinsock
Id_IP_ADD_MEMBERSHIP = 12; // TODO integrate into IdStackConsts FIX ERROR in IdWinsock
Id_IP_DROP_MEMBERSHIP = 13; // TODO integrate into IdStackConsts FIX ERROR in IdWinsock
Id_IP_HDR_INCLUDED = 2; // TODO integrate into IdStackConsts FIX ERROR in IdWinsock
{$ENDIF}
(*
There seems to be an error in the correct values of multicast values in IdWinsock
The values should be:
ip_options = 1; //* set/get IP options */
ip_hdrincl = 2; //* header is included with data */
ip_tos = 3; //* IP type of service and preced*/
ip_ttl = 4; //* IP time to live */
ip_multicast_if = 9; //* set/get IP multicast i/f */
ip_multicast_ttl = 10; //* set/get IP multicast ttl */
ip_multicast_loop = 11; //*set/get IP multicast loopback */
ip_add_membership = 12; //* add an IP group membership */
ip_drop_membership = 13; //* drop an IP group membership */
ip_dontfragment = 14; //* don't fragment IP datagrams */ {Do not Localize}
*)
{$IFDEF UNIX}
TCP_NODELAY = 1;
{$ENDIF}
// Protocol Family
{$IFNDEF DOTNET}
{$IFDEF USE_VCL_POSIX}
Id_PF_INET4 = AF_INET;
Id_PF_INET6 = AF_INET6;
{$ELSE}
Id_PF_INET4 = PF_INET;
Id_PF_INET6 = PF_INET6;
{$ENDIF}
{$ELSE}
Id_PF_INET4 = ProtocolFamily.InterNetwork;
Id_PF_INET6 = ProtocolFamily.InterNetworkV6;
{$ENDIF}
{$IFDEF USE_BASEUNIX}
// These constants are actually WinSock specific, not std TCP/IP
// FPC doesn't emulate WinSock.
INVALID_SOCKET = -1;
SOCKET_ERROR = -1;
{$ENDIF}
type
// Socket Type
{$IFDEF SOCKETTYPE_IS_CINT}
TIdSocketType = TIdC_INT;
{$ENDIF}
{$IFDEF SOCKETTYPE_IS___SOCKETTYPE}
TIdSocketType = __socket_type;
{$ENDIF}
{$IFDEF SOCKETTYPE_IS_LONGINT}
TIdSocketType = Integer;
{$ENDIF}
{$IFDEF SOCKETTYPE_IS_SOCKETTYPE}
TIdSocketType = SocketType;
{$ENDIF}
const
// {$IFNDEF DOTNET}
// {$IFDEF KYLIXCOMPAT}
// Id_SOCK_STREAM = TIdSocketType(SOCK_STREAM); //1 /* stream socket */
// Id_SOCK_DGRAM = TIdSocketType(SOCK_DGRAM); //2 /* datagram socket */
// Id_SOCK_RAW = TIdSocketType(SOCK_RAW); //3 /* raw-protocol interface */
// Id_SOCK_RDM = TIdSocketType(SOCK_RDM); //4 /* reliably-delivered message */
// Id_SOCK_SEQPACKET = SOCK_SEQPACKET; //5 /* sequenced packet stream */
// {$ELSE}
// Id_SOCK_STREAM = SOCK_STREAM; //1 /* stream socket */
// Id_SOCK_DGRAM = SOCK_DGRAM; //2 /* datagram socket */
// Id_SOCK_RAW = SOCK_RAW; //3 /* raw-protocol interface */
// Id_SOCK_RDM = SOCK_RDM; //4 /* reliably-delivered message */
// Id_SOCK_SEQPACKET = SOCK_SEQPACKET; //5 /* sequenced packet stream */
// {$ENDIF}
{$IFDEF SOCKETTYPE_IS_SOCKETTYPE}
Id_SOCK_STREAM = SocketType.Stream; // /* stream socket */
Id_SOCK_DGRAM = SocketType.Dgram; // /* datagram socket */
Id_SOCK_RAW = SocketType.Raw; // /* raw-protocol interface */
Id_SOCK_RDM = SocketType.Rdm; // /* reliably-delivered message */
Id_SOCK_SEQPACKET = SocketType.Seqpacket; // /* sequenced packet stream */
Id_SOCK_UNKNOWN = SocketType.Unknown; // /* unknown */
{$ELSE}
Id_SOCK_UNKNOWN = TIdSocketType(0);
Id_SOCK_STREAM = TIdSocketType(SOCK_STREAM); //1 /* stream socket */
Id_SOCK_DGRAM = TIdSocketType(SOCK_DGRAM); //2 /* datagram socket */
Id_SOCK_RAW = TIdSocketType(SOCK_RAW); //3 /* raw-protocol interface */
{$IFNDEF USE_VCL_POSIX}
Id_SOCK_RDM = TIdSocketType(SOCK_RDM); //4 /* reliably-delivered message */
{$ENDIF}
Id_SOCK_SEQPACKET = SOCK_SEQPACKET; //5 /* sequenced packet stream */
{$ENDIF}
type
// IP Protocol type
TIdSocketProtocol = {$IFDEF DOTNET}ProtocolType{$ELSE}Integer{$ENDIF};
TIdSocketOption = {$IFDEF DOTNET}SocketOptionName{$ELSE}Integer{$ENDIF};
TIdSocketOptionLevel = {$IFDEF DOTNET}SocketOptionLevel{$ELSE}Integer{$ENDIF};
const
{$IFNDEF DOTNET}
{$IFDEF OS2}
Id_IPPROTO_GGP = IPPROTO_GGP; //OS/2 does something strange and we might wind up
//supporting it later for all we know.
{$ELSE}
Id_IPPROTO_GGP = 3;// IPPROTO_GGP; may not be defined in some headers in FPC
{$ENDIF}
Id_IPPROTO_ICMP = IPPROTO_ICMP;
Id_IPPROTO_ICMPV6 = IPPROTO_ICMPV6;
{$IFNDEF USE_VCL_POSIX}
Id_IPPROTO_IDP = IPPROTO_IDP;
Id_IPPROTO_IGMP = IPPROTO_IGMP;
{$ENDIF}
Id_IPPROTO_IP = IPPROTO_IP;
Id_IPPROTO_IPv6 = IPPROTO_IPV6;
Id_IPPROTO_ND = 77; //IPPROTO_ND; is not defined in some headers in FPC
Id_IPPROTO_PUP = IPPROTO_PUP;
Id_IPPROTO_RAW = IPPROTO_RAW;
Id_IPPROTO_TCP = IPPROTO_TCP;
Id_IPPROTO_UDP = IPPROTO_UDP;
Id_IPPROTO_MAX = IPPROTO_MAX;
{$ELSE}
Id_IPPROTO_GGP = ProtocolType.Ggp; //Gateway To Gateway Protocol.
Id_IPPROTO_ICMP = ProtocolType.Icmp; //Internet Control Message Protocol.
Id_IPPROTO_ICMPv6 = ProtocolType.IcmpV6; //ICMP for IPv6
Id_IPPROTO_IDP = ProtocolType.Idp; //IDP Protocol.
Id_IPPROTO_IGMP = ProtocolType.Igmp; //Internet Group Management Protocol.
Id_IPPROTO_IP = ProtocolType.IP; //Internet Protocol.
Id_IPPROTO_IPv6 = ProtocolType.IPv6;
Id_IPPROTO_IPX = ProtocolType.Ipx; //IPX Protocol.
Id_IPPROTO_ND = ProtocolType.ND; //Net Disk Protocol (unofficial).
Id_IPPROTO_PUP = ProtocolType.Pup; //PUP Protocol.
Id_IPPROTO_RAW = ProtocolType.Raw; //Raw UP packet protocol.
Id_IPPROTO_SPX = ProtocolType.Spx; //SPX Protocol.
Id_IPPROTO_SPXII = ProtocolType.SpxII; //SPX Version 2 Protocol.
Id_IPPROTO_TCP = ProtocolType.Tcp; //Transmission Control Protocol.
Id_IPPROTO_UDP = ProtocolType.Udp; //User Datagram Protocol.
Id_IPPROTO_UNKNOWN = ProtocolType.Unknown; //Unknown protocol.
Id_IPPROTO_UNSPECIFIED = ProtocolType.Unspecified; //unspecified protocol.
// Id_IPPROTO_MAX = ProtocolType.; ?????????????????????
{$ENDIF}
// Socket Option level
{$IFNDEF DOTNET}
Id_SOL_SOCKET = SOL_SOCKET;
Id_SOL_IP = IPPROTO_IP;
Id_SOL_IPv6 = IPPROTO_IPV6;
Id_SOL_TCP = IPPROTO_TCP;
Id_SOL_UDP = IPPROTO_UDP;
{$ELSE}
Id_SOL_SOCKET = SocketOptionLevel.Socket;
Id_SOL_IP = SocketOptionLevel.Ip;
Id_SOL_IPv6 = SocketOptionLevel.IPv6;
Id_SOL_TCP = SocketOptionLevel.Tcp;
Id_SOL_UDP = SocketOptionLevel.Udp;
{$ENDIF}
// Socket options
{$IFNDEF DOTNET}
{$IFNDEF WINDOWS}
SO_DONTLINGER = not SO_LINGER;
{$EXTERNALSYM SO_DONTLINGER}
{$ENDIF}
Id_SO_BROADCAST = SO_BROADCAST;
Id_SO_DEBUG = SO_DEBUG;
Id_SO_DONTLINGER = SO_DONTLINGER;
Id_SO_DONTROUTE = SO_DONTROUTE;
Id_SO_KEEPALIVE = SO_KEEPALIVE;
Id_SO_LINGER = SO_LINGER;
Id_SO_OOBINLINE = SO_OOBINLINE;
Id_SO_RCVBUF = SO_RCVBUF;
Id_SO_REUSEADDR = SO_REUSEADDR;
Id_SO_SNDBUF = SO_SNDBUF;
Id_SO_TYPE = SO_TYPE;
{$IFDEF WINDOWS}
Id_SO_UPDATE_ACCEPT_CONTEXT = SO_UPDATE_ACCEPT_CONTEXT;
Id_SO_UPDATE_CONNECT_CONTEXT = SO_UPDATE_CONNECT_CONTEXT;
{$ENDIF}
{$ELSE}
{
SocketOptionName.AcceptConnection;// Socket is listening.
SocketOptionName.AddMembership;// Add an IP group membership.
SocketOptionName.AddSourceMembership;// Join a source group.
SocketOptionName.BlockSource;// Block data from a source.
}
Id_SO_BROADCAST = SocketOptionName.Broadcast;// Permit sending broadcast messages on the socket.
{
SocketOptionName.BsdUrgent;// Use urgent data as defined in RFC-1222. This option can be set only once, and once set, cannot be turned off.
SocketOptionName.ChecksumCoverage;// Set or get UDP checksum coverage.
}
Id_SO_DEBUG = SocketOptionName.Debug;// Record debugging information.
{
SocketOptionName.DontFragment;// Do not fragment IP datagrams.
}
Id_SO_DONTLINGER = SocketOptionName.DontLinger;// Close socket gracefully without lingering.
Id_SO_DONTROUTE = SocketOptionName.DontRoute;// Do not route; send directly to interface addresses.
{
SocketOptionName.DropMembership;// Drop an IP group membership.
SocketOptionName.DropSourceMembership;// Drop a source group.
SocketOptionName.Error;// Get error status and clear.
SocketOptionName.ExclusiveAddressUse;// Enables a socket to be bound for exclusive access.
SocketOptionName.Expedited;// Use expedited data as defined in RFC-1222. This option can be set only once, and once set, cannot be turned off.
SocketOptionName.HeaderIncluded;// Indicates application is providing the IP header for outgoing datagrams.
SocketOptionName.IPOptions;// Specifies IP options to be inserted into outgoing datagrams.
}
Id_SO_KEEPALIVE = SocketOptionName.KeepAlive;// Send keep-alives.
Id_SO_LINGER = SocketOptionName.Linger;// Linger on close if unsent data is present.
{
SocketOptionName.MaxConnections;// Maximum queue length that can be specified by Listen.
SocketOptionName.MulticastInterface;// Set the interface for outgoing multicast packets.
SocketOptionName.MulticastLoopback;// IP multicast loopback.
SocketOptionName.MulticastTimeToLive;// IP multicast time to live.
SocketOptionName.NoChecksum;// Send UDP datagrams with checksum set to zero.
SocketOptionName.NoDelay;// Disables the Nagle algorithm for send coalescing.
}
Id_SO_OOBINLINE = SocketOptionName.OutOfBandInline;// Receives out-of-band data in the normal data stream.
{
SocketOptionName.PacketInformation;// Return information about received packets.
}
Id_SO_RCVBUF = SocketOptionName.ReceiveBuffer;// Specifies the total per-socket buffer space reserved for receives. This is unrelated to the maximum message size or the size of a TCP window.
{
SocketOptionName.ReceiveLowWater;// Receive low water mark.
SocketOptionName.ReceiveTimeout;// Receive time out. This option applies only to synchronous methods; it has no effect on asynchronous methods such as BeginSend.
}
Id_SO_REUSEADDR = SocketOptionName.ReuseAddress;// Allows the socket to be bound to an address that is already in use.
Id_SO_SNDBUF = SocketOptionName.SendBuffer;// Specifies the total per-socket buffer space reserved for sends. This is unrelated to the maximum message size or the size of a TCP window.
{
SocketOptionName.SendLowWater;// Specifies the total per-socket buffer space reserved for receives. This is unrelated to the maximum message size or the size of a TCP window.
SocketOptionName.SendTimeout;// Send timeout. This option applies only to synchronous methods; it has no effect on asynchronous methods such as BeginSend.
}
Id_SO_TYPE = SocketOptionName.Type;// Get socket type.
{
SocketOptionName.TypeOfService;// Change the IP header type of service field.
SocketOptionName.UnblockSource;// Unblock a previously blocked source.
}
Id_SO_UPDATE_ACCEPT_CONTEXT = SocketOptionName.UpdateAcceptContext;// Updates an accepted socket's properties by using those of an existing socket.
Id_SO_UPDATE_CONNECT_CONTEXT = SocketOptionName.UpdateConnectContext;// Updates a connected socket's properties by using those of an existing socket.
{
SocketOptionName.UseLoopback;// Bypass hardware when possible.
}
{$ENDIF}
// Additional socket options
{$IFNDEF DOTNET}
Id_SO_RCVTIMEO = SO_RCVTIMEO;
Id_SO_SNDTIMEO = SO_SNDTIMEO;
{$ELSE}
Id_SO_RCVTIMEO = SocketOptionName.ReceiveTimeout;
Id_SO_SNDTIMEO = SocketOptionName.SendTimeout;
{$ENDIF}
{$IFNDEF DOTNET}
Id_SO_IP_TTL = IP_TTL;
{$ELSE}
Id_SO_IP_TTL = SocketOptionName.IpTimeToLive; // Set the IP header time-to-live field.
{$ENDIF}
{$IFNDEF DOTNET}
{for some reason, the compiler doesn't accept INADDR_ANY below saying a constant is expected. }
{$IFDEF USE_VCL_POSIX}
Id_INADDR_ANY = 0;// INADDR_ANY;
Id_INADDR_NONE = $ffffffff;// INADDR_NONE;
{$ELSE}
Id_INADDR_ANY = INADDR_ANY;
Id_INADDR_NONE = INADDR_NONE;
{$ENDIF}
{$ENDIF}
// TCP Options
{$IFNDEF DOTNET}
{$IFDEF USE_VCL_POSIX}
INVALID_SOCKET = -1;
SOCKET_ERROR = -1;
{$ENDIF}
Id_TCP_NODELAY = TCP_NODELAY;
Id_INVALID_SOCKET = INVALID_SOCKET;
Id_SOCKET_ERROR = SOCKET_ERROR;
Id_SOCKETOPTIONLEVEL_TCP = Id_IPPROTO_TCP; // BGO: rename to Id_SOL_TCP
{$IFDEF HAS_TCP_CORK}
Id_TCP_CORK = TCP_CORK;
{$ENDIF}
{$IFDEF HAS_TCP_NOPUSH}
Id_TCP_NOPUSH = TCP_NOPUSH;
{$ENDIF}
{$IFDEF HAS_TCP_KEEPIDLE}
Id_TCP_KEEPIDLE = TCP_KEEPIDLE;
{$ENDIF}
{$IFDEF HAS_TCP_KEEPINTVL}
Id_TCP_KEEPINTVL = TCP_KEEPINTVL;
{$ENDIF}
{$ELSE}
Id_TCP_NODELAY = SocketOptionName.NoDelay;
Id_INVALID_SOCKET = nil;
Id_SOCKET_ERROR = -1;
Id_SOCKETOPTIONLEVEL_TCP = SocketOptionLevel.TCP; // BGO: rename to Id_SOL_TCP
{$ENDIF}
{$IFDEF USE_VCL_POSIX}
// Shutdown Options
Id_SD_Recv = SHUT_RD;
Id_SD_Send = SHUT_WR;
Id_SD_Both = SHUT_RDWR;
//
//Temp defines. They should be in Delphi's Posix.Errno.pas
ESOCKTNOSUPPORT = 44; //* Socket type not supported */
{$EXTERNALSYM ESOCKTNOSUPPORT}
EPFNOSUPPORT = 46; //* Protocol family not supported */
{$EXTERNALSYM EPFNOSUPPORT}
ESHUTDOWN = 58; //* Can't send after socket shutdown */
{$EXTERNALSYM ESHUTDOWN}
ETOOMANYREFS = 59; //* Too many references: can't splice */
{$EXTERNALSYM ETOOMANYREFS}
EHOSTDOWN = 64; //* Host is down */
{$EXTERNALSYM EHOSTDOWN}
//
Id_WSAEINTR = EINTR;
Id_WSAEBADF = EBADF;
Id_WSAEACCES = EACCES;
Id_WSAEFAULT = EFAULT;
Id_WSAEINVAL = EINVAL;
Id_WSAEMFILE = EMFILE;
Id_WSAEWOULDBLOCK = EWOULDBLOCK;
Id_WSAEINPROGRESS = EINPROGRESS;
Id_WSAEALREADY = EALREADY;
Id_WSAENOTSOCK = ENOTSOCK;
Id_WSAEDESTADDRREQ = EDESTADDRREQ;
Id_WSAEMSGSIZE = EMSGSIZE;
Id_WSAEPROTOTYPE = EPROTOTYPE;
Id_WSAENOPROTOOPT = ENOPROTOOPT;
Id_WSAEPROTONOSUPPORT = EPROTONOSUPPORT;
Id_WSAESOCKTNOSUPPORT = ESOCKTNOSUPPORT;
Id_WSAEOPNOTSUPP = EOPNOTSUPP;
Id_WSAEPFNOSUPPORT = EPFNOSUPPORT;
Id_WSAEAFNOSUPPORT = EAFNOSUPPORT;
Id_WSAEADDRINUSE = EADDRINUSE;
Id_WSAEADDRNOTAVAIL = EADDRNOTAVAIL;
Id_WSAENETDOWN = ENETDOWN;
Id_WSAENETUNREACH = ENETUNREACH;
Id_WSAENETRESET = ENETRESET;
Id_WSAECONNABORTED = ECONNABORTED;
Id_WSAECONNRESET = ECONNRESET;
Id_WSAENOBUFS = ENOBUFS;
Id_WSAEISCONN = EISCONN;
Id_WSAENOTCONN = ENOTCONN;
Id_WSAESHUTDOWN = ESHUTDOWN;
Id_WSAETOOMANYREFS = ETOOMANYREFS;
Id_WSAETIMEDOUT = ETIMEDOUT;
Id_WSAECONNREFUSED = ECONNREFUSED;
Id_WSAELOOP = ELOOP;
Id_WSAENAMETOOLONG = ENAMETOOLONG;
Id_WSAEHOSTDOWN = EHOSTDOWN;
Id_WSAEHOSTUNREACH = EHOSTUNREACH;
Id_WSAENOTEMPTY = ENOTEMPTY;
{$ENDIF}
{$IFDEF KYLIXCOMPAT}
// Shutdown Options
Id_SD_Recv = SHUT_RD;
Id_SD_Send = SHUT_WR;
Id_SD_Both = SHUT_RDWR;
//
Id_WSAEINTR = EINTR;
Id_WSAEBADF = EBADF;
Id_WSAEACCES = EACCES;
Id_WSAEFAULT = EFAULT;
Id_WSAEINVAL = EINVAL;
Id_WSAEMFILE = EMFILE;
Id_WSAEWOULDBLOCK = EWOULDBLOCK;
Id_WSAEINPROGRESS = EINPROGRESS;
Id_WSAEALREADY = EALREADY;
Id_WSAENOTSOCK = ENOTSOCK;
Id_WSAEDESTADDRREQ = EDESTADDRREQ;
Id_WSAEMSGSIZE = EMSGSIZE;
Id_WSAEPROTOTYPE = EPROTOTYPE;
Id_WSAENOPROTOOPT = ENOPROTOOPT;
Id_WSAEPROTONOSUPPORT = EPROTONOSUPPORT;
Id_WSAESOCKTNOSUPPORT = ESOCKTNOSUPPORT;
Id_WSAEOPNOTSUPP = EOPNOTSUPP;
Id_WSAEPFNOSUPPORT = EPFNOSUPPORT;
Id_WSAEAFNOSUPPORT = EAFNOSUPPORT;
Id_WSAEADDRINUSE = EADDRINUSE;
Id_WSAEADDRNOTAVAIL = EADDRNOTAVAIL;
Id_WSAENETDOWN = ENETDOWN;
Id_WSAENETUNREACH = ENETUNREACH;
Id_WSAENETRESET = ENETRESET;
Id_WSAECONNABORTED = ECONNABORTED;
Id_WSAECONNRESET = ECONNRESET;
Id_WSAENOBUFS = ENOBUFS;
Id_WSAEISCONN = EISCONN;
Id_WSAENOTCONN = ENOTCONN;
Id_WSAESHUTDOWN = ESHUTDOWN;
Id_WSAETOOMANYREFS = ETOOMANYREFS;
Id_WSAETIMEDOUT = ETIMEDOUT;
Id_WSAECONNREFUSED = ECONNREFUSED;
Id_WSAELOOP = ELOOP;
Id_WSAENAMETOOLONG = ENAMETOOLONG;
Id_WSAEHOSTDOWN = EHOSTDOWN;
Id_WSAEHOSTUNREACH = EHOSTUNREACH;
Id_WSAENOTEMPTY = ENOTEMPTY;
{$ENDIF}
{$IFDEF USE_BASEUNIX}
// Shutdown Options
Id_SD_Recv = SHUT_RD;
Id_SD_Send = SHUT_WR;
Id_SD_Both = SHUT_RDWR;
{$IFDEF BEOS}
{work around incomplete definitions in BeOS FPC compiler.}
EDESTADDRREQ = (B_POSIX_ERROR_BASE + 48);
{$EXTERNALSYM EDESTADDRREQ}
EHOSTDOWN = (B_POSIX_ERROR_BASE + 45);
{$EXTERNALSYM EHOSTDOWN}
ESysENOTSOCK = ENOTSOCK;
ESysEDESTADDRREQ = EDESTADDRREQ;
ESysEMSGSIZE = EMSGSIZE;
ESysEOPNOTSUPP = EOPNOTSUPP;
ESysEHOSTDOWN = EHOSTDOWN;
{$ENDIF}
//
Id_WSAEINTR = ESysEINTR;
Id_WSAEBADF = ESysEBADF;
Id_WSAEACCES = ESysEACCES;
Id_WSAEFAULT = ESysEFAULT;
Id_WSAEINVAL = ESysEINVAL;
Id_WSAEMFILE = ESysEMFILE;
Id_WSAEWOULDBLOCK = ESysEWOULDBLOCK;
Id_WSAEINPROGRESS = ESysEINPROGRESS;
Id_WSAEALREADY = ESysEALREADY;
Id_WSAENOTSOCK = ESysENOTSOCK;
Id_WSAEDESTADDRREQ = ESysEDESTADDRREQ;
Id_WSAEMSGSIZE = ESysEMSGSIZE;
Id_WSAEPROTOTYPE = ESysEPROTOTYPE;
Id_WSAENOPROTOOPT = ESysENOPROTOOPT;
Id_WSAEPROTONOSUPPORT = ESysEPROTONOSUPPORT;
{$IFNDEF BEOS}
Id_WSAESOCKTNOSUPPORT = ESysESOCKTNOSUPPORT;
{$ENDIF}
Id_WSAEOPNOTSUPP = ESysEOPNOTSUPP;
Id_WSAEPFNOSUPPORT = ESysEPFNOSUPPORT;
Id_WSAEAFNOSUPPORT = ESysEAFNOSUPPORT;
Id_WSAEADDRINUSE = ESysEADDRINUSE;
Id_WSAEADDRNOTAVAIL = ESysEADDRNOTAVAIL;
Id_WSAENETDOWN = ESysENETDOWN;
Id_WSAENETUNREACH = ESysENETUNREACH;
Id_WSAENETRESET = ESysENETRESET;
Id_WSAECONNABORTED = ESysECONNABORTED;
Id_WSAECONNRESET = ESysECONNRESET;
Id_WSAENOBUFS = ESysENOBUFS;
Id_WSAEISCONN = ESysEISCONN;
Id_WSAENOTCONN = ESysENOTCONN;
Id_WSAESHUTDOWN = ESysESHUTDOWN;
{$IFNDEF BEOS}
Id_WSAETOOMANYREFS = ESysETOOMANYREFS;
{$ENDIF}
Id_WSAETIMEDOUT = ESysETIMEDOUT;
Id_WSAECONNREFUSED = ESysECONNREFUSED;
Id_WSAELOOP = ESysELOOP;
Id_WSAENAMETOOLONG = ESysENAMETOOLONG;
Id_WSAEHOSTDOWN = ESysEHOSTDOWN;
Id_WSAEHOSTUNREACH = ESysEHOSTUNREACH;
Id_WSAENOTEMPTY = ESysENOTEMPTY;
{$ENDIF}
{$IFDEF WINDOWS}
// Shutdown Options
Id_SD_Recv = 0;
Id_SD_Send = 1;
Id_SD_Both = 2;
//
Id_WSAEINTR = WSAEINTR;
Id_WSAEBADF = WSAEBADF;
Id_WSAEACCES = WSAEACCES;
Id_WSAEFAULT = WSAEFAULT;
Id_WSAEINVAL = WSAEINVAL;
Id_WSAEMFILE = WSAEMFILE;
Id_WSAEWOULDBLOCK = WSAEWOULDBLOCK;
Id_WSAEINPROGRESS = WSAEINPROGRESS;
Id_WSAEALREADY = WSAEALREADY;
Id_WSAENOTSOCK = WSAENOTSOCK;
Id_WSAEDESTADDRREQ = WSAEDESTADDRREQ;
Id_WSAEMSGSIZE = WSAEMSGSIZE;
Id_WSAEPROTOTYPE = WSAEPROTOTYPE;
Id_WSAENOPROTOOPT = WSAENOPROTOOPT;
Id_WSAEPROTONOSUPPORT = WSAEPROTONOSUPPORT;
Id_WSAESOCKTNOSUPPORT = WSAESOCKTNOSUPPORT;
Id_WSAEOPNOTSUPP = WSAEOPNOTSUPP;
Id_WSAEPFNOSUPPORT = WSAEPFNOSUPPORT;
Id_WSAEAFNOSUPPORT = WSAEAFNOSUPPORT;
Id_WSAEADDRINUSE = WSAEADDRINUSE;
Id_WSAEADDRNOTAVAIL = WSAEADDRNOTAVAIL;
Id_WSAENETDOWN = WSAENETDOWN;
Id_WSAENETUNREACH = WSAENETUNREACH;
Id_WSAENETRESET = WSAENETRESET;
Id_WSAECONNABORTED = WSAECONNABORTED;
Id_WSAECONNRESET = WSAECONNRESET;
Id_WSAENOBUFS = WSAENOBUFS;
Id_WSAEISCONN = WSAEISCONN;
Id_WSAENOTCONN = WSAENOTCONN;
Id_WSAESHUTDOWN = WSAESHUTDOWN;
Id_WSAETOOMANYREFS = WSAETOOMANYREFS;
Id_WSAETIMEDOUT = WSAETIMEDOUT;
Id_WSAECONNREFUSED = WSAECONNREFUSED;
Id_WSAELOOP = WSAELOOP;
Id_WSAENAMETOOLONG = WSAENAMETOOLONG;
Id_WSAEHOSTDOWN = WSAEHOSTDOWN;
Id_WSAEHOSTUNREACH = WSAEHOSTUNREACH;
Id_WSAENOTEMPTY = WSAENOTEMPTY;
{$ENDIF}
{$IFDEF DOTNET}
//In DotNET, the constants are the same as in Winsock2.
//Ripped from IdWinsock2 - don't use that in DotNET.
WSABASEERR = 10000;
// Windows Sockets definitions of regular Microsoft C error constants
WSAEINTR = WSABASEERR + 4;
WSAEBADF = WSABASEERR + 9;
WSAEACCES = WSABASEERR + 13;
WSAEFAULT = WSABASEERR + 14;
WSAEINVAL = WSABASEERR + 22;
WSAEMFILE = WSABASEERR + 24;
// Windows Sockets definitions of regular Berkeley error constants
WSAEWOULDBLOCK = WSABASEERR + 35;
WSAEINPROGRESS = WSABASEERR + 36;
WSAEALREADY = WSABASEERR + 37;
WSAENOTSOCK = WSABASEERR + 38;
WSAEDESTADDRREQ = WSABASEERR + 39;
WSAEMSGSIZE = WSABASEERR + 40;
WSAEPROTOTYPE = WSABASEERR + 41;
WSAENOPROTOOPT = WSABASEERR + 42;
WSAEPROTONOSUPPORT = WSABASEERR + 43;
WSAESOCKTNOSUPPORT = WSABASEERR + 44;
WSAEOPNOTSUPP = WSABASEERR + 45;
WSAEPFNOSUPPORT = WSABASEERR + 46;
WSAEAFNOSUPPORT = WSABASEERR + 47;
WSAEADDRINUSE = WSABASEERR + 48;
WSAEADDRNOTAVAIL = WSABASEERR + 49;
WSAENETDOWN = WSABASEERR + 50;
WSAENETUNREACH = WSABASEERR + 51;
WSAENETRESET = WSABASEERR + 52;
WSAECONNABORTED = WSABASEERR + 53;
WSAECONNRESET = WSABASEERR + 54;
WSAENOBUFS = WSABASEERR + 55;
WSAEISCONN = WSABASEERR + 56;
WSAENOTCONN = WSABASEERR + 57;
WSAESHUTDOWN = WSABASEERR + 58;
WSAETOOMANYREFS = WSABASEERR + 59;
WSAETIMEDOUT = WSABASEERR + 60;
WSAECONNREFUSED = WSABASEERR + 61;
WSAELOOP = WSABASEERR + 62;
WSAENAMETOOLONG = WSABASEERR + 63;
WSAEHOSTDOWN = WSABASEERR + 64;
WSAEHOSTUNREACH = WSABASEERR + 65;
WSAENOTEMPTY = WSABASEERR + 66;
WSAEPROCLIM = WSABASEERR + 67;
WSAEUSERS = WSABASEERR + 68;
WSAEDQUOT = WSABASEERR + 69;
WSAESTALE = WSABASEERR + 70;
WSAEREMOTE = WSABASEERR + 71;
// Extended Windows Sockets error constant definitions
WSASYSNOTREADY = WSABASEERR + 91;
WSAVERNOTSUPPORTED = WSABASEERR + 92;
WSANOTINITIALIZED = WSABASEERR + 93;
WSAEDISCON = WSABASEERR + 101;
WSAENOMORE = WSABASEERR + 102;
WSAECANCELLED = WSABASEERR + 103;
WSAEINVALIDPROCTABLE = WSABASEERR + 104;
WSAEINVALIDPROVIDER = WSABASEERR + 105;
WSAEPROVIDERFAILEDINIT = WSABASEERR + 106;
WSASYSCALLFAILURE = WSABASEERR + 107;
WSASERVICE_NOT_FOUND = WSABASEERR + 108;
WSATYPE_NOT_FOUND = WSABASEERR + 109;
WSA_E_NO_MORE = WSABASEERR + 110;
WSA_E_CANCELLED = WSABASEERR + 111;
WSAEREFUSED = WSABASEERR + 112;
{ Error return codes from gethostbyname() and gethostbyaddr()
when using the resolver. Note that these errors are retrieved
via WSAGetLastError() and must therefore follow the rules for
avoiding clashes with error numbers from specific implementations
or language run-time systems. For this reason the codes are based
at WSABASEERR+1001. Note also that [WSA]NO_ADDRESS is defined
only for compatibility purposes. }
// Authoritative Answer: Host not found
WSAHOST_NOT_FOUND = WSABASEERR + 1001;
HOST_NOT_FOUND = WSAHOST_NOT_FOUND;
// Non-Authoritative: Host not found, or SERVERFAIL
WSATRY_AGAIN = WSABASEERR + 1002;
TRY_AGAIN = WSATRY_AGAIN;
// Non recoverable errors, FORMERR, REFUSED, NOTIMP
WSANO_RECOVERY = WSABASEERR + 1003;
NO_RECOVERY = WSANO_RECOVERY;
// Valid name, no data record of requested type
WSANO_DATA = WSABASEERR + 1004;
NO_DATA = WSANO_DATA;
// no address, look for MX record
WSANO_ADDRESS = WSANO_DATA;
NO_ADDRESS = WSANO_ADDRESS;
// Define QOS related error return codes
WSA_QOS_RECEIVERS = WSABASEERR + 1005; // at least one reserve has arrived
WSA_QOS_SENDERS = WSABASEERR + 1006; // at least one path has arrived
WSA_QOS_NO_SENDERS = WSABASEERR + 1007; // there are no senders
WSA_QOS_NO_RECEIVERS = WSABASEERR + 1008; // there are no receivers
WSA_QOS_REQUEST_CONFIRMED = WSABASEERR + 1009; // reserve has been confirmed
WSA_QOS_ADMISSION_FAILURE = WSABASEERR + 1010; // error due to lack of resources
WSA_QOS_POLICY_FAILURE = WSABASEERR + 1011; // rejected for administrative reasons - bad credentials
WSA_QOS_BAD_STYLE = WSABASEERR + 1012; // unknown or conflicting style
WSA_QOS_BAD_OBJECT = WSABASEERR + 1013; // problem with some part of the filterspec or providerspecific buffer in general
WSA_QOS_TRAFFIC_CTRL_ERROR = WSABASEERR + 1014; // problem with some part of the flowspec
WSA_QOS_GENERIC_ERROR = WSABASEERR + 1015; // general error
WSA_QOS_ESERVICETYPE = WSABASEERR + 1016; // invalid service type in flowspec
WSA_QOS_EFLOWSPEC = WSABASEERR + 1017; // invalid flowspec
WSA_QOS_EPROVSPECBUF = WSABASEERR + 1018; // invalid provider specific buffer
WSA_QOS_EFILTERSTYLE = WSABASEERR + 1019; // invalid filter style
WSA_QOS_EFILTERTYPE = WSABASEERR + 1020; // invalid filter type
WSA_QOS_EFILTERCOUNT = WSABASEERR + 1021; // incorrect number of filters
WSA_QOS_EOBJLENGTH = WSABASEERR + 1022; // invalid object length
WSA_QOS_EFLOWCOUNT = WSABASEERR + 1023; // incorrect number of flows
WSA_QOS_EUNKNOWNSOBJ = WSABASEERR + 1024; // unknown object in provider specific buffer
WSA_QOS_EPOLICYOBJ = WSABASEERR + 1025; // invalid policy object in provider specific buffer
WSA_QOS_EFLOWDESC = WSABASEERR + 1026; // invalid flow descriptor in the list
WSA_QOS_EPSFLOWSPEC = WSABASEERR + 1027; // inconsistent flow spec in provider specific buffer
WSA_QOS_EPSFILTERSPEC = WSABASEERR + 1028; // invalid filter spec in provider specific buffer
WSA_QOS_ESDMODEOBJ = WSABASEERR + 1029; // invalid shape discard mode object in provider specific buffer
WSA_QOS_ESHAPERATEOBJ = WSABASEERR + 1030; // invalid shaping rate object in provider specific buffer
WSA_QOS_RESERVED_PETYPE = WSABASEERR + 1031; // reserved policy element in provider specific buffer
{This section defines error constants used in Winsock 2 indirectly. These
are from Borland's header.}
{ The handle is invalid. }
ERROR_INVALID_HANDLE = 6;
{ Not enough storage is available to process this command. }
ERROR_NOT_ENOUGH_MEMORY = 8; { dderror }
{ The parameter is incorrect. }
ERROR_INVALID_PARAMETER = 87; { dderror }
{ The I/O operation has been aborted because of either a thread exit }
{ or an application request. }
ERROR_OPERATION_ABORTED = 995;
{ Overlapped I/O event is not in a signalled state. }
ERROR_IO_INCOMPLETE = 996;
{ Overlapped I/O operation is in progress. }
ERROR_IO_PENDING = 997; { dderror }
{ WinSock 2 extension -- new error codes and type definition }
WSA_IO_PENDING = ERROR_IO_PENDING;
WSA_IO_INCOMPLETE = ERROR_IO_INCOMPLETE;
WSA_INVALID_HANDLE = ERROR_INVALID_HANDLE;
WSA_INVALID_PARAMETER = ERROR_INVALID_PARAMETER;
WSA_NOT_ENOUGH_MEMORY = ERROR_NOT_ENOUGH_MEMORY;
WSA_OPERATION_ABORTED = ERROR_OPERATION_ABORTED;
//TODO: Map these to .net constants. Unfortunately .net does not seem to
//define these anywhere.
Id_WSAEINTR = WSAEINTR;
Id_WSAEBADF = WSAEBADF;
Id_WSAEACCES = WSAEACCES;
Id_WSAEFAULT = WSAEFAULT;
Id_WSAEINVAL = WSAEINVAL;
Id_WSAEMFILE = WSAEMFILE;
Id_WSAEWOULDBLOCK = WSAEWOULDBLOCK;
Id_WSAEINPROGRESS = WSAEINPROGRESS;
Id_WSAEALREADY = WSAEALREADY;
Id_WSAENOTSOCK = WSAENOTSOCK;
Id_WSAEDESTADDRREQ = WSAEDESTADDRREQ;
Id_WSAEMSGSIZE = WSAEMSGSIZE;
Id_WSAEPROTOTYPE = WSAEPROTOTYPE;
Id_WSAENOPROTOOPT = WSAENOPROTOOPT;
Id_WSAEPROTONOSUPPORT = WSAEPROTONOSUPPORT;
Id_WSAESOCKTNOSUPPORT = WSAESOCKTNOSUPPORT;
Id_WSAEOPNOTSUPP = WSAEOPNOTSUPP;
Id_WSAEPFNOSUPPORT = WSAEPFNOSUPPORT;
Id_WSAEAFNOSUPPORT = WSAEAFNOSUPPORT;
Id_WSAEADDRINUSE = WSAEADDRINUSE;
Id_WSAEADDRNOTAVAIL = WSAEADDRNOTAVAIL;
Id_WSAENETDOWN = WSAENETDOWN;
Id_WSAENETUNREACH = WSAENETUNREACH;
Id_WSAENETRESET = WSAENETRESET;
Id_WSAECONNABORTED = WSAECONNABORTED;
Id_WSAECONNRESET = WSAECONNRESET;
Id_WSAENOBUFS = WSAENOBUFS;
Id_WSAEISCONN = WSAEISCONN;
Id_WSAENOTCONN = WSAENOTCONN;
Id_WSAESHUTDOWN = WSAESHUTDOWN;
Id_WSAETOOMANYREFS = WSAETOOMANYREFS;
Id_WSAETIMEDOUT = WSAETIMEDOUT;
Id_WSAECONNREFUSED = WSAECONNREFUSED;
Id_WSAELOOP = WSAELOOP;
Id_WSAENAMETOOLONG = WSAENAMETOOLONG;
Id_WSAEHOSTDOWN = WSAEHOSTDOWN;
Id_WSAEHOSTUNREACH = WSAEHOSTUNREACH;
Id_WSAENOTEMPTY = WSAENOTEMPTY;
Id_SD_Recv = SocketShutdown.Receive;
Id_SD_Send = SocketShutdown.Send;
Id_SD_Both = SocketShutdown.Both;
{$ENDIF}
implementation
{$IFDEF USE_VCL_POSIX}
{$I IdSymbolPlatformOn.inc}
{$ENDIF}
end.