📄 tapiline.cpp
字号:
// TAPILine.cpp: implementation of the CTAPILine class.
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "TAPI.h"
#include "TAPICase.h"
#include "global.h"
#include "TAPILine.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CTAPILine* myTAPILine;
#define TAPI_SUCCESS 0
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//初始化这个类时,将要协商的最高版本设为3.0,最低版本设为1.3
CTAPILine::CTAPILine()
{
m_lowAPIVersion = 0x00010003;
m_highAPIVersion = 0x00030000;
m_nCurLineID = 0;
m_hLine = 0;
m_nApplicationVersion = 0;
myTAPILine = this;
}
//关闭线路
CTAPILine::~CTAPILine()
{
if(m_hCall != 0)
{
lineDeallocateCall(m_hCall);
m_hCall = 0;
}
if(m_hCall != 0)
CloseLine();
if(m_hLineApp != 0)
{
lineShutdown(m_hLineApp);
m_hLineApp = 0;
}
}
//这四个函数设定和获取最高版本号和最低版本号
DWORD CTAPILine::GetLowAPI()
{
return m_lowAPIVersion;
}
void CTAPILine::SetLowAPI(DWORD ver)
{
m_lowAPIVersion = ver;
}
DWORD CTAPILine::GetHighAPI()
{
return m_highAPIVersion;
}
void CTAPILine::SetHighAPI(DWORD ver)
{
m_highAPIVersion = ver;
}
//获取当前的TAPI线路数值,并提供给其他模块使用
DWORD CTAPILine::GetNumLines()
{
return m_nNumLines;
}
//获取和设定当前TAPI线路
DWORD CTAPILine::GetCurrentLineID()
{
return m_nCurLineID;
}
void CTAPILine::SetCurrentLineID(DWORD id)
{
if(id >= 0 && id < m_nNumLines)
m_nCurLineID = id;
GetLineDevCaps();
}
//获取线路信息中的内容
CString CTAPILine::GetLineName()
{
return m_strLineName;
}
CString CTAPILine::GetProviderInfo()
{
return m_strProviderInfo;
}
CString CTAPILine::GetSwitchInfo()
{
return m_strSwitchInfo;
}
DWORD CTAPILine::GetPermanentLineID()
{
return m_nPermanentLineID;
}
DWORD CTAPILine::GetStringFormat()
{
return m_nStringFormat;
}
DWORD CTAPILine::GetNumAddress()
{
return m_numAddresses;
}
DWORD CTAPILine::GetmaxDataRate()
{
return m_nMaxDataRate;
}
LONG CTAPILine::GetBearerModes()
{
return m_nBearerModes;
}
LONG CTAPILine::GetAddressModes()
{
return m_nAddressModes;
}
LONG CTAPILine::GetMediaModes()
{
return m_nMediaModes;
}
DWORD CTAPILine::GetGenerateToneMaxNumFreq()
{
return m_nGenerateToneMaxNumFreq;
}
DWORD CTAPILine::GetGenerateToneModes()
{
return m_nGenerateToneModes;
}
DWORD CTAPILine::GetNumTerminals()
{
return m_nNumTerminals;
}
BOOL CTAPILine::GetLineSupportsVoice()
{
BOOL bLineSupportsVoice = FALSE;
if(m_nBearerModes & LINEBEARERMODE_VOICE)
{
if(m_nMediaModes & LINEMEDIAMODE_INTERACTIVEVOICE)
bLineSupportsVoice = TRUE;
}
return bLineSupportsVoice;
}
DWORD CTAPILine::GetNegoAPIVersion()
{
return m_nAPIVersions[m_nCurLineID];
}
DWORD CTAPILine::GetExtAPIID0()
{
return m_extAPIVersions[m_nCurLineID].dwExtensionID0;
}
DWORD CTAPILine::GetExtAPIID1()
{
return m_extAPIVersions[m_nCurLineID].dwExtensionID1;
}
DWORD CTAPILine::GetExtAPIID2()
{
return m_extAPIVersions[m_nCurLineID].dwExtensionID2;
}
DWORD CTAPILine::GetExtAPIID3()
{
return m_extAPIVersions[m_nCurLineID].dwExtensionID3;
}
//对错误代码提供返回错误信息字符串
DWORD CTAPILine::GetLasterror()
{
DWORD lastError;
lastError = m_nLastTAPIError;
//重置错误标识
m_nLastTAPIError = 0;
return lastError;
}
CString CTAPILine::ErrorString(DWORD errCode)
{
CString strError;
strError = GetLineErrString(errCode);
return strError;
}
//创建函数
BOOL CTAPILine::Create()
{
DWORD rc, line;
LINEINITIALIZEEXPARAMS lip;
LINEEXTENSIONID lxid;
CString strTitle = _T("电话API程序");
//初始化参数
lip.dwTotalSize = sizeof(lip);
lip.dwOptions = LINEINITIALIZEEXOPTION_USEHIDDENWINDOW;
//初始化TAPI线路以及返回TAPI句柄
rc = lineInitializeEx(&m_hLineApp, AfxGetApp()->m_hInstance, LineCallbackProc,
strTitle, &m_nNumLines, &m_highAPIVersion, &lip);
if(rc != TAPI_SUCCESS)
{
m_nLastTAPIError = rc;
return FALSE;
}
else
{
//不存在逻辑线路
if(m_nNumLines > 0)
{
//为每一条TAPI线路进行版本协商
for(line = 0; line < m_nNumLines; line++)
{
rc = lineNegotiateAPIVersion(m_hLineApp, line, m_lowAPIVersion,
m_highAPIVersion, &m_nAPIVersions[line], &lxid);
//没有合适API版本
if(rc != TAPI_SUCCESS)
{
m_nAPIVersions[line] = 0;
rc = 0;
}
else
{
m_extAPIVersions[line].dwExtensionID0 = lxid.dwExtensionID0;
m_extAPIVersions[line].dwExtensionID1 = lxid.dwExtensionID1;
m_extAPIVersions[line].dwExtensionID2 = lxid.dwExtensionID2;
m_extAPIVersions[line].dwExtensionID3 = lxid.dwExtensionID3;
if(m_nAPIVersions[line] > m_nApplicationVersion)
m_nApplicationVersion = m_nAPIVersions[line];
}
}
}
else
return FALSE;
}
rc = GetLineDevCaps();
return TRUE;
}
//打开线路信息函数
BOOL CTAPILine::OpenLine(DWORD nPrivileges,
DWORD nMediaModes)
{
//如果呼叫无效,返回打开线路失败函数
if(m_hLine != 0)
{
return FALSE;
}
DWORD rc;
//打开当前线路
rc = lineOpen(m_hLineApp,
m_nCurLineID,
&m_hLine,
m_nAPIVersions[m_nCurLineID],
0,
0,
nPrivileges,
nMediaModes,
NULL);
//如果线路打开失败,范活错误标识;否则,返回线路打开成功标志
if(rc != TAPI_SUCCESS)
{
m_nLastTAPIError = rc;
return FALSE;
}
return TRUE;
}
//产生异步呼叫的函数
BOOL CTAPILine::MakeCallAsynch(CString strPhoneNumbers)
{
DWORD rc;
if(m_hLine == 0)
return FALSE;
//如果呼叫号码为空,实际上打开呼叫句柄,不进行实际的呼叫
if(strPhoneNumbers == "")
rc = lineMakeCall(m_hLine, &m_hCall, "", 0, NULL);
//呼叫一个号码
else
rc = lineMakeCall(m_hLine, &m_hCall, strPhoneNumbers, 0, NULL);
if(rc > 0)
{
//如果呼叫结束,则产生LINE_REPLY中将会反映出来
//记录当前的请求ID
m_nRequestingCall = rc;
}
else
{
m_nLastTAPIError = rc;
return FALSE;
}
return TRUE;
}
//异步挂断电话的函数
BOOL CTAPILine::DropCallAsynch()
{
DWORD rc;
if(m_hCall == 0)
{
return FALSE;
}
rc = lineDrop(m_hCall, "", 0);
if(rc > 0)
m_nDroppingCall = rc;
else
{
m_nLastTAPIError = rc;
return FALSE;
}
return TRUE;
}
//关闭线路的函数
BOOL CTAPILine::CloseLine()
{
DWORD rc;
if(m_hLine == 0)
{
return FALSE;
}
//关闭线路
rc = lineClose(m_hLine);
//线路句柄无效
m_hLine = 0;
//记录错误
if(rc != TAPI_SUCCESS)
{
m_nLastTAPIError = rc;
return FALSE;
}
return TRUE;
}
//线路配置的函数,该函数调用线路配置对话框
BOOL CTAPILine::ConfigDialog(HWND hWnd, CString strDeviceClass)
{
DWORD rc;
if(strDeviceClass == "")
rc = lineConfigDialog(m_nCurLineID, hWnd, "");
else
rc = lineConfigDialog(m_nCurLineID, hWnd, strDeviceClass);
if(rc != TAPI_SUCCESS)
{
m_nLastTAPIError = rc;
return FALSE;
}
//标识成功
return TRUE;
}
//拨号配置的函数,该函数调用拨号配置对话框
BOOL CTAPILine::DialoingPropertiesDialog(HWND hWnd, CString strPhoneNumber)
{
DWORD rc;
if(strPhoneNumber == "")
rc = lineTranslateDialog(m_hLineApp, m_nCurLineID, m_nApplicationVersion, hWnd, "");
else
rc = lineTranslateDialog(m_hLineApp, m_nCurLineID, m_nApplicationVersion, hWnd, strPhoneNumber);
if(rc != TAPI_SUCCESS)
{
m_nLastTAPIError = rc;
return FALSE;
}
return TRUE;
}
//获取线路信息
BOOL CTAPILine::GetLineDevCaps()
{
DWORD rc;
CString strRef;
LPBYTE buffer = new BYTE[1000];
LPLINEDEVCAPS lpDevCaps = (LPLINEDEVCAPS)buffer;
lpDevCaps->dwTotalSize = 1000 * sizeof(BYTE);
rc = lineGetDevCaps(m_hLineApp, m_nCurLineID, m_nAPIVersions[m_nCurLineID],
0, lpDevCaps);
if(rc != TAPI_SUCCESS)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -