Tuxedo缓冲区的封装代码,成就你打造通用的tuxedo客户端(三)
bool Veiw::PrintVeiw()//打印容器theView里面存储的东西内容
{
for(map<string,VeiwType>::iterator it=theView.begin();it!=theView.end();++it)
{
cout<<"first["<<it->first<<"]"<<",second VeiwType {
name="<<it->second.name<< ",value="<<(it->second).value<< ", tmp="<<(it->second).tmp<<
", param="<<(it->second).param<< ", begin="<<it->second.begin<< "};"<<endl;
}
return true;
} //打印结果---
bool Veiw::Printmap()
{
for(map<string,string>::iterator it=Vinbufmap.begin();it!=Vinbufmap.end();++it) {
cout<<it->first<<"== "<<","<<it->second<<endl;
}
return true;
}
bool Veiw::Printvec()
{
for(vector<string>::iterator it=Voutbuf.begin();it!=Voutbuf.end();++it) {
cout<<" "<<(*it)<<endl;
}
return true;
}
int TuxPost::CallAnaly(char *p, char *sname)//解析soap消息数据
//解析rid=123;rsal=wocao;rname=guowl sname是请求的tuxedo服务的名称
{
if(p==NULL || sname==NULL)
{
return -1;
}
memset(Buffer,0,BUFFLEN*sizeof(char));
memset(g_out1,0,sizeof(g_out1));
memset(g_out2,0,sizeof(g_out2));
memset(m_CurServiceName,0,sizeof(m_CurServiceName));
strcpy(m_CurServiceName,sname);//本次请求的服务名称
string s;
char sTmp1[255]="";
if(strncmp(Stype,"STRING",6)==0)
{//对于string类型,这里使用了gview.instr这个对象
gview.instr.clear();
gview.instr=p;//gview.instr表示,STRING类型的请求入参数据
size_t sp=gview.instr.find_first_of("=");
if(static_cast<int>(sp)!=-1) {//string的入参请求数据为: send=guowlnihaoa
string stemp=gview.instr.substr(0,sp);//stemp=send
//找到"="之前的业务名称,判断是否为入参
if(Param(stemp.c_str())==IN||Param(stemp.c_str())==INOUT) {
gview.instr.erase(0,sp+2);//拿到真正的入参数据,gview.instr=guowlnihaoa
return 0;
} else {
memset(sTmp1,0,sizeof(sTmp1));
sprintf(sTmp1," || string类型的本次请求的服务名称%s,入参数据,在isalt.def里面对应的业务成员%s错误,不是in入参;",p,stemp.c_str());
m+=sTmp1;
return -1;
}
} else {
memset(sTmp1,0,sizeof(sTmp1));
sprintf(sTmp1,"||string类型的本次请求的服务名称%s,入参数据请求错误,找不到==符号,请改正",p);
m+=sTmp1;
return -1;
}
}
//对于非STRING类型的请求数据,要使用splitStr逐个分割
int iNum=splitStr(p,";",g_out1);//第一次分割,使用;符号做分割。分割后变成了s out[0]="rid=123",sout[1]="rsal=wocao",sout[2]="rname=guowl"
//第一次,使用";"分割,分割后,g_out1[1]="rid=123",g_out1[2]="rname=guowl"
for (int i=0;i<iNum && iNum>=2;++i)
{
memset(g_out2,0,sizeof(g_out2));
int iNum1=splitStr(g_out1[i],"==",g_out2);//第二次用“=”分割,分割后的结果赋值给out1二维数组,iNum1只能=2,因为一个=,就把rid=123分割成了两部分
if (iNum1==2 && (Param(g_out2[0])==IN || Param(g_out2[0])==INOUT)) {
if(strncmp(Stype,"FML",3)==0) {
if(SetSendFmlBuffer(g_out2[0],g_out2[1],p)==-1) {
memset(sTmp1,0,sizeof(sTmp1));
sprintf(sTmp1," || FML缓冲区第%d个soap请求的业务成员赋值给isalt对应的v1~v50失败;",i);
m+=sTmp1;
return -1;
}
continue;
}
if(strncmp(Stype,"VIEW",4)==0 && gv.GetData(g_out2[0],g_out2[1])==0)//GetData是View这个类的一个函数,分别实现了v1~v50的赋值
{
memset(sTmp1,0,sizeof(sTmp1));
sprintf(sTmp1," || 第%d个soap请求的业务成员赋值给isalt对应的v1~v50成功;",i);
m+=sTmp1;
continue;
}
}
}
return 0;
}
//好了,分析本次请求入参的数据就到这里了。。下面我们看一下怎么分配6种缓冲区以及分配发送和接受的STRING类型缓冲:
int TuxPost::StringSrc()//分配string类型的发送缓冲区
{
if(TuxInit()==false)
{//判断是否已经连接上tuxedo
m_status=-1;
m+=" || isalt初始化连接诶tuxedo失败,请检查wsnaddr的配置,在isalt.def里面";
return -1;
}
if(strcmp(Stype,"STRING")==0)
s_SendBuff=tpalloc("STRING", NULL, BUFFLEN*sizeof(char));
if(s_SendBuff==NULL)
{
m_status=-1;
m_Errno=tperrno;
m+="||分配string类型发送往tuxedo内存出错可能是申请的空间太大,系统内存不足!";
m+=" || 分配string类型发送往tuxedo内存内存成功";
return 0;
}
int TuxPost::StringDest()//分配string类型的接收缓冲区
{
if(StringSrc()==-1)
{//是嵌套的。。。
m_status=-1;
m+=" || isalt初始化连接诶tuxedo失败,请检查wsnaddr的配置,在isalt.def里面或者STRING分配的内存空间太大";
return -1;
}
s_RecBuff=tpalloc("STRING",NULL,BUFFLEN*sizeof(char));
if(s_RecBuff==NULL)
{
m_status=-1;
m_Errno = tperrno;
m+="||分配STRING类型缓冲区接收tuxedo内存出错可能是申请的空间太大,没有足够的内存可以? 褂?";
return -1;
}
return 0;
}
//注意VIEW32缓冲区,都是使用了CARRAY类型的缓冲区。
int TuxPost::ViewSrc()//分配view32类型的发送缓冲区
{
if(TuxInit()==false)
{
m_status=-1;
m+="||isalt初始化连接诶tuxedo失败,请检查wsnaddr的配置,在isalt.def里面";
return -1;
}
v_SendBuff=tpalloc("CARRAY", NULL, BUFFLEN*sizeof(char)+1);
if(v_SendBuff==NULL)
{
m_status=-1;
m_Errno=tperrno;
m+="||分配view32类型发送往tuxedo内存内存出错可能是申请的空间太大,系统内存不足!";
m+="||分配view32类型发送往tuxedo内存成功";
return 0;
}
int TuxPost::ViewDest()//分配view32类型的接收缓冲区
{
if(ViewSrc()==-1)
{
m_status=-1;
m+="||isalt初始化连接诶tuxedo失败,请检查wsnaddr的配置,在isalt.def里面,或者view分配的内存空间太大";
return -1;
}
v_RecBuff=tpalloc("CARRAY", NULL, BUFFLEN*sizeof(char)+1);
if(v_RecBuff==NULL)
{
m_status=-1;
m_Errno=tperrno;
m+="||分配内存出错可能是申请的空间太大,系统内存不足!";
m+="||分配VIEW32缓冲区内存成功";
return 0;
}
int TuxPost::FmlSrc()//分配fml32类型的发送缓冲区
{
if(TuxInit()==false)
{
m_status=-1;
m+="||isalt初始化连接诶tuxedo失败,请检查wsnaddr的配置,在isalt.def里面";
return -1;
}
f_SendBuff=tpalloc("FML32", NULL, BUFFLEN*sizeof(char)+1);
if(f_SendBuff==NULL)
{
m_status=-1;
m_Errno=tperrno;
m+="||分配fml32类型发送往tuxedo内存出错可能是申请的空间太大,系统内存不足!";
m+=" || 分配fml32类型缓冲区发送往tuxedo内存成功";
return 0;
}
int TuxPost::FmlDest()//分配fml32类型的接收缓冲区
{
if(CheckFmlTables()==-1)
{
m_status=-1;
m+=" || 验证域表文件出错,请核查";
return -1;
}
if(FmlSrc()==-1)
{
m_status=-1;
m+="||isalt分配fml缓冲区失败,请检查配置信息,有可能是wsnaddr错误或者需要分配的内存";
return -1;
}
f_RecBuff=tpalloc("FML32", NULL, BUFFLEN*sizeof(char)+1);
if(f_RecBuff==NULL)
{
m_status=-1;
m_Errno=tperrno;
m+="||分配fml32类型接收tuxedo返回结果内存出错可能是申请的空间太大,系统内存不足!";
m+=" || 分配fml32类型接收tuxedo返回结果存成功";
return 0;
}
//六:下面我们开始针对6种缓冲区进行分别填充。
int TuxPost::BufferStringSend()
{
if(gview.instr=="") {
m+="|| 发送给tuxedo请求数据为空,请检查,原因可能是业务数据成员和isalt.def里面配置的不正 确导致,请检查";
return-1;
} //在CallAnaly这个函数中,我们知道,STRING类型,是吧请求的数据赋值到了:
// gview.instr这个对象上面。。。。所以,你懂得。直接复制即可。
if(s_SendBuff!=NULL) {
memcpy(s_SendBuff,gview.instr.c_str(),gview.instr.size());
s_SendBuff[gview.instr.size()]=0;
m+=" || 填充string类型缓冲区成功";
}
return 0;
}
int Veiw::GetData(char *data,char *value) //将业务数据向isalt成员做转化,输入业务名称和值,做了20次对比
{
map<string,VeiwType>::iterator it=theView.begin();
string tmp="v";
int i=1;
while (it!=theView.end())
{
if(strncmp(data,it->second.name.c_str(),sizeof(data))==0) {
//如果data和theView容器里面的name的取值相同
tmp+=IntToString(i);//这里构造v1...v2...v3等等,i是不停的++
Vinbufmap.insert(map<string,string>::value_type(tmp,value)); //插入Vinbufmap里面分别是(v1,123) (v2,"nihao")等信息
}
++it;
++i;
}
return 0;
}