diff --git a/sdk/objc/api/peerconnection/RTCSessionDescription.h b/sdk/objc/api/peerconnection/RTCSessionDescription.h index 8a9479d5cf..0ef60cc38d 100644 --- a/sdk/objc/api/peerconnection/RTCSessionDescription.h +++ b/sdk/objc/api/peerconnection/RTCSessionDescription.h @@ -36,8 +36,10 @@ RTC_OBJC_EXPORT - (instancetype)init NS_UNAVAILABLE; -/** Initialize a session description with a type and SDP string. */ -- (instancetype)initWithType:(RTCSdpType)type sdp:(NSString *)sdp NS_DESIGNATED_INITIALIZER; +/** Initialize a session description with a type and SDP string. Returns nil if the sdp is invalid. + */ +- (nullable instancetype)initWithType:(RTCSdpType)type + sdp:(NSString *)sdp NS_DESIGNATED_INITIALIZER; + (NSString *)stringForType:(RTCSdpType)type; diff --git a/sdk/objc/api/peerconnection/RTCSessionDescription.mm b/sdk/objc/api/peerconnection/RTCSessionDescription.mm index 9fd97fee23..3e235b1985 100644 --- a/sdk/objc/api/peerconnection/RTCSessionDescription.mm +++ b/sdk/objc/api/peerconnection/RTCSessionDescription.mm @@ -17,23 +17,45 @@ @implementation RTC_OBJC_TYPE (RTCSessionDescription) +@synthesize nativeDescription = _nativeDescription; @synthesize type = _type; @synthesize sdp = _sdp; + (NSString *)stringForType:(RTCSdpType)type { - std::string string = [[self class] stdStringForType:type]; + std::string string = [self stdStringForType:type]; return [NSString stringForStdString:string]; } + (RTCSdpType)typeForString:(NSString *)string { std::string typeString = string.stdString; - return [[self class] typeForStdString:typeString]; + return [self typeForStdString:typeString]; } -- (instancetype)initWithType:(RTCSdpType)type sdp:(NSString *)sdp { ++ (webrtc::SessionDescriptionInterface *)nativeDescriptionForString:(NSString *)sdp + type:(RTCSdpType)type { + webrtc::SdpParseError error; + + webrtc::SessionDescriptionInterface *description = + webrtc::CreateSessionDescription([self stdStringForType:type], sdp.stdString, &error); + + if (!description) { + RTCLogError(@"Failed to create session description: %s\nline: %s", + error.description.c_str(), + error.line.c_str()); + } + + return description; +} + +- (nullable instancetype)initWithType:(RTCSdpType)type sdp:(NSString *)sdp { if (self = [super init]) { _type = type; _sdp = [sdp copy]; + _nativeDescription = [[self class] nativeDescriptionForString:_sdp type:_type]; + + if (_nativeDescription == nil) { + return nil; + } } return self; } @@ -46,23 +68,6 @@ #pragma mark - Private -- (webrtc::SessionDescriptionInterface *)nativeDescription { - webrtc::SdpParseError error; - - webrtc::SessionDescriptionInterface *description = - webrtc::CreateSessionDescription([[self class] stdStringForType:_type], - _sdp.stdString, - &error); - - if (!description) { - RTCLogError(@"Failed to create session description: %s\nline: %s", - error.description.c_str(), - error.line.c_str()); - } - - return description; -} - - (instancetype)initWithNativeDescription: (const webrtc::SessionDescriptionInterface *)nativeDescription { NSParameterAssert(nativeDescription); diff --git a/sdk/objc/unittests/RTCSessionDescriptionTest.mm b/sdk/objc/unittests/RTCSessionDescriptionTest.mm index ee65649cbc..1f8a75d16f 100644 --- a/sdk/objc/unittests/RTCSessionDescriptionTest.mm +++ b/sdk/objc/unittests/RTCSessionDescriptionTest.mm @@ -42,6 +42,13 @@ EXPECT_EQ([self sdp].stdString, sdp); } +- (void)testInvalidSessionDescriptionConversion { + RTC_OBJC_TYPE(RTCSessionDescription) *description = + [[RTC_OBJC_TYPE(RTCSessionDescription) alloc] initWithType:RTCSdpTypeAnswer sdp:@"invalid"]; + + EXPECT_EQ(nil, description); +} + - (void)testInitFromNativeSessionDescription { webrtc::SessionDescriptionInterface *nativeDescription; @@ -135,6 +142,13 @@ TEST(RTCSessionDescriptionTest, SessionDescriptionConversionTest) { } } +TEST(RTCSessionDescriptionTest, InvalidSessionDescriptionConversionTest) { + @autoreleasepool { + RTCSessionDescriptionTest *test = [[RTCSessionDescriptionTest alloc] init]; + [test testInvalidSessionDescriptionConversion]; + } +} + TEST(RTCSessionDescriptionTest, InitFromSessionDescriptionTest) { @autoreleasepool { RTCSessionDescriptionTest *test = [[RTCSessionDescriptionTest alloc] init];