You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by am...@apache.org on 2007/05/07 11:51:09 UTC
svn commit: r535824 - in /xerces/c/trunk:
Projects/Win32/VC8/xerces-all/DOMNormalizerTest/ src/xercesc/parsers/
src/xercesc/xinclude/
Author: amassari
Date: Mon May 7 02:51:07 2007
New Revision: 535824
URL: http://svn.apache.org/viewvc?view=rev&rev=535824
Log:
XInclude reuses the entity resolver of the parser, if the user set it
Modified:
xerces/c/trunk/Projects/Win32/VC8/xerces-all/DOMNormalizerTest/DOMNormalizerTest.vcproj
xerces/c/trunk/src/xercesc/parsers/AbstractDOMParser.cpp
xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.cpp
xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.hpp
xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.cpp
xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.hpp
Modified: xerces/c/trunk/Projects/Win32/VC8/xerces-all/DOMNormalizerTest/DOMNormalizerTest.vcproj
URL: http://svn.apache.org/viewvc/xerces/c/trunk/Projects/Win32/VC8/xerces-all/DOMNormalizerTest/DOMNormalizerTest.vcproj?view=diff&rev=535824&r1=535823&r2=535824
==============================================================================
--- xerces/c/trunk/Projects/Win32/VC8/xerces-all/DOMNormalizerTest/DOMNormalizerTest.vcproj (original)
+++ xerces/c/trunk/Projects/Win32/VC8/xerces-all/DOMNormalizerTest/DOMNormalizerTest.vcproj Mon May 7 02:51:07 2007
@@ -3,7 +3,7 @@
ProjectType="Visual C++"
Version="8,00"
Name="DOMNormalizerTest"
- ProjectGUID="{BE9C14B1-2301-4c62-85E2-B583D22AE29C}"
+ ProjectGUID="{BE9C14B1-2301-4C62-85E2-B583D22AE29C}"
>
<Platforms>
<Platform
Modified: xerces/c/trunk/src/xercesc/parsers/AbstractDOMParser.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/parsers/AbstractDOMParser.cpp?view=diff&rev=535824&r1=535823&r2=535824
==============================================================================
--- xerces/c/trunk/src/xercesc/parsers/AbstractDOMParser.cpp (original)
+++ xerces/c/trunk/src/xercesc/parsers/AbstractDOMParser.cpp Mon May 7 02:51:07 2007
@@ -855,7 +855,7 @@
{
XIncludeUtils xiu((XMLErrorReporter *) this);
/* process the XInclude node, then update the fCurrentNode with the new content*/
- if(xiu.parseDOMNodeDoingXInclude(fCurrentNode, fDocument))
+ if(xiu.parseDOMNodeDoingXInclude(fCurrentNode, fDocument, getScanner()->getEntityHandler()))
fCurrentNode = fCurrentParent->getLastChild();
}
}
Modified: xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.cpp?view=diff&rev=535824&r1=535823&r2=535824
==============================================================================
--- xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.cpp (original)
+++ xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.cpp Mon May 7 02:51:07 2007
@@ -32,7 +32,7 @@
XERCES_CPP_NAMESPACE_BEGIN
DOMDocument *
-XIncludeDOMDocumentProcessor::doXIncludeDOMProcess(const DOMDocument * const source, XMLErrorReporter *errorHandler){
+XIncludeDOMDocumentProcessor::doXIncludeDOMProcess(const DOMDocument * const source, XMLErrorReporter *errorHandler, XMLEntityHandler* entityResolver /*=NULL*/){
XIncludeUtils xiu(errorHandler);
DOMImplementation* impl = source->getImplementation();
@@ -59,7 +59,7 @@
DOMNode *docNode = xincludedDocument->getDocumentElement();
/* parse and include the document node */
- xiu.parseDOMNodeDoingXInclude(docNode, xincludedDocument);
+ xiu.parseDOMNodeDoingXInclude(docNode, xincludedDocument, entityResolver);
xincludedDocument->normalizeDocument();
}
Modified: xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.hpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.hpp?view=diff&rev=535824&r1=535823&r2=535824
==============================================================================
--- xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.hpp (original)
+++ xerces/c/trunk/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.hpp Mon May 7 02:51:07 2007
@@ -28,6 +28,8 @@
XERCES_CPP_NAMESPACE_BEGIN
+class XMLEntityHandler;
+
/**
* Class for representing and manipulating the XMLCh * href's used
* by an xi:include element.
@@ -47,7 +49,7 @@
* @return a newly created DOMDocument containing the parsed and actioned
* xinclude elements.
*/
- DOMDocument *doXIncludeDOMProcess(const DOMDocument * const source, XMLErrorReporter *errorHandler);
+ DOMDocument *doXIncludeDOMProcess(const DOMDocument * const source, XMLErrorReporter *errorHandler, XMLEntityHandler* entityResolver=NULL);
};
XERCES_CPP_NAMESPACE_END
Modified: xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.cpp?view=diff&rev=535824&r1=535823&r2=535824
==============================================================================
--- xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.cpp (original)
+++ xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.cpp Mon May 7 02:51:07 2007
@@ -25,8 +25,13 @@
#include <xercesc/util/TransService.hpp>
#include <xercesc/util/XMLUri.hpp>
#include <xercesc/util/XMLMsgLoader.hpp>
+#include <xercesc/util/XMLResourceIdentifier.hpp>
+#include <xercesc/util/BinInputStream.hpp>
+#include <xercesc/util/OutOfMemoryException.hpp>
#include <xercesc/internal/XMLInternalErrorHandler.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
+#include <xercesc/sax/InputSource.hpp>
+#include <xercesc/framework/URLInputSource.hpp>
XERCES_CPP_NAMESPACE_BEGIN
@@ -46,7 +51,7 @@
// all xinclude manipulation is done in place (i.e. source is manipulated).
// ---------------------------------------------------------------------------
bool
-XIncludeUtils::parseDOMNodeDoingXInclude(DOMNode *sourceNode, DOMDocument *parsedDocument){
+XIncludeUtils::parseDOMNodeDoingXInclude(DOMNode *sourceNode, DOMDocument *parsedDocument, XMLEntityHandler* entityResolver){
int included = 0;
if (sourceNode) {
/* create the list of child elements here, since it gets changed during the parse */
@@ -59,7 +64,7 @@
if (isXIIncludeDOMNode(sourceNode)){
/* once we do an include on the source element, it is unsafe to do the include
on the children, since they will have been changed by the top level include */
- bool success = doDOMNodeXInclude(sourceNode, parsedDocument);
+ bool success = doDOMNodeXInclude(sourceNode, parsedDocument, entityResolver);
//popFromCurrentInclusionHistoryStack(NULL);
/* return here as we do not want to fall through to the parsing of the children below
@@ -78,7 +83,7 @@
need to walk the entire child list parsing for each. An xinclude in a
node does not affect a peer, so we can simply parse each child in turn */
for (unsigned int i = 0; i < children.size(); i++){
- parseDOMNodeDoingXInclude(children.elementAt(i), parsedDocument);
+ parseDOMNodeDoingXInclude(children.elementAt(i), parsedDocument, entityResolver);
}
}
return (included)?true:false;
@@ -115,7 +120,7 @@
// it accordingly, acting on what it finds.
// ---------------------------------------------------------------------------
bool
-XIncludeUtils::doDOMNodeXInclude(DOMNode *xincludeNode, DOMDocument *parsedDocument){
+XIncludeUtils::doDOMNodeXInclude(DOMNode *xincludeNode, DOMDocument *parsedDocument, XMLEntityHandler* entityResolver){
bool modifiedNode = false;
/* the relevant attributes to look for */
const XMLCh *href = NULL;
@@ -232,10 +237,10 @@
DOMDocument *includedDoc = NULL;
if (XMLString::equals(parse, XIncludeUtils::fgXIIncludeParseAttrXMLValue)){
/* including a XML element */
- includedDoc = doXIncludeXMLFileDOM(hrefLoc.getLocation(), relativeLocation.getLocation(), xincludeNode, parsedDocument);
+ includedDoc = doXIncludeXMLFileDOM(hrefLoc.getLocation(), relativeLocation.getLocation(), xincludeNode, parsedDocument, entityResolver);
} else if (XMLString::equals(parse, XIncludeUtils::fgXIIncludeParseAttrTextValue)){
/* including a text value */
- includedText = doXIncludeTEXTFileDOM(hrefLoc.getLocation(), relativeLocation.getLocation(), encoding, parsedDocument);
+ includedText = doXIncludeTEXTFileDOM(hrefLoc.getLocation(), relativeLocation.getLocation(), encoding, xincludeNode, parsedDocument, entityResolver);
} else {
/* invalid parse attribute value - fatal error according to the specification */
XIncludeUtils::reportError(xincludeNode, XMLErrs::XIncludeInvalidParseVal,
@@ -282,7 +287,7 @@
}
}
DOMNode *newChild = includeParent->insertBefore(newNode, xincludeNode);
- parseDOMNodeDoingXInclude(newChild, parsedDocument);
+ parseDOMNodeDoingXInclude(newChild, parsedDocument, entityResolver);
}
includeParent->removeChild(xincludeNode);
modifiedNode = true;
@@ -369,7 +374,7 @@
}
DOMNode *newNode = parsedDocument->importNode(child, true);
DOMNode *newChild = includeParent->insertBefore(newNode, xincludeNode);
- parseDOMNodeDoingXInclude(newChild, parsedDocument);
+ parseDOMNodeDoingXInclude(newChild, parsedDocument, entityResolver);
}
includeParent->removeChild(xincludeNode);
popFromCurrentInclusionHistoryStack(NULL);
@@ -387,7 +392,11 @@
}
DOMDocument *
-XIncludeUtils::doXIncludeXMLFileDOM(const XMLCh *href, const XMLCh *relativeHref, DOMNode *includeNode, DOMDocument *parsedDocument){
+XIncludeUtils::doXIncludeXMLFileDOM(const XMLCh *href,
+ const XMLCh *relativeHref,
+ DOMNode *includeNode,
+ DOMDocument *parsedDocument,
+ XMLEntityHandler* entityResolver){
if (XIncludeUtils::isInCurrentInclusionHistoryStack(href)){
/* including something back up the current history */
XIncludeUtils::reportError(parsedDocument, XMLErrs::XIncludeCircularInclusionLoop,
@@ -414,7 +423,21 @@
DOMDocument *includedNode = NULL;
try {
- parser.parse(href);
+ InputSource* is=NULL;
+ Janitor<InputSource> janIS(is);
+ if(entityResolver) {
+ XMLResourceIdentifier resIdentifier(XMLResourceIdentifier::ExternalEntity,
+ relativeHref,
+ NULL,
+ NULL,
+ includeNode->getBaseURI());
+ is=entityResolver->resolveEntity(&resIdentifier);
+ janIS.reset(is);
+ }
+ if(janIS.get()!=NULL)
+ parser.parse(*janIS.get());
+ else
+ parser.parse(href);
/* need to be able to release the parser but keep the document */
if (!xierrhandler.getSawError() && !xierrhandler.getSawFatal())
includedNode = parser.adoptDocument();
@@ -465,69 +488,77 @@
}
DOMText *
-XIncludeUtils::doXIncludeTEXTFileDOM(const XMLCh *href, const XMLCh *relativeHref, const XMLCh *encoding, DOMDocument *parsedDocument){
+XIncludeUtils::doXIncludeTEXTFileDOM(const XMLCh *href,
+ const XMLCh *relativeHref,
+ const XMLCh *encoding,
+ DOMNode *includeNode,
+ DOMDocument *parsedDocument,
+ XMLEntityHandler* entityResolver){
if (encoding == NULL)
/* "UTF-8" is stipulated default by spec */
encoding = XMLUni::fgUTF8EncodingString;
XMLTransService::Codes failReason;
XMLTranscoder* transcoder = XMLPlatformUtils::fgTransService->makeNewTranscoderFor(encoding, failReason, 16*1024);
+ Janitor<XMLTranscoder> janTranscoder(transcoder);
if (failReason){
XIncludeUtils::reportError(parsedDocument, XMLErrs::XIncludeCannotOpenFile, href, href);
return NULL;
}
- DOMText *ret = NULL;
-
//addDocumentURIToCurrentInclusionHistoryStack(href);
- int pathLen = XMLString::stringLen(href);
- /*(XMLString::stringLen(baseURI) + 9)*sizeof(XMLCh)
- I am guessing 9 == "file:///" + 1 (nullTerm?) */
- XMLCh *fixedFullTargetPath = (XMLCh *)XMLPlatformUtils::fgMemoryManager->allocate((pathLen + 9) * sizeof(XMLCh));
- if (fixedFullTargetPath == NULL){
- delete transcoder;
- return NULL;
- }
- XMLString::fixURI(href, fixedFullTargetPath);
-
- /* openFile doesn't like the protocol prefix, probably a better way of doing this. */
- const XMLCh *fileRefMinusProtocol = XIncludeLocation::findEndOfProtocol(fixedFullTargetPath);
- FileHandle fh = XMLPlatformUtils::openFile(fileRefMinusProtocol);
- if (fh == NULL){
- delete transcoder;
- XIncludeUtils::reportError(parsedDocument, XMLErrs::XIncludeCannotOpenFile,
- href, href);
- return NULL;
- }
- /* TODO - is this really the easiest way to read in the file and pass it out to DocHandler? */
- XMLFilePos fileLen = XMLPlatformUtils::fileSize(fh);
- XMLByte *buffer = (XMLByte *) XMLPlatformUtils::fgMemoryManager->allocate(fileLen * sizeof(XMLByte));
- XMLCh *xmlChars = (XMLCh *) XMLPlatformUtils::fgMemoryManager->allocate((fileLen + 1) * sizeof(XMLCh));
- unsigned char *charSizes = (unsigned char *)XMLPlatformUtils::fgMemoryManager->allocate(fileLen * sizeof(unsigned char));
- if (buffer != NULL && xmlChars != NULL && charSizes != NULL){
- XMLSize_t sizeRead = XMLPlatformUtils::readFileBuffer(fh, fileLen, buffer);
- XMLPlatformUtils::closeFile(fh);
-
- unsigned int processedFromSource = 0;
- int charsInBuffer = transcoder->transcodeFrom(buffer, sizeRead, xmlChars , fileLen, processedFromSource, charSizes);
- xmlChars[fileLen] = chNull;
- /* TODO check for and consume / act on byte order mark if present -
- possibly done under the covers actually */
-
- /* report or record the xmlChars */
- ret = parsedDocument->createTextNode(xmlChars);
- }
- else {
- /* memory manager should have thrown an exception */
- ret = NULL;
- }
- delete transcoder;
- XMLPlatformUtils::fgMemoryManager->deallocate(buffer);
- XMLPlatformUtils::fgMemoryManager->deallocate(fixedFullTargetPath);
- XMLPlatformUtils::fgMemoryManager->deallocate(xmlChars);
- XMLPlatformUtils::fgMemoryManager->deallocate(charSizes);
- return ret;
+ InputSource* is=NULL;
+ Janitor<InputSource> janIS(is);
+ if(entityResolver) {
+ XMLResourceIdentifier resIdentifier(XMLResourceIdentifier::ExternalEntity,
+ relativeHref,
+ NULL,
+ NULL,
+ includeNode->getBaseURI());
+ is=entityResolver->resolveEntity(&resIdentifier);
+ janIS.reset(is);
+ }
+ if(janIS.get()==NULL)
+ janIS.reset(new URLInputSource(href));
+ if(janIS.get()==NULL) {
+ XIncludeUtils::reportError(parsedDocument, XMLErrs::XIncludeCannotOpenFile,
+ href, href);
+ return NULL;
+ }
+ BinInputStream* stream=janIS.get()->makeStream();
+ if(stream==NULL) {
+ XIncludeUtils::reportError(parsedDocument, XMLErrs::XIncludeCannotOpenFile,
+ href, href);
+ return NULL;
+ }
+ Janitor<BinInputStream> janStream(stream);
+ const int maxToRead=16*1024;
+ XMLByte* buffer=(XMLByte*)XMLPlatformUtils::fgMemoryManager->allocate(maxToRead * sizeof(XMLByte));
+ if(buffer==NULL)
+ throw OutOfMemoryException();
+ ArrayJanitor<XMLByte> janBuffer(buffer, XMLPlatformUtils::fgMemoryManager);
+ XMLCh* xmlChars=(XMLCh*)XMLPlatformUtils::fgMemoryManager->allocate(maxToRead*2*sizeof(XMLCh));
+ if(xmlChars==NULL)
+ throw OutOfMemoryException();
+ ArrayJanitor<XMLCh> janUniBuffer(xmlChars, XMLPlatformUtils::fgMemoryManager);
+ unsigned char *charSizes = (unsigned char *)XMLPlatformUtils::fgMemoryManager->allocate(maxToRead * sizeof(unsigned char));
+ if(charSizes==NULL)
+ throw OutOfMemoryException();
+ ArrayJanitor<unsigned char> janCharSizes(charSizes, XMLPlatformUtils::fgMemoryManager);
+
+ unsigned int nRead, nOffset=0;
+ XMLBuffer repository;
+ while((nRead=stream->readBytes(buffer+nOffset, maxToRead-nOffset))>0){
+ unsigned int bytesEaten=0;
+ unsigned int nCount = transcoder->transcodeFrom(buffer, nRead, xmlChars, maxToRead*2, bytesEaten, charSizes);
+ repository.append(xmlChars, nCount);
+ if(bytesEaten<nRead) {
+ nOffset=nRead-bytesEaten;
+ memmove(buffer, buffer+bytesEaten, nRead-bytesEaten);
+ }
+ }
+ return parsedDocument->createTextNode(repository.getRawBuffer());
}
/*static*/ bool
Modified: xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.hpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.hpp?view=diff&rev=535824&r1=535823&r2=535824
==============================================================================
--- xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.hpp (original)
+++ xerces/c/trunk/src/xercesc/xinclude/XIncludeUtils.hpp Mon May 7 02:51:07 2007
@@ -33,6 +33,8 @@
XERCES_CPP_NAMESPACE_BEGIN
+class XMLEntityHandler;
+
typedef struct XIncludeHistoryNode{
XMLCh *URI;
struct XIncludeHistoryNode *next;
@@ -67,7 +69,7 @@
* @return true if the XInclude processing was successful, false if not. Note that an
* XInclude that fails resulting in a successful fallback action would return true.
*/
- bool doDOMNodeXInclude(DOMNode *xincludeNode, DOMDocument *parsedDocument);
+ bool doDOMNodeXInclude(DOMNode *xincludeNode, DOMDocument *parsedDocument, XMLEntityHandler* entityResolver);
/** Parse an XInclude xml file into a DOMDocument node.
*
@@ -81,7 +83,8 @@
DOMDocument *doXIncludeXMLFileDOM(const XMLCh *href,
const XMLCh *relativeHref,
DOMNode *xincludeNode,
- DOMDocument *parsedDocument);
+ DOMDocument *parsedDocument,
+ XMLEntityHandler* entityResolver);
/** Parse an XInclude text file into a DOMText node.
*
@@ -96,7 +99,9 @@
DOMText *doXIncludeTEXTFileDOM(const XMLCh *href,
const XMLCh *relativeHref,
const XMLCh *encoding,
- DOMDocument *parsedDocument);
+ DOMNode *xincludeNode,
+ DOMDocument *parsedDocument,
+ XMLEntityHandler* entityResolver);
/** Detect whether the supplied details are correct for an xi:include element
*
@@ -144,7 +149,7 @@
*
* @return true if XInclude behaviour was successfully performed on source, false if not.
*/
- bool parseDOMNodeDoingXInclude(DOMNode *source, DOMDocument *parsedDocument);
+ bool parseDOMNodeDoingXInclude(DOMNode *source, DOMDocument *parsedDocument, XMLEntityHandler* entityResolver);
/** Parse the supplied URI and escape all characters as specified by
* the XINclusions specification.
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org