/**************************************************************
 * 
 * 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_document_ExportFilter_idl__
#define __com_sun_star_document_ExportFilter_idl__

#ifndef __com_sun_star_document_XExporter_idl__
#include <com/sun/star/document/XExporter.idl>
#endif

#ifndef __com_sun_star_document_XFilter_idl__
#include <com/sun/star/document/XFilter.idl>
#endif

#ifndef __com_sun_star_lang_XInitialization_idl__
#include <com/sun/star/lang/XInitialization.idl>
#endif

#ifndef __com_sun_star_container_XNamed_idl__
#include <com/sun/star/container/XNamed.idl>
#endif

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

module com { module sun { module star { module document {

//=============================================================================
/** filter for exports

    <p>
    Such filters can be used for exporting a content.
    Of course it's possible to combine it with the service <type>ImportFilter</type>
    if import functionality should be available at same implementation too.
    </p>

    @see ImportFilter
 */
published service ExportFilter
{
	//-------------------------------------------------------------------------
    /** set source(!) document for this filter

		<p>
        The document must be used as the source for following filter operation.
        Any content from there will be exported to another format.
		</p>
	 */
    interface XExporter;

	//-------------------------------------------------------------------------
    /** filter interface

		<p>
        It's used to filter a document at saving time.
        The source document should be already setted by using another interface
        <type>XExporter</type> which is supported by this service too.
        </p>

        <p>
        Tip:<br>
        If same implementation provides the service <type>ImportFilter</type> too,
        code must distinguish between filtering from a source document (for export) or
        filtering to a target document (for import). This can be recognized by saving
        state of used interfaces <type>XExporter</type> or <type>XImporter</type>!
        Otherwise it's not clear which action is required here.
 		</p>
 	*/
    interface XFilter;

	//-------------------------------------------------------------------------
    /** support initialization of filter with its own configuration

		<p>
        A filter object must be created by global service <type>FilterFactory</type>.
        If filter supports this optional interface, he will be initialized by the factory directly
        after creation. The factory will pass follow informations to this new instance:
            <ul>
                <li>first item will be a set of configuration data of the filter</li>
                <li>after that will follow may given optional parameters of call
                    <member scope="com::sun::star::lang">XMultiServiceFactory::createInstanceWithArguments()</member>
                    of service <type>FilterFactory</type>.
                </li>
            </ul>
        See description of service <member>FilterFactory::XNameContainer</member> for a description of
        possible configuration data.
        </p>
	 */
	[optional] interface com::sun::star::lang::XInitialization;

	//-------------------------------------------------------------------------
    /** provides access to the internal name of this filter

		<p>
        This internal filter name can be used on service <type>FilterFactory</type>
        to get further informations about it (e.g. his registration for mime types or extensions etc.)
        It's important that returned string is the "internal name" of the filter which must be
        unambigous against all other registered filter in current instalation.
        </p>
        <p>
        <strong>Attention!</strong><br>
        Supported method setName() sould be ignored or forwarded to the FilterFactory.
        It's not allowed to set it directly to the configuration. Because it depends
        from real implementation of the FilterFactory if it will be allowed or not!
 		</p>
 	*/
    [optional] interface com::sun::star::container::XNamed;
};

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

}; }; }; };

#endif
