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+Private.h" 12 13#import "base/RTCLogging.h" 14#import "helpers/NSString+StdString.h" 15 16#include "rtc_base/checks.h" 17 18@implementation RTC_OBJC_TYPE (RTCSessionDescription) 19 20@synthesize type = _type; 21@synthesize sdp = _sdp; 22 23+ (NSString *)stringForType:(RTCSdpType)type { 24 std::string string = [[self class] stdStringForType:type]; 25 return [NSString stringForStdString:string]; 26} 27 28+ (RTCSdpType)typeForString:(NSString *)string { 29 std::string typeString = string.stdString; 30 return [[self class] typeForStdString:typeString]; 31} 32 33- (instancetype)initWithType:(RTCSdpType)type sdp:(NSString *)sdp { 34 NSParameterAssert(sdp.length); 35 if (self = [super init]) { 36 _type = type; 37 _sdp = [sdp copy]; 38 } 39 return self; 40} 41 42- (NSString *)description { 43 return [NSString stringWithFormat:@"RTC_OBJC_TYPE(RTCSessionDescription):\n%@\n%@", 44 [[self class] stringForType:_type], 45 _sdp]; 46} 47 48#pragma mark - Private 49 50- (webrtc::SessionDescriptionInterface *)nativeDescription { 51 webrtc::SdpParseError error; 52 53 webrtc::SessionDescriptionInterface *description = 54 webrtc::CreateSessionDescription([[self class] stdStringForType:_type], 55 _sdp.stdString, 56 &error); 57 58 if (!description) { 59 RTCLogError(@"Failed to create session description: %s\nline: %s", 60 error.description.c_str(), 61 error.line.c_str()); 62 } 63 64 return description; 65} 66 67- (instancetype)initWithNativeDescription: 68 (const webrtc::SessionDescriptionInterface *)nativeDescription { 69 NSParameterAssert(nativeDescription); 70 std::string sdp; 71 nativeDescription->ToString(&sdp); 72 RTCSdpType type = [[self class] typeForStdString:nativeDescription->type()]; 73 74 return [self initWithType:type 75 sdp:[NSString stringForStdString:sdp]]; 76} 77 78+ (std::string)stdStringForType:(RTCSdpType)type { 79 switch (type) { 80 case RTCSdpTypeOffer: 81 return webrtc::SessionDescriptionInterface::kOffer; 82 case RTCSdpTypePrAnswer: 83 return webrtc::SessionDescriptionInterface::kPrAnswer; 84 case RTCSdpTypeAnswer: 85 return webrtc::SessionDescriptionInterface::kAnswer; 86 } 87} 88 89+ (RTCSdpType)typeForStdString:(const std::string &)string { 90 if (string == webrtc::SessionDescriptionInterface::kOffer) { 91 return RTCSdpTypeOffer; 92 } else if (string == webrtc::SessionDescriptionInterface::kPrAnswer) { 93 return RTCSdpTypePrAnswer; 94 } else if (string == webrtc::SessionDescriptionInterface::kAnswer) { 95 return RTCSdpTypeAnswer; 96 } else { 97 RTC_NOTREACHED(); 98 return RTCSdpTypeOffer; 99 } 100} 101 102@end 103