[TAPI] Aide pour un soft de gestion des appels entrants

Aide pour un soft de gestion des appels entrants [TAPI] - C++ - Programmation

Marsh Posté le 25-06-2003 à 16:38:21    

Salut,  
 
J'essaie de faire un soft qui détecte les appels entrants, et affiche simplement le CallID (en mode console, sans utiliser les MFC).  
Est-ce que quelqu'un pourrait me donner l'algo général à utiliser svp ? Parceque TAPI, c qd mm très galère  
Je dois commencer par faire un lineInitialize, mais après je vois pas du tt comment récupérer les messages LINE_CALLSTATE (qui signifient qu'il y a un appel entrant).  
 
Merci infiniment  
 
Pilou  
 
PS : La ligne téléphonique que je souhaite écouter est reliée à un PBX Alcatel (qui implémente TAPI, y'a pas de prob, j'ai déjà fait l'appli qui gère les appels sortants), et est une ligne RNIS.

Reply

Marsh Posté le 25-06-2003 à 16:38:21   

Reply

Marsh Posté le 25-06-2003 à 16:41:44    

MSDN est ton amie et aide : regarde d ucote de LineCallBack passe en param ds le lineInitialise/Ex ;)

Reply

Marsh Posté le 26-06-2003 à 10:37:33    

Merci :)
Bon j'ai fait qqchose avec lineInitializeEx et un lineGetMessage... mais il ne catch aucun event, que le téléphone sonne ou pas :(
 
Voilà mon main :  
 
PS : App est l'instance globale de ma classe principale Centrant

Code :
  1. int main() {
  2. HANDLE hTapiEvent = 0;
  3. struct linemessage_tag lmsg;
  4. DWORD dwStatus;
  5. if (!App.Create()) printf("Erreur de Create()\n" );
  6. hTapiEvent = App.lip.Handles.hEvent;
  7.   printf("En attente d'un event\n" );
  8.  dwStatus = WaitForSingleObject(hTapiEvent, INFINITE);
  9.  printf("Event recu : \n" );
  10.  while (lineGetMessage(App.m_hLineApp, &lmsg, 0)==0) {
  11.   printf("HandleLineCallState en cours \n" );
  12.   App.HandleLineCallState(lmsg.hDevice, lmsg.dwMessageID, lmsg.dwCallbackInstance, lmsg.dwParam1, lmsg.dwParam2, lmsg.dwParam3);
  13.  }
  14.  return 0;
  15. }


 
et ma classe Centrant :  

Code :
  1. class Centrant {
  2. public
  3. DWORD m_dwNumDevs;
  4. DWORD m_dwDeviceID;
  5. DWORD m_dwRequestedID;
  6. LONG m_lAsyncReply;
  7. BOOL m_bShuttingDown;
  8. BOOL m_bStoppingCall;
  9. BOOL m_bInitializing;
  10. BOOL m_bReplyReceived;
  11. BOOL m_bTapiInUse;
  12. BOOL m_bInitialized;
  13. HLINEAPP m_hLineApp;
  14. HCALL m_hCall;
  15. HLINE m_hLine;
  16. DWORD m_dwAPIVersion;
  17. char m_szPhoneNumber[20];
  18. char szLineName[256];
  19. LINEINITIALIZEEXPARAMS lip;
  20. Centrant();
  21. ~Centrant();
  22. BOOL Create();
  23. BOOL HandleLineErr(long lLineErr);
  24. BOOL GetDeviceLine();
  25. LPLINEDEVCAPS GetDevCaps(LPLINEDEVCAPS lpLineDevCaps,DWORD dwDeviceID);
  26. LPVOID CheckAndReAllocBuffer(LPVOID lpBuffer,size_t sizeBufferMinimum);
  27. static void CALLBACK lineCallbackFunc(DWORD dwDevice, DWORD dwMsg, DWORD dwCallbackInstance, DWORD dwParam1, DWORD dwParam2, DWORD dwParam3);
  28. void HandleLineCallState(DWORD dwDevice, DWORD dwMessage, DWORD dwCallbackInstance, DWORD dwParam1, DWORD dwParam2, DWORD dwParam3);
  29. };


 
et enfin la méthode Create :  

Code :
  1. BOOL Centrant::Create() {
  2. long lReturn;
  3. if (App.m_hLineApp) return TRUE;
  4. if (App.m_bInitializing) return FALSE;
  5. App.m_bInitializing = TRUE;
  6. //Initilisation de TAPI
  7. do {
  8.  lReturn = ::lineInitializeEx(&(App.m_hLineApp), NULL, App.lineCallbackFunc, "Appel entrant", &App.m_dwNumDevs, &App.m_dwAPIVersion, &App.lip);
  9.  if (App.m_dwNumDevs == 0) {
  10.   App.m_bInitializing = FALSE;
  11.   printf("Erreur de NumDevs", lReturn);
  12.   return FALSE;
  13.  }
  14.  if (App.HandleLineErr(lReturn)) continue;
  15.  else {
  16.   printf("Erreur d'initialisation de la ligne\n" );
  17.   m_bInitializing = FALSE;
  18.   return FALSE;
  19.  }
  20. }
  21. while (lReturn != SUCCESS);
  22. App.m_bInitializing = FALSE;
  23. printf("Connection effectuee ! \n" );
  24. printf("lReturn : %ld, Nombre de peripheriques : %ld\n", lReturn, App.m_dwNumDevs);
  25. return TRUE;
  26. }


 
