xref: /aosp_15_r20/external/webrtc/examples/objc/AppRTCMobile/ARDSignalingMessage.m (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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