/**************************************************************
 * 
 * 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_i18n_XExtendedTransliteration_idl__
#define __com_sun_star_i18n_XExtendedTransliteration_idl__

#include <com/sun/star/i18n/XTransliteration.idl>
#include <MultipleCharsOutputException.idl>

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

module com { module sun { module star { module i18n {

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


/**
    This interface provides character conversions like case folding or
    Hiragana to Katakana.

    <p> It is derived from
    <type scope="::com::sun::star::i18n">XTransliteration</type> and provides
    additional functionality for character to character and
    string to string without offset parameter transliteration. These
    should be used for performance reason if their full-blown
    counterparts aren't neded.  </p>

	 @since OpenOffice 1.1.2
 */
published interface XExtendedTransliteration : ::com::sun::star::i18n::XTransliteration
{
    //------------------------------------------------------------------------
    /** Transliterate a substring. The functionality is the same as
        <member scope="::com::sun::star::i18n">XTransliteration::transliterate()</member>
        but omits the offset prameter to improve performance.

        @param aStr
            The input string.

        @param nStartPos
            Start position within aStr from where transliteration starts.

        @param nCount
            Number of codepoints to be transliterated.

     */
    string  transliterateString2String( [in] string aStr,
            [in] long nStartPos, [in] long nCount );


    //------------------------------------------------------------------------
    /** Transliterate a character to a string.

        @param cChar
            The input character.
     */
    string  transliterateChar2String( [in] char cChar );

    //------------------------------------------------------------------------
    /** Transliterate a character to a character.

        <p> If the output contains multiple characters, for example when
        transliterating German sharp 's' (the one that looks like a
        Greek Beta) to upper case "SS", MultipleCharsOutputException
        will be thrown, the caller must catch the exception and then
        call
        <method>XTransliteration::transliterateChar2String()</method> to
        obtain the correct result. </p>

        @param cChar
            The input character.
     */
    char    transliterateChar2Char( [in] char cChar )
                raises( MultipleCharsOutputException );

};

//=============================================================================
}; }; }; };

#endif
