/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



#ifndef __com_sun_star_xml_dom_XDOMImplementation_idl__
#define __com_sun_star_xml_dom_XDOMImplementation_idl__

#ifndef __com_sun_star_uno__XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif
#ifndef __com_sun_star_xml_dom_DOMException_idl__
#include <com/sun/star/xml/dom/DOMException.idl>
#endif


module com { module sun { module star { module xml { module dom {

interface XDocument;
interface XDocumentType;

interface XDOMImplementation : com::sun::star::uno::XInterface
{
    /**
    Creates a DOM Document object of the specified type with its document element.
    Throws:
    DOMException - INVALID_CHARACTER_ERR: Raised if the specified qualified name contains an illegal character.
                   NAMESPACE_ERR: Raised if the qualifiedName is malformed, if the qualifiedName has a prefix 
                      and the namespaceURI is null, or if the qualifiedName has a prefix that is "xml" and 
                      the namespaceURI is different from " http://www.w3.org/XML/1998/namespace" , or if the 
                      DOM implementation does not support the "XML" feature but a non-null namespace URI was 
                      provided, since namespaces were defined by XML.
                   WRONG_DOCUMENT_ERR: Raised if doctype has already been used with a different document or
                      was created from a different implementation.
                   NOT_SUPPORTED_ERR: May be raised by DOM implementations which do not support the 
                      "XML" feature, if they choose not to support this method. Other features introduced 
                      in the future, by the DOM WG or in extensions defined by other groups, may also 
                      demand support for this method; please consult the definition of the feature to see 
                      if it requires this method.
    */
    XDocument createDocument([in] string namespaceURI, [in] string qualifiedName, [in] XDocumentType doctype) 
        raises (DOMException);

    /**
    Creates an empty DocumentType node.
    Throws:
    DOMException - INVALID_CHARACTER_ERR: Raised if the specified qualified name contains an illegal character.
                   NAMESPACE_ERR: Raised if the qualifiedName is malformed.
                   NOT_SUPPORTED_ERR: May be raised by DOM implementations which do not support the 
                      "XML" feature, if they choose not to support this method. Other features introduced 
                      in the future, by the DOM WG or in extensions defined by other groups, may also demand 
                      support for this method; please consult the definition of the feature to see if it 
                      requires this method.
    */
    XDocumentType createDocumentType([in] string qualifiedName, [in] string publicId, [in] string systemId)
        raises (DOMException);

    /**
    Test if the DOM implementation implements a specific feature.
    */
    boolean hasFeature([in] string feature, [in] string ver);
};

}; }; }; }; };

#endif
