コード例 #1
0
        public ConnectionStatus ConnectToSignalingServer(ConnectionOwner connectionOwner)
        {
            try
            {
                SignaledPeerData.Reset();
                SignalingStatus.Reset();
                SignaledRelayMessages.Reset();

                var socket = new StreamSocket();
                socket.EnableTransferOwnership(Guid.Parse(connectionOwner.OwnerId),
                                               SocketActivityConnectedStandbyAction.Wake);
                socket.ConnectAsync(new HostName(SignalingSettings.SignalingServerHost),
                                    SignalingSettings.SignalingServerPort, SocketProtectionLevel.PlainSocket)
                .AsTask()
                .Wait();
                socket.TransferOwnership(SignalingSocketOperation.SignalingSocketId);
                return(new ConnectionStatus
                {
                    IsConnected = true
                });
            }
            catch (Exception exception)
            {
                Debug.Write("Failed to connect to signalling server: ex: " + exception.Message);
                return(new ConnectionStatus
                {
                    IsConnected = false
                });
            }
        }
コード例 #2
0
 public void DisconnectSignalingServer()
 {
     SocketOperation.Disconnect();
     SignaledPeerData.Reset();
     SignalingStatus.Reset();
     SignaledRelayMessages.Reset();
 }
コード例 #3
0
 public void DisconnectSignalingServer()
 {
     SignaledPeerData.Reset();
     SignalingStatus.Reset();
     SignaledRelayMessages.Reset();
     if (_streamSocket != null)
     {
         _streamSocket.Dispose();
     }
     _streamSocket = null;
     _isConnected  = false;
 }
コード例 #4
0
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            using (new BackgroundTaskDeferralWrapper(taskInstance.GetDeferral()))
            {
                try
                {
                    var rawNotification = (RawNotification)taskInstance.TriggerDetails;
                    var rawContent      = rawNotification.Content;

                    var serializedParameter =
                        rawContent.Substring(rawContent.IndexOf(" ", StringComparison.CurrentCultureIgnoreCase) + 1);
                    var type    = typeof(RelayMessage);
                    var message = (RelayMessage)JsonConvert.Deserialize(serializedParameter, type);

                    if (message == null)
                    {
                        return;
                    }

                    var isTimeout = (DateTimeOffset.UtcNow - message.SentDateTimeUtc).TotalSeconds > 60;

                    if (message.Tag == RelayMessageTags.VoipCall)
                    {
                        if (isTimeout)
                        {
                            return;
                        }
                        ToastNotificationService.ShowInstantMessageNotification(message.FromName, message.FromUserId, AvatarLink.EmbeddedLinkFor(message.FromAvatar),
                                                                                $"Missed call at {message.SentDateTimeUtc.ToLocalTime()}.");
                    }
                    else if (message.Tag == RelayMessageTags.InstantMessage)
                    {
                        if (isTimeout || SignaledRelayMessages.IsMessageReceived(message.Id))
                        {
                            return;
                        }
                        ToastNotificationService.ShowInstantMessageNotification(message.FromName, message.FromUserId,
                                                                                AvatarLink.EmbeddedLinkFor(message.FromAvatar), message.Payload);
                        SignaledRelayMessages.AddPushNotificationMessageID(message.Id);
                        SignaledRelayMessages.Add(message);
                    }
                }
                catch (Exception)
                {
                }
            }
        }
コード例 #5
0
        public void ServerRelay(RelayMessage message)
        {
            ClientConfirmation(Confirmation.For(message));
            SignaledRelayMessages.Add(message);
            var shownUserId = _foregroundChannel.GetShownUserId();

            if (message.Tag == RelayMessageTags.InstantMessage &&
                !SignaledRelayMessages.IsPushNotificationReceived(message.Id) &&
                !(shownUserId != null && shownUserId.Equals(message.FromUserId)) &&
                (DateTimeOffset.UtcNow.Subtract(message.SentDateTimeUtc).TotalMinutes < 10))
            {
                ToastNotificationService.ShowInstantMessageNotification(message.FromName,
                                                                        message.FromUserId, AvatarLink.EmbeddedLinkFor(message.FromAvatar), message.Payload);
            }
            _foregroundChannel?.OnSignaledRelayMessagesUpdated();

            // Handle Voip tags
            if (message.Tag == RelayMessageTags.VoipCall)
            {
                _voipChannel.OnIncomingCall(message);
            }
            else if (message.Tag == RelayMessageTags.VoipAnswer)
            {
                _voipChannel.OnOutgoingCallAccepted(message);
            }
            else if (message.Tag == RelayMessageTags.VoipReject)
            {
                _voipChannel.OnOutgoingCallRejected(message);
            }
            else if (message.Tag == RelayMessageTags.SdpOffer)
            {
                _voipChannel.OnSdpOffer(message);
            }
            else if (message.Tag == RelayMessageTags.SdpAnswer)
            {
                _voipChannel.OnSdpAnswer(message);
            }
            else if (message.Tag == RelayMessageTags.IceCandidate)
            {
                _voipChannel.OnIceCandidate(message);
            }
            else if (message.Tag == RelayMessageTags.VoipHangup)
            {
                _voipChannel.OnRemoteHangup(message);
            }
        }
コード例 #6
0
        public ConnectionStatus ConnectToSignalingServer(ConnectionOwner connectionOwner)
        {
            SignaledPeerData.Reset();
            SignalingStatus.Reset();
            SignaledRelayMessages.Reset();
            _streamSocket = new StreamSocket();
            _streamSocket.ConnectAsync(new HostName(SignalingSettings.SignalingServerHost),
                                       SignalingSettings.SignalingServerPort, SocketProtectionLevel.PlainSocket)
            .AsTask()
            .Wait();

            _isConnected = true;

            _signalingClient = _unityContainer.Resolve <SignalingClient>();

            StartReading();

            return(new ConnectionStatus
            {
                IsConnected = _isConnected
            });
        }
コード例 #7
0
        private void OnRelayMessagesUpdated()
        {
            var newMessages = SignaledRelayMessages.Messages
                              .Where(s => s.Tag == RelayMessageTags.InstantMessage && s.FromUserId == _userId)
                              .OrderBy(s => s.SentDateTimeUtc).ToList();

            foreach (var message in newMessages)
            {
                ((ObservableCollection <InstantMessageViewModel>)InstantMessages).Add(new InstantMessageViewModel
                {
                    Body                = message.Payload,
                    DeliveredAt         = message.SentDateTimeUtc.LocalDateTime,
                    IsSender            = false,
                    SenderName          = Name,
                    SenderProfileSource = ProfileSource,
                    IsHighlighted       = !_isSelected
                });
                SignaledRelayMessages.Delete(message.Id);
            }
            if (!_isSelected && newMessages.Count > 0)
            {
                IsHighlighted = true;
            }
        }