⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 callcontrol.oldc

📁 基于嵌入式Linux平台的网络电话设计控制部分原程序代码。
💻 OLDC
📖 第 1 页 / 共 5 页
字号:

//yy		goIppbxfx.vSetRTCTime( &( ptCcUaMsg->u.tSetSystemTime.tSys ) );

		return;
	}

	if ( ptCcUaMsg->hdr.eMsgType == eGetFxsInfo ) {
		
		if ( gboolTraceEnable ) {
			ptCcUaMsg->hdr.dwDirection = 0;
			ptCcUaMsg->hdr.dwStatus = (DWORD)-1;
			iQXput( &gqxQueueTrace, (UCHAR *)ptCcUaMsg );
		}

		for( dwTmp = 0; dwTmp < MAX_LINE_NUM; dwTmp ++ ) {
			if ( goCC.m_tModuleInfo.port.dwTelno[dwTmp] == ptCcUaMsg->u.tGetFxsInfo.iDestChannel ) {
				ptCcUaMsg->hdr.dwChannel = dwTmp;
				break;
			}
		}

		// answer information of FXX
		ptCcUaMsg->hdr.eMsgType = eGetFxsInfoAns;
		ptCcUaMsg->u.tGetFxsInfo.iDestChannel = ptCcUaMsg->u.tGetFxsInfo.dwSrcChannel;
		ptCcUaMsg->u.tGetFxsInfo.dwType = 1;
		ptCcUaMsg->u.tGetFxsInfo.dwGrade = goCC.m_tModuleInfo.port.dwGrade[ptCcUaMsg->hdr.dwChannel];
		ptCcUaMsg->u.tGetFxsInfo.dwPassword = goCC.m_tModuleInfo.port.dwPwd[ptCcUaMsg->hdr.dwChannel];

		if ( gboolTraceEnable ) {
			ptCcUaMsg->hdr.dwDirection = 1;
			ptCcUaMsg->hdr.dwStatus = (DWORD)-1;
			iQXput( &gqxQueueTrace, (UCHAR *)ptCcUaMsg );
		}

		// call function of HEGS
		vReceiveCCMesg( ptCcUaMsg );
		return;
	}

	if ( ptCcUaMsg->hdr.eMsgType == eFollowme ) {
		// followme message must be dealt here
		if ( gboolTraceEnable ) {
			ptCcUaMsg->hdr.dwDirection = 0;
			ptCcUaMsg->hdr.dwStatus = (DWORD)-1;
			iQXput( &gqxQueueTrace, (UCHAR *)ptCcUaMsg );
		}

		for( dwTmp = 0; dwTmp < MAX_LINE_NUM; dwTmp ++ ) {
			if ( goCC.m_tModuleInfo.port.dwTelno[dwTmp] == ptCcUaMsg->u.tFollowme.iSourceNumber ) {
				ptCcUaMsg->hdr.dwChannel = dwTmp;
				break;
			}
		}

		goCC.vFollowmeFunc( ptCcUaMsg->hdr.dwChannel, ptCcUaMsg );

		return;
	}

	if ( ptCcUaMsg->hdr.eMsgType == eFollowmeAns ) {
		for( dwTmp = 0; dwTmp < MAX_LINE_NUM; dwTmp ++ ) {
			if ( goCC.m_tModuleInfo.port.dwTelno[dwTmp] == ptCcUaMsg->u.tFollowmeResult.iSourceNumber ) {
				ptCcUaMsg->hdr.dwChannel = dwTmp;
				break;
			}
		}
	}

	if ( ptCcUaMsg->hdr.eMsgType == eFxoFlash ) {
		for( dwTmp = 0; dwTmp < MAX_LINE_NUM; dwTmp ++ ) {
			if ( goCC.m_tModuleInfo.port.dwTelno[dwTmp] == ptCcUaMsg->u.tFxoFlash.iFxoNumber ) {
				ptCcUaMsg->hdr.dwChannel = dwTmp;
				break;
			}
		}
	}

	if ( ptCcUaMsg->hdr.eMsgType == eFxoStatusEnquiry ) {
		for( dwTmp = 0; dwTmp < MAX_LINE_NUM; dwTmp ++ ) {
			if ( goCC.m_tModuleInfo.port.dwTelno[dwTmp] == ptCcUaMsg->u.tFxoStatusEnquiry.iFxoNumber ) {
				ptCcUaMsg->hdr.dwChannel = dwTmp;
				break;
			}
		}

		if ( gboolTraceEnable ) {
			ptCcUaMsg->hdr.dwDirection = 0;
			ptCcUaMsg->hdr.dwStatus = (DWORD)-1;
			iQXput( &gqxQueueTrace, (UCHAR *)ptCcUaMsg );
		}

		if ( dwTmp >= MAX_LINE_NUM ) {
			return;
		}
		
		goCC.vStatusEnquiryAck( ptCcUaMsg->hdr.dwChannel, ptCcUaMsg );

		return;
	}

	if ( ptCcUaMsg->hdr.eMsgType == eFxoStatusAck ) {
		for( dwTmp = 0; dwTmp < MAX_LINE_NUM; dwTmp ++ ) {
			if ( goCC.m_tModuleInfo.port.dwTelno[dwTmp] == ptCcUaMsg->u.tFxoStatusAck.iFxoNumber ) {
				ptCcUaMsg->hdr.dwChannel = dwTmp;
				break;
			}
		}
		if ( dwTmp >= MAX_LINE_NUM ) {
			if ( gboolTraceEnable ) {
				ptCcUaMsg->hdr.dwDirection = 0;
				ptCcUaMsg->hdr.dwStatus = (DWORD)-1;
				iQXput( &gqxQueueTrace, (UCHAR *)ptCcUaMsg );
			}
			return;
		}
	}

	if ( ptCcUaMsg->hdr.eMsgType == eSetAgentModeResult ) {
		for( dwTmp = 0; dwTmp < MAX_LINE_NUM; dwTmp ++ ) {
			if ( goCC.m_tModuleInfo.port.dwTelno[dwTmp] == ptCcUaMsg->u.tSetAgentModeResultValue.dwChannel ) {
				ptCcUaMsg->hdr.dwChannel = dwTmp;
				break;
			}
		}
		if ( dwTmp >= MAX_LINE_NUM ) {
			if ( gboolTraceEnable ) {
				ptCcUaMsg->hdr.dwDirection = 0;
				ptCcUaMsg->hdr.dwStatus = (DWORD)-1;
				iQXput( &gqxQueueTrace, (UCHAR *)ptCcUaMsg );
			}
			return;
		}
	}

	if ( ptCcUaMsg->hdr.eMsgType == eSetAgentArgsResult ) {
		for( dwTmp = 0; dwTmp < MAX_LINE_NUM; dwTmp ++ ) {
			if ( goCC.m_tModuleInfo.port.dwTelno[dwTmp] == ptCcUaMsg->u.tSetAgentArgsResultValue.dwChannel ) {
				ptCcUaMsg->hdr.dwChannel = dwTmp;
				break;
			}
		}
		if ( dwTmp >= MAX_LINE_NUM ) {
			if ( gboolTraceEnable ) {
				ptCcUaMsg->hdr.dwDirection = 0;
				ptCcUaMsg->hdr.dwStatus = (DWORD)-1;
				iQXput( &gqxQueueTrace, (UCHAR *)ptCcUaMsg );
			}
			return;
		}
	}

	if ( ptCcUaMsg->hdr.eMsgType == eInConference ) {
		for( dwTmp = 0; dwTmp < MAX_LINE_NUM; dwTmp ++ ) {
			if ( goCC.m_tModuleInfo.port.dwTelno[dwTmp] == ptCcUaMsg->u.tInConference.iDstNumber ) {
				ptCcUaMsg->hdr.dwChannel = dwTmp;
				break;
			}
		}
	}

	if ( ptCcUaMsg->hdr.eMsgType == eOutConference ) {
		for( dwTmp = 0; dwTmp < MAX_LINE_NUM; dwTmp ++ ) {
			if ( goCC.m_tModuleInfo.port.dwTelno[dwTmp] == ptCcUaMsg->u.tOutConference.iDstNumber ) {
				ptCcUaMsg->hdr.dwChannel = dwTmp;
				break;
			}
		}
	}

	if ( ptCcUaMsg->hdr.eMsgType == eSetCodecType ) {

		if ( gboolTraceEnable ) {
			ptCcUaMsg->hdr.dwDirection = 0;
			ptCcUaMsg->hdr.dwStatus = (DWORD)-1;
			iQXput( &gqxQueueTrace, (UCHAR *)ptCcUaMsg );
		}

		goCC.vSetCodec( ptCcUaMsg->hdr.dwChannel, ptCcUaMsg );

		return;
	}

