/* -*- C++ -*- */

#ifndef ACE_CONFIG_WIN32_COMMON_H
#define ACE_CONFIG_WIN32_COMMON_H
#include /**/ "ace/pre.h"

#ifndef ACE_CONFIG_WIN32_H
#error Use config-win32.h in config.h instead of this header
#endif /* ACE_CONFIG_WIN32_H */

// Windows Mobile (CE) stuff is primarily further restrictions to what's
// in the rest of this file. Also, it defined ACE_HAS_WINCE, which is used
// in this file.
#if defined (_WIN32_WCE)
#  include "ace/config-WinCE.h"
#endif /* _WIN32_WCE */

#if defined(__MINGW32__)
// When using the --std=c++0x option with MinGW the compiler omits defining
// the following required macros (at least with the GCC 4.6.2 version)
// So we define them ourselves here.
# if !defined(WIN32)
#   define _stdcall __attribute__((__stdcall__))
#   define _cdecl __attribute__((__cdecl__))
#   define _thiscall __attribute__((__thiscall__))
#   define _fastcall __attribute__((__fastcall__))
#   define WIN32 1
#   define WINNT 1
#   define i386 1
# endif
#endif

// Complain if WIN32 is not already defined.
#if !defined (WIN32) && !defined (ACE_HAS_WINCE)
# error Please define WIN32 in your project settings.
#endif

#define ACE_WIN32
#if defined (_WIN64) || defined (WIN64)
#  define ACE_WIN64

// MPC template adds _AMD64_ but user projects not generated using MPC
// may want to use _AMD64_ as well. Ensure it's there in all non ARM cases
#  if !defined (_AMD64_) && !defined(_ARM_) && !defined(_ARM64_)
#    define _AMD64_
#  endif

// Use 64-bit file offsets by default in the WIN64 case, similar to
// what 64-bit UNIX systems do.
//
// Note that _FILE_OFFSET_BITS is not recognized by Windows.  It is,
// however, recognized by ACE.
#  ifndef _FILE_OFFSET_BITS
#    define _FILE_OFFSET_BITS 64
#  endif  /* !_FILE_OFFSET_BITS */
#endif /* _WIN64 || WIN64 */

// If the invoking procedure turned off debugging by setting NDEBUG, then
// also set ACE_NDEBUG, unless the user has already set it.
#if defined (NDEBUG)
#  if !defined (ACE_NDEBUG)
#    define ACE_NDEBUG
#  endif /* ACE_NDEBUG */
#endif /* NDEBUG */

// Define ACE_HAS_MFC to 1, if you want ACE to use CWinThread. This should
// be defined, if your application uses MFC.
//  Setting applies to  : building ACE
//  Runtime restrictions: MFC DLLs must be installed
//  Additional notes    : If both ACE_HAS_MFC and ACE_MT_SAFE are
//                        defined, the MFC DLL (not the static lib)
//                        will be used from ACE.
#if !defined (ACE_HAS_MFC)
# define ACE_HAS_MFC 0
#endif

// ACE_USES_STATIC_MFC always implies ACE_HAS_MFC
#if defined (ACE_USES_STATIC_MFC)
# if defined (ACE_HAS_MFC)
#   undef ACE_HAS_MFC
# endif
# define ACE_HAS_MFC 1
#endif /* ACE_USES_STATIC_MFC */

// Define ACE_HAS_STRICT to 1 in your config.h file if you want to use
// STRICT type checking.  It is disabled by default because it will
// break existing application code. However, if ACE_HAS_MFC is turned on,
// ACE_HAS_STRICT is required by MFC.
//  Setting applies to  : building ACE, linking with ACE
//  Runtime restrictions: -
#if !defined (ACE_HAS_STRICT)
# define ACE_HAS_STRICT 0
#endif

// MFC itself defines STRICT.
#if defined (ACE_HAS_MFC) && (ACE_HAS_MFC != 0)
# undef ACE_HAS_STRICT
# define ACE_HAS_STRICT 1
#endif

// Turn off the following define if you want to disable threading.
// Compile using multi-thread libraries.
//  Setting applies to  : building ACE, linking with ACE
//  Runtime restrictions: multithreaded runtime DLL must be installed
#if !defined (ACE_MT_SAFE)
# define ACE_MT_SAFE 1
#endif

// On winCE these classes do not exist. If they are
// introduced in the future, no changes need to be made
#if defined (ABOVE_NORMAL_PRIORITY_CLASS) && \
  defined (BELOW_NORMAL_PRIORITY_CLASS) && \
  defined (HIGH_PRIORITY_CLASS) && \
  defined (IDLE_PRIORITY_CLASS) && \
  defined (NORMAL_PRIORITY_CLASS) && \
  defined (REALTIME_PRIORITY_CLASS)
#define ACE_HAS_WIN32_PRIORITY_CLASS
#endif

// Build ACE services as DLLs.  If you write a library and want it to
// use ACE_Svc_Export, this will cause those macros to build dlls.  If
// you want your ACE service to be a static library, comment out this
// line.  As far as I know, the only reason to have a library be an
// ACE "service" is to leverage the ACE_Svc_Export macros.  It's just
// as easy to define your own export macros.
//  #if !defined (ACE_SVC_HAS_DLL)
//  # define ACE_SVC_HAS_DLL 1
//  #endif

// Define the special export macros needed to export symbols outside a dll
#if !defined (ACE_HAS_CUSTOM_EXPORT_MACROS) || (ACE_HAS_CUSTOM_EXPORT_MACROS == 0)
#if defined (ACE_HAS_CUSTOM_EXPORT_MACROS)
#undef ACE_HAS_CUSTOM_EXPORT_MACROS
#endif
#define ACE_HAS_CUSTOM_EXPORT_MACROS 1
#define ACE_Proper_Export_Flag __declspec (dllexport)
#define ACE_Proper_Import_Flag __declspec (dllimport)
#define ACE_EXPORT_SINGLETON_DECLARATION(T) template class __declspec (dllexport) T
#define ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) template class __declspec (dllexport) SINGLETON_TYPE<CLASS, LOCK>;
#define ACE_IMPORT_SINGLETON_DECLARATION(T) extern template class T
#define ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) extern template class SINGLETON_TYPE <CLASS, LOCK>;
#endif /* !ACE_HAS_CUSTOM_EXPORT_MACROS || ACE_HAS_CUSTOM_EXPORT_MACROS==0 */

// Define ACE_HAS_WINSOCK2 to 0 in your config.h file if you do *not*
// want to compile with WinSock 2.0.
//  Setting applies to  : building ACE
//  Runtime restrictions: winsock2 must be installed.
//      #define ACE_HAS_WINSOCK2 0

// By default, we use non-static object manager on Win32.  That is,
// the object manager is allocated in main's stack memory.  If this
// does not suit your need, i.e., if your programs depend on the use
// of static object manager, you need to disable the behavior by adding
//
//   #undef ACE_HAS_NONSTATIC_OBJECT_MANAGER
//
// in the config.h after including config-win32.h
//
// MFC users: the main function is defined within a MFC library and
// therefore, ACE won't be able to meddle with main function and
// instantiate the non-static object manager for you.  To solve the
// problem, you'll need to instantiate the ACE_Object_Manager by
// either:
//
// 1. Using static object manager (as described above), however, using
// the non-static object manager is preferred, therefore,
// 2. Instantiate the non-static object manager yourself by either 1)
//    call ACE::init () at the beginning and ACE::fini () at the end,
//    _or_ 2) instantiate the ACE_Object_Manager in your CWinApp
//    derived class.
//
// Optionally, you can #define
// ACE_DOESNT_INSTANTIATE_NONSTATIC_OBJECT_MANAGER in your
// ace/config.h and always take care of the business by yourself.
// ACE_DOESNT_INSTANTIATE_NONSTATIC_OBJECT_MANAGER has no effect when
// using static object managers.
#if !defined (ACE_HAS_NONSTATIC_OBJECT_MANAGER)
# define ACE_HAS_NONSTATIC_OBJECT_MANAGER
#endif /* ACE_HAS_NONSTATIC_OBJECT_MANAGER */

