SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, int *type) { if (soap_peek_element(soap)) return NULL; if (!*soap->id || !(*type = soap_lookup_type(soap, soap->id))) *type = soap_lookup_type(soap, soap->href); switch (*type) { case SOAP_TYPE_byte: return soap_in_byte(soap, NULL, NULL, "xsd:byte"); case SOAP_TYPE_int: return soap_in_int(soap, NULL, NULL, "xsd:int"); case SOAP_TYPE_SOAP_ENV__Reason: return soap_in_SOAP_ENV__Reason(soap, NULL, NULL, "SOAP-ENV:Reason"); case SOAP_TYPE_PointerToSOAP_ENV__Reason: return soap_in_PointerToSOAP_ENV__Reason(soap, NULL, NULL, "SOAP-ENV:Reason"); case SOAP_TYPE__QName: { char **s; s = soap_in__QName(soap, NULL, NULL, "QName"); return s ? *s : NULL; } case SOAP_TYPE_string: { char **s; s = soap_in_string(soap, NULL, NULL, "xsd:string"); return s ? *s : NULL; } default: { const char *t = soap->type; if (!*t) t = soap->tag; if (!soap_match_tag(soap, t, "xsd:byte")) { *type = SOAP_TYPE_byte; return soap_in_byte(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:int")) { *type = SOAP_TYPE_int; return soap_in_int(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "SOAP-ENV:Reason")) { *type = SOAP_TYPE_SOAP_ENV__Reason; return soap_in_SOAP_ENV__Reason(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "QName")) { char **s; *type = SOAP_TYPE__QName; s = soap_in__QName(soap, NULL, NULL, NULL); return s ? *s : NULL; } if (!soap_match_tag(soap, t, "xsd:string")) { char **s; *type = SOAP_TYPE_string; s = soap_in_string(soap, NULL, NULL, NULL); return s ? *s : NULL; } } } soap->error = SOAP_TAG_MISMATCH; return NULL; }
SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, int *type) { (void)type; if (soap_peek_element(soap)) return NULL; #ifndef WITH_NOIDREF if (!*soap->id || !(*type = soap_lookup_type(soap, soap->id))) *type = soap_lookup_type(soap, soap->href); switch (*type) { case SOAP_TYPE_byte: return soap_in_byte(soap, NULL, NULL, "xsd:byte"); case SOAP_TYPE_int: return soap_in_int(soap, NULL, NULL, "xsd:int"); case SOAP_TYPE__QName: { char **s; s = soap_in__QName(soap, NULL, NULL, "xsd:QName"); return s ? *s : NULL; } case SOAP_TYPE_string: { char **s; s = soap_in_string(soap, NULL, NULL, "xsd:string"); return s ? *s : NULL; } default: #else *type = 0; #endif { const char *t = soap->type; if (!*t) t = soap->tag; if (!soap_match_tag(soap, t, "xsd:byte")) { *type = SOAP_TYPE_byte; return soap_in_byte(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:int")) { *type = SOAP_TYPE_int; return soap_in_int(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:QName")) { char **s; *type = SOAP_TYPE__QName; s = soap_in__QName(soap, NULL, NULL, NULL); return s ? *s : NULL; } if (!soap_match_tag(soap, t, "xsd:string")) { char **s; *type = SOAP_TYPE_string; s = soap_in_string(soap, NULL, NULL, NULL); return s ? *s : NULL; } t = soap->tag; #ifndef WITH_NOIDREF } #endif } soap->error = SOAP_TAG_MISMATCH; return NULL; }
SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap *soap) { if (!soap_peek_element(soap)) { int t; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unexpected element '%s' in input (level=%u, %d)\n", soap->tag, soap->level, soap->body)); if (soap->mustUnderstand && !soap->other) return soap->error = SOAP_MUSTUNDERSTAND; if (((soap->mode & SOAP_XML_STRICT) && soap->part != SOAP_IN_HEADER) || !soap_match_tag(soap, soap->tag, "SOAP-ENV:")) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "REJECTING element '%s'\n", soap->tag)); return soap->error = SOAP_TAG_MISMATCH; } if (!*soap->id || !soap_getelement(soap, &t)) { soap->peeked = 0; if (soap->fignore) soap->error = soap->fignore(soap, soap->tag); else soap->error = SOAP_OK; DBGLOG(TEST, if (!soap->error) SOAP_MESSAGE(fdebug, "IGNORING element '%s'\n", soap->tag)); if (!soap->error && soap->body) { soap->level++; while (!soap_ignore_element(soap)) ; if (soap->error == SOAP_NO_TAG) soap->error = soap_element_end_in(soap, NULL); } }
struct timeval *soap_in_xsd__dateTime(struct soap *soap, const char *tag, struct timeval *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":dateTime")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (struct timeval*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__dateTime, sizeof(struct timeval), 0, NULL, NULL, NULL); if (*soap->href) a = (struct timeval*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__dateTime, 0, sizeof(struct timeval), 0, NULL); else if (a) { if (soap_s2xsd__dateTime(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; }
SOAP_FMAC1 struct ns__getQuoteResponse * SOAP_FMAC2 soap_in_ns__getQuoteResponse(struct soap *soap, const char *tag, struct ns__getQuoteResponse *a, const char *type) { short soap_flag_result = 1; if (soap_element_begin_in(soap, tag)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type)) { soap->error = SOAP_TYPE_MISMATCH; soap_revert(soap); return NULL; } if (soap->null) { if (soap->enable_null) { soap->error = SOAP_NULL; return NULL; } else return a; } if (soap->body && !*soap->href) { a = (struct ns__getQuoteResponse *)soap_id_enter(soap, soap->id, a, SOAP_ns__getQuoteResponse, sizeof(struct ns__getQuoteResponse), 0); if (!a) return NULL; if (soap->alloced) soap_default_ns__getQuoteResponse(soap, a); for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) if (soap_in_float(soap, "result", &a->result, "")) { soap_flag_result = 0; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) { return NULL; } } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct ns__getQuoteResponse *)soap_id_forward(soap, soap->href, (void**)soap_id_enter(soap, soap->id, a, SOAP_ns__getQuoteResponse, sizeof(struct ns__getQuoteResponse), 0), SOAP_ns__getQuoteResponse, sizeof(struct ns__getQuoteResponse)); if (soap->alloced) soap_default_ns__getQuoteResponse(soap, a); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; }
SOAP_FMAC1 struct SOAP_ENV__Header * SOAP_FMAC2 soap_in_SOAP_ENV__Header(struct soap *soap, const char *tag, struct SOAP_ENV__Header *a, const char *type) {; if (soap_element_begin_in(soap, tag)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type)) { soap->error = SOAP_TYPE_MISMATCH; soap_revert(soap); return NULL; } if (soap->null) { if (soap->enable_null) { soap->error = SOAP_NULL; return NULL; } else return a; } if (soap->body && !*soap->href) { a = (struct SOAP_ENV__Header *)soap_id_enter(soap, soap->id, a, SOAP_SOAP_ENV__Header, sizeof(struct SOAP_ENV__Header), 0); if (!a) return NULL; if (soap->alloced) soap_default_SOAP_ENV__Header(soap, a); for (;;) { soap->error = SOAP_TAG_MISMATCH; /* transient dummy skipped */ if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) { return NULL; } } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Header *)soap_id_forward(soap, soap->href, (void**)soap_id_enter(soap, soap->id, a, SOAP_SOAP_ENV__Header, sizeof(struct SOAP_ENV__Header), 0), SOAP_SOAP_ENV__Header, sizeof(struct SOAP_ENV__Header)); if (soap->alloced) soap_default_SOAP_ENV__Header(soap, a); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; }
SOAP_FMAC1 struct SOAP_ENV__Fault * SOAP_FMAC2 soap_in_SOAP_ENV__Fault(struct soap *soap, const char *tag, struct SOAP_ENV__Fault *a, const char *type) { short soap_flag_faultcode = 1, soap_flag_faultstring = 1, soap_flag_faultactor = 1, soap_flag_detail = 1; if (soap_element_begin_in(soap, tag)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type)) { soap->error = SOAP_TYPE_MISMATCH; soap_revert(soap); return NULL; } if (soap->null) { if (soap->enable_null) { soap->error = SOAP_NULL; return NULL; } else return a; } if (soap->body && !*soap->href) { a = (struct SOAP_ENV__Fault *)soap_id_enter(soap, soap->id, a, SOAP_SOAP_ENV__Fault, sizeof(struct SOAP_ENV__Fault), 0); if (!a) return NULL; if (soap->alloced) soap_default_SOAP_ENV__Fault(soap, a); for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_faultcode && soap->error == SOAP_TAG_MISMATCH) if (soap_in_string(soap, "faultcode", &a->faultcode, "")) { soap_flag_faultcode = 0; continue; } if (soap_flag_faultstring && soap->error == SOAP_TAG_MISMATCH) if (soap_in_string(soap, "faultstring", &a->faultstring, "")) { soap_flag_faultstring = 0; continue; } if (soap_flag_faultactor && soap->error == SOAP_TAG_MISMATCH) if (soap_in_string(soap, "faultactor", &a->faultactor, "")) { soap_flag_faultactor = 0; continue; } if (soap_flag_detail && soap->error == SOAP_TAG_MISMATCH) if (soap_in_string(soap, "detail", &a->detail, "")) { soap_flag_detail = 0; continue; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = soap_ignore_element(soap); if (soap->error == SOAP_NO_TAG) break; if (soap->error) { return NULL; } } if (soap_element_end_in(soap, tag)) return NULL; } else { a = (struct SOAP_ENV__Fault *)soap_id_forward(soap, soap->href, (void**)soap_id_enter(soap, soap->id, a, SOAP_SOAP_ENV__Fault, sizeof(struct SOAP_ENV__Fault), 0), SOAP_SOAP_ENV__Fault, sizeof(struct SOAP_ENV__Fault)); if (soap->alloced) soap_default_SOAP_ENV__Fault(soap, a); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; }
SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, int *type) { if (soap_peek_element(soap)) return NULL; if (!*soap->id || !(*type = soap_lookup_type(soap, soap->id))) *type = soap_lookup_type(soap, soap->href); switch (*type) { case SOAP_TYPE_byte: return soap_in_byte(soap, NULL, NULL, "xsd:byte"); case SOAP_TYPE_xsd__int: return soap_in_xsd__int(soap, NULL, NULL, "xsd:int"); case SOAP_TYPE_int: return soap_in_int(soap, NULL, NULL, "xsd:int"); case SOAP_TYPE_ws__setTrafficShapeCfg: return soap_in_ws__setTrafficShapeCfg(soap, NULL, NULL, "ws:setTrafficShapeCfg"); case SOAP_TYPE_ws__setTrafficShapeCfgResponse: return soap_in_ws__setTrafficShapeCfgResponse(soap, NULL, NULL, "ws:setTrafficShapeCfgResponse"); case SOAP_TYPE_ws__getTrafficShapeCfg: return soap_in_ws__getTrafficShapeCfg(soap, NULL, NULL, "ws:getTrafficShapeCfg"); case SOAP_TYPE_ws__TrafficShapeCfgInfo: return soap_in_ws__TrafficShapeCfgInfo(soap, NULL, NULL, "ws:TrafficShapeCfgInfo"); case SOAP_TYPE_TrafficShapeCfgInfo: return soap_in_TrafficShapeCfgInfo(soap, NULL, NULL, "TrafficShapeCfgInfo"); case SOAP_TYPE_noop: return soap_in_noop(soap, NULL, NULL, "noop"); case SOAP_TYPE_PointerTows__TrafficShapeCfgInfo: return soap_in_PointerTows__TrafficShapeCfgInfo(soap, NULL, NULL, "ws:TrafficShapeCfgInfo"); case SOAP_TYPE_PointerToxsd__int: return soap_in_PointerToxsd__int(soap, NULL, NULL, "xsd:int"); case SOAP_TYPE_PointerToint: return soap_in_PointerToint(soap, NULL, NULL, "xsd:int"); case SOAP_TYPE_xsd__string: { char **s; s = soap_in_xsd__string(soap, NULL, NULL, "xsd:string"); return s ? *s : NULL; } case SOAP_TYPE_string: { char **s; s = soap_in_string(soap, NULL, NULL, "xsd:string"); return s ? *s : NULL; } default: { const char *t = soap->type; if (!*t) t = soap->tag; if (!soap_match_tag(soap, t, "xsd:byte")) { *type = SOAP_TYPE_byte; return soap_in_byte(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:int")) { *type = SOAP_TYPE_xsd__int; return soap_in_xsd__int(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:int")) { *type = SOAP_TYPE_int; return soap_in_int(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ws:setTrafficShapeCfg")) { *type = SOAP_TYPE_ws__setTrafficShapeCfg; return soap_in_ws__setTrafficShapeCfg(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ws:setTrafficShapeCfgResponse")) { *type = SOAP_TYPE_ws__setTrafficShapeCfgResponse; return soap_in_ws__setTrafficShapeCfgResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ws:getTrafficShapeCfg")) { *type = SOAP_TYPE_ws__getTrafficShapeCfg; return soap_in_ws__getTrafficShapeCfg(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ws:TrafficShapeCfgInfo")) { *type = SOAP_TYPE_ws__TrafficShapeCfgInfo; return soap_in_ws__TrafficShapeCfgInfo(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "TrafficShapeCfgInfo")) { *type = SOAP_TYPE_TrafficShapeCfgInfo; return soap_in_TrafficShapeCfgInfo(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "noop")) { *type = SOAP_TYPE_noop; return soap_in_noop(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:string")) { char **s; *type = SOAP_TYPE_xsd__string; s = soap_in_xsd__string(soap, NULL, NULL, NULL); return s ? *s : NULL; } if (!soap_match_tag(soap, t, "xsd:string")) { char **s; *type = SOAP_TYPE_string; s = soap_in_string(soap, NULL, NULL, NULL); return s ? *s : NULL; } t = soap->tag; if (!soap_match_tag(soap, t, "xsd:QName")) { char **s; *type = SOAP_TYPE__QName; s = soap_in__QName(soap, NULL, NULL, NULL); return s ? *s : NULL; } } } soap->error = SOAP_TAG_MISMATCH; return NULL; }
struct tm *soap_in_xsd__dateTime(struct soap *soap, const char *tag, struct tm *a, const char *type) { if (soap_element_begin_in(soap, tag, 0)) return NULL; if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":dateTime")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (struct tm*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__dateTime, sizeof(struct tm), 0, NULL, NULL, NULL); if (*soap->href) a = (struct tm*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__dateTime, 0, sizeof(struct tm), 0, NULL); else if (a) { const char *s = soap_value(soap); memset((void*)a, 0, sizeof(struct tm)); if (s) { char zone[16]; const char *t; zone[sizeof(zone)-1] = '\0'; if (strchr(s, '-')) t = "%d-%d-%dT%d:%d:%d%15s"; else if (strchr(s, ':')) t = "%4d%2d%2dT%d:%d:%d%15s"; else /* parse non-XSD-standard alternative ISO 8601 format */ t = "%4d%2d%2dT%2d%2d%2d%15s"; sscanf(s, t, &a->tm_year, &a->tm_mon, &a->tm_mday, &a->tm_hour, &a->tm_min, &a->tm_sec, zone); if (a->tm_year == 1) a->tm_year = 70; else a->tm_year -= 1900; a->tm_mon--; if (*zone) { if (*zone == '.') { for (s = zone + 1; *s; s++) if (*s < '0' || *s > '9') break; } else s = zone; if (*s == '+' || *s == '-') { int h = 0, m = 0; if (s[3] == ':') { sscanf(s, "%d:%d", &h, &m); if (h < 0) m = -m; } else { m = (int)atol(s); h = m / 100; m = m % 100; } a->tm_hour -= h; a->tm_min -= m; } a->tm_isdst = 0; } else a->tm_isdst = -1; } } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; }
SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, int *type) { if (soap_peek_element(soap)) return NULL; if (!*soap->id || !(*type = soap_lookup_type(soap, soap->id))) *type = soap_lookup_type(soap, soap->href); switch (*type) { case SOAP_TYPE_byte: return soap_in_byte(soap, NULL, NULL, "xsd:byte"); case SOAP_TYPE_int: return soap_in_int(soap, NULL, NULL, "xsd:int"); case SOAP_TYPE_time: return soap_in_time(soap, NULL, NULL, "xsd:dateTime"); case SOAP_TYPE_ns__currentTime: return soap_in_ns__currentTime(soap, NULL, NULL, "ns:currentTime"); case SOAP_TYPE_ns__currentTimeResponse: return soap_in_ns__currentTimeResponse(soap, NULL, NULL, "ns:currentTimeResponse"); case SOAP_TYPE_PointerTotime: return soap_in_PointerTotime(soap, NULL, NULL, "xsd:dateTime"); case SOAP_TYPE_string: { char **s; s = soap_in_string(soap, NULL, NULL, "xsd:string"); return s ? *s : NULL; } default: { const char *t = soap->type; if (!*t) t = soap->tag; if (!soap_match_tag(soap, t, "xsd:byte")) { *type = SOAP_TYPE_byte; return soap_in_byte(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:int")) { *type = SOAP_TYPE_int; return soap_in_int(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:dateTime")) { *type = SOAP_TYPE_time; return soap_in_time(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:currentTime")) { *type = SOAP_TYPE_ns__currentTime; return soap_in_ns__currentTime(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:currentTimeResponse")) { *type = SOAP_TYPE_ns__currentTimeResponse; return soap_in_ns__currentTimeResponse(soap, NULL, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:string")) { char **s; *type = SOAP_TYPE_string; s = soap_in_string(soap, NULL, NULL, NULL); return s ? *s : NULL; } t = soap->tag; if (!soap_match_tag(soap, t, "xsd:QName")) { char **s; *type = SOAP_TYPE__QName; s = soap_in__QName(soap, NULL, NULL, NULL); return s ? *s : NULL; } } } soap->error = SOAP_TAG_MISMATCH; return NULL; }