X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Finspsocket.h;h=8c93f884e837dfeb7d3d36809ef6e710aeb87223;hb=612384b3d46d06eea6fd71ee6dc60471d0f9e3d1;hp=71c2a06d92adec37bc138d268299de2b438511d5;hpb=d383ce9b72bf5c58bb0571998b282cf67cf7635c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/inspsocket.h b/include/inspsocket.h index 71c2a06d9..8c93f884e 100644 --- a/include/inspsocket.h +++ b/include/inspsocket.h @@ -1,21 +1,32 @@ -/* +------------------------------------+ - * | Inspire Internet Relay Chat Daemon | - * +------------------------------------+ +/* + * InspIRCd -- Internet Relay Chat Daemon * - * InspIRCd: (C) 2002-2010 InspIRCd Development Team - * See: http://wiki.inspircd.org/Credits + * Copyright (C) 2009 Daniel De Graaf + * Copyright (C) 2007-2008 Robin Burchell + * Copyright (C) 2007 Dennis Friis + * Copyright (C) 2006-2007 Craig Edwards + * Copyright (C) 2006 Oliver Lupton * - * This program is free but copyrighted software; see - * the file COPYING for details. + * This file is part of InspIRCd. InspIRCd 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, version 2. * - * --------------------------------------------------- + * 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 . */ -#ifndef INSPSOCKET_H -#define INSPSOCKET_H + +#pragma once #include "timer.h" +class IOHook; + /** * States which a socket may be in */ @@ -75,16 +86,15 @@ class CoreExport SocketTimeout : public Timer public: /** Create a socket timeout class * @param fd File descriptor of BufferedSocket - * @pram Instance server instance to attach to * @param thesock BufferedSocket to attach to * @param secs_from_now Seconds from now to time out * @param now The current time */ - SocketTimeout(int fd, BufferedSocket* thesock, long secs_from_now, time_t now) : Timer(secs_from_now, now), sock(thesock), sfd(fd) { } + SocketTimeout(int fd, BufferedSocket* thesock, long secs_from_now) : Timer(secs_from_now), sock(thesock), sfd(fd) { } /** Handle tick event */ - virtual void Tick(time_t now); + virtual bool Tick(time_t now); }; /** @@ -93,8 +103,9 @@ class CoreExport SocketTimeout : public Timer */ class CoreExport StreamSocket : public EventHandler { - /** Module that handles raw I/O for this socket, or NULL */ - reference IOHook; + /** The IOHook that handles raw I/O for this socket, or NULL */ + IOHook* iohook; + /** Private send queue. Note that individual strings may be shared */ std::deque sendq; @@ -102,22 +113,37 @@ class CoreExport StreamSocket : public EventHandler size_t sendq_len; /** Error - if nonempty, the socket is dead, and this is the reason. */ std::string error; + + /** Check if the socket has an error set, if yes, call OnError + * @param err Error to pass to OnError() + */ + void CheckError(BufferedSocketError err); + protected: std::string recvq; public: - StreamSocket() : sendq_len(0) {} - inline Module* GetIOHook(); - inline void AddIOHook(Module* m); - inline void DelIOHook(); - /** Handle event from socket engine. - * This will call OnDataReady if there is *new* data in recvq - */ - virtual void HandleEvent(EventType et, int errornum = 0); + StreamSocket() : iohook(NULL), sendq_len(0) {} + IOHook* GetIOHook() const; + void AddIOHook(IOHook* hook); + void DelIOHook(); /** Dispatched from HandleEvent */ virtual void DoRead(); /** Dispatched from HandleEvent */ virtual void DoWrite(); + /** Called by the socket engine on a read event + */ + void OnEventHandlerRead() CXX11_OVERRIDE; + + /** Called by the socket engine on a write event + */ + void OnEventHandlerWrite() CXX11_OVERRIDE; + + /** Called by the socket engine on error + * @param errcode Error + */ + void OnEventHandlerError(int errcode) CXX11_OVERRIDE; + /** Sets the error message for this socket. Once set, the socket is dead. */ void SetError(const std::string& err) { if (error.empty()) error = err; } @@ -139,7 +165,7 @@ class CoreExport StreamSocket : public EventHandler */ bool GetNextLine(std::string& line, char delim = '\n'); /** Useful for implementing sendq exceeded */ - inline const size_t getSendQSize() const { return sendq_len; } + inline size_t getSendQSize() const { return sendq_len; } /** * Close the socket, remove from socket engine, etc @@ -185,9 +211,10 @@ class CoreExport BufferedSocket : public StreamSocket * This will create a socket, register with socket engine, and start the asynchronous * connection process. If an error is detected at this point (such as out of file descriptors), * OnError will be called; otherwise, the state will become CONNECTING. - * @param dest Address to connect to - * @param bind Address to bind to (if NULL, no bind will be done) - * @param timeout Time to wait for connection + * @param ipaddr Address to connect to + * @param aport Port to connect on + * @param maxtime Time to wait for connection + * @param connectbindip Address to bind to (if NULL, no bind will be done) */ void DoConnect(const std::string &ipaddr, int aport, unsigned long maxtime, const std::string &connectbindip); @@ -214,14 +241,11 @@ class CoreExport BufferedSocket : public StreamSocket virtual ~BufferedSocket(); protected: - virtual void DoWrite(); + void OnEventHandlerWrite() CXX11_OVERRIDE; BufferedSocketError BeginConnect(const irc::sockets::sockaddrs& dest, const irc::sockets::sockaddrs& bind, unsigned long timeout); BufferedSocketError BeginConnect(const std::string &ipaddr, int aport, unsigned long maxtime, const std::string &connectbindip); }; -#include "modules.h" - -inline Module* StreamSocket::GetIOHook() { return IOHook; } -inline void StreamSocket::AddIOHook(Module* m) { IOHook = m; } -inline void StreamSocket::DelIOHook() { IOHook = NULL; } -#endif +inline IOHook* StreamSocket::GetIOHook() const { return iohook; } +inline void StreamSocket::AddIOHook(IOHook* hook) { iohook = hook; } +inline void StreamSocket::DelIOHook() { iohook = NULL; }