Skip to content
Snippets Groups Projects
IGXMLScanner.cpp 116 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$
Khaled Noaman's avatar
Khaled Noaman committed
 */


// ---------------------------------------------------------------------------
//  Includes
// ---------------------------------------------------------------------------
#include <xercesc/internal/IGXMLScanner.hpp>
#include <xercesc/util/RuntimeException.hpp>
#include <xercesc/util/HashPtr.hpp>
Khaled Noaman's avatar
Khaled Noaman committed
#include <xercesc/util/UnexpectedEOFException.hpp>
#include <xercesc/sax/InputSource.hpp>
#include <xercesc/framework/XMLDocumentHandler.hpp>
#include <xercesc/framework/XMLEntityHandler.hpp>
#include <xercesc/framework/XMLPScanToken.hpp>
#include <xercesc/internal/EndOfEntityException.hpp>
#include <xercesc/framework/MemoryManager.hpp>
#include <xercesc/framework/XMLGrammarPool.hpp>
PeiYong Zhang's avatar
PeiYong Zhang committed
#include <xercesc/framework/XMLDTDDescription.hpp>
#include <xercesc/framework/psvi/PSVIElement.hpp>
#include <xercesc/framework/psvi/PSVIHandler.hpp>
#include <xercesc/framework/psvi/PSVIAttributeList.hpp>
#include <xercesc/validators/common/GrammarResolver.hpp>
Khaled Noaman's avatar
Khaled Noaman committed
#include <xercesc/validators/DTD/DocTypeHandler.hpp>
#include <xercesc/validators/DTD/DTDScanner.hpp>
#include <xercesc/validators/DTD/DTDValidator.hpp>
#include <xercesc/validators/schema/SchemaValidator.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/util/OutOfMemoryException.hpp>
Khaled Noaman's avatar
Khaled Noaman committed

XERCES_CPP_NAMESPACE_BEGIN


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


Khaled Noaman's avatar
Khaled Noaman committed
// ---------------------------------------------------------------------------
//  IGXMLScanner: Constructors and Destructor
// ---------------------------------------------------------------------------
IGXMLScanner::IGXMLScanner( 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
    , fRawAttrList(0)
    , fRawAttrColonListSize(32)
    , fRawAttrColonList(0)
Khaled Noaman's avatar
Khaled Noaman committed
    , fDTDValidator(0)
    , fSchemaValidator(0)
    , fDTDGrammar(0)
PeiYong Zhang's avatar
PeiYong Zhang committed
    , fICHandler(0)
    , fDTDElemNonDeclPool(0)
    , fSchemaElemNonDeclPool(0)
    , fElemCount(0)
    , fAttDefRegistry(0)
    , fUndeclaredAttrRegistry(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, &IGXMLScanner::cleanUp);

Khaled Noaman's avatar
Khaled Noaman committed
    try
    {
        commonInit();
Khaled Noaman's avatar
Khaled Noaman committed
    }
        // 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
}

IGXMLScanner::IGXMLScanner( 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
    , fRawAttrList(0)
Khaled Noaman's avatar
Khaled Noaman committed
    , fDTDValidator(0)
    , fSchemaValidator(0)
    , fDTDGrammar(0)
PeiYong Zhang's avatar
PeiYong Zhang committed
    , fICHandler(0)
    , fDTDElemNonDeclPool(0)
    , fSchemaElemNonDeclPool(0)
    , fElemCount(0)
    , fAttDefRegistry(0)
    , fUndeclaredAttrRegistry(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, &IGXMLScanner::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();
Khaled Noaman's avatar
Khaled Noaman committed
}

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

// ---------------------------------------------------------------------------
//  XMLScanner: Getter methods
// ---------------------------------------------------------------------------
NameIdPool<DTDEntityDecl>* IGXMLScanner::getEntityDeclPool()
{
Khaled Noaman's avatar
Khaled Noaman committed
    return fDTDGrammar->getEntityDeclPool();
}

const NameIdPool<DTDEntityDecl>* IGXMLScanner::getEntityDeclPool() const
{
Khaled Noaman's avatar
Khaled Noaman committed
    return fDTDGrammar->getEntityDeclPool();
}

// ---------------------------------------------------------------------------
//  IGXMLScanner: Main entry point to scan a document
// ---------------------------------------------------------------------------
void IGXMLScanner::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();
Loading
Loading full blame...