ITBasicCallControl - Problem



  • Hallo,

    ich erzeuge folgendes:

    ITBasicCallControl *pCall;
    

    Bei eintreffenden Anruf erzeuge ich ein neues Call-Objekt:

    m_pCall = new CtCall(pLine, hCall, this);
    

    Wie kann ich über pCall auf m_pCall zugreifen und z.B. Anruf unterbrechen?

    pCall->Disconnect(DC_REJECTED);
    


  • Wieso legst Du nicht ein ITAddress-Objekt an und erstellst über CreateCall ein ITBasicCallControl-Objekt?



  • ich bin absoluter Anfänger, was ist ein ITAddress-Objekt und wie kann ich über CreateCall ein ITBasicCallControl-Objekt erstellen?

    Ein kleines Code-Beispiel währe sehr hilfreich.

    Vielen Dank.



  • // Initialize COM
    CoInitializeEx( NULL, COINIT_MULTITHREADED);
    // Create a TAPI entry point object.
    ITTAPI *gpTapi;
    CoCreateInstance( CLSID_TAPI, NULL, CLSCTX_INPROC_SERVER, IID_ITTAPI, (LPVOID*)&gpTapi);
    // Initialize TAPI
    gpTapi->Initialize();
    // collect phone devices
    IEnumAddresses *pEnum;
    gpApi->EnumerateAddresses( &pEnum);
    ITAddress* pAddress = ...; // durch pEnum iterieren, um richtiges Phone-Device zu finden
    pEnum->Release();
    ITBasicCallControl *pCall;
    pAddress->CreateCall( ...&pCall); // Deine Anrufparameter
    
    // Aufräumarbeiten
    pCall->Release();
    pAddress->Release();
    // ...
    

    Hab ich mal schnell aus der MSDN zusammengeklaut ...



  • Als erstens vielen Dank für deine Hilfe RenéG.

    Ich kann leider mit dem Code-Beispiel nichts anfangen.

    Ich bin jetzt soweit dass ich ankommenden Anruf erkenne.
    Beim Eintritt eines neuen Anrufes wird CtCall-Objekt erzeugt:

    m_pCall = new CtCall(pLine, hCall, this);

    Ich kann mit dem folgendem Code den Anruf annehmen:

    m_pCall->Accept(); //Anruf akzeptieren
    m_pCall->Answer(); //Anruf annehmen

    Meine Frage:
    Was muss ich machen damit ich den Anruf ablehne?
    Mit m_pCall->Drop()lege ich den Anruf auf und der Anrufer bekommt "Anruf Aufgelegt"-Zeichen, ich möchte aber dass er "besetzt"-Zeichen bekommt.

    Ich habe gedacht dass es mit ITBasicCallControl-Objekt möglich ist, den ankommenden Anruf zu steuern bzw. abzulehnen.

    ITBasicCallControl *pCall;
    pCAll->Disconnect(DC_REJECTED);

    Mit den Vorgeschlagenen Code kann ich wirklich nichts anfangen.
    Ich hoffe du verstehst mein Problem jetzt besser.

    Wie könnte ich mein Problem lösen?



  • Da CtCall ein mir unbekanntes Objekt ist, kann ich Dir nur vorschlagen, dieses zu durchsuchen nach einer Funktion, mit der Du ein ITBasicCallControl bekommst!



  • Meine CtCall-Klasse sieht wie folgt aus:

    --------------------------------------------------------------------------------
    class CtCall : public CtReplyTarget
    {
    public:
    // Operations
    CtCall(CtLine* pLine);
    CtCall(CtLine* pLine, HCALL hCall, CtCallSink* pInitialSink = 0);
    virtual ~CtCall();

    CtLine* GetLine() const;
    HCALL GetHandle() const;
    HCALL Attach(HCALL hCall, CtCallSink* pInitialSink = 0);
    HCALL Detach();

    // Can have multiple sinks per object and they stay around for the
    // life of the object (which may be different than the life of the handle).
    void AddSink(CtCallSink* pSink);
    void RemoveSink(CtCallSink* pSink);

    BOOL IsRequestPending(TREQUEST nRequestID = 0,
    DWORD* pnRequestType = 0) const;
    BOOL IsRequestTypePending(DWORD nRequestType) const;

    static CtCall* FromHandle(HCALL hCall);

    // TAPI wrappers
    tfxasync TRESULT Accept(LPCSTR psUserUserInfo = 0, DWORD nSize = 0);
    tfxasync TRESULT Answer(LPCSTR psUserUserInfo = 0, DWORD nSize = 0);
    tfxasync TRESULT Dial(LPCSTR szDestAddress, DWORD dwCountryCode = 0);
    tfxasync TRESULT Drop(LPCSTR psUserUserInfo = 0, DWORD nSize = 0);
    tfxasync TRESULT GenerateDigits(LPCSTR szDigits, DWORD nDuration = 0,
    DWORD nDigitMode = LINEDIGITMODE_DTMF);

    TRESULT GenerateTone(DWORD nToneMode, DWORD nDuration,
    DWORD nCustomTones = 0, LINEGENERATETONE* pCustomTones = 0);
    TRESULT Deallocate();

    TRESULT GatherDigits(LPSTR pszDigits, DWORD nDigits,
    LPCSTR pszTerminationDigits = 0,
    DWORD nFirstDigitTimeout = 5000,
    DWORD nInterDigitTimeout = 5000,
    DWORD nDigitModes = LINEDIGITMODE_DTMF);

    TRESULT Handoff(LPCSTR szFileName);
    TRESULT Handoff(DWORD nMediaMode);

    tfxasync TRESULT MakeCall(LPCSTR szDestAddress = 0, DWORD nCountryCode = 0,
    CtCallSink* pInitialSink = 0, LINECALLPARAMS* pCallParams = 0);

    TRESULT MonitorDigits(DWORD dwDigitModes = LINEDIGITMODE_DTMF);

    // Call Events
    void OnInfo(DWORD nCallInfo);
    void OnState(DWORD nCallState, DWORD dwParam2, DWORD nCallPriviledge);
    void OnGatherDigits(DWORD nGatherTerm);
    void OnGenerate(DWORD nGenerateTerm);
    void OnMonitorDigits(char cDigit, DWORD nDigitMode);
    void OnMonitorMedia(DWORD nMediaMode);
    void OnMonitorTone(DWORD dwAppSpecific);

    // CtReplyTarget event
    void OnReply(TREQUEST nRequestID, TRESULT nResult, DWORD nRequestType);

    protected:
    static void AddToCalls(CtCall* pCall);
    static void RemoveFromCalls(CtCall* pCall);

    private:
    static CPtrList s_listCalls;

    HCALL m_hCall;
    CtLine* m_pLine;

    // Use an array instead of a list to allow
    // removing sinks during event handling
    CPtrArray m_rgSinks;
    };

    --------------------------------------------------------------------------------

    Ich hoffe du kannst mir jetzt vielleicht helfen wie ich mit Hilfe von ITBasicCallControl ankommenden Anruf ablehnen kann.


Anmelden zum Antworten