/**************************************************************
 * 
 * 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_XNamedNodeMap_idl__
#define __com_sun_star_xml_dom_XNamedNodeMap_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 XNode;

interface XNamedNodeMap : com::sun::star::uno::XInterface
{

    /**
    The number of nodes in this map.
    */
    long getLength();

    /**
    Retrieves a node specified by local name     	
    */
    XNode getNamedItem([in] string name);

    /**
    Retrieves a node specified by local name and namespace URI.
    */
    XNode getNamedItemNS([in] string namespaceURI,[in]  string localName);

    /**
    Returns the indexth item in the map.
    */
    XNode item([in] long index);

    /**
    Removes a node specified by name.
    Throws:
    DOMException - NOT_FOUND_ERR: Raised if there is no node named name in this map.
    NO_MODIFICATION_ALLOWED_ERR: Raised if this map is readonly.
    */
    XNode removeNamedItem([in] string name) raises (DOMException);

    /**
    Removes a node specified by local name and namespace URI.
    Throws:
    DOMException - NOT_FOUND_ERR: Raised if there is no node with the specified namespaceURI and localName in this map.
    NO_MODIFICATION_ALLOWED_ERR: Raised if this map is readonly.
    */
    XNode removeNamedItemNS([in] string namespaceURI, [in] string localName) raises (DOMException);

    /**
    Adds a node using its nodeName attribute.
    Throws:
    DOMException - WRONG_DOCUMENT_ERR: Raised if arg was created from a different document than the one that created this map.
    NO_MODIFICATION_ALLOWED_ERR: Raised if this map is readonly.
    INUSE_ATTRIBUTE_ERR: Raised if arg is an Attr that is already an attribute of another Element object. The DOM user must explicitly clone Attr nodes to re-use them in other elements.
    HIERARCHY_REQUEST_ERR: Raised if an attempt is made to add a node doesn't belong in this NamedNodeMap. Examples would include trying to insert something other than an Attr node into an Element's map of attributes, or a non-Entity node into the DocumentType's map of Entities.
    */
    XNode setNamedItem([in] XNode arg) raises (DOMException);

    /**
    Adds a node using its namespaceURI and localName.
    Throws:
    DOMException - WRONG_DOCUMENT_ERR: Raised if arg was created from a different document than the one that created this map.
    NO_MODIFICATION_ALLOWED_ERR: Raised if this map is readonly.
    INUSE_ATTRIBUTE_ERR: Raised if arg is an Attr that is already an attribute of another Element object. The DOM user must explicitly clone Attr nodes to re-use them in other elements.
    HIERARCHY_REQUEST_ERR: Raised if an attempt is made to add a node doesn't belong in this NamedNodeMap. Examples would include trying to insert something other than an Attr node into an Element's map of attributes, or a non-Entity node into the DocumentType's map of Entities.
    NOT_SUPPORTED_ERR: Always thrown if the current document does not support the "XML" feature, since namespaces were defined by XML.
    */
    XNode setNamedItemNS([in] XNode arg) raises (DOMException);
};
}; }; }; }; };

#endif
