diff --git a/src/xercesc/framework/psvi/PSVIHandler.hpp b/src/xercesc/framework/psvi/PSVIHandler.hpp index cf02bec99c0a8f45fc2ed7ad08704db3e96406c0..54a7218c5749154f291b801df928bcf566921bd6 100755 --- a/src/xercesc/framework/psvi/PSVIHandler.hpp +++ b/src/xercesc/framework/psvi/PSVIHandler.hpp @@ -16,6 +16,9 @@ /* * $Log$ + * Revision 1.8 2004/09/21 16:09:37 peiyongz + * Handle partial PSVIElement + * * Revision 1.7 2004/09/08 13:56:07 peiyongz * Apache License Version 2.0 * @@ -86,6 +89,13 @@ public: , PSVIElement * elementInfo ) = 0; + virtual void handlePartialElementPSVI + ( + const XMLCh* const localName + , const XMLCh* const uri + , PSVIElement * elementInfo + ) = 0; + /** * Enables PSVI information about attributes to be passed back to the * application. This callback will be made on *all* diff --git a/src/xercesc/internal/IGXMLScanner.cpp b/src/xercesc/internal/IGXMLScanner.cpp index c46360dc43894684165d76e8111dd3bdeb298268..2470eed9980b471bc3f8b2f2e1edceb2986f4b7b 100644 --- a/src/xercesc/internal/IGXMLScanner.cpp +++ b/src/xercesc/internal/IGXMLScanner.cpp @@ -2899,6 +2899,59 @@ bool IGXMLScanner::scanStartTagNS(bool& gotData) } else if (fGrammarType == Grammar::SchemaGrammarType) { + // send a partial element psvi + if (fPSVIHandler) + { + + ComplexTypeInfo* curTypeInfo = 0; + DatatypeValidator* curDV = 0; + XSTypeDefinition* typeDef = 0; + + if (fValidate && elemDecl->isDeclared()) + { + curTypeInfo = ((SchemaValidator*) fValidator)->getCurrentTypeInfo(); + + if (curTypeInfo) + { + typeDef = (XSTypeDefinition*) fModel->getXSObject(curTypeInfo); + } + else + { + curDV = ((SchemaValidator*) fValidator)->getCurrentDatatypeValidator(); + + if (curDV) + { + typeDef = (XSTypeDefinition*) fModel->getXSObject(curDV); + } + } + } + + fPSVIElement->reset + ( + PSVIElement::VALIDITY_NOTKNOWN + , PSVIElement::VALIDATION_NONE + , fRootElemName + , ((SchemaValidator*) fValidator)->getIsElemSpecified() + , (elemDecl->isDeclared()) ? (XSElementDeclaration*) fModel->getXSObject(elemDecl) : 0 + , typeDef + , 0 //memberType + , fModel + , ((SchemaElementDecl*)elemDecl)->getDefaultValue() + , 0 + , 0 + , 0 + ); + + + fPSVIHandler->handlePartialElementPSVI + ( + elemDecl->getBaseName() + , fURIStringPool->getValueForId(elemDecl->getURI()) + , fPSVIElement + ); + + } + // not empty fErrorStack->push(fPSVIElemContext.fErrorOccurred); } diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp index d624f7ae2fca8900cbd319aa2944563361d85cd7..6dd7adaa7a3e84c54cf765325584d1a01ca1ecc4 100644 --- a/src/xercesc/internal/SGXMLScanner.cpp +++ b/src/xercesc/internal/SGXMLScanner.cpp @@ -1758,7 +1758,63 @@ bool SGXMLScanner::scanStartTag(bool& gotData) } } else // not empty + { + + // send a partial element psvi + if (fPSVIHandler) + { + + ComplexTypeInfo* curTypeInfo = 0; + DatatypeValidator* curDV = 0; + XSTypeDefinition* typeDef = 0; + + if (fValidate && elemDecl->isDeclared()) + { + curTypeInfo = ((SchemaValidator*) fValidator)->getCurrentTypeInfo(); + + if (curTypeInfo) + { + typeDef = (XSTypeDefinition*) fModel->getXSObject(curTypeInfo); + } + else + { + curDV = ((SchemaValidator*) fValidator)->getCurrentDatatypeValidator(); + + if (curDV) + { + typeDef = (XSTypeDefinition*) fModel->getXSObject(curDV); + } + } + } + + fPSVIElement->reset + ( + PSVIElement::VALIDITY_NOTKNOWN + , PSVIElement::VALIDATION_NONE + , fRootElemName + , ((SchemaValidator*) fValidator)->getIsElemSpecified() + , (elemDecl->isDeclared()) ? (XSElementDeclaration*) fModel->getXSObject(elemDecl) : 0 + , typeDef + , 0 //memberType + , fModel + , ((SchemaElementDecl*)elemDecl)->getDefaultValue() + , 0 + , 0 + , 0 + ); + + + fPSVIHandler->handlePartialElementPSVI + ( + elemDecl->getBaseName() + , fURIStringPool->getValueForId(elemDecl->getURI()) + , fPSVIElement + ); + + } + fErrorStack->push(fPSVIElemContext.fErrorOccurred); + } return true; } diff --git a/src/xercesc/parsers/AbstractDOMParser.cpp b/src/xercesc/parsers/AbstractDOMParser.cpp index 16439a83e68c252afb7c50a11d7408a81d50267a..9bbcf45bc91eaaf27225270f14ab0bc4c6d3d928 100644 --- a/src/xercesc/parsers/AbstractDOMParser.cpp +++ b/src/xercesc/parsers/AbstractDOMParser.cpp @@ -607,6 +607,14 @@ void AbstractDOMParser::handleElementPSVI(const XMLCh* const localNam fPSVIHandler->handleElementPSVI(localName, uri, elementInfo); } +void AbstractDOMParser::handlePartialElementPSVI(const XMLCh* const localName + , const XMLCh* const uri + , PSVIElement * elementInfo) +{ + if(fPSVIHandler) + fPSVIHandler->handlePartialElementPSVI(localName, uri, elementInfo); +} + void AbstractDOMParser::handleAttributesPSVI( const XMLCh* const localName , const XMLCh* const uri , PSVIAttributeList * psviAttributes) diff --git a/src/xercesc/parsers/AbstractDOMParser.hpp b/src/xercesc/parsers/AbstractDOMParser.hpp index 13faea31746030e5b824902c22b00f173577215b..f22f1496a75cc5a575cd93a4223b344d4f1eb588 100644 --- a/src/xercesc/parsers/AbstractDOMParser.hpp +++ b/src/xercesc/parsers/AbstractDOMParser.hpp @@ -990,6 +990,13 @@ public : , const XMLCh* const uri , PSVIElement * elementInfo ); + + virtual void handlePartialElementPSVI + ( + const XMLCh* const localName + , const XMLCh* const uri + , PSVIElement * elementInfo + ); /** * Enables PSVI information about attributes to be passed back to the * application. This callback will be made on *all*