#define ACE_HAS_GPERF

// ---------------- platform features or lack of them -------------

// By default WIN32 has FD_SETSIZE of 64, which places the limit
// between 61 and 64 on the number of clients a server using the
// Select Reactor can support at the same time (i.e., 64 - standard in,
// out, error).  Here we raise the limit to 1024.  Adjust the definition
// below if you need to raise or lower it.

#if !defined (FD_SETSIZE)
#define FD_SETSIZE 1024
#endif /* FD_SETSIZE */


// Windows doesn't like 65536 ;-) If 65536 is specified, it is
// silently ignored by the OS, i.e., setsockopt does not fail, and you
// get stuck with the default size of 8k.
#define ACE_DEFAULT_MAX_SOCKET_BUFSIZ 65535

// It seems like Win32 does not have a limit on the number of buffers
// that can be transferred by the scatter/gather type of I/O
// functions, e.g., WSASend and WSARecv.  We are setting this to be 64
// for now.  The typically use case is to create an I/O vector array
// of size ACE_IOV_MAX on the stack and then filled in.  Note that we
// probably don't want too big a value for ACE_IOV_MAX since it may
// mostly go to waste or the size of the activation record may become
// excessively large.
#if !defined (ACE_IOV_MAX)
# define ACE_IOV_MAX 64
#endif /* ACE_IOV_MAX */

#if !defined (ACE_HAS_WINCE)
// Platform supports pread() and pwrite()
# define ACE_HAS_WTOF
#endif /* ! ACE_HAS_WINCE */

#define ACE_HAS_P_READ_WRITE

#if !defined (ACE_HAS_WINCE)
# define ACE_HAS_DIRECT_H
# define ACE_HAS_PROCESS_H
# define ACE_HAS_IO_H
#endif /* ! ACE_HAS_WINCE */

#if !defined (__MINGW32__)
# define ACE_HAS_WIN32_STRUCTURAL_EXCEPTIONS
#endif /* __MINGW32__ */

#define ACE_DEFAULT_THREAD_PRIORITY 0

#define ACE_HAS_DIRENT
#define ACE_HAS_MSG
#define ACE_HAS_NONCONST_INET_NTOP
#define ACE_HAS_RECURSIVE_MUTEXES
#define ACE_HAS_SOCKADDR_MSG_NAME
#define ACE_HAS_THREAD_SAFE_ACCEPT

/* MS is phasing out the GetVersion API so let's prepare */
/* For now all releases still provide it. */
#define ACE_HAS_WIN32_GETVERSION

/* LACKS dir-related facilities */
#define ACE_LACKS_READDIR_R
#define ACE_LACKS_REWINDDIR
#define ACE_LACKS_SEEKDIR
#define ACE_LACKS_TELLDIR

#define ACE_LACKS_CLOCKID_T
#define ACE_LACKS_CLOCK_REALTIME
#define ACE_LACKS_CLOCK_MONOTONIC
#define ACE_HAS_MONOTONIC_TIME_POLICY
#define ACE_HAS_MONOTONIC_CONDITIONS

/* LACKS gid/pid/sid/uid facilities */
#define ACE_LACKS_GETPGID
#define ACE_LACKS_GETPPID
#define ACE_LACKS_SETPGID
#define ACE_LACKS_SETREGID
#define ACE_LACKS_SETREUID
#define ACE_LACKS_SETSID
#define ACE_LACKS_SETEGID
#define ACE_LACKS_SETUID
#define ACE_LACKS_SETEUID
#define ACE_LACKS_GETGID
#define ACE_LACKS_GETEGID
#define ACE_LACKS_GETUID
#define ACE_LACKS_GETEUID
#define ACE_LACKS_SETGID

