From 4b0778537ea5f1c4d7592639208e7c235abab260 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Thu, 12 Jun 2008 19:17:28 +0200 Subject: Recieve-Funktion hinzugef?gt (ungetestet) --- src/Net/Connection.cpp | 69 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 63 insertions(+), 6 deletions(-) (limited to 'src/Net/Connection.cpp') diff --git a/src/Net/Connection.cpp b/src/Net/Connection.cpp index 34b6ed6..bc38ed2 100644 --- a/src/Net/Connection.cpp +++ b/src/Net/Connection.cpp @@ -36,17 +36,74 @@ bool Connection::send(const Packet &packet) { if(ret < 0) { if(ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN) continue; - else - return false; - } - else { - data += ret; - dataLength -= ret; + + return false; } + + data += ret; + dataLength -= ret; } return true; } +bool Connection::recieve() { + unsigned char *headerData = reinterpret_cast(&header); + ssize_t ret; + + if(!isConnected()) + return false; + + while(true) { + if(!gnutls_record_check_pending(getSession())) + return false; + + if(read < sizeof(Packet::Data)) { + ret = gnutls_record_recv(getSession(), headerData+read, sizeof(Packet::Data)-read); + + if(ret < 0) { + if(ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN) + continue; + + return false; + } + + read += ret; + + if(read < sizeof(Packet::Data)) + continue; + + if(!header.length) { + Packet packet(header.type, header.requestId); + + return true; + } + + data = new unsigned char[header.length]; + } + + ret = gnutls_record_recv(getSession(), data+read-sizeof(Packet::Data), header.length+sizeof(Packet::Data)-read); + + if(ret < 0) { + if(ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN) + continue; + + return false; + } + + read += ret; + + if(read < header.length+sizeof(Packet::Data)) + continue; + + Packet packet(header.type, header.requestId, data, header.length); + + delete [] data; + data = 0; + + return true; + } +} + } } -- cgit v1.2.3