Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1770 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°439303
pilou51
Posté le 25-06-2003 à 16:38:21  profilanswer
 

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.

mood
Publicité
Posté le 25-06-2003 à 16:38:21  profilanswer
 

n°439305
VisualC++
J'va y penser ...
Posté le 25-06-2003 à 16:41:44  profilanswer
 

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

n°439913
pilou51
Posté le 26-06-2003 à 10:37:33  profilanswer
 

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 :)

n°440001
VisualC++
J'va y penser ...
Posté le 26-06-2003 à 11:39:31  profilanswer
 

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.
 

n°440026
pilou51
Posté le 26-06-2003 à 11:52:40  profilanswer
 

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:

n°440107
VisualC++
J'va y penser ...
Posté le 26-06-2003 à 12:37:28  profilanswer
 

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).

n°440383
pilou51
Posté le 26-06-2003 à 15:13:52  profilanswer
 

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 :)

n°440399
VisualC++
J'va y penser ...
Posté le 26-06-2003 à 15:20:36  profilanswer
 

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.

n°440429
pilou51
Posté le 26-06-2003 à 15:34:11  profilanswer
 

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

n°440447
VisualC++
J'va y penser ...
Posté le 26-06-2003 à 15:53:53  profilanswer
 

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.

mood
Publicité
Posté le 26-06-2003 à 15:53:53  profilanswer
 

n°440449
pilou51
Posté le 26-06-2003 à 15:55:28  profilanswer
 

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...

n°440450
pilou51
Posté le 26-06-2003 à 15:56:11  profilanswer
 

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...

n°440499
pilou51
Posté le 26-06-2003 à 16:31:40  profilanswer
 

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:

n°440507
VisualC++
J'va y penser ...
Posté le 26-06-2003 à 16:36:35  profilanswer
 

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.

n°440511
pilou51
Posté le 26-06-2003 à 16:43:18  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Je suis New en html, j'ai besoin d'aideJ'arrive pas à écrire dans un fichier...besoin d'aide
Un message d'erreur que je ne comprends pas...besoin d'aideBesion d'aide pour .bat
Comment gérer la gestion de deux types de lien différents avec les CSS[ActionScript] PB de gestion de clavier en publication html
[JAVA] Tracer tous les appels de méthodeSoft utilisant wxWindow...
Aide pour uen requête SQL d'ajoutAide pour une requete "nombre de connexion par tranche horaire"
Plus de sujets relatifs à : [TAPI] Aide pour un soft de gestion des appels entrants


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR