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



#if ! defined INCLUDED_com_sun_star_deployment_XPackageRegistry_idl
#define INCLUDED_com_sun_star_deployment_XPackageRegistry_idl

#include <com/sun/star/deployment/XPackage.idl>
#include <com/sun/star/deployment/XPackageTypeInfo.idl>
#include <com/sun/star/deployment/InvalidRemovedParameterException.idl>
#include <com/sun/star/beans/StringPair.idl>


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

/** Interface to bind an UNO package.
    
    @since OOo 2.0
*/
interface XPackageRegistry
{
    /** binds a package URL to a <type>XPackage</type> handle.
        The returned UNO package handle ought to late-initialize itself,
        thus the process of binding must not be an expensive operation, because
        it is not abortable.

        Calling the function several time with the same parameters must result
        in returning the same object.

        The file or folder at the location where url points to may not exist or
        it was replaced. This can happen, for example, when a bundled extension
        was removed by the setup and a user later starts OOo. Then the user data
        may still contain all registration data of that extension, but the
        actual extension files do not exist anymore. The registration data must
        then be cleaned of all the remains of that extension. To to that one
        creates an <type>XPackage</type> object on behalf of that extension and
        calls <member>XPackage::revokePakage</member>. The parameter
        <code>removed</code> indicates this case. The returned object may not
        rely on the file or folder to which refers <code>url</url>. Instead it
        must use previously saved data to successfully carry out the revocation
        of this object (<member>XPackage::revokePackage</member>).

        The implementation must ensure that there is only one instance of
        <type>XPackage</type> for the same <code>url</code> at any
        time. Therefore calling <member>bindPackage</member> again with the same
        <code>url</code> but different <code>mediaType<code> (the exeption is,
        if previsously an empty string was proveded to cause the determination
        of the media type) or <code>removed</code> parameters will cause an
        exception. An <type
        scope="com::sun::star::lang">IllegalArgumentException</type> will be
        thrown in case of a different <code>mediaType</code> parameter and a
        <type>InvalidRemovedParameterException</type> is thrown if the
        <code>removed</code> parameter is different.

        The <code>identifier</code> parameter must be provided when
        <code>removed</code> = true. If not, then an <type
        scope="com::sun::star::lang">IllegalArgumentException</type> will be
        thrown.
        
        @param url
               package URL, must be UCB conform
        @param mediaType
               media type of package, empty string if to be detected
        @param removed

        @para unfulfilledPrerequisites
              has a value other null if the extension could not be installed previously
              because <member>XPackage::checkPrerequisites</member> failed.
              
        @param identifier
               the identifier of the extension
               
        @param xCmdEnv
               command environment for error and progress handling
        @return
               <type>XPackage</type> handle
    */
    XPackage bindPackage(
        [in] string url,
        [in] string mediaType,
        [in] boolean removed,
        [in] string identifier,
        [in] com::sun::star::ucb::XCommandEnvironment xCmdEnv )
        raises (DeploymentException,
                InvalidRemovedParameterException,
                com::sun::star::ucb::CommandFailedException,
                com::sun::star::lang::IllegalArgumentException);
    
    /** gets the supported <type>XPackageTypeInfo</type>s.
        
        @return
                supported <type>XPackageTypeInfo</type>s.
    */
    sequence<XPackageTypeInfo> getSupportedPackageTypes();

    void packageRemoved(
        [in] string url,
        [in] string mediaType)
        raises (DeploymentException,
                com::sun::star::lang::IllegalArgumentException);

};

}; }; }; };

#endif
