/**************************************************************
 * 
 * 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_ucb_HierarchyDataReadWriteAccess_idl__
#define __com_sun_star_ucb_HierarchyDataReadWriteAccess_idl__

#ifndef __com_sun_star_ucb_HierarchyDataReadAccess_idl__
#include <com/sun/star/ucb/HierarchyDataReadAccess.idl>
#endif
#ifndef __com_sun_star_container_XNameContainer_idl__
#include <com/sun/star/container/XNameContainer.idl>
#endif
#ifndef __com_sun_star_lang_XSingleServiceFactory_idl__
#include <com/sun/star/lang/XSingleServiceFactory.idl>
#endif
#ifndef __com_sun_star_util_XChangesBatch_idl__
#include <com/sun/star/util/XChangesBatch.idl>
#endif

//=============================================================================

module com { module sun { module star { module ucb {

//=============================================================================
/** provides read and write access to a fragment of the hierarchy data.
*/
published service HierarchyDataReadWriteAccess
{
	//-------------------------------------------------------------------------
    /** provides read access to a fragment of the hierarchy data
	 */
    service HierarchyDataReadAccess;

	//-------------------------------------------------------------------------
    /** allows adding and removing of hierarchy data nodes, replacing of
        the value of hierarchy data node members, as well as obtaining the
        value of hieryrchy data node members.

        <p>Adding and removing must only be supported if the access object
        points to the "Children" data member of a node or to the root node.
        It will insert a new node or or remove an existing one. If supported
        on data nodes, adding must add new data members to the node, removing
        must remove data members. However, the mandatory data members (Title,
        TargetURL, Children) must never be removable.

        <p>Replacing and getting values must be supported be every data node.
	 */
    interface com::sun::star::container::XNameContainer;

	//-------------------------------------------------------------------------
	/** gives access to all contents provided by this provider.

        <p><member scope="com::sun::star::lang">XSingleServiceFactory::createInstance</member>
        will create a new empty hierarchy data node. After it was created
        it's data members can be filled. Last, the node can be inserted as child
        of another node using
        <member scope="com::sun::star::container">XNameContainer::insertByName</member>.

        <p>There are no special arguments that must be supported by
        <member scope="com::sun::star::lang">XSingleServiceFactory::createInstanceWithArguments</member>
	 */
    interface com::sun::star::lang::XSingleServiceFactory;

	//-------------------------------------------------------------------------
    /** allows managing changes within the hierarchy.

        <p><member scope="com::sun::star::util">XChangesBatch::getPendingChanges</member>
        reports all changes within the hierarchy that are done through (direct
        or indirect) descendants of this element. The same set of changes is
        committed to persistent storage and/or made visible to other objects
        accessing the same data set, when
        <member scope="com::sun::star::util">XChangesBatch::commitChanges</member>
        is invoked.
     */
    interface com::sun::star::util::XChangesBatch;
};

//=============================================================================

}; }; }; };

#endif
