summaryrefslogtreecommitdiffstats
path: root/src/Net
diff options
context:
space:
mode:
authorMatthias Schiffer <matthias@gamezock.de>2008-06-27 03:19:56 +0200
committerMatthias Schiffer <matthias@gamezock.de>2008-06-27 03:19:56 +0200
commitf5377412a89b2a7f422decd771dc8de49a5498fc (patch)
treebda661debda3c324189240f3a68cca7a9f4e316b /src/Net
parentea9fe3ef923000a7bfa4d7afc306669d5442e0fc (diff)
downloadmad-f5377412a89b2a7f422decd771dc8de49a5498fc.tar
mad-f5377412a89b2a7f422decd771dc8de49a5498fc.zip
Einfaches Polling implementiert
Diffstat (limited to 'src/Net')
-rw-r--r--src/Net/Connection.cpp37
-rw-r--r--src/Net/Connection.h17
2 files changed, 43 insertions, 11 deletions
diff --git a/src/Net/Connection.cpp b/src/Net/Connection.cpp
index 4e3fee4..19e7bf1 100644
--- a/src/Net/Connection.cpp
+++ b/src/Net/Connection.cpp
@@ -25,15 +25,17 @@
namespace Mad {
namespace Net {
-void Connection::handshake() {
- state = HANDSHAKE;
+void Connection::doHandshake() {
+ if(state != HANDSHAKE)
+ return;
int ret = gnutls_handshake(session);
if(ret < 0) {
if(ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN)
return;
- // Error... disconnect
+ // TODO: Error
+ disconnect();
return;
}
@@ -42,8 +44,14 @@ void Connection::handshake() {
}
void Connection::packetHeaderReceiveHandler(const void *data, unsigned long length) {
- if(length != sizeof(Packet::Data))
- return; // Error... disconnect?
+ if(state != PACKET_HEADER)
+ return;
+
+ if(length != sizeof(Packet::Data)) {
+ // TODO: Error
+ disconnect();
+ return;
+ }
header = *reinterpret_cast<const Packet::Data*>(data);
@@ -59,8 +67,14 @@ void Connection::packetHeaderReceiveHandler(const void *data, unsigned long leng
}
void Connection::packetDataReceiveHandler(const void *data, unsigned long length) {
- if(length != header.length)
- return; // Error... disconnect?
+ if(state != PACKET_DATA)
+ return;
+
+ if(length != header.length) {
+ // TODO: Error
+ disconnect();
+ return;
+ }
signal(this, Packet(header.type, header.requestId, data, length));
@@ -80,7 +94,8 @@ void Connection::doReceive() {
if(ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN)
return;
- // Error... disconnect?
+ // TODO: Error
+ disconnect();
return;
}
@@ -126,7 +141,8 @@ void Connection::doSend() {
if(ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN)
return;
- // Error... disconnect?
+ // TODO: Error
+ disconnect();
return;
}
@@ -171,6 +187,9 @@ void Connection::disconnect() {
struct pollfd Connection::getPollfd() const {
struct pollfd fd = {sock, (receiveComplete() ? 0 : POLLIN) | (sendQueueEmpty() ? 0 : POLLOUT), 0};
+ if(state == HANDSHAKE)
+ fd.events = ((gnutls_record_get_direction(session) == 0) ? POLLIN : POLLOUT);
+
return fd;
}
diff --git a/src/Net/Connection.h b/src/Net/Connection.h
index 0880036..e147ad2 100644
--- a/src/Net/Connection.h
+++ b/src/Net/Connection.h
@@ -54,6 +54,8 @@ class Connection {
sigc::signal<void,const Connection*,const Packet&> signal;
+ void doHandshake();
+
void packetHeaderReceiveHandler(const void *data, unsigned long length);
void packetDataReceiveHandler(const void *data, unsigned long length);
@@ -86,13 +88,24 @@ class Connection {
IPAddress *peer;
- void handshake();
+ void handshake() {
+ if(isConnected())
+ return;
+
+ state = HANDSHAKE;
+
+ doHandshake();
+ }
+
virtual void connectionHeader() = 0;
bool rawReceive(unsigned long length, const sigc::slot<void,const void*,unsigned long> &notify);
bool rawSend(const unsigned char *data, unsigned long length);
bool enterReceiveLoop() {
+ if(!isConnected())
+ return false;
+
state = PACKET_HEADER;
return rawReceive(sizeof(Packet::Data), sigc::mem_fun(this, &Connection::packetHeaderReceiveHandler));
@@ -137,7 +150,7 @@ class Connection {
void sendReceive() {
if(state == HANDSHAKE) {
- handshake();
+ doHandshake();
return;
}