pilou51 | Bon correction, j'avais mon code dans mes MP, on me l'avait déjà demandé
Donc le code de détection des appels entrants :
Code :
- :
- #include <stdio.h>
- #include <stdlib.h>
- #include <windows.h>
- #include <tapi.h>
- #include "entrant.h"
-
- // Valeur de retour de succès des méthodes TAPI = 0
- #define SUCCESS 0
-
- // Constructeur par défaut
- Centrant::Centrant(){
- m_hLineApp=NULL;
- m_hCall=NULL;
- m_hLine=NULL;
- m_dwNumDevs=0;
- m_dwDeviceID=0;
- m_dwAPIVersion = 0x00020000;// Ici 2.0 pour l'Alcate
- m_dwRequestedID = 0;
- m_lAsyncReply = 0;
- m_bShuttingDown = 0;
- m_bStoppingCall = 0;
- m_bInitializing = FALSE;
- m_bReplyReceived = FALSE;
- m_bTapiInUse = FALSE;
- m_bInitialized = FALSE;
- memset(&(lip), 0, sizeof (lip));
- lip.dwOptions = NULL;
- lip.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
- lip.dwTotalSize = sizeof(lip);
- }
-
- // Destructeur
- Centrant::~Centrant(){}
-
- // Unique instance globale de la classe Centrant
- Centrant App;
-
-
- void FindCallerNumber (HCALL hCall, char *pOut, int size) {
- int len;
- char *pIn;
- union {
- char c[1024];
- LINECALLINFO lci;
- } u;
-
- memset(pOut, 0, size);
- size = size - 1;
- memset(&u.lci, 0, sizeof(u));
- u.lci.dwTotalSize = sizeof (u);
-
- if (lineGetCallInfo(hCall, &u.lci) == 0) {
- pIn = (char*)&u.lci;
- pIn += u.lci.dwCallerIDOffset;
- len = u.lci.dwCallerIDSize;
-
- if (size > len) size = len;
- memcpy (pOut, pIn, size);
- }
- }
-
- // Fonction Callback
- void Centrant::HandleLineCallState(DWORD dwDevice, DWORD dwMessage, DWORD dwCallbackInstance, DWORD dwParam1, DWORD dwParam2, DWORD dwParam3) {
- char chaine[100] = "http://gpl/prod/formulaires/appelentrant.php?num=";
- char pOut[20];
- if (dwMessage == LINE_APPNEWCALL && dwParam1 == LINECALLSTATE_OFFERING) {
- FindCallerNumber((HCALL)dwParam2, pOut, 1024);
- strcat(chaine, pOut);
- // Vérification du numéro entrant (bugs de l'OmniPCX + numéros cachés)
- if (strcmp(pOut, "10" ) && pOut[0] == '0') ShellExecute(NULL, "open", "c:/progra~1/Plus!/Micros~1/IEXPLORE.EXE", chaine, NULL, SW_SHOWNA);
- }
- }
-
- // Fonction de test d'erreur à la création du hLineApp
- BOOL Centrant::HandleLineErr(long lLineErr)
- {
- BOOL bRet=FALSE;
-
- if(lLineErr > SUCCESS)
- return bRet;
-
- switch(lLineErr)
- {
- case SUCCESS:
- bRet=TRUE;
- break;
- case LINEERR_INVALCARD: // Erreurs non gérée sur une ligne RNIS
- case LINEERR_INVALLOCATION:
- case LINEERR_INIFILECORRUPT:
- printf("Valeurs du fichier de configuration invalides\n" );
- break;
- case LINEERR_NODRIVER:
- printf("Problème avec le driver de téléphonie\n" );
- break;
- case LINEERR_REINIT:
- printf("Reinitialisation\n" );
- break;
- case LINEERR_NOMULTIPLEINSTANCE:
- printf("Supprimez une des copies du driver de téléphonie\n" );
- break;
- case LINEERR_NOMEM:
- printf("Pas assez de mémoire, abandon de l'opération\n" );
- break;
- case LINEERR_OPERATIONFAILED:
- printf("L'opération de TAPI a échoué\n" );
- break;
- case LINEERR_RESOURCEUNAVAIL:
- printf("Une ressource TAPI est actuellement indisponible\n" );
- break;
- default:
- printf("Erreur survenue lors du HandleLineErr()" );
- break;
- }
- return bRet;
- }
-
- // Fonction de création de l'objet hLineApp
- BOOL Centrant::Create() {
- long lReturn, lReturn2;
- if (m_hLineApp) return TRUE;
- if (m_bInitializing) return FALSE;
- m_bInitializing = TRUE;
- //Initilisation de TAPI
- do {
- lReturn = ::lineInitializeEx(&(m_hLineApp), NULL, NULL/*lineCallbackFunc*/, "Appel entrant", &m_dwNumDevs, &m_dwAPIVersion, &lip);
- if (m_dwNumDevs == 0) {
- m_bInitializing = FALSE;
- printf("Erreur de NumDevs", lReturn);
- return FALSE;
- }
- if (HandleLineErr(lReturn)) continue;
- else {
- printf("Erreur d'initialisation de la ligne\n" );
- m_bInitializing = FALSE;
- return FALSE;
- }
- }
- while (lReturn != SUCCESS);
- // Ouverture de la ligne RNIS à écouter (DeviceID 0)
- lReturn2 = lineOpen(m_hLineApp, 0, &m_hLine, m_dwAPIVersion, 0, NULL, LINECALLPRIVILEGE_MONITOR, NULL, NULL);
- App.m_bInitializing = FALSE;
- printf("Connection effectuee ! \n" );
- printf("lReturn : %ld, lReturn2 : %ld, Nombre de peripheriques : %ld\n", lReturn, lReturn2, App.m_dwNumDevs);
- return TRUE;
- }
-
- // Fonction principale
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
- DWORD dwStatus;
- linemessage_tag lmsg;
- HANDLE hTapiEvent = NULL;
- if (!App.Create()) return -1;
- // Création du handle sur event
- hTapiEvent = App.lip.Handles.hEvent;
- while (1) {
- printf("En attente d'un event\n" );
- // En attente d'un event
- dwStatus = WaitForSingleObject(hTapiEvent, INFINITE);
- // Récupération de l'event et traitement
- dwStatus = lineGetMessage(App.m_hLineApp, &lmsg, 0);
- App.HandleLineCallState(lmsg.hDevice, lmsg.dwMessageID, lmsg.dwCallbackInstance, lmsg.dwParam3, lmsg.dwParam2, lmsg.dwParam3);
- }
- lineShutdown(App.m_hLineApp);
- getchar();
- return 0;
- }
|
et le .h correspondant :
Code :
- class Centrant {
- public :
- DWORD m_dwNumDevs;
- DWORD m_dwDeviceID;
- DWORD m_dwRequestedID;
- LONG m_lAsyncReply;
-
- BOOL m_bShuttingDown;
- BOOL m_bStoppingCall;
- BOOL m_bInitializing;
- BOOL m_bReplyReceived;
- BOOL m_bTapiInUse;
- BOOL m_bInitialized;
-
- HLINEAPP m_hLineApp;
- HCALL m_hCall;
- HLINE m_hLine;
- DWORD m_dwAPIVersion;
- char m_szPhoneNumber[20];
- char szLineName[256];
-
- LINEINITIALIZEEXPARAMS lip;
-
- Centrant();
- ~Centrant();
- BOOL Create();
- BOOL HandleLineErr(long lLineErr);
- void lineCallbackFunc(DWORD dwDevice, DWORD dwMsg, DWORD dwCallbackInstance, DWORD dwParam1, DWORD dwParam2, DWORD dwParam3);
- void HandleLineCallState(DWORD dwDevice, DWORD dwMessage, DWORD dwCallbackInstance, DWORD dwParam1, DWORD dwParam2, DWORD dwParam3);
- };
|
Pas de commentaire sur la qualité du code, j'étais jeune (:sol et surtout je n'avais jamais fait de C++ avant ça. Et TAPI pour débuter le C++ y'a mieux je pense.
Voilà j'espère que ça t'aidera, en tout cas ça marchait |