📄 tapiline.cpp
字号:
{
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("Invalid Call Privilege");
break;
case LINEERR_INVALCALLSELECT: //(= &H8000001B)
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("Invalid 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("Invalid 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: //(= &H80000041)
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: //(= &H80000046)
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 = "Rate Unavailable";
break;
case LINEERR_RESOURCEUNAVAIL: //(= &H8000004B)
strErrorMsg = _T("没有足够的资源完成此请求");
break;
case LINEERR_REQUESTOVERRUN: //(= &H8000004C)
strErrorMsg = _T("Request Overrun");
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("未知错误"); // undefined
break;
}
return strErrorMsg;
}
//回调函数,处理线路信息和状态改变信息
void CTAPILine::LineCallbackProc(DWORD dwDevice,
DWORD dwMsg,
DWORD dwCallbackInstance,
DWORD dwParam1,
DWORD dwParam2, DWORD dwParam3)
{
int i = TAPI_MAKECALLRESULT;
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -