From ee5c5c9f65556b542ab81942e5a024ba84173762 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 28 Jun 2008 15:20:04 +0200 Subject: Einige Bugs in der Trennung beseitigt. --- src/Net/Connection.h | 92 ++++++++++++++++++++++++++-------------------------- 1 file changed, 46 insertions(+), 46 deletions(-) (limited to 'src/Net/Connection.h') diff --git a/src/Net/Connection.h b/src/Net/Connection.h index 01926e1..0949ec4 100644 --- a/src/Net/Connection.h +++ b/src/Net/Connection.h @@ -37,152 +37,152 @@ class Connection { struct Transmission { unsigned long length; unsigned long transmitted; - + unsigned char *data; - + sigc::slot notify; }; - + enum State { DISCONNECTED, HANDSHAKE, CONNECTION_HEADER, PACKET_HEADER, PACKET_DATA, DISCONNECT, BYE } state; - + Transmission transR; std::queue transS; - + Packet::Data header; - + sigc::signal signal; - + void doHandshake(); - + void packetHeaderReceiveHandler(const void *data, unsigned long length); void packetDataReceiveHandler(const void *data, unsigned long length); - + void doReceive(); void doSend(); - + void doBye(); - + void doDisconnect(); - + bool receiveComplete() const { return (transR.length == transR.transmitted); } - + void bye() { if(state != DISCONNECT) return; - + state = BYE; - + doBye(); } - + // Prevent shallow copy Connection(const Connection &o); Connection& operator=(const Connection &o); - + protected: struct ConnectionHeader { unsigned char m; unsigned char a; unsigned char d; unsigned char type; - + unsigned char versionMajor; unsigned char versionMinor; unsigned char protVerMin; unsigned char protVerMax; }; - + int sock; gnutls_session_t session; - + IPAddress *peer; - + void handshake() { if(isConnected()) return; - + state = HANDSHAKE; - + doHandshake(); } - + virtual void connectionHeader() = 0; - + bool rawReceive(unsigned long length, const sigc::slot ¬ify); bool rawSend(const unsigned char *data, unsigned long length); - + bool enterReceiveLoop() { if(!isConnected() || isDisconnecting()) return false; - + state = PACKET_HEADER; - + return rawReceive(sizeof(Packet::Data), sigc::mem_fun(this, &Connection::packetHeaderReceiveHandler)); } - + public: Connection() : state(DISCONNECTED), peer(0) { transR.length = transR.transmitted = 0; transR.data = 0; } - + virtual ~Connection() { if(isConnected()) doDisconnect(); - + if(transR.data) delete [] transR.data; - + while(!sendQueueEmpty()) { delete [] transS.front().data; transS.pop(); } } - + bool isConnected() const {return (state != DISCONNECTED);} bool isConnecting() const { return (state == HANDSHAKE || state == CONNECTION_HEADER); } - + bool isDisconnecting() const { return (state == DISCONNECT || state == BYE); } - + const IPAddress* getPeer() {return peer;} int getSocket() const {return sock;} - + void disconnect() { if(isConnected() && !isDisconnecting()) { state = DISCONNECT; - + if(sendQueueEmpty()) - doDisconnect(); + bye(); } } - + struct pollfd getPollfd() const; - + bool send(const Packet &packet) { if(!isConnected() || isConnecting() || isDisconnecting()) return false; - + return rawSend(reinterpret_cast(packet.getRawData()), packet.getRawDataLength()); } - + void sendReceive(short events = POLLIN|POLLOUT); - + bool sendQueueEmpty() const {return transS.empty();} - + sigc::signal signalReceive() const {return signal;} - + static void init() { gnutls_global_init(); } - + static void deinit() { gnutls_global_deinit(); } -- cgit v1.2.3