TAPI TSP - Eingehender neuer Anruf wird nicht erkannt (lpfnEventProc)



  • Hallo,

    aktuell entwickele ich einen TAPI Treiber (TSP).

    Wird ein neuer einghender Anruf erkannt, rufe ich die Methode lpfnEventProc in meinem PDRVLINE Objekt auf.

    Leider reagiert der TAPI darauf in keinster Weise.
    Weder werden weitere Methoden im TSP durch den TAPI aufgerufen, noch wird ein TAPI Programm dadurch beeinflusst (z.B. phone.exe).

    Aktuell ist mein TSP noch sehr rudimentär.

    Hier ist der betreffende Code, in dem ein neuer Anruf signalisiert wird:

    PDRVCALL newCall = static_cast<PDRVCALL>(Helpers::DrvAlloc(sizeof(DRVCALL)));
    DWORD dwTapiCall = 0;
    pLine->lpfnEventProc(
    (HTAPILINE)pLine,
    NULL,
    (DWORD)LINE_NEWCALL,
    reinterpret_cast<DWORD>(newCall),
    reinterpret_cast<DWORD>(&dwTapiCall),
    (DWORD)0
    );

    Vorher ist natürlich die Line etc. richtig initialisiert.
    Ich kann z.B. auch über TSPI_makeCall einen neuen ausgehenden Anruf starten.
    Daher gehe ich davon aus, das alles korrekt initialisiert ist.

    Es wäre extrem hilfreich, wenn mir jemand die richtige Richtung zeigen könnte, bzw. wo ich nachschauen könnte.

    Vielen Dank!



  • Für 64 Bit sind deine Casts für dwParam1 und dwParam2 falsch -> DWORD_PTR.



  • Danke für den Tipp.

    Bin jetzt soweit, das anscheinend der eingehende Anruf zumindest erkannt wird.
    Aber anscheinend macht TAPI dann nicht weiter.
    Der letzte Aufruf vom TAPI im TSP ist TSPI_lineGetCallInfo.

    Die Signalisierung des Anrufs sieht nun folgendermaßen aus:

    PDRVCALL newCall = static_cast<PDRVCALL>(Helpers::DrvAlloc(sizeof(DRVCALL)));
    newCall->hdLine = (HDRVLINE)pLine;
    newCall->htCall = 0;
    pLine->lpfnEventProc(
    	pLine->htLine,
    	0,
    	LINE_NEWCALL,
    	(DWORD_PTR)pLine->htLine,
    	(DWORD_PTR)(&newCall->htCall),
    	0
    );
    if (newCall->htCall == 0) {
    	returnmessage = "ERROR";
    	Helpers::writeDebug("New call failed!");
    }
    else {
    	pLine->lpfnEventProc(
    		(HTAPILINE)pLine,
    		(HTAPICALL)newCall->htCall,
    	        (DWORD_PTR)LINE_CALLSTATE,
    		(DWORD_PTR)LINECALLSTATE_OFFERING,
    		(DWORD_PTR)LINEOFFERINGMODE_ACTIVE,
    	        (DWORD_PTR)LINECALLPRIVILEGE_OWNER
    	);
    }
    

    Die Funktion TSPI_lineGetCallInfo sieht folgendermaßen aus:

    lpLineInfo->dwNeededSize = sizeof(LINECALLINFO);
    	lpLineInfo->dwUsedSize = sizeof(LINECALLINFO);
    	lpLineInfo->dwBearerMode = LINEBEARERMODE_VOICE;
    	lpLineInfo->dwMediaMode = LINEMEDIAMODE_INTERACTIVEVOICE;
    	lpLineInfo->dwCallStates = LINECALLSTATE_IDLE |
    		LINECALLSTATE_DIALTONE |
    		LINECALLSTATE_DIALING |
    		LINECALLSTATE_CONNECTED |
    		LINECALLSTATE_PROCEEDING |
    		LINECALLSTATE_DISCONNECTED |
    		LINECALLSTATE_UNKNOWN |
    		LINECALLSTATE_OFFERING |
    		LINECALLSTATE_ACCEPTED |
    		LINECALLSTATE_BUSY |
    		LINECALLSTATE_ONHOLD |
    		LINECALLSTATE_CONFERENCED |
    		LINECALLSTATE_ONHOLDPENDCONF |
    		LINECALLSTATE_RINGBACK |
    		LINECALLSTATE_UNKNOWN |
    		LINECALLSTATE_ONHOLDPENDTRANSFER;
    	lpLineInfo->dwCallerIDFlags = LINECALLPARTYID_UNAVAIL;
    	lpLineInfo->dwCalledIDFlags = LINECALLPARTYID_UNAVAIL;
    	lpLineInfo->dwConnectedIDFlags = LINECALLPARTYID_UNAVAIL;
    	lpLineInfo->dwRedirectionIDFlags = LINECALLPARTYID_UNAVAIL;
    	lpLineInfo->dwRedirectingIDFlags = LINECALLPARTYID_UNAVAIL;
    	lpLineInfo->dwOrigin = LINECALLORIGIN_INBOUND;
    	lpLineInfo->dwReason = LINECALLREASON_DIRECT;
    	lpLineInfo->dwConnectedIDOffset = lpLineInfo->dwUsedSize;
    	lpLineInfo->dwConnectedIDFlags |= LINECALLPARTYID_ADDRESS;
    	lpLineInfo->dwConnectedIDFlags = LINECALLPARTYID_ADDRESS;
    	lpLineInfo->dwConnectedIDNameOffset = lpLineInfo->dwUsedSize;
    	return 0;
    

    Hab schon gelesen, das das etwas mit den MediaModes im LineOpen zu tun haben kann. Könnte das sein?

    Danke nochmal.


  • Mod

    Was heißt, die Tapi, macht nicht weiter.

    Du musst weiter machen?
    Welchen Callstate meldest Du?

    Die Tapi ist eine State Engine... Du bist verpflichtet mit LINE_CALLSTATE auch neue Callstates anzumelden.

    Such Dir mal TB20.EXE oder teste mit dem DIALER.EXE...



  • War vllt. etwas falsch ausgedrückt von mir.

    Ich teile dem TAPI per LINE_NEWCALL mit, das ein neuer Anruf vorliegt.
    Danach setze ich per LINE_CALLSTATE den Status auf LINECALLSTATE_OFFERING.

    Danach ruft TAPI die Funktion TSPI_lineGetCallInfo auf.

    Danach wird aber vom TAPI direkt die Funktion TSPI_lineCloseCall aufgerufen.
    Daher gehe ich davon aus, das TAPI aufgrund der Infos im lineGetCallInfo nicht an dem Anruf interessiert ist bzw. dort etwas nicht stimmt.

    Der Inhalt der Funktion steht in meinem letzten Post.

    Oder reicht die Mitteilung OFFERING nicht, damit der Anruf als ankommend in der PHONE.EXE angezeigt wird?

    TB20.EXE und DIALER.EXE haben mich leider nicht weiter gebracht, bzw. zeigen auch keine neueren Infos an. Soweit ich das gesehen habe werden in der DIALER.EXE auch keine eingehenden Anrufe angezeigt.


  • Mod

    Deine Struktur ist ja auch falsch.

    Wenn Du dwConnectedIDNameOffset benutzt muss auch dafür Raum geschaffen werden.
    Dieser steckt natürlich auch in dwUsedSize und in dwNeededSize.

    Lies mal bitte den Artikel ausführlich!
    https://msdn.microsoft.com/en-us/library/windows/desktop/ms734821(v=vs.85).aspx


  • Mod

    Weiterhin solltest Du unbeding die TSPI Doku lesen und nicht die TAPI-Doku

    https://msdn.microsoft.com/en-us/library/ms725219(v=vs.85).aspx

    Der dritte Parameter ist der Media-Mode.

    Allerdings hast Du Glück. Der Wert von LINECALLPRIVILEGE_OWNER und LINEMEDIAMODE_INTERACTIVEVOICE sind identisch.
    Dein Fehler ist mit Sicherheit der falsche Strukturaufbau!


Anmelden zum Antworten