Home | History | Annotate | Download | only in objc
      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