/**************************************************************
 *
 * 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_uri_XVndSunStarExpandUrl_idl__
#define __com_sun_star_uri_XVndSunStarExpandUrl_idl__

#include "com/sun/star/lang/IllegalArgumentException.idl"
#include "com/sun/star/uno/XInterface.idl"

module com { module sun { module star { module util {
    published interface XMacroExpander;
}; }; }; };

module com { module sun { module star { module uri {

/**
   represents absolute &ldquo;vnd.sun.star.expand&rdquo; URLs.

   <p>These URLs are of the form<br/>
   &emsp;<var>vnd-sun-star-expand-url</var> =
   <code>"VND.SUN.STAR.EXPAND:"</code> <var>opaque_part</var><br/>
   where the <var>opaque_part</var> is an UTF-8 string as described in
   <a href="http://udk.openoffice.org/common/man/concept/micro_deployment.html">
   <cite>Bootstrap Arguments and Micro Deployment</cite></a>.  See
   <a href="http://www.ietf.org/rfc/rfc2396.txt">RFC&nbsp;2396</a>,
   <a href="http://www.ietf.org/rfc/rfc2732.txt">RFC&nbsp;2732</a>, and
   <a href="http://www.ietf.org/rfc/rfc2234.txt">RFC&nbsp;2234</a> for
   details.</p>

   @since OpenOffice 2.3
 */
published interface XVndSunStarExpandUrl {
    /**
       returns the expanded content of this URL.

       @param expander
       a macro expander; must not be <NULL/>.

       @returns
       the expanded content of this URL.

       @throws com::sun::star::lang::IllegalArgumentException
       if calling <member
       scope="com::sun::star::util">XMacroExpander::expandMacros</member> on
       <code>expander</code> raises any such exception.
     */
    string expand([in] com::sun::star::util::XMacroExpander expander)
        raises (com::sun::star::lang::IllegalArgumentException);
};

}; }; }; };

#endif
