static Variant HHVM_METHOD(XSLTProcessor, transformToURI, const Object& doc, const String& uri) { auto data = Native::data<XSLTProcessorData>(this_); if (doc.instanceof(DOMDocument::getClass())) { DOMDocument *domdoc = Native::data<DOMDocument>(doc.get()); data->m_doc = xmlCopyDoc ((xmlDocPtr)domdoc->m_node, /*recursive*/ 1); String translated = libxml_get_valid_file_path(uri); if (translated.empty()) { raise_warning("Invalid URI"); return false; } xmlDocPtr res = data->apply_stylesheet (); if (res == nullptr) { return false; } int bytes = xsltSaveResultToFilename(translated.data(), res, data->m_stylesheet, /*compression*/ 0); xmlFreeDoc(res); if (bytes == -1) { return false; } return bytes; } return false; }
Variant HHVM_METHOD(XMLReader, open, const String& uri, const Variant& encoding /*= null_variant*/, int64_t options /*= 0*/) { auto* data = Native::data<XMLReader>(this_); const String& str_encoding = encoding.isNull() ? null_string : encoding.toString(); SYNC_VM_REGS_SCOPED(); if (data->m_ptr) { data->close(); } if (uri.empty()) { raise_warning("Empty string supplied as input"); return false; } else if (!FileUtil::checkPathAndWarn(uri, "XMLReader::open", 1)) { return init_null(); } String valid_file = libxml_get_valid_file_path(uri.c_str()); xmlTextReaderPtr reader = nullptr; if (!valid_file.empty()) { // Manually create the IO context to support custom stream wrappers. data->m_stream = File::Open(valid_file, "rb"); if (data->m_stream != nullptr && !data->m_stream->isInvalid()) { // The XML context is owned by the native data attached to 'this_'. // The File is also owned by the native data so it does not need // to be cleaned up by an XML callback. The libxml_streams_IO_nop_close // callback does nothing. reader = xmlReaderForIO(libxml_streams_IO_read, libxml_streams_IO_nop_close, &data->m_stream, valid_file.data(), str_encoding.data(), options); } } if (reader == nullptr) { raise_warning("Unable to open source data"); return false; } data->m_ptr = reader; return true; }
bool HHVM_METHOD(XMLReader, open, const String& uri, const Variant& encoding /*= null_variant*/, int64_t options /*= 0*/) { auto* data = Native::data<XMLReader>(this_); const String& str_encoding = encoding.isNull() ? null_string : encoding.toString(); SYNC_VM_REGS_SCOPED(); if (data->m_ptr) { data->close(); } if (uri.empty()) { raise_warning("Empty string supplied as input"); return false; } String valid_file = libxml_get_valid_file_path(uri.c_str()); xmlTextReaderPtr reader = nullptr; if (!valid_file.empty()) { // Manually create the IO context to support custom stream wrappers. auto stream = File::Open(valid_file, "rb"); if (!stream->isInvalid()) { reader = xmlReaderForIO(libxml_streams_IO_read, libxml_streams_IO_close, stream.get(), valid_file.data(), str_encoding.data(), options); // The xmlTextReaderPtr owns a reference to stream. if (reader) stream.get()->incRefCount(); } } if (reader == nullptr) { raise_warning("Unable to open source data"); return false; } data->m_ptr = reader; return true; }
static Variant HHVM_METHOD(XSLTProcessor, transformToURI, const Object& doc, const String& uri) { auto data = Native::data<XSLTProcessorData>(this_); if (!FileUtil::checkPathAndWarn(uri, "XSLTProcessor::transformToUri", 2)) { return false; } if (doc.instanceof(s_DOMDocument)) { auto domdoc = Native::data<DOMNode>(doc); data->m_doc = libxml_register_node(xmlCopyDoc ((xmlDocPtr)domdoc->nodep(), /*recursive*/ 1)); String translated = libxml_get_valid_file_path(uri); if (translated.empty()) { raise_warning("Invalid URI"); return false; } xmlDocPtr res = data->apply_stylesheet (); if (res == nullptr) { return false; } int bytes = xsltSaveResultToFilename(translated.data(), res, data->m_stylesheet, /*compression*/ 0); xmlFreeDoc(res); if (bytes == -1) { return false; } return bytes; } return false; }
static xmlRelaxNGPtr _xmlreader_get_relaxNG(String source, int type, xmlRelaxNGValidityErrorFunc error_func, xmlRelaxNGValidityWarningFunc warn_func) { xmlRelaxNGParserCtxtPtr parser = nullptr; xmlRelaxNGPtr sptr; String valid_file; switch (type) { case XMLREADER_LOAD_FILE: valid_file = libxml_get_valid_file_path(source.c_str()); if (valid_file.empty()) { return nullptr; } parser = xmlRelaxNGNewParserCtxt(valid_file.c_str()); break; case XMLREADER_LOAD_STRING: parser = xmlRelaxNGNewMemParserCtxt(source.data(), source.size()); // If loading from memory, we need to set the base directory for the // document but it is not apparent how to do that for schema's break; default: return nullptr; } if (parser == nullptr) { return nullptr; } if (error_func || warn_func) { xmlRelaxNGSetParserErrors(parser, (xmlRelaxNGValidityErrorFunc) error_func, (xmlRelaxNGValidityWarningFunc) warn_func, parser); } sptr = xmlRelaxNGParse(parser); xmlRelaxNGFreeParserCtxt(parser); return sptr; }
String libxml_get_valid_file_path(const char* source) { return libxml_get_valid_file_path(String(source, CopyString)); }