/* LACKS miscellaneous */
#define ACE_LACKS_ALARM
#define ACE_LACKS_ARPA_INET_H
#define ACE_LACKS_DUP2
#define ACE_LACKS_FORK
#define ACE_LACKS_GETHOSTENT
#define ACE_LACKS_GETOPT
#define ACE_LACKS_GETIPNODEBYNAME_IPV6
#define ACE_LACKS_KILL
#define ACE_LACKS_INET_ATON
#if _WIN32_WINNT < 0x0600
# define ACE_LACKS_INET_NTOP
# define ACE_LACKS_INET_PTON
#endif
#define ACE_LACKS_MADVISE
#define ACE_LACKS_MKFIFO
#define ACE_LACKS_MODE_MASKS
#define ACE_LACKS_PTHREAD_H
#define ACE_LACKS_PWD_FUNCTIONS
#define ACE_LACKS_RAND_R
#define ACE_LACKS_READLINK
#define ACE_LACKS_RLIMIT
#define ACE_LACKS_SBRK
#define ACE_LACKS_SCHED_H
#define ACE_LACKS_SEMBUF_T
#define ACE_LACKS_SIGACTION
#define ACE_LACKS_SIGSET
#define ACE_LACKS_SIGSET_T
#define ACE_LACKS_SOCKETPAIR
#define ACE_LACKS_SUSECONDS_T
#define ACE_LACKS_USECONDS_T
#define ACE_LACKS_SYS_PARAM_H
#define ACE_LACKS_SYS_SYSCTL_H
#define ACE_LACKS_SYSCONF
#define ACE_LACKS_SYSV_SHMEM
#define ACE_LACKS_UNISTD_H
#define ACE_LACKS_UNIX_SIGNALS
#define ACE_LACKS_UNIX_SYSLOG
#define ACE_LACKS_UTSNAME_T
#define ACE_LACKS_UNAME
#define ACE_LACKS_WAIT
#define ACE_LACKS_IOVEC
#define ACE_LACKS_LOG2
#define ACE_LACKS_CADDR_T
#if !defined(__MINGW32__) && !defined (__BORLANDC__)
# define ACE_LACKS_MODE_T
#endif
#if !defined(__MINGW32__)
# define ACE_LACKS_PID_T
#endif
#if !defined (__BORLANDC__)
# define ACE_LACKS_NLINK_T
# define ACE_LACKS_UID_T
# define ACE_LACKS_GID_T
#endif
#define ACE_LACKS_SETENV
#define ACE_LACKS_UNSETENV

#define ACE_HAS_PDH_H
#define ACE_HAS_PDHMSG_H

#define ACE_HAS_VFWPRINTF

#define ACE_MKDIR_LACKS_MODE

#define ACE_SIZEOF_LONG_LONG 8

#if !defined (__MINGW32__)
#define ACE_INT64_TYPE  signed __int64
#define ACE_UINT64_TYPE unsigned __int64
#endif

#if defined (__MINGW32__)
#define ACE_INT64_TYPE  signed long long
#define ACE_UINT64_TYPE unsigned long long
#endif

// Optimize ACE_Handle_Set for select().
#define ACE_HAS_HANDLE_SET_OPTIMIZED_FOR_SELECT

// Win32 has wide-char support. Use of the compiler-defined wchar_t type
// is controlled in compiler configs since it's a compiler switch.
#define ACE_HAS_WCHAR
#define ACE_HAS_WTOI
#define ACE_HAS_WTOL

// Platform supports the rusage struct.
#define ACE_HAS_GETRUSAGE

// Platform provides ACE_TLI function prototypes.
// For Win32, this is not really true, but saves a lot of hassle!
#define ACE_HAS_TLI_PROTOTYPES

// I'm pretty sure NT lacks these
#define ACE_LACKS_UNIX_DOMAIN_SOCKETS

// Windows NT needs readv() and writev()
#define ACE_LACKS_WRITEV
#define ACE_LACKS_READV

#if !defined (ACE_HAS_WTHREADS_CONDITION_VARIABLE)
# define ACE_LACKS_COND_T
#endif

#define ACE_LACKS_RWLOCK_T

#define ACE_LACKS_KEY_T

