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

📄 vsinterpreter.cpp

📁 基于dialogic语音卡的IVR系统源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// VSInterpreter.cpp: implementation of the CVSInterpreter class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "VSInterpreter.h"

#include "resource.h"
#include "export.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


CServiceDataQueue m_requestQueue_App, m_requestQueue_Voice;
CServiceDataQueue m_replyQueue;
// add by lj 2003/08/18   数据库访问队列
CServiceDataQueue m_requestQueue_Db;
extern BOOL g_Connected ;
// add end
extern void DispMsg(const char *szMsg);
extern int  ReadLineFromFile(FILE *file, char **ppBuffer, int *piSize);

//XYW add at 2002/4/17
extern char *vs_GetANI( int channum );
extern char *vs_GetDNIS( int channum );
//XYW add end

extern UINT ProcessDbRequest(LPVOID pParam);

extern HINSTANCE hAI2002;
extern pExitDB ExitDB;

FILE* __fStdOut2 = NULL;	//给任何版本(DEBUG或RELEASE)写LOG(一般是ERROR)

//#ifdef _DEBUG    
FILE* __fStdOut = NULL;    
HANDLE __hStdOut = NULL;
//#endif



////add by lj 2003/09/16

typedef struct _StockMarket{
  char  szStock[7];     //股票代码前几位
  int  iMarket;   //股票市场
 }StockMarket;
typedef struct _StockType{
  char szStock[7];    //股票代码前几位
  int iType;     //股票类型
 }StockType;
 StockMarket market[512];
 StockType   type[512];
 int g_MarketNum=0;  //实际数目
 int g_TypeNum=0;
 //函数初始化,从配置文件中读取,并保存
 void GetIniFile()
 {
  memset(market,0, sizeof(StockMarket)*300);
  memset(type,0,sizeof(StockType)*300);
  char szOrder[2];   //序号
  char szTmp[512]; //暂存每行中取出的值
  char *p = NULL;
 
  int iMarketCount=GetPrivateProfileInt("MarketType","MarketCount",10,".\\stockconfig.ini");
  int iTypeCount=GetPrivateProfileInt("StockType","TypeCount",10,".\\stockconfig.ini");
  //从配置文件中读取
  
  for(int j=6;j>0;j--)
  {
   for(int i=0;i<iMarketCount;i++)
   {
    memset(szOrder,0x00,2);
    memset(szTmp,0x00,sizeof(szTmp));
    sprintf(szOrder,"%d",i);
  //  szOrder[1]='\0';
    GetPrivateProfileString("MarketType",szOrder,NULL,szTmp,sizeof(szTmp),".\\stockconfig.ini");
    p=strtok(szTmp," ,");
    while(p!=NULL)
    {
     if(strlen(p)==j)
     {
      //market[g_MarketNum].iStock=atoi(p);
	  memcpy(market[g_MarketNum].szStock, p, strlen(p));
      market[g_MarketNum].iMarket=i;
      g_MarketNum++;
     }
     
     p=strtok(NULL," ,");
     
    }
   }
 
   for(int k=0;k<iTypeCount;k++)
   {
    memset(szOrder,0x00,2);
    memset(szTmp,0x00,sizeof(szTmp));
    sprintf(szOrder,"%d",k);
//    szOrder[2]='\0';
    GetPrivateProfileString("StockType",szOrder,NULL,szTmp,sizeof(szTmp),".\\stockconfig.ini");
    p=strtok(szTmp," ,");
    while( p!=NULL )
    {
     if(strlen(p)==j)
     {
      //type[g_TypeNum].iStock=atoi(p);

      memcpy(type[g_TypeNum].szStock, p, strlen(p));
      type[g_TypeNum].iType=k;
      g_TypeNum++;
     }
    
     p=strtok(NULL," ,");
      
    }
   }
  }
   
 }
 
 //对股票代码类型的判断
 int IsStock(char* szStock)
 {
 
  
	  for(int i=0; i<g_TypeNum; i++)
	  {
  
		  
	  int iLen;
//	  char szLen[7];
//	  memset(szLen,0x0,sizeof(szLen));
	  //sprintf(szLen,"%d",type[i].iStock);
	  iLen = strlen(type[i].szStock);
	  if(memcmp(szStock,type[i].szStock,iLen) ==0 )
	  { 
		return type[i].iType;
	  }
  
	  }
	  return 999;//无效的股票代码
 }
 //判断市场类别
 int IsMarket(char* szStock)
 {
  
  
	  for(int i=0; i<g_MarketNum; i++)
	  {
  
	  int iLen;
//	  char szLen[7];
//	  memset(szLen,0,sizeof(szLen));
//	  sprintf(szLen,"%d",market[i].iStock);
	  iLen = strlen(market[i].szStock);
	  if( memcmp(szStock,market[i].szStock ,iLen) == 0 )
	  {
  
	   return market[i].iMarket;
	  }
  
	  }
	  return 999;//无效的股票代码
 }

//add end

int wprintf(char *fmt, ...);
int wprintf_err(char *fmt, ...);

int wprintf(char *fmt, ...)
{
/****************************************************
将信息写到CONSOLE中
****************************************************/
// Use wprintf like TRACE0, TRACE1, ... (The arguments are the same as printf)
	char s[MAX_LEN];	
	va_list argptr;	
	int cnt;
	va_start(argptr, fmt);	
	cnt = vsprintf(s, fmt, argptr);	
	va_end(argptr);
	if(s[strlen(s) - 1] != '\n')
		sprintf(s, "%s\n", s);	//增加换行符
	DWORD cCharsWritten;	
	if(__hStdOut)
		WriteConsole(__hStdOut, s, strlen(s), &cCharsWritten, NULL);	
	if(__fStdOut)
		fprintf(__fStdOut, s);	
	return(cnt);
}

int wprintf_err(char *fmt, ...)
{
/*****************************************************
将(错误)信息写到CONSOLE和LOG文件中,不直接调用,仅供wprintf_err1和wprintf_err2调用
*****************************************************/
	// Use wprintf like TRACE0, TRACE1, ... (The arguments are the same as printf)
	char s[MAX_LEN], s2[MAX_LEN];	
	va_list argptr;	
	int cnt;
	va_start(argptr, fmt);	
	cnt = vsprintf(s, fmt, argptr);	
	va_end(argptr);
	//得到错误发生时间
	struct tm *nowtime;
	time_t ltime = time(NULL);
	nowtime = localtime(&ltime);
	char aszTime[100] = "\0";
	sprintf(aszTime, "%4d%02d%02d %02d:%02d:%02d", nowtime->tm_year + 1900, nowtime->tm_mon + 1, nowtime->tm_mday, nowtime->tm_hour, nowtime->tm_min, nowtime->tm_sec);

	sprintf(s2, "Error:\t%s\t%s", aszTime, s);

	if(s2[strlen(s2) - 1] != '\n')
		sprintf(s2, "%s\n", s2);	//增加换行符
	DWORD cCharsWritten;	
	if(__hStdOut)
		WriteConsole(__hStdOut, s2, strlen(s2), &cCharsWritten, NULL);	
	if(__fStdOut2)
	{
		fprintf(__fStdOut2, s2);	
		fflush(__fStdOut2);
	}
	return(cnt);
}

int wprintf_err1(char *fmt, ...)
{
/*****************************************************
将(错误)信息写到CONSOLE和LOG文件中
*****************************************************/
// Use wprintf like TRACE0, TRACE1, ... (The arguments are the same as printf)
	char s[MAX_LEN];	
	va_list argptr;	
	int cnt;
	va_start(argptr, fmt);	
	cnt = vsprintf(s, fmt, argptr);	
	va_end(argptr);

	return wprintf_err("%s", s);
}

int wprintf_err2(struct CurrentState *pcurrentState, char *fmt, ...)
{
/*****************************************************
将通道号,IID等和(错误)信息写到CONSOLE和LOG文件中
*****************************************************/
// Use wprintf like TRACE0, TRACE1, ... (The arguments are the same as printf)
	char s[MAX_LEN], s2[MAX_LEN];	
	va_list argptr;	
	int cnt;
	va_start(argptr, fmt);	
	cnt = vsprintf(s, fmt, argptr);	
	va_end(argptr);

	sprintf(s2, "IID=%s, LAST_IID=%s, CN=%d\t%s", pcurrentState->vsi.IID, pcurrentState->vsi.Last_IID, pcurrentState->iChannelNo, s);

	return wprintf_err("%s", s2);
}

