diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 90f0c65f60..b64f3ab6d0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -251,7 +251,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _lastNackTime(usecTimestampNow()), _lastSendDownstreamAudioStats(usecTimestampNow()), _isVSyncOn(true), - _aboutToQuit(false) + _aboutToQuit(false), + _notifiedPacketVersionMismatchThisDomain(false) { _logger = new FileLogger(this); // After setting organization name in order to get correct directory qInstallMessageHandler(messageHandler); @@ -323,6 +324,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : connect(nodeList.data(), SIGNAL(nodeKilled(SharedNodePointer)), SLOT(nodeKilled(SharedNodePointer))); connect(nodeList.data(), &NodeList::uuidChanged, _myAvatar, &MyAvatar::setSessionUUID); connect(nodeList.data(), &NodeList::limitOfSilentDomainCheckInsReached, nodeList.data(), &NodeList::reset); + connect(nodeList.data(), &NodeList::packetVersionMismatch, this, &Application::notifyPacketVersionMismatch); // connect to appropriate slots on AccountManager AccountManager& accountManager = AccountManager::getInstance(); @@ -568,6 +570,7 @@ void Application::initializeGL() { // create thread for parsing of octee data independent of the main network and rendering threads _octreeProcessor.initialize(_enableProcessOctreeThread); + connect(&_octreeProcessor, &OctreePacketProcessor::packetVersionMismatch, this, &Application::notifyPacketVersionMismatch); _entityEditSender.initialize(_enableProcessOctreeThread); // call our timer function every second @@ -3194,11 +3197,11 @@ void Application::connectedToDomain(const QString& hostname) { if (accountManager.isLoggedIn() && !domainID.isNull()) { // update our data-server with the domain-server we're logged in with - QString domainPutJsonString = "{\"location\":{\"domain_id\":\"" + uuidStringWithoutCurlyBraces(domainID) + "\"}}"; - accountManager.authenticatedRequest("/api/v1/user/location", QNetworkAccessManager::PutOperation, JSONCallbackParameters(), domainPutJsonString.toUtf8()); + + _notifiedPacketVersionMismatchThisDomain = false; } } @@ -3964,3 +3967,18 @@ int Application::getRenderAmbientLight() const { return -1; } } + +void Application::notifyPacketVersionMismatch() { + if (!_notifiedPacketVersionMismatchThisDomain) { + _notifiedPacketVersionMismatchThisDomain = true; + + QString message = "The location you are visiting is running an incompatible server version.\n"; + message += "Content may not display properly."; + + QMessageBox msgBox; + msgBox.setText(message); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setIcon(QMessageBox::Warning); + msgBox.exec(); + } +} diff --git a/interface/src/Application.h b/interface/src/Application.h index c6db04813b..785fa6c685 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -362,6 +362,8 @@ public slots: void loadSettings(); void saveSettings(); + void notifyPacketVersionMismatch(); + private slots: void clearDomainOctreeDetails(); void timer(); @@ -576,6 +578,8 @@ private: bool _aboutToQuit; Bookmarks* _bookmarks; + + bool _notifiedPacketVersionMismatchThisDomain; QThread _settingsThread; QTimer _settingsTimer; diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 7129debd34..65a5c6f1a1 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -68,11 +68,12 @@ void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, << senderUUID << "sent" << (int)packetVersion << "but" << (int)expectedVersion << "expected."; + emit packetVersionMismatch(); + versionDebugSuppressMap.insert(senderUUID, voxelPacketType); } return; // bail since piggyback version doesn't match } - app->trackIncomingOctreePacket(mutablePacket, sendingNode, wasStatsPacket); diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index abdf271cfb..5c52dec002 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -18,6 +18,10 @@ /// the user is responsible for reading inbound packets and adding them to the processing queue by calling queueReceivedPacket() class OctreePacketProcessor : public ReceivedPacketProcessor { Q_OBJECT + +signals: + void packetVersionMismatch(); + protected: virtual void processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet); }; diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index bdbd5476ff..4957084279 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -167,6 +167,8 @@ bool LimitedNodeList::packetVersionAndHashMatch(const QByteArray& packet) { qDebug() << "Packet version mismatch on" << packetTypeForPacket(packet) << "- Sender" << uuidFromPacketHeader(packet) << "sent" << qPrintable(QString::number(packet[numPacketTypeBytes])) << "but" << qPrintable(QString::number(versionForPacketType(mismatchType))) << "expected."; + + emit packetVersionMismatch(); versionDebugSuppressMap.insert(senderUUID, checkType); } diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index f80f0367c7..6e736519a0 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -185,6 +185,8 @@ signals: void dataSent(const quint8 channel_type, const int bytes); void dataReceived(const quint8 channel_type, const int bytes); + + void packetVersionMismatch(); protected: LimitedNodeList(unsigned short socketListenPort = 0, unsigned short dtlsListenPort = 0);