SOAP_FMAC2 soap_in_xsd__anyAttribute(struct soap *soap, const char *tag, struct soap_dom_attribute *node, const char *type) { struct soap_attribute *tp; struct soap_dom_attribute *tmp = node; struct soap_dom_attribute *att = node; (void)tag; (void)type; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { if (!att) { att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (tmp) tmp->next = att; else node = att; tmp = att; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node attribute='%s'\n", tp->name)); if (!att) { soap->error = SOAP_EOM; return NULL; } att->next = NULL; att->nstr = soap_current_namespace(soap, tp->name); if ((soap->mode & SOAP_DOM_ASIS) || !strncmp(tp->name, "xml", 3)) att->name = soap_strdup(soap, tp->name); else { char *s = strchr(tp->name, ':'); if (s) att->name = soap_strdup(soap, s+1); else att->name = soap_strdup(soap, tp->name); } if (tp->visible == 2) att->data = soap_strdup(soap, tp->value); else att->data = NULL; att->wide = NULL; att->soap = soap; att = NULL; } } return node; }
SOAP_FMAC2 soap_in_xsd__anyType(struct soap *soap, const char *tag, struct soap_dom_element *node, const char *type) { register struct soap_attribute *tp; register struct soap_dom_attribute **att; if (soap_peek_element(soap)) { if (soap->error != SOAP_NO_TAG) return NULL; if (!node) { if (!(node = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)))) { soap->error = SOAP_EOM; return NULL; } } soap_default_xsd__anyType(soap, node); if (!(node->data = soap_string_in(soap, 1, -1, -1)) || !*node->data) return NULL; soap->error = SOAP_OK; return node; } if (!node) { if (!(node = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)))) { soap->error = SOAP_EOM; return NULL; } } soap_default_xsd__anyType(soap, node); node->nstr = soap_current_namespace(soap, soap->tag); if ((soap->mode & SOAP_DOM_ASIS)) node->name = soap_strdup(soap, soap->tag); else { char *s = strchr(soap->tag, ':'); if (s) node->name = soap_strdup(soap, s+1); else node->name = soap_strdup(soap, soap->tag); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' parsed in namespace '%s'\n", node->name, node->nstr?node->nstr:"")); if ((soap->mode & SOAP_DOM_NODE) || (!(soap->mode & SOAP_DOM_TREE) && *soap->id)) { if ((node->node = soap_getelement(soap, &node->type))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node contains type %d from xsi:type\n", node->type)); return node; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = SOAP_OK; else return NULL; } att = &node->atts; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node attribute='%s' parsed\n", tp->name)); *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (!*att) { soap->error = SOAP_EOM; return NULL; } (*att)->next = NULL; (*att)->nstr = soap_current_namespace(soap, tp->name); if ((soap->mode & SOAP_DOM_ASIS) || !strncmp(tp->name, "xml", 3)) (*att)->name = soap_strdup(soap, tp->name); else { char *s = strchr(tp->name, ':'); if (s) (*att)->name = soap_strdup(soap, s+1); else (*att)->name = soap_strdup(soap, tp->name); } if (tp->visible == 2) (*att)->data = soap_strdup(soap, tp->value); else (*att)->data = NULL; (*att)->wide = NULL; (*att)->soap = soap; att = &(*att)->next; tp->visible = 0; } } soap_element_begin_in(soap, NULL, 1, NULL); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' pulled\n", node->name)); if (soap->body) { if (!soap_peek_element(soap)) { struct soap_dom_element **elt; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' has subelements\n", node->name)); elt = &node->elts; for (;;) { if (!(*elt = soap_in_xsd__anyType(soap, NULL, NULL, NULL))) { if (soap->error != SOAP_NO_TAG) return NULL; soap->error = SOAP_OK; break; } (*elt)->prnt = node; elt = &(*elt)->next; } } else if (soap->error == SOAP_NO_TAG) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' has cdata\n", node->name)); if ((soap->mode & SOAP_C_UTFSTRING) || (soap->mode & SOAP_C_MBSTRING)) { if (!(node->data = soap_string_in(soap, 1, -1, -1))) return NULL; } else if (!(node->wide = soap_wstring_in(soap, 1, -1, -1))) return NULL; } else return NULL; if (soap_element_end_in(soap, node->name)) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of DOM node '%s'\n", node->name)); } return node; }