//#define DEBUG_PXM	//这个开关控制是否在出错时弹出对话框
void DbgMessageBox(char *fmt, ...)
{
#ifdef DEBUG_PXM	
	char s[MAX_LEN];	
	va_list argptr;	
	int cnt;
	va_start(argptr, fmt);	
	cnt = vsprintf(s, fmt, argptr);	
	va_end(argptr);
	AfxMessageBox(s);
	return;
#else	
	return;
#endif
}

void ASC2DTMF( char * DataInfo )	//字符串转DTMF
{
	int  i, len;
	char ch1, ch2, TempStr[100];
	
	memset( TempStr,0x0, 100 );
	len = strlen( DataInfo );
	for( i=0; i<len; i++ )
	{
		ch1 = DataInfo[i];
		ch1 = (ch1 >> 4)&0x0F;
		ch2 = DataInfo[i]&0x0F;
		if( ch1 <= 9 ) 
			TempStr[2*i] = '0' + ch1 ;
		else
			TempStr[2*i] = 'A' + ch1 - 10 ;
		if( ch2 <= 9 ) 
			TempStr[2*i+1] = '0' + ch2 ;
		else
			TempStr[2*i+1] = 'A' + ch2 - 10 ;
	}
	strcpy( DataInfo, TempStr );
}

int TrimSymbol(char *szInput, char cSymbol)
{
	//去掉结尾的指定符号
	while(1)
	{
		if(szInput[0] != 0)
		{
			if(szInput[strlen(szInput) - 1] == cSymbol)
				szInput[strlen(szInput) - 1] = 0;
			else
				break;
		}
		else
		{
			return 0;
		}
	}

	//去掉开头的指定符号
	int ii = strlen(szInput);
	char *szTemp = (char *)malloc(strlen(szInput) + 1);
	strcpy(szTemp, szInput);
	int i = 0;
	while(1)
	{
		if(szTemp[i] != 0)
		{
			if(szTemp[i] == cSymbol)
				i ++;
			else
				break;
		}
		else
		{
			break;
		}
	}
	strcpy(szInput, szTemp + i);
	int jj = strlen(szTemp);
	free(szTemp);

	return 0;
}

//将每个通道的对应脚本文件名读入
int GetInstructionFile(int iChannelNo, char *szInstructionFile)
{
	char aszInstructionFile[100] = "\0";
	char aszInstructionFile_Last[100] = "\0";
	char aszTempKey[100] = "\0";
	int len;
	FILE *file;
	int i;

	for(i = 0; ; i ++)
	{
		sprintf(aszTempKey, "%d", i + 1);
		len = GetPrivateProfileString(SECTION_SCRIPT, aszTempKey, "abc", aszInstructionFile, sizeof(aszInstructionFile), CONFIGFILE);
		if(stricmp(aszInstructionFile, "abc") == 0 || len >= sizeof(aszInstructionFile) - 2)
		{//取不到
			if(i == 0)
			{//连第一个通道的脚本不存在,就只能出错退出
				return -1;
			}
			else
			{//如果取不到,就和上一个通道的脚本一样
				strcpy(aszInstructionFile, aszInstructionFile_Last);
			}
		}
		
		//XYW modify at 2001/9/4
		if( aszInstructionFile[0] != '\\' && aszInstructionFile[1] != ':' )
		{
			GetCurrentDirectory(100, aszTempKey);
			len = strlen(aszTempKey);
			if( aszTempKey[len-1] != '\\' )
			{
				strcat( aszTempKey, "\\Script\\" );
				strcat( aszTempKey, aszInstructionFile );
			}
			strcpy( aszInstructionFile, aszTempKey );
		}
		//XYW modified end

		if((file = fopen(aszInstructionFile, "r")) == NULL)
		{
			return -1;
		}
		fclose(file);
		strcpy(aszInstructionFile_Last, aszInstructionFile);
		if(i == iChannelNo - 1)
			break;
	}

	strcpy(szInstructionFile, aszInstructionFile);

	return 0;
}

//*******************解释器自带的GDI线程******************************
int CreateSourceMonitor(CSourceMonitor *psourceMonitor, char *szInstructionFile, int iChannelNo, void *pvsInterpreter)
{
	if(psourceMonitor->Create(pvsInterpreter) == -1)
		return -1;
	if(psourceMonitor->Run(szInstructionFile, iChannelNo) == -1)
		return -1;

	return 0;
}

UINT GDIThread(LPVOID pParam)
{
/*****************************************************
在此线程中创建SOURCEMONITOR窗口

⌨️ 快捷键说明

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