mirror of
https://github.com/overte-org/overte.git
synced 2025-04-15 11:08:06 +02:00
implement support for binary data over messages
This commit is contained in:
parent
91bfa65fe2
commit
987f147ed4
5 changed files with 74 additions and 8 deletions
|
@ -37,8 +37,10 @@ void MessagesMixer::nodeKilled(SharedNodePointer killedNode) {
|
|||
|
||||
void MessagesMixer::handleMessages(QSharedPointer<ReceivedMessage> receivedMessage, SharedNodePointer senderNode) {
|
||||
QString channel, message;
|
||||
QByteArray data;
|
||||
QUuid senderID;
|
||||
MessagesClient::decodeMessagesPacket(receivedMessage, channel, message, senderID);
|
||||
bool isText;
|
||||
MessagesClient::decodeMessagesPacket(receivedMessage, channel, isText, message, data, senderID);
|
||||
|
||||
auto nodeList = DependencyManager::get<NodeList>();
|
||||
|
||||
|
@ -47,7 +49,8 @@ void MessagesMixer::handleMessages(QSharedPointer<ReceivedMessage> receivedMessa
|
|||
return node->getActiveSocket() && _channelSubscribers[channel].contains(node->getUUID());
|
||||
},
|
||||
[&](const SharedNodePointer& node) {
|
||||
auto packetList = MessagesClient::encodeMessagesPacket(channel, message, senderID);
|
||||
auto packetList = isText ? MessagesClient::encodeMessagesPacket(channel, message, senderID) :
|
||||
MessagesClient::encodeMessagesDataPacket(channel, data, senderID);
|
||||
nodeList->sendPacketList(std::move(packetList), *node);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -36,16 +36,23 @@ void MessagesClient::init() {
|
|||
}
|
||||
}
|
||||
|
||||
void MessagesClient::decodeMessagesPacket(QSharedPointer<ReceivedMessage> receivedMessage, QString& channel, QString& message, QUuid& senderID) {
|
||||
void MessagesClient::decodeMessagesPacket(QSharedPointer<ReceivedMessage> receivedMessage, QString& channel,
|
||||
bool& isText, QString& message, QByteArray& data, QUuid& senderID) {
|
||||
quint16 channelLength;
|
||||
receivedMessage->readPrimitive(&channelLength);
|
||||
auto channelData = receivedMessage->read(channelLength);
|
||||
channel = QString::fromUtf8(channelData);
|
||||
|
||||
receivedMessage->readPrimitive(&isText);
|
||||
|
||||
quint16 messageLength;
|
||||
receivedMessage->readPrimitive(&messageLength);
|
||||
auto messageData = receivedMessage->read(messageLength);
|
||||
message = QString::fromUtf8(messageData);
|
||||
if (isText) {
|
||||
message = QString::fromUtf8(messageData);
|
||||
} else {
|
||||
data = messageData;
|
||||
}
|
||||
|
||||
QByteArray bytesSenderID = receivedMessage->read(NUM_BYTES_RFC4122_UUID);
|
||||
if (bytesSenderID.length() == NUM_BYTES_RFC4122_UUID) {
|
||||
|
@ -64,6 +71,9 @@ std::unique_ptr<NLPacketList> MessagesClient::encodeMessagesPacket(QString chann
|
|||
packetList->writePrimitive(channelLength);
|
||||
packetList->write(channelUtf8);
|
||||
|
||||
bool isTextMessage = true;
|
||||
packetList->writePrimitive(isTextMessage);
|
||||
|
||||
auto messageUtf8 = message.toUtf8();
|
||||
quint16 messageLength = messageUtf8.length();
|
||||
packetList->writePrimitive(messageLength);
|
||||
|
@ -74,12 +84,38 @@ std::unique_ptr<NLPacketList> MessagesClient::encodeMessagesPacket(QString chann
|
|||
return packetList;
|
||||
}
|
||||
|
||||
std::unique_ptr<NLPacketList> MessagesClient::encodeMessagesDataPacket(QString channel, QByteArray data, QUuid senderID) {
|
||||
auto packetList = NLPacketList::create(PacketType::MessagesData, QByteArray(), true, true);
|
||||
|
||||
auto channelUtf8 = channel.toUtf8();
|
||||
quint16 channelLength = channelUtf8.length();
|
||||
packetList->writePrimitive(channelLength);
|
||||
packetList->write(channelUtf8);
|
||||
|
||||
bool isTextMessage = false;
|
||||
packetList->writePrimitive(isTextMessage);
|
||||
|
||||
quint16 dataLength = data.length();
|
||||
packetList->writePrimitive(dataLength);
|
||||
packetList->write(data);
|
||||
|
||||
packetList->write(senderID.toRfc4122());
|
||||
|
||||
return packetList;
|
||||
}
|
||||
|
||||
|
||||
void MessagesClient::handleMessagesPacket(QSharedPointer<ReceivedMessage> receivedMessage, SharedNodePointer senderNode) {
|
||||
QString channel, message;
|
||||
QByteArray data;
|
||||
bool isText { false };
|
||||
QUuid senderID;
|
||||
decodeMessagesPacket(receivedMessage, channel, message, senderID);
|
||||
emit messageReceived(channel, message, senderID, false);
|
||||
decodeMessagesPacket(receivedMessage, channel, isText, message, data, senderID);
|
||||
if (isText) {
|
||||
emit messageReceived(channel, message, senderID, false);
|
||||
} else {
|
||||
emit dataReceived(channel, data, senderID, false);
|
||||
}
|
||||
}
|
||||
|
||||
void MessagesClient::sendMessage(QString channel, QString message, bool localOnly) {
|
||||
|
@ -98,6 +134,22 @@ void MessagesClient::sendMessage(QString channel, QString message, bool localOnl
|
|||
}
|
||||
}
|
||||
|
||||
void MessagesClient::sendData(QString channel, QByteArray data, bool localOnly) {
|
||||
auto nodeList = DependencyManager::get<NodeList>();
|
||||
if (localOnly) {
|
||||
QUuid senderID = nodeList->getSessionUUID();
|
||||
emit dataReceived(channel, data, senderID, true);
|
||||
} else {
|
||||
SharedNodePointer messagesMixer = nodeList->soloNodeOfType(NodeType::MessagesMixer);
|
||||
|
||||
if (messagesMixer) {
|
||||
QUuid senderID = nodeList->getSessionUUID();
|
||||
auto packetList = encodeMessagesDataPacket(channel, data, senderID);
|
||||
nodeList->sendPacketList(std::move(packetList), *messagesMixer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MessagesClient::sendLocalMessage(QString channel, QString message) {
|
||||
sendMessage(channel, message, true);
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#define hifi_MessagesClient_h
|
||||
|
||||
#include <QString>
|
||||
#include <QByteArray>
|
||||
|
||||
#include <DependencyManager.h>
|
||||
|
||||
|
@ -31,15 +32,19 @@ public:
|
|||
|
||||
Q_INVOKABLE void sendMessage(QString channel, QString message, bool localOnly = false);
|
||||
Q_INVOKABLE void sendLocalMessage(QString channel, QString message);
|
||||
Q_INVOKABLE void sendData(QString channel, QByteArray data, bool localOnly = false);
|
||||
Q_INVOKABLE void subscribe(QString channel);
|
||||
Q_INVOKABLE void unsubscribe(QString channel);
|
||||
|
||||
static void decodeMessagesPacket(QSharedPointer<ReceivedMessage> receivedMessage, QString& channel, QString& message, QUuid& senderID);
|
||||
static std::unique_ptr<NLPacketList> encodeMessagesPacket(QString channel, QString message, QUuid senderID);
|
||||
static void decodeMessagesPacket(QSharedPointer<ReceivedMessage> receivedMessage, QString& channel,
|
||||
bool& isText, QString& message, QByteArray& data, QUuid& senderID);
|
||||
|
||||
static std::unique_ptr<NLPacketList> encodeMessagesPacket(QString channel, QString message, QUuid senderID);
|
||||
static std::unique_ptr<NLPacketList> encodeMessagesDataPacket(QString channel, QByteArray data, QUuid senderID);
|
||||
|
||||
signals:
|
||||
void messageReceived(QString channel, QString message, QUuid senderUUID, bool localOnly);
|
||||
void dataReceived(QString channel, QByteArray data, QUuid senderUUID, bool localOnly);
|
||||
|
||||
private slots:
|
||||
void handleMessagesPacket(QSharedPointer<ReceivedMessage> receivedMessage, SharedNodePointer senderNode);
|
||||
|
|
|
@ -57,6 +57,8 @@ PacketVersion versionForPacketType(PacketType packetType) {
|
|||
case PacketType::BulkAvatarData:
|
||||
case PacketType::KillAvatar:
|
||||
return static_cast<PacketVersion>(AvatarMixerPacketVersion::VariableAvatarData);
|
||||
case PacketType::MessagesData:
|
||||
return static_cast<PacketVersion>(MessageDataVersion::TextOrBinaryData);
|
||||
case PacketType::ICEServerHeartbeat:
|
||||
return 18; // ICE Server Heartbeat signing
|
||||
case PacketType::AssetGetInfo:
|
||||
|
|
|
@ -262,4 +262,8 @@ enum class AudioVersion : PacketVersion {
|
|||
HighDynamicRangeVolume,
|
||||
};
|
||||
|
||||
enum class MessageDataVersion : PacketVersion {
|
||||
TextOrBinaryData = 18
|
||||
};
|
||||
|
||||
#endif // hifi_PacketHeaders_h
|
||||
|
|
Loading…
Reference in a new issue