拨打电话
如果应用程序尝试发出传出调用,则必须首先打开一条线路。 由于应用程序调用 TAPI lineOpen 函数,将打开一行。 若要在以前打开的线路上放置电话呼叫,应用程序会调用 TAPI lineMakeCall 函数,并将指针传递到特定目标地址。 如果请求除默认调用设置参数之外的任何参数,应用程序还会传递指向 LINECALLPARAMS 结构的指针。 如果应用程序使用默认的调用设置参数, lineMakeCall 在 LINECALLPARAMS 结构中提供这些参数。 此结构的成员指定应如何设置电话呼叫。
这些 TAPI 函数调用会导致 NDPROXY 驱动程序首先创建虚拟连接 (VC) 与 CoNDIS WAN 微型端口驱动程序,然后将 TAPI 参数封装在 NDIS 结构中,以便发出传出调用。 微型端口驱动程序将使用这些 TAPI 参数来设置传出呼叫。 下面介绍了如何连接、设置和进行传出呼叫:
NDPROXY 调用 NdisCoCreateVc 以使用微型端口驱动程序启动 VC 的创建。 在 NDPROXY 调用 NdisCoCreateVc 后,NDIS 将调用集成到微型端口驱动程序中的调用管理器的 ProtocolCoCreateVc 函数作为同步操作。 NDIS 将表示 VC 的句柄传递给 ProtocolCoCreateVc 。 如果对 NdisCoCreateVc 的调用成功,NDIS 将填充并返回 VC 句柄。 ProtocolCoCreateVc 执行任何必要的动态资源和结构的分配,微型端口调用管理器 (MCM) 驱动程序需要对稍后将激活的 VC 执行后续操作。 此类资源包括但不限于内存缓冲区、数据结构、事件和其他类似资源。
NDPROXY 为 CO_AF_TAPI_MAKE_CALL_PARAMETERS 结构中的传出调用指定 TAPI 参数。 NDPROXY 使用 TAPI lineMakeCall 函数中传递的以下信息填充此结构的成员:
- DestAddress 成员中的目标地址
- ulLineID 成员中的开行标识符
- LineCallParams 成员中的 LINECALLPARAMS 结构
NDPROXY 覆盖CO_SPECIFIC_PARAMETERS结构的 Parameters 成员上的 CO_AF_TAPI_MAKE_CALL_PARAMETERS 结构,并将 CO_SPECIFIC_PARAMETERS 的 Length 成员设置为CO_AF_TAPI_MAKE_CALL_PARAMETERS的大小。
NDPROXY 将 CO_SPECIFIC_PARAMETERS 结构设置为 CO_MEDIA_PARAMETERS 结构的 MediaSpecific 成员。
NDPROXY 将指向 CO_MEDIA_PARAMETERS 结构的指针设置为 CO_CALL_PARAMETERS 结构的 MediaParameters 成员。
NDPROXY 封装 TAPI 参数后,NDPROXY 会调用 NdisClMakeCall 函数来启动传出调用。 在此函数调用中,NDPROXY 传递指向填充CO_CALL_PARAMETERS结构的指针。 NDIS 依次调用 CoNDIS WAN 微型端口驱动程序的调用管理器的 ProtocolCmMakeCall 函数。 微型端口驱动程序应仅检查嵌入在 CO_CALL_PARAMETERS 中的CO_AF_TAPI_MAKE_CALL_PARAMETERS结构。 在这种情况下,没有其他调用参数有意义。 如果微型端口驱动程序随后激活传出调用的 VC,则微型端口驱动程序会调用 NdisMCmActivateVc 函数,并将指针传递给填充CO_CALL_PARAMETERS。
在微型端口驱动程序与网络协商建立 VC 的电话呼叫参数并为这些调用参数设置 NIC 后,微型端口驱动程序调用 NdisMCmMakeCallComplete 函数,以指示它已准备好在 VC 上进行数据传输。 在此调用中,微型端口驱动程序必须将句柄传递给 VC,并修改电话呼叫参数。
微型端口驱动程序必须修改 CO_CALL_PARAMETERS 结构的 CallMgrParameters 成员,以指定传输数据包的服务质量 (QoS) ,例如带宽。 若要设置此 CallMgrParameters 成员,微型端口驱动程序将填充 CO_CALL_MANAGER_PARAMETERS 结构的成员,并将此结构指向 CallMgrParameters。 例如,若要识别 VC 的传输和接收速度(以字节/秒为单位),微型端口驱动程序必须设置 CO_CALL_MANAGER_PARAMETERS 的 Transmit 和 Receive 成员的 PeakBandwidth 成员。 传输和接收成员是 FLOWSPEC 结构。 有关 FLOWSPEC 结构的详细信息,请参阅Microsoft Windows SDK。
如果微型端口驱动程序修改了电话呼叫参数,则必须使用 CALL_PARAMETERS_CHANGED 设置 CO_CALL_PARAMETERS 结构中的 Flags 成员。 由于微型端口驱动程序发出的 NdisMCmMakeCallComplete 调用,NDIS 调用 NDPROXY 的 ProtocolClMakeCallComplete 函数来完成使用 NdisClMakeCall 启动的异步操作。
微型端口驱动程序成功完成传出呼叫后,NDPROXY 会通知 TAPI 应用程序呼叫已连接。 然后,此 TAPI 应用程序调用 TAPI lineGetID 函数以通知 NDPROXY 找到相应的 CoNDIS 客户端。 在此 lineGetID 调用中,TAPI 应用程序为应用程序需要句柄的特定 TAPI 设备类提供字符串。 NDPROXY 使用此字符串查找之前为特定 TAPI 设备类注册 SAP 的 CoNDIS 客户端。 如果 CoNDIS 客户端为 NDISWAN,则字符串为 NDIS。 如果 NDPROXY 找到的 SAP 具有与 TAPI 应用程序传递的字符串匹配的字符串,则 NDPROXY 会调用 NdisMCmCreateVc 来设置一个具有 NDISWAN 的连接终结点,它可以在该终结点上调度发出传出呼叫的通知。 NDIS 依次调用 NDISWAN 的 ProtocolCoCreateVc 函数并传递表示 VC 的句柄。
使用 NDISWAN 设置连接终结点后,NDPROXY 会调用 NdisCmDispatchIncomingCall 函数来通知 NDISWAN 传出呼叫。 在此调用中,NDPROXY 传递包含传出调用参数的封装CO_AF_TAPI_MAKE_CALL_PARAMETERS结构。 NDIS 依次调用 NDISWAN 的 ProtocolClIncomingCall 函数,其中 NDISWAN 接受或拒绝请求的连接。 如果 NDISWAN 更改传递给它的调用参数,则必须使用 CALL_PARAMETERS_CHANGED 设置 CO_CALL_PARAMETERS 结构中的 Flags 成员。
在决定是否接受连接以及可能更改调用参数后,NDISWAN 调用 NdisClIncomingCallComplete 函数。 NDIS 依次调用微型端口驱动程序的 ProtocolCmIncomingCallComplete 函数。 根据 NDISWAN 是否接受传出调用以及微型端口驱动程序是接受还是拒绝 NDISWAN 对调用参数的建议更改,微型端口驱动程序调用 NdisCmDispatchCallConnected 或 NdisCmDispatchIncomingCloseCall 函数。 NdisCmDispatchCallConnected 通知 NDISWAN,数据传输可以在 NDPROXY 为传出呼叫创建的 VC 上开始。 NdisCmDispatchIncomingCloseCall 通知 NDISWAN 和 NDPROXY 取消提议的传出呼叫。
NDISWAN 接受传出调用后,NDPROXY 调用 NdisCoGetTapiCallId 函数以检索标识 VC 的 NDISWAN 上下文的字符串。 NDPROXY 将此字符串传递回 TAPI 应用程序。 TAPI 应用程序使用此 VC 上下文字符串完成对 lineGetID 的调用。