Fazendo chamadas de saída
Se um aplicativo tentar fazer uma chamada de saída, ele deverá primeiro abrir uma linha. Uma linha é aberta como resultado de um aplicativo que chama a função lineOpen tapi. Para colocar uma chamada de telefonia na linha aberta anteriormente, o aplicativo chama a função lineMakeCall tapi e passa um ponteiro para o endereço de destino específico. Se qualquer coisa além dos parâmetros de configuração de chamada padrão forem solicitados, o aplicativo também passará um ponteiro para uma estrutura LINECALLPARAMS. Se o aplicativo usar parâmetros de configuração de chamada padrão, lineMakeCall fornecerá esses parâmetros em uma estrutura LINECALLPARAMS. Os membros dessa estrutura especificam como a chamada de telefonia deve ser configurada.
Essas chamadas de função TAPI fazem com que o driver NDPROXY primeiro crie uma VC (conexão virtual) com o driver de miniporto WAN do CoNDIS e, em seguida, encapsular parâmetros TAPI em estruturas NDIS para fazer a chamada de saída. O driver de miniporta usará esses parâmetros TAPI para configurar a chamada de saída. O seguinte descreve como a chamada de saída está conectada, configurada e feita:
NDPROXY chama NdisCoCreateVc para iniciar a criação da VC com o driver de miniporto. Depois que NDPROXY chama NdisCoCreateVc, o NDIS chama, como uma operação síncrona, a função ProtocolCoCreateVc do gerenciador de chamadas integrada ao driver de miniporto. O NDIS passa para ProtocolCoCreateVc um identificador que representa a VC. Se a chamada para NdisCoCreateVc for bem-sucedida, o NDIS preencherá e retornará o identificador de VC. ProtocolCoCreateVc executa todas as alocações necessárias de recursos dinâmicos e estruturas que o driver mcm (gerenciador de chamadas de miniporto) exige para executar operações subsequentes na VC que serão ativadas posteriormente. Esses recursos incluem, mas não se limitam a buffers de memória, estruturas de dados, eventos e outros recursos semelhantes.
NDPROXY especifica os parâmetros TAPI para uma chamada de saída em uma estrutura CO_AF_TAPI_MAKE_CALL_PARAMETERS . NDPROXY preenche os membros dessa estrutura com as seguintes informações que foram passadas na função lineMakeCall do TAPI:
- O endereço de destino no membro DestAddress
- O identificador de linha aberta no membro ulLineID
- A estrutura LINECALLPARAMS no membro LineCallParams
NDPROXY sobrepõe a estrutura CO_AF_TAPI_MAKE_CALL_PARAMETERS no membro Parameters de uma estrutura CO_SPECIFIC_PARAMETERS e define o membro Length de CO_SPECIFIC_PARAMETERS para o tamanho de CO_AF_TAPI_MAKE_CALL_PARAMETERS.
NDPROXY define a estrutura CO_SPECIFIC_PARAMETERS como o membro MediaSpecific de uma estrutura CO_MEDIA_PARAMETERS .
NDPROXY define um ponteiro para a estrutura CO_MEDIA_PARAMETERS para o membro MediaParameters de uma estrutura CO_CALL_PARAMETERS .
Depois que NDPROXY encapsula parâmetros TAPI, NDPROXY chama a função NdisClMakeCall para iniciar a chamada de saída. Nessa chamada de função, NDPROXY passa um ponteiro para a estrutura de CO_CALL_PARAMETERS preenchida. O NDIS, por sua vez, chama a função ProtocolCmMakeCall do gerenciador de chamadas do driver de miniporta da WAN coNDIS. O driver de miniporta deve examinar apenas a estrutura de CO_AF_TAPI_MAKE_CALL_PARAMETERS inserida em CO_CALL_PARAMETERS. Nenhum outro parâmetro de chamada é significativo nesse caso. Se o driver de miniporto ativar posteriormente a VC para a chamada de saída, o driver de miniporto chamará a função NdisMCmActivateVc e passará um ponteiro para o CO_CALL_PARAMETERS preenchido.
Depois que o driver de miniporto tiver negociado com a rede para estabelecer os parâmetros de chamada de telefonia para a VC e configurar uma NIC para esses parâmetros de chamada, o driver de miniporto chamará a função NdisMCmMakeCallComplete para indicar que ela está pronta para fazer transferências de dados na VC. Nessa chamada, o driver de miniporto deve passar o identificador para a VC e as modificações feitas nos parâmetros de chamada de telefonia.
O driver de miniporta deve modificar o membro CallMgrParameters da estrutura CO_CALL_PARAMETERS para especificar a qualidade de serviço (QoS) da transferência de pacotes, como a largura de banda. Para definir esse membro CallMgrParameters , o driver de miniporto preenche membros de uma estrutura CO_CALL_MANAGER_PARAMETERS e aponta essa estrutura para CallMgrParameters. Por exemplo, para identificar as velocidades de transmissão e recebimento em bytes por segundo para a VC, o driver de miniporto deve definir os membros PeakBandwidth dos membros Transmit e Receive de CO_CALL_MANAGER_PARAMETERS. Os membros Transmit e Receive são estruturas FLOWSPEC. Para obter mais informações sobre a estrutura FLOWSPEC, consulte o SDK do Microsoft Windows.
Se o driver de miniporto tiver modificado parâmetros de chamada de telefonia, ele deverá definir o membro Flags na estrutura CO_CALL_PARAMETERS com CALL_PARAMETERS_CHANGED. Como resultado da chamada NdisMCmMakeCallComplete feita pelo driver de miniporto, o NDIS chama a função ProtocolClMakeCallComplete do NDPROXY para concluir as operações assíncronas iniciadas com NdisClMakeCall.
Depois que o driver de miniporto concluir com êxito a chamada de saída, NDPROXY notificará um aplicativo TAPI de que a chamada está conectada. Esse aplicativo TAPI chama a função lineGetID tapi para informar NDPROXY para localizar o cliente CoNDIS apropriado. Nessa chamada lineGetID , o aplicativo TAPI fornece uma cadeia de caracteres para uma classe de dispositivo TAPI específica para a qual o aplicativo requer um identificador. NDPROXY usa essa cadeia de caracteres para localizar o cliente CoNDIS que registrou anteriormente um SAP para a classe de dispositivo TAPI específica. Se o cliente CoNDIS for NDISWAN, a cadeia de caracteres será NDIS. Se NDPROXY localizar um SAP com uma cadeia de caracteres que corresponda à cadeia de caracteres passada pelo aplicativo TAPI, NDPROXY chamará NdisMCmCreateVc para configurar um ponto de extremidade de conexão com NDISWAN no qual ele poderá expedir a notificação da chamada de saída que foi feita. O NDIS, por sua vez, chama a função ProtocolCoCreateVc da NDISWAN e passa um identificador que representa a VC.
Depois que NDPROXY configura o ponto de extremidade de conexão com o NDISWAN, ele chama a função NdisCmDispatchIncomingCall para notificar a NDISWAN sobre a chamada de saída. Nessa chamada, NDPROXY passa a estrutura de CO_AF_TAPI_MAKE_CALL_PARAMETERS encapsulada que contém os parâmetros de chamada de saída. O NDIS, por sua vez, chama a função ProtocolClIncomingCall da NDISWAN, na qual a NDISWAN aceita ou rejeita a conexão solicitada. Se o NDISWAN alterar os parâmetros de chamada passados para ele, ele deverá definir o membro Flags na estrutura CO_CALL_PARAMETERS com CALL_PARAMETERS_CHANGED.
Depois de decidir se deseja aceitar a conexão e depois de possivelmente alterar os parâmetros de chamada, NDISWAN chama a função NdisClIncomingCallComplete . O NDIS, por sua vez, chama a função ProtocolCmIncomingCallComplete do driver de miniport. Dependendo se o NDISWAN aceitou a chamada de saída e se o driver de miniporta aceita ou rejeita as alterações propostas pela NDISWAN nos parâmetros de chamada, o driver de miniporto chama as funções NdisCmDispatchCallConnected ou NdisCmDispatchIncomingCloseCall . NdisCmDispatchCallConnected notifica o NDISWAN de que as transferências de dados podem começar no VC que o NDPROXY criou para a chamada de saída. NdisCmDispatchIncomingCloseCall informa NDISWAN e NDPROXY para derrubar a chamada de saída proposta.
Depois que NDISWAN aceita a chamada de saída, NDPROXY chama a função NdisCoGetTapiCallId para recuperar uma cadeia de caracteres que identifica o contexto de NDISWAN para a VC. NDPROXY passa essa cadeia de caracteres de volta para o aplicativo TAPI. O aplicativo TAPI usa essa cadeia de caracteres de contexto vc para concluir sua chamada para lineGetID.