// No system support for replacing any previous mappings.
#define ACE_LACKS_AUTO_MMAP_REPLACEMENT

// ACE_HAS_PENTIUM is used to optimize some CDR operations; it's used for
// some other time-related things using g++, but not for VC. Current VC
// compilers set _M_IX86 > 400 by default so if you're not using a Pentium
// class CPU, set the project code generation options appropriately.
#if !defined(ACE_HAS_PENTIUM) && (_M_IX86 > 400)
# define ACE_HAS_PENTIUM
#endif

#if defined(ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
// Platform supports threads.
# define ACE_HAS_THREADS

// Platform supports Windows32 threads.
# define ACE_HAS_WTHREADS

// Compiler/platform has thread-specific storage
# define ACE_HAS_THREAD_SPECIFIC_STORAGE

// Win32 doesn't have fcntl
#define ACE_LACKS_FCNTL

#endif /* ACE_MT_SAFE && ACE_MT_SAFE != 0 */

#if !defined(_DEBUG)
// If we are making a release, and the user has not specified
// inline directives, we will default to inline
# if ! defined (__ACE_INLINE__)
#  define __ACE_INLINE__ 1
# endif /* __ACE_INLINE__ */
#endif

// If __ACE_INLINE__ is defined to be 0, we will undefine it
#if defined (__ACE_INLINE__) && (__ACE_INLINE__ == 0)
# undef __ACE_INLINE__
#endif /* __ACE_INLINE__ */

// We are build ACE and want to use MFC (multithreaded)
#if defined(ACE_HAS_MFC) && (ACE_HAS_MFC != 0) && defined (_MT)
# if (ACE_HAS_DLL != 0) && defined(ACE_BUILD_DLL) && !defined (_WINDLL)
// force multithreaded MFC DLL
#  define _WINDLL
# endif /* _AFXDLL */
# if !defined (_AFXDLL) && !defined (ACE_USES_STATIC_MFC)
#  define _AFXDLL
# endif /* _AFXDLL */
#endif

// <windows.h> and MFC's <afxwin.h> are mutually
// incompatible. <windows.h> is brain-dead about MFC; it doesn't check
// to see whether MFC stuff is anticipated or already in progress
// before doing its thing. ACE needs (practically always) <winsock.h>,
// and winsock in turn needs support either from windows.h or from
// afxwin.h. One or the other, not both.
//
// The MSVC++ V4.0 environment defines preprocessor macros that
// indicate the programmer has chosen something from the
// Build-->Settings-->General-->MFC combo-box. <afxwin.h> defines a
// macro itself to protect against double inclusion. We'll take
// advantage of all this to select the proper support for winsock. -
// trl 26-July-1996

// This is necessary since MFC users apparently can't #include
// <windows.h> directly.
#if defined (ACE_HAS_MFC) && (ACE_HAS_MFC != 0)
#  include /**/ <afxwin.h>   /* He is doing MFC */
// Windows.h will be included via afxwin.h->afx.h->afx_ver_.h->afxv_w32.h
// #define      _INC_WINDOWS  // Prevent winsock.h from including windows.h
#elif defined (ACE_HAS_WINCE)
#  include /**/ <windows.h>
#endif

#if !defined (_INC_WINDOWS)     /* Already include windows.h ? */
// Must define strict before including windows.h !
# if defined (ACE_HAS_STRICT) && (ACE_HAS_STRICT != 0) && !defined (STRICT)
#  define STRICT 1
# endif /* ACE_HAS_STRICT */

# if !defined (WIN32_LEAN_AND_MEAN) && !defined (ACE_NO_WIN32_LEAN_AND_MEAN)
#  define WIN32_LEAN_AND_MEAN
# endif /* WIN32_LEAN_AND_MEAN */

#endif /* !defined (_INC_WINDOWS) */

// Always use WS2 when available
#if !defined(ACE_HAS_WINSOCK2)
# define ACE_HAS_WINSOCK2 1
#endif /* !defined(ACE_HAS_WINSOCK2) */
// Not use WS1 by default
#if !defined(ACE_HAS_WINSOCK1)
# define ACE_HAS_WINSOCK1 0
#endif /* !defined(ACE_HAS_WINSOCK1) */


