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

📄 flwparser.cpp

📁 flwscript解析器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// 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 + -