1/* 2 * Copyright 2014 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 "RTCIceCandidate+JSON.h" 12 13#import "sdk/objc/base/RTCLogging.h" 14 15static NSString const *kRTCICECandidateTypeKey = @"type"; 16static NSString const *kRTCICECandidateTypeValue = @"candidate"; 17static NSString const *kRTCICECandidateMidKey = @"id"; 18static NSString const *kRTCICECandidateMLineIndexKey = @"label"; 19static NSString const *kRTCICECandidateSdpKey = @"candidate"; 20static NSString const *kRTCICECandidatesTypeKey = @"candidates"; 21 22@implementation RTC_OBJC_TYPE (RTCIceCandidate) 23(JSON) 24 25 + (RTC_OBJC_TYPE(RTCIceCandidate) *)candidateFromJSONDictionary : (NSDictionary *)dictionary { 26 NSString *mid = dictionary[kRTCICECandidateMidKey]; 27 NSString *sdp = dictionary[kRTCICECandidateSdpKey]; 28 NSNumber *num = dictionary[kRTCICECandidateMLineIndexKey]; 29 NSInteger mLineIndex = [num integerValue]; 30 return [[RTC_OBJC_TYPE(RTCIceCandidate) alloc] initWithSdp:sdp 31 sdpMLineIndex:mLineIndex 32 sdpMid:mid]; 33} 34 35+ (NSData *)JSONDataForIceCandidates:(NSArray<RTC_OBJC_TYPE(RTCIceCandidate) *> *)candidates 36 withType:(NSString *)typeValue { 37 NSMutableArray *jsonCandidates = 38 [NSMutableArray arrayWithCapacity:candidates.count]; 39 for (RTC_OBJC_TYPE(RTCIceCandidate) * candidate in candidates) { 40 NSDictionary *jsonCandidate = [candidate JSONDictionary]; 41 [jsonCandidates addObject:jsonCandidate]; 42 } 43 NSDictionary *json = @{ 44 kRTCICECandidateTypeKey : typeValue, 45 kRTCICECandidatesTypeKey : jsonCandidates 46 }; 47 NSError *error = nil; 48 NSData *data = 49 [NSJSONSerialization dataWithJSONObject:json 50 options:NSJSONWritingPrettyPrinted 51 error:&error]; 52 if (error) { 53 RTCLogError(@"Error serializing JSON: %@", error); 54 return nil; 55 } 56 return data; 57} 58 59+ (NSArray<RTC_OBJC_TYPE(RTCIceCandidate) *> *)candidatesFromJSONDictionary: 60 (NSDictionary *)dictionary { 61 NSArray *jsonCandidates = dictionary[kRTCICECandidatesTypeKey]; 62 NSMutableArray<RTC_OBJC_TYPE(RTCIceCandidate) *> *candidates = 63 [NSMutableArray arrayWithCapacity:jsonCandidates.count]; 64 for (NSDictionary *jsonCandidate in jsonCandidates) { 65 RTC_OBJC_TYPE(RTCIceCandidate) *candidate = 66 [RTC_OBJC_TYPE(RTCIceCandidate) candidateFromJSONDictionary:jsonCandidate]; 67 [candidates addObject:candidate]; 68 } 69 return candidates; 70} 71 72- (NSData *)JSONData { 73 NSDictionary *json = @{ 74 kRTCICECandidateTypeKey : kRTCICECandidateTypeValue, 75 kRTCICECandidateMLineIndexKey : @(self.sdpMLineIndex), 76 kRTCICECandidateMidKey : self.sdpMid, 77 kRTCICECandidateSdpKey : self.sdp 78 }; 79 NSError *error = nil; 80 NSData *data = 81 [NSJSONSerialization dataWithJSONObject:json 82 options:NSJSONWritingPrettyPrinted 83 error:&error]; 84 if (error) { 85 RTCLogError(@"Error serializing JSON: %@", error); 86 return nil; 87 } 88 return data; 89} 90 91- (NSDictionary *)JSONDictionary{ 92 NSDictionary *json = @{ 93 kRTCICECandidateMLineIndexKey : @(self.sdpMLineIndex), 94 kRTCICECandidateMidKey : self.sdpMid, 95 kRTCICECandidateSdpKey : self.sdp 96 }; 97 return json; 98} 99 100@end 101