接受来电
在应用程序可以接受传入呼叫之前,它首先必须打开一个行。 由于应用程序调用 TAPI lineOpen 函数,将打开行。 此 TAPI 函数调用会导致基础驱动程序在 NDIS 结构中封装 TAPI 参数,以便准备接收传入呼叫。 CoNDIS WAN 微型端口驱动程序收到传入呼叫后,微型端口驱动程序必须先创建虚拟连接 (VC) 与 NDPROXY 驱动程序,然后通知 NDPROXY 传入呼叫。 NDPROXY 又通过 TAPI 通知应用程序。 以下列表介绍了如何设置、连接和进行传入呼叫:
NDPROXY 为 CO_AF_TAPI_SAP 结构中的传入连接指定 TAPI 参数。 NDPROXY 使用 TAPI lineOpen 函数中传递的以下信息填充此结构的成员:
- ulLineID 成员中的开行标识符
- ulAddressID 成员中传入连接的地址
- ulMediaModes 成员中传入连接的信息流的媒体模式
NDPROXY 将CO_AF_TAPI_SAP结构覆盖在 CO_SAP 结构的 Sap 成员上,并将 CO_SAP 的 SapLength 成员设置为CO_AF_TAPI_SAP的大小。 NDPROXY 还必须将 CO_SAP 的 SapType 成员设置为 AF_TAPI_SAP_TYPE。
NDPROXY 封装 TAPI 参数后,NDPROXY 将调用 NdisClRegisterSap 函数,使其准备好接收传入呼叫。 在此函数调用中,NDPROXY 传递指向填充CO_SAP结构的指针,该结构指定 NDPROXY 可以接收传入呼叫的服务接入点 (SAP) 。 NDIS 将CO_SAP结构转发到 CoNDIS WAN 微型端口调用管理器的 ProtocolCmRegisterSap 函数 (MCM) 驱动程序。 ProtocolCmRegisterSap 在必要时与网络控制设备或其他特定于媒体的代理进行通信,以便在网络上为 NDPROXY 注册 SAP。 微型端口驱动程序注册 SAP 后,可以接受定向到该 SAP 的传入呼叫套餐。
CoNDIS WAN 微型端口驱动程序通过发出来自网络的消息发出信号来提醒传入呼叫。 从这些信号消息中,微型端口驱动程序提取呼叫的调用参数,包括接收传入呼叫的 SAP。
在指示传入调用 NDPROXY 之前,微型端口驱动程序会调用 NdisMCmCreateVc 函数,以启动使用 NDPROXY 创建 VC。 NDPROXY 分配和初始化 VC 所需的资源,并将句柄存储到 VC。
CoNDIS WAN 微型端口驱动程序在 CO_AF_TAPI_INCOMING_CALL_PARAMETERS 结构中为传入调用设置 TAPI 参数。 微型端口驱动程序使用从信号消息中提取的以下信息填充此结构的成员:
- ulLineID 成员中的行标识符
- ulAddressID 成员中传入呼叫的地址
- ulFlags 成员中的CO_TAPI_FLAG_INCOMING_CALL位。 所有其他 ulFlags 位是保留的,并且必须设置为 0。
- LineCallInfo 成员中的 LINECALLPARAMS 结构。 LINECALLPARAMS 的成员为传入呼叫指定 TAPI 调用参数。
微型端口驱动程序覆盖CO_SPECIFIC_PARAMETERS结构的 Parameters 成员上的 CO_AF_TAPI_INCOMING_CALL_PARAMETERS ,并将CO_SPECIFIC_PARAMETERS的 Length 成员设置为CO_AF_TAPI_INCOMING_CALL_PARAMETERS的大小。
微型端口驱动程序将 CO_SPECIFIC_PARAMETERS 结构设置为 CO_MEDIA_PARAMETERS 结构的 MediaSpecific 成员。
微型端口驱动程序将指向CO_MEDIA_PARAMETERS结构的指针设置为CO_CALL_PARAMETERS结构的 MediaParameters 成员。
微型端口驱动程序还必须设置 CO_CALL_PARAMETERS 结构的 CallMgrParameters 成员,以指定传输数据包(如带宽)的服务质量 (QoS) 。 若要设置此 CallMgrParameters 成员,微型端口驱动程序将填充 CO_CALL_MANAGER_PARAMETERS 结构的成员,并将此结构指向 CallMgrParameters。 例如,若要识别 VC 的传输和接收速度(以字节/秒为单位),微型端口驱动程序必须设置CO_CALL_MANAGER_PARAMETERS的发射和接收成员的 PeakBandwidth 成员。 传输和接收成员是 FLOWSPEC 结构。 有关 FLOWSPEC 结构的详细信息,请参阅Microsoft Windows SDK。
微型端口驱动程序封装 TAPI 参数并填充 CO_CALL_MANAGER_PARAMETERS 的 CallMgrParameters 成员后,它会调用 NdisMCmDispatchIncomingCall 函数来指示对 NDPROXY 的传入调用。 在此调用中,微型端口驱动程序传递以下内容:
- 标识传入呼叫的 SAP 的句柄
- 标识传入调用的 VC 的句柄
- 指向已填充CO_CALL_PARAMETERS结构的指针
NDPROXY 将NDIS_STATUS_PENDING返回到微型端口驱动程序,因此 NDPROXY 可以异步完成 NdisMCmDispatchIncomingCall 。
TAPI 应用程序使用 lineAnswer 函数应答传入调用后,NDPROXY 调用 NdisClIncomingCallComplete 函数。 NDIS 依次调用微型端口驱动程序的 ProtocolCmIncomingCallComplete 函数。 如果 NDPROXY 返回NDIS_STATUS_SUCCESS代码,则表示接受调用参数。 如果 NDPROXY 发现调用参数不可接受,它可以通过将 CO_CALL_PARAMETERS 结构中的 Flags 成员设置为CALL_PARAMETERS_CHANGED,并通过提供修订后的调用参数来请求对调用参数进行更改。 如果 NDPROXY 接受传入呼叫,微型端口驱动程序应发送信号消息,以指示呼叫实体已接受呼叫。 否则,微型端口驱动程序应发送信号消息以指示呼叫已被拒绝。 如果 NDPROXY 请求更改调用参数,微型端口驱动程序会发送信号消息以请求更改调用参数。
微型端口驱动程序激活微型端口驱动程序使用 NDPROXY 创建的 VC,并且还必须调用 NdisMCmActivateVc 函数,以通知 NDPROXY 微型端口驱动程序已准备好在 VC 上传输数据包。
如果 NDPROXY 拒绝调用,微型端口驱动程序会调用 NdisMCmDeactivateVc 函数来停用微型端口驱动程序为传入呼叫创建的 VC。 停用 VC 后,微型端口驱动程序调用 NdisMCmDeleteVc 函数以删除 VC。
根据 NDPROXY 是否接受传入调用以及是否成功建立端到端连接,微型端口驱动程序调用 NdisMCmDispatchCallConnected 或 NdisMCmDispatchIncomingCloseCall 函数。 请注意,如果远程调用实体中断呼叫,它会发送信号消息以指示未成功建立端到端连接。 NdisMCmDispatchCallConnected 通知 NDPROXY,数据传输可以在微型端口驱动程序为传入呼叫创建并激活的 VC 上开始。 NdisMCmDispatchIncomingCloseCall 通知 NDPROXY 取消传入呼叫。
如果 NDPROXY 被指示拆除传入调用,它将调用 NdisClClCloseCall 函数来确认它既不会尝试发送也不期望接收 VC 上的数据。 NDIS 依次调用微型端口驱动程序的 ProtocolCmCloseCall 函数。 然后,微型端口驱动程序调用 NdisMCmDeactivateVc 函数来停用 VC。 停用 VC 后,微型端口驱动程序调用 NdisMCmDeleteVc 函数以删除 VC。
TAPI 应用程序接受传入呼叫并 NDPROXY 通知应用程序呼叫已连接后,应用程序将调用 TAPI lineGetID 函数,以通知 NDPROXY 找到相应的 CoNDIS 客户端。 在此 行GetID 调用中,TAPI 应用程序为应用程序需要句柄的特定 TAPI 设备类提供字符串。 NDPROXY 使用此字符串来查找之前为特定 TAPI 设备类注册 SAP 的 CoNDIS 客户端。 如果 CoNDIS 客户端为 NDISWAN,则字符串为 NDIS。 如果 NDPROXY 找到的 SAP 具有与 TAPI 应用程序传递的字符串匹配的字符串,则 NDPROXY 将调用 NdisMCmCreateVc ,以使用 NDISWAN 设置连接终结点,该连接终结点可以调度传入呼叫的通知。 NDIS 依次调用 NDISWAN 的 ProtocolCoCreateVc 函数,并传递表示 VC 的句柄。
NDPROXY 使用 NDISWAN 设置连接终结点后,会调用 NdisCmDispatchIncomingCall 函数,以通知 NDISWAN 有关传入呼叫。 在此调用中,NDPROXY 传递包含传入调用参数的封装CO_AF_TAPI_INCOMING_CALL_PARAMETERS结构。 NDIS 依次调用 NDISWAN 的 ProtocolClIncomingCall 函数,其中 NDISWAN 接受或拒绝请求的连接。
在决定是否接受连接并可能更改调用参数后,NDISWAN 调用 NdisClIncomingCallComplete 函数。 NDIS 依次调用微型端口驱动程序的 ProtocolCmIncomingCallComplete 函数。 根据 NDISWAN 是否接受传入调用以及微型端口驱动程序是否接受还是拒绝 NDISWAN 对调用参数的建议更改,微型端口驱动程序调用 NdisCmDispatchCallConnected 或 NdisCmDispatchIncomingCloseCall 函数。 NdisCmDispatchCallConnected 通知 NDISWAN,数据传输可以在微型端口驱动程序为传入呼叫创建的 VC 上开始。 NdisCmDispatchIncomingCloseCall 通知 NDISWAN 和 NDPROXY 取消传入呼叫。
NDISWAN 接受传入调用后,NDPROXY 调用 NdisCoGetTapiCallId 函数以检索标识 NDISWAN 的 VC 上下文的字符串。 NDPROXY 将此字符串传递回 TAPI 应用程序。 TAPI 应用程序使用此 VC 上下文字符串完成对 lineGetID 的调用。