Указание входящего вызова
Диспетчер вызовов или драйвер MCM оповещается о входящем вызове путем передачи сообщений из сети. Из этих сигнальных сообщений диспетчер вызовов или драйвер MCM извлекает параметры вызова для вызова, включая SAP, к которому обращается входящий вызов.
На следующем рисунке показан драйвер MCM, указывающий на входящий вызов.
На следующем рисунке показан диспетчер звонков, указывающий на входящий вызов.
Если параметры входящих вызовов неприемлемы для диспетчера вызовов или драйвера MCM, он может попытаться согласовать изменение этих параметров с удаленной стороной, если такое согласование разрешено протоколом сигнализации. Кроме того, клиент, которому направляется входящий вызов, может попытаться согласовать параметры вызова после получения указания вызова от диспетчера вызовов или драйвера MCM (см. раздел Инициированный клиентом запрос на изменение параметров вызова). Если диспетчер вызовов или драйвер MCM не могут согласовать допустимые параметры вызова с удаленной стороной, он может отказаться от вызова. Протокол сигнализации определяет, что возможно в таких случаях.
Перед указанием входящего вызова клиенту диспетчер вызовов или драйвер MCM должен определить SAP, на который направляется вызов. SAP должен быть ранее зарегистрирован клиентом. Диспетчер вызовов или драйвер MCM также должен инициировать создание VC и активацию этого VC.
Затем диспетчер вызовов или драйвер MCM указывает входящий вызов клиенту, который зарегистрировал SAP, на который направляется входящий вызов. Диспетчер вызовов указывает на входящий вызов с помощью NdisCmDispatchIncomingCall. Драйвер MCM указывает на входящий вызов с NdisMCmDispatchIncomingCall.
В вызове Ndis(M)CmDispatchIncomingCall диспетчер вызовов или драйвер MCM передает следующее:
NdisSapHandle, идентифицирующий SAP, к которому обращается входящий вызов.
NdisVcHandle, определяющий виртуальный канал для входящего вызова.
Указатель на структуру типа CO_CALL_PARAMETERS, которая содержит параметры вызова для вызова.
Вызов Ndis(M)CmDispatchIncomingCall приводит к тому, что NDIS вызывает функцию ProtocolClIncomingCall клиента, в рамках которой клиент принимает или отклоняет запрошенные подключения. ProtocolClIncomingCall должен проверять параметры SAP, VC и вызова.
ProtocolClIncomingCall может выполняться синхронно или возвращать NDIS_STATUS_PENDING и выполнять асинхронно с помощью NdisClIncomingCallComplete. Вызов NdisClIncomingCallComplete вызывает функцию ProtocolCmIncomingCallComplete диспетчера вызовов или драйвера MCM.
Код NDIS_STATUS, возвращаемый синхронным завершением ProtocolClIncomingCall или переданный в NdisClIncomingCallComplete , указывает на принятие или отклонение входящего вызова клиентом. Клиент также возвращает параметры вызова в буферизованной структуре CO_CALL_PARAMETERS. Если клиент считает параметры вызова неприемлемыми, он может, если это разрешено протоколом сигнализации, запросить изменение параметров вызова, задав член Flags в структуре CO_CALL_PARAMETERS CALL_PARAMETERS_CHANGED и указав измененные параметры вызова в буферизованной структуре CO_CALL_PARAMETERS.
Если клиент принимает входящий вызов, диспетчер вызовов или драйвер MCM должны отправить сигнальные сообщения, указывающие вызывающей сущности, что звонок был принят. В противном случае диспетчер вызовов или драйвер MCM должны отправлять сигнальные сообщения, указывающие на то, что звонок отклонен. Если клиент запрашивает изменение параметров вызова, диспетчер вызовов или драйвер MCM отправляет сигнальные сообщения, чтобы запросить изменение параметров вызова.
Если клиент принял вызов или запрошенное изменение параметров вызова было принято удаленной стороной, диспетчер вызовов вызывает NdisCmDispatchCallConnected, а драйвер MCM вызывает NdisMCmDispatchCallConnected. Вызов Ndis(M)CmDispatchCallConnected приводит к тому, что NDIS вызывает функцию ProtocolClCallConnected клиента.
Если клиент отклонил вызов, а диспетчер вызовов или драйвер MCM уже активировал VC для входящего вызова, диспетчер вызовов или драйвер MCM вызывает Ndis(M)CmDeactivateVc , чтобы отключить VC, если он активирован. Затем диспетчер вызовов или драйвер MCM может инициировать удаление VC , вызвав NdisCoDeleteVc в случае диспетчера вызовов или NdisMCmDeleteVc в случае драйвера MCM.
Если клиент принял вызов, но сквозное подключение не было установлено (например, из-за того, что удаленная сторона разорвал звонок), диспетчер вызовов или драйвер MCM не будет вызывать Ndis(M)CmDispatchCallConnected. Вместо этого он вызывает Ndis(M)CmDispatchIncomingCloseCall, что приводит NDIS к вызову функции ProtocolClIncomingCloseCall клиента. Затем клиент должен вызвать NdisClCloseCall , чтобы завершить удаление вызова. Затем диспетчер вызовов или драйвер MCM вызывает Ndis(M)CmDeactivateVC , чтобы отключить VC , созданный для входящего вызова. Затем диспетчер вызовов или драйвер MCM может инициировать удаление VC , вызвав NdisCoDeleteVc в случае диспетчера вызовов или NdisMCmDeleteVc в случае драйвера MCM.