Merci d'avance si jamais vous trouvez ce qui coince :)

Reply

Marsh Posté le 26-06-2003 à 11:39:31    

Euh comprend pas trop ce que tu fais (deja faudrait mettre un peu propre ta classe car un peu le bordel genre le App.membre alros que t es deja ds ton instance ... petit bouquin C++ s imposerais ;))
 
Mais sinon a premiere vue :
- tu passe une callback a l'init
- tes lininitparam on sait pas ce qu ils valent
- mais bon tu attends evenement via les hEvent malgre que callback passe, et comme a mon avis pas mis flag ds param qui va bien il fait rien.
 

Reply

Marsh Posté le 26-06-2003 à 11:52:40    

erf si, manquait le constructeur :),je mets bien le flag event ds l'option du event :

Code :
  1. Centrant::Centrant(){
  2. m_hLineApp=NULL;
  3. m_hCall=NULL;
  4. m_hLine=NULL;
  5. m_dwNumDevs=0;
  6. m_dwDeviceID=0;
  7. m_dwAPIVersion = TAPI_CURRENT_VERSION;;
  8. m_dwRequestedID = 0;
  9. m_lAsyncReply = 0;
  10. m_bShuttingDown = 0;
  11. m_bStoppingCall = 0;
  12. m_bInitializing = FALSE;
  13. m_bReplyReceived = FALSE;
  14. m_bTapiInUse = FALSE;
  15. m_bInitialized = FALSE;
  16. memset(&(lip), 0, sizeof (lip));
  17. lip.dwOptions = NULL;
  18. lip.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
  19. lip.dwTotalSize = sizeof(lip);
  20. }


 
sinon effectivement les App. ne servent pas ds la méthode Create, mais ils servent ds le main (mais je crois pas qu'ils gênent si ? je les ai rajoutés pour un test, je suis plus sûr de rien là :()
sinon qu'est-ce que tu veux dire par passer un callback à l'init stp ? En fait je pense que j'ai pas compris l'utilisation/utilité du callback, donc si tu pouvais m'en dire plus (sans un lien vers la msdn stp :whistle: )
 
Merci bcp :jap:

Reply

Marsh Posté le 26-06-2003 à 12:37:28    

Ben les callback c un des mecanismes qui pemettent de recuperer les event de TAPI. En gros, tu lui passes une fonction en parametre, et a chaque fois que qq chose se passe, TAPI appel cette fonctions avec les param, libre a toi de faire qqchose ou pas.
 
Sinon ca devrait donner un truc du genre :

Code :
  1. #ifndef __CMYTAPI_H__
  2. #define __CMYTAPI_H__
  3. class CMyTAPI
  4. {
  5. public:
  6.    CMyTAPI(void);
  7. virtual  ~CMyTAPI(void);
  8. BOOL  m_fnbInitialise(void);
  9. static void CALLBACK m_fnvLineCallbackFunc(DWORD, DWORD, DWORD, DWORD, DWORD, DWORD);
  10. protected:
  11. private:
  12.     DWORD  m_dwNumDevs;
  13.     HLINEAPP m_hLineApp;
  14.     DWORD  m_dwAPIVersion;
  15. void  m_fnvCallAccept(DWORD);
  16. };
  17. #endif


 

Code :
  1. #include "Tapi.h"
  2. #include "MyTapi.h"
  3. #include <stdio.h>
  4. //#define TRACE__( A ) { TRACE A ; }
  5. #define TRACE__( A ) { printf A ; }
  6. CMyTAPI::CMyTAPI(void)
  7. {
  8.     m_dwAPIVersion = TAPI_CURRENT_VERSION;
  9.     m_dwNumDevs = 0;
  10.     m_hLineApp = NULL;
  11. }
  12. CMyTAPI::~CMyTAPI(void)
  13. {
  14. }
  15. BOOL CMyTAPI::m_fnbInitialise(void)
  16. {
  17. long lRet = lineInitializeEx(&m_hLineApp, reinterpret_cast<HINSTANCE>(this), m_fnvLineCallbackFunc, "TapiTest", &m_dwNumDevs, &m_dwAPIVersion,NULL);
  18. if (lRet == 0) {
  19.  TRACE__(("TAPI initialized (%d ver) : %d lines found\n", m_dwAPIVersion, m_dwNumDevs));
  20.  return TRUE;
  21. }
  22. TRACE__(("TAPI initialized error\n" ));
  23. return FALSE;
  24. }
  25. void CMyTAPI::m_fnvCallAccept(DWORD dwCall)
  26. {
  27. HCALL hCall = (HCALL)dwCall;
  28. // On repond ...
  29. // lineAnswer(hCall, NULL, NULL);
  30. }
  31. void CALLBACK CMyTAPI::m_fnvLineCallbackFunc(DWORD dwDevice, DWORD dwMsg, DWORD dwCallbackInstance, DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)
  32. {
  33. CMyTAPI* pThis = (CMyTAPI *)dwCallbackInstance;
  34. if (pThis == NULL)
  35.  return;
  36. switch(dwMsg) {
  37.  case LINE_CALLSTATE:
  38.   {
  39.   switch (dwParam1) {
  40.    case LINECALLSTATE_OFFERING:
  41.     TRACE__(("Incoming call\n" ));
  42.     pThis->m_fnvCallAccept(dwDevice);
  43.    break;
  44.    default:
  45.     TRACE__(("LineCallback :: LINECALLSTATE_msg received and not handled\n" ));
  46.     break;
  47.   }
  48.   break;
  49.   }
  50.  default:
  51.   TRACE__(("LineCallback :: LINE_msg received and not handled\n" ));
  52.   break;
  53. }
  54. }


 
Y a juste le dwCallbackInstance la jsuis pas sur qu'il soit pas interpreter (si c le cas et que on peut pas recup pointeur sur l'objet CMyTapi, faut passer par un pointeur static par exemple).

