Поделиться через


Обзор вспомогательной телефонии

Ценной особенностью телефонии является небольшой набор функций, называемых вспомогательной телефонией. Телефония с поддержкой предназначена для обеспечения доступности голосовых вызовов и вызовов мультимедиа для любого приложения, а не только для телефонных функций. Иными словами, с помощью телефонии приложения могут совершать телефонные звонки, не зная подробностей о службах полного API телефонии. Она расширяет возможности телефонии для текстовых приложений, электронных таблиц, баз данных, менеджеров личной информации и других приложений, не являющихся телефонными.

Список функций базовой телефонии с поддержкой TAPI 2.x см. в статье Краткий справочник по функциям TAPI. TAPI 3.x поддерживает телефонию с помощью интерфейса ITRequest .

Полезность вспомогательной телефонии можно проиллюстрировать в следующем примере. Приложение электронной таблицы может включать функции, которые набирают номер телефона для голосового звонка. Пока приложению не требуется подробное управление вызовами, предоставляемое полным API телефонии, ассистированная телефония является самым простым и эффективным способом предоставления ему функций телефонии.

телефония с помощью приложения электронной таблицы

Телефония с поддержкой и полный API телефонии используются и реализуются различными способами, поэтому не рекомендуется сочетать вызовы функций с поддержкой телефонии и вызовы функций API телефонии в одном приложении.

Использование вспомогательной телефонии

Приложения, использующие службы вспомогательной телефонии, инициируют только запросы на вызовы, которые временно помещаются в очередь с помощью TAPI. Приложение получателя запроса извлекает эти запросы и выполняет их от имени приложения вспомогательной телефонии. Функция tapiRequestMakeCall запрашивает создание голосового вызова. Запрашивающее приложение не управляет вызовом.

TAPI позволяет пользователю устанавливать разные или одинаковые приложения получателей запросов для каждой из этих служб. Приложение становится получателем запроса путем регистрации с помощью lineRegisterRequestRecipient, в котором в качестве значения для параметра bEnable указано значение TRUE. (Если указать значение FALSE , приложение отменяет регистрацию в качестве получателя запроса, что он должен делать, когда он определил, что его обязанности получателя выполняются для текущего сеанса.) Приложение выбирает службы, которые оно хочет обрабатывать, в параметре dwRequestModelineRegisterRequestRecipient. Возможное значение запроса — LINEREQUESTMODE_MAKECALL, чтобы показать, что приложение будет обрабатывать запросы tapiRequestMakeCall . Если несколько приложений регистрируются в одних и том же службах, используется схема приоритета, позволяющая пользователю выбрать, какое приложение предпочтительнее для обработки запросов. Эта схема приоритета идентична схеме, используемой для передачи вызовов и маршрутизации входящих вызовов на основе списка имен файлов в HandoffPriorities в реестре.

Запросы на вызовы

Телефония с поддержкой телефонии предоставляет приложения с поддержкой телефонии с простым в использовании механизмом для совершения телефонных звонков, не требуя от разработчика полной грамотности в телефонии.

Функция tapiRequestMakeCall запрашивает голосовой звонок между пользователем и удаленной стороной, указанной по номеру телефона. Запрос отправляется в TAPI, который передает его приложению, которое зарегистрировано в качестве получателя таких запросов. Этот получатель является приложением диспетчера вызовов.

После того как приложение выполняет запрос, вызов полностью контролируется из приложения диспетчера вызовов, так как приложения телефонии с поддержкой не могут управлять вызовами. Поскольку более сложные аспекты телефонии и все операции с пользовательским интерфейсом обрабатываются приложением диспетчера вызовов, приложения с поддержкой телефонии не нужно изменять каким-либо существенным образом. На самом деле, приложения, которые позволяют вызывать эту операцию из встроенного языка сценариев, может не нуждаться в изменении вообще.

Функция tapiGetLocationInfo возвращает приложению код страны или региона и город (регион), заданный пользователем в параметрах текущего расположения в панель управления телефонии. Приложение может использовать эти сведения, чтобы помочь пользователю сформировать правильные канонические телефонные номера, например, предлагая их в качестве значений по умолчанию при вводе новых номеров в записи телефонной книги или записи базы данных.

Получатели запроса

Для запуска телефонии с поддержкой требуются два типа приложений. Клиенты вспомогательной телефонии — это приложения, использующие телефонию с поддержкой, вызывая функции с префиксом "tapi". Примером такого клиентского приложения может быть электронная таблица, в которую добавляется команда меню "Набор" или кнопка панели инструментов.

Серверы с поддержкой телефонии — это приложения, которые могут выполнять функции API телефонии, которые являются результатом вызова другого приложения функции с префиксом tapi. Чтобы сделать себя известным как сервер вспомогательной телефонии, такое приложение регистрируется как одно с помощью функции lineRegisterRequestRecipient .

Функции вспомогательной телефонии (которые начинаются с префикса "tapi") называются функциями запросов. Приложения с поддержкой телефонии, обрабатывающие эти запросы , — серверы телефонии с поддержкой — называются получателями запросов.

Обработка запросов вспомогательной телефонии

Процесс доставки и обслуживания запросов выглядит следующим образом:

  1. Когда TAPI получает запрос с поддержкой телефонии, он проверяет наличие получателя запроса, то есть приложения, зарегистрированного для обработки этого типа запроса. Если есть получатель запроса, запрос помещается в очередь, а приложению с наивысшим приоритетом, зарегистрированным для службы этого запроса, отправляется LINE_REQUEST сообщение. Сообщение уведомляет получателя запроса о поступлении нового запроса и указывает на режим запроса.

  2. Если TAPI не удается найти запущенное в настоящее время приложение для обработки такого запроса, он пытается запустить приложение, которое было зарегистрировано как способное сделать это. Эти сведения о регистрации записываются в раздел HandoffPriorities в реестре. TAPI пытается запускать приложения в том порядке, в котором они перечислены в разделе HandoffPriorities . (См. следующий шаг.)

    Если в настоящее время приложение не зарегистрировано, TAPI проверяет список приложений для обработки запросов в связанной записи в HandoffPriorities. Если связанная строка отсутствует в файле, если в нем нет приложений или ни одно из приложений в списке не может быть запущено, запрос отклоняется с ошибкой TAPIERR_NOREQUESTRECIPIENT.

    При запуске получателя запроса (независимо от того, был ли он запущен с помощью TAPI) он обязан вызвать lineRegisterRequestRecipient во время процесса запуска и зарегистрировать себя в качестве получателя запроса.

  3. Если в записи указано одно или несколько приложений, TAPI начинается с первого указанного приложения (наивысший приоритет) и пытается запустить его с помощью функции CreateProcess . Если попытка запустить приложение завершается неудачно, TAPI пытается запустить следующее приложение в списке. При успешном запуске любого приложения TAPI просто помещает запрос в очередь и возвращает приложению указание об успешном выполнении, даже если запрос еще не был отправлен получателю запроса.

    После запуска приложения получателя запроса оно вызывает lineRegisterRequestRecipient, что приводит к отправке LINE_REQUEST сообщения, сигналив о том, что запрос поставлен в очередь. Если по какой-либо причине запущенное приложение никогда не регистрируется, запрос остается в очереди и остается в очереди на неопределенный срок, пока приложение не зарегистрируется для этого типа запроса.

  4. Если TAPI обнаруживает такое зарегистрированное приложение, которое уже выполняется или успешно запускает его, он помещает запрос в очередь, отправляет LINE_REQUEST сообщение в серверное приложение и возвращает индикатор успешного вызова функции в приложение ассист-мации телефонии. В этом сообщении об успешном выполнении указывается только то, что запрос был принят и поставлен в очередь, а не успешно выполнен.

Когда серверное приложение готово к обработке запроса, оно вызывает функцию lineGetRequest . Это позволяет ему получать любую необходимую информацию, например адрес для набора. Затем он обрабатывает запрос с помощью функций TAPI (таких как lineMakeCall и lineDrop), которые в противном случае будут использоваться для размещения вызова. Вызов lineGetRequest удаляет запрос из TAPI, а параметры запроса копируются в буфер запросов, выделенный приложением. Размер и интерпретация содержимого буфера зависят от режима запроса.

Сервер должен убедиться, что он использует правильные параметры при выполнении запросов. При этом выполняются следующие действия:

  1. Получатель запроса сначала получает LINE_REQUEST сообщение, информирующее о том, что запросы могут существовать для него в очереди запросов. Приложение будет вызывать lineGetRequest и продолжать вызывать его до тех пор, пока очередь не будет истощена (если запрос предназначен для выполнения нового вызова) или удалить существующий вызов. Это сообщение не содержит параметров для запроса, за исключением случаев запроса на удаление существующего вызова.
  2. Если запрос предназначен для выполнения нового вызова, сервер вспомогательной телефонии использует функцию lineGetRequest для получения полного запроса, который включает параметры запроса. Теперь на сервере есть вся необходимая информация, например номер для набора или идентификация создателя запроса. Однако сначала сервер должен выделить память, необходимую для хранения этой информации.
  3. Наконец, сервер выполняет запрос, вызывая соответствующую функцию TAPI или набор функций.

Если TAPI не удается запустить приложение, которое может выступать в качестве получателя запроса, вызов с поддержкой телефонии завершается сбоем и возвращает ошибку TAPIERR_NOREQUESTRECIPIENT.

Примечания к операциям с получателями запросов

Следующая информация относится к системам, в которых обрабатываются запросы вспомогательной телефонии:

  • В реестре по умолчанию должно быть указано приложение диспетчера вызовов в списке приоритетов для tapiRequestMakeCall. Было бы полезно, но не важно, чтобы приложение диспетчера вызовов было бы полезно иметь параметр меню, позволяющий пользователям задать ему наивысший приоритет.
  • Если приложение получателя с поддержкой телефонии запускается автоматически с помощью TAPI и является единственным приложением TAPI в системе, это действие инициализирует TAPI. Если приложение получателя вспомогательной телефонии инициализирует и завершает работу линейного устройства перед регистрацией для получения запросов вспомогательной телефонии, TAPI также завершает работу, а запрос вспомогательной телефонии теряется. Запросы с поддержкой телефонии также могут быть потеряны, когда другое запущенное приложение TAPI выполняет инициализацию и завершение работы.