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