1/* 2 * Copyright 2015 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11#import "RTCSessionDescription.h" 12 13#include "webrtc/base/checks.h" 14 15#import "webrtc/api/objc/RTCSessionDescription+Private.h" 16#import "webrtc/base/objc/NSString+StdString.h" 17#import "webrtc/base/objc/RTCLogging.h" 18 19@implementation RTCSessionDescription 20 21@synthesize type = _type; 22@synthesize sdp = _sdp; 23 24- (instancetype)initWithType:(RTCSdpType)type sdp:(NSString *)sdp { 25 NSParameterAssert(sdp.length); 26 if (self = [super init]) { 27 _type = type; 28 _sdp = [sdp copy]; 29 } 30 return self; 31} 32 33- (NSString *)description { 34 return [NSString stringWithFormat:@"RTCSessionDescription:\n%s\n%@", 35 [[self class] stringForType:_type].c_str(), 36 _sdp]; 37} 38 39#pragma mark - Private 40 41- (webrtc::SessionDescriptionInterface *)nativeDescription { 42 webrtc::SdpParseError error; 43 44 webrtc::SessionDescriptionInterface *description = 45 webrtc::CreateSessionDescription([[self class] stringForType:_type], 46 _sdp.stdString, 47 &error); 48 49 if (!description) { 50 RTCLogError(@"Failed to create session description: %s\nline: %s", 51 error.description.c_str(), 52 error.line.c_str()); 53 } 54 55 return description; 56} 57 58- (instancetype)initWithNativeDescription: 59 (webrtc::SessionDescriptionInterface *)nativeDescription { 60 NSParameterAssert(nativeDescription); 61 std::string sdp; 62 nativeDescription->ToString(&sdp); 63 RTCSdpType type = [[self class] typeForString:nativeDescription->type()]; 64 65 return [self initWithType:type 66 sdp:[NSString stringForStdString:sdp]]; 67} 68 69+ (std::string)stringForType:(RTCSdpType)type { 70 switch (type) { 71 case RTCSdpTypeOffer: 72 return webrtc::SessionDescriptionInterface::kOffer; 73 case RTCSdpTypePrAnswer: 74 return webrtc::SessionDescriptionInterface::kPrAnswer; 75 case RTCSdpTypeAnswer: 76 return webrtc::SessionDescriptionInterface::kAnswer; 77 } 78} 79 80+ (RTCSdpType)typeForString:(const std::string &)string { 81 if (string == webrtc::SessionDescriptionInterface::kOffer) { 82 return RTCSdpTypeOffer; 83 } else if (string == webrtc::SessionDescriptionInterface::kPrAnswer) { 84 return RTCSdpTypePrAnswer; 85 } else if (string == webrtc::SessionDescriptionInterface::kAnswer) { 86 return RTCSdpTypeAnswer; 87 } else { 88 RTC_NOTREACHED(); 89 } 90} 91 92@end 93