#if defined (ACE_HAS_WINSOCK2) && (ACE_HAS_WINSOCK2 != 0)
# define ACE_HAS_ICMP_SUPPORT 1
# if !defined (_WINSOCK2API_)
// will also include windows.h, if not present
#  include /**/ <winsock2.h>
// WinCE 4 doesn't define the Exxx values without the WSA prefix, so do that
// here. This is all lifted from the #if 0'd out part of winsock2.h.
#  if defined (_WIN32_WCE) && (_WIN32_WCE < 0x600)
#    define EWOULDBLOCK             WSAEWOULDBLOCK
#    define EINPROGRESS             WSAEINPROGRESS
#    define EALREADY                WSAEALREADY
#    define ENOTSOCK                WSAENOTSOCK
#    define EDESTADDRREQ            WSAEDESTADDRREQ
#    define EMSGSIZE                WSAEMSGSIZE
#    define EPROTOTYPE              WSAEPROTOTYPE
#    define ENOPROTOOPT             WSAENOPROTOOPT
#    define EPROTONOSUPPORT         WSAEPROTONOSUPPORT
#    define ESOCKTNOSUPPORT         WSAESOCKTNOSUPPORT
#    define EOPNOTSUPP              WSAEOPNOTSUPP
#    define EPFNOSUPPORT            WSAEPFNOSUPPORT
#    define EAFNOSUPPORT            WSAEAFNOSUPPORT
#    define EADDRINUSE              WSAEADDRINUSE
#    define EADDRNOTAVAIL           WSAEADDRNOTAVAIL
#    define ENETDOWN                WSAENETDOWN
#    define ENETUNREACH             WSAENETUNREACH
#    define ENETRESET               WSAENETRESET
#    define ECONNABORTED            WSAECONNABORTED
#    define ECONNRESET              WSAECONNRESET
#    define ENOBUFS                 WSAENOBUFS
#    define EISCONN                 WSAEISCONN
#    define ENOTCONN                WSAENOTCONN
#    define ESHUTDOWN               WSAESHUTDOWN
#    define ETOOMANYREFS            WSAETOOMANYREFS
#    define ETIMEDOUT               WSAETIMEDOUT
#    define ECONNREFUSED            WSAECONNREFUSED
#    define ELOOP                   WSAELOOP
#    define ENAMETOOLONG            WSAENAMETOOLONG
#    define EHOSTDOWN               WSAEHOSTDOWN
#    define EHOSTUNREACH            WSAEHOSTUNREACH
#    define ENOTEMPTY               WSAENOTEMPTY
#    define EPROCLIM                WSAEPROCLIM
#    define EUSERS                  WSAEUSERS
#    define EDQUOT                  WSAEDQUOT
#    define ESTALE                  WSAESTALE
#    define EREMOTE                 WSAEREMOTE
#  endif /* (_WIN32_WCE) && (_WIN32_WCE < 0x600) */
# endif /* _WINSOCK2API */

# if defined (ACE_HAS_FORE_ATM_WS2)
#  include /**/ <ws2atm.h>
# endif /*ACE_HAS_FORE_ATM_WS2 */

// CE doesn't have Microsoft Winsock 2 extensions
# if !defined _MSWSOCK_ && !defined (ACE_HAS_WINCE)
#  include /**/ <mswsock.h>
# endif /* _MSWSOCK_ */

# if defined (_MSC_VER)
#  if defined (ACE_HAS_WINCE)
#    pragma comment(lib, "ws2.lib")
#  else
#    pragma comment(lib, "ws2_32.lib")
#    pragma comment(lib, "mswsock.lib")
#    if defined (ACE_HAS_IPV6)
#      pragma comment(lib, "iphlpapi.lib")
#    endif
#  endif /* ACE_HAS_WINCE */
# endif /* _MSC_VER */

# define ACE_WSOCK_VERSION 2, 0
#else
# if !defined (_WINSOCKAPI_)
   // will also include windows.h, if not present