#if	OLD
	if ( ptCcUaMsg->hdr.eMsgType == eDtmfCode ) {
		for( dwTmp = 0; dwTmp < MAX_LINE_NUM; dwTmp ++ ) {
			if ( goCC.m_tModuleInfo.port.dwTelno[dwTmp] == ptCcUaMsg->u.tDtmfCode.dwDestNumber ) {
				ptCcUaMsg->hdr.dwChannel = dwTmp;
				break;
			}
		}
	}
#endif

	if ( ptCcUaMsg->hdr.eMsgType == eCallid ) {
		for( dwTmp = 0; dwTmp < MAX_LINE_NUM; dwTmp ++ ) {
			if ( goCC.m_tModuleInfo.port.dwTelno[dwTmp] == ptCcUaMsg->u.tCallid.iDestNumber ) {
				ptCcUaMsg->hdr.dwChannel = dwTmp;
				break;
			}
		}
	}

	if ( ptCcUaMsg->hdr.eMsgType == eReplaceInform ) {
		ptCcUaMsg->hdr.eMsgType = eReplace;
		for( dwTmp = 0; dwTmp < MAX_LINE_NUM; dwTmp ++ ) {
			if ( goCC.m_tModuleInfo.port.dwTelno[dwTmp] == ptCcUaMsg->u.tReplace.iChannelNumber ) {
				ptCcUaMsg->hdr.dwChannel = dwTmp;
				break;
			}
		}
	}

	if ( ptCcUaMsg->hdr.eMsgType == eReplaceFail ) {
		for( dwTmp = 0; dwTmp < MAX_LINE_NUM; dwTmp ++ ) {
			if ( goCC.m_tModuleInfo.port.dwTelno[dwTmp] == ptCcUaMsg->u.tReplaceFail.iChannelNumber ) {
				ptCcUaMsg->hdr.dwChannel = dwTmp;
				break;
			}
		}
	}

	iQXput( &gqxQueueUaMsg, (UCHAR *)ptCcUaMsg );
}

