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; 
 }