Skip to content
Snippets Groups Projects
SGXMLScanner.cpp 179 KiB
Newer Older
Khaled Noaman's avatar
Khaled Noaman committed
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *      http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
Khaled Noaman's avatar
Khaled Noaman committed
 */

/*
 * $Id$
 */


// ---------------------------------------------------------------------------
//  Includes
// ---------------------------------------------------------------------------
#include <xercesc/internal/SGXMLScanner.hpp>
#include <xercesc/util/RuntimeException.hpp>
#include <xercesc/util/UnexpectedEOFException.hpp>
Khaled Noaman's avatar
Khaled Noaman committed
#include <xercesc/framework/LocalFileInputSource.hpp>
#include <xercesc/framework/URLInputSource.hpp>
#include <xercesc/framework/XMLDocumentHandler.hpp>
#include <xercesc/framework/XMLEntityHandler.hpp>
#include <xercesc/framework/XMLPScanToken.hpp>
#include <xercesc/framework/MemoryManager.hpp>
#include <xercesc/framework/XMLGrammarPool.hpp>
#include <xercesc/framework/psvi/PSVIHandler.hpp>
#include <xercesc/framework/psvi/PSVIAttributeList.hpp>
#include <xercesc/framework/psvi/XSAnnotation.hpp>
Khaled Noaman's avatar
Khaled Noaman committed
#include <xercesc/internal/EndOfEntityException.hpp>
#include <xercesc/validators/common/ContentLeafNameTypeVector.hpp>
#include <xercesc/validators/schema/SchemaValidator.hpp>
#include <xercesc/validators/schema/TraverseSchema.hpp>
#include <xercesc/validators/schema/XSDDOMParser.hpp>
#include <xercesc/validators/schema/SubstitutionGroupComparator.hpp>
#include <xercesc/validators/schema/XMLSchemaDescriptionImpl.hpp>
PeiYong Zhang's avatar
PeiYong Zhang committed
#include <xercesc/validators/schema/identity/IdentityConstraintHandler.hpp>
Khaled Noaman's avatar
Khaled Noaman committed
#include <xercesc/validators/schema/identity/IC_Selector.hpp>
#include <xercesc/validators/schema/identity/ValueStore.hpp>
#include <xercesc/util/OutOfMemoryException.hpp>
#include <xercesc/util/HashPtr.hpp>
#include <xercesc/util/XMLStringTokenizer.hpp>
Khaled Noaman's avatar
Khaled Noaman committed

XERCES_CPP_NAMESPACE_BEGIN

inline XMLAttDefList& getAttDefList(ComplexTypeInfo* currType, XMLElementDecl* elemDecl);

typedef JanitorMemFunCall<SGXMLScanner> CleanupType;
typedef JanitorMemFunCall<ReaderMgr>    ReaderMgrResetType;


Khaled Noaman's avatar
Khaled Noaman committed
// ---------------------------------------------------------------------------
//  SGXMLScanner: Constructors and Destructor
// ---------------------------------------------------------------------------
SGXMLScanner::SGXMLScanner( XMLValidator* const valToAdopt
                          , GrammarResolver* const grammarResolver
                          , MemoryManager* const manager) :
Khaled Noaman's avatar
Khaled Noaman committed

    XMLScanner(valToAdopt, grammarResolver, manager)
Khaled Noaman's avatar
Khaled Noaman committed
    , fSeeXsi(false)
Khaled Noaman's avatar
Khaled Noaman committed
    , fElemStateSize(16)
    , fElemState(0)
Khaled Noaman's avatar
Khaled Noaman committed
    , fEntityTable(0)
    , fRawAttrList(0)
    , fRawAttrColonListSize(32)
    , fRawAttrColonList(0)
Khaled Noaman's avatar
Khaled Noaman committed
    , fSchemaValidator(0)
PeiYong Zhang's avatar
PeiYong Zhang committed
    , fICHandler(0)
    , fElemCount(0)
    , fAttDefRegistry(0)
    , fUndeclaredAttrRegistryNS(0)
    , fPSVIAttrList(0)
