NCSignalingController.m 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /**
  2. * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
  3. * SPDX-License-Identifier: GPL-3.0-or-later
  4. */
  5. #import "NCSignalingController.h"
  6. #import <WebRTC/RTCIceServer.h>
  7. #import "NCAPIController.h"
  8. #import "NCDatabaseManager.h"
  9. #import "NextcloudTalk-Swift.h"
  10. @interface NCSignalingController()
  11. {
  12. NCRoom *_room;
  13. BOOL _shouldStopPullingMessages;
  14. SignalingSettings *_signalingSettings;
  15. NSURLSessionTask *_getSignalingSettingsTask;
  16. NSURLSessionTask *_pullSignalingMessagesTask;
  17. }
  18. @end
  19. @implementation NCSignalingController
  20. - (instancetype)initForRoom:(NCRoom *)room
  21. {
  22. self = [super init];
  23. if (self) {
  24. _room = room;
  25. }
  26. return self;
  27. }
  28. - (void)dealloc
  29. {
  30. NSLog(@"NCSignalingController dealloc");
  31. }
  32. - (void)updateSignalingSettingsWithCompletionBlock:(SignalingSettingsUpdatedCompletionBlock)block
  33. {
  34. TalkAccount *activeAccount = [[NCDatabaseManager sharedInstance] activeAccount];
  35. _getSignalingSettingsTask = [[NCAPIController sharedInstance] getSignalingSettingsFor:activeAccount forRoom:_room.token completionBlock:^(SignalingSettings * _Nullable settings, NSError * _Nullable error) {
  36. if (error) {
  37. if (error.code == NSURLErrorCancelled) {
  38. return;
  39. }
  40. // TODO: Error handling
  41. [NCUtils log:[NSString stringWithFormat:@"Could not get signaling settings. Error: %@", error.description]];
  42. }
  43. if (settings) {
  44. self->_signalingSettings = settings;
  45. }
  46. if (block) {
  47. block(self->_signalingSettings);
  48. }
  49. }];
  50. }
  51. - (NSArray *)getIceServers
  52. {
  53. NSMutableArray *servers = [[NSMutableArray alloc] init];
  54. if (_signalingSettings) {
  55. for (StunServer *stunServer in _signalingSettings.stunServers) {
  56. RTCIceServer *iceServer = [[RTCIceServer alloc] initWithURLStrings:stunServer.urls
  57. username:@""
  58. credential:@""];
  59. [servers addObject:iceServer];
  60. }
  61. for (TurnServer *turnServer in _signalingSettings.turnServers) {
  62. RTCIceServer *iceServer = [[RTCIceServer alloc] initWithURLStrings:turnServer.urls
  63. username:turnServer.username
  64. credential:turnServer.credential];
  65. [servers addObject:iceServer];
  66. }
  67. }
  68. NSArray *iceServers = [NSArray arrayWithArray:servers];
  69. return iceServers;
  70. }
  71. - (void)startPullingSignalingMessages
  72. {
  73. [NCUtils log:[NSString stringWithFormat:@"Start pulling internal signaling messages for token %@", _room.token]];
  74. _shouldStopPullingMessages = NO;
  75. [self pullSignalingMessages];
  76. }
  77. - (void)stopPullingSignalingMessages
  78. {
  79. _shouldStopPullingMessages = YES;
  80. [_pullSignalingMessagesTask cancel];
  81. }
  82. - (void)pullSignalingMessages
  83. {
  84. _pullSignalingMessagesTask = [[NCAPIController sharedInstance] pullSignalingMessagesFromRoom:_room.token forAccount:[[NCDatabaseManager sharedInstance] activeAccount] withCompletionBlock:^(NSDictionary *messages, NSError *error) {
  85. if (self->_shouldStopPullingMessages) {
  86. return;
  87. }
  88. id messagesObj = [[messages objectForKey:@"ocs"] objectForKey:@"data"];
  89. NSArray *messagesArray = [[NSArray alloc] init];
  90. // Check if messages array was parsed correctly
  91. if ([messagesObj isKindOfClass:[NSArray class]]) {
  92. messagesArray = messagesObj;
  93. }else if ([messagesObj isKindOfClass:[NSDictionary class]]) {
  94. messagesArray = [messagesObj allValues];
  95. }
  96. for (NSDictionary *message in messagesArray) {
  97. if ([self.observer respondsToSelector:@selector(signalingController:didReceiveSignalingMessage:)]) {
  98. [self.observer signalingController:self didReceiveSignalingMessage:message];
  99. }
  100. }
  101. [self pullSignalingMessages];
  102. }];
  103. }
  104. - (void)sendSignalingMessage:(NCSignalingMessage *)message
  105. {
  106. NSArray *messagesArray = [NSArray arrayWithObjects:[message messageDict], nil];
  107. NSString *JSONSerializedMessages = [self messagesJSONSerialization:messagesArray];
  108. if (!JSONSerializedMessages) {
  109. return;
  110. }
  111. [[NCAPIController sharedInstance] sendSignalingMessages:JSONSerializedMessages toRoom:_room.token forAccount:[[NCDatabaseManager sharedInstance] activeAccount] withCompletionBlock:^(NSError *error) {
  112. if (error) {
  113. //TODO: Error handling
  114. NSLog(@"Error sending signaling message.");
  115. }
  116. NSLog(@"Sent %@", JSONSerializedMessages);
  117. }];
  118. }
  119. - (NSString *)messagesJSONSerialization:(NSArray *)messages
  120. {
  121. NSError *error;
  122. NSString *jsonString = nil;
  123. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:messages
  124. options:0
  125. error:&error];
  126. if (!jsonData) {
  127. NSLog(@"Error serializing signaling message: %@", error);
  128. } else {
  129. jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  130. }
  131. return jsonString;
  132. }
  133. - (void)stopAllRequests
  134. {
  135. [_getSignalingSettingsTask cancel];
  136. _getSignalingSettingsTask = nil;
  137. [self stopPullingSignalingMessages];
  138. }
  139. @end