Remove friendship between PeerConnection and SdpOfferAnswerHandler

Add multiple accessors to PeerConnection, and make multiple
formerly private functions public for access from SdpOfferAnswerHandler.

Reducing the surface of PeerConnection is a job to be done iteratively.

Bug: webrtc:11995
Change-Id: Iab176824ae557af84ac934e40ff674a1008a29d1
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/189540
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#32459}
diff --git a/pc/peer_connection.h b/pc/peer_connection.h
index 582c76d..dd7a3b4a 100644
--- a/pc/peer_connection.h
+++ b/pc/peer_connection.h
@@ -371,6 +371,97 @@
   const RtpTransmissionManager* rtp_manager() const {
     return rtp_manager_.get();
   }
+  cricket::ChannelManager* channel_manager() const;
+
+  JsepTransportController* transport_controller() {
+    return transport_controller_.get();
+  }
+  cricket::PortAllocator* port_allocator() { return port_allocator_.get(); }
+  Call* call_ptr() { return call_ptr_; }
+  rtc::UniqueRandomIdGenerator* ssrc_generator() { return &ssrc_generator_; }
+  const cricket::AudioOptions& audio_options() { return audio_options_; }
+  const cricket::VideoOptions& video_options() { return video_options_; }
+  VideoBitrateAllocatorFactory* video_bitrate_allocator_factory() {
+    return video_bitrate_allocator_factory_.get();
+  }
+
+  cricket::DataChannelType data_channel_type() const;
+  void SetIceConnectionState(IceConnectionState new_state);
+  void NoteUsageEvent(UsageEvent event);
+
+  // Report the UMA metric SdpFormatReceived for the given remote offer.
+  void ReportSdpFormatReceived(const SessionDescriptionInterface& remote_offer);
+  // Signals from MediaStreamObserver.
+  void OnAudioTrackAdded(AudioTrackInterface* track,
+                         MediaStreamInterface* stream)
+      RTC_RUN_ON(signaling_thread());
+  void OnAudioTrackRemoved(AudioTrackInterface* track,
+                           MediaStreamInterface* stream)
+      RTC_RUN_ON(signaling_thread());
+  void OnVideoTrackAdded(VideoTrackInterface* track,
+                         MediaStreamInterface* stream)
+      RTC_RUN_ON(signaling_thread());
+  void OnVideoTrackRemoved(VideoTrackInterface* track,
+                           MediaStreamInterface* stream)
+      RTC_RUN_ON(signaling_thread());
+
+  // Returns true if the PeerConnection is configured to use Unified Plan
+  // semantics for creating offers/answers and setting local/remote
+  // descriptions. If this is true the RtpTransceiver API will also be available
+  // to the user. If this is false, Plan B semantics are assumed.
+  // TODO(bugs.webrtc.org/8530): Flip the default to be Unified Plan once
+  // sufficient time has passed.
+  bool IsUnifiedPlan() const {
+    RTC_DCHECK_RUN_ON(signaling_thread());
+    return configuration_.sdp_semantics == SdpSemantics::kUnifiedPlan;
+  }
+  bool ValidateBundleSettings(const cricket::SessionDescription* desc);
+
+  // Returns the MID for the data section associated with either the
+  // RtpDataChannel or SCTP data channel, if it has been set. If no data
+  // channels are configured this will return nullopt.
+  absl::optional<std::string> GetDataMid() const;
+
+  void SetSctpDataMid(const std::string& mid) {
+    RTC_DCHECK_RUN_ON(signaling_thread());
+    sctp_mid_s_ = mid;
+  }
+  void ResetSctpDataMid() {
+    RTC_DCHECK_RUN_ON(signaling_thread());
+    sctp_mid_s_.reset();
+  }
+
+  // Returns the CryptoOptions for this PeerConnection. This will always
+  // return the RTCConfiguration.crypto_options if set and will only default
+  // back to the PeerConnectionFactory settings if nothing was set.
+  CryptoOptions GetCryptoOptions();
+
+  // Internal implementation for AddTransceiver family of methods. If
+  // |fire_callback| is set, fires OnRenegotiationNeeded callback if successful.
+  RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> AddTransceiver(
+      cricket::MediaType media_type,
+      rtc::scoped_refptr<MediaStreamTrackInterface> track,
+      const RtpTransceiverInit& init,
+      bool fire_callback = true);
+
+  // Returns rtp transport, result can not be nullptr.
+  RtpTransportInternal* GetRtpTransport(const std::string& mid) {
+    RTC_DCHECK_RUN_ON(signaling_thread());
+    auto rtp_transport = transport_controller_->GetRtpTransport(mid);
+    RTC_DCHECK(rtp_transport);
+    return rtp_transport;
+  }
+
+  // Returns true if SRTP (either using DTLS-SRTP or SDES) is required by
+  // this session.
+  bool SrtpRequired() const RTC_RUN_ON(signaling_thread());
+
+  void OnSentPacket_w(const rtc::SentPacket& sent_packet);
+
+  bool SetupDataChannelTransport_n(const std::string& mid)
+      RTC_RUN_ON(network_thread());
+  void TeardownDataChannelTransport_n() RTC_RUN_ON(network_thread());
+  cricket::ChannelInterface* GetChannel(const std::string& content_name);
 
   // Functions made public for testing.
   void ReturnHistogramVeryQuicklyForTesting() {
@@ -383,23 +474,10 @@
   ~PeerConnection() override;
 
  private:
-  // While refactoring: Allow access from SDP negotiation
-  // TOOD(https://bugs.webrtc.org/11995): Remove friendship.
-  friend class SdpOfferAnswerHandler;
-
   rtc::scoped_refptr<RtpTransceiverProxyWithInternal<RtpTransceiver>>
   FindTransceiverBySender(rtc::scoped_refptr<RtpSenderInterface> sender)
       RTC_RUN_ON(signaling_thread());
 
-  // Internal implementation for AddTransceiver family of methods. If
-  // |fire_callback| is set, fires OnRenegotiationNeeded callback if successful.
-  RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> AddTransceiver(
-      cricket::MediaType media_type,
-      rtc::scoped_refptr<MediaStreamTrackInterface> track,
-      const RtpTransceiverInit& init,
-      bool fire_callback = true);
-
-  void SetIceConnectionState(IceConnectionState new_state);
   void SetStandardizedIceConnectionState(
       PeerConnectionInterface::IceConnectionState new_state)
       RTC_RUN_ON(signaling_thread());
@@ -428,39 +506,10 @@
       const cricket::CandidatePairChangeEvent& event)
       RTC_RUN_ON(signaling_thread());
 
