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;
}