/*
 *  Original work: Copyright (c) 2014, Oculus VR, Inc.
 *  All rights reserved.
 *
 *  This source code is licensed under the BSD-style license found in the
 *  RakNet License.txt file in the licenses directory of this source tree. An additional grant 
 *  of patent rights can be found in the RakNet Patents.txt file in the same directory.
 *
 *
 *  Modified work: Copyright (c) 2016-2018, SLikeSoft UG (haftungsbeschränkt)
 *
 *  This source code was modified by SLikeSoft. Modifications are licensed under the MIT-style
 *  license found in the license.txt file in the root directory of this source tree.
 */

#ifndef __RAKNET_DEFINES_H
#define __RAKNET_DEFINES_H

#ifdef _RETAIL
// retail builds imply release configurations
#define _RELEASE
#endif

// If you want to change these defines, put them in RakNetDefinesOverrides so your changes are not lost when updating RakNet
// The user should not edit this file
#include "defineoverrides.h"

/// Define __GET_TIME_64BIT to have SLNet::TimeMS use a 64, rather than 32 bit value.  A 32 bit value will overflow after about 5 weeks.
/// However, this doubles the bandwidth use for sending times, so don't do it unless you have a reason to.
/// Comment out if you are using the iPod Touch TG. See http://www.jenkinssoftware.com/forum/index.php?topic=2717.0
/// This must be the same on all systems, or they won't connect
#ifndef __GET_TIME_64BIT
#define __GET_TIME_64BIT 1
#endif

// Define _FILE_AND_LINE_ to "",0 if you want to strip out file and line info for memory tracking from the EXE
// SWIG: This macro must be excluded from generating C# wrappers/interfaces since SWIG would try to handle the
//       macro as a constant definition and fail to convert it, issuing the following warning:
//       "warning 305: Bad constant value (ignored)." - see SLNET-227 for details
//       Since this is not a constant definition at all, the correct solution is to exclude this macro therefore.
#ifndef _FILE_AND_LINE_
#ifndef SWIG
#ifdef _RETAIL
// retail builds do not contain source-code related information in order to reduce the overall EXE size
#define _FILE_AND_LINE_ "",0
#else
#define _FILE_AND_LINE_ __FILE__,__LINE__
#endif // _RETAIL
#endif // SWIG
#endif // _FILE_AND_LINE_

/// Define RAKNET_COMPATIBILITY to enable API compatibility with RakNet.
/// This allows you to keep existing code which was compatible with RakNet 4.082 unmodified and
/// use SLikeNet as an in-place replacement for the RakNet library without having to modify any
/// of your code.
// #define RAKNET_COMPATIBILITY

/// Define __BITSTREAM_NATIVE_END to NOT support endian swapping in the BitStream class.  This is faster and is what you should use
/// unless you actually plan to have different endianness systems connect to each other
/// Enabled by default.
// #define __BITSTREAM_NATIVE_END

/// Maximum (stack) size to use with _alloca before using new and delete instead.
#ifndef MAX_ALLOCA_STACK_ALLOCATION
#define MAX_ALLOCA_STACK_ALLOCATION 1048576
#endif

// Use WaitForSingleObject instead of sleep.
// Defining it plays nicer with other systems, and uses less CPU, but gives worse RakNet performance
// Undefining it uses more CPU time, but is more responsive and faster.
#ifndef _WIN32_WCE
#define USE_WAIT_FOR_MULTIPLE_EVENTS
#endif

/// Uncomment to use RakMemoryOverride for custom memory tracking
/// See memoryoverride.h. 
#ifndef _USE_RAK_MEMORY_OVERRIDE
#define _USE_RAK_MEMORY_OVERRIDE 0
#endif

/// If defined, OpenSSL is enabled for the class TCPInterface
/// This is necessary to use the SendEmail class with Google POP servers
/// Note that OpenSSL carries its own license restrictions that you should be aware of. If you don't agree, don't enable this define
/// This also requires that you enable header search paths to DependentExtensions/openssl/include/[platform]
#ifndef OPEN_SSL_CLIENT_SUPPORT
#define OPEN_SSL_CLIENT_SUPPORT 0
#endif

/// Threshold at which to do a malloc / free rather than pushing data onto a fixed stack for the bitstream class
/// Arbitrary size, just picking something likely to be larger than most packets
#ifndef BITSTREAM_STACK_ALLOCATION_SIZE
#define BITSTREAM_STACK_ALLOCATION_SIZE 256
#endif

// Redefine if you want to disable or change the target for debug RAKNET_DEBUG_PRINTF
#ifndef RAKNET_DEBUG_PRINTF
#define RAKNET_DEBUG_PRINTF printf
#endif

#ifndef RAKNET_DEBUG_TPRINTF
#define RAKNET_DEBUG_TPRINTF _tprintf
#endif

// Maximum number of local IP addresses supported
#ifndef MAXIMUM_NUMBER_OF_INTERNAL_IDS
#define MAXIMUM_NUMBER_OF_INTERNAL_IDS 10
#endif

#ifndef RakAssert
#if   defined(__native_client__)
#define RakAssert(x)
#else
#if defined(_DEBUG)
#define RakAssert(x) assert(x);
#else
#define RakAssert(x) 
#endif
#endif
#endif

#if !defined(_DEBUG) || defined(__native_client__)
#define SLNET_VERIFY(x) ((void)(x))
#else
#define SLNET_VERIFY(x) RakAssert(x)
#endif