-  // Signals from MediaStreamObserver.
-  void OnAudioTrackAdded(AudioTrackInterface* track,
-                         MediaStreamInterface* stream)
-      RTC_RUN_ON(signaling_thread());
-  void OnAudioTrackRemoved(AudioTrackInterface* track,
-                           MediaStreamInterface* stream)
-      RTC_RUN_ON(signaling_thread());
-  void OnVideoTrackAdded(VideoTrackInterface* track,
-                         MediaStreamInterface* stream)
-      RTC_RUN_ON(signaling_thread());
-  void OnVideoTrackRemoved(VideoTrackInterface* track,
-                           MediaStreamInterface* stream)
-      RTC_RUN_ON(signaling_thread());
 
   void OnNegotiationNeeded();
 
 
-  // Returns the MID for the data section associated with either the
-  // RtpDataChannel or SCTP data channel, if it has been set. If no data
-  // channels are configured this will return nullopt.
-  absl::optional<std::string> GetDataMid() const;
-
-  // Returns true if the PeerConnection is configured to use Unified Plan
-  // semantics for creating offers/answers and setting local/remote
-  // descriptions. If this is true the RtpTransceiver API will also be available
-  // to the user. If this is false, Plan B semantics are assumed.
-  // TODO(bugs.webrtc.org/8530): Flip the default to be Unified Plan once
-  // sufficient time has passed.
-  bool IsUnifiedPlan() const {
-    RTC_DCHECK_RUN_ON(signaling_thread());
-    return configuration_.sdp_semantics == SdpSemantics::kUnifiedPlan;
-  }
-
   // Returns the specified SCTP DataChannel in sctp_data_channels_,
   // or nullptr if not found.
   SctpDataChannel* FindDataChannelBySid(int sid) const
