/* * Copyright (C) 2006-2016 Jacek Sieka, arnetheduck on gmail point com * * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef ADCHPP_SOCKETMANAGER_H #define ADCHPP_SOCKETMANAGER_H #include "common.h" #include "forward.h" #include "ServerInfo.h" #include #include namespace adchpp { struct SocketStats { SocketStats() : queueCalls(0), queueBytes(0), sendCalls(0), sendBytes(0), recvCalls(0), recvBytes(0) { } size_t queueCalls; int64_t queueBytes; size_t sendCalls; int64_t sendBytes; int64_t recvCalls; int64_t recvBytes; }; class SocketManager { public: typedef std::function Callback; /** execute a function asynchronously */ ADCHPP_DLL void addJob(const Callback& callback) throw(); /** execute a function after the specified amount of time * @param msec milliseconds */ ADCHPP_DLL void addJob(const long msec, const Callback& callback); /** execute a function after the specified amount of time * @param time a string that obeys to the "[-]h[h][:mm][:ss][.fff]" format */ ADCHPP_DLL void addJob(const std::string& time, const Callback& callback); /** execute a function at regular intervals * @param msec milliseconds * @return function one must call to cancel the timer (its callback will still be executed) */ ADCHPP_DLL Callback addTimedJob(const long msec, const Callback& callback); /** execute a function at regular intervals * @param time a string that obeys to the "[-]h[h][:mm][:ss][.fff]" format * @return function one must call to cancel the timer (its callback will still be executed) */ ADCHPP_DLL Callback addTimedJob(const std::string& time, const Callback& callback); void shutdown(); void setServers(const ServerInfoList& servers_) { servers = servers_; } typedef std::function IncomingHandler; void setIncomingHandler(const IncomingHandler& handler) { incomingHandler = handler; } int run(); void setBufferSize(size_t newSize) { bufferSize = newSize; } size_t getBufferSize() const { return bufferSize; } void setMaxBufferSize(size_t newSize) { maxBufferSize = newSize; } size_t getMaxBufferSize() const { return maxBufferSize; } void setOverflowTimeout(size_t timeout) { overflowTimeout = timeout; } size_t getOverflowTimeout() const { return overflowTimeout; } void setDisconnectTimeout(size_t timeout) { disconnectTimeout = timeout; } size_t getDisconnectTimeout() const { return disconnectTimeout; } SocketStats &getStats() { return stats; } Core &getCore() { return core; } private: friend class Core; friend class ManagedSocket; friend class SocketFactory; void closeFactories(); Core &core; boost::asio::io_service io; std::unique_ptr work; SocketStats stats; ServerInfoList servers; std::vector factories; IncomingHandler incomingHandler; size_t bufferSize; /// Default buffer size used for SO_RCVBUF/SO_SNDBUF size_t maxBufferSize; /// Max allowed write buffer size for each socket size_t overflowTimeout; size_t disconnectTimeout; static const std::string className; typedef shared_ptr timer_ptr; void addJob(const boost::asio::deadline_timer::duration_type& duration, const Callback& callback); Callback addTimedJob(const boost::asio::deadline_timer::duration_type& duration, const Callback& callback); void setTimer(timer_ptr timer, const boost::asio::deadline_timer::duration_type& duration, Callback* callback); void handleWait(timer_ptr timer, const boost::asio::deadline_timer::duration_type& duration, const boost::system::error_code& error, Callback* callback); void cancelTimer(timer_ptr timer, Callback* callback); void onLoad(const SimpleXML& xml) throw(); SocketManager(Core &core); }; } #endif // SOCKETMANAGER_H