private Request PrepareCallRequest(CallRequest request, out Call call) { call = new Call() { AccountSid = request.AccountSid, CallTo = request.To, AnswerUrl = request.AnswerUrl, Direction = "outbound-api", CallerId = request.From, Timeout = request.TimeLimit }; Queue <DialString> dialStrings = new Queue <DialString>(); System.Text.StringBuilder args_list = new System.Text.StringBuilder(); string sched_hangup_id = string.Empty; // don't allow "|" and "," in 'to' (destination) to avoid call injection request.To = request.To.Split(',', '|')[0]; //set hangup_on_ring int hangup = 0; if (!int.TryParse(request.HangupOnRing, out hangup)) { hangup = -1; } if (hangup == 0) { args_list.Append("execute_on_ring='hangup ORIGINATOR_CANCEL',"); } else if (hangup > 0) { args_list.Append(string.Format("execute_on_ring='sched_hangup +{0} ORIGINATOR_CANCEL',", hangup)); } // set send_digits if (!string.IsNullOrEmpty(request.SendDigits)) { args_list.Append(string.Format("execute_on_answer='send_dtmf {0}',", request.SendDigits)); } //set time_limit int time = 0; if (!int.TryParse(request.TimeLimit, out time)) { time = -1; } if (time > 0) { //create sched_hangup_id sched_hangup_id = System.Guid.NewGuid().ToString(); args_list.Append(string.Format("api_on_answer='sched_api {0} +{1} hupall ALLOTTED_TIMEOUT agbara_callSid {2}',", sched_hangup_id, request.TimeLimit, call.Sid)); args_list.Append(string.Format("agbara_sched_hangup_id={0}", sched_hangup_id)); } if (!string.IsNullOrEmpty(request.StatusCallbackUrl)) { args_list.Append(string.Format("agbara_statuscallback_url={0},", request.StatusCallbackUrl)); args_list.Append(string.Format("agbara_statuscallbackmethod={0},", request.StatusCallbackMethod)); } if (!string.IsNullOrEmpty(request.FallbackUrl)) { args_list.Append(string.Format("agbara_fallbackrul={0},", request.FallbackUrl)); args_list.Append(string.Format("agbara_fallbackmethod={0},", request.FallbackMethod)); } if (!string.IsNullOrEmpty(request.ApplicationSid)) { args_list.Append(string.Format("agbara_applicationsid={0},", request.ApplicationSid)); } args_list.Append(string.Format("agbara_callsid={0},", call.Sid)); args_list.Append(string.Format("agbara_accountsid={0},", call.AccountSid)); args_list.Append(string.Format("agbara_answer_url={0},", request.AnswerUrl)); args_list.Append(string.Format("origination_caller_id_number={0},", request.From)); //session_heartbeat args_list.Append(string.Format("enable_heartbeat_events={0},", 60)); //Set Direction args_list.Append(string.Format("agbara_call_direction={0}", CallDirection.outboundapi)); foreach (Gateway gate in _fsService.GetGatewaysForNumber(call.CallTo, FS.Sid)) { for (int i = 1; i < int.Parse(gate.GatewayRetry); i++) { DialString dialString = new DialString(call.Sid, request.To, gate.GatewayString, gate.GatewayCodec, gate.GatewayTimeout.ToString(), args_list.ToString()); dialStrings.Enqueue(dialString); } } Request call_req = new Request(call.Sid, dialStrings, request.AnswerUrl, request.StatusCallbackUrl, request.StatusCallbackMethod); return(call_req); }
private string PrepareNumber(Number Num, FSOutbound outboundClient) { List <string> num_gw = new List <string>(); string option_send_digits = string.Empty; if (string.IsNullOrEmpty(Num.number)) { return(""); } if (!string.IsNullOrEmpty(Num.SendDigit)) { option_send_digits = string.Format("api_on_answer='uuid_recv_dtmf ${uuid} {0}'", Num.SendDigit); } else { option_send_digits = ""; } foreach (Gateway gw in fs.GetGatewaysForNumber(Num.number, "")) { List <string> num_options = new List <string>(); if (!string.IsNullOrEmpty(option_send_digits)) { num_options.Add(option_send_digits); } num_options.Add(string.Format("absolute_codec_string={0}", gw.GatewayCodec)); num_options.Add(string.Format("leg_timeout={0}", gw.GatewayTimeout)); int gw_retries = 1; try { gw_retries = int.Parse(gw.GatewayRetry); if (gw_retries <= 0) { gw_retries = 1; } } catch (Exception e) { gw_retries = 1; } string options = ""; if (!string.IsNullOrEmpty(num_options.ToString())) { options = string.Format("[{0}]", string.Join(",", num_options)); } else { options = ""; } string num_str = string.Format("{0}{1}/{2}", options, gw.GatewayString, Num.number); string dial_num = ""; for (int i = 1; i <= gw_retries; i++) { dial_num = string.Join("|", num_str); } num_gw.Add(dial_num); } string result = string.Join("|", num_gw); return(result); }