⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tdialdlg.cpp

📁 使用环境VC++ 6.0
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    va_end(argList);

    m_editLog.SetSel(0xffffffff);
    m_editLog.ReplaceSel(szOutput);
}

void CtDialDlg::OnDestroy() 
{
    if( m_rgbValidLines )
    {
        delete[] m_rgbValidLines;
        m_rgbValidLines = 0;
    }

    if( m_pCall )
    {
        m_pCall->Drop();
        delete m_pCall;
        m_pCall = 0;
    }

    if( m_rgpLines )
    {
        DWORD   nLines = ::TfxGetNumLines();
        for( DWORD nLineID = 0; nLineID < nLines; nLineID++ )
        {
            if( m_rgpLines[nLineID] && m_rgpLines[nLineID]->GetHandle() )
            {
                m_rgpLines[nLineID]->Close();
                delete m_rgpLines[nLineID];
            }
        }

        delete[] m_rgpLines;
        m_rgpLines = 0;
    }

	CDialog::OnDestroy();
}

// Telephony handlers
void CtDialDlg::Dial(
    LPCSTR          pszPhoneNo, // = 0
    LINECALLPARAMS* pCallParams)// = 0
{
    ASSERT(m_rgpLines);
    ASSERT(!m_pCall);

    // Show the dialog
    CPhoneNoDlg dlg;
    dlg.m_pno.SetWholePhoneNo(pszPhoneNo);
    dlg.m_rgbShouldShowLines = m_rgbValidLines;

    if( dlg.DoModal() == IDOK )
    {
        // DONE: Use the dialog's address
        if( pCallParams )
        {
            pCallParams->dwAddressMode = LINEADDRESSMODE_ADDRESSID;
            pCallParams->dwAddressID = dlg.m_nAddressID;
        }

        if( (m_pCall = new CtCall(m_rgpLines[dlg.m_nLineID])) &&
            TPENDING(m_pCall->MakeCall(dlg.m_sDialable,
                                       dlg.m_pno.GetCountryCodeNum(),
                                       this, pCallParams)) )
        {
            LogStatus("Placing a call to '%s'...\r\n", dlg.m_pno.GetDisplayable());
            UpdateStatus();
        }
        else
        {
            delete m_pCall; m_pCall = 0;
            ::AfxMessageBox(IDS_CANT_MAKE_CALL);
        }
    }
}

void CtDialDlg::OnLineNewCall(
    CtLine* pLine,
    HCALL   hCall,
    DWORD   nAddressID,
    DWORD   nCallPriviledge)
{
    LogStatus("New call on line %d (address %d)\r\n", pLine->GetDeviceID(), nAddressID);

    // If we're not already handling a call,
    if( !m_pCall )
    {
        // we've got a new call
        m_pCall = new CtCall(pLine, hCall, this);

        // Check to see if call needs to be answered
        m_bCallUnanswered = FALSE;
        if( m_pCall )
        {
            CtCallStatus    cs;
            if( TSUCCEEDED(cs.GetCallStatus(m_pCall)) )
            {
                if( cs.GetCallFeatures() & LINECALLFEATURE_ANSWER )
                {
                    m_bCallUnanswered = TRUE;
                }
            }
        }

        UpdateStatus();
    }
}

void CtDialDlg::OnCallState(
    CtCall* pCall,
    DWORD   nCallState,
    DWORD   dwParam2,
    DWORD   nCallPriviledge)
{
    struct FlagMap { DWORD nFlag; LPCSTR pszFlag; };
    static FlagMap rgFlags[] =
    {
        {LINECALLSTATE_IDLE,        "idle"},
        {LINECALLSTATE_ACCEPTED,    "accepted"},
        {LINECALLSTATE_DIALTONE,    "dial tone detected"},
        {LINECALLSTATE_DIALING,     "dialing"},
        {LINECALLSTATE_RINGBACK,    "ring-back detected"},
        {LINECALLSTATE_BUSY,        "busy detected"},
        {LINECALLSTATE_SPECIALINFO, "error detected"},
        {LINECALLSTATE_CONNECTED,   "connected"},
        {LINECALLSTATE_PROCEEDING,  "proceeding"},
        {LINECALLSTATE_DISCONNECTED,"disconnected"},
    };

    for( int i = 0; i < DIM(rgFlags); i++ )
    {
        if( rgFlags[i].nFlag == nCallState )
        {
            LogStatus("Call %s.\r\n", rgFlags[i].pszFlag);
            break;
        }
    }

    switch( nCallState )
    {
    case LINECALLSTATE_DISCONNECTED:
        OnHangUp();
    break;

    case LINECALLSTATE_IDLE:
        delete m_pCall; m_pCall = 0;
    break;
    }

    UpdateStatus();
}

