📄 vsinterpreter.cpp
字号:
// 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(<ime);
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 + -