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

📄 pansr.cpp

📁 基于dialogic语音卡的IVR系统源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/******************************************************************************
 *       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 + -