📄 flwparser.cpp
字号:
// FlwParser.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "FlwParser.h"
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "flowanalysis.h"
RETHDR ret;
int GetFreeContNo();
int ReadFlowFile(int nContNo,const char* szFile);
char* LookStringTable(int nChnID,char *s);
int LookIntTable(int nChnID,char *s);
int AddIntTable(int nChnID,char *s);
int AddStringTable(int nChnID,char*s);
void AddSysVarTable(int nIndex);
void IncreaseVarHeap(int nChnID);
void DecreaseVarHeap(int nChnID);
void DropAllPageVar(int nChnID);
void DropIntTable(int nChnID);
void DropStringTable(int nChnID);
int CheckUpdateFile(int nFlwID,const char* szFile);
char* GetLine(int nCntID,int nLinID,int nChnID);
void OperateScript(int nChnID,int op);
void OperateFunction(int nChnID,int op);
void InternalOperateKeyWords(int nChnID,int op);
void InternalOperateIFLFV(int nChnID,int op);
void InternalOperateIFRFV(int nChnID,int op);
void InternalOperateSFLFV(int nChnID,int op);
void InternalOperateSFRFV(int nChnID,int op);
void InternalOperateIFVVE(int nChnID,int op);
void InternalOperateIFLVE(int nChnID,int op);
void InternalOperateSFLVE(int nChnID,int op);
void InternalOperateIFRVE(int nChnID,int op);
void InternalOperateSFRVE(int nChnID,int op);
void InternalOperateSFVVE(int nChnID,int op);
void InternalOperateIFNTE(int nChnID,int op);
void InternalOperateSFNTE(int nChnID,int op);
void InternalOperatePlayFile(int nChnID,int op);
void InternalOperateReadDigits(int nChnID,int op);
void InternalOperateConfPlayFile(int nChnID,int op);
void InternalOperateSetDialInTime(int nChnID,int op);
void InternalOperateDialOut(int nChnID,int op);
void InternalOperateShareFlowVar(int nChnID,int op);
void InternalOperateJoinConf(int nChnID,int op);
void InternalOperateJumpAgent(int nChan,int op);
void InternalOperateTalkWith(int nChnID,int op);
void InternalOperateStartRecord(int nChnID,int op);
void InternalOperateIpCall(int nChnID,int op);
void InternalOperateLineEventEnd(int nChnID,int op);
void InternalOperateLineIsOffHook(int nChnID,int op);
void InternalOperateSleep(int nChnID,int op);
void InternalOperateAgentReq(int nChnID,int op);
void InternalOperateRequestService(int nChnID,int op);
void InternalOperateAgentReqEx(int nChnID,int op);
void InternalOperateSendAnc(int nChnID,int op);
void InternalOperateSetDialOutOriCalleeNum(int nChnID,int op);
void InternalOperateLinkPcmFile(int nChan,int op);
void InternalOperateCheckDirectory(int nChnID,int op);
void InternalOperateRecFile(int nChan,int op);
void InternalOperateConfRecFile(int nChnID,int op);
void InternalOperateGotoFlow(int nChnID,int op);
void InternalOperateGotoSubFlow(int nChnID,int op);
void InternalOperateLogMsg(int nChnID,int op);
void InternalOperateAgentPlayRing(int nChnID,int op);
void InternalOperateHangUpDest(int nChnID,int op);
void InternalOperateIvrIpReq(int nChan,int op);
void InternalOperateVTTalkWith(int nChnID,int op);
void InternalOperateVTSetScale(int nChnID,int op);
void InternalOperateSetProcEvent(int nChnID,int op);
void InternalOperateLineEventStart(int nChnID,int op);
void InternalOperateLJoinConf(int nChan,int op);
void InternalOperateJoinMultiConf(int nChnID,int op);
void InternalOperatorStringAssignExp(int nChnID);
void InternalOperatorIntAssignExp(int nChnID);
void InternalOperateSql(int nChnID,int op);
void InternalOperateConfStopFile(int nChan,int op);
void InternalOperateAgentIvrReq( int nChnID ,int op);
void InternalOperateAgentCallOut(int nChnID,int op);
void InternalOperateStartLineRecord(int nChnID ,int op);
void InternalOperateSetOriCallee(int nChnID,int op);
char* ChangeToPlayStr(char *NumStr,char* playstr);
char* GetFieldValue(int nChnID,char *FieldName);
char* GetFieldValue(int nChnID,int dex);
int GetRandKey(int n);
int GetRand(int n);
char * GetSubString(char*s,char *t,int nStart,int nCount);
int CheckIntSection(int i,int j,int k);
void MakeFunction(int nIndex,int nFunID);
void MakeConfRecFile(int nIndex,char*szFile);
void MakePlayFile(int nIndex,char*pstPlayFile,int nPlayType);
void InternalMakePlayFile(int nIndex,char*pstPlayFile,int nPlayType);
void MakeReadDigits(int nIndex,int nDigitsNum);
void MakeSetChanTimer(int nIndex,int nTimerSeconds);
void MakeGoto(int nIndex,int NextLine);
void MakeDateDiff(int nIndex,int nType,char*szStartTime,char*szEndTime);
void MakeGetFreeChan(int nIndex);
void MakeGetUsedChan(int nIndex);
void MakeHangUpCall(int nIndex);
void MakeGetFreeConfNo(int nIndex);
void MakeGetUsedSeconds(int nIndex);
void MakeGetFieldValue(int nIndex,int nDex);
void MakeTimeSpan(int nIndex,int nSeconds);
void MakeGetDialInTime(int nIndex,int nType);
void MakeGetNowTime(int nIndex,int nType);
void InternalOperatorDefineEnd(int nChnID);
void MakeConfPlayFile(int nIndex,char*pstPlayFile,int nPlayType, int nYinLiang);
void MakeRecFile(int nIndex,char*szFile,int nType);
void MakeDialOut(int nIndex,int nDestChnID,char*pszCaller,char*pstCalled);
void MakeHangUpDest(int nIndex);
void MakeJumpAgent(int nIndex,int nLineNo);
void MakeJoinConf(int nIndex,int nChnID,int nConfNo,int nConfType);
void MakeJoinMultiConf(int nIndex,int nChnID,int nConfNo,int nConfType);
void MakeTalkWith(int nIndex,int nDestChan);
void MakeSqlCommand(int nIndex,int nConnID,char*szSql);
void MakeSqlSelect(int nIndex,int nConnID,char*szSql);
void MakeAgentReq(int nIndex,int nLevel);
void MakeRequestService(int nIndex,int nLevel);
void MakeLogMsg(int nIndex,char*szLog);
void MakeConfStopFile(int nIndex);
void MakeCreateDirectory(int nIndex,char*szDirectory);
void MakeAgentIvrReq(int nIndex);
void MakeStartLineRecord(int nIndex,char*szFile);
void MakeAgentCallOut(int nIndex,int nChnID,char*szCaller,char *szCalled,char*szFlowName);
void MakeGotoFlow(int nIndex,char *szAccessNo);
void MakeSendAnc(int nIndex,int nParam);
void MakeGotoSubFlow(int nIndex,char*szCompanyID,char*szFlowName);
void MakeSetOriCallee(int nIndex,char*szOriCallee,int nChnID);
int SetLastFileTime(int nContNo,const char* szFile);
void MakeStartRecord(int nIndex,char*szFile,int nLine);
void MakeSleep(int nIndex,int nSeconds);
int LoadUpdateFlow(int nOldCont,const char*szAccessNo);
#define MAKEHANGUPRESULT() \
memset(g_pstChnInfo[nIndex].m_stResult,0,1024); \
RETHDR*p = (RETHDR*)g_pstChnInfo[nIndex].m_stResult; \
p->m_nID=LP_FLW_HANGUP;\
p->m_nWaitID = __LINE__;\
LogMesg(nIndex,"MAKEHANGUPRESULT");
FILE * g_fpLogFile;
void LogMesg(int nSessionID , char *szLogMesg)
{
if(g_fpLogFile==NULL)
g_fpLogFile = fopen("logfile//flwparse.txt","w");
SYSTEMTIME systemTime;
char szLogStr[1024];
char datebuf[256];
const unsigned int datebufSize = 256;
struct { int tv_sec; int tv_usec; } tv = {0,0};
time((time_t *)(&tv.tv_sec));
GetLocalTime(&systemTime);
tv.tv_usec = systemTime.wMilliseconds * 1000;
const time_t timeInSeconds = (time_t) tv.tv_sec;
strftime (datebuf,
datebufSize,
"%Y%m%d-%H%M%S",
localtime (&timeInSeconds));
char msbuf[5];
sprintf(msbuf, ".%3.3ld", long(tv.tv_usec / 1000));
int datebufCharsRemaining = datebufSize - strlen (datebuf);
strncat (datebuf, msbuf, datebufCharsRemaining - 1);
datebuf[datebufSize - 1] = '\0'; /* Just in case strncat truncated msbuf,
thereby leaving its last character at
the end, instead of a null terminator */
if (g_fpLogFile != NULL)
{
sprintf(szLogStr,"nSessionID %2d [%s] , %s \n",nSessionID,datebuf,szLogMesg);
fseek(g_fpLogFile ,0,SEEK_END);
fwrite(szLogStr, strlen(szLogStr),1,g_fpLogFile);
fflush(g_fpLogFile);
}
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
if(g_fpLogFile==NULL)
g_fpLogFile = fopen("logfile//flwparse.txt","w");
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
fclose(g_fpLogFile);
break;
}
return TRUE;
}
CALL* g_pstChnInfo;
FLOWCONTAIN g_stCntInfo[MAX_FLOW];
CHNMAPTABLE ChnMapTable[MAX_FLOW];
int CheckSleepTimer(int nChnID)
{
int nIndex = ChnMapTable[nChnID].m_nIndex;
if(!g_pstChnInfo[nIndex].m_bSleepFlag)
return 0;
time_t long_time;
if (time(&long_time) == -1)
return 0;
int s = labs(long_time - g_pstChnInfo[nIndex].m_tSleepTime);
if (s > g_pstChnInfo[nIndex].m_nSleepSeconds)
{
return 1;
}
else
return 0;
}
FLWPARSER_API int FP_GetFlwNoByAccessNo(int nChnID,char* szAccessNo)
{
int nLen=0;
int kt = -1;
int k1= -1;
char szlog[1024];
for(int k = MAX_FLOW ; k >=0 ;k-- )
{
if(g_stCntInfo[k].m_nUse==1&&g_stCntInfo[k].m_nIsOld==0)
{
int ret = strcmp(g_stCntInfo[k].m_szAccessNo,szAccessNo);
if(ret==0)
{
if(CheckUpdateFile(k,g_stCntInfo[k].m_szFileName))
{
k1 = LoadUpdateFlow(k,g_stCntInfo[k].m_szFileName);
if(k1>=0)
return k1;
else
return -1;
}
else
{
sprintf(szlog,"GetContNoByAccessNo return %d for %s",k,szAccessNo);
LogMesg(-1,szlog);
return k;
}
}
else
{
//部分匹配代码
/*
int l = Cont[k].m_sAccessNo.GetLength();
sSub = szAccessNo.Mid(0,l);
if(Cont[k].m_sAccessNo == sSub&&Cont[k].m_nIsOld==0)
{
if(l>nLen)
{
nLen = l;
kt = k;
}
}
*/
}
}
}
sprintf(szlog,"获取主流程失败%s",szAccessNo);
LogMesg(-1,szlog);
return -1;
}
int LoadUpdateSubFlow(int nOldCont,const char*sFileName)
{
char szlog[1024];
int nContNo=GetFreeContNo();
if(nContNo==-1)
{
char szlog[1024]="";
sprintf(szlog,"Cont已经使用完 ");
LogMesg(-1,szlog);
return -1;
}
g_stCntInfo[nContNo].m_nUse = 1;
strcpy(g_stCntInfo[nContNo].m_szAccessNo,g_stCntInfo[nOldCont].m_szAccessNo);
g_stCntInfo[nContNo].m_nContNo = nContNo;
strcpy(g_stCntInfo[nContNo].m_szFlowName , g_stCntInfo[nOldCont].m_szFlowName);
strcpy(g_stCntInfo[nContNo].m_szFileName , g_stCntInfo[nOldCont].m_szFileName);
strcpy(g_stCntInfo[nContNo].m_szCompanyID , g_stCntInfo[nOldCont].m_szCompanyID);
strcpy(g_stCntInfo[nContNo].m_szCompany , g_stCntInfo[nOldCont].m_szCompany);
g_stCntInfo[nContNo].m_nFlowID = 0;
g_stCntInfo[nContNo].m_nSubFlowFlag = 1;//外拨流程
SetLastFileTime(nContNo,sFileName);
g_stCntInfo[nOldCont].m_nIsOld = 1;
sprintf(szlog,"%s流程装载成功",sFileName);
LogMesg(-1,szlog);
return ReadFlowFile(nContNo,g_stCntInfo[nOldCont].m_szFileName);
}
FLWPARSER_API int FP_GetFlwNoBySubFlow(int nChnID,char* szCompanyNo,char*szSubFlow)
{
int nLen=0;
int kt = -1;
int k1= -1;
char szlog[1024];
for(int k = MAX_FLOW ; k >=0 ;k-- )
{
if(g_stCntInfo[k].m_nUse==1&&g_stCntInfo[k].m_nIsOld==0)
{
int ret = strcmp(g_stCntInfo[k].m_szAccessNo,szSubFlow);
if(ret==0)
{
if(CheckUpdateFile(k,g_stCntInfo[k].m_szFileName))
{
k1 = LoadUpdateSubFlow(k,g_stCntInfo[k].m_szFileName);
if(k1>=0)
return k1;
else
return -1;
}
else
{
//sprintf(szlog,"GetContNoByAccessNo return %d for %s",k,szAccessNo);
//LogMesg(-1,szlog,DEBUGOUTPUT,THIS_FILE, __LINE__);
return k;
}
}
else
{
//部分匹配代码
/*
int l = Cont[k].m_sAccessNo.GetLength();
sSub = szAccessNo.Mid(0,l);
if(Cont[k].m_sAccessNo == sSub&&Cont[k].m_nIsOld==0)
{
if(l>nLen)
{
nLen = l;
kt = k;
}
}
*/
}
}
}
return -1;
}
int LoadUpdateFlow(int nOldCont,const char*szAccessNo)
{
char szlog[1024];
int nContNo=GetFreeContNo();
if(nContNo==-1)
{
char szlog[1024]="";
sprintf(szlog,"Cont已经使用完 ");
LogMesg(-1,szlog);
return -1;
}
g_stCntInfo[nContNo].m_nUse =1;
g_stCntInfo[nContNo].m_nSubFlowFlag=g_stCntInfo[nOldCont].m_nSubFlowFlag;
strcpy(g_stCntInfo[nContNo].m_szFileName,g_stCntInfo[nOldCont].m_szFileName);
strcpy(g_stCntInfo[nContNo].m_szCompanyID,g_stCntInfo[nOldCont].m_szCompanyID);
strcpy(g_stCntInfo[nContNo].m_szAccessNo,g_stCntInfo[nOldCont].m_szAccessNo);
strcpy(g_stCntInfo[nContNo].m_szFlowName,g_stCntInfo[nOldCont].m_szFlowName);
SetLastFileTime(nContNo,g_stCntInfo[nOldCont].m_szFileName);
g_stCntInfo[nOldCont].m_nIsOld = 1;
g_stCntInfo[nContNo].m_nContNo = nContNo;
return ReadFlowFile(nContNo,g_stCntInfo[nOldCont].m_szFileName);
}
int SetLastFileTime(int nContNo,const char* szFile)
{
char szlog[1024];
HANDLE hFile = CreateFile(szFile, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
sprintf(szlog,"CreateFile failed with %s,%d", szFile,GetLastError());
LogMesg(-1,szlog);
return 0;
}
FILETIME ftCreate, ftAccess, ftWrite;
SYSTEMTIME stUTC, stLocal;
DWORD dwRet;
// Retrieve the file times for the file.
if (!GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite))
return FALSE;
CloseHandle(hFile);
g_stCntInfo[nContNo].m_nHighTime = ftWrite.dwHighDateTime ;
g_stCntInfo[nContNo].m_nLowTime = ftWrite.dwLowDateTime;
return 1;
/*
// Convert the last-write time to local time.
FileTimeToSystemTime(&ftWrite, &stUTC);
SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
// Build a string showing the date and time.
sprintf(m_szFileTime,
"%02d/%02d/%d %02d:%02d",
stLocal.wMonth, stLocal.wDay, stLocal.wYear,
stLocal.wHour, stLocal.wMinute);
if( S_OK == dwRet )
return TRUE;
else return FALSE;
*/
}
FLWPARSER_API RETHDR* FP_StartFlw(int nChnID)
{
char szlog[1024];
sprintf(szlog,"FP_StartFlw%d",nChnID);
LogMesg(-1,szlog);
int nIndex = ChnMapTable[nChnID].m_nIndex;
sprintf(szlog,"FP_StartFlw%d-%d",nChnID,nIndex);
LogMesg(nIndex,szlog);
char szOpCode[100];
int op;
char *pStmt=NULL;
//LogMesg(nIndex,"FP_StartFlw");
memset(g_pstChnInfo[nIndex].m_stResult,0,1024);
memset(&ret,0,sizeof(RETHDR));
for(;;g_pstChnInfo[nIndex].m_iCurrentLine++)
{
sprintf(szOpCode,"%s","");
if(g_pstChnInfo[nIndex].m_iCurrentLine>g_pstChnInfo[nIndex].m_iFlowTotalLine)
{
sprintf(szlog,"m_iFlowTotalLine=%d 返回",g_pstChnInfo[nIndex].m_iFlowTotalLine);
LogMesg(nIndex,szlog);
ret.m_nID=LP_FLW_HANGUP;
ret.m_nWaitID = LP_FLW_HANGUP_VIOLATION;
return &ret;
}
g_pstChnInfo[nIndex].m_pStmt =GetLine(g_pstChnInfo[nIndex].m_nFlwID,g_pstChnInfo[nIndex].m_iCurrentLine,nIndex);
if(g_pstChnInfo[nIndex].m_pStmt==NULL)
{
sprintf(szlog,"Line=NULL%d 返回",g_pstChnInfo[nIndex].m_iCurrentLine);
LogMesg(nIndex,szlog);
ret.m_nID=LP_FLW_HANGUP;
ret.m_nWaitID = LP_FLW_HANGUP_VIOLATION;
return &ret;
}
strncpy(szOpCode,g_pstChnInfo[nIndex].m_pStmt,5);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -