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