📄 ctuxedothread.cpp
字号:
#include <atmi.h> /* TUXEDO 头文件*/
#include <fml32.h>
#include "cmyapp.h"
#include "CTuxedoThread.h"
#include "TSEngineQT.h"
#include <QTime>
#include <QMutex>
#include <qt\q3ptrlist.h>
#include <QWaitCondition>
//#include <qtsoap.h>
//#include <winuser.h>
//#include "winerror.h"
#include <afxcmn.h>
extern TUXCALLBACK tuxCallBack;
extern CMyApp myApp;
extern long g_hWnd;
extern FUNTUXEDO fun;
extern bool g_bInited;
extern bool g_bIniting;
extern TSEngineQT app;
extern QMutex g_Mutex;
extern int g_nInitTimes;
extern bool g_bExit;
extern bool g_bNeedReconn;
extern QWaitCondition g_WaitCondi;
extern Q3PtrList<CTuxedoThread> CallsList;
DWORD g_tmLastCall;
CTuxedoThread::CTuxedoThread()
{
m_bAsync=false;
m_bJustFinished=false;
m_bForInitOrCall=false;
m_pSndBufFML=0;
m_pRcvBufFML=0;
m_nSndBufLen=0;
m_nRcvBufLen=0;
g_tmLastCall=0;
m_ID=-1;
m_bCalling=false;
m_ErrID=0;
m_bPretendInit=false;
//int jjjj= startTimer(500);
}
CTuxedoThread::~CTuxedoThread()
{
}
extern void __stdcall TimerProc(HWND hWnd,unsigned int nMsg,unsigned int nTimerid,unsigned long dwTime);
int CTuxedoThread::WebSrvInit(char * wsdlAddr,char * servName,char * portName, char * userName, char * pwd)
{
return 0;
}
int CTuxedoThread::KeepConnection()
{
int r=RunInit();
if(r)
{
return 0;
}
else
g_bInited=true;
while(1)
{
msleep(50);
int r=0;
QString sErr="";
while(CallsList.count())
{ if (g_bExit)
break;
/*for(int i=1;i<60;i++)
{
fun.tpterm();
r=RunInit();
}*/
CTuxedoThread * pThr;
pThr=CallsList.getFirst();
if(r)
{
pThr->m_ErrID=r;
pThr->m_msgDesc=sErr;
}
else
{
//fun.tpbegin(40,0);
r=pThr->TuxFmlRunCall();
//fun.tpcommit(0);
if (r==12)
{ QTime tm;
tm.start();
while(r)
{
if (g_bExit) break;
msleep(10);
fun.tpterm();
msleep(1000);
//fun.tpbegin(70,0);
r=RunInit();
//fun.tpcommit(0);
pThr->m_ErrID=r;
pThr->m_msgDesc=m_msgDesc;
if (r==0)
{
//fun.tpbegin(20,0);
r=pThr->TuxFmlRunCall();
//fun.tpcommit(0);
}
sErr=pThr->m_msgDesc;
if(tm.elapsed()>20000)
break;
}
}
}
g_Mutex.lock();
CallsList.remove(uint(0));
pThr->m_bJustFinished=true;
pThr->m_bCalling=false;
g_Mutex.unlock();
/*if (!pThr->m_bJustFinished())
{
pThr->TuxFmlRunCall();
m_bJustFinished=false;
}*/
}
/*if(g_bNeedReconn)
{
g_Mutex.lock();
fun.tpterm();
r=RunInit();
if (r==0)
g_bNeedReconn=false;
g_Mutex.unlock();
g_WaitCondi.wakeAll();
}*/
if (g_bExit)
break;
}
fun.tpterm();
return 0;
}
int CTuxedoThread::RunInit()
{
// bool rrr= connect( this,SIGNAL(Inited(int)),&app,SLOT(Inited(int)));
// bool rrr= connect( this,SIGNAL(Inited(int)),this,SLOT(myInited(int)));
//connect(
m_msgDesc="";
m_ErrID=0;
// DWORD tmStart=GetTickCount();
/* QTime qtm;
//qtm.elapsed();
qtm.start();
while(1)
{
if(m_bPretendInit && g_bIniting)
msleep(20);
else
break;
if (abs(qtm.elapsed())>30000)
break;
}
*/
// if(g_bInited)
// return 0;
// g_Mutex.lock();
int r=0;
char *sendbuf, *rcvbuf;
long sendlen, rcvlen;
int ret;
char wsn[100];
QString qs;
strcpy(wsn,"WSNADDR=");
strcat(wsn,m_WSNADDR);
fun.tuxputenv(wsn);
int sz=sizeof(TPINIT);
TPINIT *tpinitbuf = (TPINIT*)fun.tpalloc( "TPINIT",NULL,sz);
strcpy(tpinitbuf->usrname,m_userName);
strcpy(tpinitbuf->passwd,m_pwd);
strcpy(tpinitbuf->cltname,m_cltName);
strcpy(tpinitbuf->grpname,m_grpName);
/*if(m_bAsync)
tpinitbuf->flags = TPMULTICONTEXTS; //Note: if flags = TPMULTICONTEXTS, and FmlCall is called in a thread, FmlCall will return error no 9: Protocol error
else
tpinitbuf->flags = 0;*/
g_nInitTimes++;
/*if ( g_nInitTimes>1)
tpinitbuf->flags =0;//TPMULTICONTEXTS;//TPSA_PROTECTED;// 0;
else
tpinitbuf->flags =0;*/
//tpinitbuf->flags =TPMULTICONTEXTS;
tpinitbuf->flags = 0;// if use TPMULTICONTEXTS, on 6.5 client will return 9.
//for(int ii=0;ii<5;ii++)
//{
if ( fun.tpinit((TPINIT *) tpinitbuf) == -1)
{ //fun.tpterm();
QString tpErrDes;
m_msgID=MSG_TUX_INIT_FAILED;
r=tperrno;
m_msgDesc.sprintf("Tperrno = %d . Init failed",tperrno);
if (r==12)
{
m_msgDesc=m_msgDesc+" Maybe the WSNADDR invalid or the Tuxedo service not running on the server.";
}
else if(r==9)
{
m_msgDesc=m_msgDesc+" Tuxedo is not properly installed.";
}
else
{
tpErrDes=fun.tpstrerror(tperrno);
m_msgDesc=m_msgDesc+tpErrDes;
if(fun.tperrordetail)
{
int rd = fun.tperrordetail(0);
if (rd == -1)
{
//(void) fprintf(stderr, "tperrordetail() failed!\n");
//(void) fprintf(stderr, "tperrno = %d, %s\n",tperrno, tpstrerror(tperrno));
}
else if (rd != 0)
{ tpErrDes=fun.tpstrerrordetail(rd, 0);
m_msgDesc=m_msgDesc+tpErrDes;
}
}
}
}
else
{
m_msgDesc="";
g_bInited=true;
m_msgID=MSG_TUX_INIT_OK;
r=0;
}
// fun.tpterm();
//}
fun.tpfree((char*)tpinitbuf);
// g_Mutex.unlock();
if (m_bAsync)
{ if(g_hWnd)
{
bool bok=PostMessage((HWND)g_hWnd,WM_USER+m_msgID,0,0);
}
else if(tuxCallBack)
{
// emit(Inited(CTuxedoThread *(this)));
//emit(Inited(int(1)));
//tuxCallBack(0,0,0);
}
}
m_ErrID=r;
//g_tmLastCall=GetTickCount();
g_bIniting=false;
//m_bJustFinished=true;
return r;// 0;
}
int CTuxedoThread::TuxSetupCall(char * SrvName, char *inputBuf,char **outputBuf,long * outputLen)
{
//m_SrvName=SrvName;
strcpy(m_SrvName,SrvName);
m_inputBuf=inputBuf;
m_outputBuf=outputBuf;
m_outputLen=outputLen;
return 0;
}
int CTuxedoThread::TuxFmlSetupCall(char * SrvName)
{
//m_SrvName=SrvName;
strcpy(m_SrvName,SrvName);
action="FmlCall";
return 0;
}
int CTuxedoThread::TuxFmlAllocBuf(long nSndBufLen,long nRcvBufLen)
{
m_nSndBufLen=nSndBufLen;
m_nRcvBufLen=nRcvBufLen;
TuxFmlFreeBuf();
//if(!m_pSndBufFML)
if((m_pSndBufFML = (FBFR32*) fun.tpalloc( "FML32", NULL, m_nSndBufLen+1)) == NULL)
{
m_msgDesc ="Buffer alloc failed";
return ERROR_BUFF_ALLOC_FAILED;
}
//if(!m_pRcvBufFML)
if((m_pRcvBufFML = (FBFR32*) fun.tpalloc("FML32", NULL, m_nRcvBufLen+1)) == NULL)
{
fun.tpfree((char *)m_pSndBufFML);
m_pSndBufFML=0;
m_msgDesc ="Buffer alloc failed";
return ERROR_BUFF_ALLOC_FAILED;
}
return 0;
}
int CTuxedoThread::TuxFmlFreeBuf()
{
if(m_pSndBufFML)
{
fun.tpfree((char *)m_pSndBufFML);
m_pSndBufFML=0;
}
if(m_pRcvBufFML)
{
fun.tpfree((char *)m_pRcvBufFML);
m_pRcvBufFML=0;
}
return 0;
}
int CTuxedoThread::TuxFmlSetSndFld(long FldID,long nRow, char * pValue,long nLen)
{
m_msgDesc="";
int r=0;
if(!m_pSndBufFML)
{
r=ERROR_BUFF_NOT_ALLOCATED;
m_msgDesc="FML Buffer not allocated yet. Please call TuxFmlAllocBuf first.";
return r;
}
int ret = fun.Fchg32(m_pSndBufFML,FldID,nRow,pValue,nLen);
if(ret==1)
{
return 0;
}
else
{ m_msgDesc.sprintf("Tperrno = %d . Init failed",tperrno);
r=tperrno;
return r;
}
}
int CTuxedoThread::TuxFmlGetRcvFld(long FldID,long nRow, char * pValue,long *pLen)
{
m_msgDesc="";
if(!m_pRcvBufFML)
{
m_msgDesc="FML Buffer not allocated yet. Please call TuxFmlAllocBuf first.";
return ERROR_BUFF_NOT_ALLOCATED;
}
char cc[100];
strcpy(cc,"");
int ret = fun.Fget32(m_pRcvBufFML,FldID,nRow,cc,(FLDLEN32*)pLen);
//int ret = fun.Fget32(m_pRcvBufFML,FldID,nRow,pValue,(FLDLEN32*)pLen);
strcpy(pValue,cc);
if(ret==1)
{
//MessageBoxA(NULL,pValue,"",MB_OK);
return 0;
}
else
{ m_msgDesc.sprintf("Tperrno = %d . Init failed",tperrno);
return int(tperrno);
}
}
int CTuxedoThread::TuxFmlRunCall()
{
//char * rcvbuf,*sendbuf;
/*DWORD tmStart=GetTickCount();
while(1)
{
if(!g_bIniting)
{
break;
}
else
Sleep(10);
if (abs(GetTickCount()-tmStart)>30000)
return -1;
}*/
m_msgDesc="";
m_ErrID=0;
long rcvlen,ret;
int r=0;
/*if(!g_bInited)
{
m_msgDesc ="Tuxedo not initialized";
MessageBoxA(NULL,"NOT INITED","",MB_OK);
return ERROR_TUX_NOT_INITED;
}*/
// g_Mutex.lock();
// for (int ii=1;ii<60;ii++)
// {
// if(!g_bInited)
// r=RunInit();
/* DWORD tmPass=abs(GetTickCount()-g_tmLastCall);
if(tmPass>60000)
{
fun.tpterm();
g_bInited=false;
r=RunInit();
//if(r)
// return r;
}*/
if(!g_bInited)
{ m_msgDesc= "Not initialized";
return ERROR_TUX_NOT_INITED;
}
g_tmLastCall=GetTickCount();
bool bTriedReInit =false;
// g_Mutex.lock();
bool bWait=false;
// if (g_bNeedReconn)
// bWait=g_WaitCondi.wait( &g_Mutex,60000);
CallAgain:
// ret = fun.tpcall ( m_SrvName, (char *)m_pSndBufFML, 0, (char **)&m_pRcvBufFML, &m_nRcvBufLen,0);
ret = fun.tpcall ( m_SrvName, (char *)m_pSndBufFML, 0, (char **)&m_pRcvBufFML, &m_nRcvBufLen, TPNOBLOCK);
if(ret == -1)
{
QString tpErrDes;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -