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


Прием входящих звонков

Прежде чем приложение сможет принять входящий вызов, оно должно открыть строку. Строка открывается в результате того, что приложение вызывает функцию TAPI lineOpen . Этот вызов функции TAPI приводит к тому, что базовые драйверы инкапсулируют параметры TAPI в структурах NDIS, чтобы подготовиться к приему входящего вызова. После того как драйвер мини-порта CoNDIS WAN получит входящий вызов, драйвер мини-порта должен сначала создать виртуальное подключение (VC) с драйвером NDPROXY, а затем уведомить NDPROXY о входящем вызове. NDPROXY, в свою очередь, уведомляет приложение через TAPI. В следующем списке описывается настройка, подключение и выполнение входящего звонка.

  • NDPROXY задает параметры TAPI для входящего подключения в структуре CO_AF_TAPI_SAP . NDPROXY заполняет элементы этой структуры следующими сведениями, которые были переданы в функции TAPI lineOpen :

    • Идентификатор открытой строки в элементе ulLineID
    • Адрес входящего подключения в элементе ulAddressID
    • Режим мультимедиа информационного потока входящего подключения в элементе ulMediaModes
  • NDPROXY накладывает структуру CO_AF_TAPI_SAP на элемент SAPструктуры CO_SAP и задает для элемента SapLength CO_SAP размер CO_AF_TAPI_SAP. NDPROXY также должен задать для элемента SapType CO_SAP значение AF_TAPI_SAP_TYPE.

  • После того как NDPROXY инкапсулирует параметры TAPI, NDPROXY вызывает функцию NdisClRegisterSap , чтобы подготовиться к приему входящих вызовов. В этом вызове функции NDPROXY передает указатель на заполненную CO_SAP структуру, указывающую точку доступа службы (SAP), в которой NDPROXY может принимать входящие вызовы. NDIS перенаправит структуру CO_SAP в функцию ProtocolCmRegisterSap драйвера диспетчера вызовов мини-порта CoNDIS WAN (MCM). ProtocolCmRegisterSap при необходимости взаимодействует с устройствами управления сетью или другими агентами, зависящими от носителя, чтобы зарегистрировать SAP в сети для NDPROXY. После того как драйвер минипорта зарегистрировал SAP, он может принять предложение о входящих звонках, направленное этой SAP.

  • Драйвер мини-порта CoNDIS WAN оповещается о входящем вызове путем передачи сообщений из сети. Из этих сигнальных сообщений драйвер мини-порта извлекает параметры вызова для вызова, включая SAP, к которому обращается входящий звонок.

  • Перед указанием входящего вызова NDPROXY драйвер минипорта вызывает функцию NdisMCmCreateVc , чтобы инициировать создание VC с помощью NDPROXY. NDPROXY выделяет и инициализирует ресурсы, необходимые для VC, и сохраняет дескриптор в VC.

  • Драйвер мини-порта CoNDIS WAN задает параметры TAPI для входящего вызова в CO_AF_TAPI_INCOMING_CALL_PARAMETERS структуре. Драйвер мини-порта заполняет элементы этой структуры следующими сведениями, извлеченными из сигнальных сообщений:

    • Идентификатор строки в элементе ulLineID
    • Адрес входящего звонка в элементе ulAddressID
    • CO_TAPI_FLAG_INCOMING_CALL бит в элементе ulFlags . Все остальные биты ulFlag зарезервированы и должны иметь значение 0.
    • Структура LINECALLPARAMS в элементе LineCallInfo . Члены LINECALLPARAMS указывают параметры вызова TAPI для входящего звонка.
  • Драйвер мини-порта накладывает CO_AF_TAPI_INCOMING_CALL_PARAMETERS на элемент Parameters структуры CO_SPECIFIC_PARAMETERS и задает для элемента Length CO_SPECIFIC_PARAMETERS размер CO_AF_TAPI_INCOMING_CALL_PARAMETERS.

  • Драйвер мини-порта задает структуру CO_SPECIFIC_PARAMETERS для элемента MediaSpecificструктуры CO_MEDIA_PARAMETERS .

  • Драйвер мини-порта задает указатель на структуру CO_MEDIA_PARAMETERS на элемент MediaParametersструктуры CO_CALL_PARAMETERS .

  • Драйвер мини-порта также должен задать член CallMgrParameters структуры CO_CALL_PARAMETERS, чтобы указать качество обслуживания (QoS) передачи пакетов, например пропускную способность. Чтобы задать этот элемент CallMgrParameters , драйвер мини-порта заполняет элементы структуры CO_CALL_MANAGER_PARAMETERS и указывает этой структуре значение CallMgrParameters. Например, чтобы определить скорость передачи и приема в байтах в секунду для VC, драйвер мини-порта должен задать элементы PeakBandwidth членов передачи и получения CO_CALL_MANAGER_PARAMETERS. Элементы Передачи и получения являются структурами FLOWSPEC. Дополнительные сведения о структуре FLOWSPEC см. в Microsoft Windows SDK.

  • После того как драйвер мини-порта инкапсулирует параметры TAPI и заполняет элемент CallMgrParameters CO_CALL_MANAGER_PARAMETERS, он вызывает функцию NdisMCmDispatchIncomingCall , чтобы указать входящий вызов NDPROXY. В этом вызове драйвер мини-порта передает следующее:

    • Дескриптор, идентифицирующий SAP, которому адресован входящий вызов.
    • Дескриптор, идентифицирующий VC для входящего вызова.
    • Указатель на заполненную CO_CALL_PARAMETERS структуру
  • NDPROXY возвращает NDIS_STATUS_PENDING драйверу мини-порта, поэтому NDPROXY может выполнять NdisMCmDispatchIncomingCall асинхронно.

  • После того как приложение TAPI отвечает на входящий вызов с помощью функции lineAnswer , NDPROXY вызывает функцию NdisClIncomingCallComplete . NDIS, в свою очередь, вызывает функцию ProtocolCmIncomingCallComplete драйвера минипорта . Если NDPROXY возвращает код NDIS_STATUS_SUCCESS, это указывает на принятие параметров вызова. Если NDPROXY считает параметры вызова неприемлемыми, он может запросить изменение параметров вызова, задав элементу Flags в структуре CO_CALL_PARAMETERS значение CALL_PARAMETERS_CHANGED и указав измененные параметры вызова. Если NDPROXY принимает входящий вызов, драйвер минипорта должен отправлять сигнальные сообщения, чтобы указать вызывающей сущности, что вызов был принят. В противном случае драйвер мини-порта должен отправлять сигнальные сообщения, указывающие, что вызов отклонен. Если NDPROXY запрашивает изменение параметров вызова, драйвер минипорта отправляет сигнальные сообщения, чтобы запросить изменение параметров вызова.

  • Драйвер минипорта активирует VC, созданный драйвером минипорта с помощью NDPROXY, и должен также вызвать функцию NdisMCmActivateVc , чтобы уведомить NDPROXY о том, что драйвер минипорта готов к передаче пакетов в VC.

  • Если NDPROXY отклоняет вызов, драйвер мини-порта вызывает функцию NdisMCmDeactivateVc , чтобы отключить VC, созданный драйвером минипорта для входящего вызова. После отключения VC драйвер минипорта вызывает функцию NdisMCmDeleteVc , чтобы удалить VC.

  • В зависимости от того, принял ли NDPROXY входящий вызов и было ли успешно установлено сквозное подключение, драйвер мини-порта вызывает функции NdisMCmDispatchCallConnected или NdisMCmDispatchIncomingCloseCall . Обратите внимание, что если сущность удаленного вызова разорвал вызов, она отправляет сигнальные сообщения, указывающие на то, что сквозное подключение не было успешно установлено. NdisMCmDispatchCallConnected уведомляет NDPROXY о том, что передача данных может начаться в VC, созданном и активированном драйвером мини-порта для входящего вызова. NdisMCmDispatchIncomingCloseCall сообщает NDPROXY, чтобы отключить входящий вызов.

  • Если NDPROXY направлен на удаление входящего вызова, он вызывает функцию NdisClCloseCall , чтобы подтвердить, что она не будет ни пытаться отправить, ни ожидать получения данных в VC. NDIS, в свою очередь, вызывает функцию ProtocolCmCloseCall драйвера мини-порта. Затем драйвер мини-порта вызывает функцию NdisMCmDeactivateVc , чтобы отключить VC. После отключения VC драйвер минипорта вызывает функцию NdisMCmDeleteVc , чтобы удалить VC.

  • После того как приложение TAPI примет входящий вызов и NDPROXY уведомит приложение о том, что вызов подключен, приложение вызывает функцию 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_INCOMING_CALL_PARAMETERS структуру, содержащую параметры входящего вызова. NDIS, в свою очередь, вызывает функцию ProtocolClIncomingCall NDISWAN, в которой NDISWAN принимает или отклоняет запрошенное подключение.

  • После принятия решения о принятии подключения и, возможно, изменении параметров вызова, NDISWAN вызывает функцию NdisClIncomingCallComplete . NDIS, в свою очередь, вызывает функцию ProtocolCmIncomingCallComplete драйвера минипорта . В зависимости от того, принял ли NDISWAN входящий вызов и принимает ли драйвер мини-порта предлагаемые изменения NDISWAN в параметрах вызова, драйвер мини-порта вызывает функции NdisCmDispatchCallConnected или NdisCmDispatchIncomingCloseCall . NdisCmDispatchCallConnected уведомляет NDISWAN о том, что передача данных может начаться на виртуальном сервере, созданном драйвером мини-порта для входящего вызова. NdisCmDispatchIncomingCloseCall сообщает NDISWAN и NDPROXY о том, что входящий вызов будет удален.

  • После того как NDISWAN примет входящий вызов, NDPROXY вызывает функцию NdisCoGetTapiCallId , чтобы получить строку, определяющую контекст NDISWAN для VC. NDPROXY передает эту строку обратно в приложение TAPI. Приложение TAPI использует эту строку контекста VC для завершения вызова lineGetID.