📄 fxoappendix.c
字号:
//
// Copyright (c) Blueinfosys. All rights reserved.
//
// Module Name: Fxogetpasswd.cpp
//
// Abstract:
//
// Author:
// Date: Feb 19, 2004
// Ver:1.00
//
// Modified by:
// Modified Date:
// Notes:
////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <time.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include "commondef.h"
#include "ccuatype.h"
#include "queue.h"
#include "WebSrv.h"
#include "rtp.h"
#include "sipmessage.h"
#include "commtrace.h"
#include "CallControl.h"
void CCallControl::vFxogetpasswd( DWORD dwChannel, eFxxMsgType eMsgType, char *pchMsg )
{
tCC_UA_MSG tCcUaMsg;
int j;
DWORD dwIdx;
ptCC_UA_MSG ptMsgReq;
ptFXEVENTMESSAGE ptEvent;
ptMyTimerMsg ptTimer;
ptFxxAttrib ptAttrib = &mtFxxAttrib[dwChannel];
ptMsgReq = (ptCC_UA_MSG)pchMsg;
ptEvent = (ptFXEVENTMESSAGE)pchMsg;
ptTimer = (ptMyTimerMsg)pchMsg;
switch( eMsgType ) {
case eMsgFromUa:
switch( ptMsgReq->hdr.eMsgType ) {
case eSetup:
COMMFUNC_V( dwChannel, &tCcUaMsg, ptMsgReq );
break;
default:
break;
}
break;
case eMsgFromDriver:
printf("fxoappendix,%d\n",ptEvent->dwEventType);
switch( ptEvent->dwEventType ) {
case eEVENT_BUSY_TONE:
vKillTimer( dwChannel, eT204 );
vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
vChangeCCStatus( dwChannel, eFxo_end );
break;
case eEVENT_DTMF_CODE:
vKillTimer( dwChannel, eT204 );
dwIdx = eFirstcall;
ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord[ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter] = ptEvent->chBuffer[0];
ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter ++;
if ( ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter >= FXS_PASSWD_LEN ) {
// password is ok
// save password first
ptAttrib->dwInputFxsPasswd = 0;
for( j = 0; j < FXS_PASSWD_LEN; j ++ ) {
ptAttrib->dwInputFxsPasswd *= 10;
ptAttrib->dwInputFxsPasswd += ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord[j];
}
// send Getinfo message to UA
dwIdx = eFirstcall;
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
tCcUaMsg.hdr.eMsgType = eGetFxsInfo;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tGetFxsInfo);
tCcUaMsg.hdr.dwChannel = dwChannel;
tCcUaMsg.u.tGetFxsInfo.dwType = 0;
tCcUaMsg.u.tGetFxsInfo.iDestChannel = ptAttrib->dwInputFxsNumber;
tCcUaMsg.u.tGetFxsInfo.dwSrcChannel = m_tModuleInfo.port.dwTelno[dwChannel];
tCcUaMsg.hdr.dwCcIdx = 0;
tCcUaMsg.hdr.dwUaIdx = 0;
vSendMsgToUA( &tCcUaMsg );
vSetTimer( dwChannel, eT115, mdwTimeoutLength[eT115] );
vChangeCCStatus( dwChannel, eFxo_waitinfo );
} else {
// need to receive more dtmf code
vSetTimer( dwChannel, eT204, mdwTimeoutLength[eT204] );
}
break;
default:
break;
}
break;
case eMsgFromTimer:
switch( ptTimer->dwTimerType ) {
case eT204:
ptAttrib->dwPromptCounter ++;
if ( ptAttrib->dwPromptCounter >= MAX_DIAL_RETRY ) {
vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
vChangeCCStatus( dwChannel, eFxo_end );
break;
}
vPlayVoiceFile( dwChannel, eInputPasswd );
ptAttrib->dwPlayMode = 5;
vChangeCCStatus( dwChannel, eFxo_play );
break;
default:
break;
}
break;
default:
break;
}
}
void CCallControl::vFxogetnumber( DWORD dwChannel, eFxxMsgType eMsgType, char *pchMsg )
{
tCC_UA_MSG tCcUaMsg;
int j;
DWORD dwNumberLen;
DWORD dwIdx;
ptCC_UA_MSG ptMsgReq;
ptFXEVENTMESSAGE ptEvent;
ptMyTimerMsg ptTimer;
ptFxxAttrib ptAttrib = &mtFxxAttrib[dwChannel];
ptMsgReq = (ptCC_UA_MSG)pchMsg;
ptEvent = (ptFXEVENTMESSAGE)pchMsg;
ptTimer = (ptMyTimerMsg)pchMsg;
switch( eMsgType ) {
case eMsgFromUa:
switch( ptMsgReq->hdr.eMsgType ) {
case eSetup:
COMMFUNC_V( dwChannel, &tCcUaMsg, ptMsgReq );
break;
default:
break;
}
break;
case eMsgFromDriver:
printf("fxoappendix11,%d\n",ptEvent->dwEventType);
switch( ptEvent->dwEventType ) {
case eEVENT_BUSY_TONE:
vKillTimer( dwChannel, eT204 );
vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
vChangeCCStatus( dwChannel, eFxo_end );
break;
case eEVENT_DTMF_CODE:
vKillTimer( dwChannel, eT204 );
dwIdx = eFirstcall;
ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord[ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter] = ptEvent->chBuffer[0];
ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter ++;
dwNumberLen = m_tGlobalInfo.general.dwFxsTelLength;
if ( ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter >= dwNumberLen ) {
// number is ok
// save number first
ptAttrib->dwInputFxsNumber = 0;
for( j = 0; j < dwNumberLen; j ++ ) {
ptAttrib->dwInputFxsNumber *= 10;
ptAttrib->dwInputFxsNumber += ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord[j];
}
vPlayVoiceFile( dwChannel, eInputPasswd );
ptAttrib->dwPlayMode = 5;
vChangeCCStatus( dwChannel, eFxo_play );
} else {
// need to receive more dtmf code
vSetTimer( dwChannel, eT204, mdwTimeoutLength[eT204] );
}
break;
default:
break;
}
break;
case eMsgFromTimer:
switch( ptTimer->dwTimerType ) {
case eT204:
ptAttrib->dwPromptCounter ++;
if ( ptAttrib->dwPromptCounter >= MAX_DIAL_RETRY ) {
vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
vChangeCCStatus( dwChannel, eFxo_end );
break;
}
vPlayVoiceFile( dwChannel, eInputPortNumber );
ptAttrib->dwPlayMode = 4;
vChangeCCStatus( dwChannel, eFxo_play );
break;
default:
break;
}
break;
default:
break;
}
}
void CCallControl::vFxowaitinfo( DWORD dwChannel, eFxxMsgType eMsgType, char *pchMsg )
{
tCC_UA_MSG tCcUaMsg;
int i;
char chBuffer[MAX_TELNO_LEN*4];
ptCC_UA_MSG ptMsgReq;
ptFXEVENTMESSAGE ptEvent;
ptMyTimerMsg ptTimer;
ptFxxAttrib ptAttrib = &mtFxxAttrib[dwChannel];
ptMsgReq = (ptCC_UA_MSG)pchMsg;
ptEvent = (ptFXEVENTMESSAGE)pchMsg;
ptTimer = (ptMyTimerMsg)pchMsg;
switch( eMsgType ) {
case eMsgFromUa:
switch( ptMsgReq->hdr.eMsgType ) {
case eSetup:
COMMFUNC_V( dwChannel, &tCcUaMsg, ptMsgReq );
break;
case eGetFxsInfoAns:
vKillTimer( dwChannel, eT115 );
if ( ptMsgReq->u.tGetFxsInfo.dwPassword != ptAttrib->dwInputFxsPasswd ) {
// password error
ptAttrib->dwPromptCounter ++;
if ( ptAttrib->dwPromptCounter >= MAX_DIAL_RETRY ) {
vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
vChangeCCStatus( dwChannel, eFxo_end );
break;
}
vPlayVoiceFile( dwChannel, eWelcome );
ptAttrib->dwPlayMode = 1;
vChangeCCStatus( dwChannel, eFxo_play );
break;
}
/*if ( ptMsgReq->u.tGetFxsInfo.dwGrade < OUTLAND_CITY_CALL ) {
// no right
ptAttrib->dwPromptCounter ++;
if ( ptAttrib->dwPromptCounter >= MAX_DIAL_RETRY ) {
vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
vChangeCCStatus( dwChannel, eFxo_end );
break;
}
vPlayVoiceFile( dwChannel, eWelcome );
ptAttrib->dwPlayMode = 1;
vChangeCCStatus( dwChannel, eFxo_play );
break;
}*/
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
tCcUaMsg.hdr.eMsgType = eSetup;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetup );
tCcUaMsg.hdr.dwChannel = dwChannel;
i = eFirstcall;
tCcUaMsg.u.tSetup.dwCallee = ptAttrib->mtCallInfo[i].dwDialNumber;
tCcUaMsg.u.tSetup.dwCaller = m_tModuleInfo.port.dwTelno[dwChannel];
sprintf( chBuffer, "AAA%ldAAA%s", ptAttrib->dwInputFxsNumber,
ptAttrib->mtCallInfo[i].tSetup.cDispName );
chBuffer[MAX_TELNO_LEN * 2 - 1] = 0;
strcpy( tCcUaMsg.u.tSetup.cDispName, chBuffer );
ptAttrib->mtCallInfo[ptAttrib->eActiveCall].tSetup = tCcUaMsg.u.tSetup;
tCcUaMsg.hdr.dwCcIdx = i;
tCcUaMsg.hdr.dwUaIdx = (DWORD)-1;
ptAttrib->mtCallInfo[i].dwUaIdx = (DWORD)-1;
vSendMsgToUA( &tCcUaMsg );
vSetTimer( dwChannel, eT212, mdwTimeoutLength[eT212] );
vChangeCCStatus( dwChannel, eFxo_calling );
break;
default:
break;
}
break;
case eMsgFromDriver:
printf("fxoappendix22,%d\n",ptEvent->dwEventType);
switch( ptEvent->dwEventType ) {
case eEVENT_BUSY_TONE:
vKillTimer( dwChannel, eT115 );
vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
vChangeCCStatus( dwChannel, eFxo_end );
break;
default:
break;
}
break;
case eMsgFromTimer:
switch( ptTimer->dwTimerType ) {
case eT115:
vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
vChangeCCStatus( dwChannel, eFxo_end );
break;
default:
break;
}
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -