tng 2002/09/23 12:38:16 Modified: c/src/xercesc/parsers AbstractDOMParser.cpp Log: DOM L3: Support baseURI. Revision Changes Path 1.24 +69 -6 xml-xerces/c/src/xercesc/parsers/AbstractDOMParser.cpp Index: AbstractDOMParser.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/AbstractDOMParser.cpp,v retrieving revision 1.23 retrieving revision 1.24 diff -u -r1.23 -r1.24 --- AbstractDOMParser.cpp 17 Sep 2002 13:26:35 -0000 1.23 +++ AbstractDOMParser.cpp 23 Sep 2002 19:38:15 -0000 1.24 @@ -90,9 +90,9 @@ #include <xercesc/dom/impl/DOMNotationImpl.hpp> #include <xercesc/dom/DOMNamedNodeMap.hpp> #include <xercesc/dom/DOMProcessingInstruction.hpp> +#include <xercesc/dom/impl/DOMProcessingInstructionImpl.hpp> #include <xercesc/dom/impl/DOMNodeIDMap.hpp> - #include <xercesc/validators/common/ContentSpecNode.hpp> #include <xercesc/validators/DTD/DTDAttDefList.hpp> @@ -542,6 +542,44 @@ // append the child of erImpl to currentParent fCurrentNode = kid->cloneNode(true); fCurrentParent->appendChild(fCurrentNode); + + if (erImpl->getBaseURI()) { + /** + * Record baseURI information for the Element (by adding xml:base attribute) + * or for the ProcessingInstruction (by setting a baseURI field) + */ + if (fCurrentNode->getNodeType() == DOMNode::ELEMENT_NODE) { + // if an element already has xml:base attribute + // do nothing + const XMLCh baseString[] = + { + chLatin_b, chLatin_a, chLatin_s, chLatin_e, chNull + }; + const XMLCh xmlBaseString[] = + { + chLatin_x, chLatin_m, chLatin_l, chColon, chLatin_b, chLatin_a, chLatin_s, chLatin_e, chNull + }; + + if (fScanner -> getDoNamespaces() && (((DOMElement*)fCurrentNode)->getAttributeNodeNS(DOMNodeImpl::getXmlURIString(), baseString) != 0)) { + return; + } else if (((DOMElement*)fCurrentNode)->getAttributeNode(xmlBaseString) != 0) { + return; + } + + // retrive the baseURI from the entity decl + const XMLCh* baseURI = erImpl->getBaseURI(); + if (baseURI != 0 && XMLString::compareString(baseURI,fDocument->getDocumentURI())) { + if (fScanner -> getDoNamespaces()) { + ((DOMElement*)fCurrentNode)->setAttributeNS(DOMNodeImpl::getXmlURIString(), baseString, baseURI); + } else { + ((DOMElement*)fCurrentNode)->setAttribute(xmlBaseString, baseURI); + } + } + } + else if (fCurrentNode->getNodeType() == DOMNode::PROCESSING_INSTRUCTION_NODE) { + ((DOMProcessingInstructionImpl*)fCurrentNode)->setBaseURI(erImpl->getBaseURI()); + } + } } next = kid->getNextSibling(); @@ -619,7 +657,14 @@ // set DOM error checking off fDocument->setErrorChecking(false); - fDocument->setDocumentURI(fScanner->getLocator()->getSystemId()); + const XMLCh* systemId = fScanner->getLocator()->getSystemId(); + if (systemId) { + XMLBufBid bbURI(&fBufMgr); + XMLBuffer& bufURI = bbURI.getBuffer(); + XMLString::fixURI(systemId, bufURI); + + fDocument->setDocumentURI(bufURI.getRawBuffer()); + } fDocument->setActualEncoding(fScanner->getReaderMgr()->getCurrentEncodingStr()); } @@ -1179,8 +1224,9 @@ void AbstractDOMParser::endIntSubset() { fDocumentType->setInternalSubset(fInternalSubset.getRawBuffer()); - fBufMgr.releaseBuffer(fInternalSubset); - fDocumentType->intSubsetReading = false; + // the buffer shouldn't be released as it is reused in the next parse + // fBufMgr.releaseBuffer(fInternalSubset); + fDocumentType->fIntSubsetReading = false; } void AbstractDOMParser::endExtSubset() @@ -1199,6 +1245,14 @@ entity->setPublicId(entityDecl.getPublicId()); entity->setSystemId(entityDecl.getSystemId()); entity->setNotationName(entityDecl.getNotationName()); + if (entityDecl.getBaseURI()) + { + XMLBufBid bbURI(&fBufMgr); + XMLBuffer& bufURI = bbURI.getBuffer(); + XMLString::fixURI(entityDecl.getBaseURI(), bufURI); + + entity->setBaseURI(bufURI.getRawBuffer()); + } DOMEntityImpl *previousDef = (DOMEntityImpl *) fDocumentType->getEntities()->setNamedItem( entity ); @@ -1269,6 +1323,14 @@ DOMNotationImpl* notation = (DOMNotationImpl *)fDocument->createNotation(notDecl.getName()); notation->setPublicId(notDecl.getPublicId()); notation->setSystemId(notDecl.getSystemId()); + if (notDecl.getBaseURI()) + { + XMLBufBid bbURI(&fBufMgr); + XMLBuffer& bufURI = bbURI.getBuffer(); + XMLString::fixURI(notDecl.getBaseURI(), bufURI); + + notation->setBaseURI(bufURI.getRawBuffer()); + } DOMNode* rem = fDocumentType->getNotations()->setNamedItem( notation ); if (rem) @@ -1324,7 +1386,7 @@ void AbstractDOMParser::startIntSubset() { - fDocumentType->intSubsetReading = true; + fDocumentType->fIntSubsetReading = true; } void AbstractDOMParser::startExtSubset() @@ -1342,3 +1404,4 @@ fCurrentEntity->setEncoding(encodingStr); } } +
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]