/*
 * 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(XALAN_ELEMEXTENSIONCALL_HEADER_GUARD)
#define XALAN_ELEMEXTENSIONCALL_HEADER_GUARD 



// Base include file.  Must be first.
#include "XSLTDefinitions.hpp"



// Base class header file.
#include "ElemLiteralResult.hpp"



namespace XALAN_CPP_NAMESPACE {



class ExtensionNSHandler;
class XalanQName;



class ElemExtensionCall: public ElemLiteralResult
{
public:

    /**
     * Construct an object corresponding to calling an XSL extension
     * 
     * @param constructionContext context for construction of object
     * @param stylesheetTree      stylesheet containing element
     * @param name                name of element
     * @param atts                list of attributes for element
     * @param lineNumber                line number in document
     * @param columnNumber          column number in document
     * @param ns                  handler for the extension
     */
    ElemExtensionCall(
            StylesheetConstructionContext&  constructionContext,
            Stylesheet&                     stylesheetTree,
            const XalanDOMChar*             name,
            const AttributeListType&        atts,
            XalanFileLoc                    lineNumber, 
            XalanFileLoc                    columnNumber,
            ExtensionNSHandler&             ns);

    static ElemExtensionCall*
    create(
            MemoryManager&              theManager,
            StylesheetConstructionContext&  constructionContext,
            Stylesheet&                     stylesheetTree,
            const XalanDOMChar*             name,
            const AttributeListType&        atts,
            XalanFileLoc                    lineNumber, 
            XalanFileLoc                    columnNumber,
            ExtensionNSHandler&             ns);

    // These methods are inherited from ElemLiteralResult ...

#if !defined(XALAN_RECURSIVE_STYLESHEET_EXECUTION)
    virtual const ElemTemplateElement*
    startElement(StylesheetExecutionContext&    executionContext) const;

    virtual void 
    endElement(StylesheetExecutionContext&      executionContext) const;

    virtual bool 
    executeChildElement(
            StylesheetExecutionContext& executionContext,
            const ElemTemplateElement*  element) const;
    
#else
    virtual void
    execute(StylesheetExecutionContext&     executionContext) const;
#endif

    bool
    elementAvailable(StylesheetExecutionContext&    executionContext) const;

private:

    const XalanQName* const     m_qname;

    ExtensionNSHandler&         m_nsh;
};



}



#endif  // XALAN_ELEMEXTENSIONCALL_HEADER_GUARD
