📄 pansr.cpp
字号:
/******************************************************************************
* Multi-line Asynchronous Answering Phone Program *
******************************************************************************
* *
* PPPPP AA N N SSSS RRRRR CCCC PPPPP PPPPP *
* P P A A NN N S R R C C P P P P *
* P P A A N N N SSSS R R C P P P P *
* PPPPP AAAAAA N N N S RRRRR ... C PPPPP PPPPP *
* P A A N NN S S R R ... C C P P *
* P A A N N SSSS R R ... CCCC P P *
* *
******************************************************************************
* Copyright (c) 1999 by Szmsd Corp. All Rights Reserved *
******************************************************************************/
/**
** System Header Files
**/
#include <stdio.h>
#include <time.h>
#include <afx.h>
#include <signal.h>
#include <fcntl.h>
#include <string.h>
#include <process.h>
#include <windows.h>
#include <share.h>
#include <io.h>
#include "stdafx.h"
#include "iostream.h"
/**
** Dialogic Header Files
**/
#include <srllib.h>
#include <dxxxlib.h>
#include <dtilib.h>
#include <faxlib.h>
#include <msilib.h>
#include <sctools.h>
#include <gcisdn.h>
/**
** Application Header Files
**/
#include "Display.h"
#include "Answer.h"
#include "Pansrmtc.h"
#include "tts_cn.h"
#include "tts_en.h"
#include "Pansr.h"
#include "VSinterpreter.h"
#include "ServiceDataQueue.h"
//add at 2002-12-05
#include "export.h"
int ProcessCCSMessage( HWND hWnd );
//add end
extern CServiceDataQueue m_requestQueue_Voice;
extern CServiceDataQueue m_replyQueue;
CFile logfd;
//CFile dnisLog(".\\dnis.log", CFile::modeCreate | CFile::modeWrite |CFile::modeNoTruncate |CFile::shareDenyNone);//临时记录被叫号
void writelogdata( int channum );
void Viewevent(int channum, int event);
void Getpara(char *Condition, int& maxdigs, int& maskdig, int& maxwait );
int AnswerRequest(void);
int WriteReplyQueue( int channum, int event );
int WriteReplyQueue1( int channum, int event, int Param1=-1, char *Param2=NULL, char *Param3=NULL );
int Getlist( int channum );
int Eralist( int channum );
int Putlist( int channum, VOCNODE *node );
//Build busy tone for disconnect dection
void BuildTone( int channum );
//These functions are for i-phone
BOOL IsInfotone(int channum);
int InitDTMF( void );
int PlayDTMF( int channum, char dtmf );
int PlayInfoTone(int channum);
//XYW add At 2001/6/17
extern int WINAPI ReadyData(void* pInBuf, int nInBufSize, void** pOutBuf, int& nOutBufSize, char* szType, char* szFlag);
extern void WINAPI MyFreeMem(void* pMemBuf);
char *PreTreatData( char *rawdata );
int CreateFskData( char *ViewCtr, char *FuncCtr, char **ppbuf, int *len );
int SendFskData (int hDevChnl, BOOL bADSI, char *buffp, int bufsize);
//XYW add end
int LenPerDtmfTone = 560;
char *pDtmfToneBuff = NULL;
int InitDtmfTone( void );
int GeneDtmfTone( char *infotone, char **tone_buf );
int PlayDtmfTone(int channum);
BOOL FaxInit ( int channum );
BOOL FaxSend ( int channum );
BOOL FaxRecv ( int channum );
BOOL FaxClose( int channum );
int RecordFile( int channum, int maxtime );
int MakeCall( int channum );
int FindChannel( int eventDev, int SRLevent );
int ShowError(char *function);
int NumChansOnBoard( char *szBoardName );
int GetMaxDtidev( void );
int GetMaxVocdev( void );
int OpenVocDev( int maxchans );
int OpenDtiDev( int maxchans );
int OpenIsdnDev( int maxchans );
int OpenGloalDev( int beginChan, int endChan, char *szProtocol, int mode = 1, int chansPerBoard = 30 );
int RouteForVox( int channum );
int vProcessCallEvents( int channum, int SRLevent );
int vProcessVoxEvents( int channum, int SRLevent );
extern char *Ltrim(char *text);
extern char *Rtrim(char *text);
//Add at 2001/11/06 by XYW
void MsiInit(void);
int Transfer2MSI( int channum );
int Transfer2PUB( int channum );
int MSIBegin( int channum );
int MSIStop( int channum );
//Add end
//Add at 2002/3/25
int FindOutChannel( void );
int RouteForTalk( int channum );
int RouteBackFromTalk( int channum );
//Add end
//XYW add at 2002/4/17
char *vs_GetANI( int channum );
char *vs_GetDNIS( int channum );
//XYW add end
void ShowTERMMSK( int chdev )
{
char TermMsg[200];
strcpy( TermMsg, "" );
if ( ATDX_TERMMSK( chdev ) & TM_NORMTERM ) strcat( TermMsg, " | TM_NORMTERM " );
if ( ATDX_TERMMSK( chdev ) & TM_MAXDTMF ) strcat( TermMsg, " | TM_MAXDTMF " );
if ( ATDX_TERMMSK( chdev ) & TM_MAXSIL ) strcat( TermMsg, " | TM_MAXSIL " );
if ( ATDX_TERMMSK( chdev ) & TM_MAXNOSIL ) strcat( TermMsg, " | TM_MAXNOSIL " );
if ( ATDX_TERMMSK( chdev ) & TM_LCOFF ) strcat( TermMsg, " | TM_LCOFF " );
if ( ATDX_TERMMSK( chdev ) & TM_IDDTIME ) strcat( TermMsg, " | TM_IDDTIME " );
if ( ATDX_TERMMSK( chdev ) & TM_MAXTIME ) strcat( TermMsg, " | TM_MAXTIME " );
if ( ATDX_TERMMSK( chdev ) & TM_DIGIT ) strcat( TermMsg, " | TM_DIGIT " );
if ( ATDX_TERMMSK( chdev ) & TM_PATTERN ) strcat( TermMsg, " | TM_PATTERN " );
if ( ATDX_TERMMSK( chdev ) & TM_USRSTOP ) strcat( TermMsg, " | TM_USRSTOP " );
if ( ATDX_TERMMSK( chdev ) & TM_EOD ) strcat( TermMsg, " | TM_EOD " );
if ( ATDX_TERMMSK( chdev ) & TM_TONE ) strcat( TermMsg, " | TM_TONE " );
if ( ATDX_TERMMSK( chdev ) & TM_ERROR ) strcat( TermMsg, " | TM_ERROR " );
wprintf ( "TERM BY: %s \n", TermMsg );
}
int Delete_0(char *pBufIn)
{
char *pDest1;
int m_NumCount;
if(pBufIn==NULL)
{
return -1;
}
pDest1=strstr(pBufIn,".");
if(pDest1==NULL)
{
return 0;
}
else
{
m_NumCount=strlen(pBufIn)-1;
while(pBufIn[m_NumCount]=='0')
{
pBufIn[m_NumCount]=0x0;
m_NumCount--;
}
if(pBufIn[m_NumCount]=='.')
{
pBufIn[m_NumCount]=0x0;
}
return 1;
}
}
char *BuildName(int channum, char *path, char *name )
{
int plen = strlen( path );
if ( strstr(name,".vox")==NULL && strstr(name,".VOX")==NULL )
strcat(name,".VOX");
strcpy( dxinfo[ channum ].msg_name, path );
if( path[ plen-1 ]!='\\' )
strcat( dxinfo[ channum ].msg_name, "\\" );
strcat( dxinfo[ channum ].msg_name, name );
return dxinfo[ channum ].msg_name;
}
int CreatePath( int channum, char *path )
{
char TempStr[128] = "";
int plen = strlen( path );
if( path[ plen-1 ]!='\\' ) strcat( path, "\\" );
sprintf( TempStr, "%s%04d", path, channum );
RemoveDirectory( TempStr );
return ( CreateDirectory( TempStr, NULL ) );
}
char *BuildName1( int channum, char *path, char *name )
{
char TempStr[128] = "";
int plen = strlen( path );
if( path[ plen-1 ]!='\\' ) strcat( path, "\\" );
sprintf( TempStr, "%s%04d\\", path, channum );
if ( strstr(name,".vox")==NULL && strstr(name,".VOX")==NULL )
strcat(name,".VOX");
strcpy( dxinfo[ channum ].msg_name, TempStr );
strcat( dxinfo[ channum ].msg_name, name );
DeleteFile( dxinfo[ channum ].msg_name );
return dxinfo[ channum ].msg_name;
}
void ShowAccesscode( int channum, int secrecy )
{
char accessCode[31]="******";
if( !secrecy )
strcpy( accessCode, dxinfo[channum].ac_code);
SendMessage(hWnd, WM_DLGC_CODE, channum, (LPARAM)accessCode);
}
void GetParams( char *Condition, int& bgnCh, int& endCh , char *protocol )
{
char szOut[400]="";
int iFlag=0, iLen=0;
//Get bgnCh
iFlag = CVSInterpreter::AbstractData( Condition, 1, szOut, ',' );
if( iFlag==0 )
bgnCh = atoi( szOut );
else
bgnCh = 1;
//Get endCh
iFlag = CVSInterpreter::AbstractData( Condition, 2, szOut, ',' );
if( iFlag==0 )
endCh = atoi( szOut );
else
endCh = -1;
//Get protocol
iFlag = CVSInterpreter::AbstractData( Condition, 3, szOut, ',' );
if( iFlag==0 )
strcpy( protocol, szOut ) ;
else
strcpy( protocol, "isdn" );
}
/********************************************************************
* 系统结束时,关闭各通道及文件
********************************************************************/
void Cleanup(void)
{
int channum;
long hEvent;
// Close all the channels opened after stopping all I/O activity.
for ( channum = 1; channum <= maxchans; channum++ )
{
// close down individual file
if (dxinfo[channum].chdev > 0) // device had been established
{
dx_stopch(dxinfo[channum].chdev, EV_SYNC); // stop channel I/0
if (scbus) dx_unlisten(dxinfo[channum].chdev); // get off SCBUS (if on)
if (frontend == CT_NTANALOG)
{
set_hkstate(channum, DX_ONHOOK); // checks its args
// Analog frontend, we just went onhook, so wait for
// the event
sr_waitevtEx( (long *) &dxinfo[channum].chdev, 1, 2000, &hEvent);
dx_close( dxinfo[ channum ].chdev );
}
else // Digital Frontend
{
if (scbus) dt_unlisten(dxinfo[channum].tsdev); // get off SCBUS (if on)
gc_Close( dxinfo[channum].g_dev );
if( stricmp( dxinfo[channum].protocol , "isdn") == 0 )
{
dx_close( dxinfo[ channum ].chdev );
}
}
} // end of if (dxinfo[channum].chdev) ...
if (dxinfo[channum].msg_fd > 0)
{
dx_fileclose(dxinfo[channum].msg_fd);
dxinfo[ channum ].msg_fd = 0;
}
} // end of for loop
for(channum = 1;channum <= faxchans; channum++)
{
fx_close(fxinfo[channum].fxdev) ;
}
for(channum = 1;channum <= msichans; channum++)
{
ms_close(msinfo[channum].msdev) ;
}
if (frontend != CT_NTANALOG)
{
if (gc_Stop() != GC_SUCCESS)
{
ShowError("gc_Stop()");
}
}
// clear dxinfo ADT, in case we want to use again
memset(dxinfo, 0, (sizeof( DX_INFO ) * (MAXCHANS+1)));
}
/***************************************************************************
* NAME: void sysinit()
* DESCRIPTION: Start D/4x System, Enable CST events, put line ON-Hook
* and open VOX files.
* INPUT: None.
* OUTPUT: None.
* RETURNS: None.
* CAUTIONS: None.
***************************************************************************/
void sysinit()
{
int channum;
char d4xname[ 32 ];
int bgnCh, endCh, chansPerBoard;
char paramstr[60], protocol[ 12 ];
int rc = 0;
CT_DEVINFO ct_devinfo;
//InitDTMF();
InitDtmfTone();
if ( maxchans > MAXCHANS )
{
wprintf( "Only %d Channels will be used\n", MAXCHANS );
maxchans = MAXCHANS;
}
memset( dxinfo, 0, (sizeof( DX_INFO ) * (MAXCHANS+1)) );
memset( fxinfo, 0, (sizeof( FX_INFO ) * (FAXCHANS+1)) );
memset( msinfo, 0, (sizeof( MS_INFO ) * (MSICHANS+1)) );
for ( channum = 1; channum <= maxchans; channum++ )
{
CreatePath( channum, GVocDir );
}
if (frontend == CT_NTANALOG) //模拟卡
{
rc = OpenVocDev( maxchans );
if ( rc < 0 ) QUIT( 2 );
//* Route analog frontend timeslots to its resource in SCbus mode,
//* if required. Check if this is an SCbus card first
for ( channum = 1; channum <= maxchans; channum++ )
{
if ( dx_getctinfo( dxinfo[ channum ].chdev, &ct_devinfo ) == -1 )
{
sprintf( tmpbuff, "dx_getctinfo() failed for %s",
ATDV_NAMEP( dxinfo[ channum ].chdev ) );
disp_msg( tmpbuff );
QUIT( 2 );
}
if ((scbus == TRUE) && (routeag == TRUE) &&
(ct_devinfo.ct_busmode == CT_BMSCBUS))
{
if (nr_scroute( dxinfo[ channum ].chdev, SC_LSI,
dxinfo[ channum ].chdev, SC_VOX, SC_FULLDUP ) == -1 )
{
sprintf( tmpbuff, "nr_scroute() failed for %s",
ATDV_NAMEP( dxinfo[ channum ].chdev ) );
disp_msg( tmpbuff );
QUIT( 2 );
}
}
//* Enable the CST events
if ( dx_setevtmsk( dxinfo[ channum ].chdev, DM_RINGS ) == -1 )
{
sprintf( tmpbuff, "Cannot set CST events for %s",
ATDV_NAMEP( dxinfo[ channum ].chdev ) );
disp_msg( tmpbuff );
QUIT( 2 );
}
//* Set to answer after MAXRING rings
if ( dx_setrings( dxinfo[ channum ].chdev, MAXRING ) == -1 )
{
sprintf( tmpbuff, "dx_setrings() failed for %s",
ATDV_NAMEP( dxinfo[ channum ].chdev ) );
disp_msg( tmpbuff );
QUIT( 2 );
}
//pxm add: 提高音量
// dx_adjsv( dxinfo[ channum ].chdev, SV_VOLUMETBL, SV_ABSPOS, 100 );
// dx_adjsv( dxinfo[ channum ].chdev, SV_VOLUMETBL, SV_ABSPOS, SV_ADD8DB/*=8*/ );
dx_adjsv( dxinfo[ channum ].chdev, SV_VOLUMETBL, SV_RELCURPOS, 16 );
//xyw add: for detecting onhook
BuildTone( channum );
//* Start the application by putting the channel to ON-HOOK state.
dxinfo[ channum ].state = ST_ONHOOK;
set_hkstate( channum, DX_ONHOOK );
} // ends of for loop
//XYW add at 2002/3/25
GetPrivateProfileString("CHANNEL", "OUTBOUND", "", paramstr, 60, ".\\Setup.ini" );
GetParams( paramstr, bgnCh, endCh , protocol );
for ( channum = bgnCh; channum <= endCh; channum++ )
{
dxinfo[ channum ].ctype = 2;
}
//XYW add end
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -