diff options
author | Shauren <shauren.trinity@gmail.com> | 2016-03-20 18:50:25 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-03-20 18:50:25 +0100 |
commit | 92e247b22674dc78a7836947af3f656cc84ac1a1 (patch) | |
tree | e2d08b1bc05cd51bebd2dc29635cd96b539f239e | |
parent | 1fea358becc00d358e0c79a86645258080aea5b5 (diff) |
Core/Dep: Removed ZMQ dependency in preparation for future changes
50 files changed, 6 insertions, 4853 deletions
diff --git a/dep/CMakeLists.txt b/dep/CMakeLists.txt index 2e7c2addb1f..d60e0ca56a6 100644 --- a/dep/CMakeLists.txt +++ b/dep/CMakeLists.txt @@ -34,8 +34,6 @@ if(SERVERS) add_subdirectory(process) add_subdirectory(readline) add_subdirectory(gsoap) - add_subdirectory(zmq) - add_subdirectory(zmqpp) endif() if(TOOLS) diff --git a/dep/zmq/CMakeLists.txt b/dep/zmq/CMakeLists.txt deleted file mode 100644 index 9d9f78ca8e5..00000000000 --- a/dep/zmq/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -find_package(ZMQ REQUIRED) - -add_library(zmq INTERFACE) - -target_link_libraries(zmq - INTERFACE - ${ZMQ_LIBRARY}) - -target_include_directories(zmq - INTERFACE - ${ZMQ_INCLUDE_DIR}) diff --git a/dep/zmqpp/CMakeLists.txt b/dep/zmqpp/CMakeLists.txt deleted file mode 100644 index 0514d73be0b..00000000000 --- a/dep/zmqpp/CMakeLists.txt +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -file(GLOB_RECURSE sources_zmqpp zmqpp/*.cpp zmqpp/*.hpp zmqpp/*.h) - -include_directories(${ZMQ_INCLUDE_DIR}) - -add_library(zmqpp STATIC - ${sources_zmqpp} -) - -target_link_libraries(zmqpp - PUBLIC - zmq) - -target_include_directories(zmqpp - PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}) - -set_target_properties(zmqpp - PROPERTIES - FOLDER - "dep") - -target_compile_definitions(zmqpp - PRIVATE - -DBUILD_VERSION_MAJOR=3 - -DBUILD_VERSION_MINOR=2 - -DBUILD_VERSION_REVISION=0 - -DBUILD_VERSION="3.2.0") diff --git a/dep/zmqpp/zmqpp/compatibility.hpp b/dep/zmqpp/zmqpp/compatibility.hpp deleted file mode 100644 index 103b2c82ebd..00000000000 --- a/dep/zmqpp/zmqpp/compatibility.hpp +++ /dev/null @@ -1,97 +0,0 @@ -/** - * \file - * - * \date 10 Sep 2011 - * \author ron - * \author Ben Gray (\@benjamg) - * - * A fair number of C++0x (or more accurately C++11) features are used in this - * library and as this project is used where I work on older compilers this - * file was created to help. - * - * C++ features and their workaround where not supported: - * \li lambda functions - disabled, these are only used in the test anyway. - * \li typesafe enums - replaced with enum where comparisons needed. - * \li nullptr - defined to null. - * - * As of the port to version 3.1 (libzmqpp version 1.1.0) this file will also - * be used to maintain compatablity with multiple versions of 0mq - */ - -#ifndef ZMQPP_COMPATIBILITY_HPP_ -#define ZMQPP_COMPATIBILITY_HPP_ - -#include <zmq.h> -#include <cstdint> - -// Currently we require at least 0mq version 2.2.x -#define ZMQPP_REQUIRED_ZMQ_MAJOR 2 -#define ZMQPP_REQUIRED_ZMQ_MINOR 2 - -#if (ZMQ_VERSION_MAJOR < ZMQPP_REQUIRED_ZMQ_MAJOR) || ((ZMQ_VERSION_MAJOR == ZMQPP_REQUIRED_ZMQ_MAJOR) && (ZMQ_VERSION_MINOR < ZMQPP_REQUIRED_ZMQ_MINOR)) -#error zmqpp requires a later version of 0mq -#endif - -// Experimental feature support -#if (ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR == 0) -#define ZMQ_EXPERIMENTAL_LABELS -#endif - -// Deal with older versions of gcc -#if defined(__GNUC__) && !defined(__clang__) -#if __GNUC__ == 4 - -// Deal with older gcc not supporting C++0x typesafe enum class name {} comparison -#if __GNUC_MINOR__ < 4 -#define ZMQPP_COMPARABLE_ENUM enum -#endif - -#if __GNUC_MINOR__ == 4 -#if __GNUC_PATCHLEVEL__ < 1 -#undef ZMQPP_COMPARABLE_ENUM -#define ZMQPP_COMPARABLE_ENUM enum -#endif // if __GNUC_PATCHLEVEL__ < 1 -#endif // if __GNUC_MINOR__ == 4 - -// Deal with older gcc not supporting C++0x lambda function -#if __GNUC_MINOR__ < 5 -#define ZMQPP_IGNORE_LAMBDA_FUNCTION_TESTS -#define ZMQPP_EXPLICITLY_DELETED -#endif // if __GNUC_MINOR__ < 5 - -// Deal with older gcc not supporting C++0x nullptr -#if __GNUC_MINOR__ < 6 -#define nullptr NULL -#define NOEXCEPT -#endif // if __GNUC_MINOR__ < 6 - -#endif // if __GNUC_ == 4 -#endif // if defined(__GNUC__) && !defined(__clang__) - -#if defined(_MSC_VER) -#define NOEXCEPT throw() -#if _MSC_VER < 1800 -#define ZMQPP_EXPLICITLY_DELETED -#endif // if _MSC_VER < 1800 -#if _MSC_VER < 1600 -#define nullptr NULL -#define ZMQPP_IGNORE_LAMBDA_FUNCTION_TESTS -#define ZMQPP_COMPARABLE_ENUM enum -#endif // if _MSC_VER < 1600 -#endif // if defined(_MSC_VER) - -// Generic state, assume a modern compiler -#ifndef ZMQPP_COMPARABLE_ENUM -#define ZMQPP_COMPARABLE_ENUM enum class -#endif - -#ifndef ZMQPP_EXPLICITLY_DELETED -#define ZMQPP_EXPLICITLY_DELETED = delete -#endif - -#ifndef NOEXCEPT -#define NOEXCEPT noexcept -#endif - -#endif /* ZMQPP_COMPATIBILITY_HPP_ */ - diff --git a/dep/zmqpp/zmqpp/context.cpp b/dep/zmqpp/zmqpp/context.cpp deleted file mode 100644 index 32c657199dc..00000000000 --- a/dep/zmqpp/zmqpp/context.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/** - * \file - * - * \date 9 Aug 2011 - * \author Ben Gray (\@benjamg) - */ - -#include "context.hpp" - -namespace zmqpp -{ - -void context::terminate() -{ - int result; - do - { -#if (ZMQ_VERSION_MAJOR < 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR < 2)) - result = zmq_term(_context); -#else - result = zmq_ctx_destroy(_context); -#endif - } while (result != 0 && zmq_errno() == EINTR); - if (result != 0) { throw zmq_internal_exception(); } - _context = nullptr; -} - -#if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 2)) -void context::set(context_option const option, int const value) -{ - if (nullptr == _context) { throw invalid_instance("context is invalid"); } - - if (0 != zmq_ctx_set(_context, static_cast<int>(option), value)) - { - throw zmq_internal_exception(); - } -} - -int context::get(context_option const option) -{ - if (nullptr == _context) { throw invalid_instance("context is invalid"); } - - int result = zmq_ctx_get(_context, static_cast<int>(option)); - - if (result < 0) - { - throw zmq_internal_exception(); - } - - return result; -} -#endif - -} diff --git a/dep/zmqpp/zmqpp/context.hpp b/dep/zmqpp/zmqpp/context.hpp deleted file mode 100644 index 3ffaf791440..00000000000 --- a/dep/zmqpp/zmqpp/context.hpp +++ /dev/null @@ -1,184 +0,0 @@ -/** - * \file - * - * \date 9 Aug 2011 - * \author Ben Gray (\@benjamg) - */ - -#ifndef ZMQPP_CONTEXT_HPP_ -#define ZMQPP_CONTEXT_HPP_ - -#include <cassert> - -#include <zmq.h> - -#include "compatibility.hpp" -#include "exception.hpp" -#if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 2)) -#include "context_options.hpp" -#endif - -namespace zmqpp -{ - -/*! - * The context class represents internal zmq context and io threads. - * - * By default the context class will create one thread, however this can be - * overridden in the constructor. - * - * The context class is the only object that can be considered thread safe. - * - * All sockets using endpoints other than inproc require the context to have - * at least one thread. - * - * This class is c++0x move supporting and cannot be copied. - */ -class context -{ -public: - -#if (ZMQ_VERSION_MAJOR < 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR < 2)) - /*! - * Initialise the 0mq context. - * - * If only inproc is used then the context may be created with zero threads. - * Any inproc endpoint using sockets must be created using the same context. - * - * The context is thread safe an may be used anywhere in your application, - * however there is no requirement (other than inproc restrictions) for you - * to do this. - * - * \param threads an integer argument for the number of required threads. Defaults to 1. - */ - context(int const& threads = 1) -#else - /*! - * Initialise the 0mq context. - * - * The context is thread safe an may be used anywhere in your application, - * however there is no requirement (other than inproc restrictions) for you - * to do this. - */ - context() -#endif - : _context(nullptr) - { -#if (ZMQ_VERSION_MAJOR < 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR < 2)) - _context = zmq_init(threads); -#else - _context = zmq_ctx_new(); -#endif - - if (nullptr == _context) - { - throw zmq_internal_exception(); - } - } - - /*! - * Closes the 0mq context. - * - * Any blocking calls other than a socket close will return with an error. - * - * If there are open sockets will block while zmq internal buffers are - * processed up to a limit specified by that sockets linger option. - */ - ~context() NOEXCEPT - { - if (nullptr != _context) - { - terminate(); - } - } - - /*! - * Move supporting constructor. - * - * Allows zero-copy move semantics to be used with this class. - * - * \param source a rvalue instance of the object who's internals we wish to steal. - */ - context(context&& source) NOEXCEPT - : _context(source._context) - { - source._context = nullptr; - } - - /*! - * Move supporting operator. - * - * Allows zero-copy move semantics to be used with this class. - * - * \param source an rvalue instance of the context who's internals we wish to steal. - */ - context& operator=(context&& source) NOEXCEPT - { - std::swap( _context, source._context ); - return *this; - } - - /*! - * Terminate the current context. - * - * Any blocking calls other than a socket close will return with an error. - * - * If there are open sockets will block while zmq internal buffers are - * processed up to a limit specified by that sockets linger option. - */ - void terminate(); - -#if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 2)) - /*! - * Set the value of an option in the underlaying zmq context. - * - * \param option a valid ::context_option - * \param value to set the option to - */ - void set(context_option const option, int const value); - - /*! - * Get a context option from the underlaying zmq context. - * - * \param option a valid ::context_option - * \return context option value - */ - int get(context_option const option); -#endif - - /*! - * Validity checking of the context - * - * Checks if the underlying 0mq context for this instance is valid. - * - * Contexts should always be valid unless people are doing 'fun' things with - * std::move. - * - * \return boolean true if the object is valid. - */ - operator bool() const NOEXCEPT - { - return nullptr != _context; - } - - /*! - * Access to the raw 0mq context - * - * \return void pointer to the underlying 0mq context. - */ - operator void*() const NOEXCEPT - { - return _context; - } - -private: - void* _context; - - // No copy - private and not implemented - context(context const&) ZMQPP_EXPLICITLY_DELETED; - context& operator=(context const&) NOEXCEPT ZMQPP_EXPLICITLY_DELETED; -}; - -} - -#endif /* ZMQPP_CONTEXT_HPP_ */ diff --git a/dep/zmqpp/zmqpp/context_options.hpp b/dep/zmqpp/zmqpp/context_options.hpp deleted file mode 100644 index b2e2cf4805f..00000000000 --- a/dep/zmqpp/zmqpp/context_options.hpp +++ /dev/null @@ -1,26 +0,0 @@ -/** - * \file - * - * \date 3 Jul 2013 - * \author Ben Gray (\@benjamg) - */ - -#ifndef ZMQPP_CONTEXT_OPTIONS_HPP_ -#define ZMQPP_CONTEXT_OPTIONS_HPP_ - -namespace zmqpp -{ - -/** \todo Expand the information on the options to make it actually useful. */ -/*! - * \brief possible Context options in zmq - */ - -enum class context_option { - io_threads = ZMQ_IO_THREADS, /*!< I/O thread count */ - max_sockets = ZMQ_MAX_SOCKETS, /*!< Maximum supported sockets */ -}; - -} - -#endif /* ZMQPP_CONTEXT_OPTIONS_HPP_ */ diff --git a/dep/zmqpp/zmqpp/exception.hpp b/dep/zmqpp/zmqpp/exception.hpp deleted file mode 100644 index a0b234769ce..00000000000 --- a/dep/zmqpp/zmqpp/exception.hpp +++ /dev/null @@ -1,87 +0,0 @@ -/** - * \file - * - * \date 9 Aug 2011 - * \author Ben Gray (\@benjamg) - */ - -#ifndef ZMQPP_EXCEPTION_HPP_ -#define ZMQPP_EXCEPTION_HPP_ - -#include <stdexcept> -#include <string> - -#include <zmq.h> - -namespace zmqpp -{ - -/** \todo Have a larger variety of exceptions with better state debug information */ - -/*! - * Represents the base zmqpp exception. - * - * All zmqpp runtime exceptions are children of this class. - * The class itself does not provide any special access fields but it only - * for convince when catching exceptions. - * - * The class extends std::runtime_error. - * - */ -class exception : public std::runtime_error -{ -public: - /*! - * Standard exception constructor. - * - * \param message a string representing the error message. - */ - exception(std::string const& message) - : std::runtime_error(message) - { } -}; - -/*! - * Represents an attempt to use an invalid object. - * - * Objects may be invalid initially or after a shutdown or close. - */ -class invalid_instance : public exception -{ -public: - invalid_instance(std::string const& message) - : exception(message) - { } -}; - -/*! - * Represents internal zmq errors. - * - * Any error response from the zmq bindings will be wrapped in this error. - * - * The class provides access to the zmq error number via zmq_error(). - */ -class zmq_internal_exception : public exception -{ -public: - /*! - * Uses the zmq functions to pull out error messages and numbers. - */ - zmq_internal_exception() - : exception(zmq_strerror(zmq_errno())) - , _error(zmq_errno()) - { } - - /*! - * Retrieve the zmq error number associated with this exception. - * \return zmq error number - */ - int zmq_error() const { return _error; } - -private: - int _error; -}; - -} - -#endif /* ZMQPP_EXCEPTION_HPP_ */ diff --git a/dep/zmqpp/zmqpp/frame.cpp b/dep/zmqpp/zmqpp/frame.cpp deleted file mode 100644 index 4c512ae1010..00000000000 --- a/dep/zmqpp/zmqpp/frame.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/** - * \file - * - * \date 8 Jan 2014 - * \author Ben Gray (\@benjamg) - */ - -#include <cassert> -#include <cstring> - -#include "exception.hpp" -#include "frame.hpp" - -namespace zmqpp { - -frame::frame() - : _sent( false ) -{ - if( 0 != zmq_msg_init( &_msg ) ) - { - throw zmq_internal_exception(); - } -} - -frame::frame(size_t const size) - : _sent( false ) -{ - if( 0 != zmq_msg_init_size( &_msg, size ) ) - { - throw zmq_internal_exception(); - } -} - -frame::frame(void const* part, size_t const size) - : _sent( false ) -{ - if( 0 != zmq_msg_init_size( &_msg, size ) ) - { - throw zmq_internal_exception(); - } - - void* msg_data = zmq_msg_data( &_msg ); - memcpy( msg_data, part, size ); -} - -frame::frame(void* part, size_t const size, zmq_free_fn *ffn, void *hint) - : _sent( false ) -{ - if( 0 != zmq_msg_init_data( &_msg, part, size, ffn, hint ) ) - { - throw zmq_internal_exception(); - } -} - -frame::~frame() -{ -#ifndef NDEBUG // unused assert variable in release - int result = zmq_msg_close( &_msg ); - assert(0 == result); -#else - zmq_msg_close( &_msg ); -#endif // NDEBUG -} - -frame::frame(frame&& other) - : _sent( other._sent ) -{ - zmq_msg_init( &_msg ); - zmq_msg_move( &_msg, &other._msg ); - other._sent = false; -} - -frame& frame::operator=(frame&& other) -{ - zmq_msg_init( &_msg ); - zmq_msg_move( &_msg, &other._msg ); - std::swap( _sent, other._sent ); - - return *this; -} - -frame frame::copy() const -{ - frame other( size() ); - other._sent = _sent; - - if( 0 != zmq_msg_copy( &other._msg, const_cast<zmq_msg_t*>(&_msg) ) ) - { - throw zmq_internal_exception(); - } - - return other; -} - -} // namespace zmqpp diff --git a/dep/zmqpp/zmqpp/frame.hpp b/dep/zmqpp/zmqpp/frame.hpp deleted file mode 100644 index c9e4b9b7d82..00000000000 --- a/dep/zmqpp/zmqpp/frame.hpp +++ /dev/null @@ -1,58 +0,0 @@ -/** - * \file - * - * \date 8 Jan 2014 - * \author Ben Gray (\@benjamg) - */ - -#ifndef ZMQPP_MESSAGE_FRAME_HPP_ -#define ZMQPP_MESSAGE_FRAME_HPP_ - -#include <zmq.h> - -#include "compatibility.hpp" - -namespace zmqpp { - -/*! - * \brief an internal frame wrapper for a single zmq message - * - * This frame wrapper consists of a zmq message and meta data it is used - * by the zmqpp message class to keep track of parts in the internal - * queue. It is unlikely you need to use this class. - */ -class frame -{ -public: - frame(); - frame(size_t const size); - frame(void const* part, size_t const size); - frame(void* part, size_t const size, zmq_free_fn *ffn, void *hint); - - ~frame(); - - bool is_sent() const { return _sent; } - void const* data() const { return zmq_msg_data( const_cast<zmq_msg_t*>(&_msg) ); } - size_t size() const { return zmq_msg_size( const_cast<zmq_msg_t*>(&_msg) ); } - - void mark_sent() { _sent = true; } - zmq_msg_t& msg() { return _msg; } - - // Move operators - frame(frame&& other); - frame& operator=(frame&& other); - - frame copy() const; - -private: - bool _sent; - zmq_msg_t _msg; - - // Disable implicit copy support, code must request a copy to clone - frame(frame const&) NOEXCEPT ZMQPP_EXPLICITLY_DELETED; - frame& operator=(frame const&) NOEXCEPT ZMQPP_EXPLICITLY_DELETED; -}; - -} // namespace zmqpp - -#endif /* ZMQPP_MESSAGE_FRAME_HPP_ */ diff --git a/dep/zmqpp/zmqpp/inet.hpp b/dep/zmqpp/zmqpp/inet.hpp deleted file mode 100644 index e0c3b146e37..00000000000 --- a/dep/zmqpp/zmqpp/inet.hpp +++ /dev/null @@ -1,175 +0,0 @@ -/** - * \file - * - * \date 10 Aug 2011 - * \author Ben Gray (\@benjamg) - */ - -#ifndef ZMQPP_INET_HPP_ -#define ZMQPP_INET_HPP_ - -/** \todo cross-platform version of including headers. */ -// We get htons and htonl from here -#ifdef _WIN32 -#include <WinSock2.h> -#else -#include <netinet/in.h> -#endif - -#include "compatibility.hpp" - -namespace zmqpp -{ - -/*! - * \brief Possible byte order types. - * - * An enumeration of all the known order types, all two of them. - * There is also an entry for unknown which is just used as a default. - */ -ZMQPP_COMPARABLE_ENUM order { - big_endian, /*!< byte order is big endian */ - little_endian /*!< byte order is little endian */ -}; - -/*! - * Common code for the 64bit versions of htons/htons and ntohs/ntohl - * - * As htons and ntohs (or htonl and ntohs) always just do the same thing, ie - * swap bytes if the host order differs from network order or otherwise don't - * do anything, it seemed silly to type the code twice. - * - * \note This code assumes network order is always big endian. Which it is. - * \note The host endian is only checked once and afterwards assumed to remain - * the same. - * - * \param value_to_check unsigned 64 bit integer to swap - * \return swapped (or not) unsigned 64 bit integer - */ -inline uint64_t swap_if_needed(uint64_t const value_to_check) -{ - static order host_order = (htonl(42) == 42) ? order::big_endian : order::little_endian; - - if (order::big_endian == host_order) - { - return value_to_check; - } - - union { - uint64_t integer; - uint8_t bytes[8]; - } value { value_to_check }; - - std::swap(value.bytes[0], value.bytes[7]); - std::swap(value.bytes[1], value.bytes[6]); - std::swap(value.bytes[2], value.bytes[5]); - std::swap(value.bytes[3], value.bytes[4]); - - return value.integer; -} - -/*! - * 64 bit version of the htons/htonl - * - * I've used the name htonll to try and keep with the htonl naming scheme. - * - * \param hostlonglong unsigned 64 bit host order integer - * \return unsigned 64 bit network order integer - */ -#ifndef htonll -inline uint64_t htonll(uint64_t const hostlonglong) -{ - return zmqpp::swap_if_needed(hostlonglong); -} -#endif - -/*! - * 64 bit version of the ntohs/ntohl - * - * I've used the name htonll to try and keep with the htonl naming scheme. - * - * \param networklonglong unsigned 64 bit network order integer - * \return unsigned 64 bit host order integer - */ -#ifndef ntohll -inline uint64_t ntohll(uint64_t const networklonglong) -{ - return zmqpp::swap_if_needed(networklonglong); -} -#endif - -/*! - * floating point version of the htons/htonl - * - * \param value host order floating point - * \returns network order floating point - */ -inline float htonf(float value) -{ - assert(sizeof(float) == sizeof(uint32_t)); - - uint32_t temp; - memcpy(&temp, &value, sizeof(uint32_t)); - temp = htonl( temp ); - memcpy(&value, &temp, sizeof(uint32_t)); - - return value; -} - -/*! - * floating point version of the ntohs/ntohl - * - * \param value network order float - * \returns host order float - */ -inline float ntohf(float value) -{ - assert(sizeof(float) == sizeof(uint32_t)); - - uint32_t temp; - memcpy(&temp, &value, sizeof(uint32_t)); - temp = ntohl( temp ); - memcpy(&value, &temp, sizeof(uint32_t)); - - return value; -} - -/*! - * double precision floating point version of the htons/htonl - * - * \param value host order double precision floating point - * \returns network order double precision floating point - */ -inline double htond(double value) -{ - assert(sizeof(double) == sizeof(uint64_t)); - - uint64_t temp; - memcpy(&temp, &value, sizeof(uint64_t)); - temp = htonll(temp); - memcpy(&value, &temp, sizeof(uint64_t)); - - return value; -} - -/*! - * double precision floating point version of the ntohs/ntohl - * - * \param value network order double precision floating point - * \returns host order double precision floating point - */ -inline double ntohd(double value) -{ - assert(sizeof(double) == sizeof(uint64_t)); - - uint64_t temp; - memcpy(&temp, &value, sizeof(uint64_t)); - temp = ntohll(temp); - memcpy(&value, &temp, sizeof(uint64_t)); - - return value; -} - -} - -#endif /* INET_HPP_ */ diff --git a/dep/zmqpp/zmqpp/message.cpp b/dep/zmqpp/zmqpp/message.cpp deleted file mode 100644 index 4d81d247c62..00000000000 --- a/dep/zmqpp/zmqpp/message.cpp +++ /dev/null @@ -1,454 +0,0 @@ -/* - * Created on: 9 Aug 2011 - * Author: Ben Gray (@benjamg) - */ - -#include <cassert> -#include <cstring> - -#include "exception.hpp" -#include "inet.hpp" -#include "message.hpp" - -namespace zmqpp -{ - -/*! - * \brief internal construct - * \internal handles bubbling callback from zmq c style to the c++ functor provided - */ -struct callback_releaser -{ - message::release_function func; -}; - -message::message() - : _parts() - , _read_cursor(0) -{ -} - -message::~message() -{ - _parts.clear(); -} - -size_t message::parts() const -{ - return _parts.size(); -} - -/* - * The two const_casts in size and raw_data are a little bit hacky - * but neither of these methods called this way actually modify data - * so accurately represent the intent of these calls. - */ - -size_t message::size(size_t const part /* = 0 */) const -{ - if(part >= _parts.size()) - { - throw exception("attempting to request a message part outside the valid range"); - } - - return _parts[part].size(); -} - -void const* message::raw_data(size_t const part /* = 0 */) const -{ - if(part >= _parts.size()) - { - throw exception("attempting to request a message part outside the valid range"); - } - - return _parts[part].data(); -} - -zmq_msg_t& message::raw_msg(size_t const part /* = 0 */) -{ - if(part >= _parts.size()) - { - throw exception("attempting to request a message part outside the valid range"); - } - - return _parts[part].msg(); -} - -zmq_msg_t& message::raw_new_msg() -{ - _parts.push_back( frame() ); - - return _parts.back().msg(); -} - -zmq_msg_t& message::raw_new_msg(size_t const reserve_data_size) -{ - _parts.push_back( frame(reserve_data_size) ); - - return _parts.back().msg(); -} - -std::string message::get(size_t const part /* = 0 */) const -{ - return std::string(static_cast<char const*>(raw_data(part)), size(part)); -} - - -// Move operators will take ownership of message parts without copying -void message::move(void* part, size_t const size, release_function const& release) -{ - callback_releaser* hint = new callback_releaser(); - hint->func = release; - - _parts.push_back( frame( part, size, &message::release_callback, hint ) ); -} - -// Stream reader style -void message::reset_read_cursor() -{ - _read_cursor = 0; -} - -void message::get(int8_t& integer, size_t const part) const -{ - assert(sizeof(int8_t) == size(part)); - - int8_t const* byte = static_cast<int8_t const*>(raw_data(part)); - integer = *byte; -} - -void message::get(int16_t& integer, size_t const part) const -{ - assert(sizeof(int16_t) == size(part)); - - uint16_t const* network_order = static_cast<uint16_t const*>(raw_data(part)); - integer = static_cast<int16_t>(ntohs(*network_order)); -} - -void message::get(int32_t& integer, size_t const part) const -{ - assert(sizeof(int32_t) == size(part)); - - uint32_t const* network_order = static_cast<uint32_t const*>(raw_data(part)); - integer = static_cast<int32_t>(htonl(*network_order)); -} - -void message::get(int64_t& integer, size_t const part) const -{ - assert(sizeof(int64_t) == size(part)); - - uint64_t const* network_order = static_cast<uint64_t const*>(raw_data(part)); - integer = static_cast<int64_t>(htonll(*network_order)); -} - -void message::get(uint8_t& unsigned_integer, size_t const part) const -{ - assert(sizeof(uint8_t) == size(part)); - - uint8_t const* byte = static_cast<uint8_t const*>(raw_data(part)); - unsigned_integer = *byte; -} - -void message::get(uint16_t& unsigned_integer, size_t const part) const -{ - assert(sizeof(uint16_t) == size(part)); - - uint16_t const* network_order = static_cast<uint16_t const*>(raw_data(part)); - unsigned_integer = ntohs(*network_order); -} - -void message::get(uint32_t& unsigned_integer, size_t const part) const -{ - assert(sizeof(uint32_t) == size(part)); - - uint32_t const* network_order = static_cast<uint32_t const*>(raw_data(part)); - unsigned_integer = ntohl(*network_order); -} - -void message::get(uint64_t& unsigned_integer, size_t const part) const -{ - assert(sizeof(uint64_t) == size(part)); - - uint64_t const* network_order = static_cast<uint64_t const*>(raw_data(part)); - unsigned_integer = ntohll(*network_order); -} - -void message::get(float& floating_point, size_t const part) const -{ - assert(sizeof(float) == size(part)); - - float const* network_order = static_cast<float const*>(raw_data(part)); - floating_point = zmqpp::ntohf(*network_order); -} - -void message::get(double& double_precision, size_t const part) const -{ - assert(sizeof(double) == size(part)); - - double const* network_order = static_cast<double const*>(raw_data(part)); - double_precision = zmqpp::ntohd(*network_order); -} - -void message::get(bool& boolean, size_t const part) const -{ - assert(sizeof(uint8_t) == size(part)); - - uint8_t const* byte = static_cast<uint8_t const*>(raw_data(part)); - boolean = (*byte != 0); -} - -void message::get(std::string& string, size_t const part) const -{ - string.assign( get(part) ); -} - - -// Stream writer style - these all use copy styles -message& message::operator<<(int8_t const integer) -{ - add(reinterpret_cast<void const*>(&integer), sizeof(int8_t)); - return *this; -} - -message& message::operator<<(int16_t const integer) -{ - uint16_t network_order = htons(static_cast<uint16_t>(integer)); - add(reinterpret_cast<void const*>(&network_order), sizeof(uint16_t)); - - return *this; -} - -message& message::operator<<(int32_t const integer) -{ - uint32_t network_order = htonl(static_cast<uint32_t>(integer)); - add(reinterpret_cast<void const*>(&network_order), sizeof(uint32_t)); - - return *this; -} - -message& message::operator<<(int64_t const integer) -{ - uint64_t network_order = htonll(static_cast<uint64_t>(integer)); - add(reinterpret_cast<void const*>(&network_order), sizeof(uint64_t)); - - return *this; -} - - -message& message::operator<<(uint8_t const unsigned_integer) -{ - add(reinterpret_cast<void const*>(&unsigned_integer), sizeof(uint8_t)); - return *this; -} - -message& message::operator<<(uint16_t const unsigned_integer) -{ - uint16_t network_order = htons(unsigned_integer); - add(reinterpret_cast<void const*>(&network_order), sizeof(uint16_t)); - - return *this; -} - -message& message::operator<<(uint32_t const unsigned_integer) -{ - uint32_t network_order = htonl(unsigned_integer); - add(reinterpret_cast<void const*>(&network_order), sizeof(uint32_t)); - - return *this; -} - -message& message::operator<<(uint64_t const unsigned_integer) -{ - uint64_t network_order = htonll(unsigned_integer); - add(reinterpret_cast<void const*>(&network_order), sizeof(uint64_t)); - - return *this; -} - -message& message::operator<<(float const floating_point) -{ - assert(sizeof(float) == 4); - - float network_order = zmqpp::htonf(floating_point); - add(&network_order, sizeof(float)); - - return *this; -} - -message& message::operator<<(double const double_precision) -{ - assert(sizeof(double) == 8); - - double network_order = zmqpp::htond(double_precision); - add(&network_order, sizeof(double)); - - return *this; -} - -message& message::operator<<(bool const boolean) -{ - uint8_t byte = (boolean) ? 1 : 0; - add(reinterpret_cast<void const*>(&byte), sizeof(uint8_t)); - - return *this; -} - -message& message::operator<<(char const* c_string) -{ - add(reinterpret_cast<void const*>(c_string), strlen(c_string)); - return *this; -} - -message& message::operator<<(std::string const& string) -{ - add(reinterpret_cast<void const*>(string.data()), string.size()); - return *this; -} - -void message::push_front(void const* part, size_t const size) -{ - _parts.emplace( _parts.begin(), part, size ); -} - -void message::push_front(int8_t const integer) -{ - push_front(&integer, sizeof(int8_t)); -} - -void message::push_front(int16_t const integer) -{ - uint16_t network_order = htons(static_cast<uint16_t>(integer)); - push_front(&network_order, sizeof(uint16_t)); -} - -void message::push_front(int32_t const integer) -{ - uint32_t network_order = htonl(static_cast<uint32_t>(integer)); - push_front(&network_order, sizeof(uint32_t)); -} - -void message::push_front(int64_t const integer) -{ - uint64_t network_order = htonll(static_cast<uint64_t>(integer)); - push_front(&network_order, sizeof(uint64_t)); -} - - -void message::push_front(uint8_t const unsigned_integer) -{ - push_front(&unsigned_integer, sizeof(uint8_t)); -} - -void message::push_front(uint16_t const unsigned_integer) -{ - uint16_t network_order = htons(unsigned_integer); - push_front(&network_order, sizeof(uint16_t)); -} - -void message::push_front(uint32_t const unsigned_integer) -{ - uint32_t network_order = htonl(unsigned_integer); - push_front(&network_order, sizeof(uint32_t)); -} - -void message::push_front(uint64_t const unsigned_integer) -{ - uint64_t network_order = htonll(unsigned_integer); - push_front(&network_order, sizeof(uint64_t)); -} - -void message::push_front(float const floating_point) -{ - assert(sizeof(float) == 4); - - float network_order = zmqpp::htonf(floating_point); - push_front(&network_order, sizeof(float)); -} - -void message::push_front(double const double_precision) -{ - assert(sizeof(double) == 8); - - double network_order = zmqpp::htond(double_precision); - push_front(&network_order, sizeof(double)); -} - -void message::push_front(bool const boolean) -{ - uint8_t byte = (boolean) ? 1 : 0; - push_front(&byte, sizeof(uint8_t)); -} - -void message::push_front(char const* c_string) -{ - push_front(c_string, strlen(c_string)); -} - -void message::push_front(std::string const& string) -{ - push_front(string.data(), string.size()); -} - -void message::pop_front() -{ - _parts.erase( _parts.begin() ); -} - -void message::pop_back() -{ - _parts.pop_back(); -} - -message::message(message&& source) NOEXCEPT - : _parts() - , _read_cursor(0) -{ - std::swap(_parts, source._parts); -} - -message& message::operator=(message&& source) NOEXCEPT -{ - std::swap(_parts, source._parts); - return *this; -} - -message message::copy() const -{ - message msg; - msg.copy(*this); - return msg; -} - -void message::copy(message const& source) -{ - _parts.resize( source._parts.size() ); - for(size_t i = 0; i < source._parts.size(); ++i) - { - _parts[i] = source._parts[i].copy(); - } - - // we don't need a copy of the releasers as we did data copies of the internal data, - //_releasers = source._releasers; - //_strings = source._strings -} - -// Used for internal tracking -void message::sent(size_t const part) -{ - // sanity check - assert(!_parts[part].is_sent()); - _parts[part].mark_sent(); -} - -// Note that these releasers are not thread safe, the only safety is provided by -// the socket class taking ownership so no updates can happen while zmq does it's thing -// If used in a custom class this has to be dealt with. -void message::release_callback(void* data, void* hint) -{ - callback_releaser* releaser = static_cast<callback_releaser*>(hint); - releaser->func(data); - - delete releaser; -} - -} diff --git a/dep/zmqpp/zmqpp/message.hpp b/dep/zmqpp/zmqpp/message.hpp deleted file mode 100644 index 2a747bfd1db..00000000000 --- a/dep/zmqpp/zmqpp/message.hpp +++ /dev/null @@ -1,254 +0,0 @@ -/** - * \file - * - * \date 9 Aug 2011 - * \author Ben Gray (\@benjamg) - */ - -#ifndef ZMQPP_MESSAGE_HPP_ -#define ZMQPP_MESSAGE_HPP_ - -#include <functional> -#include <string> -#include <unordered_map> -#include <vector> -#include <utility> -#include <cassert> - -#include <zmq.h> - -#include "compatibility.hpp" -#include "frame.hpp" - -namespace zmqpp -{ - -/*! - * \brief a zmq message with optional multipart support - * - * A zmq message is made up of one or more parts which are sent together to - * the target endpoints. zmq guarantees either the whole message or none - * of the message will be delivered. - */ -class message -{ -public: - /*! - * \brief callback to release user allocated data. - * - * The release function will be called on any void* moved part. - * It must be thread safe to the extent that the callback may occur on - * one of the context threads. - * - * The function called will be passed a single variable which is the - * pointer to the memory allocated. - */ - typedef std::function<void (void*)> release_function; - - message(); - ~message(); - - template <typename T, typename ...Args> - message(T const &part, Args &&...args) - : message() - { - add(part, std::forward<Args>(args)...); - } - - size_t parts() const; - size_t size(size_t const part) const; - std::string get(size_t const part) const; - - void get(int8_t& integer, size_t const part) const; - void get(int16_t& integer, size_t const part) const; - void get(int32_t& integer, size_t const part) const; - void get(int64_t& integer, size_t const part) const; - - void get(uint8_t& unsigned_integer, size_t const part) const; - void get(uint16_t& unsigned_integer, size_t const part) const; - void get(uint32_t& unsigned_integer, size_t const part) const; - void get(uint64_t& unsigned_integer, size_t const part) const; - - void get(float& floating_point, size_t const part) const; - void get(double& double_precision, size_t const part) const; - void get(bool& boolean, size_t const part) const; - - void get(std::string& string, size_t const part) const; - - // Warn: If a pointer type is requested the message (well zmq) still 'owns' - // the data and will release it when the message object is freed. - template<typename Type> - Type get(size_t const part) - { - Type value; - get(value, part); - return value; - } - - template<int part=0, typename T, typename ...Args> - void extract(T &nextpart, Args &...args) - { - assert(part < parts()); - get(nextpart,part); - extract<part+1>(args...); - } - - template<int part=0, typename T> - void extract(T &nextpart) - { - assert(part < parts()); - get(nextpart,part); - } - - // Raw get data operations, useful with data structures more than anything else - // Warn: The message (well zmq) still 'owns' the data and will release it - // when the message object is freed. - template<typename Type> - void get(Type*& value, size_t const part) const - { - value = static_cast<Type*>(raw_data(part)); - } - - // Warn: The message (well zmq) still 'owns' the data and will release it - // when the message object is freed. - template<typename Type> - void get(Type** value, size_t const part) const - { - *value = static_cast<Type*>(raw_data(part)); - } - - // Move operators will take ownership of message parts without copying - void move(void* part, size_t const size, release_function const& release); - - // Raw move data operation, useful with data structures more than anything else - template<typename Object> - void move(Object *part) - { - move(part, sizeof(Object), &deleter_callback<Object>); - } - - // Copy operators will take copies of any data - template<typename Type> - void add(Type *part, size_t const size) - { - _parts.push_back( frame( part, size ) ); - } - - - template<typename Type, typename ...Args> - void add(Type const& part, Args &&...args) - { - *this << part; - add(std::forward<Args>(args)...); - } - - template<typename Type> - void add(Type const part) - { - *this << part; - } - - // Stream reader style - void reset_read_cursor(); - - template<typename Type> - message& operator>>(Type& value) - { - get(value, _read_cursor++); - return *this; - } - - // Stream writer style - these all use copy styles - message& operator<<(int8_t const integer); - message& operator<<(int16_t const integer); - message& operator<<(int32_t const integer); - message& operator<<(int64_t const integer); - - message& operator<<(uint8_t const unsigned_integer); - message& operator<<(uint16_t const unsigned_integer); - message& operator<<(uint32_t const unsigned_integer); - message& operator<<(uint64_t const unsigned_integer); - - message& operator<<(float const floating_point); - message& operator<<(double const double_precision); - message& operator<<(bool const boolean); - - message& operator<<(char const* c_string); - message& operator<<(std::string const& string); - - // Queue manipulation - void push_front(void const* part, size_t const size); - - // TODO: unify conversion of types with the stream operators - void push_front(int8_t const integer); - void push_front(int16_t const integer); - void push_front(int32_t const integer); - void push_front(int64_t const integer); - - void push_front(uint8_t const unsigned_integer); - void push_front(uint16_t const unsigned_integer); - void push_front(uint32_t const unsigned_integer); - void push_front(uint64_t const unsigned_integer); - - void push_front(float const floating_point); - void push_front(double const double_precision); - void push_front(bool const boolean); - - void push_front(char const* c_string); - void push_front(std::string const& string); - - void pop_front(); - - void push_back(void const* part, size_t const size) - { - add( part, size ); - } - - template<typename Type> - void push_back(Type const part) - { - *this << part; - } - - void pop_back(); - - void remove(size_t const part); - - // Move supporting - message(message&& source) NOEXCEPT; - message& operator=(message&& source) NOEXCEPT; - - // Copy support - message copy() const; - void copy(message const& source); - - // Used for internal tracking - void sent(size_t const part); - - // Access to raw zmq details - void const* raw_data(size_t const part = 0) const; - zmq_msg_t& raw_msg(size_t const part = 0); - zmq_msg_t& raw_new_msg(); - zmq_msg_t& raw_new_msg(size_t const reserve_data_size); - -private: - typedef std::vector<frame> parts_type; - parts_type _parts; - size_t _read_cursor; - - // Disable implicit copy support, code must request a copy to clone - message(message const&) NOEXCEPT ZMQPP_EXPLICITLY_DELETED; - message& operator=(message const&) NOEXCEPT ZMQPP_EXPLICITLY_DELETED; - - static void release_callback(void* data, void* hint); - - template<typename Object> - static void deleter_callback(void* data) - { - delete static_cast<Object*>(data); - } -}; - -} - -#endif /* ZMQPP_MESSAGE_HPP_ */ diff --git a/dep/zmqpp/zmqpp/poller.cpp b/dep/zmqpp/zmqpp/poller.cpp deleted file mode 100644 index a6340c9bd61..00000000000 --- a/dep/zmqpp/zmqpp/poller.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Created on: 16 Aug 2011 - * Author: Ben Gray (@benjamg) - */ - -#include "exception.hpp" -#include "socket.hpp" -#include "poller.hpp" - -#include <zmq.h> - -namespace zmqpp -{ - -const long poller::wait_forever = -1; -const short poller::poll_none = 0; -const short poller::poll_in = ZMQ_POLLIN; -const short poller::poll_out = ZMQ_POLLOUT; -const short poller::poll_error = ZMQ_POLLERR; - -poller::poller() - : _items() - , _index() - , _fdindex() -{ - -} - -poller::~poller() -{ - _items.clear(); - _index.clear(); - _fdindex.clear(); -} - -void poller::add(socket& socket, short const event /* = POLL_IN */) -{ - zmq_pollitem_t item { socket, 0, event, 0 }; - - size_t index = _items.size(); - _items.push_back(item); - _index[socket] = index; -} - -void poller::add(int const descriptor, short const event /* = POLL_IN */) -{ - zmq_pollitem_t item { nullptr, descriptor, event, 0 }; - - size_t index = _items.size(); - _items.push_back(item); - _fdindex[descriptor] = index; -} - -bool poller::has(socket_t const& socket) -{ - return _index.find(socket) != _index.end(); -} - -bool poller::has(int const descriptor) -{ - return _fdindex.find(descriptor) != _fdindex.end(); -} - -void poller::reindex(size_t const index) -{ - if ( nullptr != _items[index].socket ) - { - auto found = _index.find( _items[index].socket ); - if (_index.end() == found) { throw exception("unable to reindex socket in poller"); } - found->second = index; - } - else - { - auto found = _fdindex.find( _items[index].fd ); - if (_fdindex.end() == found) { throw exception("unable to reindex file descriptor in poller"); } - found->second = index; - } -} - -void poller::remove(socket_t const& socket) -{ - auto found = _index.find(socket); - if (_index.end() == found) { return; } - - if ( _items.size() - 1 == found->second ) - { - _items.pop_back(); - _index.erase(found); - return; - } - - std::swap(_items[found->second], _items.back()); - _items.pop_back(); - - auto index = found->second; - _index.erase(found); - - reindex( index ); -} - -void poller::remove(int const descriptor) -{ - auto found = _fdindex.find(descriptor); - if (_fdindex.end() == found) { return; } - - if ( _items.size() - 1 == found->second ) - { - _items.pop_back(); - _fdindex.erase(found); - return; - } - - std::swap(_items[found->second], _items.back()); - _items.pop_back(); - - auto index = found->second; - _fdindex.erase(found); - - reindex( index ); -} - -void poller::check_for(socket const& socket, short const event) -{ - auto found = _index.find(socket); - if (_index.end() == found) - { - throw exception("this socket is not represented within this poller"); - } - - _items[found->second].events = event; -} - -void poller::check_for(int const descriptor, short const event) -{ - auto found = _fdindex.find(descriptor); - if (_fdindex.end() == found) - { - throw exception("this socket is not represented within this poller"); - } - - _items[found->second].events = event; -} - -bool poller::poll(long timeout /* = WAIT_FOREVER */) -{ - int result = zmq_poll(_items.data(), _items.size(), timeout); - if (result < 0) - { - if(EINTR == zmq_errno()) - { - return false; - } - - throw zmq_internal_exception(); - } - - return (result > 0); -} - -short poller::events(socket const& socket) const -{ - auto found = _index.find(socket); - if (_index.end() == found) - { - throw exception("this socket is not represented within this poller"); - } - - return _items[found->second].revents; -} - -short poller::events(int const descriptor) const -{ - auto found = _fdindex.find(descriptor); - if (_fdindex.end() == found) - { - throw exception("this file descriptor is not represented within this poller"); - } - - return _items[found->second].revents; -} - -} diff --git a/dep/zmqpp/zmqpp/poller.hpp b/dep/zmqpp/zmqpp/poller.hpp deleted file mode 100644 index a19063a091d..00000000000 --- a/dep/zmqpp/zmqpp/poller.hpp +++ /dev/null @@ -1,186 +0,0 @@ -/** - * \file - * - * \date 9 Aug 2011 - * \author Ben Gray (\@benjamg) - */ - -#ifndef ZMQPP_POLLER_HPP_ -#define ZMQPP_POLLER_HPP_ - -#include <unordered_map> -#include <vector> - -#include "compatibility.hpp" - -namespace zmqpp -{ - -class socket; -typedef socket socket_t; - -/*! - * Polling wrapper. - * - * Allows access to polling for any number of sockets or file descriptors. - */ -class poller -{ -public: - static const long wait_forever; /*!< Block forever flag, default setting. */ - - static const short poll_none; /*!< No polling flags set. */ - static const short poll_in; /*!< Monitor inbound flag. */ - static const short poll_out; /*!< Monitor output flag. */ - static const short poll_error; /*!< Monitor error flag.\n Only for file descriptors. */ - - /*! - * Construct an empty polling model. - */ - poller(); - - /*! - * Cleanup poller. - * - * Any sockets will need to be closed separately. - */ - ~poller(); - - /*! - * Add a socket to the polling model and set which events to monitor. - * - * \param socket the socket to monitor. - * \param event the event flags to monitor on the socket. - */ - void add(socket_t& socket, short const event = poll_in); - - /*! - * Add a file descriptor to the polling model and set which events to monitor. - * - * \param descriptor the file descriptor to monitor. - * \param event the event flags to monitor. - */ - void add(int const descriptor, short const event = poll_in | poll_error); - - /*! - * Check if we are monitoring a given socket with this poller. - * - * \param socket the socket to check. - * \return true if it is there. - */ - bool has(socket_t const& socket); - - /*! - * Check if we are monitoring a given file descriptor with this poller. - * - * \param descriptor the file descriptor to check. - * \return true if it is there. - */ - bool has(int const descriptor); - - /*! - * Stop monitoring a socket. - * - * \param socket the socket to stop monitoring. - */ - void remove(socket_t const& socket); - - /*! - * Stop monitoring a file descriptor. - * - * \param descriptor the file descriptor to stop monitoring. - */ - void remove(int const descriptor); - - /*! - * Update the monitored event flags for a given socket. - * - * \param socket the socket to update event flags. - * \param event the event flags to monitor on the socket. - */ - void check_for(socket_t const& socket, short const event); - - /*! - * Update the monitored event flags for a given file descriptor. - * - * \param descriptor the file descriptor to update event flags. - * \param event the event flags to monitor on the socket. - */ - void check_for(int const descriptor, short const event); - - /*! - * Poll for monitored events. - * - * By default this method will block forever or until at least one of the monitored - * sockets or file descriptors has events. - * - * If a timeout is set and was reached then this function returns false. - * - * \param timeout milliseconds to timeout. - * \return true if there is an event.. - */ - bool poll(long timeout = wait_forever); - - /*! - * Get the event flags triggered for a socket. - * - * \param socket the socket to get triggered event flags for. - * \return the event flags. - */ - short events(socket_t const& socket) const; - - /*! - * Get the event flags triggered for a file descriptor. - * - * \param descriptor the file descriptor to get triggered event flags for. - * \return the event flags. - */ - short events(int const descriptor) const; - - /*! - * Check either a file descriptor or socket for input events. - * - * Templated helper method that calls through to event and checks for a given flag - * - * \param watchable either a file descriptor or socket known to the poller. - * \return true if there is input. - */ - template<typename Watched> - bool has_input(Watched const& watchable) const { return events(watchable) & poll_in; } - - /*! - * Check either a file descriptor or socket for output events. - * - * Templated helper method that calls through to event and checks for a given flag - * - * \param watchable either a file descriptor or socket known to the poller. - * \return true if there is output. - */ - template<typename Watched> - bool has_output(Watched const& watchable) const { return events(watchable) & poll_out; } - - /*! - * Check a file descriptor. - * - * Templated helper method that calls through to event and checks for a given flag - * - * Technically this template works for sockets as well but the error flag is never set for - * sockets so I have no idea why someone would call it. - * - * \param watchable a file descriptor know to the poller. - * \return true if there is an error. - */ - template<typename Watched> - bool has_error(Watched const& watchable) const { return events(watchable) & poll_error; } - -private: - std::vector<zmq_pollitem_t> _items; - std::unordered_map<void *, size_t> _index; - std::unordered_map<int, size_t> _fdindex; - - void reindex(size_t const index); -}; - -} - -#endif /* ZMQPP_POLLER_HPP_ */ diff --git a/dep/zmqpp/zmqpp/socket.cpp b/dep/zmqpp/zmqpp/socket.cpp deleted file mode 100644 index 8b4efe4f1d2..00000000000 --- a/dep/zmqpp/zmqpp/socket.cpp +++ /dev/null @@ -1,762 +0,0 @@ -/* - * Created on: 9 Aug 2011 - * Author: Ben Gray (@benjamg) - */ - -#include <array> -#include <cassert> -#include <cstring> -#include <functional> - -#include "context.hpp" -#include "exception.hpp" -#include "message.hpp" -#include "socket.hpp" - -namespace zmqpp -{ - -const int socket::normal = 0; -#if (ZMQ_VERSION_MAJOR == 2) -const int socket::dont_wait = ZMQ_NOBLOCK; -#else -const int socket::dont_wait = ZMQ_DONTWAIT; -#endif -const int socket::send_more = ZMQ_SNDMORE; -#ifdef ZMQ_EXPERIMENTAL_LABELS -const int socket::send_label = ZMQ_SNDLABEL; -#endif - -const int max_socket_option_buffer_size = 256; -const int max_stream_buffer_size = 4096; - -socket::socket(const context& context, socket_type const type) - : _socket(nullptr) - , _type(type) - , _recv_buffer() -{ - _socket = zmq_socket(context, static_cast<int>(type)); - if(nullptr == _socket) - { - throw zmq_internal_exception(); - } - - zmq_msg_init(&_recv_buffer); -} - -socket::~socket() -{ - zmq_msg_close(&_recv_buffer); - - if (nullptr != _socket) - { - -#ifndef NDEBUG // unused assert variable in release - int result = zmq_close(_socket); - assert(0 == result); -#else - zmq_close(_socket); -#endif // NDEBUG - - _socket = nullptr; - } -} - -void socket::bind(endpoint_t const& endpoint) -{ - int result = zmq_bind(_socket, endpoint.c_str()); - - if (0 != result) - { - throw zmq_internal_exception(); - } -} - -void socket::unbind(endpoint_t const& endpoint) -{ -#if (ZMQ_VERSION_MAJOR > 3 || (ZMQ_VERSION_MAJOR == 3 && ZMQ_VERSION_MINOR >= 2)) - int result = zmq_unbind(_socket, endpoint.c_str()); - - if (0 != result) - { - throw zmq_internal_exception(); - } -#endif -} - -void socket::connect(endpoint_t const& endpoint) -{ - int result = zmq_connect(_socket, endpoint.c_str()); - - if (0 != result) - { - throw zmq_internal_exception(); - } -} - -void socket::disconnect(endpoint_t const& endpoint) -{ -#if (ZMQ_VERSION_MAJOR > 3 || (ZMQ_VERSION_MAJOR == 3 && ZMQ_VERSION_MINOR >= 2)) - int result = zmq_disconnect(_socket, endpoint.c_str()); - - if (0 != result) - { - throw zmq_internal_exception(); - } -#endif -} - -void socket::close() -{ - int result = zmq_close(_socket); - - if (0 != result) - { - throw zmq_internal_exception(); - } - - _socket = nullptr; -} - -bool socket::send(message& message, bool const dont_block /* = false */) -{ - size_t parts = message.parts(); - if (parts == 0) - { - throw std::invalid_argument("sending requires messages have at least one part"); - } - - bool dont_wait = dont_block; - for(size_t i = 0; i < parts; ++i) - { - int flag = socket::normal; - if(dont_wait) { flag |= socket::dont_wait; } - if(i < (parts - 1)) { flag |= socket::send_more; } - -#if (ZMQ_VERSION_MAJOR == 2) - int result = zmq_send( _socket, &message.raw_msg(i), flag ); -#elif (ZMQ_VERSION_MAJOR < 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR < 2)) - int result = zmq_sendmsg( _socket, &message.raw_msg(i), flag ); -#else - int result = zmq_msg_send( &message.raw_msg(i), _socket, flag ); -#endif - - if (result < 0) - { - // the zmq framework should not block if the first part is accepted - // so we should only ever get this error on the first part - if((0 == i) && (EAGAIN == zmq_errno())) - { - return false; - } - - if(EINTR == zmq_errno()) - { - if (0 == message.parts()) - { - return false; - } - - // If we have an interrupt but it's not on the first part then we - // know we can safely send out the rest of the message as we can - // enforce that it won't wait on a blocking action - dont_wait = true; - continue; - } - - // sanity checking - assert(EAGAIN != zmq_errno()); - - throw zmq_internal_exception(); - } - - message.sent(i); - } - - // Leave message reference in a stable state - zmqpp::message local; - std::swap(local, message); - return true; -} - -bool socket::receive(message& message, bool const dont_block /* = false */) -{ - if (message.parts() > 0) - { - // swap and discard old message - zmqpp::message local; - std::swap(local, message); - } - - int flags = (dont_block) ? socket::dont_wait : socket::normal; - bool more = true; - - while(more) - { -#if (ZMQ_VERSION_MAJOR == 2) - int result = zmq_recv( _socket, &_recv_buffer, flags ); -#elif (ZMQ_VERSION_MAJOR < 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR < 2)) - int result = zmq_recvmsg( _socket, &_recv_buffer, flags ); -#else - int result = zmq_msg_recv( &_recv_buffer, _socket, flags ); -#endif - - if(result < 0) - { - if ((0 == message.parts()) && (EAGAIN == zmq_errno())) - { - return false; - } - - if(EINTR == zmq_errno()) - { - if (0 == message.parts()) - { - return false; - } - - // If we have an interrupt but it's not on the first part then we - // know we can safely pull out the rest of the message as it will - // not be blocking - continue; - } - - assert(EAGAIN != zmq_errno()); - - throw zmq_internal_exception(); - } - - zmq_msg_t& dest = message.raw_new_msg(); - zmq_msg_move(&dest, &_recv_buffer); - - get(socket_option::receive_more, more); - } - - return true; -} - - -bool socket::send(std::string const& string, int const flags /* = NORMAL */) -{ - return send_raw(string.data(), string.size(), flags); -} - -bool socket::receive(std::string& string, int const flags /* = NORMAL */) -{ -#if (ZMQ_VERSION_MAJOR == 2) - int result = zmq_recv( _socket, &_recv_buffer, flags ); -#elif (ZMQ_VERSION_MAJOR < 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR < 2)) - int result = zmq_recvmsg( _socket, &_recv_buffer, flags ); -#else - int result = zmq_msg_recv( &_recv_buffer, _socket, flags ); -#endif - - if(result >= 0) - { - string.reserve(zmq_msg_size(&_recv_buffer)); - string.assign(static_cast<char*>(zmq_msg_data(&_recv_buffer)), zmq_msg_size(&_recv_buffer)); - - return true; - } - - if (EAGAIN == zmq_errno() || EINTR == zmq_errno()) - { - return false; - } - - throw zmq_internal_exception(); -} - - -bool socket::send_raw(char const* buffer, int const length, int const flags /* = NORMAL */) -{ -#if (ZMQ_VERSION_MAJOR == 2) - zmq_msg_t msg; - int result = zmq_msg_init_size(&msg, length); - if (result != 0) - { - zmq_internal_exception(); - } - - memcpy(zmq_msg_data(&msg), buffer, length); - result = zmq_send(_socket, &msg, flags); -#else - int result = zmq_send(_socket, buffer, length, flags); -#endif - if(result >= 0) - { - return true; - } - -#if (ZMQ_VERSION_MAJOR == 2) - // only actually need to close this on error - zmq_msg_close(&msg); -#endif - - if (EAGAIN == zmq_errno() || EINTR == zmq_errno()) - { - return false; - } - - throw zmq_internal_exception(); -} - -bool socket::receive_raw(char* buffer, int& length, int const flags /* = NORMAL */) -{ -#if (ZMQ_VERSION_MAJOR == 2) - int result = zmq_recv( _socket, &_recv_buffer, flags ); -#elif (ZMQ_VERSION_MAJOR < 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR < 2)) - int result = zmq_recvmsg( _socket, &_recv_buffer, flags ); -#else - int result = zmq_msg_recv( &_recv_buffer, _socket, flags ); -#endif - - if(result >= 0) - { - length = zmq_msg_size(&_recv_buffer); - memcpy(buffer, zmq_msg_data(&_recv_buffer), length); - - return true; - } - - if (EAGAIN == zmq_errno() || EINTR == zmq_errno()) - { - return false; - } - - throw zmq_internal_exception(); -} - - -// Helper -void socket::subscribe(std::string const& topic) -{ - set(socket_option::subscribe, topic); -} - -void socket::unsubscribe(std::string const& topic) -{ - set(socket_option::unsubscribe, topic); -} - -bool socket::has_more_parts() const -{ - return get<bool>(socket_option::receive_more); -} - - -// Set socket options for different types of option -void socket::set(socket_option const option, int const value) -{ - switch(option) - { - // unsigned 64bit Integers -#if (ZMQ_VERSION_MAJOR == 2) - case socket_option::high_water_mark: - case socket_option::send_buffer_size: - case socket_option::receive_buffer_size: -#endif - case socket_option::affinity: - if (value < 0) { throw exception("attempting to set an unsigned 64 bit integer option with a negative integer"); } - set(option, static_cast<uint64_t>(value)); - break; - - // 64bit Integers -#if (ZMQ_VERSION_MAJOR == 2) - case socket_option::rate: - case socket_option::recovery_interval: - case socket_option::recovery_interval_seconds: - case socket_option::swap_size: -#else - case socket_option::max_messsage_size: -#endif - set(option, static_cast<int64_t>(value)); - break; - - // Boolean -#if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 1)) - case socket_option::ipv4_only: -#endif -#if (ZMQ_VERSION_MAJOR == 2) - case socket_option::multicast_loopback: -#endif -#if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 2)) -#if (ZMQ_VERSION_MINOR == 2) - case socket_option::delay_attach_on_connect: -#else - case socket_option::immediate: -#endif - case socket_option::router_mandatory: - case socket_option::xpub_verbose: -#endif - if (value == 0) { set(option, false); } - else if (value == 1) { set(option, true); } - else { throw exception("attempting to set a boolean option with a non 0 or 1 integer"); } - break; - - // Default or Boolean -#if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 2)) - case socket_option::tcp_keepalive: - if (value < -1 || value > 1) { throw exception("attempting to set a default or boolean option with a non -1, 0 or 1 integer"); } - if (0 != zmq_setsockopt(_socket, static_cast<int>(option), &value, sizeof(value))) - { - throw zmq_internal_exception(); - } - break; -#endif - - // Integers that require +ve numbers -#if (ZMQ_VERSION_MAJOR == 2) - case socket_option::reconnect_interval_max: -#else - case socket_option::reconnect_interval_max: - case socket_option::send_buffer_size: - case socket_option::recovery_interval: - case socket_option::receive_buffer_size: - case socket_option::send_high_water_mark: - case socket_option::receive_high_water_mark: - case socket_option::multicast_hops: - case socket_option::rate: -#endif - case socket_option::backlog: - if (value < 0) { throw exception("attempting to set a positive only integer option with a negative integer"); } - // Integers - case socket_option::reconnect_interval: - case socket_option::linger: - case socket_option::receive_timeout: - case socket_option::send_timeout: -#if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 2)) - case socket_option::tcp_keepalive_idle: - case socket_option::tcp_keepalive_count: - case socket_option::tcp_keepalive_interval: -#endif - if (0 != zmq_setsockopt(_socket, static_cast<int>(option), &value, sizeof(value))) - { - throw zmq_internal_exception(); - } - break; - default: - throw exception("attempting to set a non signed integer option with a signed integer value"); - } -} - -void socket::set(socket_option const option, bool const value) -{ - switch(option) - { -#if (ZMQ_VERSION_MAJOR == 2) - case socket_option::multicast_loopback: -#endif -#if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 1)) - case socket_option::ipv4_only: -#endif -#if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 2)) -#if (ZMQ_VERSION_MINOR == 2) - case socket_option::delay_attach_on_connect: -#else - case socket_option::immediate: -#endif - case socket_option::router_mandatory: - case socket_option::xpub_verbose: -#endif - { - int ivalue = value ? 1 : 0; - if (0 != zmq_setsockopt(_socket, static_cast<int>(option), &ivalue, sizeof(ivalue))) - { - throw zmq_internal_exception(); - } - break; - } - default: - throw exception("attempting to set a non boolean option with a boolean value"); - } -} - -void socket::set(socket_option const option, uint64_t const value) -{ - switch(option) - { -#if (ZMQ_VERSION_MAJOR == 2) - // unsigned 64bit Integers - case socket_option::high_water_mark: - case socket_option::send_buffer_size: - case socket_option::receive_buffer_size: -#endif - case socket_option::affinity: - if (0 != zmq_setsockopt(_socket, static_cast<int>(option), &value, sizeof(value))) - { - throw zmq_internal_exception(); - } - break; - default: - throw exception("attempting to set a non unsigned 64 bit integer option with a unsigned 64 bit integer value"); - } -} - -void socket::set(socket_option const option, int64_t const value) -{ - switch(option) - { -#if (ZMQ_VERSION_MAJOR == 2) - case socket_option::rate: - case socket_option::recovery_interval: - case socket_option::recovery_interval_seconds: - case socket_option::swap_size: -#else - case socket_option::max_messsage_size: -#endif - // zmq only allowed +ve int64_t options - if (value < 0) { throw exception("attempting to set a positive only 64 bit integer option with a negative 64bit integer"); } - if (0 != zmq_setsockopt(_socket, static_cast<int>(option), &value, sizeof(value))) - { - throw zmq_internal_exception(); - } - break; - default: - throw exception("attempting to set a non 64 bit integer option with a 64 bit integer value"); - } -} - -void socket::set(socket_option const option, char const* value, size_t const length) -{ - switch(option) - { - case socket_option::identity: - case socket_option::subscribe: - case socket_option::unsubscribe: -#if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 2)) - case socket_option::tcp_accept_filter: -#endif - if (0 != zmq_setsockopt(_socket, static_cast<int>(option), value, length)) - { - throw zmq_internal_exception(); - } - break; - default: - throw exception("attempting to set a non string option with a string value"); - } -} - -// Get socket options, multiple versions for easy of use -void socket::get(socket_option const option, int& value) const -{ - size_t value_size = sizeof(int); - - switch(option) - { -#if (ZMQ_VERSION_MAJOR == 2) - case socket_option::receive_more: - case socket_option::multicast_loopback: - value = static_cast<int>(get<int64_t>(option)); - break; -#endif - case socket_option::type: - case socket_option::linger: - case socket_option::backlog: - case socket_option::reconnect_interval: - case socket_option::reconnect_interval_max: - case socket_option::receive_timeout: - case socket_option::send_timeout: - case socket_option::file_descriptor: - case socket_option::events: -#if (ZMQ_VERSION_MAJOR > 2) - case socket_option::receive_more: - case socket_option::send_buffer_size: - case socket_option::receive_buffer_size: - case socket_option::rate: - case socket_option::recovery_interval: - case socket_option::send_high_water_mark: - case socket_option::receive_high_water_mark: - case socket_option::multicast_hops: -#endif -#if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 1)) - case socket_option::ipv4_only: -#endif -#if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 2)) -#if (ZMQ_VERSION_MINOR == 2) - case socket_option::delay_attach_on_connect: -#else - case socket_option::immediate: -#endif - case socket_option::tcp_keepalive: - case socket_option::tcp_keepalive_idle: - case socket_option::tcp_keepalive_count: - case socket_option::tcp_keepalive_interval: -#endif -#ifdef ZMQ_EXPERIMENTAL_LABELS - case socket_option::receive_label: -#endif - if (0 != zmq_getsockopt(_socket, static_cast<int>(option), &value, &value_size)) - { - throw zmq_internal_exception(); - } - - // sanity check - assert(value_size <= sizeof(int)); - break; - default: - throw exception("attempting to get a non integer option with an integer value"); - } -} - -void socket::get(socket_option const option, bool& value) const -{ -#if (ZMQ_VERSION_MAJOR == 2) - int64_t int_value = 0; - size_t value_size = sizeof(int64_t); -#else - int int_value = 0; - size_t value_size = sizeof(int); -#endif - - switch(option) - { - case socket_option::receive_more: -#if (ZMQ_VERSION_MAJOR == 2) - case socket_option::multicast_loopback: -#endif -#if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 1)) - case socket_option::ipv4_only: -#endif -#if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 2)) -#if (ZMQ_VERSION_MINOR == 2) - case socket_option::delay_attach_on_connect: -#else - case socket_option::immediate: -#endif -#endif -#ifdef ZMQ_EXPERIMENTAL_LABELS - case socket_option::receive_label: -#endif - if (0 != zmq_getsockopt(_socket, static_cast<int>(option), &int_value, &value_size)) - { - throw zmq_internal_exception(); - } - - value = (int_value == 1) ? true : false; - break; - default: - throw exception("attempting to get a non boolean option with a boolean value"); - } -} - -void socket::get(socket_option const option, uint64_t& value) const -{ - size_t value_size = sizeof(uint64_t); - - switch(option) - { -#if (ZMQ_VERSION_MAJOR == 2) - case socket_option::high_water_mark: - case socket_option::send_buffer_size: - case socket_option::receive_buffer_size: -#endif - case socket_option::affinity: - if(0 != zmq_getsockopt(_socket, static_cast<int>(option), &value, &value_size)) - { - throw zmq_internal_exception(); - } - break; - default: - throw exception("attempting to get a non unsigned 64 bit integer option with an unsigned 64 bit integer value"); - } -} - -void socket::get(socket_option const option, int64_t& value) const -{ - size_t value_size = sizeof(int64_t); - - switch(option) - { -#if (ZMQ_VERSION_MAJOR == 2) - case socket_option::rate: - case socket_option::recovery_interval: - case socket_option::recovery_interval_seconds: - case socket_option::swap_size: - case socket_option::receive_more: - case socket_option::multicast_loopback: -#else - case socket_option::max_messsage_size: -#endif - if(0 != zmq_getsockopt(_socket, static_cast<int>(option), &value, &value_size)) - { - throw zmq_internal_exception(); - } - break; - default: - throw exception("attempting to get a non 64 bit integer option with an 64 bit integer value"); - } -} - -void socket::get(socket_option const option, std::string& value) const -{ - static std::array<char, max_socket_option_buffer_size> buffer; - size_t size = max_socket_option_buffer_size; - - switch(option) - { - case socket_option::identity: -#if (ZMQ_VERSION_MAJOR > 3) || ((ZMQ_VERSION_MAJOR == 3) && (ZMQ_VERSION_MINOR >= 2)) - case socket_option::last_endpoint: -#endif - if(0 != zmq_getsockopt(_socket, static_cast<int>(option), buffer.data(), &size)) - { - throw zmq_internal_exception(); - } - - value.assign(buffer.data(), size); - break; - default: - throw exception("attempting to get a non string option with a string value"); - } -} - -socket::socket(socket&& source) NOEXCEPT - : _socket(source._socket) - , _type(source._type) - , _recv_buffer() -{ - // we steal the zmq_msg_t from the valid socket, we only init our own because it's cheap - // and zmq_msg_move does a valid check - zmq_msg_init(&_recv_buffer); - zmq_msg_move(&_recv_buffer, &source._recv_buffer); - - // Clean up source a little, we will handle the deinit, it doesn't need to - source._socket = nullptr; -} - -socket& socket::operator=(socket&& source) NOEXCEPT -{ - std::swap(_socket, source._socket); - - _type = source._type; // just clone? - - // we steal the zmq_msg_t from the valid socket, we only init our own because it's cheap - // and zmq_msg_move does a valid check - zmq_msg_init(&_recv_buffer); - zmq_msg_move(&_recv_buffer, &source._recv_buffer); - - return *this; -} - - -socket::operator bool() const -{ - return nullptr != _socket; -} - - -socket::operator void*() const -{ - return _socket; -} - -void socket::track_message(message const& /* message */, uint32_t const parts, bool& should_delete) -{ - if (parts == 0) - { - should_delete = true; - } -} - -} diff --git a/dep/zmqpp/zmqpp/socket.hpp b/dep/zmqpp/zmqpp/socket.hpp deleted file mode 100644 index 279bf801f77..00000000000 --- a/dep/zmqpp/zmqpp/socket.hpp +++ /dev/null @@ -1,500 +0,0 @@ -/** - * \file - * - * \date 9 Aug 2011 - * \author Ben Gray (\@benjamg) - */ - -#ifndef ZMQPP_SOCKET_HPP_ -#define ZMQPP_SOCKET_HPP_ - -#include <cstring> -#include <string> -#include <list> - -#include <zmq.h> - -#include "compatibility.hpp" - -#include "socket_types.hpp" -#include "socket_options.hpp" - -namespace zmqpp -{ - -class context; -class message; - -typedef std::string endpoint_t; -typedef context context_t; -typedef message message_t; - -/*! - * The socket class represents the zmq sockets. - * - * A socket can be bound and/or connected to as many endpoints as required - * with the sole exception of a ::pair socket. - * - * The routing is handled by zmq based on the type set. - * - * The bound side of an inproc connection must occur first and inproc can only - * connect to other inproc sockets of the same context. - * - * This class is c++0x move supporting and cannot be copied. - */ -class socket -{ -public: - static const int normal; /*!< /brief default send type, no flags set */ -#if (ZMQ_VERSION_MAJOR == 2) - static const int dont_wait; /*!< /brief don't block if sending is not currently possible */ -#else - static const int dont_wait; /*!< /brief don't block if sending is not currently possible */ -#endif - static const int send_more; /*!< /brief more parts will follow this one */ -#ifdef ZMQ_EXPERIMENTAL_LABELS - static const int send_label; /*!< /brief this message part is an internal zmq label */ -#endif - - /*! - * Create a socket for a given type. - * - * \param context the zmq context under which the socket will live - * \param type a valid ::socket_type for the socket - */ - socket(context_t const& context, socket_type const type); - - /*! - * This will close any socket still open before returning - */ - ~socket(); - - /*! - * Get the type of the socket, this works on zmqpp types and not the zmq internal types. - * Use the socket::get method if you wish to intergoate the zmq internal ones. - * - * \return the type of the socket - */ - socket_type type() const { return _type; } - - /*! - * Asynchronously binds to an endpoint. - * - * \param endpoint the zmq endpoint to bind to - */ - void bind(endpoint_t const& endpoint); - - /*! - * Unbinds from a previously bound endpoint. - * - * \param endpoint the zmq endpoint to bind to - */ - void unbind(endpoint_t const& endpoint); - - /*! - * Asynchronously connects to an endpoint. - * If the endpoint is not inproc then zmq will happily keep trying - * to connect until there is something there. - * - * Inproc sockets must have a valid target already bound before connection - * will work. - * - * \param endpoint the zmq endpoint to connect to - */ - void connect(endpoint_t const& endpoint); - - /*! - * Asynchronously connects to multiple endpoints. - * If the endpoint is not inproc then zmq will happily keep trying - * to connect until there is something there. - * - * Inproc sockets must have a valid target already bound before connection - * will work. - * - * This is a helper function that wraps the single item connect in a loop - * - * \param connections_begin the starting iterator for zmq endpoints. - * \param connections_end the final iterator for zmq endpoints. - */ - template<typename InputIterator> - void connect(InputIterator const& connections_begin, InputIterator const& connections_end) - { - for(InputIterator it = connections_begin; it != connections_end; ++it) - { - connect(*it); - } - } - - - /*! - * Disconnects a previously connected endpoint. - * - * \param endpoint the zmq endpoint to disconnect from - */ - void disconnect(endpoint_t const& endpoint); - - /*! - * Disconnects from multiple previously connected endpoints. - * - * This is a helper function that wraps the single item disconnect in a loop - * - * \param disconnections_begin the starting iterator for zmq endpoints. - * \param disconnections_end the final iterator for zmq endpoints. - */ - template<typename InputIterator> - void disconnect(InputIterator const& disconnections_begin, InputIterator const& disconnections_end) - { - for(InputIterator it = disconnections_begin; it != disconnections_end; ++it) - { - disconnect(*it); - } - } - - /*! - * Closes the internal zmq socket and marks this instance - * as invalid. - */ - void close(); - - /*! - * Sends the message over the connection, this may be a multipart message. - * - * If dont_block is true and we are unable to add a new message then this - * function will return false. - * - * \param message message to send - * \param dont_block boolean to dictate if we wait while sending. - * \return true if message sent, false if it would have blocked - */ - bool send(message_t& message, bool const dont_block = false); - - /*! - * Gets a message from the connection, this may be a multipart message. - * - * If dont_block is true and we are unable to get a message then this - * function will return false. - * - * \param message reference to fill with received data - * \param dont_block boolean to dictate if we wait for data. - * \return true if message sent, false if it would have blocked - */ - bool receive(message_t& message, bool const dont_block = false); - - /*! - * Sends the byte data held by the string as the next message part. - * - * If the socket::DONT_WAIT flag and we are unable to add a new message to - * socket then this function will return false. - * - * \param string message part to send - * \param flags message send flags - * \return true if message part sent, false if it would have blocked - */ - bool send(std::string const& string, int const flags = normal); - - /*! - * If there is a message ready then get the next part as a string - * - * If the socket::DONT_WAIT flag and there is no message ready to receive - * then this function will return false. - * - * \param string message part to receive into - * \param flags message receive flags - * \return true if message part received, false if it would have blocked - */ - bool receive(std::string& string, int const flags = normal); - - /*! - * Sends the byte data pointed to by buffer as the next part of the message. - * - * If the socket::DONT_WAIT flag and we are unable to add a new message to - * socket then this function will return false. - * - * \param buffer byte buffer pointer to start writing from - * \param length max length of the buffer - * \param flags message send flags - * \return true if message part sent, false if it would have blocked - */ - bool send_raw(char const* buffer, int const length, int const flags = normal); - - /*! - * \warning If the buffer is not large enough for the message part then the - * data will be truncated. The rest of the part is lost forever. - * - * If there is a message ready then get the next part of it as a raw - * byte buffer. - * - * If the socket::DONT_WAIT flag and there is no message ready to receive - * then this function will return false. - * - * \param buffer byte buffer pointer to start writing to - * \param length max length of the buffer - * \param flags message receive flags - * \return true if message part received, false if it would have blocked - */ - bool receive_raw(char* buffer, int& length, int const flags = normal); - - /*! - * - * Subscribe to a topic - * - * Helper function that is equivalent of calling - * \code - * set(zmqpp::socket_option::subscribe, topic); - * \endcode - * - * This method is only useful for subscribe type sockets. - * - * \param topic the topic to subscribe to. - */ - void subscribe(std::string const& topic); - - /*! - * Subscribe to a topic - * - * Helper function that is equivalent of a loop calling - * \code - * set(zmqpp::socket_option::subscribe, topic); - * \endcode - * - * This method is only useful for subscribe type sockets. - * - * Generally this will be used with stl collections using begin() and - * end() functions to get the iterators. - * For this reason the end loop runs until the end iterator, not inclusive - * of it. - * - * \param topics_begin the starting iterator for topics. - * \param topics_end the final iterator for topics. - */ - template<typename InputIterator> - void subscribe(InputIterator const& topics_begin, InputIterator const& topics_end) - { - for(InputIterator it = topics_begin; it != topics_end; ++it) - { - subscribe(*it); - } - } - - /*! - * Unsubscribe from a topic - * - * Helper function that is equivalent of calling - * \code - * set(zmqpp::socket_option::unsubscribe, topic); - * \endcode - * - * This method is only useful for subscribe type sockets. - * - * \param topic the topic to unsubscribe from. - */ - void unsubscribe(std::string const& topic); - - /*! - * Unsubscribe from a topic - * - * Helper function that is equivalent of a loop calling - * \code - * set(zmqpp::socket_option::unsubscribe, topic); - * \endcode - * - * This method is only useful for subscribe type sockets. - * - * Generally this will be used with stl collections using begin() and - * end() functions to get the iterators. - * For this reason the end loop runs until the end iterator, not inclusive - * of it. - * - * \param topics_begin the starting iterator for topics. - * \param topics_end the final iterator for topics. - */ - template<typename InputIterator> - void unsubscribe(InputIterator const& topics_begin, InputIterator const& topics_end) - { - for(InputIterator it = topics_begin; it != topics_end; ++it) - { - unsubscribe(*it); - } - } - - /*! - * If the last receive part call to the socket resulted - * in a label or a non-terminating part of a multipart - * message this will return true. - * - * \return true if there are more parts - */ - bool has_more_parts() const; - - /*! - * Set the value of an option in the underlaying zmq socket. - * - * \param option a valid ::socket_option - * \param value to set the option to - */ - void set(socket_option const option, int const value); - - /*! - * Set the value of an option in the underlaying zmq socket. - * - * \since 2.0.0 (built against 0mq version 3.1.x or later) - * - * \param option a valid ::socket_option - * \param value to set the option to - */ - void set(socket_option const option, bool const value); - - /*! - * Set the value of an option in the underlaying zmq socket. - * - * \param option a valid ::socket_option - * \param value to set the option to - */ - void set(socket_option const option, uint64_t const value); - - /*! - * Set the value of an option in the underlaying zmq socket. - * - * \param option a valid ::socket_option - * \param value to set the option to - */ - void set(socket_option const option, int64_t const value); - - /*! - * Set the value of an option in the underlaying zmq socket. - * - * \param option a valid ::socket_option - * \param pointer to raw byte value to set the option to - * \param length the size of the raw byte value - */ - void set(socket_option const option, char const* value, size_t const length); - - /*! - * Set the value of an option in the underlaying zmq socket. - * - * \param option a valid ::socket_option - * \param pointer to null terminated cstring value to set the option to - */ - inline void set(socket_option const option, char const* value) { set(option, value, strlen(value)); } - - /*! - * Set the value of an option in the underlaying zmq socket. - * - * \param option a valid ::socket_option - * \param value to set the option to - */ - inline void set(socket_option const option, std::string const value) { set(option, value.c_str(), value.length()); } - - /*! - * Get a socket option from the underlaying zmq socket. - * - * \param option a valid ::socket_option - * \param value referenced int to return value in - */ - void get(socket_option const option, int& value) const; - - /*! - * Get a socket option from the underlaying zmq socket. - * - * \param option a valid ::socket_option - * \param value referenced bool to return value in - */ - void get(socket_option const option, bool& value) const; - - /*! - * Get a socket option from the underlaying zmq socket. - * - * \param option a valid ::socket_option - * \param value referenced uint64_t to return value in - */ - void get(socket_option const option, uint64_t& value) const; - - /*! - * Get a socket option from the underlaying zmq socket. - * - * \param option a valid ::socket_option - * \param value referenced uint64_t to return value in - */ - void get(socket_option const option, int64_t& value) const; - - /*! - * Get a socket option from the underlaying zmq socket. - * - * \param option a valid ::socket_option - * \param value referenced std::string to return value in - */ - void get(socket_option const option, std::string& value) const; - - /*! - * For those that don't want to get into a referenced value this templated method - * will return the value instead. - * - * \param option a valid ::socket_option - * \return socket option value - */ - template<typename Type> - Type get(socket_option const option) const - { - Type value = Type(); - get(option, value); - return value; - } - - /*! - * Move constructor - * - * Moves the internals of source to this object, there is no guarantee - * that source will be left in a valid state. - * - * This constructor is noexcept and so will not throw exceptions - * - * \param source target socket to steal internals from - */ - socket(socket&& source) NOEXCEPT; - - /*! - * Move operator - * - * Moves the internals of source to this object, there is no guarantee - * that source will be left in a valid state. - * - * This function is noexcept and so will not throw exceptions - * - * \param source target socket to steal internals from - * \return socket reference to this - */ - socket& operator=(socket&& source) NOEXCEPT; - - /*! - * Check the socket is still valid - * - * This tests the internal state of the socket. - * If creation failed for some reason or if the move functions were used - * to move the socket internals to another instance this will return false. - * - * \return true if the socket is valid - */ - operator bool() const; - - /*! - * Access to the raw 0mq context - * - * \return void pointer to the underlying 0mq socket - */ - operator void*() const; - -private: - void* _socket; - socket_type _type; - zmq_msg_t _recv_buffer; - - // No copy - socket(socket const&) NOEXCEPT ZMQPP_EXPLICITLY_DELETED; - socket& operator=(socket const&) NOEXCEPT ZMQPP_EXPLICITLY_DELETED; - - void track_message(message_t const&, uint32_t const, bool&); -}; - -} - -#endif /* ZMQPP_SOCKET_HPP_ */ diff --git a/dep/zmqpp/zmqpp/socket_options.hpp b/dep/zmqpp/zmqpp/socket_options.hpp deleted file mode 100644 index c5c8586cbc7..00000000000 --- a/dep/zmqpp/zmqpp/socket_options.hpp +++ /dev/null @@ -1,80 +0,0 @@ -/** - * \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 - */ - -enum class 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 */ -#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 */ -#else - recovery_interval = ZMQ_RECOVERY_IVL, /*!< Multicast recovery interval in milliseconds */ -#endif - 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) - 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 - 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 */ -#endif -#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_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 -#ifdef ZMQ_EXPERIMENTAL_LABELS - receive_label = ZMQ_RCVLABEL, /*!< Received label part - get only */ -#endif -}; - -} - -#endif /* ZMQPP_SOCKET_OPTIONS_HPP_ */ diff --git a/dep/zmqpp/zmqpp/socket_types.hpp b/dep/zmqpp/zmqpp/socket_types.hpp deleted file mode 100644 index e59e71ca0e1..00000000000 --- a/dep/zmqpp/zmqpp/socket_types.hpp +++ /dev/null @@ -1,148 +0,0 @@ -/** - * \file - * - * \date 23 Sep 2011 - * \author Ben Gray (\@benjamg) - */ - -#ifndef ZMQPP_SOCKET_TYPES_HPP_ -#define ZMQPP_SOCKET_TYPES_HPP_ - -namespace zmqpp -{ - -/*! - * \brief Socket types allowed by zmq - * - * The socket type choose at creation must be one of these types. - * - * Each is designed for a different use and has different limitations. - */ -enum class socket_type { - /*! - * One to one - two way connection.\n - * Connect to ::pair.\n - * A \c pair socket has to be connected only one other pair socket and allows - * two way communication between them. - */ - pair = ZMQ_PAIR, - - /*! - * One to many - fan out.\n - * Connect to ::subscribe or ::xsubscribe.\n - * Socket is send only.\n - * Socket will drop messages and not block.\n - * \c publish sockets allow sending of the same message to many subscribers - * each subscriber can limit what is sent through the socket_option::subscribe - * settings. - */ - publish = ZMQ_PUB, - - /*! - * \note It seems doxygen can't work out which data is for the socket type and - * which is for the socket option so both get listed for both. - * - * One to many - fair-queued.\n - * Connect to ::publish or ::xpublish.\n - * Socket is receive only.\n - * The \c subscribe socket can connection to any number of publishers and will - * fairly pull messages from each. The socket_option::subscribe settings can - * be use to limit which messages are received and by default none are. - */ - subscribe = ZMQ_SUB, - - /*! - * One to many - fair-queued.\n - * Connect to ::push.\n - * Socket is receive only.\n - * The \c pull socket fairly pulls messages from all pushers it is connected - * to. - */ - pull = ZMQ_PULL, - - /*! - * One to many - load-balanced.\n - * Connect to ::pull.\n - * Socket is send only.\n - * Socket will block if unable to send.\n - * The \c push socket fairly distributes messages between any connected - * puller sockets. - */ - push = ZMQ_PUSH, - - /*! - * One to many - fair-queued outgoing, last peer incoming.\n - * Connect to ::reply or ::xreply.\n - * Socket flips between send and receive only.\n - * Socket will block if unable to send.\n - * The \c request socket will fairly balance requests sent out to a - * replier and then can only be used to receive until that replier - * sends a reply. - */ - request = ZMQ_REQ, - - /*! - * One to many - load-balanced incoming, last peer outgoing.\n - * Connect to ::request or ::xrequest.\n - * Socket flips between send and receive only.\n - * Socket will drop messages and not block.\n - * The \c reply socket can only receive until it pulls a message from a - * requester at which point it can only send until the reply is sent. - */ - reply = ZMQ_REP, - - /*! - * One to many - fan out.\n - * Connect to ::subscribe or ::xsubscribe.\n - * Socket is send only with the exception of special subscription messages.\n - * Socket will drop messages and not block.\n - * \c xpublish act the same as ::publish sockets however also allow special - * subscription messages to be received from subscribers. - */ - xpublish = ZMQ_XPUB, - - /*! - * One to many - fair-queued.\n - * Connect to ::publish or ::xpublish.\n - * Socket is receive only with the exception of special subscription messages\n - * \c xsubscribe act the same as ::subscribe sockets however also allow special - * subscription messages to be send to connected publishers. - */ - xsubscribe = ZMQ_XSUB, - - /*! - * One to many - fair-queued incoming, load-balanced outgoing.\n - * Connect to ::reply or ::xreply.\n - * Socket will block if unable to send.\n - * An \c xrequest socket balances requests between repliers and pulls replies - * back in a fair manner. Each request is expected to have exactly one reply. - */ - xrequest = ZMQ_XREQ, - - /*! - * One to many - fair-queued incoming, targeted outgoing.\n - * Connect to ::request or ::xrequest.\n - * Socket will drop messages and not block.\n - * An \c xreply socket fairly pulls in requests from requesters and will - * label requests so it can return replies back to the correct target. - */ - xreply = ZMQ_XREP, - - // To match for people who prefer the shorter versions - pub = ZMQ_PUB, /*!< version of ::publish to match zmq name convention */ - sub = ZMQ_SUB, /*!< version of ::subscribe to match zmq name convention */ - req = ZMQ_REQ, /*!< version of ::request to match zmq name convention */ - rep = ZMQ_REP, /*!< version of ::reply to match zmq name convention */ - xpub = ZMQ_XPUB, /*!< version of ::xpublish to match zmq name convention */ - xsub = ZMQ_XSUB, /*!< version of ::xsubscribe to match zmq name convention */ - xreq = ZMQ_XREQ, /*!< version of ::xrequest to match zmq name convention */ - xrep = ZMQ_XREP, /*!< version of ::xreply to match zmq name convention */ - - // For completion - router = ZMQ_ROUTER, /*!< \deprecated Matches zmq 2.x xrep functionality. */ - dealer = ZMQ_DEALER /*!< \deprecated Matches zmq 2.x xreq functionality. */ -}; - -} - -#endif /* ZMQPP_SOCKET_TYPES_HPP_ */ diff --git a/dep/zmqpp/zmqpp/zmqpp.cpp b/dep/zmqpp/zmqpp/zmqpp.cpp deleted file mode 100644 index 216948e73e7..00000000000 --- a/dep/zmqpp/zmqpp/zmqpp.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Created on: 18 Aug 2011 - * Author: Ben Gray (@benjamg) - */ - -#include "zmqpp.hpp" - -namespace zmqpp -{ - -std::string version() -{ - return BUILD_VERSION; -} - -void version(uint8_t& major, uint8_t& minor, uint8_t& revision) -{ - major = ZMQPP_VERSION_MAJOR; - minor = ZMQPP_VERSION_MINOR; - revision = ZMQPP_VERSION_REVISION; -} - -void zmq_version(uint8_t& major, uint8_t& minor, uint8_t& patch) -{ - major = ZMQ_VERSION_MAJOR; - minor = ZMQ_VERSION_MINOR; - patch = ZMQ_VERSION_PATCH; -} - -} diff --git a/dep/zmqpp/zmqpp/zmqpp.hpp b/dep/zmqpp/zmqpp/zmqpp.hpp deleted file mode 100644 index 92a47ce38bf..00000000000 --- a/dep/zmqpp/zmqpp/zmqpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -/** - * \file - * - * \date 9 Aug 2011 - * \author Ben Gray (\@benjamg) - * - * License: http://www.opensource.org/licenses/MIT - * - * Copyright (C) 2011 by Ben Gray - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#ifndef ZMQPP_ZMQPP_HPP_ -#define ZMQPP_ZMQPP_HPP_ - -/** - * \def ZMQPP_VERSION_MAJOR - * zmqpp major version number, generated at compile time - */ -#define ZMQPP_VERSION_MAJOR BUILD_VERSION_MAJOR - -/** - * \def ZMQPP_VERSION_MINOR - * zmqpp minor version number, generated at compile time - */ -#define ZMQPP_VERSION_MINOR BUILD_VERSION_MINOR - -/** - * \def ZMQPP_VERSION_REVISION - * zmqpp version revision number, generated at compile time - */ -#define ZMQPP_VERSION_REVISION BUILD_VERSION_REVISION - -#include <zmq.h> - -#include "compatibility.hpp" -#include "context.hpp" -#include "exception.hpp" -#include "message.hpp" -#include "poller.hpp" -#include "socket.hpp" - -/*! - * \brief C++ wrapper around zmq - * - * All zmq++ / zmqpp functions, constants and classes live within this namespace, - */ -namespace zmqpp -{ - -/*! - * Returns the current major.minor.revision version number as a string. - * - * \return string version number. - */ -std::string version(); - -/*! - * Retrieve the parts of the zmqpp version number. - * - * Set the three parameters to values representing the zmqpp version number. - * These values are generated at library compile time. - * - * \param major an unsigned 8 bit reference to set to the major version. - * \param minor an unsigned 8 bit reference to set to the minor version. - * \param revision an unsigned 8 bit reference to set the current revision. - */ -void version(uint8_t& major, uint8_t& minor, uint8_t& revision); - -/*! - * Retrieve the parts of the 0mq version this library was built against. - * - * Because sections of the library are optionally compiled in or ignored - * depending on the version of 0mq it was compiled against this method is - * provided to allow sanity checking for usage. - * - * Set the three parameters to values representing the 0mq version number. - * These values are generated at library compile time. - * - * \param major an unsigned 8 bit reference to set to the major version. - * \param minor an unsigned 8 bit reference to set to the minor version. - * \param revision an unsigned 8 bit reference to set the current revision. - */ -void zmq_version(uint8_t& major, uint8_t& minor, uint8_t& patch); - -typedef context context_t; /*!< \brief context type */ -typedef std::string endpoint_t; /*!< \brief endpoint type */ -typedef message message_t; /*!< \brief message type */ -typedef poller poller_t; /*!< \brief poller type */ -typedef socket socket_t; /*!< \brief socket type */ - -} - -#endif /* ZMQPP_ZMQPP_HPP_ */ diff --git a/dep/zmqpp/zmqpp_hotfix1.diff b/dep/zmqpp/zmqpp_hotfix1.diff deleted file mode 100644 index 956902e0dfa..00000000000 --- a/dep/zmqpp/zmqpp_hotfix1.diff +++ /dev/null @@ -1,106 +0,0 @@ -diff --git a/dep/zmqpp/zmqpp/inet.hpp b/dep/zmqpp/zmqpp/inet.hpp -index 5245aa4..e0c3b14 100644 ---- a/dep/zmqpp/zmqpp/inet.hpp -+++ b/dep/zmqpp/zmqpp/inet.hpp -@@ -76,10 +76,12 @@ inline uint64_t swap_if_needed(uint64_t const value_to_check) - * \param hostlonglong unsigned 64 bit host order integer - * \return unsigned 64 bit network order integer - */ -+#ifndef htonll - inline uint64_t htonll(uint64_t const hostlonglong) - { - return zmqpp::swap_if_needed(hostlonglong); - } -+#endif - - /*! - * 64 bit version of the ntohs/ntohl -@@ -89,10 +91,12 @@ inline uint64_t htonll(uint64_t const hostlonglong) - * \param networklonglong unsigned 64 bit network order integer - * \return unsigned 64 bit host order integer - */ -+#ifndef ntohll - inline uint64_t ntohll(uint64_t const networklonglong) - { - return zmqpp::swap_if_needed(networklonglong); - } -+#endif - - /*! - * floating point version of the htons/htonl -@@ -142,7 +146,7 @@ inline double htond(double value) - - uint64_t temp; - memcpy(&temp, &value, sizeof(uint64_t)); -- temp = zmqpp::htonll(temp); -+ temp = htonll(temp); - memcpy(&value, &temp, sizeof(uint64_t)); - - return value; -@@ -160,7 +164,7 @@ inline double ntohd(double value) - - uint64_t temp; - memcpy(&temp, &value, sizeof(uint64_t)); -- temp = zmqpp::ntohll(temp); -+ temp = ntohll(temp); - memcpy(&value, &temp, sizeof(uint64_t)); - - return value; -diff --git a/dep/zmqpp/zmqpp/message.cpp b/dep/zmqpp/zmqpp/message.cpp -index 5858730..4d81d24 100644 ---- a/dep/zmqpp/zmqpp/message.cpp -+++ b/dep/zmqpp/zmqpp/message.cpp -@@ -138,7 +138,7 @@ void message::get(int64_t& integer, size_t const part) const - assert(sizeof(int64_t) == size(part)); - - uint64_t const* network_order = static_cast<uint64_t const*>(raw_data(part)); -- integer = static_cast<int64_t>(zmqpp::htonll(*network_order)); -+ integer = static_cast<int64_t>(htonll(*network_order)); - } - - void message::get(uint8_t& unsigned_integer, size_t const part) const -@@ -170,7 +170,7 @@ void message::get(uint64_t& unsigned_integer, size_t const part) const - assert(sizeof(uint64_t) == size(part)); - - uint64_t const* network_order = static_cast<uint64_t const*>(raw_data(part)); -- unsigned_integer = zmqpp::ntohll(*network_order); -+ unsigned_integer = ntohll(*network_order); - } - - void message::get(float& floating_point, size_t const part) const -@@ -228,7 +228,7 @@ message& message::operator<<(int32_t const integer) - - message& message::operator<<(int64_t const integer) - { -- uint64_t network_order = zmqpp::htonll(static_cast<uint64_t>(integer)); -+ uint64_t network_order = htonll(static_cast<uint64_t>(integer)); - add(reinterpret_cast<void const*>(&network_order), sizeof(uint64_t)); - - return *this; -@@ -259,7 +259,7 @@ message& message::operator<<(uint32_t const unsigned_integer) - - message& message::operator<<(uint64_t const unsigned_integer) - { -- uint64_t network_order = zmqpp::htonll(unsigned_integer); -+ uint64_t network_order = htonll(unsigned_integer); - add(reinterpret_cast<void const*>(&network_order), sizeof(uint64_t)); - - return *this; -@@ -329,7 +329,7 @@ void message::push_front(int32_t const integer) - - void message::push_front(int64_t const integer) - { -- uint64_t network_order = zmqpp::htonll(static_cast<uint64_t>(integer)); -+ uint64_t network_order = htonll(static_cast<uint64_t>(integer)); - push_front(&network_order, sizeof(uint64_t)); - } - -@@ -353,7 +353,7 @@ void message::push_front(uint32_t const unsigned_integer) - - void message::push_front(uint64_t const unsigned_integer) - { -- uint64_t network_order = zmqpp::htonll(unsigned_integer); -+ uint64_t network_order = htonll(unsigned_integer); - push_front(&network_order, sizeof(uint64_t)); - } - diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index b8400f496c7..f4a7246d9b0 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -27,7 +27,6 @@ endif(WIN32) add_subdirectory(database) add_subdirectory(shared) -add_subdirectory(ipc) add_subdirectory(bnetserver) add_subdirectory(game) add_subdirectory(scripts) diff --git a/src/server/bnetserver/CMakeLists.txt b/src/server/bnetserver/CMakeLists.txt index 81aabc3eed8..7aa861499d9 100644 --- a/src/server/bnetserver/CMakeLists.txt +++ b/src/server/bnetserver/CMakeLists.txt @@ -43,8 +43,7 @@ endif() target_link_libraries(bnetserver PUBLIC - shared - ipc) + shared) CollectIncludeDirectories( ${CMAKE_CURRENT_SOURCE_DIR} diff --git a/src/server/bnetserver/Main.cpp b/src/server/bnetserver/Main.cpp index 310683dec37..65b8d6e772b 100644 --- a/src/server/bnetserver/Main.cpp +++ b/src/server/bnetserver/Main.cpp @@ -36,7 +36,6 @@ #include "RealmList.h" #include "GitRevision.h" #include "Util.h" -#include "ZmqContext.h" #include "DatabaseLoader.h" #include <cstdlib> #include <iostream> @@ -136,23 +135,14 @@ int main(int argc, char** argv) } } - int32 worldListenPort = sConfigMgr->GetIntDefault("WorldserverListenPort", 1118); - if (worldListenPort < 0 || worldListenPort > 0xFFFF) - { - TC_LOG_ERROR("server.bnetserver", "Specified worldserver listen port (%d) out of allowed range (1-65535)", worldListenPort); - return 1; - } - // Initialize the database connection if (!StartDB()) return 1; - sIpcContext->Initialize(); - _ioService = new boost::asio::io_service(); // Get the list of realms for the server - sRealmList->Initialize(*_ioService, sConfigMgr->GetIntDefault("RealmsStateUpdateDelay", 10), worldListenPort); + sRealmList->Initialize(*_ioService, sConfigMgr->GetIntDefault("RealmsStateUpdateDelay", 10)); // Start the listening port (acceptor) for auth connections int32 bnport = sConfigMgr->GetIntDefault("BattlenetPort", 1119); @@ -209,8 +199,6 @@ int main(int argc, char** argv) sSessionMgr.StopNetwork(); - sIpcContext->Close(); - sRealmList->Close(); // Close the Database Pool and library diff --git a/src/server/bnetserver/Realms/RealmList.cpp b/src/server/bnetserver/Realms/RealmList.cpp index d3f40a8cc97..056ddef39d4 100644 --- a/src/server/bnetserver/Realms/RealmList.cpp +++ b/src/server/bnetserver/Realms/RealmList.cpp @@ -20,23 +20,20 @@ #include "Database/DatabaseEnv.h" #include "SessionManager.h" #include "Util.h" -#include "Commands.h" #include "RealmList.h" #include <boost/asio/ip/tcp.hpp> -RealmList::RealmList() : _updateInterval(0), _updateTimer(nullptr), _resolver(nullptr), _worldListener(nullptr) +RealmList::RealmList() : _updateInterval(0), _updateTimer(nullptr), _resolver(nullptr) { } RealmList::~RealmList() { delete _updateTimer; - delete _resolver; - delete _worldListener; } // Load the realm list from the database -void RealmList::Initialize(boost::asio::io_service& ioService, uint32 updateInterval, uint16 worldListenPort) +void RealmList::Initialize(boost::asio::io_service& ioService, uint32 updateInterval) { _updateInterval = updateInterval; _updateTimer = new boost::asio::deadline_timer(ioService); @@ -44,14 +41,10 @@ void RealmList::Initialize(boost::asio::io_service& ioService, uint32 updateInte // Get the content of the realmlist table in the database UpdateRealms(boost::system::error_code()); - - _worldListener = new WorldListener(worldListenPort); - _worldListener->Start(); } void RealmList::Close() { - _worldListener->End(); _updateTimer->cancel(); } diff --git a/src/server/bnetserver/Realms/RealmList.h b/src/server/bnetserver/Realms/RealmList.h index 388d4d5e1aa..fe3c9185ccf 100644 --- a/src/server/bnetserver/Realms/RealmList.h +++ b/src/server/bnetserver/Realms/RealmList.h @@ -21,7 +21,6 @@ #include "Common.h" #include "Realm/Realm.h" -#include "WorldListener.h" #include <boost/asio/ip/address.hpp> #include <boost/asio/ip/tcp.hpp> #include <boost/asio/io_service.hpp> @@ -43,7 +42,7 @@ public: ~RealmList(); - void Initialize(boost::asio::io_service& ioService, uint32 updateInterval, uint16 worldListenPort); + void Initialize(boost::asio::io_service& ioService, uint32 updateInterval); void Close(); RealmMap const& GetRealms() const { return _realms; } @@ -60,7 +59,6 @@ private: uint32 _updateInterval; boost::asio::deadline_timer* _updateTimer; boost::asio::ip::tcp::resolver* _resolver; - WorldListener* _worldListener; }; #define sRealmList RealmList::instance() diff --git a/src/server/bnetserver/Realms/WorldListener.cpp b/src/server/bnetserver/Realms/WorldListener.cpp deleted file mode 100644 index 2dd9bcdfa2f..00000000000 --- a/src/server/bnetserver/Realms/WorldListener.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "Log.h" -#include "SessionManager.h" -#include "WoWRealmPackets.h" -#include "ZmqContext.h" -#include "WorldListener.h" - -WorldListener::HandlerTable const WorldListener::_handlers; - -WorldListener::HandlerTable::HandlerTable() -{ -#define DEFINE_HANDLER(opc, func) _handlers[opc] = { func, #opc } - - DEFINE_HANDLER(BNET_CHANGE_TOON_ONLINE_STATE, &WorldListener::HandleToonOnlineStatusChange); - -#undef DEFINE_HANDLER -} - -WorldListener::WorldListener(uint16 worldListenPort) : _worldListenPort(worldListenPort) -{ - _worldSocket = sIpcContext->CreateNewSocket(zmqpp::socket_type::pull); -} - -WorldListener::~WorldListener() -{ - delete _worldSocket; -} - -void WorldListener::Run() -{ - while (!ProcessExit()) - { - _poller->poll(); - if (_poller->events(*_worldSocket) & zmqpp::poller::poll_in) - { - int32 op1; - do - { - zmqpp::message msg; - _worldSocket->receive(msg); - Dispatch(msg); - _worldSocket->get(zmqpp::socket_option::events, op1); - } while (op1 & zmqpp::poller::poll_in); - } - } -} - -void WorldListener::HandleOpen() -{ - try - { - _worldSocket->bind(std::string("tcp://*:") + std::to_string(_worldListenPort)); - } - catch (zmqpp::zmq_internal_exception& ex) - { - TC_LOG_FATAL("server.ipc", "Could not bind to WorldserverListenPort %u. Exception: %s. Shutting down bnetserver.", _worldListenPort, ex.what()); - abort(); - } - - _poller->add(*_worldSocket); - TC_LOG_INFO("server.ipc", "Listening on connections from worldservers on port %u...", _worldListenPort); -} - -void WorldListener::HandleClose() -{ - _worldSocket->close(); - TC_LOG_INFO("server.ipc", "Shutting down connections from worldservers..."); -} - -void WorldListener::Dispatch(zmqpp::message& msg) const -{ - IPC::BattlenetComm::Header ipcHeader; - msg >> ipcHeader; - - if (ipcHeader.Ipc.Channel != IPC_CHANNEL_BNET) - return; - - if (ipcHeader.Ipc.Command < IPC_BNET_MAX_COMMAND) - (this->*_handlers[ipcHeader.Ipc.Command].Handler)(ipcHeader.Realm, msg); -} - -void WorldListener::HandleToonOnlineStatusChange(Battlenet::RealmHandle const& realm, zmqpp::message& msg) const -{ - IPC::BattlenetComm::ToonHandle toonHandle; - bool online; - msg >> toonHandle; - msg >> online; - - if (Battlenet::Session* session = sSessionMgr.GetSession(toonHandle.AccountId, toonHandle.GameAccountId)) - { - if (online) - { - if (!session->IsToonOnline()) - { - Battlenet::WoWRealm::ToonReady* toonReady = new Battlenet::WoWRealm::ToonReady(); - toonReady->Name.Region = realm.Region; - toonReady->Name.ProgramId = "WoW"; - toonReady->Name.Realm = realm.GetAddress(); - toonReady->Name.Name = toonHandle.Name; - - toonReady->Handle.Region = realm.Region; - toonReady->Handle.ProgramId = "WoW"; - toonReady->Handle.Realm = realm.GetAddress(); - toonReady->Handle.Id = toonHandle.Guid; - - session->SetToonOnline(true); - session->AsyncWrite(toonReady); - } - } - else if (session->IsToonOnline()) - { - session->AsyncWrite(new Battlenet::WoWRealm::ToonLoggedOut()); - session->SetToonOnline(false); - } - } -} diff --git a/src/server/bnetserver/Realms/WorldListener.h b/src/server/bnetserver/Realms/WorldListener.h deleted file mode 100644 index e5b1ff41201..00000000000 --- a/src/server/bnetserver/Realms/WorldListener.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef WorldListener_h__ -#define WorldListener_h__ - -#include "ZMQTask.h" -#include "Commands.h" - -class WorldListener : public ZMQTask -{ -public: - explicit WorldListener(uint16 worldListenPort); - ~WorldListener(); - void Run() override; - -protected: - void HandleOpen() override; - void HandleClose() override; - -private: - void Dispatch(zmqpp::message& msg) const; - - typedef void(WorldListener::*PacketHandler)(Battlenet::RealmHandle const& realm, zmqpp::message& msg) const; - class HandlerTable - { - public: - HandlerTable(); - - struct HandlerInfo - { - PacketHandler Handler; - char const* Name; - }; - - HandlerInfo const& operator[](uint8 opcode) const { return _handlers[opcode]; } - - private: - HandlerInfo _handlers[IPC_BNET_MAX_COMMAND]; - }; - - void HandleToonOnlineStatusChange(Battlenet::RealmHandle const& realm, zmqpp::message& msg) const; - - zmqpp::socket* _worldSocket; - uint16 _worldListenPort; - static HandlerTable const _handlers; -}; - -#endif // WorldListener_h__ diff --git a/src/server/bnetserver/bnetserver.conf.dist b/src/server/bnetserver/bnetserver.conf.dist index cf5d27699d8..252a29440b5 100644 --- a/src/server/bnetserver/bnetserver.conf.dist +++ b/src/server/bnetserver/bnetserver.conf.dist @@ -48,13 +48,6 @@ LogsDir = "" MaxPingTime = 30 # -# WorldserverListenPort -# Description: TCP port to listen on for incoming worldserver IPC. -# Default: 1118 - -WorldserverListenPort = 1118 - -# # BattlenetPort # Description: TCP port to reach the auth server for battle.net connections. # Default: 1119 diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt index 1dbc75d10af..bba0614d421 100644 --- a/src/server/game/CMakeLists.txt +++ b/src/server/game/CMakeLists.txt @@ -40,7 +40,7 @@ target_include_directories(game target_link_libraries(game PUBLIC - ipc + shared Detour) set_target_properties(game diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index ef197cbe541..dff529891b6 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -21,7 +21,6 @@ #include "ArenaTeamMgr.h" #include "AuthenticationPackets.h" #include "Battleground.h" -#include "BattlenetServerManager.h" #include "BattlePetPackets.h" #include "CalendarMgr.h" #include "CharacterPackets.h" @@ -1138,8 +1137,6 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) sScriptMgr->OnPlayerLogin(pCurrChar, firstLogin); - sBattlenetServer.SendChangeToonOnlineState(GetBattlenetAccountId(), GetAccountId(), _player->GetGUID(), _player->GetName(), true); - delete holder; } diff --git a/src/server/game/Server/BattlenetServerManager.cpp b/src/server/game/Server/BattlenetServerManager.cpp deleted file mode 100644 index 1256943e565..00000000000 --- a/src/server/game/Server/BattlenetServerManager.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "Config.h" -#include "World.h" -#include "ZmqContext.h" -#include "BattlenetServerManager.h" - -void IPC::BattlenetComm::ServerManager::InitializeConnection() -{ - std::string bnetserverAddress = sConfigMgr->GetStringDefault("BnetServer.Address", "127.0.0.1"); - int32 bnetserverPort = sConfigMgr->GetIntDefault("BnetServer.Port", 1118); - _socket = new ZmqMux("inproc://bnetmgr", "tcp://" + bnetserverAddress + ":" + std::to_string(bnetserverPort)); - _socket->Start(); -} - -void IPC::BattlenetComm::ServerManager::CloseConnection() -{ - _socket->End(); - delete _socket; - _socket = nullptr; -} - -IPC::BattlenetComm::ServerManager& IPC::BattlenetComm::ServerManager::Instance() -{ - static ServerManager instance; - return instance; -} - -IPC::BattlenetComm::Header IPC::BattlenetComm::ServerManager::CreateHeader(BnetCommands command) -{ - Header header; - header.Ipc.Channel = IPC_CHANNEL_BNET; - header.Ipc.Command = command; - header.Realm = realm.Id; - return header; -} - -void IPC::BattlenetComm::ServerManager::SendChangeToonOnlineState(uint32 battlenetAccountId, uint32 gameAccountId, ObjectGuid guid, std::string const& name, bool online) -{ - // Do nothing for Grunt login - if (!battlenetAccountId) - return; - - Header header = CreateHeader(BNET_CHANGE_TOON_ONLINE_STATE); - ToonHandle toon; - toon.AccountId = battlenetAccountId; - toon.GameAccountId = gameAccountId; - toon.Guid = guid.GetCounter(); - toon.Name = name; - - zmqpp::message msg; - msg << header; - msg << toon; - msg << online; - - Send(&msg); -} - -void IPC::BattlenetComm::ServerManager::Send(zmqpp::message* msg) -{ - if (!_socket) - return; - - _socket->Send(msg); -} diff --git a/src/server/game/Server/BattlenetServerManager.h b/src/server/game/Server/BattlenetServerManager.h deleted file mode 100644 index 3892ac5040f..00000000000 --- a/src/server/game/Server/BattlenetServerManager.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef BattlenetMgr_h__ -#define BattlenetMgr_h__ - -#include "ZmqMux.h" -#include "Commands.h" - -namespace zmqpp -{ - class socket; - class message; -} - -namespace IPC -{ - namespace BattlenetComm - { - class ServerManager - { - ServerManager() : _socket(nullptr) { } - - public: - void InitializeConnection(); - void CloseConnection(); - - static ServerManager& Instance(); - - void SendChangeToonOnlineState(uint32 battlenetAccountId, uint32 gameAccountId, ObjectGuid guid, std::string const& name, bool online); - - private: - void Send(zmqpp::message* msg); - - static Header CreateHeader(BnetCommands command); - ZmqMux* _socket; - }; - } -} - -#define sBattlenetServer IPC::BattlenetComm::ServerManager::Instance() - -#endif // BattlenetMgr_h__ diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index f68fc5efaf5..ebb3ea02896 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -42,7 +42,6 @@ #include "SocialMgr.h" #include "ScriptMgr.h" #include "WardenWin.h" -#include "BattlenetServerManager.h" #include "AuthenticationPackets.h" #include "CharacterPackets.h" #include "ClientConfigPackets.h" @@ -612,8 +611,6 @@ void WorldSession::LogoutPlayer(bool save) TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Logout Character:[%s] (%s) Level: %d", GetAccountId(), GetRemoteAddress().c_str(), _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), _player->getLevel()); - sBattlenetServer.SendChangeToonOnlineState(GetBattlenetAccountId(), GetAccountId(), _player->GetGUID(), _player->GetName(), false); - if (Map* _map = _player->FindMap()) _map->RemovePlayerFromMap(_player, true); diff --git a/src/server/ipc/CMakeLists.txt b/src/server/ipc/CMakeLists.txt deleted file mode 100644 index 8469c922066..00000000000 --- a/src/server/ipc/CMakeLists.txt +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -CollectSourceFiles( - ${CMAKE_CURRENT_SOURCE_DIR} - PRIVATE_SOURCES) - -GroupSources(${CMAKE_CURRENT_SOURCE_DIR}) - -add_library(ipc ${PRIVATE_SOURCES}) - -target_include_directories(ipc - PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR} - PRIVATE - ${CMAKE_CURRENT_BINARY_DIR}) - -target_link_libraries(ipc - PUBLIC - shared - zmqpp) - -set_target_properties(ipc - PROPERTIES - FOLDER - "server") diff --git a/src/server/ipc/Commands.cpp b/src/server/ipc/Commands.cpp deleted file mode 100644 index 3eb78cbc14a..00000000000 --- a/src/server/ipc/Commands.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "Commands.h" -#include <zmqpp/message.hpp> - -zmqpp::message& operator>>(zmqpp::message& msg, IPC::Header& header) -{ - msg >> header.Channel; - msg >> header.Command; - return msg; -} - -zmqpp::message& operator>>(zmqpp::message& msg, Battlenet::RealmHandle& realm) -{ - msg >> realm.Region; - msg >> realm.Site; - msg >> realm.Realm; - return msg; -} - -zmqpp::message& operator>>(zmqpp::message& msg, IPC::BattlenetComm::Header& header) -{ - msg >> header.Ipc; - msg >> header.Realm; - return msg; -} - -zmqpp::message& operator>>(zmqpp::message& msg, IPC::BattlenetComm::ToonHandle& toonHandle) -{ - msg >> toonHandle.AccountId; - msg >> toonHandle.GameAccountId; - msg >> toonHandle.Guid; - msg >> toonHandle.Name; - return msg; -} - -zmqpp::message& operator<<(zmqpp::message& msg, IPC::Header const& header) -{ - msg << header.Channel; - msg << header.Command; - return msg; -} - -zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::RealmHandle const& realm) -{ - msg << realm.Region; - msg << realm.Site; - msg << realm.Realm; - return msg; -} - -zmqpp::message& operator<<(zmqpp::message& msg, IPC::BattlenetComm::Header const& header) -{ - msg << header.Ipc; - msg << header.Realm; - return msg; -} - -zmqpp::message& operator<<(zmqpp::message& msg, IPC::BattlenetComm::ToonHandle const& toonHandle) -{ - msg << toonHandle.AccountId; - msg << toonHandle.GameAccountId; - msg << toonHandle.Guid; - msg << toonHandle.Name; - return msg; -} diff --git a/src/server/ipc/Commands.h b/src/server/ipc/Commands.h deleted file mode 100644 index 618e8ca0509..00000000000 --- a/src/server/ipc/Commands.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef _COMMANDS_H -#define _COMMANDS_H - -#include "Define.h" -#include "Realm/Realm.h" -#include <string> - -enum Channels -{ - IPC_CHANNEL_BNET, - - MAX_IPC_CHANNELS, -}; - -enum BnetCommands -{ - BNET_CHANGE_TOON_ONLINE_STATE, - - IPC_BNET_MAX_COMMAND -}; - -namespace IPC -{ - struct Header - { - uint8 Channel; - uint8 Command; - }; - - namespace BattlenetComm - { - struct Header - { - IPC::Header Ipc; - Battlenet::RealmHandle Realm; - }; - - struct ToonHandle - { - uint32 AccountId; - uint32 GameAccountId; - uint64 Guid; - std::string Name; - }; - } -} - -namespace zmqpp -{ - class message; -} - -zmqpp::message& operator>>(zmqpp::message& msg, IPC::Header& header); -zmqpp::message& operator>>(zmqpp::message& msg, Battlenet::RealmHandle& realm); -zmqpp::message& operator>>(zmqpp::message& msg, IPC::BattlenetComm::Header& header); -zmqpp::message& operator>>(zmqpp::message& msg, IPC::BattlenetComm::ToonHandle& toonHandle); - -zmqpp::message& operator<<(zmqpp::message& msg, IPC::Header const& header); -zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::RealmHandle const& realm); -zmqpp::message& operator<<(zmqpp::message& msg, IPC::BattlenetComm::Header const& header); -zmqpp::message& operator<<(zmqpp::message& msg, IPC::BattlenetComm::ToonHandle const& toonHandle); - -#endif // _COMMANDS_H diff --git a/src/server/ipc/ZMQTask.cpp b/src/server/ipc/ZMQTask.cpp deleted file mode 100644 index 6d359d9b10a..00000000000 --- a/src/server/ipc/ZMQTask.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "ZMQTask.h" -#include "ZmqContext.h" -#include <zmqpp/message.hpp> - -ZMQTask::ZMQTask() -{ - _poller = new zmqpp::poller(); -} - -ZMQTask::~ZMQTask() -{ - delete _poller; - _poller = NULL; - delete _inproc; - delete _thread; -} - -void ZMQTask::Start() -{ - _inproc = sIpcContext->CreateInprocSubscriber(); - _poller->add(*_inproc); - - HandleOpen(); - _thread = new std::thread(&ZMQTask::Run, this); -} - -void ZMQTask::End() -{ - _thread->join(); - _poller->remove(*_inproc); - _inproc->close(); - HandleClose(); -} - -bool ZMQTask::ProcessExit() -{ - if (_poller->events(*_inproc) == zmqpp::poller::poll_in) - { - int op1; - do - { - zmqpp::message msg; - if (!_inproc->receive(msg, true)) - return false; //No more messages to read from sock. This shouldn't happen. - - // strip 'internalmq.' from message - std::string cmd = msg.get(0).substr(11); - if (cmd == "kill") - return true; - - _inproc->get(zmqpp::socket_option::events, op1); - } while (op1 & zmqpp::poller::poll_in); - } - - return false; -} - -void ZMQTask::Pipeline(zmqpp::socket* from, zmqpp::socket* to) -{ - /* - Push messages from socket to socket. - */ - if (_poller->events(*from) == zmqpp::poller::poll_in) - { - int32 op1, op2; - do - { - zmqpp::message msg; - if (!from->receive(msg, true)) - return; //No more messages to read from socket. This shouldn't happen. - - to->send(msg); - from->get(zmqpp::socket_option::events, op1); - to->get(zmqpp::socket_option::events, op2); - } while(op1 & zmqpp::poller::poll_in && op2 & zmqpp::poller::poll_out); - } -} diff --git a/src/server/ipc/ZMQTask.h b/src/server/ipc/ZMQTask.h deleted file mode 100644 index 85773adbfd1..00000000000 --- a/src/server/ipc/ZMQTask.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __ZMQTASK_H -#define __ZMQTASK_H - -#include "Define.h" -#include <thread> -#include <zmqpp/poller.hpp> -#include <zmqpp/socket.hpp> - -/* - This class serves as a base for all long running tasks - It is set up to terminate its running task upon receiving "kill" command -*/ -class ZMQTask -{ -public: - ZMQTask(); - virtual ~ZMQTask(); - - void Start(); - void End(); - virtual void Run() = 0; - -protected: - virtual void HandleOpen() { } - virtual void HandleClose() { } - void Pipeline(zmqpp::socket* from, zmqpp::socket* to); - bool ProcessExit(); - - zmqpp::poller* _poller; - - zmqpp::socket* _inproc = nullptr; - std::thread* _thread = nullptr; -}; - -#endif // __ZMQTASK_H diff --git a/src/server/ipc/ZmqContext.cpp b/src/server/ipc/ZmqContext.cpp deleted file mode 100644 index bc062de8e88..00000000000 --- a/src/server/ipc/ZmqContext.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "ZmqContext.h" - -ZmqContext::ZmqContext() : _inproc(nullptr) -{ -} - -ZmqContext::~ZmqContext() -{ -} - -zmqpp::socket* ZmqContext::CreateNewSocket(zmqpp::socket_type type) -{ - std::unique_lock<std::mutex> lock(_mutex); - zmqpp::socket* socket = new zmqpp::socket(_context, type); - socket->set(zmqpp::socket_option::linger, 0); - return socket; -} - -void ZmqContext::Initialize() -{ - _inproc = new zmqpp::socket(_context, zmqpp::socket_type::pub); - _inproc->bind("inproc://workers"); -} - -zmqpp::socket* ZmqContext::CreateInprocSubscriber() -{ - zmqpp::socket* sub = CreateNewSocket(zmqpp::socket_type::sub); - sub->connect("inproc://workers"); - sub->subscribe("internalmq."); - return sub; -} - -void ZmqContext::Close() -{ - _inproc->send("internalmq.kill"); - delete _inproc; - _inproc = nullptr; -} diff --git a/src/server/ipc/ZmqContext.h b/src/server/ipc/ZmqContext.h deleted file mode 100644 index 99f49a8c597..00000000000 --- a/src/server/ipc/ZmqContext.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __ZMQCONTEX_H -#define __ZMQCONTEX_H - -#include <zmqpp/zmqpp.hpp> -#include <mutex> - -/* - * We need to serialize access to zmq context otherwise stuff blows up. - */ -class ZmqContext -{ -public: - ~ZmqContext(); - - static ZmqContext* Instance() - { - static ZmqContext instance; - return &instance; - } - - zmqpp::socket* CreateNewSocket(zmqpp::socket_type); - void Initialize(); - zmqpp::socket* CreateInprocSubscriber(); - void Close(); - -private: - ZmqContext(); - ZmqContext(ZmqContext const&) = delete; - ZmqContext& operator=(ZmqContext const&) = delete; - - zmqpp::context _context; - std::mutex _mutex; - zmqpp::socket* _inproc; -}; - -#define sIpcContext ZmqContext::Instance() - -#endif diff --git a/src/server/ipc/ZmqListener.cpp b/src/server/ipc/ZmqListener.cpp deleted file mode 100644 index a7cf78f8a92..00000000000 --- a/src/server/ipc/ZmqListener.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "ZmqListener.h" -#include "ZmqContext.h" - -ZmqListener::ZmqListener(std::string const& from, std::string const& to) -{ - _from = sIpcContext->CreateNewSocket(zmqpp::socket_type::sub); - _to = sIpcContext->CreateNewSocket(zmqpp::socket_type::push); - _from->connect(from); - _to->bind(to); -} - -ZmqListener::~ZmqListener() -{ - delete _from; - delete _to; -} - -void ZmqListener::HandleOpen() -{ -} - -void ZmqListener::HandleClose() -{ - _from->close(); - _to->close(); -} - -void ZmqListener::Run() -{ - while (!ProcessExit()) - { - _poller->poll(); - - while (_poller->events(*_from) & zmqpp::poller::poll_in && - _poller->events(*_to) & zmqpp::poller::poll_out) - { - zmqpp::message msg; - _from->receive(msg); - _to->send(msg); - } - } -} - -void ZmqListener::Subscribe(std::string const& keyword) -{ - _from->subscribe(keyword); -} - -void ZmqListener::Unsubscribe(std::string const& keyword) -{ - _from->unsubscribe(keyword); -} diff --git a/src/server/ipc/ZmqListener.h b/src/server/ipc/ZmqListener.h deleted file mode 100644 index 07798b81886..00000000000 --- a/src/server/ipc/ZmqListener.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __ZMQLISTENER_H -#define __ZMQLISTENER_H - -#include "ZMQTask.h" -#include <zmqpp/zmqpp.hpp> - -class ZmqListener : public ZMQTask -{ -/* - * Read broadcasts from remote PUB socket, and forward them to - * another socket. - * - * from - client SUB socket - * to - listen PUSH socket - * - */ -public: - ZmqListener(std::string const& from, std::string const& to); - ~ZmqListener(); - void Run() override; - - void Subscribe(std::string const& keyword); - void Unsubscribe(std::string const& keyword); - -protected: - void HandleOpen() override; - void HandleClose() override; - -private: - zmqpp::socket* _from; - zmqpp::socket* _to; -}; - -#endif diff --git a/src/server/ipc/ZmqMux.cpp b/src/server/ipc/ZmqMux.cpp deleted file mode 100644 index d6dcd0f73f6..00000000000 --- a/src/server/ipc/ZmqMux.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "ZmqMux.h" -#include "ZmqContext.h" - -ZmqMux::ZmqMux(std::string const& fromUri, std::string const& toUri): - _fromAddress(fromUri) -{ - printf("Opening muxer thread from %s to %s\n", fromUri.c_str(), toUri.c_str()); - _from = sIpcContext->CreateNewSocket(zmqpp::socket_type::pull); - _to = sIpcContext->CreateNewSocket(zmqpp::socket_type::push); - - _from->bind(fromUri); - _to->connect(toUri); -} - -ZmqMux::~ZmqMux() -{ - delete _from; - delete _to; -} - -void ZmqMux::HandleOpen() -{ - _poller->add(*_from); - _poller->add(*_to, zmqpp::poller::poll_out); -} - -bool ZmqMux::Send(zmqpp::message* m, bool dont_block) -{ - if (_socket.get() == nullptr) - { - _socket.reset(sIpcContext->CreateNewSocket(zmqpp::socket_type::push)); - _socket->connect(_fromAddress); - } - - return _socket->send(*m, dont_block); -} - -void ZmqMux::Run() -{ - for (;;) - { - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - if (!_poller->poll()) - break; - - if (ProcessExit()) - break; - - Pipeline(_from, _to); - } -} diff --git a/src/server/ipc/ZmqMux.h b/src/server/ipc/ZmqMux.h deleted file mode 100644 index 1009382f101..00000000000 --- a/src/server/ipc/ZmqMux.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __ZMQMUX_H -#define __ZMQMUX_H - -#include "ZMQTask.h" -#include <string> -#include <boost/thread/tss.hpp> - -/* - * Multiplexes zmq messages from many threads, - * and then passes them to another socket. - */ -class ZmqMux : public ZMQTask -{ -public: - ZmqMux(std::string const& from, std::string const& to); - ~ZmqMux(); - bool Send(zmqpp::message*, bool dont_block = false); - void Run() override; - -protected: - void HandleOpen() override; - -private: - boost::thread_specific_ptr<zmqpp::socket> _socket; - zmqpp::socket* _from; - zmqpp::socket* _to; - std::string const _fromAddress; -}; - -#endif diff --git a/src/server/ipc/ZmqWorker.cpp b/src/server/ipc/ZmqWorker.cpp deleted file mode 100644 index 617730ad013..00000000000 --- a/src/server/ipc/ZmqWorker.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "ZmqWorker.h" -#include "ZmqContext.h" - -ZmqWorker::ZmqWorker(std::string const& taskUri, std::string const& resUri) : - _taskUri(taskUri), _resultsUri(resUri) -{ -} - -ZmqWorker::~ZmqWorker() -{ - delete _taskQueue; - delete _results; -} - -void ZmqWorker::HandleOpen() -{ - _taskQueue = sIpcContext->CreateNewSocket(zmqpp::socket_type::pull); - _results = sIpcContext->CreateNewSocket(zmqpp::socket_type::push); - - _taskQueue->connect(_taskUri); - _results->connect(_resultsUri); - - _poller->add(*_taskQueue); -} - -void ZmqWorker::HandleClose() -{ - _taskQueue->close(); - _results->close(); -} - -void ZmqWorker::Run() -{ - while (!ProcessExit()) - { - _poller->poll(); - if (_poller->events(*_taskQueue) & zmqpp::poller::poll_in) - PerformWork(); - } -} - -void ZmqWorker::PerformWork() -{ - int32 op1; - do - { - zmqpp::message msg; - _taskQueue->receive(msg); - Dispatch(msg); - _taskQueue->get(zmqpp::socket_option::events, op1); - } while (op1 & zmqpp::poller::poll_in); -} diff --git a/src/server/ipc/ZmqWorker.h b/src/server/ipc/ZmqWorker.h deleted file mode 100644 index 21d2d95ac18..00000000000 --- a/src/server/ipc/ZmqWorker.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __ZMQWORKER_H -#define __ZMQWORKER_H - -#include "ZMQTask.h" -#include <zmqpp/zmqpp.hpp> - -class ZmqWorker : public ZMQTask -{ -public: - ZmqWorker(std::string const& taskUri, std::string const& resUri); - ~ZmqWorker(); - void Run() override; - -protected: - void HandleOpen() override; - void HandleClose() override; - zmqpp::socket* _results = nullptr; - -private: - void PerformWork(); - virtual void Dispatch(zmqpp::message const&) = 0; - zmqpp::socket* _taskQueue = nullptr; - std::string _taskUri; - std::string _resultsUri; -}; - -#endif diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 5b94521817f..8c801736ef4 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -21,8 +21,6 @@ /// \file #include "Common.h" -#include "Commands.h" -#include "ZmqContext.h" #include "DatabaseEnv.h" #include "AsyncAcceptor.h" #include "RASession.h" @@ -43,7 +41,6 @@ #include "GitRevision.h" #include "WorldSocket.h" #include "WorldSocketMgr.h" -#include "BattlenetServerManager.h" #include "Realm/Realm.h" #include "DatabaseLoader.h" #include "AppenderDB.h" @@ -240,10 +237,6 @@ extern int main(int argc, char** argv) TC_LOG_INFO("server.worldserver", "Starting up anti-freeze thread (%u seconds max stuck time)...", coreStuckTime); } - sIpcContext->Initialize(); - - sBattlenetServer.InitializeConnection(); - TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon) ready...", GitRevision::GetFullVersion()); sScriptMgr->OnStartup(); @@ -257,10 +250,6 @@ extern int main(int argc, char** argv) sScriptMgr->OnShutdown(); - sIpcContext->Close(); - - sBattlenetServer.CloseConnection(); - sWorld->KickAll(); // save and kick all players sWorld->UpdateSessions(1); // real players unload required UpdateSessions call diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index b3a6a13bd45..1b4ad557c0d 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -3626,24 +3626,3 @@ PacketSpoof.BanDuration = 86400 # ################################################################################################### - -################################################################################################### -# IPC SETTINGS -# -# BnetServer.Address -# Description: Determines IP address of battle.net server to connect to. -# Default: 127.0.0.1 -# - -BnetServer.Address = 127.0.0.1 - -# -# BnetServer.Port -# Description: Determines port to use when connecting to battle.net server. -# Default: 1118 -# - -BnetServer.Port = 1118 - -# -################################################################################################### |