Ejemplo n.º 1
0
        private void DoMakeCallAsync(CallWrapper call, string number, SipHeader[] headers)
        {
            try
            {
                int sessionId = _sip.SipekResources.CallManager.CreateSimpleOutboundCall(number, headers);

                if (sessionId < 0)
                {
                    DropCall(call);
                }
                else
                {
                    call.SetSession(sessionId);

                    RefreshCallState(call, sessionId);
                }
            }
            catch (Exception e)
            {
                Logger.LogWarn(e, "Can't acquire new session for call. Number: {0}. Call: {1}.", number, call);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Create new call to specified number
        /// </summary>
        /// <param name="number">Number to call</param>
        /// <param name="headers">Headers to pass with INVITE</param>
        /// <returns>New call</returns>
        public ICall MakeCall(string number, IEnumerable <KeyValuePair <string, string> > headers)
        {
            if (string.IsNullOrWhiteSpace(number))
            {
                throw new ArgumentException("Phone number is empty or null. Skipping call request.", "number");
            }

            // Remove all non-numeric symbols from number
            number = number.ToLower();

            number = number.Replace("sip:", ""); // it can be added while calling from browser

            while (number.IndexOf(" ", StringComparison.Ordinal) >= 0)
            {
                number = number.Replace(" ", "");
            }
            while (number.IndexOf("(", StringComparison.Ordinal) >= 0)
            {
                number = number.Replace("(", "");
            }
            while (number.IndexOf(")", StringComparison.Ordinal) >= 0)
            {
                number = number.Replace(")", "");
            }
            while (number.IndexOf("-", StringComparison.Ordinal) >= 0)
            {
                number = number.Replace("-", "");
            }
            while (number.IndexOf("_", StringComparison.Ordinal) >= 0)
            {
                number = number.Replace("_", "");
            }

            Logger.LogNotice("CallManager: Trying to call " + number);

            // Check if current status is NA then make user Available
            //if (this._sip.Account.PresenceStatus.Code == CallService.Common.SIP.Account.PresenceStatusCode.NotAvailable)
            //    this._sip.Account.PresenceStatus = new CallService.Common.SIP.Account.PresenceStatus(CallService.Common.SIP.Account.PresenceStatusCode.Available);

            // Lock calls collection to ensure that while we check all, we don't receive any new calls
            lock (_calls)
            {
                // We only support 5 parallel lines
                if (_calls.Count < LINES_MAXCOUNT)
                {
                    // Put active calls on hold
                    foreach (var call in _calls)
                    {
                        if (call.State == CallState.ACTIVE)
                        {
                            call.Hold();
                        }
                    }

                    var newCall = new CallWrapper(this, number)
                    {
                        LastUserAction = CallAction.Make,
                        State          = CallState.CONNECTING
                    };

                    var headersCollection = new List <SipHeader>();
                    if (headers != null)
                    {
                        headersCollection.AddRange(headers.Select(header => new SipHeader()
                        {
                            name = header.Key, value = header.Value
                        }));
                    }

                    if (!AssignLineForCall(newCall))
                    {
                        Logger.LogNotice($"Can't assign line for new call {newCall.Number}. Lines count exceeds.");
                        throw new InvalidOperationException("Lines count exceeds.");
                    }

                    _calls.Add(newCall);

                    RaiseCallStateChanged(newCall);

                    _dispatcher.BeginInvoke(new Action(() => DoMakeCallAsync(newCall, number, headersCollection.ToArray())));

                    return(newCall);
                }
            }

            return(null);
        }