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); } }
/// <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); }