www.pudn.com > TAPICase.rar > TAPILine.cpp
//TAPILine.cpp : implementation of the CTAPILine class.
//writer :MR ma zhaolin
#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 && idm_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;linem_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);
// 如果线路找开失败,激活错误标,否则,返回线路打开成功标志021-58712633,浦东大道2998
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)
{
m_nLastTAPIError=rc;
return FALSE;
}
//将信息保存入当前类中定义的变量
if(lpDevCaps->dwLineNameSize!=0)
m_strLineName=(LPCSTR)(buffer+lpDevCaps->dwLineNameOffset);
else
m_strLineName=_T("");
if(lpDevCaps->dwProviderInfoSize!=0)
m_strProviderInfo=(LPCSTR)(buffer+lpDevCaps->dwProviderInfoOffset);
else
m_strProviderInfo=_T("");
if(lpDevCaps->dwSwitchInfoSize!=0)
m_strSwitchInfo=(LPCSTR)(buffer+lpDevCaps->dwSwitchInfoOffset);
else
m_strSwitchInfo=_T("");
m_nPermanentLineID=lpDevCaps->dwPermanentLineID;
m_nStringFormat=lpDevCaps->dwStringFormat;
m_numAddresses=lpDevCaps->dwNumAddresses;
m_nMaxDataRate=lpDevCaps->dwMaxRate;
m_nBearerModes=lpDevCaps->dwBearerModes;
m_nAddressModes=lpDevCaps->dwAddressModes;
m_nMediaModes=lpDevCaps->dwMediaModes;
m_nGenerateToneMaxNumFreq=lpDevCaps->dwGenerateToneMaxNumFreq;
m_nGenerateToneModes=lpDevCaps->dwGenerateToneModes;
m_nNumTerminals=lpDevCaps->dwNumTerminals;
return TRUE;
}
CString CTAPILine::GetLineErrString(DWORD lErrCode)
{
CString strErrorMsg;
switch(lErrCode)
{
case LINEERR_ALLOCATED://(=&H80000001)
strErrorMsg=_T("所要求得到资源(如串行口)已经分配给另一个进程了");
break;
case LINEERR_BADDEVICEID://(=&H80000002)
strErrorMsg=_T("指定的设备ID超出了范围");
break;
case LINEERR_BEARERMODEUNAVAIL://(=&H80000003)
strErrorMsg=_T("指定的模式超出的范围");
break;
case LINEERR_CALLUNAVAIL://(=&H80000005)
strErrorMsg=_T("在这个地址目前没有可用的呼叫出现");
break;
case LINEERR_COMPLETIONOVERRUN://(=&H80000006)
strErrorMsg=_T("Completion Overrun");
break;
case LINEERR_CONFERENCEFULL://(=&H80000007)
strErrorMsg=_T("conference Full");
break;
case LINEERR_DIALBILLING://(=&H80000008)
strErrorMsg=_T("服务提供者不支持等待付费的音频$");
break;
case LINEERR_DIALDIALTONE://(=&H80000009)
strErrorMsg=_T("服务提供者不支持等待拨号的音频W");
break;
case LINEERR_DIALPROMPT://(=&H8000000A)
strErrorMsg=_T("服务提供者不支持等待提示符?");
break;
case LINEERR_DIALQUIET://(=&H8000000B)
strErrorMsg=_T("服务提供者不支持等待静默@");
break;
case LINEERR_INCOMPATIBLEAPIVERSION://(=&H8000000C)
strErrorMsg=_T("指定的版本号不兼容");
break;
case LINEERR_INCOMPATIBLEEXTVERSION://(=&H8000000D)
strErrorMsg=_T("指定的扩展号不兼容");
break;
case LINEERR_INIFILECORRUPT://(=&H8000000E)
strErrorMsg=_T("初始化文件错误");
break;
case LINEERR_INUSE://(=&H8000000F)
strErrorMsg=_T("指定的线路正在使用");
break;
case LINEERR_INVALADDRESS://(=&H80000010)
strErrorMsg=_T("指定的地址包含无效字符");
break;
case LINEERR_INVALADDRESSID://(=&H80000011)
strErrorMsg=_T("指定的地址超出范围");
break;
case LINEERR_INVALADDRESSMODE://(=&H80000012)
strErrorMsg=_T("无效的地址模式");
break;
case LINEERR_INVALADDRESSSTATE://(=&h80000013)
strErrorMsg=_T("无效的地址状态");
break;
case LINEERR_INVALAPPHANDLE://&H80000014
strErrorMsg=_T("指定的应用程序的句柄是无效的");
break;
case LINEERR_INVALAPPNAME://&H80000015
strErrorMsg=_T("Invalid App Name");
break;
case LINEERR_INVALBEARERMODE://&H80000016
strErrorMsg=_T("Invalid Bearer Mode");
break;
case LINEERR_INVALCALLCOMPLMODE://&H80000017
strErrorMsg=_T("Invalid Call Completion Mode");
break;
case LINEERR_INVALCALLHANDLE://&H80000018
strErrorMsg=_T("Invalid Call Handle");
break;
case LINEERR_INVALCALLPARAMS://&H80000019
strErrorMsg=_T("Invalid Call Params");
break;
case LINEERR_INVALCALLPRIVILEGE://&H8000001A
strErrorMsg=_T("Invvalid Call Privilege");
break;
case LINEERR_INVALCALLSELECT://&H80000001B
strErrorMsg=_T("Invalid Call Select");
break;
case LINEERR_INVALCALLSTATE://&H8000001C
strErrorMsg=_T("指定的呼叫对请求动作来说处未于正确的呼叫状态");
break;
case LINEERR_INVALCALLSTATELIST://&H8000001D
strErrorMsg=_T("Invalid Call State List");
break;
case LINEERR_INVALCARD://&H8000001E
strErrorMsg=_T("Invalid Card");
break;
case LINEERR_INVALCOMPLETIONID://&H8000001F
strErrorMsg=_T("Invalid Completion ID");
break;
case LINEERR_INVALCONFCALLHANDLE://&h80000020
strErrorMsg=_T("Invalid Conf Call handle");
break;
case LINEERR_INVALCONSULTCALLHANDLE://&H80000021
strErrorMsg=_T("Invalid Consult Call handle");
break;
case LINEERR_INVALCOUNTRYCODE://&H80000022
strErrorMsg=_T("指定的国家代码是无效的");
break;
case LINEERR_INVALDEVICECLASS://&H80000023
strErrorMsg=_T("Invalid Device Class");
break;
case LINEERR_INVALDEVICEHANDLE://&H80000024
strErrorMsg=_T("Invalid Device Handle");
break;
case LINEERR_INVALDIGITLIST://&H80000026
strErrorMsg=_T("Invalid Digit List");
break;
case LINEERR_INVALDIGITMODE://&H80000027
strErrorMsg=_T("Invalid Digit mode");
break;
case LINEERR_INVALDIGITS://&H80000028
strErrorMsg=_T("Inval Digits");
break;
case LINEERR_INVALEXTVERSION://&H80000029
strErrorMsg=_T("Invalid Ext Version");
break;
case LINEERR_INVALGROUPID://&H8000002A
strErrorMsg=_T("Invalid Group ID");
break;
case LINEERR_INVALLINEHANDLE://&H8000002B
strErrorMsg=_T("指定的线路句柄无效");
break;
case LINEERR_INVALLINESTATE://&H8000002C
strErrorMsg=_T("Invalid Line State");
break;
case LINEERR_INVALLOCATION://&H8000002D
strErrorMsg=_T("Invalid Location");
break;
case LINEERR_INVALMEDIALIST://&H8000002E
strErrorMsg=_T("Invalid Media List");
break;
case LINEERR_INVALMEDIAMODE://&H8000002F
strErrorMsg=_T("指定的媒体模式无效");
break;
case LINEERR_INVALMESSAGEID://&H80000030
strErrorMsg=_T("Invalid Message ID");
break;
case LINEERR_INVALPARAM://&H80000032
strErrorMsg=_T("有一个参数已被确定无效");
break;
case LINEERR_INVALPARKID://&H80000033
strErrorMsg=_T("Invalid park ID");
break;
case LINEERR_INVALPARKMODE://&H80000034
strErrorMsg=_T("invalid park mode");
break;
case LINEERR_INVALPOINTER://&H80000035
strErrorMsg=_T("指针没有引用一个有效的内存位置");
break;
case LINEERR_INVALPRIVSELECT://&H80000036
strErrorMsg=_T("Invlid Priv Select");
break;
case LINEERR_INVALRATE://&H80000037
strErrorMsg=_T("Invalid Rate");
break;
case LINEERR_INVALREQUESTMODE://&H80000038
strErrorMsg=_T("Invalid Request Mode");
break;
case LINEERR_INVALTERMINALID://&H80000039
strErrorMsg=_T("Invalid Terminal ID");
break;
case LINEERR_INVALTERMINALMODE://&H8000003A
strErrorMsg=_T("Invalid Terminal Mode");
break;
case LINEERR_INVALTIMEOUT://&H8000003B
strErrorMsg=_T("Invalid time Out");
break;
case LINEERR_INVALTONE://&H8000003C
strErrorMsg=_T("Invalid Tone");
break;
case LINEERR_INVALTONELIST://&H8000003D
strErrorMsg=_T("Invalid Tone list");
break;
case LINEERR_INVALTONEMODE://&H8000003E
strErrorMsg=_T("Invalid Tone Mode");
break;
case LINEERR_INVALTRANSFERMODE://&H8000003F
strErrorMsg=_T("Invalid Transfer Mode");
break;
case LINEERR_LINEMAPPERFAILED://&H80000040
strErrorMsg=_T("Line Mapper Failed");
break;
case LINEERR_NOCONFERENCE://&H8000041
strErrorMsg=_T("No Conference");
break;
case LINEERR_NODEVICE://&H80000042
strErrorMsg=_T("No Device");
break;
case LINEERR_NODRIVER://&H80000043
strErrorMsg=_T("服务提供者发现它一个组件丢失了");
break;
case LINEERR_NOMEM://&H80000044
strErrorMsg=_T("没有足够的内存用于请求的动作");
break;
case LINEERR_NOREQUEST://&H80000045
strErrorMsg=_T("No request");
break;
case LINEERR_NOTOWNER://&H8OOOOO46
strErrorMsg=_T("所请求的动作被拒绝,因为应用程序并不拥有这个呼叫");
break;
case LINEERR_NOTREGISTERED://&H80000047
strErrorMsg=_T("Not Registered");
break;
case LINEERR_OPERATIONFAILED://&H80000048
strErrorMsg=_T("因不明原因,请求失败");
break;
case LINEERR_OPERATIONUNAVAIL://&H80000049
strErrorMsg=_T("服务提供者不支持此请求");
break;
case LINEERR_RATEUNAVAIL://&H8000004A
strErrorMsg=_T("rate Unavailable");
break;
case LINEERR_RESOURCEUNAVAIL://&H8000004B
strErrorMsg=_T("没有足够的资源完成请求");
break;
case LINEERR_REQUESTOVERRUN://&H8000004C
strErrorMsg=_T("Request Over Run");
break;
case LINEERR_STRUCTURETOOSMALL://H8000004D
strErrorMsg=_T("指定的结构太小而不能包含定长的数据");
break;
case LINEERR_TARGETNOTFOUND://&H8000004E
strErrorMsg=_T("Target Not found");
break;
case LINEERR_TARGETSELF://&H8000004F
strErrorMsg=_T("Target Self");
break;
case LINEERR_UNINITIALIZED://&H80000050
strErrorMsg=_T("Uninitialized");
break;
case LINEERR_USERUSERINFOTOOBIG://&H80000051
strErrorMsg=_T("UserUser info Too Big");
break;
case LINEERR_REINIT://&H80000052
strErrorMsg=_T("Re-init");
break;
case LINEERR_ADDRESSBLOCKED://&h80000053
strErrorMsg=_T("Address Blocked");
break;
case LINEERR_BILLINGREJECTED://&H80000054
strErrorMsg=_T("Billing Rejected");
break;
case LINEERR_INVALFEATURE://&H80000055
strErrorMsg=_T("Invalid Feature");
break;
case LINEERR_NOMULTIPLEINSTANCE://&H80000056
strErrorMsg=_T("No multiple Instance");
break;
default:
strErrorMsg=_T("未知错误");
break;
}
return strErrorMsg;
}
//回调函数,处理线路信息和状态改变信息
void CTAPILine::LineCallbackProc(DWORD dwDevice,
DWORD dwMsg,
DWORD dwCallbackInstance,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwparam3)
{
switch(dwMsg)
{
case LINE_REPLY:
if(dwParam1==myTAPILine->m_nRequestingCall)
{
myTAPILine->m_nRequestingCall=0;
//如果出错确认关闭线路
if(dwParam2!=0)
{
myTAPILine->CloseLine();
}
OutputDebugString("TAPI_MAKECALLRESULT\n");
}
else
{
if(dwParam1==myTAPILine->m_nDroppingCall)
{
//异步呼叫
myTAPILine->m_nDroppingCall=0;
}
OutputDebugString("TAPI_DROPCALLRESULT\n");
}
break;
//处理状态改变信息
case LINE_CALLSTATE:
switch(dwParam1)
{
case LINECALLSTATE_DISCONNECTED:
//远程端断开呼叫
myTAPILine->DropCallAsynch();
//产生断开事件
OutputDebugString("TAPI_DISCONNECTED\n");
break;
case LINECALLSTATE_IDLE:
//不存在呼叫,空闲状态
if(myTAPILine->m_hCall!=0)
{
lineDeallocateCall(myTAPILine->m_hCall);
myTAPILine->CloseLine();
}
OutputDebugString("TAPI_IDLE\n");
break;
case LINECALLSTATE_CONNECTED:
OutputDebugString("TAPI_CONNECTED\n");
break;
case LINECALLSTATE_BUSY:
break;
case LINECALLSTATE_DIALTONE:
break;
case LINECALLSTATE_RINGBACK:
break;
case LINECALLSTATE_DIALING:
break;
case LINECALLSTATE_PROCEEDING:
break;
case LINECALLSTATE_SPECIALINFO:
break;
default:
break;
}
break;
}
}
//获得线路状态字符串
CString CTAPILine::GetLineStateString(DWORD state)
{
CString strMsg;
switch(state)
{
case LINECALLSTATE_IDLE:
strMsg=_T("呼叫变为空闲");
break;
case LINECALLSTATE_ACCEPTED:
strMsg=_T("新的呼叫被接收");
break;
case LINECALLSTATE_DIALTONE:
strMsg=_T("检测到一个拨号音频");
break;
case LINECALLSTATE_DIALING:
strMsg=_T(" 传递给电话交换机的地址信息");
break;
case LINECALLSTATE_RINGBACK:
strMsg=_T("检测到回铃信号");
break;
case LINECALLSTATE_BUSY:
strMsg=_T("呼叫未能完成");
break;
case LINECALLSTATE_CONNECTED:
strMsg=_T("呼叫已建立");
break;
case LINECALLSTATE_PROCEEDING:
strMsg=_T("呼叫建立,正在进行交换处理");
break;
case LINECALLSTATE_ONHOLD:
strMsg=_T("呼叫在掌握中");
break;
case LINECALLSTATE_CONFERENCED:
strMsg=_T("呼叫是多方会议的一方");
break;
case LINECALLSTATE_ONHOLDPENDCONF:
strMsg=_T("连接到多方会议");
break;
case LINECALLSTATE_DISCONNECTED:
strMsg=_T("呼叫已经挂起或中断");
break;
case LINECALLSTATE_UNKNOWN:
strMsg=_T("未知的呼叫状态");
break;
default:
strMsg=_T("其他未知状态 ");
break;
}
return strMsg;
}