tapiPhoneDlg.cpp
上传用户:fast168168
上传日期:2010-01-05
资源大小:337k
文件大小:21k
- // tapiPhoneDlg.cpp : 实现文件
- //
- #include "stdafx.h"
- #include "tapiPhone.h"
- #include "tapiPhoneDlg.h"
- #include "tapiPhoneSetupDlg.h"
- #include "control.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #endif
- // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
- class CAboutDlg : public CDialog
- {
- public:
- CAboutDlg();
- // 对话框数据
- enum { IDD = IDD_ABOUTBOX };
- protected:
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
- // 实现
- protected:
- DECLARE_MESSAGE_MAP()
- };
- CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
- {
- }
- void CAboutDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- }
- BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
- END_MESSAGE_MAP()
- // CtapiPhoneDlg 对话框
- CtapiPhoneDlg::CtapiPhoneDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CtapiPhoneDlg::IDD, pParent)
- , m_AutoAnswer(FALSE)
- , m_valStcMsg(_T(""))
- {
- m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
- m_valEdtNum = "";
- m_valCallerNum = "呼入方号码: 当前无呼叫";
- }
- void CtapiPhoneDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- DDX_Control(pDX, IDC_BTN_DISCONNECT, m_btDisconnect);
- DDX_Control(pDX, IDC_BTN_CALL, m_btCall);
- DDX_Control(pDX, IDC_BTN_CONFIG, m_btConfig);
- DDX_Control(pDX, IDC_BTN_PICKUP, m_btPickup);
- DDX_Check(pDX, IDC_CHK_AUTO, m_AutoAnswer);
- DDX_Text(pDX, IDC_STC_STATUS, m_valStcMsg);
- DDX_Text(pDX, IDC_EDIT_NUMBER, m_valEdtNum);
- DDX_Text(pDX, IDC_STATIC_, m_valCallerNum);
- DDX_Control(pDX, IDC_STC_IMAGE, m_stcImage);
- }
- BEGIN_MESSAGE_MAP(CtapiPhoneDlg, CDialog)
- ON_WM_SYSCOMMAND()
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- //}}AFX_MSG_MAP
- ON_BN_CLICKED(IDC_BTN_PICKUP, OnBnClickedBtnPickup)
- //用户自定义消息响应函数
- ON_MESSAGE(WM_PRIVATETAPIEVENT, OnTapiEvent)
- ON_BN_CLICKED(IDC_CHK_AUTO, OnBnClickedChkAuto)
- ON_BN_CLICKED(IDC_BTN_DISCONNECT, OnBnClickedBtnDisconnect)
- ON_BN_CLICKED(IDC_BTN_CALL, OnBnClickedBtnCall)
- ON_BN_CLICKED(IDC_BTN_EXIT, OnBnClickedBtnExit)
- ON_BN_CLICKED(IDC_BTN_CONFIG, OnBnClickedBtnConfig)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- // CtapiPhoneDlg 消息处理程序
- BOOL CtapiPhoneDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // 将“关于...”菜单项添加到系统菜单中。
- // IDM_ABOUTBOX 必须在系统命令范围内。
- ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
- ASSERT(IDM_ABOUTBOX < 0xF000);
- CMenu* pSysMenu = GetSystemMenu(FALSE);
- if (pSysMenu != NULL)
- {
- CString strAboutMenu;
- strAboutMenu.LoadString(IDS_ABOUTBOX);
- if (!strAboutMenu.IsEmpty())
- {
- pSysMenu->AppendMenu(MF_SEPARATOR);
- pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
- }
- }
- // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
- // 执行此操作
- SetIcon(m_hIcon, TRUE); // 设置大图标
- SetIcon(m_hIcon, FALSE); // 设置小图标
- // TODO:在此添加额外的初始化代码
- //初始化TAPI,在此之前必需调用 AfxOleInit()初始化 COM
- //将窗口的句柄 m_hWnd 传给 CTapi,使二者之间建立联系
- m_Tapi.m_hWnd = this->m_hWnd;
- if( FAILED(m_Tapi.InitializeTapi()) )
- {
- MessageBox("致命错误:TAPI 初始化失败!");
- return FALSE;
- }
- //
- // 初始化按钮状态
- //
- m_btCall.EnableWindow();
- m_btDisconnect.EnableWindow();
- m_btPickup.EnableWindow(FALSE);
- SetStatusMessage("准备就绪,等待电话呼入...");
-
- // HBITMAP hBitmap;
-
- // m_stcImage.SetBitmap(hBitmap);
- return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
- }
- void CtapiPhoneDlg::OnSysCommand(UINT nID, LPARAM lParam)
- {
- if ((nID & 0xFFF0) == IDM_ABOUTBOX)
- {
- CAboutDlg dlgAbout;
- dlgAbout.DoModal();
- }
- else
- {
- CDialog::OnSysCommand(nID, lParam);
- }
- }
- // 如果向对话框添加最小化按钮,则需要下面的代码
- // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
- // 这将由框架自动完成。
- void CtapiPhoneDlg::OnPaint()
- {
- if (IsIconic())
- {
- CPaintDC dc(this); // 用于绘制的设备上下文
- SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
- // 使图标在工作矩形中居中
- int cxIcon = GetSystemMetrics(SM_CXICON);
- int cyIcon = GetSystemMetrics(SM_CYICON);
- CRect rect;
- GetClientRect(&rect);
- int x = (rect.Width() - cxIcon + 1) / 2;
- int y = (rect.Height() - cyIcon + 1) / 2;
- // 绘制图标
- dc.DrawIcon(x, y, m_hIcon);
- }
- else
- {
- CDialog::OnPaint();
- }
- }
- //当用户拖动最小化窗口时系统调用此函数取得光标显示。
- HCURSOR CtapiPhoneDlg::OnQueryDragIcon()
- {
- return static_cast<HCURSOR>(m_hIcon);
- }
- /////////////////////////////////////////////////////////////////////////////////////
- // SetStatusMessage
- //
- // 显示当前系统消息
- /////////////////////////////////////////////////////////////////////////////////////
- void CtapiPhoneDlg::SetStatusMessage(CString strMsg)
- {
- m_valStcMsg = strMsg;
- UpdateData(FALSE);
- }
- /////////////////////////////////////////////////////////////////////////////////////
- //
- // 以下是用户界面事件响应函数
- //
- /////////////////////////////////////////////////////////////////////////////////////
- void CtapiPhoneDlg::OnBnClickedBtnPickup()
- {
- //
- // 接听电话
- //
- SetStatusMessage("正在准备接听...");
- if ( S_OK == m_Tapi.AnswerTheCall() )
- {
- SetStatusMessage("通话中");
- m_btDisconnect.EnableWindow();
- m_btPickup.EnableWindow(FALSE);
- }
- else
- {
- m_btPickup.EnableWindow(FALSE);
- MessageBox("没有接听成功!");
- SetStatusMessage("准备就绪,等待来电...");
- }
- }
- void CtapiPhoneDlg::OnBnClickedChkAuto()
- {
- //
- // 自动接听与手工接听之间切换
- //
- UpdateData();
- }
- void CtapiPhoneDlg::OnBnClickedBtnDisconnect()
- {
- //
- // 如果是电话另一方先挂断电话,则 m_pCall 已经挂断并且释放
- // 此处不用再次挂断
- //
- if ( m_Tapi.m_pCall != NULL )
- {
- SetStatusMessage("正在挂断电话...");
- // 挂断电话
- if (S_OK != m_Tapi.DisconnectTheCall())
- {
- MessageBox("挂断电话失败!");
- }
- else
- {
- m_btCall.EnableWindow();
- m_btPickup.EnableWindow(FALSE);
- m_valCallerNum = "呼入方号码: 当前无呼叫";
- SetStatusMessage("准备就绪,正在等待电话呼入...");
- }
- }
- }
- void CtapiPhoneDlg::OnBnClickedBtnCall()
- {
- //
- // 呼叫号码
- //
- DWORD dwAddressType;
- BSTR szAddressToCall;
- UpdateData();
- if( m_valEdtNum.GetLength() <= 2 )
- return;
- szAddressToCall = m_valEdtNum.AllocSysString();
- SetStatusMessage( "正在呼叫..." );
- dwAddressType = LINEADDRESSTYPE_PHONENUMBER ;
-
- // 开始呼叫
- if ( S_OK == m_Tapi.MakeTheCall(dwAddressType, szAddressToCall) )
- {
- m_btDisconnect.EnableWindow();
- m_btPickup.EnableWindow(FALSE);
- m_btCall.EnableWindow(FALSE);
- }
- else
- {
- MessageBox("呼叫失败!");
- }
- SysFreeString(szAddressToCall);
- // m_Tapi.PreparePlay("Greeting.wav");
- }
- void CtapiPhoneDlg::OnBnClickedBtnExit()
- {
- // 退出程序
- OnOK();
- }
- void CtapiPhoneDlg::OnBnClickedBtnConfig()
- {
- // 把配置对话框中的数据传入
- CtapiPhoneSetupDlg SetupDlg;
- if(SetupDlg.DoModal() == IDOK)
- {
- m_Tapi.m_WelcomeFileName = SetupDlg.m_strFileName0;
- strFileName0 = SetupDlg.m_strFileName0;
- strFileName1 = SetupDlg.m_strFileName1;
- strFileName2 = SetupDlg.m_strFileName2;
- strPath = SetupDlg.m_strPath;
- }
- }
- ///////////////////////////////////////////////////////////////////
- // OnTapiEvent
- //
- // 这是真正的事件处理函数,当 UI 线程接收到 WM_PRIVATETAPIEVENT消息
- // 时调用此函数,在 UI 线程中进行事件响应处理
- //
- ///////////////////////////////////////////////////////////////////
- LRESULT
- CtapiPhoneDlg::OnTapiEvent(
- WPARAM wp,
- LPARAM lp
- )
- {
- TAPI_EVENT TapiEvent = (TAPI_EVENT)wp;
- IDispatch *pEvent = (IDispatch*) lp;
-
- if( TapiEvent == TE_DIGITEVENT )
- MessageBox("TE_DIGITEVENT");
- else if(TapiEvent == TE_GENERATEEVENT )
- MessageBox("TE_GENERATEEVENT");
- else if(TapiEvent == TE_GATHERDIGITS)
- MessageBox("TE_GATHERDIGITS");
- switch ( TapiEvent )
- {
- case TE_CALLNOTIFICATION:
- {
- //
- // TE_CALLNOTIFICATION: 程序发现一个呼入的电话
- //
- TRACE("Event:-----------TE_CALLNOTIFICATION----------Eventn");
- DoCallNotification(pEvent);
- break;
- }//TE_CALLNOTIFICATION
-
- case TE_CALLSTATE:
- {
- //
- // TE_CALLSTATE: 程序发现整个 Call 过程状态有变化
- //
- TRACE("Event:-----------TE_CALLSTATE----------Eventn");
- DoCallState(pEvent);
- break;
- }//TE_CALLSTATE
- case TE_CALLMEDIA:
- {
- //
- // TE_CALLMEDIA:关于媒体的事件,如有某种媒体到达
- //
- TRACE("Event:-----------TE_CALLMEDIA----------Eventn");
- DoCallMedia(pEvent);
- break;
- }//TE_CALLMEDIA
-
- case TE_FILETERMINAL:
- {
- //
- // TE_FILETERMINAL:文件终端事件,只在 TAPI3.1 中支持
- //
- TRACE("Event:-----------TE_FILETERMINAL----------Eventn");
- DoFileEvent(pEvent);
- break;
- }//TE_FILETERMINAL
- case TE_DIGITEVENT:
- {
- //
- // TE_DIGIT:接受到按键事件
- //
- TRACE("Event:-----------TE_DIGITEVENT----------Eventn");
- DoDigitEvent(pEvent);
- break;
- }
- default:
- break;
- }
- pEvent->Release(); // 因为在 CTAPIEventNotification::Event() 中调用过 AddRef
- return S_OK;
- }
- /////////////////////////////////////////////////////////////////////////////////////
- // 处理 TE_NOTIFICATION 事件,有新电话打入时触发此事件
- // 功能:
- // 1、获取拨入方信息,主要是对方电话号码或IP
- // 2、获取 ITBasicCallControl,存入 m_pCall,
- // 3、更新用户界面
- // 注意:不能在此时就应答电话,应用程序应当等待 TE_CALLSTATE 事件触发并判断当前事件为
- // CS_OFFERING 时才可以。
- /////////////////////////////////////////////////////////////////////////////////////
- HRESULT CtapiPhoneDlg::DoCallNotification( IN IDispatch * pEvent)
- {
- //
- //通过接口 ITCallNotificationEvent 可以获得所有关于拨入事件的信息,这里主要用来得到 ITCallInfo
- //
- ITCallNotificationEvent * pNotify;
- HRESULT hr;
-
- hr = pEvent->QueryInterface( IID_ITCallNotificationEvent, (void **)&pNotify );
- if (S_OK != hr)
- {
- MessageBox( "有电话乎入,但获得接口 ITCallNotificationEvent 失败!");
- }
- else
- {
- //
- //通过 ITCallInfo 获得拨入方信息,如拨入方电话号码等
- //
- CALL_PRIVILEGE cp;
- ITCallInfo * pCall;
- //
- // 得到 ITCallInfo 的指针
- //
- hr = pNotify->get_Call( &pCall );
- pNotify->Release();
- if ( SUCCEEDED(hr) )
- {
- //
- // 检测我们对 call 是否拥有 owner 权限
- //
- hr = pCall->get_Privilege( &cp );
- if ( FAILED(hr) || (CP_OWNER != cp) )
- {
- //
- // 如果没有 owner 权限,乎略这次拨入
- //
- pCall->Release();
- //
- // 注意:我们在 CTAPIEventNotification::Event() 中调用了 AddRef()
- //
- pEvent->Release();
- return S_OK;
- }
- //
- //用来获得乎叫方信息, 用于来电显示
- //
- BSTR bstrCallerName, bstrCallerNum;
- BSTR bstrCallidName, bstrCallidNum;
- BSTR bstrConnectName, bstrConnectNum;
- CString strCallerName, strCallerNum;
- CString strCallidName, strCallidNum;
- CString strConnectName, strConnectNum;
-
- //The name of the caller.
- pCall->get_CallInfoString(CIS_CALLERIDNAME, &bstrCallerName);
- strCallerName = bstrCallerName;
-
- //The number of the caller.
- pCall->get_CallInfoString(CIS_CALLERIDNUMBER, &bstrCallerNum);
- strCallerNum = bstrCallerNum;
-
- //The name of the called location.
- pCall->get_CallInfoString(CIS_CALLEDIDNAME, &bstrCallidName);
- strCallidName = bstrCallidName;
-
- //The number of the called location.
- pCall->get_CallInfoString(CIS_CALLEDIDNUMBER, &bstrCallidNum);
- strCallidNum = strCallidNum;
-
- //The name of the connected location.
- pCall->get_CallInfoString(CIS_CONNECTEDIDNAME, &bstrConnectName);
- strConnectName = bstrConnectName;
-
- //The number of the connected location.
- pCall->get_CallInfoString(CIS_CONNECTEDIDNUMBER, &bstrConnectNum);
- strConnectNum = bstrConnectNum;
- if( strCallidNum.IsEmpty() )
- m_valCallerNum = "呼叫方号码: 无法获得";
- else
- m_valCallerNum = "呼叫方号码: " + strCallidNum;
- UpdateData(FALSE);
- //
- // 获得 ITBasicCallControl 接口并把它保存在成员变量 ppCall 中
- //
- ITBasicCallControl * ppCall;
- hr = pCall->QueryInterface( IID_ITBasicCallControl,
- (void**)&ppCall );
- m_Tapi.m_pCall = ppCall;
- pCall->Release();
-
- if ( SUCCEEDED(hr) )
- {
- //
- // 更新 UI
- //
- m_btPickup.EnableWindow();
- m_btDisconnect.EnableWindow();
- SetStatusMessage("有电话呼入...");
- }//end if
- }
- }//end if
- return S_OK;
- }//end function
- /////////////////////////////////////////////////////////////////////////////////////
- // DoCallState
- //
- // 功能:处理 TE_STATE 事件,有某种状态改变时触发此事件,比如只有状态为 CS_OFFERING
- // 时才可以应答
- /////////////////////////////////////////////////////////////////////////////////////
- HRESULT CtapiPhoneDlg::DoCallState(IDispatch* pEvent)
- {
- HRESULT hr;
- CALL_STATE cs;
- ITCallStateEvent * pCallStateEvent;
- //
- // 获得接口
- //
- hr = pEvent->QueryInterface( IID_ITCallStateEvent, (void **)&pCallStateEvent );
- if ( FAILED(hr) )
- {
- return E_FAIL;
- }
- //
- // 检测是否是同一个 Call - 如果不是,不处理这个事件
- //
- if(false == m_Tapi.SameCall(pCallStateEvent))
- {
- pCallStateEvent->Release();
- return hr;
- }
- //
- // 通过 ITCallStateEvent 获得当前状态
- //
- hr = pCallStateEvent->get_State( &cs );
- //
- // 释放接口
- //
- pCallStateEvent->Release();
- if ( FAILED(hr) )
- {
- return E_FAIL;
- }
- //
- // 如果当前状态是 offering,则应答电话,同时更新 UI
- //
- if (CS_OFFERING == cs)
- {
- if (m_AutoAnswer) //如果选种自动应答
- {
- OnBnClickedBtnPickup();
- }
- else //选择手动应答
- {
- SetStatusMessage("请点击接听按钮接听电话");
- }
- }
- else if (CS_DISCONNECTED == cs)
- {
- OnBnClickedBtnDisconnect();
- m_Tapi.ReleaseTheCall();
- }
- else if (CS_CONNECTED == cs)
- {
- //
- // 不作处理
- //
- }
- return S_OK;
- }
- /////////////////////////////////////////////////////////////////////////////////////
- // DoCallMedia
- //
- // 功能:处理 TE_MEDIA 事件,TE_CALLMEDIA 触发 Media 事件,对应接口:ITCallMediaEvent
- /////////////////////////////////////////////////////////////////////////////////////
- HRESULT CtapiPhoneDlg::DoCallMedia(
- IN IDispatch * pEvent)
- {
- CALL_MEDIA_EVENT cme = CME_STREAM_INACTIVE;
- ITCallMediaEvent * pCallMediaEvent = NULL;
- //
- // 检测当前 Call 是否有效
- //
- if(NULL == m_Tapi.m_pCall)
- {
- return E_UNEXPECTED;
- }
- //
- // 获得接口
- //
- HRESULT hr = pEvent->QueryInterface( IID_ITCallMediaEvent, (void **)&pCallMediaEvent );
- if(FAILED(hr))
- {
- MessageBox("ITCallMediaEvent, 获取接口失败!");
- return hr;
- }
- //
- // 获得我们检测到的 MediaEvent 具体类型
- //
- hr = pCallMediaEvent->get_Event( &cme );
- if(FAILED(hr))
- {
- pCallMediaEvent->Release();
- MessageBox("ITCallMediaEvent, but failed to get_Event");
- return hr;
- }
- switch ( cme )
- {
- //
- // 这是我们需要处理的唯一的事件
- //
- case CME_STREAM_ACTIVE:
- {
- //
- // 获得当前活动的终端
- //
- ITTerminal * pTerminal = NULL;
- hr = m_Tapi.GetTerminalFromStreamEvent(pCallMediaEvent, &pTerminal);
- if ( FAILED(hr) )
- {
- MessageBox("ITCallMediaEvent: GetTerminalFromStreamEvent failed");
- m_Tapi.m_pCall->Disconnect(DC_NORMAL);
- break;
- }
- //
- // 根据终端的方向进行处理
- //
- TERMINAL_DIRECTION td;
- hr = pTerminal->get_Direction( &td);
- //
- // 释放接口
- //
- pTerminal->Release();
- if ( FAILED(hr) )
- {
- MessageBox("ITCallMediaEvent: get_Direction failed");
- m_Tapi.m_pCall->Disconnect(DC_NORMAL);
- break;
- }
- //
- // 方向是 TD_CAPTURE:播放声音文件
- //
- if ( TD_CAPTURE == td && NULL != m_Tapi.m_pPlayFileTerm)
- {
- ITMediaControl* pITMC = NULL;
-
- hr = m_Tapi.m_pPlayFileTerm->QueryInterface(IID_ITMediaControl, (void**)&pITMC);
- //
- // 获得 ITMediaControl,开始发送媒体流
- //
- if(FAILED(hr))
- {
- MessageBox("ITCallMediaEvent: m_pPlayFileTerm QI for ITMediaControl failed");
- m_Tapi.m_pCall->Disconnect(DC_NORMAL);
- break;
- }
- //
- // 开始发送
- //
- hr = pITMC->Start();
-
- pITMC->Release();
- if(SUCCEEDED(hr))
- {
- SetStatusMessage("正在播放音频文件... ");
- }
- else
- {
- MessageBox("ITCallMediaEvent: ITMediaControl::Start() failed");
- m_Tapi.m_pCall->Disconnect(DC_NORMAL);
- }
- }
-
- break;
- }
-
- default:
- break;
- }
- //
- // 释放接口
- //
- pCallMediaEvent->Release();
- return hr;
- }
- ///////////////////////////////////////////////////////////////////
- // DoFileEvent
- //
- //
- // TE_FILETERMINAL 文件终端事件. pEvent: ITFileTerminalEvent
- // 说明:只有 WinXP 下才支持
- ///////////////////////////////////////////////////////////////////
- HRESULT CtapiPhoneDlg::DoFileEvent(
- IN IDispatch * pEvent)
- {
-
- //
- // 检测当前 Call 是否有效
- //
- if(NULL == m_Tapi.m_pCall)
- {
- return E_UNEXPECTED;
- }
- ITFileTerminalEvent* pITFTEvent = NULL;
- HRESULT hr = pEvent->QueryInterface( IID_ITFileTerminalEvent,
- reinterpret_cast<void **>(&pITFTEvent) );
- if (FAILED(hr))
- {
- //
- // 致命错误 - 无法继续下去 - 切断此次通话
- //
- MessageBox("ITFileTerminalEvent, 获得接口失败!");
- m_Tapi.m_pCall->Disconnect(DC_NORMAL);
- return hr;
- }
- //
- // 获得状态 - ???????因为我们要确保声音文件未被其它程序使用
- //
- TERMINAL_MEDIA_STATE ftState = TMS_ACTIVE;
- hr = pITFTEvent->get_State(&ftState);
- if(FAILED(hr))
- {
- //
- // 致命错误 - 无法继续下去 - 切断此次通话
- //
- pITFTEvent->Release();
- MessageBox("ITFileTerminalEvent, but failed to get_State");
- m_Tapi.m_pCall->Disconnect(DC_NORMAL);
- return hr;
- }
- //
- // 我们对 TMS_IDLE 感兴趣,因为我们要停止播放
- //
- if(ftState != TMS_IDLE)
- {
- pITFTEvent->Release();
- return hr;
- }
- //
- // 获得终端
- //
- ITTerminal *pTerminal = NULL;
- hr = pITFTEvent->get_Terminal(&pTerminal);
- //
- // 不再需要这个接口
- //
- pITFTEvent->Release();
- if(FAILED(hr))
- {
- //
- // 致命错误 - 无法继续下去 - 切断此次通话
- //
- MessageBox("ITFileTerminalEvent, but failed to get_Terminal");
- m_Tapi.m_pCall->Disconnect(DC_NORMAL);
- return hr;
- }
- TERMINAL_DIRECTION td;
- hr = pTerminal->get_Direction( &td);
- pTerminal->Release();
- if(FAILED(hr))
- {
- //
- // 致命错误 - 无法继续下去 - 切断此次通话
- //
- MessageBox("ITFileTerminalEvent, but failed to get_Direction");
- m_Tapi.m_pCall->Disconnect(DC_NORMAL);
- return hr;
- }
- if((td == TD_CAPTURE) && (NULL != m_Tapi.m_pPlayFileTerm))
- {
- SetStatusMessage("通话中...");
- //
- // unselect playback - 因为播放已经完成
- //
- ITBasicCallControl2 *pITBCC2 = NULL;
- hr = m_Tapi.m_pCall->QueryInterface(IID_ITBasicCallControl2, (void**)&pITBCC2);
- if(FAILED(hr))
- {
- //
- // 致命错误 - 无法继续下去 - 切断此次通话
- //
- MessageBox("ITFileTerminalEvent, but failed to QI for ITBasicCallControl2");
- m_Tapi.m_pCall->Disconnect(DC_NORMAL);
- return hr;
- }
- //
- // 使用 ITBasicCallControl2 方法 - 要比列举媒体流、终端容易的多
- //
- hr = pITBCC2->UnselectTerminalOnCall( m_Tapi.m_pPlayFileTerm);
- m_Tapi.m_pPlayFileTerm->Release();
- m_Tapi.m_pPlayFileTerm = NULL;
- pITBCC2->Release();
- if(FAILED(hr))
- {
- //
- // 致命错误 - 无法继续下去 - 切断此次通话
- //
- MessageBox("ITFileTerminalEvent, but failed to ITBasicCallControl2::UnselectTerminalOnCall");
- m_Tapi.m_pCall->Disconnect(DC_NORMAL);
- return hr;
- }
- }
- return hr;
- }
- /////////////////////////////////////////////////////////////////////////////////////
- // DigitEvent
- //
- // 处理 TE_DIGITEVENT 事件,TE_DIGITEVENT 时触发,对应接口 ITDigitDetectionEvent
- /////////////////////////////////////////////////////////////////////////////////////
- HRESULT CtapiPhoneDlg::DoDigitEvent(IN IDispatch* pEvent)
- {
- ITDigitDetectionEvent* pDigitEvent;
- //
- // 获得接口
- //
- pEvent->QueryInterface(IID_ITDigitDetectionEvent, (void**)&pDigitEvent);
- unsigned char dig;
- pDigitEvent->get_Digit(&dig);
- //
- // 跟据用户不同按键选择做出不同的回应
- //
- switch (dig)
- {
- case '1':
- // 播放声音1
- m_Tapi.PreparePlay(strFileName1);
- break;
- case '2':
- // 播放声间2
- m_Tapi.PreparePlay(strFileName2);
- break;
- case '3':
- // 留言
- m_Tapi.StartRecord();
- default:
- break;
- }
- return S_OK;
- }