/* * Copyright 2014 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #import "RTCIceCandidate+JSON.h" #import "sdk/objc/base/RTCLogging.h" static NSString const *kRTCICECandidateTypeKey = @"type"; static NSString const *kRTCICECandidateTypeValue = @"candidate"; static NSString const *kRTCICECandidateMidKey = @"id"; static NSString const *kRTCICECandidateMLineIndexKey = @"label"; static NSString const *kRTCICECandidateSdpKey = @"candidate"; static NSString const *kRTCICECandidatesTypeKey = @"candidates"; @implementation RTC_OBJC_TYPE (RTCIceCandidate) (JSON) + (RTC_OBJC_TYPE(RTCIceCandidate) *)candidateFromJSONDictionary : (NSDictionary *)dictionary { NSString *mid = dictionary[kRTCICECandidateMidKey]; NSString *sdp = dictionary[kRTCICECandidateSdpKey]; NSNumber *num = dictionary[kRTCICECandidateMLineIndexKey]; NSInteger mLineIndex = [num integerValue]; return [[RTC_OBJC_TYPE(RTCIceCandidate) alloc] initWithSdp:sdp sdpMLineIndex:mLineIndex sdpMid:mid]; } + (NSData *)JSONDataForIceCandidates:(NSArray *)candidates withType:(NSString *)typeValue { NSMutableArray *jsonCandidates = [NSMutableArray arrayWithCapacity:candidates.count]; for (RTC_OBJC_TYPE(RTCIceCandidate) * candidate in candidates) { NSDictionary *jsonCandidate = [candidate JSONDictionary]; [jsonCandidates addObject:jsonCandidate]; } NSDictionary *json = @{ kRTCICECandidateTypeKey : typeValue, kRTCICECandidatesTypeKey : jsonCandidates }; NSError *error = nil; NSData *data = [NSJSONSerialization dataWithJSONObject:json options:NSJSONWritingPrettyPrinted error:&error]; if (error) { RTCLogError(@"Error serializing JSON: %@", error); return nil; } return data; } + (NSArray *)candidatesFromJSONDictionary: (NSDictionary *)dictionary { NSArray *jsonCandidates = dictionary[kRTCICECandidatesTypeKey]; NSMutableArray *candidates = [NSMutableArray arrayWithCapacity:jsonCandidates.count]; for (NSDictionary *jsonCandidate in jsonCandidates) { RTC_OBJC_TYPE(RTCIceCandidate) *candidate = [RTC_OBJC_TYPE(RTCIceCandidate) candidateFromJSONDictionary:jsonCandidate]; [candidates addObject:candidate]; } return candidates; } - (NSData *)JSONData { NSDictionary *json = @{ kRTCICECandidateTypeKey : kRTCICECandidateTypeValue, kRTCICECandidateMLineIndexKey : @(self.sdpMLineIndex), kRTCICECandidateMidKey : self.sdpMid, kRTCICECandidateSdpKey : self.sdp }; NSError *error = nil; NSData *data = [NSJSONSerialization dataWithJSONObject:json options:NSJSONWritingPrettyPrinted error:&error]; if (error) { RTCLogError(@"Error serializing JSON: %@", error); return nil; } return data; } - (NSDictionary *)JSONDictionary{ NSDictionary *json = @{ kRTCICECandidateMLineIndexKey : @(self.sdpMLineIndex), kRTCICECandidateMidKey : self.sdpMid, kRTCICECandidateSdpKey : self.sdp }; return json; } @end