/*
 * 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.
 */
#if !defined(XERCESDOCUMENTTYPEWRAPPER_HEADER_GUARD_1357924680)
#define XERCESDOCUMENTTYPEWRAPPER_HEADER_GUARD_1357924680



#include <xalanc/XercesParserLiaison/XercesParserLiaisonDefinitions.hpp>



#include <xalanc/XalanDOM/XalanDocumentType.hpp>

#include <xalanc/Include/XalanMemMgrAutoPtr.hpp>

#include <xalanc/XercesParserLiaison/XercesNamedNodeMapWrapper.hpp>
#include <xalanc/XercesParserLiaison/XercesWrapperTypes.hpp>



namespace XALAN_CPP_NAMESPACE {



class XercesWrapperNavigator;
class XercesDocumentWrapper;



class XALAN_XERCESPARSERLIAISON_EXPORT XercesDocumentTypeWrapper : public XalanDocumentType
{
public:

    XercesDocumentTypeWrapper(
            const DOMDocumentType_Type*     theXercesDOMDocumentType,
            const XercesWrapperNavigator&   theNavigator);

    static XercesDocumentTypeWrapper*
    create( MemoryManager& theManager,
        const DOMDocumentType_Type*     theXercesDOMDocumentType,
        const XercesWrapperNavigator&   theNavigator);

    virtual
    ~XercesDocumentTypeWrapper();


    // These interfaces are inherited from XalanDocumentType...

    virtual const XalanDOMString&
    getNodeName() const;

    virtual const XalanDOMString&
    getNodeValue() const;

    virtual NodeType
    getNodeType() const;

    virtual XalanNode*
    getParentNode() const;

    virtual const XalanNodeList*
    getChildNodes() const;

    virtual XalanNode*
    getFirstChild() const;

    virtual XalanNode*
    getLastChild() const;

    virtual XalanNode*
    getPreviousSibling() const;

    virtual XalanNode*
    getNextSibling() const;

    virtual const XalanNamedNodeMap*
    getAttributes() const;

    virtual XalanDocument*
    getOwnerDocument() const;

    virtual const XalanDOMString&
    getNamespaceURI() const;

    virtual const XalanDOMString&
    getPrefix() const;

    virtual const XalanDOMString&
    getLocalName() const;

    virtual bool
    isIndexed() const;

    virtual IndexType
    getIndex() const;

    virtual const XalanDOMString&
    getName() const;

    virtual const XalanNamedNodeMap*
    getEntities() const;

    virtual const XalanNamedNodeMap*
    getNotations() const;

    virtual const XalanDOMString&
    getPublicId() const;

    virtual const XalanDOMString&
    getSystemId() const;

    virtual const XalanDOMString&
    getInternalSubset() const;

    /**
     * Get the Xerces node this instance represent.
     *
     * @return The Xerces node
     */
    const DOMDocumentType_Type*
    getXercesNode() const
    {
        return m_xercesNode;
    }

    //@}

private:

    // Not implemented...
    XercesDocumentTypeWrapper(const XercesDocumentTypeWrapper&  theSource);

    XercesDocumentTypeWrapper&
    operator=(const XercesDocumentTypeWrapper&  theSource);

    bool
    operator==(const XercesDocumentTypeWrapper&     theRHS) const;

    // Data members...
    const DOMDocumentType_Type* const   m_xercesNode;

    XercesNamedNodeMapWrapper           m_entities;
    
    XercesNamedNodeMapWrapper           m_notations;

    const XercesWrapperNavigator&       m_navigator;
};



}



#endif  // !defined(XERCESDOCUMENTTYPEWRAPPER_HEADER_GUARD_1357924680)
