Команда Macro()


Описание

Выполнение макроопределения

Описание

Macro(macroname,arg1,arg2...)

Выполняет макрос, используя контекст 'macro-', совершается переход на екстеншен 's' этого контекста и последовательно выполняются команды заданные в нем, пока они не закончатся.

Обратите внимание, что Вы не можете использовать любой другой экстеншен, кроме 's', в описании макроса, так как управление будет возвращено в контекст, откуда был вызван макрос, когда будут выполнены все команды со всеми приоритетами для екстеншена 's'.

Имя екстеншена, контекст и текущий приоритет команды будут сохранены в переменных ${MACRO_EXTEN}, ${MACRO_CONTEXT} и ${MACRO_PRIORITY} соответственно. Заданные аргументы команды будут доступны в контексте макроса, соответственно через переменные ${ARG1}, ${ARG2} и т.д.

Стоит обратить внимание что, если вы используете директиву "include => contextname" для включение другого контекста в текущий, то значения переменных ${ARG1} и т.д. так же будут доступны во включаемом контексте. Это, например, может быть использовано в вызовах макросов для стандартных екстеншенов в зависимости от времени дня.

Если, при использовании команды Goto, совершается переход за пределы контекста макроопределения, тогда команда Macro закончит выполнение макроса и управление будет переданно в точку, которая определена в параметрах этой функции Goto. Иначе, если переменная ${MACRO_OFFSET} установлена по завершении работы макроса, команда Macro попытается продолжить выполнение с приоритета MACRO_OFFSET + N + 1, если команда с таким приоритетом существует или с приоритета N + 1, в противном случае.

Коды возврата

Команда Macro вернет значение -1, если любая из команд в макроопределении вернет -1, иначе возвращает 0.

Пример

[macro-stdexten];
; ${ARG1} - Екстеншен (мы можем использовать также значение переменной ${MACRO_EXTEN} )
; ${ARG2} - Устройство (устройства) для совершения вызова
;
; Вызов через заданный интерфейс, ждем максимум 20 секунд
exten => s,1,Dial(${ARG2},20)
; Совершение перехода в зависимости от результата вызова (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER)
exten => s,2,Goto(s-${DIALSTATUS},1)
; Если абонент недоступен, перенаправляем вызывающего в голосовую почту с анонсом о недоступности абонента
exten => s-NOANSWER,1,Voicemail(u${ARG1})
; Если вызывающий абонент нажал #, возвращаемся в начало
exten => s-NOANSWER,2,Goto(default,s,1)
; Если абонент занят, перенаправляем вызывающего в голосовую почту с анонсом о занятости абонента
exten => s-BUSY,1,Voicemail(b${ARG1})
; Если вызывающий абонент нажал #, возвращаемся в начало
exten => s-BUSY,2,Goto(default,s,1)
; Обрабатываем все остальные ситуации, как ситуацию, когда абонент не отвечает
exten => _s-.,1,Goto(s-NOANSWER,1)
; Если вызывающий абонент нажал *, перенаправляем вызывающего в систему прослушивания голосовых сообщений
exten => a,1,VoicemailMain(${ARG1})

Для вызова этого макроса, Вам необходимо сделать примерно такое:
exten => 1234,1,Macro(stdexten,1234,sip/7960)


Ссылки по теме: