summaryrefslogtreecommitdiff
path: root/includes/Socket.h
diff options
context:
space:
mode:
authorNicolas Noble <nnoble@blizzard.com>2013-07-16 11:14:34 -0700
committerNicolas Noble <nnoble@blizzard.com>2013-07-16 11:14:34 -0700
commitf8dbc120c055fb61fa79f901cc2974d049d04f4f (patch)
tree65241936fe02d4041e82508bfbd5f45d84523eb3 /includes/Socket.h
parentd35f4eb97c77438af67466be97516aef76bee9f0 (diff)
Split the Socket class into Selectable, in order to let it work with other non-socket file descriptors.
Diffstat (limited to 'includes/Socket.h')
-rw-r--r--includes/Socket.h24
1 files changed, 5 insertions, 19 deletions
diff --git a/includes/Socket.h b/includes/Socket.h
index 00dc2b4..cfa8218 100644
--- a/includes/Socket.h
+++ b/includes/Socket.h
@@ -8,6 +8,7 @@
#include <netdb.h>
#endif
#include <Handle.h>
+#include <Selectable.h>
#include <TaskMan.h>
#include <Task.h>
#include <StacklessTask.h>
@@ -17,47 +18,32 @@ namespace Balau {
struct DNSRequest;
-class Socket : public Handle {
+class Socket : public Selectable {
public:
Socket() throw (GeneralException);
- virtual void close() throw (GeneralException);
virtual ssize_t read(void * buf, size_t count) throw (GeneralException);
virtual ssize_t write(const void * buf, size_t count) throw (GeneralException);
- virtual bool isClosed();
- virtual bool isEOF();
+ virtual void close() throw (GeneralException);
virtual bool canRead();
virtual bool canWrite();
virtual const char * getName();
bool setLocal(const char * hostname = NULL, int port = 0);
bool connect(const char * hostname, int port);
- bool gotR() { return m_evtR->gotSignal(); }
- bool gotW() { return m_evtW->gotSignal(); }
IO<Socket> accept() throw (GeneralException);
bool listen();
bool resolved();
private:
Socket(int fd);
- class SocketEvent : public Events::BaseEvent {
- public:
- SocketEvent(int fd, int evt = ev::READ | ev::WRITE) : m_task(NULL) { Printer::elog(E_SOCKET, "Got a new SocketEvent at %p", this); m_evt.set<SocketEvent, &SocketEvent::evt_cb>(this); m_evt.set(fd, evt); }
- virtual ~SocketEvent() { Printer::elog(E_SOCKET, "Destroying a SocketEvent at %p", this); m_evt.stop(); }
- void stop() { Printer::elog(E_SOCKET, "Stopping a SocketEvent at %p", this); reset(); m_evt.stop(); }
- private:
- void evt_cb(ev::io & w, int revents) { Printer::elog(E_SOCKET, "Got a libev callback on a SocketEvent at %p", this); doSignal(); }
- virtual void gotOwner(Task * task);
- ev::io m_evt;
- Task * m_task = NULL;
- };
+ virtual ssize_t recv(int sockfd, void *buf, size_t len, int flags);
+ virtual ssize_t send(int sockfd, const void *buf, size_t len, int flags);
- int m_fd;
String m_name;
bool m_connected = false;
bool m_connecting = false;
bool m_listening = false;
sockaddr_in6 m_localAddr, m_remoteAddr;
- SocketEvent * m_evtR, * m_evtW;
DNSRequest * m_req = NULL;
};