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(); }
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(); }
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()); }
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(); }
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); }
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; } }
public bool TryGet(int sessionId, out ICallSession session) { return(_sessions.TryGetValue(sessionId, out session)); }