/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file is part of zmqpp.
 * Copyright (c) 2011-2015 Contributors as noted in the AUTHORS file.
 */

/**
 * \file
 *
 * \date   23 Sep 2011
 * \author Ben Gray (\@benjamg)
 */

#ifndef ZMQPP_SOCKET_OPTIONS_HPP_
#define ZMQPP_SOCKET_OPTIONS_HPP_

namespace zmqpp
{

/** \todo Expand the information on the options to make it actually useful. */
/*!
 * \brief possible Socket options in zmq
 */

ZMQPP_COMPARABLE_ENUM socket_option {
	affinity                  = ZMQ_AFFINITY,          /*!< I/O thread affinity */
	identity                  = ZMQ_IDENTITY,          /*!< Socket identity */
	subscribe                 = ZMQ_SUBSCRIBE,         /*!< Add topic subscription - set only */
	unsubscribe               = ZMQ_UNSUBSCRIBE,       /*!< Remove topic subscription - set only */
	rate                      = ZMQ_RATE,              /*!< Multicast data rate */
	send_buffer_size          = ZMQ_SNDBUF,            /*!< Kernel transmission buffer size */
	receive_buffer_size       = ZMQ_RCVBUF,            /*!< Kernel receive buffer size */
	receive_more              = ZMQ_RCVMORE,           /*!< Can receive more parts - get only */
	file_descriptor           = ZMQ_FD,                /*!< Socket file descriptor - get only */
	events                    = ZMQ_EVENTS,            /*!< Socket event flags - get only */
	type                      = ZMQ_TYPE,              /*!< Socket type - get only */
	linger                    = ZMQ_LINGER,            /*!< Socket linger timeout */
	backlog                   = ZMQ_BACKLOG,           /*!< Maximum length of outstanding connections - get only */
	reconnect_interval        = ZMQ_RECONNECT_IVL,     /*!< Reconnection interval */
	reconnect_interval_max    = ZMQ_RECONNECT_IVL_MAX, /*!< Maximum reconnection interval */
	receive_timeout           = ZMQ_RCVTIMEO,          /*!< Maximum inbound block timeout */
	send_timeout              = ZMQ_SNDTIMEO,          /*!< Maximum outbound block timeout */

#if (ZMQ_VERSION_MAJOR == 2)
    // Note that this is inverse of the zmq names for version 2.x
	recovery_interval_seconds = ZMQ_RECOVERY_IVL,      /*!< Multicast recovery interval in seconds */
	recovery_interval         = ZMQ_RECOVERY_IVL_MSEC, /*!< Multicast recovery interval in milliseconds */
	high_water_mark           = ZMQ_HWM,               /*!< High-water mark for all messages */
	swap_size                 = ZMQ_SWAP,              /*!< Maximum socket swap size in bytes */
	multicast_loopback        = ZMQ_MCAST_LOOP,        /*!< Allow multicast packet loopback */
#else // version > 2
	recovery_interval         = ZMQ_RECOVERY_IVL,      /*!< Multicast recovery interval in milliseconds */
	max_messsage_size         = ZMQ_MAXMSGSIZE,        /*!< Maximum inbound message size */
	send_high_water_mark      = ZMQ_SNDHWM,            /*!< High-water mark for outbound messages */
	receive_high_water_mark   = ZMQ_RCVHWM,            /*!< High-water mark for inbound messages */
	multicast_hops            = ZMQ_MULTICAST_HOPS,    /*!< Maximum number of multicast hops */

 #if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 1))
	ipv4_only                 = ZMQ_IPV4ONLY,
 #endif

 #if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 2))
  #if ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR == 2))
	delay_attach_on_connect   = ZMQ_DELAY_ATTACH_ON_CONNECT, /*!< Delay buffer attachment until connect complete */
  #else
	//  ZMQ_DELAY_ATTACH_ON_CONNECT is renamed in ZeroMQ starting 3.3.x
	immediate                 = ZMQ_IMMEDIATE,               /*!< Block message sending until connect complete */
  #endif
	last_endpoint             = ZMQ_LAST_ENDPOINT,           /*!< Last bound endpoint - get only */
	router_mandatory          = ZMQ_ROUTER_MANDATORY,        /*!< Require routable messages - set only */
	xpub_verbose              = ZMQ_XPUB_VERBOSE,            /*!< Pass on existing subscriptions - set only */
	tcp_keepalive             = ZMQ_TCP_KEEPALIVE,           /*!< Enable TCP keepalives */
	tcp_keepalive_idle        = ZMQ_TCP_KEEPALIVE_IDLE,      /*!< TCP keepalive idle count (generally retry count) */
	tcp_keepalive_count       = ZMQ_TCP_KEEPALIVE_CNT,       /*!< TCP keepalive retry count */
	tcp_keepalive_interval    = ZMQ_TCP_KEEPALIVE_INTVL,     /*!< TCP keepalive interval */
	tcp_accept_filter         = ZMQ_TCP_ACCEPT_FILTER,       /*!< Filter inbound connections - set only */
 #endif

 #if (ZMQ_VERSION_MAJOR >= 4)
	ipv6                      = ZMQ_IPV6, /*!< IPv6 socket support status */
	mechanism                 = ZMQ_MECHANISM, /*!< Socket security mechanism - get only */
	plain_password            = ZMQ_PLAIN_PASSWORD, /*!< PLAIN password */
	plain_server              = ZMQ_PLAIN_SERVER, /*!< PLAIN server role */
	plain_username            = ZMQ_PLAIN_USERNAME, /*!< PLAIN username */
	zap_domain                = ZMQ_ZAP_DOMAIN, /*!< RFC 27 authentication domain */
	conflate                  = ZMQ_CONFLATE, /*!< Keep only last message - set only */
	curve_public_key          = ZMQ_CURVE_PUBLICKEY, /*!< CURVE public key */
	curve_secret_key          = ZMQ_CURVE_SECRETKEY, /*!< CURVE secret key */
	curve_server_key          = ZMQ_CURVE_SERVERKEY, /*!< CURVE server key */
	curve_server              = ZMQ_CURVE_SERVER, /*!< CURVE server role - set only */
	probe_router              = ZMQ_PROBE_ROUTER, /*!< Bootstrap connections to ROUTER sockets - set only */
	request_correlate         = ZMQ_REQ_CORRELATE, /*!< Match replies with requests - set only */
	request_relaxed           = ZMQ_REQ_RELAXED, /*!< Relax strict alternation between request and reply - set only */
	router_raw                = ZMQ_ROUTER_RAW, /*!< Switch ROUTER socket to raw mode - set only */
 #endif

 #if (ZMQ_VERSION_MAJOR > 4) || ((ZMQ_VERSION_MAJOR == 4) && (ZMQ_VERSION_MINOR >= 1))
	handshake_interval        = ZMQ_HANDSHAKE_IVL, /*!< Maximum handshake interval */
	type_of_service           = ZMQ_TOS, /*!< Type-of-Service socket override status */
	connect_rid               = ZMQ_CONNECT_RID, /*!< Assign the next outbound connection id - set only */
	ipc_filter_gid            = ZMQ_IPC_FILTER_GID, /*!< Group ID filters to allow new IPC connections - set only */
	ipc_filter_pid            = ZMQ_IPC_FILTER_PID, /*!< Process ID filters to allow new IPC connections - set only */
	ipc_filter_uid            = ZMQ_IPC_FILTER_UID, /*!< User ID filters to allow new IPC connections - set only */
	router_handover           = ZMQ_ROUTER_HANDOVER, /*!< Handle duplicate client identities on ROUTER sockets - set only */
 #endif
 #if (ZMQ_VERSION_MAJOR > 4) || ((ZMQ_VERSION_MAJOR == 4) && (ZMQ_VERSION_MINOR >= 2))
	connect_timeout           = ZMQ_CONNECT_TIMEOUT, /*< Connect system call timeout */
	gssapi_plaintext          = ZMQ_GSSAPI_PLAINTEXT, /*< GSSAPI plaintext (disabled) state */
	gssapi_principal          = ZMQ_GSSAPI_PRINCIPAL, /*< GSSAPI principal name */
	gssapi_server             = ZMQ_GSSAPI_SERVER, /*< GSSAPI server state */
	gssapi_service_principal   = ZMQ_GSSAPI_SERVICE_PRINCIPAL, /*< GSSAPI connected server principal name */
	heartbeat_interval        = ZMQ_HEARTBEAT_IVL, /*< Heartbeat interval for ZMPT - set only */
	heartbeat_timeout         = ZMQ_HEARTBEAT_TIMEOUT, /*< ZMPT heartbeat timeout - set only */
	heartbeat_ttl             = ZMQ_HEARTBEAT_TTL, /*< ZMPT heartbeat interval - set only */
	invert_matching           = ZMQ_INVERT_MATCHING, /*< ZMPT invert state for PUB/SUB message filters */
	multicast_max_tpdu        = ZMQ_MULTICAST_MAXTPDU, /*< Max size for multicast messages */
	socks_proxy               = ZMQ_SOCKS_PROXY, /*< SOCKS5 proxy address for routing tcp connections */
	stream_notify             = ZMQ_STREAM_NOTIFY, /*< Event state on connect/disconnection of peers */
	tpc_max_retransmit        = ZMQ_TCP_MAXRT, /*< Maximum retransmit timeout */
	use_fd                    = ZMQ_USE_FD, /*!< Use a pre-allocated file descriptor instead of allocating a new one */
	vmci_buffer_size          = ZMQ_VMCI_BUFFER_SIZE, /*< VMCI buffer size */
	vmci_buffer_min           = ZMQ_VMCI_BUFFER_MIN_SIZE, /*< VMCI minimum buffer size */
	vmci_buffer_max           = ZMQ_VMCI_BUFFER_MAX_SIZE, /*< VMCI maximum buffer size */
	vmci_connect_timeout      = ZMQ_VMCI_CONNECT_TIMEOUT, /*< VMCI connection attempt timeout */
	xpub_manual               = ZMQ_XPUB_MANUAL,
	xpub_nodrop               = ZMQ_XPUB_NODROP,
	xpub_verboser             = ZMQ_XPUB_VERBOSER, /*!< Pass on existing (un)subscriptions - set only */
	xpub_welcome_message      = ZMQ_XPUB_WELCOME_MSG,
  #endif
#endif // version > 2

#ifdef ZMQ_EXPERIMENTAL_LABELS
	receive_label             = ZMQ_RCVLABEL,          /*!< Received label part - get only */
#endif
};

}

#endif /* ZMQPP_SOCKET_OPTIONS_HPP_ */