Add ios bindings for PeerConnectionState.

This change makes it possible for ios apps to use the new standards-compliant PeerConnectionState.

Originally reviewed as https://webrtc-review.googlesource.com/c/110502, with an added check to prevent calling unimplemented optional method.

Bug: webrtc:9977
Change-Id: Iebac8ce58d435e38450add51b8915575d0ffd934
Reviewed-on: https://webrtc-review.googlesource.com/c/111084
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Commit-Queue: Jonas Olsson <jonasolsson@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25727}
This commit is contained in:
Jonas Olsson
2018-11-15 16:52:45 +01:00
committed by Commit Bot
parent 49a7843030
commit cfddbb7e14
4 changed files with 98 additions and 6 deletions

View File

@ -404,6 +404,11 @@ static int const kKbpsMultiplier = 1000;
});
}
- (void)peerConnection:(RTCPeerConnection *)peerConnection
didChangeConnectionState:(RTCPeerConnectionState)newState {
RTCLog(@"ICE+DTLS state changed: %ld", (long)newState);
}
- (void)peerConnection:(RTCPeerConnection *)peerConnection
didChangeIceGatheringState:(RTCIceGatheringState)newState {
RTCLog(@"ICE gathering state changed: %ld", (long)newState);

View File

@ -39,6 +39,8 @@ class PeerConnectionDelegateAdapter : public PeerConnectionObserver {
void OnIceConnectionChange(PeerConnectionInterface::IceConnectionState new_state) override;
void OnConnectionChange(PeerConnectionInterface::PeerConnectionState new_state) override;
void OnIceGatheringChange(PeerConnectionInterface::IceGatheringState new_state) override;
void OnIceCandidate(const IceCandidateInterface *candidate) override;
@ -85,11 +87,19 @@ class PeerConnectionDelegateAdapter : public PeerConnectionObserver {
+ (webrtc::PeerConnectionInterface::IceConnectionState)nativeIceConnectionStateForState:
(RTCIceConnectionState)state;
+ (webrtc::PeerConnectionInterface::PeerConnectionState)nativeConnectionStateForState:
(RTCPeerConnectionState)state;
+ (RTCIceConnectionState)iceConnectionStateForNativeState:
(webrtc::PeerConnectionInterface::IceConnectionState)nativeState;
+ (RTCPeerConnectionState)connectionStateForNativeState:
(webrtc::PeerConnectionInterface::PeerConnectionState)nativeState;
+ (NSString *)stringForIceConnectionState:(RTCIceConnectionState)state;
+ (NSString *)stringForConnectionState:(RTCPeerConnectionState)state;
+ (webrtc::PeerConnectionInterface::IceGatheringState)nativeIceGatheringStateForState:
(RTCIceGatheringState)state;

View File

@ -57,6 +57,16 @@ typedef NS_ENUM(NSInteger, RTCIceConnectionState) {
RTCIceConnectionStateCount,
};
/** Represents the combined ice+dtls connection state of the peer connection. */
typedef NS_ENUM(NSInteger, RTCPeerConnectionState) {
RTCPeerConnectionStateNew,
RTCPeerConnectionStateConnecting,
RTCPeerConnectionStateConnected,
RTCPeerConnectionStateDisconnected,
RTCPeerConnectionStateFailed,
RTCPeerConnectionStateClosed,
};
/** Represents the ice gathering state of the peer connection. */
typedef NS_ENUM(NSInteger, RTCIceGatheringState) {
RTCIceGatheringStateNew,
@ -115,11 +125,14 @@ RTC_OBJC_EXPORT
* This is only called with RTCSdpSemanticsUnifiedPlan specified.
*/
@optional
/** Called any time the PeerConnectionState changes. */
- (void)peerConnection:(RTCPeerConnection *)peerConnection
didChangeConnectionState:(RTCPeerConnectionState)newState;
- (void)peerConnection:(RTCPeerConnection *)peerConnection
didStartReceivingOnTransceiver:(RTCRtpTransceiver *)transceiver;
/** Called when a receiver and its track are created. */
@optional
- (void)peerConnection:(RTCPeerConnection *)peerConnection
didAddReceiver:(RTCRtpReceiver *)rtpReceiver
streams:(NSArray<RTCMediaStream *> *)mediaStreams;
@ -145,6 +158,7 @@ RTC_OBJC_EXPORT
@property(nonatomic, readonly, nullable) RTCSessionDescription *remoteDescription;
@property(nonatomic, readonly) RTCSignalingState signalingState;
@property(nonatomic, readonly) RTCIceConnectionState iceConnectionState;
@property(nonatomic, readonly) RTCPeerConnectionState connectionState;
@property(nonatomic, readonly) RTCIceGatheringState iceGatheringState;
@property(nonatomic, readonly, copy) RTCConfiguration *configuration;

View File

@ -175,11 +175,17 @@ void PeerConnectionDelegateAdapter::OnRenegotiationNeeded() {
void PeerConnectionDelegateAdapter::OnIceConnectionChange(
PeerConnectionInterface::IceConnectionState new_state) {
RTCIceConnectionState state =
[[RTCPeerConnection class] iceConnectionStateForNativeState:new_state];
RTCPeerConnection *peer_connection = peer_connection_;
[peer_connection.delegate peerConnection:peer_connection
didChangeIceConnectionState:state];
RTCIceConnectionState state = [RTCPeerConnection iceConnectionStateForNativeState:new_state];
[peer_connection_.delegate peerConnection:peer_connection_ didChangeIceConnectionState:state];
}
void PeerConnectionDelegateAdapter::OnConnectionChange(
PeerConnectionInterface::PeerConnectionState new_state) {
if ([peer_connection_.delegate
respondsToSelector:@selector(peerConnection:didChangeConnectionState:)]) {
RTCPeerConnectionState state = [RTCPeerConnection connectionStateForNativeState:new_state];
[peer_connection_.delegate peerConnection:peer_connection_ didChangeConnectionState:state];
}
}
void PeerConnectionDelegateAdapter::OnIceGatheringChange(
@ -322,6 +328,10 @@ void PeerConnectionDelegateAdapter::OnRemoveTrack(
_peerConnection->ice_connection_state()];
}
- (RTCPeerConnectionState)connectionState {
return [[self class] connectionStateForNativeState:_peerConnection->peer_connection_state()];
}
- (RTCIceGatheringState)iceGatheringState {
return [[self class] iceGatheringStateForNativeState:
_peerConnection->ice_gathering_state()];
@ -632,6 +642,59 @@ void PeerConnectionDelegateAdapter::OnRemoveTrack(
}
}
+ (webrtc::PeerConnectionInterface::PeerConnectionState)nativeConnectionStateForState:
(RTCPeerConnectionState)state {
switch (state) {
case RTCPeerConnectionStateNew:
return webrtc::PeerConnectionInterface::PeerConnectionState::kNew;
case RTCPeerConnectionStateConnecting:
return webrtc::PeerConnectionInterface::PeerConnectionState::kConnecting;
case RTCPeerConnectionStateConnected:
return webrtc::PeerConnectionInterface::PeerConnectionState::kConnected;
case RTCPeerConnectionStateFailed:
return webrtc::PeerConnectionInterface::PeerConnectionState::kFailed;
case RTCPeerConnectionStateDisconnected:
return webrtc::PeerConnectionInterface::PeerConnectionState::kDisconnected;
case RTCPeerConnectionStateClosed:
return webrtc::PeerConnectionInterface::PeerConnectionState::kClosed;
}
}
+ (RTCPeerConnectionState)connectionStateForNativeState:
(webrtc::PeerConnectionInterface::PeerConnectionState)nativeState {
switch (nativeState) {
case webrtc::PeerConnectionInterface::PeerConnectionState::kNew:
return RTCPeerConnectionStateNew;
case webrtc::PeerConnectionInterface::PeerConnectionState::kConnecting:
return RTCPeerConnectionStateConnecting;
case webrtc::PeerConnectionInterface::PeerConnectionState::kConnected:
return RTCPeerConnectionStateConnected;
case webrtc::PeerConnectionInterface::PeerConnectionState::kFailed:
return RTCPeerConnectionStateFailed;
case webrtc::PeerConnectionInterface::PeerConnectionState::kDisconnected:
return RTCPeerConnectionStateDisconnected;
case webrtc::PeerConnectionInterface::PeerConnectionState::kClosed:
return RTCPeerConnectionStateClosed;
}
}
+ (NSString *)stringForConnectionState:(RTCPeerConnectionState)state {
switch (state) {
case RTCPeerConnectionStateNew:
return @"NEW";
case RTCPeerConnectionStateConnecting:
return @"CONNECTING";
case RTCPeerConnectionStateConnected:
return @"CONNECTED";
case RTCPeerConnectionStateFailed:
return @"FAILED";
case RTCPeerConnectionStateDisconnected:
return @"DISCONNECTED";
case RTCPeerConnectionStateClosed:
return @"CLOSED";
}
}
+ (webrtc::PeerConnectionInterface::IceConnectionState)
nativeIceConnectionStateForState:(RTCIceConnectionState)state {
switch (state) {