summaryrefslogtreecommitdiffstats
path: root/src/Net/Connection.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Net/Connection.h')
-rw-r--r--src/Net/Connection.h50
1 files changed, 42 insertions, 8 deletions
diff --git a/src/Net/Connection.h b/src/Net/Connection.h
index 063ffb7..7e73955 100644
--- a/src/Net/Connection.h
+++ b/src/Net/Connection.h
@@ -20,6 +20,7 @@
#ifndef MAD_NET_CONNECTION_H_
#define MAD_NET_CONNECTION_H_
+#include <queue>
#include <gnutls/gnutls.h>
#include <sigc++/signal.h>
#include "Packet.h"
@@ -32,27 +33,60 @@ class Packet;
class Connection {
private:
- Packet::Data header;
- unsigned char *data;
+ struct Transmission {
+ unsigned long length;
+ unsigned long transmitted;
+
+ unsigned char *data;
+
+ sigc::slot<void,const void*,unsigned long> notify;
+ };
+
+ Transmission transR;
- unsigned long read;
+ Packet::Data header;
sigc::signal<void,const Connection*,const Packet&> signal;
+ void packetHeaderReceiveHandler(const void *data, unsigned long length);
+ void packetDataReceiveHandler(const void *data, unsigned long length);
+
+ void doReceive();
+
+ bool receiveComplete() const {
+ return (transR.length == transR.transmitted);
+ }
+
protected:
virtual gnutls_session_t& getSession() = 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() {
+ return rawReceive(sizeof(Packet::Data), sigc::mem_fun(this, &Connection::packetHeaderReceiveHandler));
+ }
+
public:
- Connection() : data(0), read(0) {}
- virtual ~Connection() {if(data) delete [] data;}
+ Connection() {
+ transR.length = transR.transmitted = 0;
+ }
+
+ virtual ~Connection() {}
virtual bool isConnected() const = 0;
virtual const IPAddress* getPeer() const = 0;
- virtual bool dataPending() = 0;
+ virtual bool dataPending() const = 0;
- bool send(const Packet &packet);
- bool receive();
+ bool send(const Packet &packet) {
+ return rawSend(reinterpret_cast<const unsigned char*>(packet.getRawData()), packet.getRawDataLength());
+ }
+
+ void sendreceive() {
+ doReceive();
+ }
sigc::signal<void,const Connection*,const Packet&> signalReceive() const {return signal;}