Exemple #1
0
        private void HandleCallCancel(IPEndPoint remote, int index, CallCancelRequest request)
        {
            var status = StatusCode.Success;
            var reason = string.Empty;

            ICallSession session = null;

            if (!_users.TryGet(remote, out IUser source))
            {
                status = StatusCode.NotAuthorized;
                reason = "User is not logged in";
            }
            else if (!_callController.TryGet(request.SessionId, out session))
            {
                status = StatusCode.CallNotFound;
                reason = "Call not found";
            }
            else if (!session.Contains(source))
            {
                status = StatusCode.UserNotFound;
                reason = "User not found in call session";
            }

            _core.Send(new MessageResult {
                Status = status, Reason = reason
            }, remote, index);
            if (status != StatusCode.Success)
            {
                return;
            }

            session.Remove(source);
            session.RaiseState();
        }
Exemple #2
0
        private void HandleCall(IPEndPoint remote, int index, CallRequest request)
        {
            var status = StatusCode.Success;
            var reason = string.Empty;

            IUser        target  = null;
            ICallSession session = null;

            if (!_users.TryGet(remote, out IUser source))
            {
                status = StatusCode.NotAuthorized;
                reason = "User is not logged in";
            }
            else if (!_users.TryGet(request.Target, out target))
            {
                status = StatusCode.UserNotFound;
                reason = "Target not found";
            }
            else if (source == target)
            {
                status = StatusCode.Failure;
                reason = "Don't target at yourself";
            }
            else if (!_callController.TryGetOrAdd(source.Name, request.Target, out session))
            {
                status = StatusCode.CallDuplicate;
                reason = "Call exists";
            }
            else if (!ushort.TryParse(request.RoutePort.ToString(), out _) || request.RoutePort == ushort.MinValue)
            {
                status = StatusCode.Failure;
                reason = $"Invalid parameters: {nameof(CallRequest.RoutePort)}";
            }

            _core.Send(new MessageResult {
                Status = status, Reason = reason
            }, remote, index);
            if (status != StatusCode.Success)
            {
                return;
            }

            session.AppendOrUpdate(source, request.RoutePort);
            session.AppendOrUpdate(target);

            _core.Send(new CallResponse {
                SessionId = session.Id, RouteId = session.RouteId
            }, remote, index);

            session.RaiseState();
        }
Exemple #3
0
        private void OnCallSessionChanged(ICallSession session)
        {
            var participants = session.GetParticipants();

            if (participants.Count() == 0)
            {
                return;
            }

            _core.Send(new CallBroadcast
            {
                SessionId    = session.Id,
                Participants = participants.Select(s => s.Name).ToArray(),
                State        = session.State
            },
                       participants.Select(s => s.Remote).ToArray());
        }
Exemple #4
0
        private void HandleCallInvite(IPEndPoint remote, int index, CallInviteRequest request)
        {
            var status = StatusCode.Success;
            var reason = string.Empty;

            ICallSession session = null;

            if (!_users.TryGet(remote, out IUser source))
            {
                status = StatusCode.NotAuthorized;
                reason = "User is not logged in";
            }
            else if (!_callController.TryGet(request.SessionId, out session))
            {
                status = StatusCode.CallNotFound;
                reason = "Call not found";
            }
            // TODO Impl test.
            else if (!session.Contains(source))
            {
                status = StatusCode.UserNotFound;
                reason = "User not found in call session";
            }
            else if (!ushort.TryParse(request.RoutePort.ToString(), out _) || request.RoutePort == ushort.MinValue)
            {
                status = StatusCode.Failure;
                reason = $"Invalid parameters: {nameof(CallInviteRequest.RoutePort)}";
            }

            _core.Send(new MessageResult {
                Status = status, Reason = reason
            }, remote, index);
            if (status != StatusCode.Success)
            {
                return;
            }

            session.AppendOrUpdate(source, request.RoutePort);
            _core.Send(new CallResponse {
                SessionId = session.Id, RouteId = session.RouteId
            }, remote, index);

            session.RaiseState();
        }
Exemple #5
0
        public bool TryGetOrAdd(string source, string target, out ICallSession session)
        {
            int sessionId = GetSessionId(source, target);

            if (_sessions.TryGetValue(sessionId, out session) ||
                _sessions.TryGetValue(GetSessionId(target, source), out session))
            {
                return(false);
            }

            var router = _routerFactory();

            session = new CallSession(router)
            {
                Id      = sessionId,
                RouteId = _container.Take(),
            };
            session.Notify += OnSessionNotify;

            _sessions[sessionId] = session;

            return(true);
        }
Exemple #6
0
        private void OnSessionNotify(ICallSession session)
        {
            SessionChanged?.Invoke(session);

            switch (session.State)
            {
            case CallState.Idle:
                session.Notify -= OnSessionNotify;
                try
                {
                    _sessions.TryRemove(session.Id, out _);
                    _container.Release(session.RouteId);
                }
                finally
                {
                    session.Dispose();
                }
                break;

            default:
                break;
            }
        }
Exemple #7
0
 public bool TryGet(int sessionId, out ICallSession session)
 {
     return(_sessions.TryGetValue(sessionId, out session));
 }