Acceptation des appels entrants
Pour qu’une application puisse accepter un appel entrant, une ligne doit d’abord être ouverte. Une ligne est ouverte à la suite d’une application appelant la fonction tapi lineOpen . Cet appel de fonction TAPI oblige les pilotes sous-jacents à encapsuler les paramètres TAPI dans les structures NDIS afin de préparer la réception d’un appel entrant. Une fois que le pilote miniport CoNDIS WAN reçoit un appel entrant, le pilote miniport doit d’abord créer une connexion virtuelle (VC) avec le pilote NDPROXY, puis notifier NDPROXY de l’appel entrant. NDPROXY avertit à son tour l’application via TAPI. La liste suivante décrit comment l’appel entrant est configuré, connecté et effectué :
NDPROXY spécifie les paramètres TAPI pour une connexion entrante dans une structure CO_AF_TAPI_SAP . NDPROXY remplit les membres de cette structure avec les informations suivantes qui ont été passées dans la fonction TAPI lineOpen :
- Identificateur de ligne ouverte dans le membre ulLineID
- Adresse de la connexion entrante dans le membre ulAddressID
- Mode multimédia du flux d’informations de la connexion entrante dans le membre ulMediaModes
NDPROXY superpose la structure CO_AF_TAPI_SAP sur le membre Sap d’une structure CO_SAP et définit le membre SapLength de CO_SAP sur la taille de CO_AF_TAPI_SAP. NDPROXY doit également définir le membre SapType de CO_SAP sur AF_TAPI_SAP_TYPE.
Une fois que NDPROXY encapsule les paramètres TAPI, NDPROXY appelle la fonction NdisClRegisterSap pour se préparer à recevoir des appels entrants. Dans cet appel de fonction, NDPROXY transmet un pointeur vers la structure de CO_SAP remplie qui spécifie le point d’accès au service (SAP) sur lequel NDPROXY peut recevoir des appels entrants. NDIS transfère la structure CO_SAP à la fonction ProtocolCmRegisterSap du pilote MCM (Miniport Call Manager) CoNDIS WAN. ProtocolCmRegisterSap communique avec les appareils de contrôle réseau ou d’autres agents spécifiques aux médias, si nécessaire, pour inscrire le SAP sur le réseau pour NDPROXY. Une fois que le pilote miniport a inscrit le SAP, il peut accepter une offre d’appel entrante dirigée vers ce SAP.
Un pilote miniport CoNDIS WAN est averti d’un appel entrant en signalant les messages du réseau. À partir de ces messages de signalisation, le pilote miniport extrait les paramètres d’appel de l’appel, y compris le SAP auquel l’appel entrant est adressé.
Avant d’indiquer un appel entrant à NDPROXY, le pilote miniport appelle la fonction NdisMCmCreateVc pour lancer la création d’un vc avec NDPROXY. NDPROXY alloue et initialise les ressources requises pour le vc et stocke le handle dans le vc.
Le pilote miniport CoNDIS WAN définit les paramètres TAPI pour un appel entrant dans une structure CO_AF_TAPI_INCOMING_CALL_PARAMETERS . Le pilote miniport remplit les membres de cette structure avec les informations suivantes extraites des messages de signalisation :
- Identificateur de ligne dans le membre ulLineID
- Adresse de l’appel entrant dans le membre ulAddressID
- CO_TAPI_FLAG_INCOMING_CALL bit dans le membre ulFlags . Tous les autres bits de ulFlags sont réservés et doivent être définis sur 0.
- STRUCTURE LINECALLPARAMS dans le membre LineCallInfo . Les membres de LINECALLPARAMS spécifient les paramètres d’appel TAPI pour un appel entrant.
Le pilote miniport superpose CO_AF_TAPI_INCOMING_CALL_PARAMETERS sur le membre Parameters d’une structure de CO_SPECIFIC_PARAMETERS et définit le membre Length de CO_SPECIFIC_PARAMETERS sur la taille de CO_AF_TAPI_INCOMING_CALL_PARAMETERS.
Le pilote miniport définit la structure CO_SPECIFIC_PARAMETERS sur le membre MediaSpecific d’une structure CO_MEDIA_PARAMETERS .
Le pilote miniport définit un pointeur vers la structure CO_MEDIA_PARAMETERS vers le membre MediaParameters d’une structure CO_CALL_PARAMETERS .
Le pilote miniport doit également définir le membre CallMgrParameters de la structure CO_CALL_PARAMETERS pour spécifier la qualité de service (QoS) du transfert de paquets, comme la bande passante. Pour définir ce membre CallMgrParameters , le pilote miniport remplit les membres d’une structure CO_CALL_MANAGER_PARAMETERS et pointe cette structure vers CallMgrParameters. Par exemple, pour identifier les vitesses de transmission et de réception en octets par seconde pour le vc, le pilote miniport doit définir les membres PeakBandwidth des membres Transmettre et Recevoir de CO_CALL_MANAGER_PARAMETERS. Les membres Transmit et Receive sont des structures FLOWSPEC. Pour plus d’informations sur la structure FLOWSPEC, consultez la Microsoft Windows SDK.
Une fois que le pilote miniport encapsule les paramètres TAPI et remplit le membre CallMgrParameters de CO_CALL_MANAGER_PARAMETERS, il appelle la fonction NdisMCmDispatchIncomingCall pour indiquer l’appel entrant à NDPROXY. Dans cet appel, le pilote miniport passe les points suivants :
- Handle qui identifie le SAP auquel l’appel entrant est adressé
- Handle qui identifie le vc pour l’appel entrant
- Pointeur vers la structure CO_CALL_PARAMETERS remplie
NDPROXY retourne NDIS_STATUS_PENDING au pilote miniport afin que NDPROXY puisse effectuer NdisMCmDispatchIncomingCall de manière asynchrone.
Une fois que l’application TAPI a répondu à l’appel entrant avec la fonction lineAnswer , NDPROXY appelle la fonction NdisClIncomingCallComplete . NDIS appelle à son tour la fonction ProtocolCmIncomingCallComplete du pilote miniport. Si NDPROXY retourne un code NDIS_STATUS_SUCCESS, cela indique l’acceptation des paramètres d’appel. Si NDPROXY trouve les paramètres d’appel inacceptables, il peut demander une modification des paramètres d’appel en définissant le membre Indicateurs dans la structure CO_CALL_PARAMETERS sur CALL_PARAMETERS_CHANGED et en fournissant des paramètres d’appel révisés. Si NDPROXY accepte l’appel entrant, le pilote miniport doit envoyer des messages de signalisation pour indiquer à l’entité appelante que l’appel a été accepté. Sinon, le pilote miniport doit envoyer des messages de signalisation pour indiquer que l’appel a été rejeté. Si NDPROXY demande une modification des paramètres d’appel, le pilote miniport envoie des messages de signalisation pour demander une modification des paramètres d’appel.
Le pilote miniport active le vc que le pilote miniport a créé avec NDPROXY et doit également appeler la fonction NdisMCmActivateVc pour informer NDPROXY que le pilote miniport est prêt à transférer des paquets sur le VC.
Si NDPROXY rejette l’appel, le pilote miniport appelle la fonction NdisMCmDeactivateVc pour désactiver le vc créé par le pilote miniport pour l’appel entrant. Une fois le vc désactivé, le pilote miniport appelle la fonction NdisMCmDeleteVc pour supprimer le vc.
Selon que NDPROXY a accepté l’appel entrant et que la connexion de bout en bout a été établie avec succès, le pilote miniport appelle les fonctions NdisMCmDispatchCallConnected ou NdisMCmDispatchIncomingCloseCall . Notez que si l’entité appelante distante a déchiré l’appel, elle envoie des messages de signalisation pour indiquer que la connexion de bout en bout n’a pas été établie avec succès. NdisMCmDispatchCallConnected informe NDPROXY que les transferts de données peuvent commencer sur le vc que le pilote miniport a créé et activé pour l’appel entrant. NdisMCmDispatchIncomingCloseCall informe NDPROXY de supprimer l’appel entrant.
Si NDPROXY est invité à supprimer l’appel entrant, il appelle la fonction NdisClCloseCall pour reconnaître qu’elle ne tentera pas d’envoyer ou de s’attendre à recevoir des données sur le VC. NDIS appelle à son tour la fonction ProtocolCmCloseCall du pilote miniport. Le pilote miniport appelle ensuite la fonction NdisMCmDeactivateVc pour désactiver le vc. Une fois le vc désactivé, le pilote miniport appelle la fonction NdisMCmDeleteVc pour supprimer le vc.
Une fois que l’application TAPI accepte l’appel entrant et que NDPROXY l’informe que l’appel est connecté, l’application appelle la fonction TAPI lineGetID pour informer NDPROXY de localiser le client CoNDIS approprié. Dans cet appel lineGetID , l’application TAPI fournit une chaîne pour une classe d’appareil TAPI particulière pour laquelle l’application nécessite un handle. NDPROXY utilise cette chaîne pour localiser le client CoNDIS qui a précédemment inscrit un SAP pour la classe d’appareil TAPI particulière. Si le client CoNDIS est NDISWAN, la chaîne est NDIS. Si NDPROXY localise un SAP avec une chaîne qui correspond à la chaîne transmise par l’application TAPI, NDPROXY appelle NdisMCmCreateVc pour configurer un point de terminaison de connexion avec NDISWAN sur lequel il peut envoyer la notification de l’appel entrant. NDIS appelle à son tour la fonction ProtocolCoCreateVc de NDISWAN et transmet un handle qui représente le VC.
Une fois que NDPROXY a configuré le point de terminaison de connexion avec NDISWAN, il appelle la fonction NdisCmDispatchIncomingCall pour informer NDISWAN de l’appel entrant. Dans cet appel, NDPROXY passe la structure CO_AF_TAPI_INCOMING_CALL_PARAMETERS encapsulée qui contient les paramètres d’appel entrant. NDIS appelle à son tour la fonction ProtocolClIncomingCall de NDISWAN, au sein de laquelle NDISWAN accepte ou rejette la connexion demandée.
Après avoir décidé d’accepter la connexion et après avoir éventuellement modifié les paramètres d’appel, NDISWAN appelle la fonction NdisClIncomingCallComplete . NDIS appelle à son tour la fonction ProtocolCmIncomingCallComplete du pilote miniport. Selon que NDISWAN a accepté l’appel entrant et que le pilote miniport accepte ou rejette les modifications proposées par NDISWAN pour les paramètres d’appel, le pilote miniport appelle les fonctions NdisCmDispatchCallConnected ou NdisCmDispatchIncomingCloseCall . NdisCmDispatchCallConnected avertit NDISWAN que les transferts de données peuvent commencer sur le vc que le pilote miniport a créé pour l’appel entrant. NdisCmDispatchIncomingCloseCall informe NDISWAN et NDPROXY de supprimer l’appel entrant.
Une fois que NDISWAN accepte l’appel entrant, NDPROXY appelle la fonction NdisCoGetTapiCallId pour récupérer une chaîne qui identifie le contexte de NDISWAN pour le vc. NDPROXY transmet cette chaîne à l’application TAPI. L’application TAPI utilise cette chaîne de contexte VC pour terminer son appel à lineGetID.