@@ -501,14 +550,9 @@
   // Returns RTCError::OK() if there are no issues.
   RTCError ValidateConfiguration(const RTCConfiguration& config) const;
 
-  cricket::ChannelManager* channel_manager() const;
-
-  cricket::ChannelInterface* GetChannel(const std::string& content_name);
-
   cricket::IceConfig ParseIceConfig(
       const PeerConnectionInterface::RTCConfiguration& config) const;
 
-  cricket::DataChannelType data_channel_type() const;
 
   // Called when an RTCCertificate is generated or retrieved by
   // WebRTCSessionDescriptionFactory. Should happen before setLocalDescription.
@@ -529,21 +573,12 @@
                                    int* sdp_mline_index)
       RTC_RUN_ON(signaling_thread());
 
-  bool SetupDataChannelTransport_n(const std::string& mid)
-      RTC_RUN_ON(network_thread());
-  void TeardownDataChannelTransport_n() RTC_RUN_ON(network_thread());
-
-  bool ValidateBundleSettings(const cricket::SessionDescription* desc);
   bool HasRtcpMuxEnabled(const cricket::ContentInfo* content);
 
   // Verifies a=setup attribute as per RFC 5763.
   bool ValidateDtlsSetupAttribute(const cricket::SessionDescription* desc,
                                   SdpType type);
 
-  // Returns true if SRTP (either using DTLS-SRTP or SDES) is required by
-  // this session.
-  bool SrtpRequired() const RTC_RUN_ON(signaling_thread());
-
   // JsepTransportController signal handlers.
   void OnTransportControllerConnectionState(cricket::IceConnectionState state)
       RTC_RUN_ON(signaling_thread());
@@ -564,9 +599,6 @@
       RTC_RUN_ON(signaling_thread());
   void OnTransportControllerDtlsHandshakeError(rtc::SSLHandshakeError error);
 
-  // Report the UMA metric SdpFormatReceived for the given remote offer.
-  void ReportSdpFormatReceived(const SessionDescriptionInterface& remote_offer);
-
   // Invoked when TransportController connection completion is signaled.
   // Reports stats for all transports in use.
   void ReportTransportStats() RTC_RUN_ON(signaling_thread());
@@ -580,11 +612,8 @@
   void ReportIceCandidateCollected(const cricket::Candidate& candidate)
       RTC_RUN_ON(signaling_thread());
 
-  void NoteUsageEvent(UsageEvent event);
   void ReportUsagePattern() const RTC_RUN_ON(signaling_thread());
 
-  void OnSentPacket_w(const rtc::SentPacket& sent_packet);
-
   // JsepTransportController::Observer override.
   //
   // Called by |transport_controller_| when processing transport information
@@ -597,19 +626,6 @@
       rtc::scoped_refptr<DtlsTransport> dtls_transport,
       DataChannelTransportInterface* data_channel_transport) override;
 
-  // Returns the CryptoOptions for this PeerConnection. This will always
-  // return the RTCConfiguration.crypto_options if set and will only default
-  // back to the PeerConnectionFactory settings if nothing was set.
-  CryptoOptions GetCryptoOptions();
-
-  // Returns rtp transport, result can not be nullptr.
-  RtpTransportInternal* GetRtpTransport(const std::string& mid) {
-    RTC_DCHECK_RUN_ON(signaling_thread());
-    auto rtp_transport = transport_controller_->GetRtpTransport(mid);
-    RTC_DCHECK(rtp_transport);
-    return rtp_transport;
-  }
-
   std::function<void(const rtc::CopyOnWriteBuffer& packet,
                      int64_t packet_time_us)>
   InitializeRtcpCallback();
