/**************************************************************
 * 
 * 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_logging_FileHandler_idl__
#define __com_sun_star_logging_FileHandler_idl__

#ifndef __com_sun_star_lang_IllegalArgumentException_idl__ 
#include <com/sun/star/lang/IllegalArgumentException.idl>
#endif
#ifndef __com_sun_star_beans_NamedValue_idl__
#include <com/sun/star/beans/NamedValue.idl>
#endif

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

module com { module sun { module star { module logging { 

interface XLogHandler;

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

/** specifies a component implementing a log handler whose output
    channel is a file.

    <p>The handler will use the <code>Encoding</code> attribute of <type>XLogHandler</type>
    to determine how to encode strings before actually writing them to the output
    file.</p>

    @see XLogHandler::Encoding

    @since OOo 2.3
 */
service FileHandler : XLogHandler
{
    /** creates a log handler whose output is directed to a file given by URL.

        @param FileURL
            the URL of the file to be created. This URL is resolved using the
            <type scope="::com::sun::star::util">PathSubstitution</type> service. That
            is, it is allowed to include placeholders such as <code>$(userurl)</code>.
    */
    create( [in] string FileURL );

    /** creates an instance of the log handler, using generic settings

        @param Settings
            contains the initial settings for the log handler

            <p>The following settings are recognized and supported:
            <ul><li><code>Encoding</code> - denotes the initial value of the <member>XLogHandler::Encoding</member></li>
                <li><code>Formatter</code> - denotes the initial value of the <member>XLogHandler::Formatter</member></li>
                <li><code>Level</code> - denotes the initial value of the <member>XLogHandler::Level</member></li>
            </ul></p>

            <p>Additionally, a setting name <code>FileURL</code> is recognized. It must be of type
            string, and denotes the file URL to which the handler's output should be directed.</p>

            <p>At least the URL argument must be present in the settings.</p>

        @throws ::com::sun::star::lang::IllegalArgumentException
            if <arg>Settings</args> contains settings whose value is of the wrong type.
    */
    createWithSettings( [in] sequence< ::com::sun::star::beans::NamedValue > Settings )
        raises ( ::com::sun::star::lang::IllegalArgumentException );
};

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

}; }; }; }; 

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

#endif
