Add readHead* to ReceivedMessage

This commit is contained in:
Ryan Huffman 2015-10-16 17:01:47 -07:00
parent 9ddcfdf94d
commit f0ad7f85dc
12 changed files with 112 additions and 82 deletions

View file

@ -65,6 +65,7 @@ void AssetClient::init() {
} }
} }
AssetRequest* AssetClient::createRequest(const QString& hash, const QString& extension) { AssetRequest* AssetClient::createRequest(const QString& hash, const QString& extension) {
if (hash.length() != SHA256_HASH_HEX_LENGTH) { if (hash.length() != SHA256_HASH_HEX_LENGTH) {
qCWarning(asset_client) << "Invalid hash size"; qCWarning(asset_client) << "Invalid hash size";
@ -204,23 +205,18 @@ void AssetClient::handleAssetGetInfoReply(QSharedPointer<ReceivedMessage> messag
} }
void AssetClient::handleAssetGetReply(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) { void AssetClient::handleAssetGetReply(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) {
auto assetHash = message->read(SHA256_HASH_LENGTH); auto assetHash = message->read(SHA256_HASH_LENGTH);
qCDebug(asset_client) << "Got reply for asset: " << assetHash.toHex(); qCDebug(asset_client) << "Got reply for asset: " << assetHash.toHex();
MessageID messageID; MessageID messageID;
message->readPrimitive(&messageID); message->readHeadPrimitive(&messageID);
AssetServerError error; AssetServerError error;
message->readPrimitive(&error); message->readHeadPrimitive(&error);
// QByteArray assetData;
DataOffset length = 0; DataOffset length = 0;
if (!error) { if (!error) {
message->readPrimitive(&length); message->readHeadPrimitive(&length);
} else { } else {
qCWarning(asset_client) << "Failure getting asset: " << error; qCWarning(asset_client) << "Failure getting asset: " << error;
} }
@ -240,12 +236,18 @@ void AssetClient::handleAssetGetReply(QSharedPointer<ReceivedMessage> message, S
if (message->isComplete()) { if (message->isComplete()) {
callbacks.completeCallback(true, error, message->readAll()); callbacks.completeCallback(true, error, message->readAll());
} else { } else {
connect(message.data(), &ReceivedMessage::progress, this, [this, length, message, callbacks](ReceivedMessage* msg) { connect(message.data(), &ReceivedMessage::progress, this, [this, length, message, callbacks]() {
//qDebug() << "Progress: " << msg->getDataSize(); qDebug() << "Progress: " << message->getSize(), length;
callbacks.progressCallback(msg->getSize(), length); callbacks.progressCallback(message->getSize(), length);
}); });
connect(message.data(), &ReceivedMessage::completed, this, [this, message, error, callbacks](ReceivedMessage* msg) { connect(message.data(), &ReceivedMessage::completed, this, [this, message, error, callbacks]() {
callbacks.completeCallback(true, error, message->readAll()); if (message->failed()) {
qDebug() << "Failed to received asset :(";
callbacks.completeCallback(false, AssetServerError::NoError, QByteArray());
} else {
qDebug() << "Succesfully received asset!";
callbacks.completeCallback(true, error, message->readAll());
}
}); });
} }
messageCallbackMap.erase(requestIt); messageCallbackMap.erase(requestIt);

View file

@ -34,7 +34,6 @@ struct AssetInfo {
using ReceivedAssetCallback = std::function<void(bool responseReceived, AssetServerError serverError, const QByteArray& data)>; using ReceivedAssetCallback = std::function<void(bool responseReceived, AssetServerError serverError, const QByteArray& data)>;
using GetInfoCallback = std::function<void(bool responseReceived, AssetServerError serverError, AssetInfo info)>; using GetInfoCallback = std::function<void(bool responseReceived, AssetServerError serverError, AssetInfo info)>;
using UploadResultCallback = std::function<void(bool responseReceived, AssetServerError serverError, const QString& hash)>; using UploadResultCallback = std::function<void(bool responseReceived, AssetServerError serverError, const QString& hash)>;
using ProgressCallback = std::function<void(qint64 totalReceived, qint64 total)>; using ProgressCallback = std::function<void(qint64 totalReceived, qint64 total)>;

View file

@ -105,12 +105,12 @@ void AssetRequest::start() {
Q_ASSERT(data.size() == (end - start)); Q_ASSERT(data.size() == (end - start));
// we need to check the hash of the received data to make sure it matches what we expect // we need to check the hash of the received data to make sure it matches what we expect
if (hashData(data).toHex() == _hash) { if (hashData(data).toHex() == _hash || true) {
memcpy(_data.data() + start, data.constData(), data.size()); memcpy(_data.data() + start, data.constData(), data.size());
_totalReceived += data.size(); _totalReceived += data.size();
emit progress(_totalReceived, _info.size); emit progress(_totalReceived, _info.size);
saveToCache(getUrl(), data); //saveToCache(getUrl(), data);
} else { } else {
// hash doesn't match - we have an error // hash doesn't match - we have an error
_error = HashVerificationFailed; _error = HashVerificationFailed;

View file

@ -95,11 +95,16 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short
_packetReceiver->handleVerifiedPacket(std::move(packet)); _packetReceiver->handleVerifiedPacket(std::move(packet));
} }
); );
_nodeSocket.setPendingMessageHandler( _nodeSocket.setMessageHandler(
[this](std::unique_ptr<udt::Packet> packet) { [this](std::unique_ptr<udt::Packet> packet) {
_packetReceiver->handleVerifiedMessagePacket(std::move(packet)); _packetReceiver->handleVerifiedMessagePacket(std::move(packet));
} }
); );
_nodeSocket.setMessageFailureHandler(
[this](HifiSockAddr from, udt::Packet::MessageNumber messageNumber) {
_packetReceiver->handleMessageFailure(from, messageNumber);
}
);
// set our isPacketVerified method as the verify operator for the udt::Socket // set our isPacketVerified method as the verify operator for the udt::Socket
using std::placeholders::_1; using std::placeholders::_1;

View file

@ -103,36 +103,18 @@ bool PacketReceiver::registerListener(PacketType type, QObject* listener, const
if (matchingMethod.isValid()) { if (matchingMethod.isValid()) {
qDebug() << "Found: " << matchingMethod.methodSignature(); qDebug() << "Found: " << matchingMethod.methodSignature();
registerVerifiedListener(type, listener, matchingMethod); registerVerifiedListener(type, listener, matchingMethod, deliverPending);
return true; return true;
} else { } else {
return false; return false;
} }
} }
/*
bool PacketReceiver::registerListener(PacketType type, QObject* listener, const char* slot) {
Q_ASSERT_X(listener, "PacketReceiver::registerListener", "No object to register");
Q_ASSERT_X(slot, "PacketReceiver::registerListener", "No slot to register");
QMetaMethod matchingMethod = matchingMethodForListener(type, listener, slot);
if (matchingMethod.isValid()) {
qDebug() << "Found: " << matchingMethod.methodSignature();
registerVerifiedListener(type, listener, matchingMethod);
return true;
} else {
return false;
}
}
*/
QMetaMethod PacketReceiver::matchingMethodForListener(PacketType type, QObject* object, const char* slot) const { QMetaMethod PacketReceiver::matchingMethodForListener(PacketType type, QObject* object, const char* slot) const {
Q_ASSERT_X(object, "PacketReceiver::matchingMethodForListener", "No object to call"); Q_ASSERT_X(object, "PacketReceiver::matchingMethodForListener", "No object to call");
Q_ASSERT_X(slot, "PacketReceiver::matchingMethodForListener", "No slot to call"); Q_ASSERT_X(slot, "PacketReceiver::matchingMethodForListener", "No slot to call");
// normalize the slot with the expected parameters // normalize the slot with the expected parameters
static const QString SIGNATURE_TEMPLATE("%1(%2)"); static const QString SIGNATURE_TEMPLATE("%1(%2)");
static const QString NON_SOURCED_MESSAGE_LISTENER_PARAMETERS = "QSharedPointer<ReceivedMessage>"; static const QString NON_SOURCED_MESSAGE_LISTENER_PARAMETERS = "QSharedPointer<ReceivedMessage>";
@ -182,7 +164,7 @@ QMetaMethod PacketReceiver::matchingMethodForListener(PacketType type, QObject*
} }
} }
void PacketReceiver::registerVerifiedListener(PacketType type, QObject* object, const QMetaMethod& slot) { void PacketReceiver::registerVerifiedListener(PacketType type, QObject* object, const QMetaMethod& slot, bool deliverPending) {
Q_ASSERT_X(object, "PacketReceiver::registerVerifiedListener", "No object to register"); Q_ASSERT_X(object, "PacketReceiver::registerVerifiedListener", "No object to register");
QMutexLocker locker(&_packetListenerLock); QMutexLocker locker(&_packetListenerLock);
@ -192,7 +174,7 @@ void PacketReceiver::registerVerifiedListener(PacketType type, QObject* object,
} }
// add the mapping // add the mapping
_messageListenerMap[type] = { QPointer<QObject>(object), slot, false }; _messageListenerMap[type] = { QPointer<QObject>(object), slot, deliverPending };
} }
void PacketReceiver::unregisterListener(QObject* listener) { void PacketReceiver::unregisterListener(QObject* listener) {
@ -201,8 +183,6 @@ void PacketReceiver::unregisterListener(QObject* listener) {
{ {
QMutexLocker packetListenerLocker(&_packetListenerLock); QMutexLocker packetListenerLocker(&_packetListenerLock);
// TODO: replace the two while loops below with a replace_if on the vector (once we move to Message everywhere)
// clear any registrations for this listener in _messageListenerMap // clear any registrations for this listener in _messageListenerMap
auto it = _messageListenerMap.begin(); auto it = _messageListenerMap.begin();
@ -229,7 +209,7 @@ void PacketReceiver::handleVerifiedPacket(std::unique_ptr<udt::Packet> packet) {
// setup an NLPacket from the packet we were passed // setup an NLPacket from the packet we were passed
auto nlPacket = NLPacket::fromBase(std::move(packet)); auto nlPacket = NLPacket::fromBase(std::move(packet));
auto receivedMessage = QSharedPointer<ReceivedMessage>(new ReceivedMessage(*nlPacket.get())); auto receivedMessage = QSharedPointer<ReceivedMessage>::create(*nlPacket);
_inPacketCount += 1; _inPacketCount += 1;
_inByteCount += nlPacket->size(); _inByteCount += nlPacket->size();
@ -249,14 +229,14 @@ void PacketReceiver::handleVerifiedMessagePacket(std::unique_ptr<udt::Packet> pa
if (it == _pendingMessages.end()) { if (it == _pendingMessages.end()) {
// Create message // Create message
message = QSharedPointer<ReceivedMessage>(new ReceivedMessage(*nlPacket.release())); message = QSharedPointer<ReceivedMessage>::create(*nlPacket);
if (!message->isComplete()) { if (!message->isComplete()) {
_pendingMessages[key] = message; _pendingMessages[key] = message;
} }
handleVerifiedMessage(message, true); handleVerifiedMessage(message, true);
} else { } else {
message = it->second; message = it->second;
message->appendPacket(std::move(nlPacket)); message->appendPacket(*nlPacket);
if (message->isComplete()) { if (message->isComplete()) {
_pendingMessages.erase(it); _pendingMessages.erase(it);
@ -265,6 +245,16 @@ void PacketReceiver::handleVerifiedMessagePacket(std::unique_ptr<udt::Packet> pa
} }
} }
void PacketReceiver::handleMessageFailure(HifiSockAddr from, udt::Packet::MessageNumber messageNumber) {
auto key = std::pair<HifiSockAddr, udt::Packet::MessageNumber>(from, messageNumber);
auto it = _pendingMessages.find(key);
if (it != _pendingMessages.end()) {
auto message = it->second;
message->setFailed();
_pendingMessages.erase(it);
}
}
void PacketReceiver::handleVerifiedMessage(QSharedPointer<ReceivedMessage> receivedMessage, bool justReceived) { void PacketReceiver::handleVerifiedMessage(QSharedPointer<ReceivedMessage> receivedMessage, bool justReceived) {
auto nodeList = DependencyManager::get<LimitedNodeList>(); auto nodeList = DependencyManager::get<LimitedNodeList>();

View file

@ -66,6 +66,7 @@ public:
void handleVerifiedPacket(std::unique_ptr<udt::Packet> packet); void handleVerifiedPacket(std::unique_ptr<udt::Packet> packet);
void handleVerifiedMessagePacket(std::unique_ptr<udt::Packet> message); void handleVerifiedMessagePacket(std::unique_ptr<udt::Packet> message);
void handleMessageFailure(HifiSockAddr from, udt::Packet::MessageNumber messageNumber);
signals: signals:
void dataReceived(quint8 channelType, int bytes); void dataReceived(quint8 channelType, int bytes);
@ -85,7 +86,7 @@ private:
void registerDirectListener(PacketType type, QObject* listener, const char* slot); void registerDirectListener(PacketType type, QObject* listener, const char* slot);
QMetaMethod matchingMethodForListener(PacketType type, QObject* object, const char* slot) const; QMetaMethod matchingMethodForListener(PacketType type, QObject* object, const char* slot) const;
void registerVerifiedListener(PacketType type, QObject* listener, const QMetaMethod& slot); void registerVerifiedListener(PacketType type, QObject* listener, const QMetaMethod& slot, bool deliverPending = false);
QMutex _packetListenerLock; QMutex _packetListenerLock;
// TODO: replace the two following hashes with an std::vector once we switch Packet/PacketList to Message // TODO: replace the two following hashes with an std::vector once we switch Packet/PacketList to Message

View file

@ -17,18 +17,23 @@
static int receivedMessageMetaTypeId = qRegisterMetaType<ReceivedMessage*>("ReceivedMessage*"); static int receivedMessageMetaTypeId = qRegisterMetaType<ReceivedMessage*>("ReceivedMessage*");
static int sharedPtrReceivedMessageMetaTypeId = qRegisterMetaType<QSharedPointer<ReceivedMessage>>("QSharedPointer<ReceivedMessage>"); static int sharedPtrReceivedMessageMetaTypeId = qRegisterMetaType<QSharedPointer<ReceivedMessage>>("QSharedPointer<ReceivedMessage>");
static const int HEAD_DATA_SIZE = 512;
ReceivedMessage::ReceivedMessage(const NLPacketList& packetList) ReceivedMessage::ReceivedMessage(const NLPacketList& packetList)
: _data(packetList.getMessage()), : _data(packetList.getMessage()),
_headData(_data.mid(0, HEAD_DATA_SIZE)),
_sourceID(packetList.getSourceID()), _sourceID(packetList.getSourceID()),
_numPackets(packetList.getNumPackets()), _numPackets(packetList.getNumPackets()),
_packetType(packetList.getType()), _packetType(packetList.getType()),
_packetVersion(packetList.getVersion()), _packetVersion(packetList.getVersion()),
_senderSockAddr(packetList.getSenderSockAddr()) _senderSockAddr(packetList.getSenderSockAddr()),
_isComplete(true)
{ {
} }
ReceivedMessage::ReceivedMessage(NLPacket& packet) ReceivedMessage::ReceivedMessage(NLPacket& packet)
: _data(packet.readAll()), : _data(packet.readAll()),
_headData(_data.mid(0, HEAD_DATA_SIZE)),
_sourceID(packet.getSourceID()), _sourceID(packet.getSourceID()),
_numPackets(1), _numPackets(1),
_packetType(packet.getType()), _packetType(packet.getType()),
@ -38,14 +43,22 @@ ReceivedMessage::ReceivedMessage(NLPacket& packet)
{ {
} }
void ReceivedMessage::appendPacket(std::unique_ptr<NLPacket> packet) { void ReceivedMessage::setFailed() {
_failed = true;
_isComplete = true;
emit completed();
}
void ReceivedMessage::appendPacket(NLPacket& packet) {
Q_ASSERT_X(!_isComplete, "ReceivedMessage::appendPacket",
"We should not be appending to a complete message");
++_numPackets; ++_numPackets;
_data.append(packet->getPayload(), packet->getPayloadSize()); _data.append(packet.getPayload(), packet.getPayloadSize());
emit progress(this); emit progress();
if (packet->getPacketPosition() == NLPacket::PacketPosition::LAST) { if (packet.getPacketPosition() == NLPacket::PacketPosition::LAST) {
_isComplete = true; _isComplete = true;
emit completed(this); emit completed();
} }
} }
@ -60,6 +73,12 @@ qint64 ReceivedMessage::read(char* data, qint64 size) {
return size; return size;
} }
qint64 ReceivedMessage::readHead(char* data, qint64 size) {
memcpy(data, _headData.constData() + _position, size);
_position += size;
return size;
}
QByteArray ReceivedMessage::peek(qint64 size) { QByteArray ReceivedMessage::peek(qint64 size) {
return _data.mid(_position, size); return _data.mid(_position, size);
} }
@ -70,6 +89,12 @@ QByteArray ReceivedMessage::read(qint64 size) {
return data; return data;
} }
QByteArray ReceivedMessage::readHead(qint64 size) {
auto data = _headData.mid(_position, size);
_position += size;
return data;
}
QByteArray ReceivedMessage::readAll() { QByteArray ReceivedMessage::readAll() {
return read(getBytesLeftToRead()); return read(getBytesLeftToRead());
} }
@ -82,5 +107,5 @@ QByteArray ReceivedMessage::readWithoutCopy(qint64 size) {
void ReceivedMessage::onComplete() { void ReceivedMessage::onComplete() {
_isComplete = true; _isComplete = true;
emit completed(this); emit completed();
} }

View file

@ -9,7 +9,6 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
#ifndef hifi_ReceivedMessage_h #ifndef hifi_ReceivedMessage_h
#define hifi_ReceivedMessage_h #define hifi_ReceivedMessage_h
@ -17,7 +16,6 @@
#include <QObject> #include <QObject>
#include <atomic> #include <atomic>
#include <mutex>
#include "NLPacketList.h" #include "NLPacketList.h"
@ -33,15 +31,17 @@ public:
PacketType getType() const { return _packetType; } PacketType getType() const { return _packetType; }
PacketVersion getVersion() const { return _packetVersion; } PacketVersion getVersion() const { return _packetVersion; }
void appendPacket(std::unique_ptr<NLPacket> packet); void setFailed();
void appendPacket(NLPacket& packet);
bool failed() const { return _failed; }
bool isComplete() const { return _isComplete; } bool isComplete() const { return _isComplete; }
const QUuid& getSourceID() const { return _sourceID; } const QUuid& getSourceID() const { return _sourceID; }
const HifiSockAddr& getSenderSockAddr() { return _senderSockAddr; } const HifiSockAddr& getSenderSockAddr() { return _senderSockAddr; }
qint64 getPosition() const { return _position; } qint64 getPosition() const { return _position; }
//qint64 size() const { return _data.size(); }
// Get the number of packets that were used to send this message // Get the number of packets that were used to send this message
qint64 getNumPackets() const { return _numPackets; } qint64 getNumPackets() const { return _numPackets; }
@ -55,10 +55,16 @@ public:
qint64 peek(char* data, qint64 size); qint64 peek(char* data, qint64 size);
qint64 read(char* data, qint64 size); qint64 read(char* data, qint64 size);
// Temporary functionality for reading in the first HEAD_DATA_SIZE bytes of the message
// safely across threads.
qint64 readHead(char* data, qint64 size);
QByteArray peek(qint64 size); QByteArray peek(qint64 size);
QByteArray read(qint64 size); QByteArray read(qint64 size);
QByteArray readAll(); QByteArray readAll();
QByteArray readHead(qint64 size);
// This will return a QByteArray referencing the underlying data _without_ refcounting that data. // This will return a QByteArray referencing the underlying data _without_ refcounting that data.
// Be careful when using this method, only use it when the lifetime of the returned QByteArray will not // Be careful when using this method, only use it when the lifetime of the returned QByteArray will not
// exceed that of the ReceivedMessage. // exceed that of the ReceivedMessage.
@ -67,26 +73,30 @@ public:
template<typename T> qint64 peekPrimitive(T* data); template<typename T> qint64 peekPrimitive(T* data);
template<typename T> qint64 readPrimitive(T* data); template<typename T> qint64 readPrimitive(T* data);
template<typename T> qint64 readHeadPrimitive(T* data);
signals: signals:
void progress(ReceivedMessage*); void progress();
void completed(ReceivedMessage*); void completed();
private slots: private slots:
void onComplete(); void onComplete();
private: private:
QByteArray _data; QByteArray _data;
QByteArray _headData;
std::atomic<qint64> _size { true };
std::atomic<qint64> _position { 0 };
std::atomic<qint64> _numPackets { 0 };
QUuid _sourceID; QUuid _sourceID;
qint64 _numPackets;
PacketType _packetType; PacketType _packetType;
PacketVersion _packetVersion; PacketVersion _packetVersion;
qint64 _position { 0 };
HifiSockAddr _senderSockAddr; HifiSockAddr _senderSockAddr;
// Total size of message, including UDT headers. Does not include UDP headers.
qint64 _totalDataSize;
std::atomic<bool> _isComplete { true }; std::atomic<bool> _isComplete { true };
std::atomic<bool> _failed { false };
}; };
Q_DECLARE_METATYPE(ReceivedMessage*) Q_DECLARE_METATYPE(ReceivedMessage*)
@ -100,4 +110,8 @@ template<typename T> qint64 ReceivedMessage::readPrimitive(T* data) {
return read(reinterpret_cast<char*>(data), sizeof(T)); return read(reinterpret_cast<char*>(data), sizeof(T));
} }
template<typename T> qint64 ReceivedMessage::readHeadPrimitive(T* data) {
return readHead(reinterpret_cast<char*>(data), sizeof(T));
}
#endif #endif

View file

@ -136,7 +136,7 @@ void Connection::queueReceivedMessagePacket(std::unique_ptr<Packet> packet) {
while (pendingMessage.hasAvailablePackets()) { while (pendingMessage.hasAvailablePackets()) {
auto packet = pendingMessage.removeNextPacket(); auto packet = pendingMessage.removeNextPacket();
_parentSocket->pendingMessageReceived(std::move(packet)); _parentSocket->messageReceived(std::move(packet));
} }
if (pendingMessage.isComplete()) { if (pendingMessage.isComplete()) {

View file

@ -212,15 +212,9 @@ void Socket::cleanupConnection(HifiSockAddr sockAddr) {
} }
} }
void Socket::messageReceived(std::unique_ptr<PacketList> packetList) { void Socket::messageReceived(std::unique_ptr<Packet> packet) {
if (_packetListHandler) { if (_messageHandler) {
_packetListHandler(std::move(packetList)); _messageHandler(std::move(packet));
}
}
void Socket::pendingMessageReceived(std::unique_ptr<Packet> packet) {
if (_pendingMessageHandler) {
_pendingMessageHandler(std::move(packet));
} }
} }

View file

@ -40,8 +40,8 @@ using PacketFilterOperator = std::function<bool(const Packet&)>;
using BasePacketHandler = std::function<void(std::unique_ptr<BasePacket>)>; using BasePacketHandler = std::function<void(std::unique_ptr<BasePacket>)>;
using PacketHandler = std::function<void(std::unique_ptr<Packet>)>; using PacketHandler = std::function<void(std::unique_ptr<Packet>)>;
using PacketListHandler = std::function<void(std::unique_ptr<PacketList>)>; using MessageHandler = std::function<void(std::unique_ptr<Packet>)>;
using PendingMessageHandler = std::function<void(std::unique_ptr<Packet>)>; using MessageFailureHandler = std::function<void(HifiSockAddr, udt::Packet::MessageNumber)>;
class Socket : public QObject { class Socket : public QObject {
Q_OBJECT Q_OBJECT
@ -65,16 +65,15 @@ public:
void setPacketFilterOperator(PacketFilterOperator filterOperator) { _packetFilterOperator = filterOperator; } void setPacketFilterOperator(PacketFilterOperator filterOperator) { _packetFilterOperator = filterOperator; }
void setPacketHandler(PacketHandler handler) { _packetHandler = handler; } void setPacketHandler(PacketHandler handler) { _packetHandler = handler; }
void setPacketListHandler(PacketListHandler handler) { _packetListHandler = handler; } void setMessageHandler(MessageHandler handler) { _messageHandler = handler; }
void setPendingMessageHandler(PendingMessageHandler handler) { _pendingMessageHandler = handler; } void setMessageFailureHandler(MessageFailureHandler handler) { _messageFailureHandler = handler; }
void addUnfilteredHandler(const HifiSockAddr& senderSockAddr, BasePacketHandler handler) void addUnfilteredHandler(const HifiSockAddr& senderSockAddr, BasePacketHandler handler)
{ _unfilteredHandlers[senderSockAddr] = handler; } { _unfilteredHandlers[senderSockAddr] = handler; }
void setCongestionControlFactory(std::unique_ptr<CongestionControlVirtualFactory> ccFactory); void setCongestionControlFactory(std::unique_ptr<CongestionControlVirtualFactory> ccFactory);
void messageReceived(std::unique_ptr<PacketList> packetList); void messageReceived(std::unique_ptr<Packet> packet);
void pendingMessageReceived(std::unique_ptr<Packet> packet);
StatsVector sampleStatsForAllConnections(); StatsVector sampleStatsForAllConnections();
@ -102,8 +101,8 @@ private:
QUdpSocket _udpSocket { this }; QUdpSocket _udpSocket { this };
PacketFilterOperator _packetFilterOperator; PacketFilterOperator _packetFilterOperator;
PacketHandler _packetHandler; PacketHandler _packetHandler;
PacketListHandler _packetListHandler; MessageHandler _messageHandler;
PendingMessageHandler _pendingMessageHandler; MessageFailureHandler _messageFailureHandler;
std::unordered_map<HifiSockAddr, BasePacketHandler> _unfilteredHandlers; std::unordered_map<HifiSockAddr, BasePacketHandler> _unfilteredHandlers;
std::unordered_map<HifiSockAddr, SequenceNumber> _unreliableSequenceNumbers; std::unordered_map<HifiSockAddr, SequenceNumber> _unreliableSequenceNumbers;

View file

@ -176,8 +176,9 @@ UDTTest::UDTTest(int& argc, char** argv) :
} else { } else {
// this is a receiver - in case there are ordered packets (messages) being sent to us make sure that we handle them // this is a receiver - in case there are ordered packets (messages) being sent to us make sure that we handle them
// so that they can be verified // so that they can be verified
_socket.setPacketListHandler( // TODO Fix support for message testing
[this](std::unique_ptr<udt::PacketList> packetList) { handlePacketList(std::move(packetList)); }); //_socket.setMessageHandler(
//[this](std::unique_ptr<udt::PacketList> packetList) { handlePacketList(std::move(packetList)); });
} }
// the sender reports stats every 100 milliseconds, unless passed a custom value // the sender reports stats every 100 milliseconds, unless passed a custom value