void CCallControl::vReportAll()
{
	DWORD	dwTmp;

	for( dwTmp = 0; dwTmp < MAX_LINE_NUM; dwTmp ++ ) {
		m_mdwReportSame[dwTmp] = 0;
		vReportCCStatus( dwTmp );
	}
}

DWORD CCallControl::dwGetStatus( DWORD dwChannel )
{
	if ( dwChannel >= MAX_LINE_NUM ) {
		return 0xFFFFFFFF;
	}

	return meChannelStatus[dwChannel];
}

eCodeParserResult CCallControl::eCodeParser( DWORD dwChannel, char chCode )
{
	DWORD		dwIdx, dwTmp;
	char		*ptr;
	DWORD		dwNumberLen;
	DWORD		dwCodeLen;
	char		chCommand[MAX_TELNO_LEN];

	dwIdx = mtFxxAttrib[dwChannel].eActiveCall;
	ptr = mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].mchDtmfRecord;
	if ( mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDtmfCounter < MAX_TELNO_LEN ) {
		ptr[mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDtmfCounter] = chCode;
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDtmfCounter ++;
	}

	// 被叫80转换为9
	// 拨号时把有效的被叫号码存到dwDialNumber
	// 功能码的结果放到 mtFxxAttrib[dwChannel].eCurrentFuncCode, dwFollowmeNumberSave, mchFollowmePassword
	if ( ptr[0] == 8 && ptr[1] == 0 ) {
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDialNumber = 9;
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].boolFxoCall = TRUE;
		return eCalleeOk;
	}

	if ( ptr[0] == 11 && ptr[1] == 11 ) {
		return eFuncRedialLast;
	}

	if ( ptr[0] == 10 && ptr[1] == 10 ) {
		// ** 按代接处理
		mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncReplace;
		return eFuncCodeOk;
	}

	dwNumberLen = m_tGlobalInfo.general.dwFxsTelLength;

	dwCodeLen = mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDtmfCounter;
	dwCodeLen %= MAX_TELNO_LEN - 2;

	for( dwTmp = 0; dwTmp < dwCodeLen; dwTmp ++ ) {
		chCommand[dwTmp] = ptr[dwTmp] + '0';
	}
	chCommand[dwCodeLen] = 0;

	switch( ptr[0] ) {
#ifdef	SOFT_PBX
	case 6:
		// 软交换选择功能码
		if ( chCode == 11 ) {
			goIppbxfx.vSetCallType( dwChannel, 1 );
			return eFuncVoip;
		}
		return eCalleeContinue;
#endif
#if	0
	case 8:
		if ( m_tGlobalInfo.general.dwDeptFlag > 9 ) {
			// 两位局号
			if ( mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDtmfCounter < 3 ) {
				return eCalleeContinue;
			}
			mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDialNumber = ptr[0] * 100 + ptr[1] * 10 + ptr[2];
			mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].boolFxoCall = TRUE;
			if ( gmiLineType[dwChannel] == LINE_FXS ) {
				sprintf( mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].tSetup.cDispName, "AAA%dAAA%d",
					m_tModuleInfo.port.dwTelno[dwChannel], m_tModuleInfo.port.dwTelno[dwChannel] );
			}
			return eCalleeOk;
		} else {
			// 一位局号
			if ( mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDtmfCounter < 2 ) {
				return eCalleeContinue;
			}
			mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDialNumber = ptr[0] * 10 + ptr[1];
			mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].boolFxoCall = TRUE;
			if ( gmiLineType[dwChannel] == LINE_FXS ) {
				sprintf( mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].tSetup.cDispName, "AAA%dAAA%d",
					m_tModuleInfo.port.dwTelno[dwChannel], m_tModuleInfo.port.dwTelno[dwChannel] );
			}
			return eCalleeOk;
		}
		break;
