Исходящие звонки
Если приложение пытается выполнить исходящий вызов, оно должно сначала открыть строку. Строка открывается в результате того, что приложение вызывает функцию TAPI lineOpen . Чтобы выполнить телефонный вызов на ранее открытой строке, приложение вызывает функцию TAPI lineMakeCall и передает указатель на конкретный адрес назначения. Если запрашиваются какие-либо параметры, кроме параметров настройки вызова по умолчанию, приложение также передает указатель на структуру LINECALLPARAMS. Если приложение использует параметры настройки вызова по умолчанию, lineMakeCall предоставляет эти параметры в структуре LINECALLPARAMS. Члены этой структуры определяют способ настройки телефонного звонка.
Эти вызовы функции TAPI приводят к тому, что драйвер NDPROXY сначала создает виртуальное соединение (VC) с драйвером мини-порта CoNDIS WAN, а затем инкапсулирует параметры TAPI в структурах NDIS, чтобы выполнить исходящий вызов. Драйвер мини-порта будет использовать эти параметры TAPI для настройки исходящего вызова. Ниже показано, как подключается, настраивается и выполняется исходящий вызов.
NDPROXY вызывает NdisCoCreateVc , чтобы инициировать создание VC с драйвером мини-порта. После того как NDPROXY вызывает NdisCoCreateVc, NDIS вызывает в качестве синхронной операции функцию ProtocolCoCreateVc диспетчера вызовов, интегрированную в драйвер минипорта. NDIS передает в ProtocolCoCreateVc дескриптор, представляющий VC. Если вызов NdisCoCreateVc выполнен успешно, NDIS заполняет и возвращает дескриптор VC. ProtocolCoCreateVc выполняет все необходимые выделения динамических ресурсов и структур, необходимых драйверу диспетчера вызовов мини-порта (MCM) для выполнения последующих операций с VC, которые впоследствии будут активированы. К таким ресурсам относятся, помимо прочего, буферы памяти, структуры данных, события и другие подобные ресурсы.
NDPROXY задает параметры TAPI для исходящего вызова в CO_AF_TAPI_MAKE_CALL_PARAMETERS структуре. NDPROXY заполняет элементы этой структуры следующими сведениями, которые были переданы в функции TAPI lineMakeCall :
- Адрес назначения в элементе DestAddress
- Идентификатор открытой строки в элементе ulLineID
- Структура LINECALLPARAMS в элементе LineCallParams
NDPROXY накладывает структуру CO_AF_TAPI_MAKE_CALL_PARAMETERS на элемент Parametersструктуры CO_SPECIFIC_PARAMETERS и задает для элемента Length CO_SPECIFIC_PARAMETERS размер CO_AF_TAPI_MAKE_CALL_PARAMETERS.
NDPROXY задает для структуры CO_SPECIFIC_PARAMETERS элемент MediaSpecificструктуры CO_MEDIA_PARAMETERS .
NDPROXY задает указатель на структуру CO_MEDIA_PARAMETERS на элемент MediaParametersструктуры CO_CALL_PARAMETERS .
После того как NDPROXY инкапсулирует параметры TAPI, NDPROXY вызывает функцию NdisClMakeCall для инициации исходящего вызова. В этом вызове функции NDPROXY передает указатель на заполненную CO_CALL_PARAMETERS структуру. NDIS, в свою очередь, вызывает функцию ProtocolCmMakeCall диспетчера вызовов драйвера мини-порта CoNDIS WAN. Драйвер мини-порта должен проверять только структуру CO_AF_TAPI_MAKE_CALL_PARAMETERS, внедренную в CO_CALL_PARAMETERS. В этом случае никакие другие параметры вызова не имеют смысла. Если драйвер miniport впоследствии активирует VC для исходящего вызова, драйвер минипорта вызывает функцию NdisMCmActivateVc и передает указатель на заполненный CO_CALL_PARAMETERS.
После того как драйвер мини-порта согласует с сетью установку параметров телефонного вызова для VC и настройку сетевой карты для этих параметров вызова, драйвер минипорта вызывает функцию NdisMCmMakeCallComplete , чтобы указать, что он готов к передаче данных в VC. В этом вызове драйвер мини-порта должен передать дескриптор в VC и изменения параметров телефонного вызова.
Драйвер мини-порта должен изменить элемент CallMgrParameters структуры CO_CALL_PARAMETERS, чтобы указать качество обслуживания (QoS) передачи пакетов, например пропускную способность. Чтобы задать этот элемент CallMgrParameters , драйвер мини-порта заполняет элементы структуры CO_CALL_MANAGER_PARAMETERS и указывает этой структуре значение CallMgrParameters. Например, чтобы определить скорость передачи и приема в байтах в секунду для VC, драйвер мини-порта должен задать элементы PeakBandwidth членов передачи и получения CO_CALL_MANAGER_PARAMETERS. Элементы Передачи и получения являются структурами FLOWSPEC. Дополнительные сведения о структуре FLOWSPEC см. в Microsoft Windows SDK.
Если драйвер мини-порта изменил параметры телефонного вызова, он должен задать элемент Flags в структуре CO_CALL_PARAMETERS с CALL_PARAMETERS_CHANGED. В результате вызова NdisMCmMakeCallComplete , выполненного драйвером мини-порта, NDIS вызывает функцию ProtocolClMakeCallComplete NDPROXY для завершения асинхронных операций, инициированных с помощью NdisClMakeCall.
После успешного завершения исходящего вызова драйвером мини-порта NDPROXY уведомляет приложение TAPI о том, что вызов подключен. Затем это приложение TAPI вызывает функцию TAPI lineGetID , чтобы сообщить NDPROXY о необходимости найти соответствующий клиент CoNDIS. В этом вызове lineGetID приложение TAPI предоставляет строку для определенного класса устройства TAPI, для которого приложению требуется дескриптор. NDPROXY использует эту строку для поиска клиента CoNDIS, который ранее зарегистрировал SAP для конкретного класса устройств TAPI. Если клиент CoNDIS — NDISWAN, строка — NDIS. Если NDPROXY находит SAP со строкой, которая соответствует строке, переданной приложением TAPI, NDPROXY вызывает NdisMCmCreateVc , чтобы настроить конечную точку подключения с NDISWAN, в которой она может отправлять уведомление об исходящем вызове. NDIS, в свою очередь, вызывает функцию ProtocolCoCreateVc NDISWAN и передает дескриптор, представляющий VC.
После того как NDPROXY настроит конечную точку подключения с помощью NDISWAN, он вызывает функцию NdisCmDispatchIncomingCall , чтобы уведомить NDISWAN об исходящем вызове. В этом вызове NDPROXY передает инкапсулированную CO_AF_TAPI_MAKE_CALL_PARAMETERS структуру, содержащую параметры исходящего вызова. NDIS, в свою очередь, вызывает функцию ProtocolClIncomingCall NDISWAN, в которой NDISWAN принимает или отклоняет запрошенное подключение. Если NDISWAN изменяет переданные ей параметры вызова, он должен задать элемент Flags в структуре CO_CALL_PARAMETERS с CALL_PARAMETERS_CHANGED.
После принятия решения о принятии подключения и, возможно, изменении параметров вызова, NDISWAN вызывает функцию NdisClIncomingCallComplete . NDIS, в свою очередь, вызывает функцию ProtocolCmIncomingCallComplete драйвера минипорта . В зависимости от того, принял ли NDISWAN исходящий вызов и принимает ли драйвер мини-порта предлагаемые изменения NDISWAN в параметрах вызова, драйвер мини-порта вызывает функции NdisCmDispatchCallConnected или NdisCmDispatchIncomingCloseCall . NdisCmDispatchCallConnected уведомляет NDISWAN о том, что передача данных может начаться в VC, созданном NDPROXY для исходящего вызова. NdisCmDispatchIncomingCloseCall информирует NDISWAN и NDPROXY о том, что предложенный исходящий вызов будет удален.
После того как NDISWAN примет исходящий вызов, NDPROXY вызывает функцию NdisCoGetTapiCallId , чтобы получить строку, определяющую контекст NDISWAN для VC. NDPROXY передает эту строку обратно в приложение TAPI. Приложение TAPI использует эту строку контекста VC для завершения вызова lineGetID.