Reply

Marsh Posté le 26-06-2003 à 15:13:52    

Ah oki, en fait j'ai une fonction  

Code :
  1. void CALLBACK Centrant::lineCallbackFunc(DWORD dwDevice, DWORD dwMsg, DWORD dwCallbackInstance, DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)


qui relève tous les messages, et dont un pointeur est passé en paramètre à lineInitialize d'ailleurs. (cf plus haut :)).
 
Mon problème, c que dans mon main, le prog reste bloqué au WaitForSingleObject sur l'hEvent :( (cf plus haut aussi ;))
L'initialisation se passe bien, il me détecte toutes mes lignes et tout, mais refuse de faire remonter les events qui se passent dessus :(
 
Si t'as une idée d'où ça peut venir (c tout à fait possible que ça soit une erreur de syntaxe C++, je suis pas familier du tt avec ce langage :whistle: )
 
Merci bcp encore :)

Reply

Marsh Posté le 26-06-2003 à 15:20:36    

Ben le WaitForSingleObject c bloquant et ca attend que l evenement soit SET par qqun exterieur (donc TAPI ds ton cas). TAPI recoit un lineconnect mais doit certainement balancer le message ds la cb et pas mettre le hevent.
 
Ben c soit CB soit Hidden soit Event soit jssais plus comme methode pour recuperer les events, c est pas 2 a la fois.

Reply

Marsh Posté le 26-06-2003 à 15:34:11    

j'ai mis NULL à la place du pointeur sur ma fonction CB dans l'appel à lineInitialize mais ça fait pareil :(
 
sinon je fais comment pour attendre le message avec le CB ? le mettre en attente jusqu'à un msg je veux dire, l'équivalent du WaitForSingleObject ?
 
Merci

Reply

Marsh Posté le 26-06-2003 à 15:53:53    

Ben pour la CB c le code que je t ai passe (aux ereurs que j'ai introduit pres).
Le jour ou TAPI a un event tu passera ds la callback.
 
 
Enfin lire la MSDN ca serait un minimum quand mm.

Reply

Marsh Posté le 26-06-2003 à 15:53:53   

Reply

Marsh Posté le 26-06-2003 à 15:55:28    

non mais je veux dire.... faut mettre un while(1) ? parceque l'appel se produit pas au moment où tu lances le prog, faut bien le mettre en attente jusqu'à ce qu'arrive l'event...

Reply

Marsh Posté le 26-06-2003 à 15:56:11    

sachant que je n'ai pas d'interface graphique, tout se fait en mode console, donc le prog s'arrête à la fin du main...

Reply

Marsh Posté le 26-06-2003 à 16:31:40    

bon je pense (d'après la msdn ;)) que le mieux en mode console reste l'écoute d'events, mais j'ai tout configuré comme ils disent, l'initialisation se passe bien, mais je ne reçois rien (et j'ai viré le pointeur sur la CBfunc)...
 
:cry::cry::cry::cry:

Reply

Marsh Posté le 26-06-2003 à 16:36:35    

Ben pour le while c pe pas le mieu (enfin sauf si tu y colle un waitforsingleobject non infini ou un select ou autre).
 
Desole la j ai pas teste et pas la possiblite de teste les events (enfin tapi en general) donc peu pas te dire pkoi.

Reply

Marsh Posté le 26-06-2003 à 16:43:18    

oki tant pis, merci bcp pour ton aide en tt cas :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed