/* */ #include "DefaultBtMessageReceiver.h" #include "BtHandshakeMessage.h" #include "message.h" BtMessageHandle DefaultBtMessageReceiver::receiveHandshake(bool quickReply) { unsigned char data[BtHandshakeMessage::MESSAGE_LENGTH]; int32_t dataLength = BtHandshakeMessage::MESSAGE_LENGTH; bool retval = peerConnection->receiveHandshake(data, dataLength); // To handle tracker's NAT-checking feature if(!handshakeSent && quickReply && dataLength >= 48) { handshakeSent = true; // check info_hash if(memcmp(btContext->getInfoHash(), &data[28], INFO_HASH_LENGTH) == 0) { sendHandshake(); } } if(!retval) { return 0; } BtHandshakeMessageHandle msg = messageFactory->createHandshakeMessage(data, dataLength); Errors errors; msg->validate(errors); return msg; } BtMessageHandle DefaultBtMessageReceiver::receiveAndSendHandshake() { return receiveHandshake(true); } void DefaultBtMessageReceiver::sendHandshake() { BtHandshakeMessageHandle msg = messageFactory->createHandshakeMessage(btContext->getInfoHash(), btContext->getPeerId()); dispatcher->addMessageToQueue(msg); dispatcher->sendMessages(); } BtMessageHandle DefaultBtMessageReceiver::receiveMessage() { unsigned char data[MAX_PAYLOAD_LEN]; int32_t dataLength = 0; if(!peerConnection->receiveMessage(data, dataLength)) { return 0; } BtMessageHandle msg = messageFactory->createBtMessage(data, dataLength); Errors errors; if(msg->validate(errors)) { return msg; } else { // TODO throw exception here based on errors; return 0; } }