指示来电

呼叫管理器或 MCM 驱动程序通过向来自网络的消息发出信号,向传入呼叫发出警报。 从这些信号消息中,调用管理器或 MCM 驱动程序提取调用的调用参数,包括传入调用的 SAP。

下图显示了指示传入呼叫的 MCM 驱动程序。

diagram illustrating a call manager indicating an incoming call.

下图显示了指示传入呼叫的呼叫管理器。

indicating an incoming call through an mcm driver.

如果呼叫管理器或 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 可以同步完成,也可以使用 NdisClIncomingCallComplete 返回NDIS_STATUS_PENDING和异步完成。 调用 NdisClIncomingCallComplete 会导致 NDIS 调用调用管理器或 MCM 驱动程序的 ProtocolCmIncomingCallComplete 函数。

由 ProtocolClIncomingCall 同步完成或提供给 NdisClIncomingCallComplete 返回的NDIS_STATUS代码表示客户端接受或拒绝传入调用。 客户端还会返回缓冲CO_CALL_PARAMETERS结构中调用的调用参数。 如果客户端发现调用参数不能接受,则它可以(如果信号协议允许)通过设置具有CALL_PARAMETERS_CHANGED的CO_CALL_PARAMETERS结构中的 Flags 成员并在缓冲CO_CALL_PARAMETERS结构中提供修订的调用参数来请求调用参数的更改。

如果客户端接受传入呼叫,则调用管理器或 MCM 驱动程序应发送信号消息,以指示呼叫实体已接受呼叫。 否则,呼叫管理器或 MCM 驱动程序应发送信号消息,以指示呼叫已被拒绝。 如果客户端请求调用参数中的更改,则调用管理器或 MCM 驱动程序会发送信号消息以请求调用参数中的更改。

如果客户端接受了调用,或者远程方接受了客户端请求的调用参数更改,则调用管理器调用 NdisCmDispatchCallConnected,而 MCM 驱动程序调用 NdisMCmDispatchCallConnected。 调用 Ndis (M) CmDispatchCallConnected 会导致 NDIS 调用客户端的 ProtocolClCallConnected 函数。

如果客户端拒绝了呼叫,并且呼叫管理器或 MCM 驱动程序已激活传入呼叫的 VC,则调用管理器或 MCM 驱动程序调用 Ndis (M) CmDeactivateVc ,以便在激活 VC 时停用 VC。 然后,调用管理器或 MCM 驱动程序可以通过调用管理器或 NdisMCmDeleteVc(在 MCM 驱动程序的情况下调用 NdisCoDeleteVc)来启动删除 VC

如果客户端接受了呼叫,但未成功建立端到端连接 (,例如,远程方将中断呼叫) ,则呼叫管理器或 MCM 驱动程序不会调用 Ndis (M) CmDispatchCallConnected。 相反,它将调用 Ndis (M) CmDispatchIncomingCloseCall,这会导致 NDIS 调用客户端的 ProtocolClIncomingCloseCall 函数。 然后,客户端必须调用 NdisCloseCall 来完成调用的拆解。 然后,调用管理器或 MCM 驱动程序调用 Ndis (M) CmDeactivateVC 来停用为传入调用创建的 VC 。 然后,调用管理器或 MCM 驱动程序可以通过调用管理器或 NdisMCmDeleteVc(在 MCM 驱动程序的情况下调用 NdisCoDeleteVc)来启动删除 VC