Index: webrtc/examples/objc/AppRTCDemo/ARDAppEngineClient.m |
diff --git a/webrtc/examples/objc/AppRTCDemo/ARDAppEngineClient.m b/webrtc/examples/objc/AppRTCDemo/ARDAppEngineClient.m |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d707b92d4486be631f5de4deab0d91e4a662aff1 |
--- /dev/null |
+++ b/webrtc/examples/objc/AppRTCDemo/ARDAppEngineClient.m |
@@ -0,0 +1,175 @@ |
+/* |
+ * 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 "ARDAppEngineClient.h" |
+ |
+#import "WebRTC/RTCLogging.h" |
+ |
+#import "ARDJoinResponse.h" |
+#import "ARDMessageResponse.h" |
+#import "ARDSignalingMessage.h" |
+#import "ARDUtilities.h" |
+ |
+// TODO(tkchin): move these to a configuration object. |
+static NSString * const kARDRoomServerHostUrl = |
+ @"https://appr.tc"; |
+static NSString * const kARDRoomServerJoinFormat = |
+ @"https://appr.tc/join/%@"; |
+static NSString * const kARDRoomServerJoinFormatLoopback = |
+ @"https://appr.tc/join/%@?debug=loopback"; |
+static NSString * const kARDRoomServerMessageFormat = |
+ @"https://appr.tc/message/%@/%@"; |
+static NSString * const kARDRoomServerLeaveFormat = |
+ @"https://appr.tc/leave/%@/%@"; |
+ |
+static NSString * const kARDAppEngineClientErrorDomain = @"ARDAppEngineClient"; |
+static NSInteger const kARDAppEngineClientErrorBadResponse = -1; |
+ |
+@implementation ARDAppEngineClient |
+ |
+#pragma mark - ARDRoomServerClient |
+ |
+- (void)joinRoomWithRoomId:(NSString *)roomId |
+ isLoopback:(BOOL)isLoopback |
+ completionHandler:(void (^)(ARDJoinResponse *response, |
+ NSError *error))completionHandler { |
+ NSParameterAssert(roomId.length); |
+ |
+ NSString *urlString = nil; |
+ if (isLoopback) { |
+ urlString = |
+ [NSString stringWithFormat:kARDRoomServerJoinFormatLoopback, roomId]; |
+ } else { |
+ urlString = |
+ [NSString stringWithFormat:kARDRoomServerJoinFormat, roomId]; |
+ } |
+ |
+ NSURL *roomURL = [NSURL URLWithString:urlString]; |
+ RTCLog(@"Joining room:%@ on room server.", roomId); |
+ NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:roomURL]; |
+ request.HTTPMethod = @"POST"; |
+ __weak ARDAppEngineClient *weakSelf = self; |
+ [NSURLConnection sendAsyncRequest:request |
+ completionHandler:^(NSURLResponse *response, |
+ NSData *data, |
+ NSError *error) { |
+ ARDAppEngineClient *strongSelf = weakSelf; |
+ if (error) { |
+ if (completionHandler) { |
+ completionHandler(nil, error); |
+ } |
+ return; |
+ } |
+ ARDJoinResponse *joinResponse = |
+ [ARDJoinResponse responseFromJSONData:data]; |
+ if (!joinResponse) { |
+ if (completionHandler) { |
+ NSError *error = [[self class] badResponseError]; |
+ completionHandler(nil, error); |
+ } |
+ return; |
+ } |
+ if (completionHandler) { |
+ completionHandler(joinResponse, nil); |
+ } |
+ }]; |
+} |
+ |
+- (void)sendMessage:(ARDSignalingMessage *)message |
+ forRoomId:(NSString *)roomId |
+ clientId:(NSString *)clientId |
+ completionHandler:(void (^)(ARDMessageResponse *response, |
+ NSError *error))completionHandler { |
+ NSParameterAssert(message); |
+ NSParameterAssert(roomId.length); |
+ NSParameterAssert(clientId.length); |
+ |
+ NSData *data = [message JSONData]; |
+ NSString *urlString = |
+ [NSString stringWithFormat: |
+ kARDRoomServerMessageFormat, roomId, clientId]; |
+ NSURL *url = [NSURL URLWithString:urlString]; |
+ RTCLog(@"C->RS POST: %@", message); |
+ NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; |
+ request.HTTPMethod = @"POST"; |
+ request.HTTPBody = data; |
+ __weak ARDAppEngineClient *weakSelf = self; |
+ [NSURLConnection sendAsyncRequest:request |
+ completionHandler:^(NSURLResponse *response, |
+ NSData *data, |
+ NSError *error) { |
+ ARDAppEngineClient *strongSelf = weakSelf; |
+ if (error) { |
+ if (completionHandler) { |
+ completionHandler(nil, error); |
+ } |
+ return; |
+ } |
+ ARDMessageResponse *messageResponse = |
+ [ARDMessageResponse responseFromJSONData:data]; |
+ if (!messageResponse) { |
+ if (completionHandler) { |
+ NSError *error = [[self class] badResponseError]; |
+ completionHandler(nil, error); |
+ } |
+ return; |
+ } |
+ if (completionHandler) { |
+ completionHandler(messageResponse, nil); |
+ } |
+ }]; |
+} |
+ |
+- (void)leaveRoomWithRoomId:(NSString *)roomId |
+ clientId:(NSString *)clientId |
+ completionHandler:(void (^)(NSError *error))completionHandler { |
+ NSParameterAssert(roomId.length); |
+ NSParameterAssert(clientId.length); |
+ |
+ NSString *urlString = |
+ [NSString stringWithFormat:kARDRoomServerLeaveFormat, roomId, clientId]; |
+ NSURL *url = [NSURL URLWithString:urlString]; |
+ NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; |
+ request.HTTPMethod = @"POST"; |
+ NSURLResponse *response = nil; |
+ NSError *error = nil; |
+ // We want a synchronous request so that we know that we've left the room on |
+ // room server before we do any further work. |
+ RTCLog(@"C->RS: BYE"); |
+ [NSURLConnection sendSynchronousRequest:request |
+ returningResponse:&response |
+ error:&error]; |
+ if (error) { |
+ RTCLogError(@"Error leaving room %@ on room server: %@", |
+ roomId, error.localizedDescription); |
+ if (completionHandler) { |
+ completionHandler(error); |
+ } |
+ return; |
+ } |
+ RTCLog(@"Left room:%@ on room server.", roomId); |
+ if (completionHandler) { |
+ completionHandler(nil); |
+ } |
+} |
+ |
+#pragma mark - Private |
+ |
++ (NSError *)badResponseError { |
+ NSError *error = |
+ [[NSError alloc] initWithDomain:kARDAppEngineClientErrorDomain |
+ code:kARDAppEngineClientErrorBadResponse |
+ userInfo:@{ |
+ NSLocalizedDescriptionKey: @"Error parsing response.", |
+ }]; |
+ return error; |
+} |
+ |
+@end |