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

📄 callcontrol.c

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

	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;

	//////////// 2006-02-27, Yang
	printf("dwChannel=%d,dwCodeLen=%d,ptr[dwCodeLen]=%d,%d,%d\n",dwChannel,dwCodeLen,ptr[dwCodeLen-1],ptr[0],dwNumberLen);
	if ( boolAuthorizationFxs( dwChannel, ptr, dwCodeLen ) == FALSE ) {
		// call is limit
		printf("boolAuthorizationFxs=false\n");
		return eCallLimited;
	}
	////////////

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

	switch( ptr[0] ) {
//#ifdef	SOFT_PBX
	case 8:
		// 软交换选择功能码
		if ( chCode == 11 ) {
//			goIppbxfx.vSetCallType( dwChannel, 1 );
			return eFuncVoip;
		}
		return eCalleeContinue;
//#endif

	case 4:
		if ( m_tGlobalInfo.general.iLocalDept > 999 ) {
			// 两位局号
			if ( mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDtmfCounter < 5 ) {
				return eCalleeContinue;
			}
			mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDialNumber = ptr[0] * 10000 + ptr[1] * 1000 + ptr[2] * 100 + ptr[3]* 10 + ptr[4];
			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] );
			}
			printf("999dwDialNumber=%d\n",mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDialNumber);
			return eCalleeOk;
		} 
		else if ( m_tGlobalInfo.general.iLocalDept > 99 ) {
			// 两位局号
			if ( mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDtmfCounter < 4 ) {
				return eCalleeContinue;
			}
			mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDialNumber = ptr[0] * 1000 + ptr[1] * 100 + ptr[2] * 10 + ptr[3];
			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] );
			}
			printf("999dwDialNumber=%d\n",mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDialNumber);
			return eCalleeOk;
		} 
		else if ( m_tGlobalInfo.general.iLocalDept > 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] );
			}
			printf("99dwDialNumber=%d\n",mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDialNumber);
			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] );
			}
			printf("9dwDialNumber=%d\n",mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDialNumber);
			return eCalleeOk;
		}
		break;
	case 10:		// *
		if ( dwCodeLen < 3 ) {
			return eCalleeContinue;
		}
		// 所有的功能码都是两位
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cForwardCode, 2 ) ) {
			//	呼叫前无条件转移登记功能码
			if ( dwCodeLen < dwNumberLen + 3 ) {
				return eCalleeContinue;
			}

			if( atoi( chCommand + 3 )==m_tModuleInfo.port.dwTelno[dwChannel])
			{
				return eFuncCodeUndefined;
			}

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

			if(ptr[3] * 10 + ptr[4]>45)
			{
				return eFuncCodeUndefined;
			}
			if( atoi( chCommand + 5 )==m_tModuleInfo.port.dwTelno[dwChannel])
			{
				return eFuncCodeUndefined;
			}

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

			if(mtFxxAttrib[dwChannel].dwFollowmeNumberSave == m_tModuleInfo.port.dwTelno[dwChannel])
			{
				mtFxxAttrib[dwChannel].eCurrentFuncCode =eFuncFollowmeDisable;
				return eFuncCodeUndefined;
			}

			mtFxxAttrib[dwChannel].dwFollowmePassword = atoi( chCommand + 3 + dwNumberLen );

			return eFuncCodeOk;
		}
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cCallWaitCode, 2 ) ) {
			// 呼叫等待登记功能码
			if ( dwCodeLen < 3 ) {
				return eCalleeContinue;
			}
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncCallWaitingEnable;
			return eFuncCodeOk;
		}
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cReplaceAnswerCode, 2 ) ) {
			// 代接组登记功能码
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncReplace;
			return eFuncCodeOk;
		}