diff --git a/pc/sdp_offer_answer.cc b/pc/sdp_offer_answer.cc
index b40d00c..81df99a 100644
--- a/pc/sdp_offer_answer.cc
+++ b/pc/sdp_offer_answer.cc
@@ -962,20 +962,20 @@
   return pc_->rtp_manager()->transceivers();
 }
 JsepTransportController* SdpOfferAnswerHandler::transport_controller() {
-  return pc_->transport_controller_.get();
+  return pc_->transport_controller();
 }
 DataChannelController* SdpOfferAnswerHandler::data_channel_controller() {
-  return &pc_->data_channel_controller_;
+  return pc_->data_channel_controller();
 }
 const DataChannelController* SdpOfferAnswerHandler::data_channel_controller()
     const {
-  return &pc_->data_channel_controller_;
+  return pc_->data_channel_controller();
 }
 cricket::PortAllocator* SdpOfferAnswerHandler::port_allocator() {
-  return pc_->port_allocator_.get();
+  return pc_->port_allocator();
 }
 const cricket::PortAllocator* SdpOfferAnswerHandler::port_allocator() const {
-  return pc_->port_allocator_.get();
+  return pc_->port_allocator();
 }
 RtpTransmissionManager* SdpOfferAnswerHandler::rtp_manager() {
   return pc_->rtp_manager();
@@ -4509,9 +4509,9 @@
   {
     RTC_DCHECK_RUN_ON(pc_->signaling_thread());
     voice_channel = channel_manager()->CreateVoiceChannel(
-        pc_->call_ptr_, pc_->configuration_.media_config, rtp_transport,
+        pc_->call_ptr(), pc_->configuration()->media_config, rtp_transport,
         signaling_thread(), mid, pc_->SrtpRequired(), pc_->GetCryptoOptions(),
-        &pc_->ssrc_generator_, pc_->audio_options_);
+        pc_->ssrc_generator(), pc_->audio_options());
   }
   if (!voice_channel) {
     return nullptr;
@@ -4536,10 +4536,10 @@
   {
     RTC_DCHECK_RUN_ON(pc_->signaling_thread());
     video_channel = channel_manager()->CreateVideoChannel(
-        pc_->call_ptr_, pc_->configuration_.media_config, rtp_transport,
+        pc_->call_ptr(), pc_->configuration()->media_config, rtp_transport,
         signaling_thread(), mid, pc_->SrtpRequired(), pc_->GetCryptoOptions(),
-        &pc_->ssrc_generator_, pc_->video_options_,
-        pc_->video_bitrate_allocator_factory_.get());
+        pc_->ssrc_generator(), pc_->video_options(),
+        pc_->video_bitrate_allocator_factory());
   }
   if (!video_channel) {
     return nullptr;
@@ -4559,10 +4559,7 @@
               RTC_FROM_HERE,
               rtc::Bind(&PeerConnection::SetupDataChannelTransport_n, pc_,
                         mid))) {
-        {
-          RTC_DCHECK_RUN_ON(pc_->signaling_thread());
-          pc_->sctp_mid_s_ = mid;
-        }
+        pc_->SetSctpDataMid(mid);
       } else {
         return false;
       }
@@ -4576,9 +4573,9 @@
         RTC_DCHECK_RUN_ON(pc_->signaling_thread());
         data_channel_controller()->set_rtp_data_channel(
             channel_manager()->CreateRtpDataChannel(
-                pc_->configuration_.media_config, rtp_transport,
+                pc_->configuration()->media_config, rtp_transport,
                 signaling_thread(), mid, pc_->SrtpRequired(),
-                pc_->GetCryptoOptions(), &pc_->ssrc_generator_));
+                pc_->GetCryptoOptions(), pc_->ssrc_generator()));
       }
       if (!data_channel_controller()->rtp_data_channel()) {
         return false;
@@ -4626,7 +4623,7 @@
       RTC_DCHECK_RUN_ON(pc_->network_thread());
       pc_->TeardownDataChannelTransport_n();
     });
-    pc_->sctp_mid_s_.reset();
+    pc_->ResetSctpDataMid();
   }
 }