diff options
author | Matthias Schiffer <matthias@gamezock.de> | 2008-06-25 03:16:01 +0200 |
---|---|---|
committer | Matthias Schiffer <matthias@gamezock.de> | 2008-06-25 03:16:01 +0200 |
commit | 725ed2a06c5e376168dc1552d52cf0b77ed5c073 (patch) | |
tree | 006605126f7089956405ef203c9ea3800e3f5f28 /src/Net/Connection.cpp | |
parent | c97168bd5113fe726de42a4249df58c679e42240 (diff) | |
download | mad-725ed2a06c5e376168dc1552d52cf0b77ed5c073.tar mad-725ed2a06c5e376168dc1552d52cf0b77ed5c073.zip |
Neuer Send-Stack
Diffstat (limited to 'src/Net/Connection.cpp')
-rw-r--r-- | src/Net/Connection.cpp | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/src/Net/Connection.cpp b/src/Net/Connection.cpp index 768d827..b0f505b 100644 --- a/src/Net/Connection.cpp +++ b/src/Net/Connection.cpp @@ -18,6 +18,7 @@ */ #include "Connection.h" +#include <cstring> namespace Mad { namespace Net { @@ -94,23 +95,38 @@ bool Connection::rawReceive(unsigned long length, return true; } -bool Connection::rawSend(const unsigned char *data, unsigned long length) { +void Connection::doSend() { if(!isConnected()) - return false; + return; - while(length > 0) { - ssize_t ret = gnutls_record_send(getSession(), data, length); + while(!sendQueueEmpty()) { + ssize_t ret = gnutls_record_send(getSession(), transS.front().data+transS.front().transmitted, + transS.front().length-transS.front().transmitted); if(ret < 0) { if(ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN) - continue; + return; - return false; + // Error... disconnect? + return; } - data += ret; - length -= ret; + transS.front().transmitted += ret; + + if(transS.front().transmitted == transS.front().length) { + delete [] transS.front().data; + transS.pop(); + } } +} + +bool Connection::rawSend(const unsigned char *data, unsigned long length) { + if(!isConnected()) + return false; + + Transmission trans = {length, 0, new unsigned char[length], sigc::slot<void,const void*,unsigned long>()}; + std::memcpy(trans.data, data, length); + transS.push(trans); return true; } |