#  include /**/ <winsock.h>
# endif /* _WINSOCKAPI */

// PharLap ETS has its own winsock lib, so don't grab the one
// supplied with the OS.
# if defined (_MSC_VER) && !defined (_WIN32_WCE) && !defined (ACE_HAS_PHARLAP)
#  pragma comment(lib, "wsock32.lib")
# endif /* _MSC_VER */

// We can't use recvmsg and sendmsg unless WinSock 2 is available
# define ACE_LACKS_RECVMSG
# define ACE_LACKS_SENDMSG

// Version 1.1 of WinSock
# define ACE_WSOCK_VERSION 1, 1
#endif /* ACE_HAS_WINSOCK2 */

#if _WIN32_WINNT >= 0x400
# define ACE_HAS_WIN32_TRYLOCK
#endif
#if _WIN32_WINNT < 0x600
# define ACE_LACKS_IF_NAMETOINDEX
#endif
#define ACE_LACKS_IF_NAMEINDEX
#define ACE_LACKS_STRUCT_IF_NAMEINDEX

// Platform supports IP multicast on Winsock 2
#if defined (ACE_HAS_WINSOCK2) && (ACE_HAS_WINSOCK2 != 0)
# define ACE_HAS_IP_MULTICAST
#endif /* ACE_HAS_WINSOCK2 */

#if !defined (ACE_HAS_WINCE)
# define ACE_HAS_INTERLOCKED_EXCHANGEADD
#endif

#if !defined (ACE_HAS_WINCE) && !defined (ACE_HAS_PHARLAP)

# if _WIN32_WINNT >= 0x400
#  define ACE_HAS_SIGNAL_OBJECT_AND_WAIT
# endif

// If CancelIO is undefined get the updated sp2-sdk from MS
# define ACE_HAS_CANCEL_IO
# define ACE_HAS_WIN32_OVERLAPPED_IO
# define ACE_HAS_WIN32_NAMED_PIPES
#endif /* !defined (ACE_HAS_WINCE) && !ACE_HAS_PHARLAP */

#if !defined (ACE_SEH_DEFAULT_EXCEPTION_HANDLING_ACTION)
# define ACE_SEH_DEFAULT_EXCEPTION_HANDLING_ACTION EXCEPTION_CONTINUE_SEARCH
#endif /* ACE_SEH_DEFAULT_EXCEPTION_HANDLING_ACTION */

// ACE_HAS_QOS is defined in the qos.mpb base project.
// If qos=1 in default.features, then this macro will be defined.
#if defined (ACE_HAS_QOS) && !defined (ACE_HAS_WINSOCK2_GQOS)
# if defined (WINSOCK_VERSION)
#  define ACE_HAS_WINSOCK2_GQOS 1
# endif /* WINSOCK_VERSION */
#endif /* ACE_HAS_WINSOCK2_GQOS */

// These are the defaults and can be overridden by a user's config.h
#if !defined (ACE_DEFAULT_FILE_PERMS)
#  define ACE_DEFAULT_FILE_PERMS (FILE_SHARE_READ | FILE_SHARE_WRITE | \
                                  FILE_SHARE_DELETE)
// This alternate used to be used for pre-NT4 systems; may still be needed
// by knock-offs such as CE and Pharlap.
//#       define ACE_DEFAULT_FILE_PERMS (FILE_SHARE_READ | FILE_SHARE_WRITE)
#endif /* !defined (ACE_DEFAULT_FILE_PERMS) */

#define ACE_SIZEOF_WCHAR 2
#define ACE_HAS_MUTEX_TIMEOUTS
#define ACE_LACKS_STRUCT_DIR
#define ACE_LACKS_OPENDIR
#define ACE_LACKS_CLOSEDIR
#define ACE_LACKS_READDIR
#define ACE_LACKS_ALPHASORT
#define ACE_LACKS_MKSTEMP
#define ACE_LACKS_LSTAT
// Looks like Win32 has a non-const swab function, and it takes the
// non-standard int len (rather than ssize_t).
#define ACE_HAS_NONCONST_SWAB
#define ACE_HAS_INT_SWAB

