📄 service.cpp
字号:
} t = types.deftypemap["SOAP_ENV__Detail"]; if (t && *t) { banner("Custom SOAP Detail"); types.format(t); } else if (!jflag && !faults.empty()) { SetOfString fault_elements; banner("SOAP Fault Detail"); fprintf(stream, "/**\n\nThe SOAP Fault is part of the gSOAP context and its content is accessed\nthrough the soap.fault->detail variable (SOAP 1.1) or the\nsoap.fault->SOAP_ENV__Detail variable (SOAP 1.2).\nUse option -j to omit.\n\n*/\n"); fprintf(stream, "struct SOAP_ENV__Detail\n{\n"); types.modify("SOAP_ENV__Detail"); fprintf(stream, elementformat, "int", "__type"); fprintf(stream, ";\t///< set to SOAP_TYPE_X for a serializable type X\n"); fprintf(stream, pointerformat, "void", "fault"); fprintf(stream, ";\t///< points to serializable object X or NULL\n"); if (dflag) { fprintf(stream, pointerformat, "xsd__anyType", "__any"); fprintf(stream, ";\t///< Catch any element content in DOM.\n"); } else { fprintf(stream, elementformat, "_XML", "__any"); fprintf(stream, ";\t///< Catch any element content in XML string.\n"); } for (MapOfStringToMessage::const_iterator fault = faults.begin(); fault != faults.end(); ++fault) { if ((*fault).second->URI && !types.uris[(*fault).second->URI]) fprintf(stream, schemaformat, types.nsprefix(NULL, (*fault).second->URI), "namespace", (*fault).second->URI); comment("Fault", (*fault).first, "WSDL", (*fault).second->ext_documentation); comment("Fault", (*fault).first, "SOAP", (*fault).second->documentation); if ((*fault).second->use == literal) { for (vector<wsdl__part>::const_iterator part = (*fault).second->message->part.begin(); part != (*fault).second->message->part.end(); ++part) { if ((*part).elementPtr()) { if (fault_elements.find((*part).element) == fault_elements.end()) { if ((*part).elementPtr()->type) fprintf(stream, elementformat, types.pname(true, NULL, NULL, (*part).elementPtr()->type), types.aname(NULL, (*fault).second->URI, (*part).element)); else fprintf(stream, elementformat, types.pname(true, "_", NULL, (*part).element), types.aname(NULL, (*fault).second->URI, (*part).element)); fprintf(stream, ";\n"); fault_elements.insert((*part).element); } fprintf(stream, "///< SOAP Fault element \"%s\" part \"%s\"\n", (*part).element?(*part).element:"", (*part).name?(*part).name:""); } else if ((*part).name && (*part).type) { if (fault_elements.find((*part).name) == fault_elements.end()) { fprintf(stream, elementformat, types.pname(true, NULL, NULL, (*part).type), types.aname("_", (*fault).second->URI, (*part).name)); fprintf(stream, ";\n"); fault_elements.insert((*part).name); } fprintf(stream, "///< SOAP Fault type \"%s\" part \"%s\"\n", (*part).type, (*part).name); } else fprintf(stream, "// Unknown SOAP Fault element \"%s\" part \"%s\"\n", (*fault).second->message->name, (*part).name?(*part).name:""); } } else { fprintf(stream, pointerformat, (*fault).first, types.aname(NULL, (*fault).second->URI, (*fault).second->message->name)); fprintf(stream, ";\t///< SOAP Fault detail message \"%s\":%s\n", (*fault).second->URI, (*fault).second->message->name); } } fprintf(stream, "};\n"); } /* The SOAP Fault struct below is autogenerated by soapcpp2 (kept here for future mods) if (!mflag && !faults.empty()) { fprintf(stream, "struct SOAP_ENV__Code\n{\n"); fprintf(stream, elementformat, "_QName", "SOAP_ENV__Value"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "SOAP_ENV__Node"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "SOAP_ENV__Role"); fprintf(stream, ";\n};\n"); fprintf(stream, "struct SOAP_ENV__Detail\n{\n"); fprintf(stream, elementformat, "int", "__type"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "void", "fault"); fprintf(stream, ";\n"); fprintf(stream, elementformat, "_XML", "__any"); fprintf(stream, ";\n};\n"); fprintf(stream, "struct SOAP_ENV__Fault\n{\n"); fprintf(stream, elementformat, "_QName", "faultcode"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "faultstring"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "faultactor"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "struct SOAP_ENV__Detail", "detail"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "struct SOAP_ENV__Code", "SOAP_ENV__Code"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "SOAP_ENV__Reason"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "struct SOAP_ENV__Detail", "SOAP_ENV__Detail"); fprintf(stream, ";\n};\n"); } */ for (MapOfStringToService::const_iterator service2 = services.begin(); service2 != services.end(); ++service2) if ((*service2).second) (*service2).second->generate(types);}//////////////////////////////////////////////////////////////////////////////////// Service methods//////////////////////////////////////////////////////////////////////////////////Service::Service(){ prefix = NULL; URI = NULL; name = NULL; type = NULL; transport = NULL;}void Service::generate(Types& types){ if (name) banner(name); for (vector<Operation*>::const_iterator op2 = operation.begin(); op2 != operation.end(); ++op2) { if (*op2 && (*op2)->input) { bool flag = false, anonymous = ((*op2)->style != document && (*op2)->parameterOrder != NULL); banner((*op2)->input_name); if ((*op2)->output && (*op2)->output_name) { if ((*op2)->style == document) flag = (*op2)->output->message && (*op2)->output->message->part.size() == 1; else if (!wflag) flag = (*op2)->output->message && (*op2)->output->use == encoded && (*op2)->output->message->part.size() == 1 && !(*(*op2)->output->message->part.begin()).simpleTypePtr() && !(*(*op2)->output->message->part.begin()).complexTypePtr(); if (flag && (*op2)->input->message && (*(*op2)->output->message->part.begin()).element) for (vector<wsdl__part>::const_iterator part = (*op2)->input->message->part.begin(); part != (*op2)->input->message->part.end(); ++part) if ((*part).element && !strcmp((*part).element, (*(*op2)->output->message->part.begin()).element)) flag = false; if (!flag) { fprintf(stream, "/// Operation response struct \"%s\" of service binding \"%s\" operation \"%s\"\n", (*op2)->output_name, name, (*op2)->input_name); fprintf(stream, "struct %s\n{", (*op2)->output_name); (*op2)->output->generate(types, ";", anonymous, true, false); fprintf(stream, "\n};\n"); } } fprintf(stream, "\n/// Operation \"%s\" of service binding \"%s\"\n\n/**\n\nOperation details:\n\n", (*op2)->input_name, name); if ((*op2)->documentation) text((*op2)->documentation); if ((*op2)->operation_documentation) text((*op2)->operation_documentation); if ((*op2)->input->documentation) { fprintf(stream, "Input request:\n"); text((*op2)->input->documentation); } if ((*op2)->input->ext_documentation) { fprintf(stream, "Input request:\n"); text((*op2)->input->ext_documentation); } if ((*op2)->output) { if ((*op2)->output->documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->documentation); } if ((*op2)->output->ext_documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->ext_documentation); } } if ((*op2)->output) { if ((*op2)->output->content) { fprintf(stream, " - Response has MIME content"); if ((*op2)->output->content->type) { fprintf(stream, " type=\""); text((*op2)->output->content->type); fprintf(stream, "\""); } fprintf(stream, "\n TODO: this form of MIME content response is not automatically handled.\n Use one-way request and implement code to parse response.\n"); } } else fprintf(stream, " - One-way message\n"); if ((*op2)->style == document) fprintf(stream, " - SOAP document/literal style\n"); else { if ((*op2)->input->use == literal) fprintf(stream, " - SOAP RPC literal style\n"); else if ((*op2)->input->encodingStyle) fprintf(stream, " - SOAP RPC encodingStyle=\"%s\"\n", (*op2)->input->encodingStyle); else fprintf(stream, " - SOAP RPC encoded\n"); } if ((*op2)->output) { if ((*op2)->input->use != (*op2)->output->use) { if ((*op2)->output->use == literal) fprintf(stream, " - SOAP RPC literal response\n"); else if ((*op2)->output->encodingStyle) fprintf(stream, " - SOAP RPC response encodingStyle=\"%s\"\n", (*op2)->output->encodingStyle); else fprintf(stream, " - SOAP RPC encoded response\n"); } } if ((*op2)->soapAction) { if (*(*op2)->soapAction) fprintf(stream, " - SOAP action=\"%s\"\n", (*op2)->soapAction); } for (vector<Message*>::const_iterator message = (*op2)->fault.begin(); message != (*op2)->fault.end(); ++message) { if ((*message)->use == literal) { for (vector<wsdl__part>::const_iterator part = (*message)->message->part.begin(); part != (*message)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, " - SOAP Fault: %s (literal)\n", (*part).element); else if ((*part).name && (*part).type) fprintf(stream, " - SOAP Fault: %s (literal)\n", (*part).name); } } else if ((*message)->message && (*message)->message->name) fprintf(stream, " - SOAP Fault: %s\n", (*message)->name); } if (!(*op2)->input->header.empty()) fprintf(stream, " - Request message has mandatory header part(s):\n"); for (vector<soap__header>::const_iterator inputheader = (*op2)->input->header.begin(); inputheader != (*op2)->input->header.end(); ++inputheader) { if ((*inputheader).part) { if ((*inputheader).use == encoded && (*inputheader).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*inputheader).namespace_, (*inputheader).part)); else if ((*inputheader).partPtr() && (*inputheader).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*inputheader).partPtr()->element)); } } if ((*op2)->input->multipartRelated) { int k = 2; fprintf(stream, " - Request message has MIME multipart/related attachments:\n"); for (vector<mime__part>::const_iterator part = (*op2)->input->multipartRelated->part.begin(); part != (*op2)->input->multipartRelated->part.end(); ++part) { if ((*part).soap__body_) { fprintf(stream, " -# MIME attachment with SOAP Body and mandatory header part(s):\n"); for (vector<soap__header>::const_iterator header = (*part).soap__header_.begin(); header != (*part).soap__header_.end(); ++header) { if ((*header).part) { if ((*header).use == encoded && (*header).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*header).namespace_, (*header).part)); else if ((*header).partPtr() && (*header).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*header).partPtr()->element)); } } } else { fprintf(stream, " -# MIME attachment %d:\n", k++); for (vector<mime__content>::const_iterator content = (*part).content.begin(); content != (*part).content.end(); ++content) { fprintf(stream, " -"); if ((*content).part) { fprintf(stream, " part=\""); text((*content).part); fprintf(stream, "\""); } if ((*content).type) { fprintf(stream, " type=\""); text((*content).type); fprintf(stream, "\""); } fprintf(stream, "\n"); } } } } if ((*op2)->input->layout) fprintf(stream, " - Request message has DIME attachments in compliance with %s\n", (*op2)->input->layout); if ((*op2)->output) { if (!(*op2)->output->header.empty()) fprintf(stream, " - Response message has mandatory header part(s):\n"); for
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -