gareth      2003/01/29 11:43:42

  Modified:    c/src/xercesc/parsers AbstractDOMParser.cpp
  Log:
  Updated to set Level 3 TypeInfo
  
  Revision  Changes    Path
  1.34      +88 -19    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.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- AbstractDOMParser.cpp     29 Jan 2003 15:24:45 -0000      1.33
  +++ AbstractDOMParser.cpp     29 Jan 2003 19:43:42 -0000      1.34
  @@ -95,8 +95,8 @@
   #include <xercesc/dom/impl/DOMNodeIDMap.hpp>
   #include <xercesc/validators/common/ContentSpecNode.hpp>
   #include <xercesc/validators/common/GrammarResolver.hpp>
  -
  -
  +#include <xercesc/validators/schema/SchemaSymbols.hpp>
  +#include <iostream>
   XERCES_CPP_NAMESPACE_BEGIN
   
   
  @@ -677,6 +677,10 @@
       fCurrentNode   = fCurrentParent;
       fCurrentParent = fNodeStack->pop();
   
  +    //validation is performed after the startElement event so we have to associate 
the info here
  +    ((DOMElementImpl *)(fCurrentNode))->setTypeInfo(elemDecl.getDOMTypeInfoName(), 
elemDecl.getDOMTypeInfoUri());
  +
  +
       // If we've hit the end of content, clear the flag
       if (fNodeStack->empty())
           fWithinElement = false;
  @@ -762,9 +766,13 @@
       chLatin_x, chLatin_m, chLatin_l, chLatin_n, chLatin_s, chNull
       };
   
  -    if (fScanner -> getDoNamespaces()) {    //DOM Level 2, doNamespaces on
  +    static const XMLCh XSI[] = {
  +    chLatin_x, chLatin_s, chLatin_i, chNull
  +    };
   
  -        XMLBufBid bbURI(&fBufMgr);
  +    if (fScanner -> getDoNamespaces()) {    //DOM Level 2, doNamespaces on
  + 
  +       XMLBufBid bbURI(&fBufMgr);
           XMLBuffer& bufURI = bbURI.getBuffer();
           XMLCh* namespaceURI = 0;
   
  @@ -783,6 +791,13 @@
   
           elem = createElementNSNode(namespaceURI, elemQName.getRawBuffer());
           elemImpl = (DOMElementImpl *) elem;
  +
  +        //get the list for use in the loop
  +        XMLAttDefList* defAttrs = 0;
  +        if(elemDecl.hasAttDefs()) {
  +            defAttrs = &elemDecl.getAttDefList();
  +        }
  +
           for (unsigned int index = 0; index < attrCount; ++index) {
               const XMLAttr* oneAttrib = attrList.elementAt(index);
               unsigned int attrURIId = oneAttrib -> getURIId();
  @@ -817,6 +832,31 @@
               }
   
               attr->setSpecified(oneAttrib->getSpecified());
  +            if(defAttrs != 0) {
  +                XMLAttDef *attDef = defAttrs->findAttDef(attrURIId, 
oneAttrib->getQName());
  +                if(attDef != 0) {
  +                    attr->setTypeInfo(attDef->getDOMTypeInfoName(), 
attDef->getDOMTypeInfoUri());
  +                    attDef->reset();
  +                }
  +            }
  +            else {
  +                const XMLCh *name = oneAttrib->getName();
  +                if (XMLString::equals(oneAttrib->getPrefix(), XSI)) {
  +                    if(XMLString::equals(name, SchemaSymbols::fgXSI_TYPE)) {
  +                        attr->setTypeInfo(SchemaSymbols::fgDT_QNAME, 
SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  +                    }
  +                    else if(XMLString::equals(name, SchemaSymbols::fgATT_NILL)) {
  +                        attr->setTypeInfo(SchemaSymbols::fgDT_BOOLEAN, 
SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  +                    }
  +                    else if(XMLString::equals(name, 
SchemaSymbols::fgXSI_NONAMESPACESCHEMALOCACTION)) {
  +                        attr->setTypeInfo(SchemaSymbols::fgDT_ANYURI, 
SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  +                    }
  +                }
  +                else {
  +                    //for normal ns attrs
  +                    attr->setTypeInfo(SchemaSymbols::fgDT_ANYURI, 
SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  +                }
  +            }
           }
       }
       else {    //DOM Level 1
  @@ -857,14 +897,13 @@
           while (defAttrs->hasMoreElements())
           {
               attr = &defAttrs->nextElement();
  -            const XMLAttDef::DefAttTypes defType = attr->getDefaultType();
   
  +            const XMLAttDef::DefAttTypes defType = attr->getDefaultType();
               if ((defType == XMLAttDef::Default)
               ||  (defType == XMLAttDef::Fixed))
               {
  -                if (attr->getValue() != 0)
  -                {
  -                    if (fScanner->getDoNamespaces())
  +
  +                if (fScanner->getDoNamespaces())
                       {
                           // DOM Level 2 wants all namespace declaration attributes
                           // to be bound to "http://www.w3.org/2000/xmlns/";
  @@ -881,29 +920,59 @@
                               uriId = fScanner->getXMLNSNamespaceId();
                           if (uriId != fScanner->getEmptyNamespaceId()) {  //TagName 
has a prefix
                               namespaceURI = fScanner->getURIText(uriId);
  -                         }
  +                        }
   
                           insertAttr = (DOMAttrImpl *) fDocument->createAttributeNS(
  -                           namespaceURI,     // NameSpaceURI
  -                           qualifiedName);   // qualified name
  +                                                                                  
namespaceURI,     // NameSpaceURI
  +                                                                                  
qualifiedName);   // qualified name
   
  -                        DOMNode* remAttr = 
elemImpl->setDefaultAttributeNodeNS(insertAttr);
  -                        if (remAttr)
  +                        DOMAttr* remAttr = 
elemImpl->setDefaultAttributeNodeNS(insertAttr);
  +                        if (remAttr) 
                               remAttr->release();
  +
  +                        if (attr->getValue() != 0)
  +                            {
  +                                insertAttr->setValue(attr->getValue());
  +                                insertAttr->setSpecified(false);
  +                            }
  +
                       }
  -                    else
  +                else
                       {
                           // Namespaces is turned off...
                           insertAttr = (DOMAttrImpl *) 
fDocument->createAttribute(attr->getFullName());
  +
                           DOMNode* remAttr = 
elemImpl->setDefaultAttributeNode(insertAttr);
  -                        if (remAttr)
  +                        if (remAttr) 
                               remAttr->release();
  +
  +                        //need to do this before the get as otherwise we overwrite 
any value in the attr
  +                        if (attr->getValue() != 0)
  +                            {
  +                                insertAttr->setValue(attr->getValue());
  +                                insertAttr->setSpecified(false);
  +                            }
  +                        
  +                        if(insertAttr) {
  +                            insertAttr = (DOMAttrImpl 
*)(elemImpl->getAttributeNode(attr->getFullName()));
  +                            insertAttr->setTypeInfo(attr->getDOMTypeInfoName(), 
attr->getDOMTypeInfoUri());
  +                        }
                       }
   
  -                    insertAttr->setValue(attr->getValue());
  -                    insertAttr->setSpecified(false);
  +            }
  +            else {
  +                //we deal with the non namespace attrs down here as we are 
iterating over the XMLAttDefs anyway
  +                if(!fScanner->getDoNamespaces()) {
  +                    if(insertAttr == 0) {
  +                        insertAttr = (DOMAttrImpl 
*)(elemImpl->getAttributeNode(attr->getFullName()));
  +                    }
  +                    if(insertAttr)
  +                        insertAttr->setTypeInfo(attr->getDOMTypeInfoName(), 
attr->getDOMTypeInfoUri());
                   }
               }
  +
  +            insertAttr = 0;
  +            attr->reset();
           }
       }
   
  @@ -916,7 +985,7 @@
       fWithinElement = true;
   
       // If an empty element, do end right now (no endElement() will be called)
  -    if (isEmpty)
  +    if (isEmpty) 
           endElement(elemDecl, urlId, isRoot, elemPrefix);
   }
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to