//yy		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cSelectSoftSwitchCode, 2 ) ) {
//yy			// 软交换选择功能码
//yy			if ( chCode == 11 ) {
//yy				return eFuncVoip;
//yy			}
//yy			return eCalleeContinue;
//yy		}
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cUpdatePasswordCode, 2 ) ) {
			// 修改电话密码功能码
			if ( dwCodeLen < 3 + FXS_PASSWD_LEN * 3 ) {
				return eCalleeContinue;
			}
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncModifyPassword;
			mtFxxAttrib[dwChannel].dwOldPassword = 0;
			for( dwTmp = 0; dwTmp < FXS_PASSWD_LEN; dwTmp ++ ) {
				mtFxxAttrib[dwChannel].dwOldPassword *= 10;
				mtFxxAttrib[dwChannel].dwOldPassword += ptr[3+dwTmp];
			}
			mtFxxAttrib[dwChannel].dwNewPasswordFirst = 0;
			for( dwTmp = 0; dwTmp < FXS_PASSWD_LEN; dwTmp ++ ) {
				mtFxxAttrib[dwChannel].dwNewPasswordFirst *= 10;
				mtFxxAttrib[dwChannel].dwNewPasswordFirst += ptr[3+FXS_PASSWD_LEN+dwTmp];
			}
			mtFxxAttrib[dwChannel].dwNewPasswordSecond = 0;
			for( dwTmp = 0; dwTmp < FXS_PASSWD_LEN; dwTmp ++ ) {
				mtFxxAttrib[dwChannel].dwNewPasswordSecond *= 10;
				mtFxxAttrib[dwChannel].dwNewPasswordSecond += ptr[3+FXS_PASSWD_LEN*2+dwTmp];
			}
			return eFuncCodeOk;
		}
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cSwitchCtgWorkModelCode, 2 ) ) {
			// 切换电脑话务员工作模式, *98PPPP
			if ( dwCodeLen < 7 ) {
				return eCalleeContinue;
			}
			mtFxxAttrib[dwChannel].boolAutoAgentService = TRUE;
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncChangeAgentStatus;
			mtFxxAttrib[dwChannel].dwAgentPassword = ptr[3] * 1000 + ptr[4] * 100 + ptr[5] * 10 + ptr[6];
			return eFuncCodeOk;
		}
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cModifyCtgConfigurationCode, 2 ) ) {
			// 修改手动电脑话务员模式下工作参数
			if ( ptr[7] != 11 ) {
				if ( dwCodeLen < 7 + dwNumberLen ) {
					return eCalleeContinue;
				}
			}
			mtFxxAttrib[dwChannel].boolAutoAgentService = TRUE;
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncChangeAgentArgs;
			mtFxxAttrib[dwChannel].dwAgentPassword = ptr[3] * 1000 + ptr[4] * 100 + ptr[5] * 10 + ptr[6];

			if ( ptr[7] != 11 ) {
				mtFxxAttrib[dwChannel].dwAgentNumber = 0;
				for( dwTmp = 0; dwTmp < dwNumberLen; dwTmp ++ ) {
					mtFxxAttrib[dwChannel].dwAgentNumber *= 10;
					mtFxxAttrib[dwChannel].dwAgentNumber += ptr[ 7 + dwTmp ];
				}
			} else {
				mtFxxAttrib[dwChannel].dwAgentNumber = 0;
			}
			return eFuncCodeOk;
		}
		return eFuncCodeUndefined;
	case 11:		// #
		if ( dwCodeLen < 3 ) {
			return eCalleeContinue;
		}
		// 所有的功能码都是两位
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cForwardCode, 2 ) ) {
			//	呼叫前无条件转移登记功能码
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncForwardDisable;
			return eFuncCodeOk;
		}
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cDelayForwardCode, 2 ) ) {
			// 延时呼叫转移登记功能码
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncDelayForwardDisable;
			return eFuncCodeOk;
		}
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cFollowMeCode, 2 ) ) {
			// 跟我来登记功能码
			// Disable Follow me Command: */#FFNNNN, FF is two func_codes, NNNN is three/four port number
			if ( dwCodeLen < dwNumberLen + 3 ) {
				return eCalleeContinue;
			}
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncFollowmeDisable;
			mtFxxAttrib[dwChannel].dwFollowmeNumberSave = 0;
			for( dwTmp = 0; dwTmp < dwNumberLen; dwTmp ++ ) {
				mtFxxAttrib[dwChannel].dwFollowmeNumberSave *= 10;
				mtFxxAttrib[dwChannel].dwFollowmeNumberSave += ptr[dwTmp+3];
			}
			return eFuncCodeOk;
		}
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cCallWaitCode, 2 ) ) {
			// 呼叫等待登记功能码
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncCallWaitingDisable;
			return eFuncCodeOk;
		}
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cUpdatePasswordCode, 2 ) ) {
			// 修改电话密码功能码
			if ( dwCodeLen < dwNumberLen + 18 ) {
				return eCalleeContinue;
			}
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncModifyPassword;
			mtFxxAttrib[dwChannel].dwOldPassword = 0;
			for( dwTmp = 0; dwTmp < FXS_PASSWD_LEN; dwTmp ++ ) {
				mtFxxAttrib[dwChannel].dwOldPassword *= 10;
				mtFxxAttrib[dwChannel].dwOldPassword += ptr[3+dwTmp];
			}
			mtFxxAttrib[dwChannel].dwNewPasswordFirst = 0;
			for( dwTmp = 0; dwTmp < FXS_PASSWD_LEN; dwTmp ++ ) {
				mtFxxAttrib[dwChannel].dwNewPasswordFirst *= 10;
				mtFxxAttrib[dwChannel].dwNewPasswordFirst += ptr[3+FXS_PASSWD_LEN+dwTmp];
			}
			mtFxxAttrib[dwChannel].dwNewPasswordSecond = 0;
			for( dwTmp = 0; dwTmp < FXS_PASSWD_LEN; dwTmp ++ ) {
				mtFxxAttrib[dwChannel].dwNewPasswordSecond *= 10;
				mtFxxAttrib[dwChannel].dwNewPasswordSecond += ptr[3+FXS_PASSWD_LEN*2+dwTmp];
			}
			return eFuncCodeOk;
		}
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cAcdBusyMarkCode, 2 ) ) {
			if ( dwCodeLen < 3 ) {
				return eCalleeContinue;
			}
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncAcdSetBusyDisable;
			return eFuncCodeOk;
		}
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cSwitchCtgWorkModelCode, 2 ) ) {
			// 切换电脑话务员工作模式
			if ( dwCodeLen < 7 ) {
				return eCalleeContinue;
			}
			mtFxxAttrib[dwChannel].boolAutoAgentService = FALSE;
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncChangeAgentStatus;
			mtFxxAttrib[dwChannel].dwAgentPassword = ptr[3] * 1000 + ptr[4] * 100 + ptr[5] * 10 + ptr[6];
			return eFuncCodeOk;
		}
		if ( !memcmp( chCommand + 1, m_tGlobalInfo.general.cModifyCtgConfigurationCode, 2 ) ) {
			// 修改手动电脑话务员模式下工作参数
			if ( ptr[7] != 11 ) {
				if ( dwCodeLen < 7 + dwNumberLen ) {
					return eCalleeContinue;
				}
			}
			mtFxxAttrib[dwChannel].boolAutoAgentService = FALSE;
			mtFxxAttrib[dwChannel].eCurrentFuncCode = eFuncChangeAgentArgs;
			mtFxxAttrib[dwChannel].dwAgentPassword = ptr[3] * 1000 + ptr[4] * 100 + ptr[5] * 10 + ptr[6];

			if ( ptr[7] != 11 ) {
				mtFxxAttrib[dwChannel].dwAgentNumber = 0;
				for( dwTmp = 0; dwTmp < dwNumberLen; dwTmp ++ ) {
					mtFxxAttrib[dwChannel].dwAgentNumber *= 10;
					mtFxxAttrib[dwChannel].dwAgentNumber += ptr[ 7 + dwTmp ];
				}
			} else {
				mtFxxAttrib[dwChannel].dwAgentNumber = 0;
			}
			return eFuncCodeOk;
		}
		return eFuncCodeUndefined;
	default:
		if ( mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDtmfCounter < dwNumberLen ) {
			return eCalleeContinue;
		}
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDialNumber = 0;
		for( dwTmp = 0; dwTmp < dwNumberLen; dwTmp ++ ) {
			mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDialNumber *= 10;
			mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDialNumber += ptr[dwTmp];
		}
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].boolFxoCall = FALSE;
		return eCalleeOk;
	}

	return eCalleeContinue;
}

void CCallControl::vReportBill( DWORD dwChannel, eBillType eType )
{
	tCC_UA_MSG		tCcUaMsg;
	DWORD			dwIdx, dwTmp;
	time_t			ttCur;
	struct tm		*ttTm;

	memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );

⌨️ 快捷键说明

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