summaryrefslogtreecommitdiffstats
path: root/src/Net/Connection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Net/Connection.cpp')
-rw-r--r--src/Net/Connection.cpp37
1 files changed, 28 insertions, 9 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;
}