1*d9f75844SAndroid Build Coastguard Worker/* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2014 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 "ARDSignalingMessage.h" 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard Worker#import "sdk/objc/base/RTCLogging.h" 14*d9f75844SAndroid Build Coastguard Worker 15*d9f75844SAndroid Build Coastguard Worker#import "ARDUtilities.h" 16*d9f75844SAndroid Build Coastguard Worker#import "RTCIceCandidate+JSON.h" 17*d9f75844SAndroid Build Coastguard Worker#import "RTCSessionDescription+JSON.h" 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard Workerstatic NSString * const kARDSignalingMessageTypeKey = @"type"; 20*d9f75844SAndroid Build Coastguard Workerstatic NSString * const kARDTypeValueRemoveCandidates = @"remove-candidates"; 21*d9f75844SAndroid Build Coastguard Worker 22*d9f75844SAndroid Build Coastguard Worker@implementation ARDSignalingMessage 23*d9f75844SAndroid Build Coastguard Worker 24*d9f75844SAndroid Build Coastguard Worker@synthesize type = _type; 25*d9f75844SAndroid Build Coastguard Worker 26*d9f75844SAndroid Build Coastguard Worker- (instancetype)initWithType:(ARDSignalingMessageType)type { 27*d9f75844SAndroid Build Coastguard Worker if (self = [super init]) { 28*d9f75844SAndroid Build Coastguard Worker _type = type; 29*d9f75844SAndroid Build Coastguard Worker } 30*d9f75844SAndroid Build Coastguard Worker return self; 31*d9f75844SAndroid Build Coastguard Worker} 32*d9f75844SAndroid Build Coastguard Worker 33*d9f75844SAndroid Build Coastguard Worker- (NSString *)description { 34*d9f75844SAndroid Build Coastguard Worker return [[NSString alloc] initWithData:[self JSONData] 35*d9f75844SAndroid Build Coastguard Worker encoding:NSUTF8StringEncoding]; 36*d9f75844SAndroid Build Coastguard Worker} 37*d9f75844SAndroid Build Coastguard Worker 38*d9f75844SAndroid Build Coastguard Worker+ (ARDSignalingMessage *)messageFromJSONString:(NSString *)jsonString { 39*d9f75844SAndroid Build Coastguard Worker NSDictionary *values = [NSDictionary dictionaryWithJSONString:jsonString]; 40*d9f75844SAndroid Build Coastguard Worker if (!values) { 41*d9f75844SAndroid Build Coastguard Worker RTCLogError(@"Error parsing signaling message JSON."); 42*d9f75844SAndroid Build Coastguard Worker return nil; 43*d9f75844SAndroid Build Coastguard Worker } 44*d9f75844SAndroid Build Coastguard Worker 45*d9f75844SAndroid Build Coastguard Worker NSString *typeString = values[kARDSignalingMessageTypeKey]; 46*d9f75844SAndroid Build Coastguard Worker ARDSignalingMessage *message = nil; 47*d9f75844SAndroid Build Coastguard Worker if ([typeString isEqualToString:@"candidate"]) { 48*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCIceCandidate) *candidate = 49*d9f75844SAndroid Build Coastguard Worker [RTC_OBJC_TYPE(RTCIceCandidate) candidateFromJSONDictionary:values]; 50*d9f75844SAndroid Build Coastguard Worker message = [[ARDICECandidateMessage alloc] initWithCandidate:candidate]; 51*d9f75844SAndroid Build Coastguard Worker } else if ([typeString isEqualToString:kARDTypeValueRemoveCandidates]) { 52*d9f75844SAndroid Build Coastguard Worker RTCLogInfo(@"Received remove-candidates message"); 53*d9f75844SAndroid Build Coastguard Worker NSArray<RTC_OBJC_TYPE(RTCIceCandidate) *> *candidates = 54*d9f75844SAndroid Build Coastguard Worker [RTC_OBJC_TYPE(RTCIceCandidate) candidatesFromJSONDictionary:values]; 55*d9f75844SAndroid Build Coastguard Worker message = [[ARDICECandidateRemovalMessage alloc] 56*d9f75844SAndroid Build Coastguard Worker initWithRemovedCandidates:candidates]; 57*d9f75844SAndroid Build Coastguard Worker } else if ([typeString isEqualToString:@"offer"] || 58*d9f75844SAndroid Build Coastguard Worker [typeString isEqualToString:@"answer"]) { 59*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCSessionDescription) *description = 60*d9f75844SAndroid Build Coastguard Worker [RTC_OBJC_TYPE(RTCSessionDescription) descriptionFromJSONDictionary:values]; 61*d9f75844SAndroid Build Coastguard Worker message = 62*d9f75844SAndroid Build Coastguard Worker [[ARDSessionDescriptionMessage alloc] initWithDescription:description]; 63*d9f75844SAndroid Build Coastguard Worker } else if ([typeString isEqualToString:@"bye"]) { 64*d9f75844SAndroid Build Coastguard Worker message = [[ARDByeMessage alloc] init]; 65*d9f75844SAndroid Build Coastguard Worker } else { 66*d9f75844SAndroid Build Coastguard Worker RTCLogError(@"Unexpected type: %@", typeString); 67*d9f75844SAndroid Build Coastguard Worker } 68*d9f75844SAndroid Build Coastguard Worker return message; 69*d9f75844SAndroid Build Coastguard Worker} 70*d9f75844SAndroid Build Coastguard Worker 71*d9f75844SAndroid Build Coastguard Worker- (NSData *)JSONData { 72*d9f75844SAndroid Build Coastguard Worker return nil; 73*d9f75844SAndroid Build Coastguard Worker} 74*d9f75844SAndroid Build Coastguard Worker 75*d9f75844SAndroid Build Coastguard Worker@end 76*d9f75844SAndroid Build Coastguard Worker 77*d9f75844SAndroid Build Coastguard Worker@implementation ARDICECandidateMessage 78*d9f75844SAndroid Build Coastguard Worker 79*d9f75844SAndroid Build Coastguard Worker@synthesize candidate = _candidate; 80*d9f75844SAndroid Build Coastguard Worker 81*d9f75844SAndroid Build Coastguard Worker- (instancetype)initWithCandidate:(RTC_OBJC_TYPE(RTCIceCandidate) *)candidate { 82*d9f75844SAndroid Build Coastguard Worker if (self = [super initWithType:kARDSignalingMessageTypeCandidate]) { 83*d9f75844SAndroid Build Coastguard Worker _candidate = candidate; 84*d9f75844SAndroid Build Coastguard Worker } 85*d9f75844SAndroid Build Coastguard Worker return self; 86*d9f75844SAndroid Build Coastguard Worker} 87*d9f75844SAndroid Build Coastguard Worker 88*d9f75844SAndroid Build Coastguard Worker- (NSData *)JSONData { 89*d9f75844SAndroid Build Coastguard Worker return [_candidate JSONData]; 90*d9f75844SAndroid Build Coastguard Worker} 91*d9f75844SAndroid Build Coastguard Worker 92*d9f75844SAndroid Build Coastguard Worker@end 93*d9f75844SAndroid Build Coastguard Worker 94*d9f75844SAndroid Build Coastguard Worker@implementation ARDICECandidateRemovalMessage 95*d9f75844SAndroid Build Coastguard Worker 96*d9f75844SAndroid Build Coastguard Worker@synthesize candidates = _candidates; 97*d9f75844SAndroid Build Coastguard Worker 98*d9f75844SAndroid Build Coastguard Worker- (instancetype)initWithRemovedCandidates:(NSArray<RTC_OBJC_TYPE(RTCIceCandidate) *> *)candidates { 99*d9f75844SAndroid Build Coastguard Worker NSParameterAssert(candidates.count); 100*d9f75844SAndroid Build Coastguard Worker if (self = [super initWithType:kARDSignalingMessageTypeCandidateRemoval]) { 101*d9f75844SAndroid Build Coastguard Worker _candidates = candidates; 102*d9f75844SAndroid Build Coastguard Worker } 103*d9f75844SAndroid Build Coastguard Worker return self; 104*d9f75844SAndroid Build Coastguard Worker} 105*d9f75844SAndroid Build Coastguard Worker 106*d9f75844SAndroid Build Coastguard Worker- (NSData *)JSONData { 107*d9f75844SAndroid Build Coastguard Worker return [RTC_OBJC_TYPE(RTCIceCandidate) JSONDataForIceCandidates:_candidates 108*d9f75844SAndroid Build Coastguard Worker withType:kARDTypeValueRemoveCandidates]; 109*d9f75844SAndroid Build Coastguard Worker} 110*d9f75844SAndroid Build Coastguard Worker 111*d9f75844SAndroid Build Coastguard Worker@end 112*d9f75844SAndroid Build Coastguard Worker 113*d9f75844SAndroid Build Coastguard Worker@implementation ARDSessionDescriptionMessage 114*d9f75844SAndroid Build Coastguard Worker 115*d9f75844SAndroid Build Coastguard Worker@synthesize sessionDescription = _sessionDescription; 116*d9f75844SAndroid Build Coastguard Worker 117*d9f75844SAndroid Build Coastguard Worker- (instancetype)initWithDescription:(RTC_OBJC_TYPE(RTCSessionDescription) *)description { 118*d9f75844SAndroid Build Coastguard Worker ARDSignalingMessageType messageType = kARDSignalingMessageTypeOffer; 119*d9f75844SAndroid Build Coastguard Worker RTCSdpType sdpType = description.type; 120*d9f75844SAndroid Build Coastguard Worker switch (sdpType) { 121*d9f75844SAndroid Build Coastguard Worker case RTCSdpTypeOffer: 122*d9f75844SAndroid Build Coastguard Worker messageType = kARDSignalingMessageTypeOffer; 123*d9f75844SAndroid Build Coastguard Worker break; 124*d9f75844SAndroid Build Coastguard Worker case RTCSdpTypeAnswer: 125*d9f75844SAndroid Build Coastguard Worker messageType = kARDSignalingMessageTypeAnswer; 126*d9f75844SAndroid Build Coastguard Worker break; 127*d9f75844SAndroid Build Coastguard Worker case RTCSdpTypePrAnswer: 128*d9f75844SAndroid Build Coastguard Worker case RTCSdpTypeRollback: 129*d9f75844SAndroid Build Coastguard Worker NSAssert( 130*d9f75844SAndroid Build Coastguard Worker NO, @"Unexpected type: %@", [RTC_OBJC_TYPE(RTCSessionDescription) stringForType:sdpType]); 131*d9f75844SAndroid Build Coastguard Worker break; 132*d9f75844SAndroid Build Coastguard Worker } 133*d9f75844SAndroid Build Coastguard Worker if (self = [super initWithType:messageType]) { 134*d9f75844SAndroid Build Coastguard Worker _sessionDescription = description; 135*d9f75844SAndroid Build Coastguard Worker } 136*d9f75844SAndroid Build Coastguard Worker return self; 137*d9f75844SAndroid Build Coastguard Worker} 138*d9f75844SAndroid Build Coastguard Worker 139*d9f75844SAndroid Build Coastguard Worker- (NSData *)JSONData { 140*d9f75844SAndroid Build Coastguard Worker return [_sessionDescription JSONData]; 141*d9f75844SAndroid Build Coastguard Worker} 142*d9f75844SAndroid Build Coastguard Worker 143*d9f75844SAndroid Build Coastguard Worker@end 144*d9f75844SAndroid Build Coastguard Worker 145*d9f75844SAndroid Build Coastguard Worker@implementation ARDByeMessage 146*d9f75844SAndroid Build Coastguard Worker 147*d9f75844SAndroid Build Coastguard Worker- (instancetype)init { 148*d9f75844SAndroid Build Coastguard Worker return [super initWithType:kARDSignalingMessageTypeBye]; 149*d9f75844SAndroid Build Coastguard Worker} 150*d9f75844SAndroid Build Coastguard Worker 151*d9f75844SAndroid Build Coastguard Worker- (NSData *)JSONData { 152*d9f75844SAndroid Build Coastguard Worker NSDictionary *message = @{ 153*d9f75844SAndroid Build Coastguard Worker @"type": @"bye" 154*d9f75844SAndroid Build Coastguard Worker }; 155*d9f75844SAndroid Build Coastguard Worker return [NSJSONSerialization dataWithJSONObject:message 156*d9f75844SAndroid Build Coastguard Worker options:NSJSONWritingPrettyPrinted 157*d9f75844SAndroid Build Coastguard Worker error:NULL]; 158*d9f75844SAndroid Build Coastguard Worker} 159*d9f75844SAndroid Build Coastguard Worker 160*d9f75844SAndroid Build Coastguard Worker@end 161