void CtDialDlg::OnCallReply(
    CtCall*     pCall,
    TREQUEST    nRequestID,
    TRESULT     nResult,
    DWORD       nRequestType)
{
    switch( nRequestType )
    {
    case CALLREQUEST_MAKECALL:
        if( TSUCCEEDED(nResult) )
        {
            LogStatus("Call placed.\r\n");
        }
        else
        {
            delete m_pCall; m_pCall = 0;
            LogStatus("Call cannot be placed.\r\n");
        }
    break;

    case CALLREQUEST_DROP:
        if( TSUCCEEDED(nResult) )
        {
            LogStatus("Call dropped.\r\n");
        }
        else
        {
            LogStatus("Call cannot be dropped.\r\n");
        }
    break;

    case CALLREQUEST_ANSWER:
        if( TSUCCEEDED(nResult) )
        {
            LogStatus("Call answered.\r\n");
        }
        else
        {
            LogStatus("Call cannot be answered.\r\n");
        }
    break;
    }

    UpdateStatus();
}

void CtDialDlg::OnLineClose(CtLine* pLine)
{
    LogStatus("Line %d closed.\r\n", pLine->GetDeviceID());

    if( m_pCall )
    {
        delete m_pCall; m_pCall = 0;
    }

    DWORD   nLineID = pLine->GetDeviceID();
    delete m_rgpLines[nLineID];
    m_rgpLines[nLineID] = 0;
}

// DONE
// Caller responsible for setting flags (if they are other than zero)
// and calling delete[] on result when buffer is no longer needed.
LINECALLPARAMS* AllocateCallParams(
    LPCSTR pszAddress = 0,
    LPCSTR pszCalledParty = 0,
    LPCSTR pszComment = 0)
{
    // Calculate LINECALLPARAMS sizes
    size_t  cbAddress     = (pszAddress && *pszAddress ? strlen(pszAddress) + 1 : 0);
    size_t  cbCalledParty = (pszCalledParty && *pszCalledParty ? strlen(pszCalledParty) + 1 : 0);
    size_t  cbComment     = (pszComment && *pszComment ? strlen(pszComment) + 1 : 0);
    size_t  cbCallParams  = sizeof(LINECALLPARAMS) + cbAddress + cbCalledParty + cbComment;

    // Allocate LINECALLPARAMS structure
    LINECALLPARAMS* pCallParams = (LINECALLPARAMS*)(new BYTE[cbCallParams]);
    if( pCallParams )
    {
        ZeroMemory(pCallParams, cbCallParams);
        pCallParams->dwTotalSize = cbCallParams;

        // Fill in a LINECALLPARAMS structure

        // pszAddress
        pCallParams->dwDisplayableAddressSize = cbAddress;
        if( cbAddress )
        {
            pCallParams->dwDisplayableAddressOffset = sizeof(LINECALLPARAMS);
            char*   psz = (char*)((BYTE*)pCallParams + pCallParams->dwDisplayableAddressOffset);
            strcpy(psz, pszAddress);
        }
        else
        {
            pCallParams->dwDisplayableAddressOffset = 0;
        }

        // pszCalledParty
        pCallParams->dwCalledPartySize = cbCalledParty;
        if( cbCalledParty )
        {
            pCallParams->dwCalledPartyOffset = sizeof(LINECALLPARAMS) + cbAddress;
            char*   psz = (char*)((BYTE*)pCallParams + pCallParams->dwCalledPartyOffset);
            strcpy(psz, pszCalledParty);
        }
        else
        {
            pCallParams->dwCalledPartyOffset = 0;
        }

        // pszComment
        pCallParams->dwCommentSize = cbComment;
        if( cbComment )
        {
            pCallParams->dwCommentOffset = sizeof(LINECALLPARAMS) + cbAddress + cbCalledParty;
            char*   psz = (char*)((BYTE*)pCallParams + pCallParams->dwCommentOffset);
            strcpy(psz, pszComment);
        }
        else
        {
            pCallParams->dwCommentOffset = 0;
        }
    }

    return pCallParams;
}

// DONE
void CtDialDlg::OnLineRequest(DWORD nRequestMode, HWND hRequestWnd, TREQUEST nRequestID)
{
    ASSERT(nRequestMode == LINEREQUESTMODE_MAKECALL);

    LINEREQMAKECALL lmc;
    if( TSUCCEEDED(::TfxGetMakeCallRequest(&lmc)) )
    {
        UpdateData(FALSE);

        m_editLog.SetWindowText("");
        LogStatus("Request to call");
        if( lmc.szCalledParty[0] )
        {
            LogStatus(" '%s'", lmc.szCalledParty);
        }

        if( lmc.szAppName[0] )
        {
            LogStatus(" by '%s'", lmc.szAppName);
        }

        if( lmc.szComment[0] )
        {
            LogStatus(": '%s'", lmc.szComment);
        }

        LogStatus("...\r\n");
        UpdateStatus();

        // TAPI starts us minimized
        ShowWindow(SW_RESTORE);
        SetForegroundWindow();

        // Fill in a LINECALLPARAMS structure
        LINECALLPARAMS* pCallParams = AllocateCallParams(lmc.szDestAddress, lmc.szCalledParty, lmc.szComment);
        if( pCallParams )
        {
            pCallParams->dwBearerMode = LINEBEARERMODE_VOICE;
            pCallParams->dwMediaMode = LINEMEDIAMODE_INTERACTIVEVOICE;
        }

        Dial(lmc.szDestAddress, pCallParams);
        delete[] pCallParams;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -