// -------------------------------------------------------
void	DispEventInfo ( Acs_Evt_t *pAcsEvt )
{
	char	TmpStr[512] = {0};
	char	TmpS[256] = {0};

	char		  SendTiffFileName[ACS_MAX_FILE_NAME_LEN];
	char		  RecvTiffFileName[ACS_MAX_FILE_NAME_LEN];
	
	char dtmf='?';

	Acs_Dev_List_Head_t * pAcsDevList = NULL;
	Acs_UniFailure_Data * pAcsUniFailure = NULL;
	Acs_GeneralProc_Data *pGeneralData = NULL;
	Acs_CallControl_Data *pCallControl = NULL;
	Acs_IO_Data			 *pIOData = NULL;
	Acs_CAS_ExtraInfo_t  *pCAS_ExtraInfo = NULL;
	Acs_AnalogInterface_Data* pAnalogInterface=NULL;
	Acs_CSPDataReq_Data* pCspReqData=NULL;
	Acs_ParamProc_Data*  pSetParam=NULL;
	Acs_ParamProc_Data*  pGetParam=NULL;
	Acs_MediaProc_Data* pMedia=NULL;
	Acs_ParamData_UserReadXmsBoardInfo* pBoardInfor=NULL;

	sprintf ( TmpStr, "" );
	strcat ( TmpStr, GetString_EventType ( pAcsEvt->m_s32EventType ) );

	Acs_MediaProc_Data * pMediaData = (Acs_MediaProc_Data *)FetchEventData(pAcsEvt);

	switch ( pAcsEvt->m_s32EventType )
	{
	case XMS_EVT_GETPARAM:
		{
			pGetParam = (Acs_ParamProc_Data*)FetchEventData(pAcsEvt);
			pBoardInfor = (Acs_ParamData_UserReadXmsBoardInfo*)((char*)pGetParam+sizeof(Acs_ParamProc_Data));
		}
		break;
	case XMS_EVT_DEV_TIMER:
		{

			char ioFskBuf[512];
			int iFskLen;
			char MsgStr[512];

			memset(ioFskBuf,0,sizeof(ioFskBuf));
			pdlg->GetDlgItemText(IDC_EDIT_CALLINGNUM,MsgStr,sizeof(MsgStr));
			EncodeFskCaller(MsgStr,ioFskBuf,&iFskLen);

		    int r = XMS_ctsSendIOData ( g_acsHandle, &pAcsEvt->m_DeviceID, 
			XMS_IO_TYPE_FSK, (DJ_U16)iFskLen, (DJ_Void *) ioFskBuf );
			if ( r < 0 )
			{
				sprintf ( MsgStr, "X(%d) XMS_ctsSendIOData( %s, %d, [%s] ) FAIL! (%s)", 
					r, "GTG ", g_iLen, TmpStr, 
					GetString_DeviceAll (&pAcsEvt->m_DeviceID)  );
				AddMsg ( MSG_TYPE_FUNCTION, MsgStr );
			}
			else
			{
				sprintf ( MsgStr, "XMS_ctsSendIOData( %s, %d, [%s] ) OK! (%s)", 
					"GTG ", g_iLen, TmpStr,  
					GetString_DeviceAll (&pAcsEvt->m_DeviceID)  );
				AddMsg ( MSG_TYPE_FUNCTION, MsgStr );
			}
		}
		break;
	case XMS_EVT_BUILDINDEX:
		pMedia=(Acs_MediaProc_Data*)FetchEventData(pAcsEvt);
		sprintf(TmpS," EvtState=%d taskID=%d fileIndex=%u,%x",pMedia->m_s32AcsEvtState,pMedia->m_u8TaskID,pMedia->m_u32CurFileIndex,pMedia->m_u32CurFileIndex);
		strcat(TmpStr,TmpS);
		break;
	case XMS_EVT_PLAY:
		pMedia=(Acs_MediaProc_Data*)FetchEventData(pAcsEvt);
		sprintf(TmpS," EvtState=%d Errcode=%d taskID=%d fileIndex=%d",pMedia->m_s32AcsEvtState,pMedia->m_s32AcsEvtErrCode,pMedia->m_u8TaskID,pMedia->m_u32CurFileIndex);
		strcat(TmpStr,TmpS);
		break;
	case XMS_EVT_SETPARAM:
		pSetParam = (Acs_ParamProc_Data*)FetchEventData(pAcsEvt);
		sprintf(TmpS," CmdType=[%d]",pSetParam->m_u16ParamCmdType);
		strcat(TmpStr,TmpS);
		break;
	case XMS_EVT_UNLINKDEVICE:
		pGeneralData = (Acs_GeneralProc_Data*) FetchEventData(pAcsEvt);
		break;
	case XMS_EVT_PLAYCSPREQ:
		//
		pCspReqData = (Acs_CSPDataReq_Data*)FetchEventData(pAcsEvt);
		sprintf(TmpS,"CSPPLAYREQ datalen =%d",pCspReqData->m_u16ReqCspDataLen);
		strcat(TmpStr,TmpS);
		break;

	case XMS_EVT_ANALOG_INTERFACE:
		pAnalogInterface = (Acs_AnalogInterface_Data*)FetchEventData(pAcsEvt);
		sprintf(TmpS,"(%d,%s)",pAnalogInterface->m_u8AnalogInterfaceState,GetString_AnalogInterfaceState(pAcsEvt->m_DeviceID.m_s16DeviceSub,pAnalogInterface->m_u8AnalogInterfaceState));
		strcat(TmpStr,TmpS);
		break;
	case XMS_EVT_SENDIODATA:
		sprintf ( TmpS, " (%s,%s,MachineID:%2d,ModuleID:%3d,Ch:%d)", 
			GetString_DeviceMain(pAcsEvt->m_DeviceID.m_s16DeviceMain),
			GetString_DeviceSub(pAcsEvt->m_DeviceID.m_s16DeviceMain,pAcsEvt->m_DeviceID.m_s16DeviceSub),
			pAcsEvt->m_DeviceID.m_s8MachineID,
			pAcsEvt->m_DeviceID.m_s8ModuleID,
			pAcsEvt->m_DeviceID.m_s16ChannelID );
		/*strcat ( TmpStr, TmpS );
		{
			CmdParamData_AnalogTrunk_t cmdAnalogTrunk;
			void*p =(void*)&cmdAnalogTrunk; ;
			XMS_ctsSetParam(g_acsHandle,&pAcsEvt->m_DeviceID,ANALOGTRUNK_PARAM_UNBINDVOC,sizeof(CmdParamData_AnalogTrunk_t),p);
			////
		}*/
		strcat(TmpStr,TmpS);
		break;
	case XMS_EVT_LINKDEVICE:
	case XMS_EVT_CLEARCALL:
		sprintf ( TmpS, " (%s,%s,MachineID:%2d,ModuleID:%3d,Ch:%d)", 
			GetString_DeviceMain(pAcsEvt->m_DeviceID.m_s16DeviceMain),
			GetString_DeviceSub(pAcsEvt->m_DeviceID.m_s16DeviceMain,pAcsEvt->m_DeviceID.m_s16DeviceSub),
			pAcsEvt->m_DeviceID.m_s8MachineID,
			pAcsEvt->m_DeviceID.m_s8ModuleID,
			pAcsEvt->m_DeviceID.m_s16ChannelID );
		strcat ( TmpStr, TmpS );
		break;
	case XMS_EVT_OPEN_STREAM:
		break;

	case XMS_EVT_QUERY_DEVICE:
		pAcsDevList = (Acs_Dev_List_Head_t *)FetchEventData(pAcsEvt);
		sprintf ( TmpS, " (%s,%2d,%3d)", 
			GetString_DeviceMain(pAcsDevList->m_s32DeviceMain),
			pAcsDevList->m_s32ModuleID,
			pAcsDevList->m_s32DeviceNum );
		strcat ( TmpStr, TmpS );
		break;

	case XMS_EVT_QUERY_ONE_DSP_START:
	case XMS_EVT_QUERY_ONE_DSP_END:
		sprintf ( TmpS, " (%d)", pAcsEvt->m_DeviceID.m_s8ModuleID );
		strcat ( TmpStr, TmpS );
		break;

	case XMS_EVT_OPEN_DEVICE:
		{
			pGeneralData = (Acs_GeneralProc_Data*)FetchEventData(pAcsEvt);
			int isize = sizeof(Acs_GeneralProc_Evt);
			 isize = sizeof(Acs_GeneralProc_Data);
			
			sprintf ( TmpS, "(%s) CallID(%d,%d)",  GetString_DeviceAll(&pAcsEvt->m_DeviceID), 
				pAcsEvt->m_DeviceID.m_CallID.m_s32FlowType, pAcsEvt->m_DeviceID.m_CallID.m_s32FlowChannel );
			strcat ( TmpStr, TmpS );
		}
		break;

	case XMS_EVT_DEVICESTATE:
		pGeneralData = (Acs_GeneralProc_Data *)FetchEventData(pAcsEvt);

		sprintf ( TmpS, "(%s) S=0x%X(%s)", GetString_DeviceAll(&pAcsEvt->m_DeviceID), 
			pGeneralData->m_s32DeviceState, GetString_DeviceState(pGeneralData->m_s32DeviceState) );
		strcat ( TmpStr, TmpS );
		break;

	case XMS_EVT_CALLIN:
		pCallControl = (Acs_CallControl_Data *)FetchEventData(pAcsEvt);

		sprintf ( TmpS, "(%s) (%s,%s)", GetString_DeviceAll(&pAcsEvt->m_DeviceID), 
			 pCallControl->m_s8CallingNum, pCallControl->m_s8CalledNum); 
		strcat ( TmpStr, TmpS );
		break;

	case XMS_EVT_CALLOUT:
		pCallControl = (Acs_CallControl_Data *)FetchEventData(pAcsEvt);

		sprintf ( TmpS, "(%s) EvtState=%d, ErrCode=%d,ClearCause=%d) calling=%s called=%s", GetString_DeviceAll(&pAcsEvt->m_DeviceID), 
			pCallControl->m_s32AcsEvtState, pCallControl->m_s32AcsEvtErrCode, pCallControl->m_s32CallClearCause,pCallControl->m_s8CallingNum,pCallControl->m_s8CalledNum );  
		strcat ( TmpStr, TmpS );
		break;

	case XMS_EVT_RECVIODATA:
		{
		pIOData = (Acs_IO_Data *)FetchEventData(pAcsEvt);


		//strcat ( TmpStr, TmpS );
		//AddMsg ( MSG_TYPE_EVENT, TmpStr );
		

		pdlg->GetDlgItem ( IDC_EDIT_SENDFAX )->GetWindowText ( SendTiffFileName, ACS_MAX_FILE_NAME_LEN-1 );
		pdlg->GetDlgItem ( IDC_EDIT_RECEIVEFAX )->GetWindowText ( RecvTiffFileName, ACS_MAX_FILE_NAME_LEN-1 );
		//sprintf ( s8LocalID, "DJ:83636988" );

		if( pAcsEvt->m_DeviceID.m_s16DeviceMain == XMS_DEVMAIN_VOIP)
		{
			//Fax Process....begin
			switch (pIOData->m_u16IoType)
			{
				case XMS_IO_TYPE_VOIP_H245UII:
					if (pIOData->m_u16IoDataLen == sizeof(Acs_VoIP_H245UII))
					{
						Acs_VoIP_H245UII *h245Uii = (Acs_VoIP_H245UII *)FetchIOData(pAcsEvt);
						dtmf = h245Uii->m_s8Signal;
					}
					sprintf ( TmpS, "(%s) (%s,%d) [%c]", GetString_DeviceAll(&pAcsEvt->m_DeviceID), 
					GetString_IOType(pIOData->m_u16IoType),  pIOData->m_u16IoDataLen, dtmf ); 
					break;
				case XMS_IO_TYPE_VOIP_SIPINFO:
					if (pIOData->m_u16IoDataLen == sizeof(Acs_VoIP_SIPINFO))
					{
						Acs_VoIP_SIPINFO *sipInfo = (Acs_VoIP_SIPINFO *)FetchIOData(pAcsEvt);
						if (strcmp(sipInfo->m_s8ContentType, "application/dtmf") == 0)
							sscanf(sipInfo->m_s8Body, "dtmf=%c", &dtmf);
					}
					sprintf ( TmpS, "(%s) (%s,%d) [%c]", GetString_DeviceAll(&pAcsEvt->m_DeviceID), 
					GetString_IOType(pIOData->m_u16IoType),  pIOData->m_u16IoDataLen, dtmf ); 
					break;
				case XMS_IO_TYPE_VOIP_RTPDTMF:
					if (pIOData->m_u16IoDataLen == sizeof(Acs_VoIP_RTPDTMF))
					{
						Acs_VoIP_RTPDTMF *rtpDtmf = (Acs_VoIP_RTPDTMF *)FetchIOData(pAcsEvt);
						dtmf = rtpDtmf->m_s8EventChar;
					}
					sprintf ( TmpS, "(%s) (%s,%d) [%c]", GetString_DeviceAll(&pAcsEvt->m_DeviceID), 
					GetString_IOType(pIOData->m_u16IoType),  pIOData->m_u16IoDataLen, dtmf ); 
					break;
				case XMS_IO_TYPE_VOIP_T38START:
					if (pIOData->m_u16IoDataLen == sizeof(DJ_S32))
					{
						DJ_S32 *ret = (DJ_S32 *)FetchIOData(pAcsEvt);
						if (*ret == 0)
						{
							

							pdlg->UpdateData();

							if (g_iSendRecv == 0)//SendFax
							{
								//pdlg->m_lstIP.SetItemText(iDevice, 3, _T("Send Fax"));

								XMS_ctsSendFax(g_acsHandle,
									&DevOpened[iOpenedIndex1].DevID,
									&DevOpened[iOpenedIndex2].DevID,
									//&g_deviceVoIP[iDevice].device,
									(DJ_S8 *)(LPCTSTR)SendTiffFileName, "1234", NULL);

								sprintf ( TmpS, "(%s) (%s,%d) T38START SENDFAX", GetString_DeviceAll(&pAcsEvt->m_DeviceID), 
								GetString_IOType(pIOData->m_u16IoType),  pIOData->m_u16IoDataLen  ); 
							}
							else
							{
								//pdlg->m_lstIP.SetItemText(iDevice, 3, _T("Recv Fax"));
								XMS_ctsReceiveFax(g_acsHandle,
									&DevOpened[iOpenedIndex1].DevID,
									&DevOpened[iOpenedIndex2].DevID,
									//&g_deviceVoIP[iDevice].device,
									(DJ_S8 *)(LPCTSTR)RecvTiffFileName, "1234", NULL);

								sprintf ( TmpS, "(%s) (%s,%d) T38START RECVFAX", GetString_DeviceAll(&pAcsEvt->m_DeviceID), 
								GetString_IOType(pIOData->m_u16IoType),  pIOData->m_u16IoDataLen  ); 
							}
						}
					}
			
					
					break;
				//default:
				//	sprintf ( TmpS, "(%s) (%s,%d) INVALID IOTYPE FOR VOIP", GetString_DeviceAll(&pAcsEvt->m_DeviceID), 
				//				GetString_IOType(pIOData->m_u16IoType),  pIOData->m_u16IoDataLen  ); 
				//	break;

				
			}
		//Fax Process....end

		}
		else //NO IP Device
		{
			char *p;
			p = (char *)(pIOData) + sizeof(Acs_IO_Data);
			switch( pIOData->m_u16IoType)
			{
			case XMS_IO_TYPE_DTMF:
				sprintf ( TmpS, "(%s) (%s,%d) [%s]", 
				GetString_DeviceAll(&pAcsEvt->m_DeviceID), 
				GetString_IOType(pIOData->m_u16IoType),  
				pIOData->m_u16IoDataLen, 
				p ); 
				break;
			case XMS_IO_TYPE_GTG:
				sprintf ( TmpS, "(%s) (%s,%d) [%c]", 
				GetString_DeviceAll(&pAcsEvt->m_DeviceID), 
				GetString_IOType(pIOData->m_u16IoType),  
				pIOData->m_u16IoDataLen, 
				*p ); 
				break;
			case XMS_IO_TYPE_FSK:
				sprintf ( TmpS, "(%s) (%s,Len:%d) [%d][%d][%d][%s]", 
				GetString_DeviceAll(&pAcsEvt->m_DeviceID), 
				GetString_IOType(pIOData->m_u16IoType),  
				pIOData->m_u16IoDataLen, 
				p[0],p[1],p[2],p ); 
				break;
			
			case XMS_IO_TYPE_PVD:
				sprintf ( TmpS, "(%s) (%s,%d) [%c]", 
				GetString_DeviceAll(&pAcsEvt->m_DeviceID), 
				GetString_IOType(pIOData->m_u16IoType),  
				pIOData->m_u16IoDataLen, 
				*p ); 
				break;
			default:
				break;
			}
			
		}

		}
		strcat ( TmpStr, TmpS );
		//AddMsg ( MSG_TYPE_EVENT, TmpStr );
		break;

	case XMS_EVT_CAS_MFC_START:
	case XMS_EVT_CAS_MFC_END:
		pCAS_ExtraInfo = (Acs_CAS_ExtraInfo_t *)FetchEventData(pAcsEvt);

		sprintf ( TmpS, "(%s) KA=%d, KD=%d)", GetString_DeviceAll(&pAcsEvt->m_DeviceID), 
			pCAS_ExtraInfo->m_u8KA, pCAS_ExtraInfo->m_u8KD );
		strcat ( TmpStr, TmpS );
		break;


	case XMS_EVT_UNIFAILURE:
		pAcsUniFailure = (Acs_UniFailure_Data *)FetchEventData(pAcsEvt);

		sprintf ( TmpS, ": %s(0x%X)", GetString_ErrorCode(pAcsUniFailure->m_s32AcsEvtErrCode), pAcsUniFailure->m_s32AcsEvtErrCode );
		strcat ( TmpStr, TmpS );

		if ( pAcsEvt->m_DeviceID.m_s16DeviceMain != 0 )
		{
			//Unifailure event that some device link each other
			sprintf ( TmpS, " (%s)", GetString_DeviceAll(&pAcsEvt->m_DeviceID) );
			strcat ( TmpStr, TmpS );
		}
		break;
	default:
		break;

	}

	AddMsg ( MSG_TYPE_EVENT, TmpStr );
}
Beispiel #2
0
void DTrunkWork(INTERFACE_STRUCT* pOneTrunk, Acs_Evt_t* pAcsEvt)
{
	DJ_S8                  pCallerNum[64] = {0};
	DJ_S8                  pCalledNum[64] = {0};
	DJ_S8                  pTempcalledNum[64] = {0};
	char                   TmpDtmf[1] = {0};
	Acs_CallControl_Data   *pCallControl = NULL;
	VOIP_STRUCT            *pOneVOIP = NULL;
	int                    i = -1;
	RetCode_t			   ret;
	
try
{	
	if (pAcsEvt->m_s32EventType == XMS_EVT_CLEARCALL)
	{	
		TRACE("Recv ss7 clearCall evt\n");
		
		long mDspID=pOneTrunk->pVoipDeviceID.m_s8ModuleID;
		long mChannelID=pOneTrunk->pVoipDeviceID.m_s16ChannelID;
		
		pOneVOIP=&M_OneVOIP(pOneTrunk->pVoipDeviceID);
		
		if(pOneTrunk->mExchangeType == SS7_VOIP)
		{
			pOneVOIP=&M_OneVOIP(pOneTrunk->pVoipDeviceID);
			if (pOneVOIP->iLineState != DCS_FREE)			
			{
				pubIpSendClearCallCount++;				
				
				XMS_ctsClearCall(g_acsHandle, &pOneVOIP->deviceID, 0, NULL);
				
				if(pOneVOIP->pVoiceDeviceID.m_s8ModuleID>0 )
					My_DualUnlink(&pOneTrunk->deviceID, &pOneVOIP->pVoiceDeviceID);		
				DrawVOIP_LinkDev (pOneVOIP);

				if (g_logfp != NULL)
				{
					char	mLog[512]={0};
					char	mCurrTime[50]={0};
					getCurrTime(mCurrTime);
					sprintf(mLog,"%s Direct SS7 call in: ss7 receive clearCall so clear voip.Dsp:%d Ch:%d GlobalID:%d CallerNum:%s CalledNum:%s\n\r",
						mCurrTime,
						pOneVOIP->deviceID.m_s8ModuleID,
						pOneVOIP->deviceID.m_s16ChannelID,
						pOneVOIP->iGlobeID,
						pOneVOIP->CallerNum,
						pOneVOIP->CalleeNum);

					fwrite(mLog,strlen(mLog),1,g_logfp);
					fflush(g_logfp);
				}
			}
		}
		
		if(AllDeviceRes[mDspID].pVOIP[mChannelID].mExchangeType == VOIP_SS7 && 
			AllDeviceRes[mDspID].pVOIP[mChannelID].iLineState !=DCS_FREE &&
			AllDeviceRes[mDspID].pVOIP[mChannelID].iLineState !=DCS_CALLIN )
		{
			pOneVOIP=&M_OneVOIP(pOneTrunk->pVoipDeviceID);		
			
			ret = XMS_ctsClearCall(g_acsHandle, &pOneVOIP->deviceID, 0, NULL);	
			if (g_logfp != NULL)
			{
				char	mLog[512]={0};
				char	mCurrTime[50]={0};
				getCurrTime(mCurrTime);
				
				sprintf(mLog,"%s Direct VOIP call in: ss7 receive clearCall so clear voip.Dsp:%d Ch:%d GlobalID:%d CallerNum:%s CalledNum:%s\n\r",
					mCurrTime,
					pOneVOIP->deviceID.m_s8ModuleID,
					pOneVOIP->deviceID.m_s16ChannelID,
					pOneVOIP->iGlobeID,
					pOneVOIP->CallerNum,
					pOneVOIP->CalleeNum);

				fwrite(mLog,strlen(mLog),1,g_logfp);
				fflush(g_logfp);
			}
		}

		ResetTrunk(pOneTrunk,pAcsEvt);
		return;
	}

	//状态处理
	switch(pOneTrunk->DTrkState)
	{
		case TRK_FREE:	
			/*call in from Digit  Signal */
			if (pAcsEvt->m_s32EventType == XMS_EVT_CALLIN)
			{	
				
				pCallControl = (Acs_CallControl_Data *)((DJ_S8 *)pAcsEvt + sizeof(Acs_Evt_t));
				strncpy(pCallerNum, pCallControl->m_s8CallingNum, sizeof(pCallerNum));
				strncpy(pTempcalledNum, pCallControl->m_s8CalledNum, sizeof(pTempcalledNum));
		
				//hao ma gui ze
				memset(pCalledNum, 0, sizeof(pCalledNum));
				if (Rule(pTempcalledNum, pDailRuleHead, pCalledNum) == 0)		
					strcpy(pCalledNum, pTempcalledNum); 
				
				pOneTrunk->mExchangeType = SS7_VOIP;
				
				pOneVOIP=&M_OneVOIP(pOneTrunk->pVoipDeviceID);

				if (g_logfp != NULL)
				{
					char	mLog[512]={0};
					char	mCurrTime[50]={0};
					getCurrTime(mCurrTime);
					
					sprintf(mLog,"%s SS7 RECEVICE CallIn:Dsp:%d Ch:%d GlobalID:%d CallerNum:%s CalledNum:%s\n\r",
						mCurrTime,
						pOneVOIP->deviceID.m_s8ModuleID,
						pOneVOIP->deviceID.m_s16ChannelID,
						pOneVOIP->iGlobeID,
						pCallerNum,
						pCalledNum);
					fwrite(mLog,strlen(mLog),1,g_logfp);
					fflush(g_logfp);
				}
				
				if(pOneVOIP->iLineState==DCS_FREE && pOneVOIP->State == VOIP_FREE)
				{
					pOneVOIP=&M_OneVOIP(pOneTrunk->pVoipDeviceID);
					
					if(PSTNToVOIPCallout(pCallerNum, pCalledNum, &pOneVOIP->deviceID, pOneTrunk) < 0)
					{	
						XMS_ctsClearCall(g_acsHandle, &pOneTrunk->deviceID, 0, NULL);
						TRACE("3 ClearCall SS7\n");
						Change_DTrunkState(pOneTrunk, TRK_HANGUP);

						if (g_logfp != NULL)
						{
							char	mLog[512]={0};
							char	mCurrTime[50]={0};
							getCurrTime(mCurrTime);
							
							sprintf(mLog,"%s First Direct SS7 callin: voip function error,  so  clear ss7 :Dsp:%d Ch:%d GlobalID:%d CallerNum:%s CalledNum:%s\n\r",
								mCurrTime,
								pOneVOIP->deviceID.m_s8ModuleID,
								pOneVOIP->deviceID.m_s16ChannelID,
								pOneVOIP->iGlobeID,
								pOneVOIP->CallerNum,
								pOneVOIP->CalleeNum);
							
							fwrite(mLog,strlen(mLog),1,g_logfp);
							fflush(g_logfp);
						}
						break;
					}	
					DrawVOIP_LinkDev(pOneVOIP);	
					DrawVOIP_CallInfo(pOneVOIP);
					Change_VOIPState(pOneVOIP, VOIP_CALLOUT);

					strncpy(pOneVOIP->CalleeNum,pCalledNum,20);
					strncpy(pOneVOIP->CallerNum,pCallerNum,20);

					strncpy(pOneTrunk->CalleeCode, pCalledNum, 20);
					strncpy(pOneTrunk->CallerCode, pCallerNum, 20);
					DrawDTrunk_CallInfo(pOneTrunk);
					DrawDTrunk_LinkDev(pOneTrunk);			
					Change_DTrunkState(pOneTrunk, TRK_WAIT_ANSERCALL);	
				}
				else
				{
					XMS_ctsSetDevTimer(g_acsHandle,&pOneTrunk->deviceID,400);
					pOneTrunk->TimeOut = 0;
					DrawDTrunk_DTMF(pOneTrunk);
					Change_DTrunkState(pOneTrunk,TRK_WAIT_CALL_VOIP);
				}				
			}
		break;	

		case TRK_WAIT_CALL_VOIP:
		{
			if(pOneTrunk->iLineState == DCS_FREE )
			{
				if (pOneTrunk->mExchangeType == SS7_VOIP)
				{
					pOneVOIP=&M_OneVOIP(pOneTrunk->pVoipDeviceID);
					if (pOneVOIP->iLineState != DCS_FREE)			
					{
						XMS_ctsClearCall(g_acsHandle, &pOneVOIP->deviceID, 0, NULL);
						
						if(pOneVOIP->pVoiceDeviceID.m_s8ModuleID>0 )
							My_DualUnlink(&pOneTrunk->deviceID, &pOneVOIP->pVoiceDeviceID);		
						DrawVOIP_LinkDev (pOneVOIP);
						
						if (g_logfp != NULL)
						{
							char	mLog[512]={0};
							char	mCurrTime[50]={0};
							getCurrTime(mCurrTime);
							
							sprintf(mLog,"%s Direct SS7 call in: wait call IP,then SS7 Linestate is free so clear voip:Dsp:%d Ch:%d GlobalID:%d CallerNum:%s CalledNum:%s\n\r",
								mCurrTime,
								pOneVOIP->deviceID.m_s8ModuleID,
								pOneVOIP->deviceID.m_s16ChannelID,
								pOneVOIP->iGlobeID,
								pOneVOIP->CallerNum,
								pOneVOIP->CalleeNum);
							fwrite(mLog,strlen(mLog),1,g_logfp);
							fflush(g_logfp);
						}
					}
				}	
				ResetTrunk(pOneTrunk,pAcsEvt);
			}
			
			if(pAcsEvt->m_s32EventType == XMS_EVT_DEV_TIMER && pOneTrunk->iLineState != DCS_FREE)
			{
				pOneTrunk->TimeOut++;
				DrawDTrunk_DTMF(pOneTrunk);
				
				if(pOneTrunk->TimeOut >4 )
				{
					pOneTrunk->TimeOut = 0;
					pOneVOIP=&M_OneVOIP(pOneTrunk->pVoipDeviceID);
					XMS_ctsClearCall(g_acsHandle, &pOneTrunk->deviceID, 0, NULL);
					TRACE("4 ClearCall SS7\n");

					if (g_logfp != NULL)
					{
						char	mLog[512]={0};
						char	mCurrTime[50]={0};
						getCurrTime(mCurrTime);
						
						sprintf(mLog,"%s Direct SS7 call in: voip wait time is timeover,so clear ss7 :Dsp:%d Ch:%d GlobalID:%d CallerNum:%s CalledNum:%d\n\r",
							mCurrTime,
							pOneVOIP->deviceID.m_s8ModuleID,
							pOneVOIP->deviceID.m_s16ChannelID,
							pOneVOIP->iGlobeID,
							pOneVOIP->CallerNum,
							pOneVOIP->CalleeNum);

						fwrite(mLog,strlen(mLog),1,g_logfp);
						fflush(g_logfp);
					}
					
					break;
				}
				
				pOneVOIP=&M_OneVOIP(pOneTrunk->pVoipDeviceID);
				
				if(pOneVOIP->iLineState==DCS_FREE && pOneVOIP->State == VOIP_FREE)
				{
					if(PSTNToVOIPCallout(pCallerNum, pCalledNum, &pOneVOIP->deviceID, pOneTrunk) < 0)
					{	
						XMS_ctsClearCall(g_acsHandle, &pOneTrunk->deviceID, 0, NULL);
						TRACE("5 ClearCall SS7\n");;
						Change_DTrunkState(pOneTrunk, TRK_HANGUP);

						if (g_logfp != NULL)
						{
							char	mLog[512]={0};
							char	mCurrTime[50]={0};
							getCurrTime(mCurrTime);
							
							sprintf(mLog,"%s Second Direct SS7 call in: Voip call function error, so  clear ss7:Dsp:%d Ch:%d GlobalID:%d CallerNum:%s CalledNum:%s\n\r",
								mCurrTime,
								pOneVOIP->deviceID.m_s8ModuleID,
								pOneVOIP->deviceID.m_s16ChannelID,
								pOneVOIP->iGlobeID,
								pOneVOIP->CallerNum,
								pOneVOIP->CalleeNum);
							
							fwrite(mLog,strlen(mLog),1,g_logfp);
							fflush(g_logfp);
						}
					
						break;
					}				
					
					DrawVOIP_LinkDev(pOneVOIP);	
					DrawVOIP_CallInfo(pOneVOIP);
					Change_VOIPState(pOneVOIP, VOIP_CALLOUT);
					
					strncpy(pOneTrunk->CalleeCode, pCalledNum, 20);
					strncpy(pOneTrunk->CallerCode, pCallerNum, 20);
					DrawDTrunk_CallInfo(pOneTrunk);
					DrawDTrunk_LinkDev(pOneTrunk);			
					Change_DTrunkState(pOneTrunk, TRK_WAIT_ANSERCALL);	
				}
				else
				{
					XMS_ctsSetDevTimer(g_acsHandle,&pOneTrunk->deviceID,400);
					Change_DTrunkState(pOneTrunk,TRK_WAIT_CALL_VOIP);
				}
			}
		}
		break;
	
		case TRK_WAIT_ANSERCALL:		
			if(pOneTrunk->iLineState == DCS_FREE)
			{
				if (pOneTrunk->mExchangeType == SS7_VOIP)
				{
					pOneVOIP=&M_OneVOIP(pOneTrunk->pVoipDeviceID);
					if (pOneVOIP->iLineState != DCS_FREE)			
					{
						XMS_ctsClearCall(g_acsHandle, &pOneVOIP->deviceID, 0, NULL);
						
						if(pOneVOIP->pVoiceDeviceID.m_s8ModuleID>0 )
							My_DualUnlink(&pOneTrunk->deviceID, &pOneVOIP->pVoiceDeviceID);		
						DrawVOIP_LinkDev (pOneVOIP);
						
						if (g_logfp != NULL)
						{
							char	mLog[512]={0};
							char	mCurrTime[50]={0};
							getCurrTime(mCurrTime);
							
							sprintf(mLog,"%s SS7 wait  ansercall but SS7 Linestate is free so clear VOIP: Dsp:%d Ch:%d GlobalID:%d CallerNum:%s CalledNum:%s\n\r",
								mCurrTime,
								pOneVOIP->deviceID.m_s8ModuleID,
								pOneVOIP->deviceID.m_s16ChannelID,
								pOneVOIP->iGlobeID,
								pOneVOIP->CallerNum,
								pOneVOIP->CalleeNum);

							fwrite(mLog,strlen(mLog),1,g_logfp);
							fflush(g_logfp);
						}					
					}
				}
				ResetTrunk(pOneTrunk,pAcsEvt);
			}
			if(pAcsEvt->m_s32EventType == XMS_EVT_ANSWERCALL)
			{		

				Change_DTrunkState(pOneTrunk, TRK_CONNECT);
			}
			break;
	
		case TRK_CALLOUT:
			if ( pAcsEvt->m_s32EventType == XMS_EVT_CALLOUT )	
			{	
				INTERFACE_STRUCT *pOneInterface = NULL;			
				
				pOneVOIP = &M_OneVOIP(pOneTrunk->pVoipDeviceID);
				pCallControl = (Acs_CallControl_Data *)((DJ_S8 *)pAcsEvt + sizeof(Acs_Evt_t));
				if ( pCallControl->m_s32AcsEvtState == 1 )	// 呼出成功,对方摘机
				{	
				//	pOneTrunk->bcallFailFalg = false;

					if (g_logfp != NULL)
					{
						char	mLog[512]={0};
						char	mCurrTime[50]={0};
						getCurrTime(mCurrTime);
						
						sprintf(mLog,"%s SS7 CallOut Success:Dsp:%d Ch:%d GlobalID:%d CallerNum:%s CalledNum:%s\n\r",
							mCurrTime,
							pOneVOIP->deviceID.m_s8ModuleID,
							pOneVOIP->deviceID.m_s16ChannelID,
							pOneVOIP->iGlobeID,
							pOneVOIP->CallerNum,
							pOneVOIP->CalleeNum);
						
						fwrite(mLog,strlen(mLog),1,g_logfp);
						fflush(g_logfp);
					}				

					pubIpSS7ConnectCount++;					
					
					Change_DTrunkState(pOneTrunk, TRK_CONNECT);
					Change_VOIPState(pOneVOIP, VOIP_WAIT_ANSWERCALL);					
					XMS_ctsAnswerCallIn(g_acsHandle, &pOneVOIP->deviceID, NULL);		
				}
				else		// 呼出失败
				{				
					pOneTrunk->bcallFailFalg = true;
					DrawDTrunk_Reason(pOneTrunk, pCallControl->m_s32AcsEvtErrCode, pCallControl->m_s32CallClearCause);
					Change_DTrunkState(pOneTrunk, TRK_FREE);	
					pubIpSS7ErrorCount++;
					pubErrorClearCallCount++;				

					//带原因值的拆线--ADD by WWK
					int		mCallErrorCode = 0;
					if(pCallControl->m_s32AcsEvtErrCode == 17 ) mCallErrorCode = 486;		//被叫忙
					if(pCallControl->m_s32AcsEvtErrCode == 28 ) mCallErrorCode = 404;		//号码不存在
					if(pCallControl->m_s32AcsEvtErrCode == 19 ) mCallErrorCode = 408;		//被叫关机或者无应答

					XMS_ctsClearCall(g_acsHandle, &pOneVOIP->deviceID, mCallErrorCode, NULL);
					Change_VOIPState(pOneVOIP, VOIP_HANGUP);

					if (g_logfp != NULL)
					{
						char	mTemp[512]={0};
						char	mCurrTime[50]={0};
						getCurrTime(mCurrTime);
						
						sprintf(mTemp,"%s SS7 call out failed, so clear voip!! DSP:%d Ch:%d ErrorCode:%d Reason:%d, bcallFailFalg:%d\n\r",
							mCurrTime,
							pOneTrunk->deviceID.m_s8ModuleID,
							pOneTrunk->deviceID.m_s16ChannelID,
							pCallControl->m_s32AcsEvtErrCode,
							pCallControl->m_s32CallClearCause,
							pOneTrunk->bcallFailFalg);

						fwrite(mTemp,strlen(mTemp),1,g_logfp);
						fflush(g_logfp);
					}									
				}
			}
			break;

		case TRK_CONNECT:
			if(pOneTrunk->iLineState == DCS_FREE )
			{
				if (pOneTrunk->mExchangeType == SS7_VOIP)
				{
					pOneVOIP=&M_OneVOIP(pOneTrunk->pVoipDeviceID);
					if (pOneVOIP->iLineState != DCS_FREE)			
					{
						XMS_ctsClearCall(g_acsHandle, &pOneVOIP->deviceID, 0, NULL);
						
						if(pOneVOIP->pVoiceDeviceID.m_s8ModuleID>0 )
							My_DualUnlink(&pOneTrunk->deviceID, &pOneVOIP->pVoiceDeviceID);		
						DrawVOIP_LinkDev (pOneVOIP);

						if (g_logfp != NULL)
						{
							char	mLog[512]={0};
							char	mCurrTime[50]={0};
							getCurrTime(mCurrTime);
							
							sprintf(mLog,"%s SS7 Connected and Line State Is Free So Clear VOIP CALL :Dsp:%d Ch:%d GlobalID:%d CallerNum:%s CalledNum:%s\n\r",
								mCurrTime,
								pOneVOIP->deviceID.m_s8ModuleID,
								pOneVOIP->deviceID.m_s16ChannelID,
								pOneVOIP->iGlobeID,
								pOneVOIP->CallerNum,
								pOneVOIP->CalleeNum);

							fwrite(mLog,strlen(mLog),1,g_logfp);
							fflush(g_logfp);
						}	
					}
				}	
				
				ResetTrunk(pOneTrunk, pAcsEvt);
				return;
			}
		
			TmpDtmf[0] = My_GetIntfDtmfCode(pAcsEvt);
			if ( TmpDtmf[0] != -1 )								//DTMF按键
			{				
				My_AddIntfDtmfBuf(pOneTrunk, TmpDtmf[0]);
				DrawDTrunk_DTMF(pOneTrunk);					
				
				if(pOneTrunk->DtmfCount > 0 )
				{					
					DeviceID_t	*pOneVOIP = &AllDeviceRes[pOneTrunk->deviceID.m_s8ModuleID].pInterf[pOneTrunk->deviceID.m_s16ChannelID].pVoipDeviceID;
					switch(pubSendRTPDTMFType)
					{
					case 1:
						{
							Acs_VoIP_H245UII h245Uii = {0};
							h245Uii.m_s8Signal = pOneTrunk->DtmfBuf[0]; // dtmf char in "0123456789#*ABCD!"
							h245Uii.m_u32Duration = 200; // milliseconds
							XMS_ctsSendIOData(g_acsHandle,pOneVOIP,XMS_IO_TYPE_VOIP_H245UII,sizeof(h245Uii),&h245Uii);
						}
						break;
					case 2:
						{
							Acs_VoIP_SIPINFO sipInfo = {0};
							strcpy(sipInfo.m_s8ContentType, "application/dtmf");
							sprintf(sipInfo.m_s8Body, "dtmf=%c\nduration=%d", pOneTrunk->DtmfBuf[0], 200);
							XMS_ctsSendIOData(g_acsHandle,pOneVOIP,XMS_IO_TYPE_VOIP_SIPINFO,sizeof(sipInfo),&sipInfo);
						}
						break;
					case 3:
						{
							Acs_VoIP_RTPDTMF rtpDtmf = {0};
							rtpDtmf.m_s8EventChar	= pOneTrunk->DtmfBuf[0];	// rtp dtmf event char
							rtpDtmf.m_s8Volume		= -32;				// volume (in dbm0 from -63 to 0)
							rtpDtmf.m_u16Duration	= 200;				// duration (in timestamp units
							XMS_ctsSendIOData(g_acsHandle,pOneVOIP,XMS_IO_TYPE_VOIP_RTPDTMF,sizeof(rtpDtmf),&rtpDtmf);
						}
						break;
					default:
						{
							Acs_VoIP_H245UII h245Uii = {0};
							h245Uii.m_s8Signal = pOneTrunk->DtmfBuf[0]; // dtmf char in "0123456789#*ABCD!"
							h245Uii.m_u32Duration = 200; // milliseconds
							XMS_ctsSendIOData(g_acsHandle,pOneVOIP,XMS_IO_TYPE_VOIP_H245UII,sizeof(h245Uii),&h245Uii);
						}
						break;
					}
					My_InitIntfDtmfBuf(pOneTrunk);					
				}
			}
		break;
		}
}catch(...)
{
	if (g_logfp != NULL)
	{
		char	mTemp[255]={0};
		char	mCurrTime[50]={0};
		getCurrTime(mCurrTime);
		
		sprintf(mTemp,"%s DT Trunk Run Error\n\r",mCurrTime);
		fwrite(mTemp,strlen(mTemp),1,g_logfp);
		fflush(g_logfp);
	}
}
	return;
}
Beispiel #3
0
//////////////////////////////////////////////////////////////////////////
// XMS_EVT_RECVIODATA event handler (H.245 UserInputIndication/SIP INFO/RFC 2833 DTMF)
void OnRecvIOData(Acs_Evt_t *pAcsEvt)
{
	Acs_IO_Data *pIOEvt = (Acs_IO_Data *)FetchEventData(pAcsEvt);

	TRACE(_T("Device[%02d][%02d][%02d] receive IO Data\n"),
		pAcsEvt->m_DeviceID.m_s8ModuleID,
		pAcsEvt->m_DeviceID.m_s16DeviceMain,
		pAcsEvt->m_DeviceID.m_s16ChannelID);

	int iDevice = pAcsEvt->m_DeviceID.m_s16ChannelID;

	int iDtmfLen = strlen(g_deviceVoIP[iDevice].szDtmf);
	if (iDtmfLen >= sizeof(g_deviceVoIP[iDevice].szDtmf)-1)
	{
		memset(g_deviceVoIP[iDevice].szDtmf, 0, sizeof(g_deviceVoIP[iDevice].szDtmf));
		iDtmfLen = 0;
	}

	char dtmf = '?';

	switch (pIOEvt->m_u16IoType)
	{
	case XMS_IO_TYPE_VOIP_REGREQUEST:
		if (pIOEvt->m_u16IoDataLen == sizeof(Acs_VoIP_REGSTATE))
		{
			// check client's info
			Acs_VoIP_REGSTATE *pRegRequest = (Acs_VoIP_REGSTATE *)FetchIOData(pAcsEvt);
			TRACE(_T("Client registrates from: \"%s\" %s@%s:%d\n"),
				pRegRequest->m_s8UserID, pRegRequest->m_s8TelNo, pRegRequest->m_s8Address, pRegRequest->m_u16Port);

			// response to registration
			// if authentication is disabled,
			//   set Acs_VoIP_REGRESP::m_u8Granted to 0/1 to grant/disgrant registration
			// if authentication is enabled,
			//   set Acs_VoIP_REGRESP::m_u8Granted to 0, and fill Acs_VoIP_REGRESP::m_s8Password to authenticate,
			//   or
			//   set Acs_VoIP_REGRESP::m_u8Granted to 0, and leave Acs_VoIP_REGRESP::m_s8Password empty to disgrant registration,
			//   or
			//   set Acs_VoIP_REGRESP::m_u8Granted to 1 to grant registration without authenticating.
			Acs_VoIP_REGRESP regResponse = {0};
			regResponse.m_u16SlotID = pRegRequest->m_u16SlotID;
			regResponse.m_u8Granted = 1;
//			strcpy(regResponse.m_s8Password, "passwd");
			XMS_ctsSendIOData(g_acsHandle, &g_deviceVoIP[iDevice].device, XMS_IO_TYPE_VOIP_REGRESPONSE,
				sizeof(regResponse), &regResponse);
		}
		break;
	case XMS_IO_TYPE_VOIP_REGSTATE:
		if (pIOEvt->m_u16IoDataLen == sizeof(Acs_VoIP_REGSTATE))
		{
			Acs_VoIP_REGSTATE *pRegState = (Acs_VoIP_REGSTATE *)FetchIOData(pAcsEvt);
			TRACE(_T("Client %s on slot(%d): %s@%s:%d\n"),
				pRegState->m_u8State?_T("registered"):_T("unregistered"),
				pRegState->m_u16SlotID,
				pRegState->m_s8TelNo, pRegState->m_s8Address, pRegState->m_u16Port);
		}
		break;
	case XMS_IO_TYPE_VOIP_H245UII:
		if (pIOEvt->m_u16IoDataLen == sizeof(Acs_VoIP_H245UII))
		{
			Acs_VoIP_H245UII *h245Uii = (Acs_VoIP_H245UII *)FetchIOData(pAcsEvt);
			dtmf = h245Uii->m_s8Signal;
			g_deviceVoIP[iDevice].szDtmf[iDtmfLen] = dtmf;
		}
		break;
	case XMS_IO_TYPE_VOIP_SIPINFO:
		if (pIOEvt->m_u16IoDataLen == sizeof(Acs_VoIP_SIPINFO))
		{
			Acs_VoIP_SIPINFO *sipInfo = (Acs_VoIP_SIPINFO *)FetchIOData(pAcsEvt);
			if (strcmp(sipInfo->m_s8ContentType, "application/dtmf") == 0)
				sscanf(sipInfo->m_s8Body, "dtmf=%c", &dtmf);
			g_deviceVoIP[iDevice].szDtmf[iDtmfLen] = dtmf;
		}
		break;
	case XMS_IO_TYPE_VOIP_RTPDTMF:
		if (pIOEvt->m_u16IoDataLen == sizeof(Acs_VoIP_RTPDTMF))
		{
			Acs_VoIP_RTPDTMF *rtpDtmf = (Acs_VoIP_RTPDTMF *)FetchIOData(pAcsEvt);
			dtmf = rtpDtmf->m_s8EventChar;
			g_deviceVoIP[iDevice].szDtmf[iDtmfLen] = dtmf;
		}
		break;
	case XMS_IO_TYPE_VOIP_RTPTONE:
		if (pIOEvt->m_u16IoDataLen == sizeof(Acs_VoIP_RTPTONE))
		{
			Acs_VoIP_RTPTONE *rtpTone = (Acs_VoIP_RTPTONE *)FetchIOData(pAcsEvt);
		}
		break;
	case XMS_IO_TYPE_VOIP_REFER_NOTIFY:
		if (pIOEvt->m_u16IoDataLen == sizeof(Acs_VoIP_ReferResult))
		{
			Acs_VoIP_ReferResult *pTransferResult = (Acs_VoIP_ReferResult *)FetchIOData(pAcsEvt);
			TRACE("XMS_IO_TYPE_VOIP_REFER_NOTIFY state:%d reason:%d\n", pTransferResult->m_u8State, pTransferResult->m_u8Reason);
			if(pTransferResult->m_u8State==17)
			{
				if(pTransferResult->m_u8Reason==23 || pTransferResult->m_u8Reason==24)
				{
					RetCode_t ret = XMS_ctsClearCall(g_acsHandle, &g_deviceVoIP[iDevice].device, 0, NULL);
				}
				else
				{
					VoIPCallModifyPrivate_t callModify = {0};
					callModify.m_PrivateData.m_u32DataSize = sizeof(VoIPCallModifyPrivate_t);
					callModify.m_u8MediaCapNum = 0;
					// set media mode to send/recv
					callModify.u8MediaMode = 0;
					
					RetCode_t ret = XMS_ctsSendIOData(g_acsHandle, &g_deviceVoIP[iDevice].device, XMS_IO_TYPE_VOIP_CALLMODIFY, sizeof(VoIPCallModifyPrivate_t), (void*)&callModify);
				}
			}
		}
		break;
	}

	if (pIOEvt->m_u16IoType != XMS_IO_TYPE_VOIP_REGREQUEST &&
		pIOEvt->m_u16IoType != XMS_IO_TYPE_VOIP_REGSTATE)
		g_pDlg->refreshListIP(iDevice);
}