From: Christian P. <cp...@us...> - 2005-02-07 18:47:24
|
Update of /cvsroot/pclasses/pclasses2/src/Net In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20255/src/Net Modified Files: Socket.cpp Log Message: Added SocketListener. Index: Socket.cpp =================================================================== RCS file: /cvsroot/pclasses/pclasses2/src/Net/Socket.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- Socket.cpp 26 Jan 2005 10:23:17 -0000 1.7 +++ Socket.cpp 7 Feb 2005 18:47:13 -0000 1.8 @@ -39,6 +39,10 @@ # include <netipx/ipx.h> #endif +#ifndef WIN32 +# include "../System/FdListener.h" +#endif + namespace P { using namespace Private; @@ -490,6 +494,11 @@ { } +StreamSocket::StreamSocket(Domain d, int proto) throw(IO::IOError) +: Socket(d, Socket::Stream, proto) +{ +} + StreamSocket::StreamSocket(StreamSocketServer& srv) throw(IO::IOError) : Socket() { @@ -500,6 +509,11 @@ { } +void StreamSocket::open(Domain d, int proto) throw(IO::IOError) +{ + Socket::open(d, Socket::Stream, proto); +} + void StreamSocket::open(StreamSocketServer& srv) throw(IO::IOError) { Socket::open(srv.accept(), srv.domain(), srv.type(), srv.protocol()); @@ -573,6 +587,127 @@ return d; } +enum SocketEvent { + SocketEventRead = 0, + SocketEventWrite = 1, + SocketEventError = 2 +}; + +// The SocketFdListener posts Event's occuring on the file-descriptor +// to the EventQueue that has been given to SocketListener. +class SocketFdListener: public System::FdListener { + public: + SocketFdListener(SocketListener* listener, int fd, int flags) + : System::FdListener(fd, flags), _listener(listener) + { + System::FdListenerThread& thr = System::FdListenerThread::instance(); + thr.addListener(this); + } + + ~SocketFdListener() + { + System::FdListenerThread& thr = System::FdListenerThread::instance(); + thr.removeListener(this); + } + + void onRead() + { + _listener->eventQueue().post( + System::Event(_listener->sender(), SocketEventRead)); + } + + void onWrite() + { + _listener->eventQueue().post( + System::Event(_listener->sender(), SocketEventWrite)); + } + + void onError() + { + _listener->eventQueue().post( + System::Event(_listener->sender(), SocketEventError)); + } + + private: + SocketListener* _listener; +}; + + + +SocketListener::SocketListener(Socket& s) +: EventListener(&s) +{ + using System::FdListener; + + _handle = (unsigned long)new SocketFdListener(this, s.handle(), + FdListener::Read|FdListener::Write|FdListener::Error); +} + +SocketListener::SocketListener(System::EventQueue& evq, Socket& s) +: EventListener(evq, &s) +{ + using System::FdListener; + + _handle = (unsigned long)new SocketFdListener(this, s.handle(), + FdListener::Read|FdListener::Write|FdListener::Error); +} + +SocketListener::~SocketListener() +{ + delete (SocketFdListener*)_handle; +} + +Socket& SocketListener::socket() const throw() +{ + return *((Socket*)sender()); +} + +void SocketListener::setEventMask(int mask) +{ + ((SocketFdListener*)_handle)->setFlags(mask); + + // Wakeup the thread so it can get the new event flags ... + System::FdListenerThread& thr = System::FdListenerThread::instance(); + thr.wakeup(); +} + +int SocketListener::eventMask() const throw() +{ + return ((SocketFdListener*)_handle)->flags(); +} + +void SocketListener::signaled(const System::Event& ev) +{ + switch(ev.id()) + { + case SocketEventRead: + onRead(); + sigRead.fire(*this); + break; + case SocketEventWrite: + onWrite(); + sigWrite.fire(*this); + break; + case SocketEventError: + onError(); + sigError.fire(*this); + break; + } +} + +void SocketListener::onRead() +{ +} + +void SocketListener::onWrite() +{ +} + +void SocketListener::onError() +{ +} + + } // !namespace Net } // !namespace P |