// gethostbyaddr does not handle IPv6-mapped-IPv4 addresses
#define ACE_HAS_BROKEN_GETHOSTBYADDR_V4MAPPED

#if defined (ACE_WIN64)
// Data must be aligned on 8-byte boundaries, at a minimum.
#  define ACE_MALLOC_ALIGN 8
// Void pointers are 8 bytes
#  define ACE_SIZEOF_VOID_P 8
#endif /* ACE_WIN64 */

#if !defined (ACE_DISABLES_THREAD_LIBRARY_CALLS)
# define ACE_DISABLES_THREAD_LIBRARY_CALLS 0
#endif /* ACE_DISABLES_THREAD_LIBRARY_CALLS */

#if !defined (ACE_HAS_WINCE) && !defined (ACE_HAS_PHARLAP)
#  define ACE_HAS_LOG_MSG_NT_EVENT_LOG
#endif /* !ACE_HAS_WINCE && !ACE_HAS_PHARLAP */

#if !defined (ACE_HAS_WINCE)
# define ACE_HAS_LLSEEK
#endif /* !ACE_HAS_WINCE */

// Needed for obtaining the MAC address
// I dont believe this will work under CE, notice the
// check for ACE_HAS_WINCE.
# if !defined (ACE_HAS_WINCE)
# include <nb30.h>
#  if defined (_MSC_VER)
#   pragma comment(lib, "netapi32.lib") // needed for obtaing MACaddress
#  endif
# endif /* !ACE_HAS_WINCE */

#if !defined (WINVER)
# define WINVER 0x0400 // pretend it's at least WinNT 4.0
#endif

///////////////////////////////////////
// windows version-specific definitions
// see: http://msdn2.microsoft.com/en-us/library/aa383745.aspx
//
// For TSS information
// see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/thread_local_storage.asp

#if (WINVER>=0x0600)
// Windows Server 2008 definitions go here
// Windows Vista definitions go here
#  if ! defined(ACE_DEFAULT_THREAD_KEYS)
#    define ACE_DEFAULT_THREAD_KEYS 1088
#  endif // ! defined(ACE_DEFAULT_THREAD_KEYS)
#elif (WINVER>=0x0502)
  // Windows Server 2003 SP1 definitions go here
#  if ! defined(ACE_DEFAULT_THREAD_KEYS)
#    define ACE_DEFAULT_THREAD_KEYS 1088
#  endif // ! defined(ACE_DEFAULT_THREAD_KEYS)
#elif (WINVER>=0x0501)
// Windows XP definitions go here
#  if ! defined(ACE_DEFAULT_THREAD_KEYS)
#    define ACE_DEFAULT_THREAD_KEYS 1088
#  endif // ! defined(ACE_DEFAULT_THREAD_KEYS)
#elif (WINVER>=0x0500)
// Windows 2000 definitions go here
#  if ! defined(ACE_DEFAULT_THREAD_KEYS)
#    define ACE_DEFAULT_THREAD_KEYS 1088
#  endif // ! defined(ACE_DEFAULT_THREAD_KEYS)
#elif (WINVER>=0x0410)
// Windows 98 definitions go here
#  if ! defined(ACE_DEFAULT_THREAD_KEYS)
#    define ACE_DEFAULT_THREAD_KEYS 80
#  endif // ! defined(ACE_DEFAULT_THREAD_KEYS)
#else
// antique windows
#  if ! defined(ACE_DEFAULT_THREAD_KEYS)
#    define ACE_DEFAULT_THREAD_KEYS 64
#  endif // ! defined(ACE_DEFAULT_THREAD_KEYS)
#endif

#if !defined (ACE_DEFAULT_BACKLOG)
#  define ACE_DEFAULT_BACKLOG SOMAXCONN
#endif /* ACE_DEFAULT_BACKLOG */

#include /**/ "ace/post.h"
#endif /* ACE_CONFIG_WIN32_COMMON_H */
