void _xml_unparsedEntityDeclHandler(void *userData, const XML_Char *entityName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId, const XML_Char *notationName) { XmlParser *parser = (XmlParser *)userData; if (parser && parser->unparsedEntityDeclHandler) { Array args = Array::Create(); args.append(parser); args.append(_xml_xmlchar_zval(entityName, 0, parser->target_encoding)); args.append(_xml_xmlchar_zval(base, 0, parser->target_encoding)); args.append(_xml_xmlchar_zval(systemId, 0, parser->target_encoding)); args.append(_xml_xmlchar_zval(publicId, 0, parser->target_encoding)); args.append(_xml_xmlchar_zval(notationName, 0, parser->target_encoding)); xml_call_handler(parser, parser->unparsedEntityDeclHandler, args); } }
int _xml_externalEntityRefHandler(XML_ParserStruct* /* void* */ parserPtr, const XML_Char *openEntityNames, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId) { XmlParser *parser = (XmlParser*)XML_GetUserData((XML_Parser)parserPtr); int ret = 0; /* abort if no handler is set (should be configurable?) */ if (parser && parser->externalEntityRefHandler) { Array args = Array::Create(); args.append(parser); args.append(_xml_xmlchar_zval(openEntityNames, 0, parser->target_encoding)); args.append(_xml_xmlchar_zval(base, 0, parser->target_encoding)); args.append(_xml_xmlchar_zval(systemId, 0, parser->target_encoding)); args.append(_xml_xmlchar_zval(publicId, 0, parser->target_encoding)); ret = xml_call_handler(parser, parser->externalEntityRefHandler, args); } return ret; }
void _xml_endNamespaceDeclHandler(void *userData, const XML_Char *prefix) { XmlParser *parser = (XmlParser *)userData; if (parser && parser->endNamespaceDeclHandler) { Array args = Array::Create(); args.append(parser); args.append(_xml_xmlchar_zval(prefix, 0, parser->target_encoding)); xml_call_handler(parser, parser->endNamespaceDeclHandler, args); } }
void _xml_characterDataHandler(void *userData, const XML_Char *s, int len) { auto parser = getParserFromToken(userData); if (parser) { Variant retval; Array args = Array::Create(); if (parser->characterDataHandler.toBoolean()) { args.append(Variant(parser)); args.append(_xml_xmlchar_zval(s, len, parser->target_encoding)); xml_call_handler(parser, parser->characterDataHandler, args); } if (!parser->data.isNull()) { int i; int doprint = 0; String decoded_value; int decoded_len; decoded_value = xml_utf8_decode(s,len, parser->target_encoding); decoded_len = decoded_value.size(); for (i = 0; i < decoded_len; i++) { switch (decoded_value[i]) { case ' ': case '\t': case '\n': default: doprint = 1; break; } if (doprint) { break; } } if (doprint || (! parser->skipwhite)) { if (parser->lastwasopen) { String myval; // check if value exists, if yes append to that if (parser->ctag.toArrRef().exists(s_value)) { myval = tvCastToString(parser->ctag.toArray().rvalAt(s_value).tv()); myval += decoded_value; parser->ctag.toArrRef().set(s_value, myval); } else { parser->ctag.toArrRef().set( s_value, decoded_value ); } } else { Array tag; String myval; String mytype; auto curtag = parser->data.toArrRef().pop(); SCOPE_EXIT { try { parser->data.toArrRef().append(curtag); } catch (...) {} }; if (curtag.toArrRef().exists(s_type)) { mytype = tvCastToString(curtag.toArrRef().rvalAt(s_type).tv()); if (!strcmp(mytype.data(), "cdata") && curtag.toArrRef().exists(s_value)) { myval = tvCastToString(curtag.toArrRef().rvalAt(s_value).tv()); myval += decoded_value; curtag.toArrRef().set(s_value, myval); return; } } if (parser->level <= XML_MAXLEVEL && parser->level > 0) { tag = Array::Create(); _xml_add_to_info(parser, parser->ltags[parser->level-1] + parser->toffset); tag.set(s_tag, String(parser->ltags[parser->level-1] + parser->toffset, CopyString)); tag.set(s_value, decoded_value); tag.set(s_type, s_cdata); tag.set(s_level, parser->level); parser->data.toArrRef().append(tag); } else if (parser->level == (XML_MAXLEVEL + 1)) { raise_warning("Maximum depth exceeded - Results truncated"); } } } } }
void _xml_characterDataHandler(void *userData, const XML_Char *s, int len) { XmlParser *parser = (XmlParser *)userData; if (parser) { Variant retval; Array args = Array::Create(); if (parser->characterDataHandler) { args.append(parser); args.append(_xml_xmlchar_zval(s, len, parser->target_encoding)); xml_call_handler(parser, parser->characterDataHandler, args); } if (!parser->data.isNull()) { int i; int doprint = 0; char *decoded_value; int decoded_len; decoded_value = xml_utf8_decode(s,len,&decoded_len, parser->target_encoding); for (i = 0; i < decoded_len; i++) { switch (decoded_value[i]) { case ' ': case '\t': case '\n': continue; default: doprint = 1; break; } if (doprint) { break; } } if (doprint || (! parser->skipwhite)) { if (parser->lastwasopen) { String myval; // check if value exists, if yes append to that if (parser->ctag.toArray().exists(s_value)) { myval = parser->ctag.rvalAt(s_value).toString(); myval += String(decoded_value, decoded_len, AttachString); parser->ctag.set(s_value, myval); } else { parser->ctag.set(s_value, String(decoded_value,decoded_len,AttachString)); } } else { Array tag; Variant curtag; String myval; String mytype; curtag.assignRef(parser->data.getArrayData()->endRef()); if (curtag.toArray().exists(s_type)) { mytype = curtag.rvalAt(s_type).toString(); if (!strcmp(mytype.data(), "cdata") && curtag.toArray().exists(s_value)) { myval = curtag.rvalAt(s_value).toString(); myval += String(decoded_value, decoded_len, AttachString); curtag.set(s_value, myval); return; } } tag = Array::Create(); _xml_add_to_info(parser, parser->ltags[parser->level-1] + parser->toffset); tag.set(s_tag, String(parser->ltags[parser->level-1] + parser->toffset, CopyString)); tag.set(s_value, String(decoded_value, AttachString)); tag.set(s_type, s_cdata); tag.set(s_level, parser->level); parser->data.append(tag); } } else { free(decoded_value); } } } }