From 50965f1916619ee1aca1694d04318503f4bad05d Mon Sep 17 00:00:00 2001
From: Simon Walton <simon@highfidelity.io>
Date: Wed, 26 Jun 2019 18:04:41 -0700
Subject: [PATCH] Handle remote public-address changes

---
 libraries/networking/src/NetworkPeer.cpp | 24 ++++++++++++------------
 libraries/networking/src/NetworkPeer.h   |  2 +-
 libraries/networking/src/udt/Socket.cpp  |  5 +++++
 libraries/networking/src/udt/Socket.h    |  2 +-
 4 files changed, 19 insertions(+), 14 deletions(-)

diff --git a/libraries/networking/src/NetworkPeer.cpp b/libraries/networking/src/NetworkPeer.cpp
index 4e0a82ba0e..a48922726e 100644
--- a/libraries/networking/src/NetworkPeer.cpp
+++ b/libraries/networking/src/NetworkPeer.cpp
@@ -59,13 +59,13 @@ void NetworkPeer::setPublicSocket(const HifiSockAddr& publicSocket) {
         
         bool wasOldSocketNull = _publicSocket.isNull();
 
-        auto temp = _publicSocket.objectName();
+        auto previousSocket = _publicSocket;
         _publicSocket = publicSocket;
-        _publicSocket.setObjectName(temp);
+        _publicSocket.setObjectName(previousSocket.objectName());
         
         if (!wasOldSocketNull) {
-            qCDebug(networking) << "Public socket change for node" << *this;
-            emit socketUpdated();
+            qCDebug(networking) << "Public socket change for node" << *this << "; previously" << previousSocket;
+            emit socketUpdated(previousSocket, _publicSocket);
         }
     }
 }
@@ -79,13 +79,13 @@ void NetworkPeer::setLocalSocket(const HifiSockAddr& localSocket) {
         
         bool wasOldSocketNull = _localSocket.isNull();
         
-        auto temp = _localSocket.objectName();
+        auto previousSocket = _localSocket;
         _localSocket = localSocket;
-        _localSocket.setObjectName(temp);
+        _localSocket.setObjectName(previousSocket.objectName());
 
         if (!wasOldSocketNull) {
-            qCDebug(networking) << "Local socket change for node" << *this;
-            emit socketUpdated();
+            qCDebug(networking) << "Local socket change for node" << *this << "; previously" << previousSocket;
+            emit socketUpdated(previousSocket, _localSocket);
         }
     }
 }
@@ -99,13 +99,13 @@ void NetworkPeer::setSymmetricSocket(const HifiSockAddr& symmetricSocket) {
         
         bool wasOldSocketNull = _symmetricSocket.isNull();
         
-        auto temp = _symmetricSocket.objectName();
+        auto previousSocket = _symmetricSocket;
         _symmetricSocket = symmetricSocket;
-        _symmetricSocket.setObjectName(temp);
+        _symmetricSocket.setObjectName(previousSocket.objectName());
         
         if (!wasOldSocketNull) {
-            qCDebug(networking) << "Symmetric socket change for node" << *this;
-            emit socketUpdated();
+            qCDebug(networking) << "Symmetric socket change for node" << *this << "; previously" << previousSocket;
+            emit socketUpdated(previousSocket, _symmetricSocket);
         }
     }
 }
diff --git a/libraries/networking/src/NetworkPeer.h b/libraries/networking/src/NetworkPeer.h
index e2149d64af..4c08c97d3c 100644
--- a/libraries/networking/src/NetworkPeer.h
+++ b/libraries/networking/src/NetworkPeer.h
@@ -94,7 +94,7 @@ public slots:
 signals:
     void pingTimerTimeout();
     void socketActivated(const HifiSockAddr& sockAddr);
-    void socketUpdated();
+    void socketUpdated(HifiSockAddr previousAddress, HifiSockAddr currentAddress);
 
 protected:
     void setActiveSocket(HifiSockAddr* discoveredSocket);
diff --git a/libraries/networking/src/udt/Socket.cpp b/libraries/networking/src/udt/Socket.cpp
index c56f276560..7cc6680efd 100644
--- a/libraries/networking/src/udt/Socket.cpp
+++ b/libraries/networking/src/udt/Socket.cpp
@@ -538,6 +538,11 @@ void Socket::handleStateChanged(QAbstractSocket::SocketState socketState) {
     }
 }
 
+void Socket::handleRemoteAddressChange(HifiSockAddr previousAddress, HifiSockAddr currentAddress) {
+    Lock connectionsLock(_connectionsHashMutex);
+
+}
+
 #if (PR_BUILD || DEV_BUILD)
 
 void Socket::sendFakedHandshakeRequest(const HifiSockAddr& sockAddr) {
diff --git a/libraries/networking/src/udt/Socket.h b/libraries/networking/src/udt/Socket.h
index ad9d6de8b8..74eb413bc2 100644
--- a/libraries/networking/src/udt/Socket.h
+++ b/libraries/networking/src/udt/Socket.h
@@ -106,11 +106,11 @@ private slots:
 
     void handleSocketError(QAbstractSocket::SocketError socketError);
     void handleStateChanged(QAbstractSocket::SocketState socketState);
+    void handleRemoteAddressChange(HifiSockAddr previousAddress, HifiSockAddr currentAddress);
 
 private:
     void setSystemBufferSizes();
     Connection* findOrCreateConnection(const HifiSockAddr& sockAddr, bool filterCreation = false);
-    bool socketMatchesNodeOrDomain(const HifiSockAddr& sockAddr);
    
     // privatized methods used by UDTTest - they are private since they must be called on the Socket thread
     ConnectionStats::Stats sampleStatsForConnection(const HifiSockAddr& destination);