replace sigslot signal candidate error with callbacklist

Bug: webrtc:42222066
Change-Id: I55961074151750c4510db353ed5b81204f0730e4
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/405300
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Evan Shrubsole <eshr@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45390}
diff --git a/p2p/base/port.cc b/p2p/base/port.cc
index 033e3f6..720479c 100644
--- a/p2p/base/port.cc
+++ b/p2p/base/port.cc
@@ -309,6 +309,15 @@
   }
 }
 
+void Port::SubscribeCandidateError(
+    std::function<void(Port*, const IceCandidateErrorEvent&)> callback) {
+  candidate_error_callback_list_.AddReceiver(std::move(callback));
+}
+
+void Port::SendCandidateError(const IceCandidateErrorEvent& event) {
+  candidate_error_callback_list_.Send(this, event);
+}
+
 void Port::AddOrReplaceConnection(Connection* conn) {
   auto ret = connections_.insert(
       std::make_pair(conn->remote_candidate().address(), conn));
@@ -838,7 +847,7 @@
 
 void Port::SubscribePortDestroyed(
     std::function<void(PortInterface*)> callback) {
-  port_destroyed_callback_list_.AddReceiver(callback);
+  port_destroyed_callback_list_.AddReceiver(std::move(callback));
 }
 
 void Port::SendPortDestroyed(Port* port) {
diff --git a/p2p/base/port.h b/p2p/base/port.h
index 0d774db..01348f3 100644
--- a/p2p/base/port.h
+++ b/p2p/base/port.h
@@ -257,7 +257,9 @@
   // Provides all of the above information in one handy object.
   const std::vector<Candidate>& Candidates() const override;
   // Fired when candidate discovery failed using certain server.
-  sigslot::signal2<Port*, const IceCandidateErrorEvent&> SignalCandidateError;
+  void SubscribeCandidateError(
+      std::function<void(Port*, const IceCandidateErrorEvent&)> callback);
+  void SendCandidateError(const IceCandidateErrorEvent& candidate_error_event);
 
   // SignalPortComplete is sent when port completes the task of candidates
   // allocation.
@@ -517,6 +519,8 @@
       permission_queries_;
 
   CallbackList<PortInterface*> port_destroyed_callback_list_;
+  CallbackList<Port*, const IceCandidateErrorEvent&>
+      candidate_error_callback_list_;
 
   // Keep as the last member variable.
   WeakPtrFactory<Port> weak_factory_;
diff --git a/p2p/base/stun_port.cc b/p2p/base/stun_port.cc
index 7623ccc..ea7ad8a 100644
--- a/p2p/base/stun_port.cc
+++ b/p2p/base/stun_port.cc
@@ -574,10 +574,9 @@
   if (error_code != STUN_ERROR_NOT_AN_ERROR) {
     StringBuilder url;
     url << "stun:" << stun_server_addr.ToString();
-    SignalCandidateError(
-        this, IceCandidateErrorEvent(
-                  GetLocalAddress().HostAsSensitiveURIString(),
-                  GetLocalAddress().port(), url.str(), error_code, reason));
+    SendCandidateError(IceCandidateErrorEvent(
+        GetLocalAddress().HostAsSensitiveURIString(), GetLocalAddress().port(),
+        url.str(), error_code, reason));
   }
   if (bind_request_failed_servers_.find(stun_server_addr) !=
       bind_request_failed_servers_.end()) {
diff --git a/p2p/base/stun_port_unittest.cc b/p2p/base/stun_port_unittest.cc
index 1fd40d4..963335b 100644
--- a/p2p/base/stun_port_unittest.cc
+++ b/p2p/base/stun_port_unittest.cc
@@ -218,8 +218,10 @@
     stun_port_->SignalPortComplete.connect(this,
                                            &StunPortTestBase::OnPortComplete);
     stun_port_->SignalPortError.connect(this, &StunPortTestBase::OnPortError);
-    stun_port_->SignalCandidateError.connect(
-        this, &StunPortTestBase::OnCandidateError);
+    stun_port_->SubscribeCandidateError(
+        [this](Port* port, const IceCandidateErrorEvent& event) {
+          OnCandidateError(port, event);
+        });
   }
 
   void CreateSharedUdpPort(
diff --git a/p2p/base/turn_port.cc b/p2p/base/turn_port.cc
index 72f449d..3027ba2 100644
--- a/p2p/base/turn_port.cc
+++ b/p2p/base/turn_port.cc
@@ -940,8 +940,7 @@
     port = 0;
   }
   if (error_code != STUN_ERROR_NOT_AN_ERROR) {
-    SignalCandidateError(
-        this,
+    SendCandidateError(
         IceCandidateErrorEvent(address, port, server_url_, error_code, reason));
   }
 }
diff --git a/p2p/base/turn_port_unittest.cc b/p2p/base/turn_port_unittest.cc
index c56c04b..e296ed7 100644
--- a/p2p/base/turn_port_unittest.cc
+++ b/p2p/base/turn_port_unittest.cc
@@ -367,8 +367,11 @@
     turn_port_->SignalPortComplete.connect(this,
                                            &TurnPortTest::OnTurnPortComplete);
     turn_port_->SignalPortError.connect(this, &TurnPortTest::OnTurnPortError);
-    turn_port_->SignalCandidateError.connect(this,
-                                             &TurnPortTest::OnCandidateError);
+    turn_port_->SubscribeCandidateError(
+        [this](Port* port, const IceCandidateErrorEvent& event) {
+          OnCandidateError(port, event);
+        });
+
     turn_port_->SignalUnknownAddress.connect(
         this, &TurnPortTest::OnTurnUnknownAddress);
     turn_port_->SubscribePortDestroyed(
diff --git a/p2p/client/basic_port_allocator.cc b/p2p/client/basic_port_allocator.cc
index 7ea5dd7..498d33a 100644
--- a/p2p/client/basic_port_allocator.cc
+++ b/p2p/client/basic_port_allocator.cc
@@ -922,8 +922,10 @@
 
   port->SignalCandidateReady.connect(
       this, &BasicPortAllocatorSession::OnCandidateReady);
-  port->SignalCandidateError.connect(
-      this, &BasicPortAllocatorSession::OnCandidateError);
+  port->SubscribeCandidateError(
+      [this](Port* port, const IceCandidateErrorEvent& event) {
+        OnCandidateError(port, event);
+      });
   port->SignalPortComplete.connect(this,
                                    &BasicPortAllocatorSession::OnPortComplete);
   port->SubscribePortDestroyed(