adchpp-docker/src/adchpp/SocketManager.h

134 lines
4.4 KiB
C++

/*
* 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 <boost/asio/io_service.hpp>
#include <boost/asio/deadline_timer.hpp>
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<void()> 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<void (const ManagedSocketPtr&)> 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<boost::asio::io_service::work> work;
SocketStats stats;
ServerInfoList servers;
std::vector<SocketFactoryPtr> 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<boost::asio::deadline_timer> 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