Re: Отмена трансфера

От: Dmitry Akindinov <CGatePro_at_mx_ru>
Дата: Mon 16 Apr 2007 - 16:27:58 MSD

Тект программы:

function callNumber(phoneNumber,timeOut) forward; function callerLeg(parameters,callPending) external; function bridgedLoopHash(peerLeg) external;

entry main is

   group = Vars().startParameter;
   timeOut = 20;
   if not isArray(group) or else Length(group) < 2 then      syslog("Expecting the array of extensions, timeout as the first value");

     RejectCall("500-Invalid parameters");    end if;

   timeOut = group[0]; RemoveElement(group, 0);    count = Length(group);
   called = false;
   if count > 0 then

     index = 0;
     //shift = RandomNumber() % count;
     shift = 0;
     while index < count and then timeOut > 0 loop
       member = group[(index + shift) % count];
       started = LocalTime();
       called = callNumber(member, timeOut);
     exitif called;
       timeTaken = LocalTime() - started;
       if timeTaken <= timeOut then timeOut = timeOut - timeTaken; end if;
       index = index + 1;
     end loop;

   end if;
   if not called then RejectCall("408-no answer"); end if; end entry;

function callNumber(phoneNumber,timeOut) is

   parameters = NewDictionary();
   if FindSubString(phoneNumber, "@") == -1 then      phoneNumber = phoneNumber + "@" + MyDomain();    end if;

   parameters.("")       = "sip:" + phoneNumber + ";services=no";
   parameters.activeSide = false;
   parameters.From       = RemoteURI();
   parameters.("Expires")  = (timeOut != null) ? number(timeOut): 10;
   parameters.bridgedCall = true;
   parameters.("Call-ID") = PendingRequestData("Call-ID") + ".gr_ser";
   parameters.("Max-Forwards") = PendingRequestData("Max-Forwards")-1;

   syslog("Params: " + ObjectToString(parameters));    peerLeg = callerLeg(parameters,true);    if not IsTask(peerLeg) then

     //PlayFile("Failure");
     return false;
   else
     syslog("Result: " + ObjectToString(peerLeg));
   end if;
   while IsConnected() loop
     input = bridgedLoopHash(peerLeg);
   exitif input != "#";
   end loop;
   return true;
end function;

Dmitry Akindinov wrote:
> Здравствуйте,
>
> Никитин Андрей wrote:

>>> Здравствуйте,
>>
>>>> Никитин Андрей wrote:
>>>> День добрый!
>>>>
>>>> Сталкнулся с такой проблеммой, есть задача трансфера по списку 
>>>> номеров, т.е. если номер не отвечает, то >>пробуем трансферить на 
>>>> следующий и так далее.
>>>
>>> А как вы это делаете сейчас?
>> функция connectTo возвращает true, false (удачный, неудачный трансфер)
>>

> []
>
> Функция, собственно, и строит бридж. Только в ней нет возможности
> передать значение таймаута. Посмотрите в сторону callerleg.sppi, как он
> используется в gatewayincoming. В словарике спараметрами можно передать
> опцию Expires, со значением таймаута.
>
> В аттачменте - код для дозвона по нескольким номерам, по очереди.
>
> S:<100> = callinorder{10,101,102,103}#postmaster
>
>> функцию взял из примера, не модифицировал
>>
>>>
>>>> Все нормально если номер занят или отключен, но если на той стороне 
>>>> просто не берут трубку, то CGP >>пытается дозвониться до победного.
>>>>
>>>> Есть ли возможность считать такие соединения неудачными по таймауту 
>>>> (минута например) и переходить к >>следующему номеру?
>>
>>> С помощью B2BUA приложения - можно. Только это будет не трансфер, а 
>>> имеено бридж между двумя >программками (одна принимает звонок, вторая 
>>> дозванивается.)

-- 
Best regards,
Dmitry Akindinov
Получено Mon Apr 16 12:28:57 2007

Этот архив был сгенерирован hypermail 2.1.8 : Mon 16 Apr 2007 - 17:13:30 MSD