Khaled Noaman's avatar
Khaled Noaman committed
    , fModel(0)
    , fPSVIElement(0)
Khaled Noaman's avatar
Khaled Noaman committed
{
    CleanupType cleanup(this, &SGXMLScanner::cleanUp);

Khaled Noaman's avatar
Khaled Noaman committed
    try
    {
         commonInit();
    }
        // Don't cleanup when out of memory, since executing the
        // code can cause problems.
        cleanup.release();


    cleanup.release();
SGXMLScanner::SGXMLScanner( XMLDocumentHandler* const docHandler
                          , DocTypeHandler* const     docTypeHandler
                          , XMLEntityHandler* const   entityHandler
                          , XMLErrorReporter* const   errHandler
                          , XMLValidator* const       valToAdopt
                          , GrammarResolver* const    grammarResolver
                          , MemoryManager* const      manager) :
Khaled Noaman's avatar
Khaled Noaman committed

    XMLScanner(docHandler, docTypeHandler, entityHandler, errHandler, valToAdopt, grammarResolver, manager)
Khaled Noaman's avatar
Khaled Noaman committed
    , fSeeXsi(false)
Khaled Noaman's avatar
Khaled Noaman committed
    , fElemStateSize(16)
    , fElemState(0)
Khaled Noaman's avatar
Khaled Noaman committed
    , fEntityTable(0)
    , fRawAttrList(0)
    , fRawAttrColonListSize(32)
    , fRawAttrColonList(0)
Khaled Noaman's avatar
Khaled Noaman committed
    , fSchemaValidator(0)
PeiYong Zhang's avatar
PeiYong Zhang committed
    , fICHandler(0)
    , fElemCount(0)
    , fAttDefRegistry(0)
    , fUndeclaredAttrRegistryNS(0)
    , fPSVIAttrList(0)
Khaled Noaman's avatar
Khaled Noaman committed
    , fModel(0)
    , fPSVIElement(0)
Khaled Noaman's avatar
Khaled Noaman committed
{
    CleanupType cleanup(this, &SGXMLScanner::cleanUp);

Khaled Noaman's avatar
Khaled Noaman committed
    try
Khaled Noaman's avatar
Khaled Noaman committed
        commonInit();
    }
        // Don't cleanup when out of memory, since executing the
        // code can cause problems.
        cleanup.release();


    cleanup.release();
Khaled Noaman's avatar
Khaled Noaman committed
}

SGXMLScanner::~SGXMLScanner()
{
    cleanUp();
}

// ---------------------------------------------------------------------------
//  XMLScanner: Getter methods
// ---------------------------------------------------------------------------
NameIdPool<DTDEntityDecl>* SGXMLScanner::getEntityDeclPool()
{
    return 0;
}

const NameIdPool<DTDEntityDecl>* SGXMLScanner::getEntityDeclPool() const
{
    return 0;
}

// ---------------------------------------------------------------------------
//  SGXMLScanner: Main entry point to scan a document
// ---------------------------------------------------------------------------
void SGXMLScanner::scanDocument(const InputSource& src)
{
    //  Bump up the sequence id for this parser instance. This will invalidate
    //  any previous progressive scan tokens.
    fSequenceId++;

    ReaderMgrResetType  resetReaderMgr(&fReaderMgr, &ReaderMgr::reset);

Khaled Noaman's avatar
Khaled Noaman committed
    try
    {
        //  Reset the scanner and its plugged in stuff for a new run. This
        //  resets all the data structures, creates the initial reader and
        //  pushes it on the stack, and sets up the base document path.
        scanReset(src);

        // If we have a document handler, then call the start document
        if (fDocHandler)
            fDocHandler->startDocument();

        //  Scan the prolog part, which is everything before the root element
        //  including the DTD subsets.
        scanProlog();
Loading
Loading full blame...