#endif
	case 10:		// *
		if ( dwCodeLen < 3 ) {
			return eCalleeContinue;
		}
		// 所有的功能码都是两位
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cForwardCode, 2 ) ) {
			//	呼叫前无条件转移登记功能码
			if ( dwCodeLen < dwNumberLen + 3 ) {
				return eCalleeContinue;
			}
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncForwardEnable;
			mtFxxAttrib[dwChannel].dwForwardNumber = atoi( chCommand + 3 );
			return eFuncCodeOk;
		}
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cAcdBusyMarkCode, 2 ) ) {
			if ( dwCodeLen < 3 ) {
				return eCalleeContinue;
			}
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncAcdSetBusyEnable;
			return eFuncCodeOk;
		}
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cDelayForwardCode, 2 ) ) {
			// 延时呼叫转移登记功能码
			if ( dwCodeLen < dwNumberLen + 5 ) {
				return eCalleeContinue;
			}
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncDelayForwardEnable;
			mtFxxAttrib[dwChannel].dwForwardNumber = atoi( chCommand + 5 );
			mtFxxAttrib[dwChannel].dwDelayForwardTimeout = ptr[3] * 10 + ptr[4];
			return eFuncCodeOk;
		}
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cFollowMeCode, 2 ) ) {
			// 跟我来登记功能码
			// Follow me Command: */#FFNNNNPPPPPP, FF is two func_codes, NNNN is three/four port number, PPPPPP is password
			if ( dwCodeLen < dwNumberLen + 3 + FXS_PASSWD_LEN ) {
				return eCalleeContinue;
			}
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncFollowmeEnable;
			mtFxxAttrib[dwChannel].dwFollowmeNumberSave = 0;
			for( dwTmp = 0; dwTmp < dwNumberLen; dwTmp ++ ) {
				mtFxxAttrib[dwChannel].dwFollowmeNumberSave *= 10;
				mtFxxAttrib[dwChannel].dwFollowmeNumberSave += ptr[dwTmp+3];
			}
			mtFxxAttrib[dwChannel].dwFollowmePassword = atoi( chCommand + 3 + dwNumberLen );
			return eFuncCodeOk;
		}
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cCallWaitCode, 2 ) ) {
			// 呼叫等待登记功能码

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -