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