summaryrefslogtreecommitdiffstats
path: root/src/Net/Connection.h
diff options
context:
space:
mode:
authorMatthias Schiffer <matthias@gamezock.de>2008-06-28 15:20:04 +0200
committerMatthias Schiffer <matthias@gamezock.de>2008-06-28 15:20:04 +0200
commitee5c5c9f65556b542ab81942e5a024ba84173762 (patch)
tree0777270d017dbe986a310e1b33b9b9ebac185634 /src/Net/Connection.h
parentc0bd49f419b0850085d651a4ceeca45cf9d09832 (diff)
downloadmad-ee5c5c9f65556b542ab81942e5a024ba84173762.tar
mad-ee5c5c9f65556b542ab81942e5a024ba84173762.zip
Einige Bugs in der Trennung beseitigt.
Diffstat (limited to 'src/Net/Connection.h')
-rw-r--r--src/Net/Connection.h92
1 files changed, 46 insertions, 46 deletions
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<void,const void*,unsigned long> notify;
};
-
+
enum State {
DISCONNECTED, HANDSHAKE, CONNECTION_HEADER, PACKET_HEADER, PACKET_DATA, DISCONNECT, BYE
} state;
-
+
Transmission transR;
std::queue<Transmission> transS;
-
+
Packet::Data header;
-
+
sigc::signal<void,Connection*,const Packet&> 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<void,const void*,unsigned long> &notify);
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<const unsigned char*>(packet.getRawData()), packet.getRawDataLength());
}
-
+
void sendReceive(short events = POLLIN|POLLOUT);
-
+
bool sendQueueEmpty() const {return transS.empty();}
-
+
sigc::signal<void,Connection*,const Packet&> signalReceive() const {return signal;}
-
+
static void init() {
gnutls_global_init();
}
-
+
static void deinit() {
gnutls_global_deinit();
}