/// This controls the amount of memory used per connection.
/// This many datagrams are tracked by datagramNumber. If more than this many datagrams are sent, then an ack for an older datagram would be ignored
/// This results in an unnecessary resend in that case
#ifndef DATAGRAM_MESSAGE_ID_ARRAY_LENGTH
#define DATAGRAM_MESSAGE_ID_ARRAY_LENGTH 512
#endif

/// This is the maximum number of reliable user messages that can be on the wire at a time
/// If this is too low, then high ping connections with a large throughput will be underutilized
/// This will be evident because RakNetStatistics::messagesInSend buffer will increase over time, yet at the same time the outgoing bandwidth per second is less than your connection supports
#ifndef RESEND_BUFFER_ARRAY_LENGTH
#define RESEND_BUFFER_ARRAY_LENGTH 512
#define RESEND_BUFFER_ARRAY_MASK 511
#endif

/// Uncomment if you want to link in the DLMalloc library to use with RakMemoryOverride
// #define _LINK_DL_MALLOC

#ifndef GET_TIME_SPIKE_LIMIT
/// Workaround for http://support.microsoft.com/kb/274323
/// If two calls between SLNet::GetTime() happen farther apart than this time in microseconds, this delta will be returned instead
/// Note: This will cause ID_TIMESTAMP to be temporarily inaccurate if you set a breakpoint that pauses the UpdateNetworkLoop() thread in RakPeer
/// Define in definesoverrides.h to enable (non-zero) or disable (0)
#define GET_TIME_SPIKE_LIMIT 0
#endif

// Use sliding window congestion control instead of ping based congestion control
#ifndef USE_SLIDING_WINDOW_CONGESTION_CONTROL
#define USE_SLIDING_WINDOW_CONGESTION_CONTROL 1
#endif

// When a large message is arriving, preallocate the memory for the entire block
// This results in large messages not taking up time to reassembly with memcpy, but is vulnerable to attackers causing the host to run out of memory
#ifndef PREALLOCATE_LARGE_MESSAGES
#define PREALLOCATE_LARGE_MESSAGES 0
#endif

#ifndef RAKNET_SUPPORT_IPV6
#define RAKNET_SUPPORT_IPV6 0
#endif

#ifndef RAKSTRING_TYPE
#if defined(_UNICODE)
#define RAKSTRING_TYPE RakWString
#define RAKSTRING_TYPE_IS_UNICODE 1
#else
#define RAKSTRING_TYPE RakString
#define RAKSTRING_TYPE_IS_UNICODE 0
#endif
#endif

#ifndef RPC4_GLOBAL_REGISTRATION_MAX_FUNCTIONS
#define RPC4_GLOBAL_REGISTRATION_MAX_FUNCTIONS 48
#endif

#ifndef RPC4_GLOBAL_REGISTRATION_MAX_FUNCTION_NAME_LENGTH
#define RPC4_GLOBAL_REGISTRATION_MAX_FUNCTION_NAME_LENGTH 48
#endif

#ifndef XBOX_BYPASS_SECURITY
#define XBOX_BYPASS_SECURITY 1
#endif

// Controls how many allocations occur at once for the memory pool of incoming datagrams waiting to be transferred between the recvfrom thread and the main update thread
// Has large effect on memory usage, per instance of RakPeer. Approximately MAXIMUM_MTU_SIZE*BUFFERED_PACKETS_PAGE_SIZE bytes, once after calling RakPeer::Startup()
#ifndef BUFFERED_PACKETS_PAGE_SIZE
#define BUFFERED_PACKETS_PAGE_SIZE 8
#endif

// Controls how many allocations occur at once for the memory pool of incoming or outgoing datagrams.
// Has small effect on memory usage per connection. Uses about 256 bytes*INTERNAL_PACKET_PAGE_SIZE per connection
#ifndef INTERNAL_PACKET_PAGE_SIZE
#define INTERNAL_PACKET_PAGE_SIZE 8
#endif

// If defined to 1, the user is responsible for calling RakPeer::RunUpdateCycle and RakPeer::RunRecvfrom
#ifndef RAKPEER_USER_THREADED
#define RAKPEER_USER_THREADED 0
#endif

#ifndef USE_ALLOCA
#define USE_ALLOCA 1
#endif

//#define USE_THREADED_SEND

// @since 0.1.1: added
// Controls the maximum retrievable filesize for incoming files using FileListTransfer.
// The configured limit only applies for files which are transferred incrementally (which basically applies to any larger file).
// Note that this also impacts the upper limit for memory allocations. It's suggested to redefine the value to a reasonable smaller size in the defineoverrides.h header file.
// For backwards compatibility with RakNet, the default is set to 4 GiB-1.
// #low - consider introducing GiB/MiB/KiB-functions and then define as GiB(4)?
#ifndef SLNET_MAX_RETRIEVABLE_FILESIZE
#define SLNET_MAX_RETRIEVABLE_FILESIZE (0xFFFFFFFF)
#endif

// #blocker_2_0 - remove RAKNET_COMPATIBILITY
#ifdef RAKNET_COMPATIBILITY
// note: we cannot use namespace aliases here since we need to ensure ABI compatibility with shared libraries/DLLs
// if we'd use a namespace alias, the names in the DLLs would still point to the actual namespace (SLNet) rather
// than the alias namespace and old apps would not be able to use the DLL as an in-place replacement
// hence, go with a simple preprocessor macro which will replace the SLNet namespace names with RakNet
#define SLNet RakNet
#endif

#endif // __RAKNET_DEFINES_H
