?? symbol2.c
字號:
if (p->info.typ->type == Tfun && has_ns_eq(ns, p->sym->name)) { fprintf(fd, " <operation name=\"%s\">\n <documentation>Service definition of function %s</documentation>\n <input message=\"tns:%sRequest\"/>\n", ns_remove(p->sym->name), p->sym->name, ns_remove(p->sym->name)); q = (Entry*)p->info.typ->ref; if (q && is_transient(q->info.typ)) ; else if (q && !is_response(q->info.typ)) fprintf(fd, " <output message=\"tns:%sResponse\"/>\n", ns_remove(p->sym->name)); else if (q) fprintf(fd, " <output message=\"tns:%s\"/>\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); fprintf(fd, " </operation>\n"); } fprintf(fd, "</portType>\n\n"); if (encoding && !strcmp(encoding, "literal")) fprintf(fd, "<binding name=\"%sBinding\" type=\"tns:%sPortType\">\n <SOAP:binding style=\"document\" transport=\"http://schemas.xmlsoap.org/soap/http\"/>\n", name, name); else fprintf(fd, "<binding name=\"%sBinding\" type=\"tns:%sPortType\">\n <SOAP:binding style=\"rpc\" transport=\"http://schemas.xmlsoap.org/soap/http\"/>\n", name, name); fflush(fd); for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && has_ns_eq(ns, p->sym->name)) { fprintf(fd, " <operation name=\"%s\">\n", ns_remove(p->sym->name)); if (encoding && !strcmp(encoding, "literal")) fprintf(fd, " <SOAP:operation soapAction=\"%s#%s\" style=\"document\"/>\n", URI, ns_remove(p->sym->name)); else fprintf(fd, " <SOAP:operation soapAction=\"%s#%s\"/>\n", URI, ns_remove(p->sym->name)); q = entry(classtable, p->sym); if (encoding && !strcmp(encoding, "literal") || q && (q = (((Table*)q->info.typ->ref)->list)) && q && is_XML(q->info.typ)) fprintf(fd, " <input>\n <SOAP:body use=\"literal\"/>\n"); else if (encoding) fprintf(fd, " <input>\n <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encoding); else fprintf(fd, " <input>\n <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"/>\n", URI); if (custom_header) { Method *m = NULL; int f = 0; char *s; if (sp && (s = strstr(p->sym->name, "__"))) for (m = sp->list; m; m = m->next) if (!strcmp(m->name, s+2) && (m->mess&HDRIN)) { f = 1; fprintf(fd, " <SOAP:header use=\"encoded\" namespace=\"%s\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" message=\"tns:%sHeader\" part=\"%s\"/>\n", nsofhdr(m->part), name, ns_remove(m->part)); } if (!f && !sp) fprintf(fd, " <SOAP:header use=\"encoded\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" message=\"tns:%sHeader\"/>\n", name); } if (custom_fault) fprintf(fd, " <SOAP:fault use=\"encoded\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" message=\"tns:%sFault\"/>\n", name); fprintf(fd, " </input>\n"); q = (Entry*)p->info.typ->ref; if (!q || !q->info.typ->ref) { fprintf(fd, " </operation>\n"); continue; } if (encoding && !strcmp(encoding, "literal") || is_XML(q->info.typ->ref)) fprintf(fd, " <output>\n <SOAP:body use=\"literal\"/>\n"); else if (encoding) fprintf(fd, " <output>\n <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"%s\"/>\n", URI, encoding); else fprintf(fd, " <output>\n <SOAP:body use=\"encoded\" namespace=\"%s\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"/>\n", URI); if (custom_header) { Method *m = NULL; int f = 0; char *s; if (sp && (s = strstr(p->sym->name, "__"))) for (m = sp->list; m; m = m->next) if (!strcmp(m->name, s+2) && (m->mess&HDROUT)) { f = 1; fprintf(fd, " <SOAP:header use=\"encoded\" namespace=\"%s\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" message=\"tns:%sHeader\" part=\"%s\"/>\n", nsofhdr(m->part), name, ns_remove(m->part)); } if (!f & !sp) fprintf(fd, " <SOAP:header use=\"encoded\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" message=\"tns:%sHeader\"/>\n", name); } if (custom_fault) fprintf(fd, " <SOAP:fault use=\"encoded\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" message=\"tns:%sFault\"/>\n", name); fprintf(fd, " </output>\n </operation>\n"); fflush(fd); } fprintf(fd, "</binding>\n\n"); } fprintf(fd, "<service name=\"%s\">\n <documentation>gSOAP "VERSION" generated service definition</documentation>\n <port name=\"%sPort\" binding=\"tns:%sBinding\">\n <SOAP:address location=\"%s/%s\"/>\n </port>\n</service>\n\n</definitions>\n", name, name, name, URL, executable);}voidgen_schema(FILE *fd, Table *t, char *ns1, char *ns, int all, int wsdl, char *URL){ int i, d; char cbuf[4]; Entry *p, *q; Tnode *n; Symbol *s; Service *sp; fprintf(fd, " <schema\n xmlns=\"http://www.w3.org/2001/XMLSchema\"\n xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"\n xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\"\n"); for (sp = services; sp; sp = sp->next) if (!strcmp(sp->ns, ns) && sp->URI) break; if (sp) fprintf(fd, " targetNamespace=\"%s\"", sp->URI); else fprintf(fd, " targetNamespace=\"%s/%s.xsd\"", URL, ns_convert(ns)); for (s = nslist; s; s = s->next) { for (sp = services; sp; sp = sp->next) if (!strcmp(sp->ns, s->name) && sp->URI) break; if (sp) fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp->URI); else fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), URL, ns_convert(s->name)); } fprintf(fd, ">\n\n"); if (typetable) for (p = typetable->list; p; p = p->next) { if (!is_transient(p->info.typ) && ((has_ns_eq(ns, p->sym->name)))) { fprintf(fd, " <simpleType name=\"%s\">\n <restriction base=\"xsd:%s\">\n", ns_remove(p->sym->name), the_type(p->info.typ)); fprintf(fd, " </restriction>\n </simpleType>\n\n"); } } if (enumtable) for (p = enumtable->list; p; p = p->next) { if (!is_transient(p->info.typ) && (!has_ns(p->info.typ) && all || has_ns_eq(ns, p->sym->name))) { if (is_mask(p->info.typ)) { fprintf(fd, " <simpleType name=\"%s\">\n <list>\n <restriction base=\"xsd:string\">\n", wsdl_type(p->info.typ, NULL)); if ((Table*)p->info.typ->ref) for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) fprintf(fd, " <enumeration value=\"%s\"/>\n", ns_convert(q->sym->name)); fprintf(fd, " </restriction>\n </list>\n </simpleType>\n\n"); } else { fprintf(fd, " <simpleType name=\"%s\">\n <restriction base=\"xsd:string\">\n", wsdl_type(p->info.typ, NULL)); if ((Table*)p->info.typ->ref) for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) fprintf(fd, " <enumeration value=\"%s\"/>\n", ns_convert(q->sym->name)); fprintf(fd, " </restriction>\n </simpleType>\n\n"); } } } if (classtable) for (p = classtable->list; p; p = p->next) if (p->info.typ->ref && !is_transient(p->info.typ) && !is_binary(p->info.typ) && !is_primclass(p->info.typ)) { q = ((Table*)p->info.typ->ref)->list; if (entry(t, p->sym) && q && !is_XML(q->info.typ)) ; else if (is_dynamic_array(p->info.typ)) if (!has_ns(p->info.typ) && !is_untyped(p->info.typ)) { if (all) if (wsdl) { d = get_Darraydims(p->info.typ)-1; for (i = 0; i < d; i++) cbuf[i] = ','; cbuf[i] = '\0'; fprintf(fd, " <complexType name=\"%s\">\n <complexContent>\n <restriction base=\"SOAP-ENC:Array\">\n <element name=\"%s\" type=\"%s\" maxOccurs=\"unbounded\"/>\n <attribute ref=\"SOAP-ENC:arrayType\" WSDL:arrayType=\"%s[%s]\"/>\n </restriction>\n </complexContent>\n </complexType>\n\n", wsdl_type(p->info.typ, NULL), q->sym->name[5]?ns_convert(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), wsdl_type(q->info.typ, ns1), cbuf); } else fprintf(fd, " <complexType name=\"%s\">\n <complexContent>\n <restriction base=\"SOAP-ENC:Array\">\n <element name=\"%s\" type=\"%s\" maxOccurs=\"unbounded\"/>\n </restriction>\n </complexContent>\n </complexType>\n\n", wsdl_type(p->info.typ, NULL), q->sym->name[5]?ns_convert(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1)); } else { fprintf(fd, " <complexType name=\"%s\">\n <sequence>\n <element name=\"%s\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\"/>\n </sequence>\n </complexType>\n\n", ns_remove(p->sym->name), q->sym->name[5]?ns_convert(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1)); } else if (p->info.typ->type == Tstruct && (!has_ns(p->info.typ) && all || has_ns_eq(ns, p->sym->name))) { if (p->info.typ->ref) { fprintf(fd, " <complexType name=\"%s\">\n <all>\n", ns_remove(p->sym->name)); for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) if (is_transient(q->info.typ) || q->info.typ->type == Tfun) continue; else if (is_repetition(q)) { if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) if (q->info.maxOccurs == 1) fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\"/>\n", ns_convert(q->next->sym->name), wsdl_type(q->next->info.typ->ref, ns1)); else fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"%d\" maxOccurs=\"%d\" nillable=\"true\"/>\n", ns_convert(q->next->sym->name), wsdl_type(q->next->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs); else if (q->info.maxOccurs == 1) fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n", ns_convert(q->next->sym->name), wsdl_type(q->next->info.typ->ref, ns1)); else fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"%d\" maxOccurs=\"%d\"/>\n", ns_convert(q->next->sym->name), wsdl_type(q->next->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs); q = q->next; } else if (q->info.typ->type == Tpointer || q->info.typ->type == Tarray || is_dynamic_array(q->info.typ)) fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"%d\" maxOccurs=\"%d\" nillable=\"true\"/>\n", ns_convert(q->sym->name), wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs); else fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"%d\" maxOccurs=\"%d\"/>\n", ns_convert(q->sym->name), wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs); fprintf(fd, " </all>\n </complexType>\n\n"); } } else if (p->info.typ->type == Tclass && (!has_ns(p->info.typ) && all || has_ns_eq(ns, p->sym->name))) { if (p->info.typ->ref) if (((Table*)p->info.typ->ref)->prev && !is_transient(entry(classtable, ((Table*)p->info.typ->ref)->prev->sym)->info.typ)) { fprintf(fd, " <complexType name=\"%s\">\n <complexContent>\n <extension base=\"%s\">\n <sequence>\n", ns_remove(p->sym->name), ns_convert(((Table*)p->info.typ->ref)->prev->sym->name)); for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) if (is_transient(q->info.typ) || q->info.typ->type == Tfun) continue; else if (is_repetition(q)) { if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) if (q->info.maxOccurs == 1) fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\"/>\n", ns_overridden(p->info.typ->ref, q->next), wsdl_type(q->next->info.typ->ref, ns1)); else fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"%d\" maxOccurs=\"%d\" nillable=\"true\"/>\n", ns_overridden(p->info.typ->ref, q->next), wsdl_type(q->next->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs); else if (q->info.maxOccurs == 1) fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n", ns_overridden(p->info.typ->ref, q->next), wsdl_type(q->next->info.typ->ref, ns1)); else fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"%d\" maxOccurs=\"%d\"/>\n", ns_overridden(p->info.typ->ref, q->next), wsdl_type(q->next->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs); q = q->next; } else if (q->info.typ->type == Tpointer || q->info.typ->type == Tarray || is_dynamic_array(q->info.typ)) fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"%d\" maxOccurs=\"%d\" nillable=\"true\"/>\n", ns_overridden(p->info.typ->ref, q), wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs); else fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"%d\" maxOccurs=\"%d\"/>\n", ns_overridden(p->info.typ->ref, q), wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs); fprintf(fd, " </sequence>\n </extension>\n </complexContent>\n </complexType>\n\n"); } else { fprintf(fd, " <complexType name=\"%s\">\n <sequence>\n", ns_remove(p->sym->name)); for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) if (is_transient(q->info.typ) || q->info.typ->type == Tfun) continue; else if (is_repetition(q)) { if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\"/>\n", ns_convert(q->next->sym->name), wsdl_type(q->next->info.typ->ref, ns1)); else fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n", ns_convert(q->next->sym->name), wsdl_type(q->next->info.typ->ref, ns1)); q = q->next; } else if (q->info.typ->type == Tpointer || q->info.typ->type == Tarray || is_dynamic_array(q->info.typ)) fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"%d\" maxOccurs=\"%d\" nillable=\"true\"/>\n", ns_convert(q->sym->name), wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs); else fprintf(fd, " <element name=\"%s\" type=\"%s\" minOccurs=\"%d\" maxOccurs=\"%d\"/>\n", ns_convert(q->sym->name), wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs); fprintf(fd, " </sequence>\n </complexType>\n\n"); } } } for (n = Tptr[Tarray]; n; n = n->next) { if (is_transient(n)) continue; else if (wsdl) fprintf(fd, " <complexType name=\"%s\">\n <complexContent>\n <restriction base=\"SOAP-ENC:Array\">\n <attribute ref=\"SOAP-ENC:arrayType\" WSDL:arrayType=\"%s\"/>\n </restriction>\n </complexContent>\n </complexType>\n\n", c_ident(n), xsi_type(n)); else fprintf(fd, " <complexType name=\"%s\">\n <complexContent>\n <restriction base=\"SOAP-ENC:Array\">\n <element name=\"item\" type=\"%s\" maxOccurs=\"unbounded\"/>\n </restriction>\n </complexContent>\n </complexType>\n\n", c_ident(n), xsi_type(n->ref)); } fprintf(fd, " </schema>\n");}char *emalloc(unsigned int n){ char *p; if ((p = (char*)malloc(n)) == (char*)0) execerror("out of memory"); return p;}voidfunction_input_output(Table *table){ int i=1; Entry * p; fprintf(fserver,"\n\nSOAP_FMAC1 int SOAP_FMAC2 soap_serve(struct soap *soap)\n{"); fprintf(fserver,"\n\tsoap_begin(soap);"); fprintf(fserver,"\n\tsoap_fault(soap);"); fprintf(fserver,"\n\tif (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap))\n\t\treturn soap_send_fault(soap);"); for (p = table->list; p != (Entry*) 0; p = p->next) { if(p->info.typ->type==Tfun) { if(i == 1){ /* First method to be called */ fprintf(fserver,"\n\n\tsoap->error = soap_serve_%s(soap);", p->sym->name); } else{ /* Methods following other methods */ fprintf(fserver,"\n\tif (soap->error == SOAP_NO_METHOD)"); fprintf(fserver,"\n\t\tsoap_serve_%s(soap);", p->sym->name); } i++; } } fprintf(fserver,"\n\tif (soap->error)"); fprintf(fserver,"\n\t\treturn soap_send_fault(soap);"); fprintf(fserver,"\n\treturn soap->error;"); fprintf(fserver,"\n}"); fprintf(fheader, "\n\n/* Remote Methods */"); for (p = table->list; p != (Entry*) 0; p = p->next) if(p->info.typ->type==Tfun) generate_proto(table, p); fprintf(fheader, "\n\n/* Stubs */"); for (p = table->list; p != (Entry*) 0; p = p->next) if(p->info.typ->type==Tfun) generate_call(table, p); fprintf(fheader, "\n\n/* Skeletons */"); for (p = table->list; p != (Entry*) 0; p = p->next) if(p->info.typ->type==Tfun) generate_server(table, p);}voidgenerate_proto(Table *table, Entry *param){ Entry *pin,*q,*pout; Table *output,*t; q=entry(table, param->sym); if (q) pout = (Entry*)q->info.typ->ref; else fprintf(stderr, "Internal error: no table entry\n"); q=entry(classtable, param->sym); output=(Table*) q->info.typ->ref;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -