int nsExpatDriver::HandleExternalEntityRef(const PRUnichar *openEntityNames, const PRUnichar *base, const PRUnichar *systemId, const PRUnichar *publicId) { if (mInInternalSubset && !mInExternalDTD && openEntityNames) { mInternalSubset.Append(PRUnichar('%')); mInternalSubset.Append(nsDependentString(openEntityNames)); mInternalSubset.Append(PRUnichar(';')); } // Load the external entity into a buffer. nsCOMPtr<nsIInputStream> in; nsAutoString absURL; nsresult rv = OpenInputStreamFromExternalDTD(publicId, systemId, base, getter_AddRefs(in), absURL); NS_ENSURE_SUCCESS(rv, 1); nsCOMPtr<nsIUnicharInputStream> uniIn; rv = nsSimpleUnicharStreamFactory::GetInstance()-> CreateInstanceFromUTF8Stream(in, getter_AddRefs(uniIn)); NS_ENSURE_SUCCESS(rv, 1); int result = 1; if (uniIn) { XML_Parser entParser = XML_ExternalEntityParserCreate(mExpatParser, 0, kUTF16); if (entParser) { XML_SetBase(entParser, absURL.get()); mInExternalDTD = PR_TRUE; PRUint32 totalRead; do { rv = uniIn->ReadSegments(ExternalDTDStreamReaderFunc, entParser, PRUint32(-1), &totalRead); } while (NS_SUCCEEDED(rv) && totalRead > 0); result = XML_Parse(entParser, nsnull, 0, 1); mInExternalDTD = PR_FALSE; XML_ParserFree(entParser); } } return result; }
int nsExpatDriver::HandleExternalEntityRef(const char16_t *openEntityNames, const char16_t *base, const char16_t *systemId, const char16_t *publicId) { if (mInInternalSubset && !mInExternalDTD && openEntityNames) { mInternalSubset.Append(char16_t('%')); mInternalSubset.Append(nsDependentString(openEntityNames)); mInternalSubset.Append(char16_t(';')); } // Load the external entity into a buffer. nsCOMPtr<nsIInputStream> in; nsAutoString absURL; nsresult rv = OpenInputStreamFromExternalDTD(publicId, systemId, base, getter_AddRefs(in), absURL); if (NS_FAILED(rv)) { #ifdef DEBUG nsCString message("Failed to open external DTD: publicId \""); AppendUTF16toUTF8(publicId, message); message += "\" systemId \""; AppendUTF16toUTF8(systemId, message); message += "\" base \""; AppendUTF16toUTF8(base, message); message += "\" URL \""; AppendUTF16toUTF8(absURL, message); message += "\""; NS_WARNING(message.get()); #endif return 1; } nsCOMPtr<nsIUnicharInputStream> uniIn; rv = nsSimpleUnicharStreamFactory::GetInstance()-> CreateInstanceFromUTF8Stream(in, getter_AddRefs(uniIn)); NS_ENSURE_SUCCESS(rv, 1); int result = 1; if (uniIn) { XML_Parser entParser = XML_ExternalEntityParserCreate(mExpatParser, 0, kUTF16); if (entParser) { XML_SetBase(entParser, absURL.get()); mInExternalDTD = true; uint32_t totalRead; do { rv = uniIn->ReadSegments(ExternalDTDStreamReaderFunc, entParser, uint32_t(-1), &totalRead); } while (NS_SUCCEEDED(rv) && totalRead > 0); result = XML_Parse(entParser, nullptr, 0, 1); mInExternalDTD = false; XML_ParserFree(entParser); } } return result; }