зеркало из https://github.com/nextcloud/talk-ios.git
192 строки
6.1 KiB
Objective-C
192 строки
6.1 KiB
Objective-C
//
|
|
// NCSignalingController.m
|
|
// VideoCalls
|
|
//
|
|
// Created by Ivan Sein on 01.10.17.
|
|
// Copyright © 2017 struktur AG. All rights reserved.
|
|
//
|
|
|
|
#import "NCSignalingController.h"
|
|
|
|
#import "NCAPIController.h"
|
|
#import "NCSettingsController.h"
|
|
#import <WebRTC/RTCIceServer.h>
|
|
|
|
@interface NCSignalingController()
|
|
{
|
|
NCRoom *_room;
|
|
BOOL _multiRoomSupport;
|
|
BOOL _shouldStopPullingMessages;
|
|
NSTimer *_pingTimer;
|
|
NSDictionary *_signalingSettings;
|
|
NSURLSessionTask *_getSignalingSettingsTask;
|
|
NSURLSessionTask *_pullSignalingMessagesTask;
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation NCSignalingController
|
|
|
|
- (instancetype)initForRoom:(NCRoom *)room
|
|
{
|
|
self = [super init];
|
|
if (self) {
|
|
_room = room;
|
|
[self checkServerCapabilities];
|
|
[self getSignalingSettings];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
NSLog(@"NCSignalingController dealloc");
|
|
}
|
|
|
|
- (void)getSignalingSettings
|
|
{
|
|
_getSignalingSettingsTask = [[NCAPIController sharedInstance] getSignalingSettingsWithCompletionBlock:^(NSDictionary *settings, NSError *error) {
|
|
if (error) {
|
|
//TODO: Error handling
|
|
NSLog(@"Error getting signaling settings.");
|
|
}
|
|
|
|
if (settings) {
|
|
_signalingSettings = [[settings objectForKey:@"ocs"] objectForKey:@"data"];
|
|
}
|
|
}];
|
|
}
|
|
|
|
- (NSArray *)getIceServers
|
|
{
|
|
NSMutableArray *servers = [[NSMutableArray alloc] init];
|
|
|
|
if (_signalingSettings) {
|
|
NSArray *stunServers = [_signalingSettings objectForKey:@"stunservers"];
|
|
for (NSDictionary *stunServer in stunServers) {
|
|
NSString *stunURL = [stunServer objectForKey:@"url"];
|
|
RTCIceServer *iceServer = [[RTCIceServer alloc] initWithURLStrings:@[stunURL]
|
|
username:@""
|
|
credential:@""];
|
|
[servers addObject:iceServer];
|
|
}
|
|
NSArray *turnServers = [_signalingSettings objectForKey:@"turnservers"];
|
|
for (NSDictionary *turnServer in turnServers) {
|
|
NSString *turnURL = [turnServer objectForKey:@"url"][0];
|
|
NSString *turnUserName = [turnServer objectForKey:@"username"];
|
|
NSString *turnCredential = [turnServer objectForKey:@"credential"];
|
|
RTCIceServer *iceServer = [[RTCIceServer alloc] initWithURLStrings:@[turnURL]
|
|
username:turnUserName
|
|
credential:turnCredential];
|
|
[servers addObject:iceServer];
|
|
}
|
|
}
|
|
|
|
NSArray *iceServers = [NSArray arrayWithArray:servers];
|
|
return iceServers;
|
|
}
|
|
|
|
- (void)startPullingSignalingMessages
|
|
{
|
|
_shouldStopPullingMessages = NO;
|
|
[self pullSignalingMessages];
|
|
}
|
|
|
|
- (void)stopPullingSignalingMessages
|
|
{
|
|
_shouldStopPullingMessages = YES;
|
|
[_pullSignalingMessagesTask cancel];
|
|
}
|
|
|
|
- (void)pullSignalingMessages
|
|
{
|
|
PullSignalingMessagesCompletionBlock pullSignalingMessagesBlock = ^(NSDictionary *messages, NSError *error)
|
|
{
|
|
if (_shouldStopPullingMessages) {
|
|
return;
|
|
}
|
|
|
|
id messagesObj = [[messages objectForKey:@"ocs"] objectForKey:@"data"];
|
|
NSArray *messagesArray = [[NSArray alloc] init];
|
|
|
|
// Check if messages array was parsed correctly
|
|
if ([messagesObj isKindOfClass:[NSArray class]]) {
|
|
messagesArray = messagesObj;
|
|
}else if ([messagesObj isKindOfClass:[NSDictionary class]]) {
|
|
messagesArray = [messagesObj allValues];
|
|
}
|
|
|
|
for (NSDictionary *message in messagesArray) {
|
|
if ([self.observer respondsToSelector:@selector(signalingController:didReceiveSignalingMessage:)]) {
|
|
[self.observer signalingController:self didReceiveSignalingMessage:message];
|
|
}
|
|
}
|
|
[self pullSignalingMessages];
|
|
};
|
|
|
|
if (_multiRoomSupport) {
|
|
_pullSignalingMessagesTask = [[NCAPIController sharedInstance] pullSignalingMessagesFromRoom:_room.token withCompletionBlock:pullSignalingMessagesBlock];
|
|
} else {
|
|
_pullSignalingMessagesTask = [[NCAPIController sharedInstance] pullSignalingMessagesWithCompletionBlock:pullSignalingMessagesBlock];
|
|
}
|
|
}
|
|
|
|
- (void)sendSignalingMessage:(NCSignalingMessage *)message
|
|
{
|
|
NSArray *messagesArray = [NSArray arrayWithObjects:[message messageDict], nil];
|
|
NSString *JSONSerializedMessages = [self messagesJSONSerialization:messagesArray];
|
|
|
|
SendSignalingMessagesCompletionBlock sendSignalingMessagesBlock = ^(NSError *error)
|
|
{
|
|
if (error) {
|
|
//TODO: Error handling
|
|
NSLog(@"Error sending signaling message.");
|
|
}
|
|
NSLog(@"Sent %@", JSONSerializedMessages);
|
|
};
|
|
|
|
if (_multiRoomSupport) {
|
|
[[NCAPIController sharedInstance] sendSignalingMessages:JSONSerializedMessages toRoom:_room.token withCompletionBlock:sendSignalingMessagesBlock];
|
|
} else {
|
|
[[NCAPIController sharedInstance] sendSignalingMessages:JSONSerializedMessages withCompletionBlock:sendSignalingMessagesBlock];
|
|
}
|
|
}
|
|
|
|
- (NSString *)messagesJSONSerialization:(NSArray *)messages
|
|
{
|
|
NSError *error;
|
|
NSString *jsonString = nil;
|
|
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:messages
|
|
options:0
|
|
error:&error];
|
|
|
|
if (! jsonData) {
|
|
NSLog(@"Got an error: %@", error);
|
|
} else {
|
|
jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
|
|
}
|
|
|
|
return jsonString;
|
|
}
|
|
|
|
- (void)checkServerCapabilities
|
|
{
|
|
NSDictionary *talkCapabilities = [NCSettingsController sharedInstance].ncTalkCapabilities;
|
|
if (talkCapabilities) {
|
|
NSArray *talkFeatures = [talkCapabilities objectForKey:@"features"];
|
|
if ([talkFeatures containsObject:@"multi-room-users"]) {
|
|
_multiRoomSupport = YES;
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void)stopAllRequests
|
|
{
|
|
[_getSignalingSettingsTask cancel];
|
|
_getSignalingSettingsTask = nil;
|
|
|
|
[self stopPullingSignalingMessages];
|
|
}
|
|
|
|
@end
|