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




#include <com/sun/star/uno/XInterface.idl>
#include <com/sun/star/uno/Exception.idl>

module com { module sun { module star { module container {
interface XEnumeration;
}; }; }; };

module com { module sun { module star { module task {
interface XInteractionHandler;
}; }; }; };

module com { module sun { module star { module xml { module dom {
interface XElement;
}; }; }; }; };

module com { module sun { module star { module deployment {

/** Objects implementing this interface provide access to the xml root of 
    one or more update information files for a given set of URLs.
    
    @since OpenOffice 2.2
*/
interface XUpdateInformationProvider
{
    /** get update information for a specific extension or all available 
        information from a repository.

        @param repositories
               a repository and its mirrors.
        @param extensionId
               the unique identifier of an extension. If it is not empty and
               the update document is an atom feed, only items whose 'term'
               attribute of the atom:category tag matches extensionId are returned.
               
    */
    sequence < com::sun::star::xml::dom::XElement > getUpdateInformation(
        [in] sequence< string > repositories, 
        [in] string extensionId 
    ) raises ( com::sun::star::uno::Exception );

    /** interrupts a getUpdateInformation call and let's it return immediately.
    */
    void cancel();

    /** Sets an interaction handler to be used for further operations.

    <p>
    A default interaction handler is available as service
        <type scope="com::sun::star::task">InteractionHandler</type>.
        The documentation of this service also contains further
        information about the interaction handler concept.
    </p>

    @see com::sun::star::task::InteractionHandler

    @param handler
           The interaction handler to be set
    */
    void setInteractionHandler( [in] com::sun::star::task::XInteractionHandler handler );

	/** get update information for a specific extension or all available
        information from a repository.

        @param repositories
               a repository and its mirrors.
        @param extensionId
               the unique identifier of an extension. If it is not empty and
               the update document is an atom feed, only items whose 'term'
               attribute of the atom:category tag matches extensionId are returned.

        @returns
               an enumeration of <type>UpdateInformationEntry</type>.
    */
    com::sun::star::container::XEnumeration getUpdateInformationEnumeration(
        [in] sequence< string > repositories,
        [in] string extensionId
    ) raises ( com::sun::star::uno::Exception );
};

}; }; }; };

