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
|