| /************************************************************** |
| * |
| * 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. |
| * |
| *************************************************************/ |
| |
| |
| |
| // no include "precompiled_tools.hxx" because this is included in other cxx files. |
| |
| // ----------------------------------------------------------------------- |
| |
| void ByteString::ImplUpdateStringFromUniString( |
| const sal_Unicode* pUniStr, sal_Size nUniLen, |
| rtl_TextEncoding eTextEncoding, sal_uInt32 nCvtFlags ) |
| { |
| ByteStringData* pNewStringData = NULL; |
| rtl_uString2String( (rtl_String **)(&pNewStringData), |
| pUniStr, nUniLen, |
| eTextEncoding, nCvtFlags ); |
| STRING_RELEASE((STRING_TYPE *)mpData); |
| mpData = pNewStringData; |
| } |
| |
| // ======================================================================= |
| |
| ByteString::ByteString( const UniString& rUniStr, rtl_TextEncoding eTextEncoding, sal_uInt32 nCvtFlags ) |
| { |
| DBG_CTOR( ByteString, DbgCheckByteString ); |
| DBG_CHKOBJ( &rUniStr, UniString, DbgCheckUniString ); |
| |
| mpData = NULL; |
| rtl_uString2String( (rtl_String **)(&mpData), |
| rUniStr.mpData->maStr, rUniStr.mpData->mnLen, |
| eTextEncoding, nCvtFlags ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| ByteString::ByteString( const UniString& rUniStr, xub_StrLen nPos, xub_StrLen nLen, |
| rtl_TextEncoding eTextEncoding, sal_uInt32 nCvtFlags ) |
| { |
| DBG_CTOR( ByteString, DbgCheckByteString ); |
| DBG_CHKOBJ( &rUniStr, UniString, DbgCheckUniString ); |
| |
| // Stringlaenge ermitteln |
| if ( nPos > rUniStr.mpData->mnLen ) |
| nLen = 0; |
| else |
| { |
| // Laenge korrigieren, wenn noetig |
| sal_Int32 nMaxLen = rUniStr.mpData->mnLen-nPos; |
| if ( nLen > nMaxLen ) |
| nLen = static_cast< xub_StrLen >(nMaxLen); |
| } |
| |
| mpData = NULL; |
| rtl_uString2String( (rtl_String **)(&mpData), |
| rUniStr.mpData->maStr+nPos, nLen, |
| eTextEncoding, nCvtFlags ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| ByteString::ByteString( const sal_Unicode* pUniStr, |
| rtl_TextEncoding eTextEncoding, sal_uInt32 nCvtFlags ) |
| { |
| DBG_CTOR( ByteString, DbgCheckByteString ); |
| DBG_ASSERT( pUniStr, "ByteString::ByteString() - pUniStr is NULL" ); |
| |
| mpData = NULL; |
| rtl_uString2String( (rtl_String **)(&mpData), |
| pUniStr, ImplStringLen( pUniStr ), |
| eTextEncoding, nCvtFlags ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| ByteString::ByteString( const sal_Unicode* pUniStr, xub_StrLen nLen, |
| rtl_TextEncoding eTextEncoding, sal_uInt32 nCvtFlags ) |
| { |
| DBG_CTOR( ByteString, DbgCheckByteString ); |
| DBG_ASSERT( pUniStr, "ByteString::ByteString() - pUniStr is NULL" ); |
| |
| if ( nLen == STRING_LEN ) |
| nLen = ImplStringLen( pUniStr ); |
| |
| mpData = NULL; |
| rtl_uString2String( (rtl_String **)(&mpData), |
| pUniStr, nLen, |
| eTextEncoding, nCvtFlags ); |
| } |
| |
| // ======================================================================= |
| |
| static sal_uChar aImplByteTab[256] = |
| { |
| 0, 1, 2, 3, 4, 5, 6, 7, |
| 8, 9, 10, 11, 12, 13, 14, 15, |
| 16, 17, 18, 19, 20, 21, 22, 23, |
| 24, 25, 26, 27, 28, 29, 30, 31, |
| 32, 33, 34, 35, 36, 37, 38, 39, |
| 40, 41, 42, 43, 44, 45, 46, 47, |
| 48, 49, 50, 51, 52, 53, 54, 55, |
| 56, 57, 58, 59, 60, 61, 62, 63, |
| 64, 65, 66, 67, 68, 69, 70, 71, |
| 72, 73, 74, 75, 76, 77, 78, 79, |
| 80, 81, 82, 83, 84, 85, 86, 87, |
| 88, 89, 90, 91, 92, 93, 94, 95, |
| 96, 97, 98, 99, 100, 101, 102, 103, |
| 104, 105, 106, 107, 108, 109, 110, 111, |
| 112, 113, 114, 115, 116, 117, 118, 119, |
| 120, 121, 122, 123, 124, 125, 126, 127, |
| 128, 129, 130, 131, 132, 133, 134, 135, |
| 136, 137, 138, 139, 140, 141, 142, 143, |
| 144, 145, 146, 147, 148, 149, 150, 151, |
| 152, 153, 154, 155, 156, 157, 158, 159, |
| 160, 161, 162, 163, 164, 165, 166, 167, |
| 168, 169, 170, 171, 172, 173, 174, 175, |
| 176, 177, 178, 179, 180, 181, 182, 183, |
| 184, 185, 186, 187, 188, 189, 190, 191, |
| 192, 193, 194, 195, 196, 197, 198, 199, |
| 200, 201, 202, 203, 204, 205, 206, 207, |
| 208, 209, 210, 211, 212, 213, 214, 215, |
| 216, 217, 218, 219, 220, 221, 222, 223, |
| 224, 225, 226, 227, 228, 229, 230, 231, |
| 232, 233, 234, 235, 236, 237, 238, 239, |
| 240, 241, 242, 243, 244, 245, 246, 247, |
| 248, 249, 250, 251, 252, 253, 254, 255 |
| }; |
| |
| // ======================================================================= |
| |
| struct Impl1ByteUnicodeTabData |
| { |
| rtl_TextEncoding meTextEncoding; |
| sal_Unicode maUniTab[256]; |
| Impl1ByteUnicodeTabData* mpNext; |
| }; |
| |
| // ----------------------------------------------------------------------- |
| |
| struct Impl1ByteConvertTabData |
| { |
| rtl_TextEncoding meSrcTextEncoding; |
| rtl_TextEncoding meDestTextEncoding; |
| sal_uChar maConvertTab[256]; |
| sal_uChar maRepConvertTab[256]; |
| Impl1ByteConvertTabData* mpNext; |
| }; |
| |
| // ======================================================================= |
| |
| sal_Unicode* ImplGet1ByteUnicodeTab( rtl_TextEncoding eTextEncoding ) |
| { |
| #ifndef BOOTSTRAP |
| TOOLSINDATA* pToolsData = ImplGetToolsInData(); |
| #else |
| TOOLSINDATA* pToolsData = 0x0; |
| #endif |
| Impl1ByteUnicodeTabData* pTab = pToolsData->mpFirstUniTabData; |
| |
| while ( pTab ) |
| { |
| if ( pTab->meTextEncoding == eTextEncoding ) |
| return pTab->maUniTab; |
| pTab = pTab->mpNext; |
| } |
| |
| // get TextEncodingInfo |
| rtl_TextEncodingInfo aTextEncInfo; |
| aTextEncInfo.StructSize = sizeof( aTextEncInfo ); |
| rtl_getTextEncodingInfo( eTextEncoding, &aTextEncInfo ); |
| |
| if ( aTextEncInfo.MaximumCharSize == 1 ) |
| { |
| pTab = new Impl1ByteUnicodeTabData; |
| pTab->meTextEncoding = eTextEncoding; |
| pTab->mpNext = pToolsData->mpFirstUniTabData; |
| |
| rtl_TextToUnicodeConverter hConverter; |
| sal_uInt32 nInfo; |
| sal_Size nSrcBytes; |
| sal_Size nDestChars; |
| hConverter = rtl_createTextToUnicodeConverter( eTextEncoding ); |
| nDestChars = rtl_convertTextToUnicode( hConverter, 0, |
| (const sal_Char*)aImplByteTab, 256, |
| pTab->maUniTab, 256, |
| RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE | |
| RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT | |
| RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT, |
| &nInfo, &nSrcBytes ); |
| rtl_destroyTextToUnicodeConverter( hConverter ); |
| |
| if ( (nSrcBytes != 256) || (nDestChars != 256) ) |
| delete pTab; |
| else |
| { |
| pToolsData->mpFirstUniTabData = pTab; |
| return pTab->maUniTab; |
| } |
| } |
| |
| return NULL; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| static sal_uChar* ImplGet1ByteConvertTab( rtl_TextEncoding eSrcTextEncoding, |
| rtl_TextEncoding eDestTextEncoding, |
| sal_Bool bReplace ) |
| { |
| #ifndef BOOTSTRAP |
| TOOLSINDATA* pToolsData = ImplGetToolsInData(); |
| #else |
| TOOLSINDATA* pToolsData = 0x0; |
| #endif |
| Impl1ByteConvertTabData* pTab = pToolsData->mpFirstConvertTabData; |
| |
| while ( pTab ) |
| { |
| if ( (pTab->meSrcTextEncoding == eSrcTextEncoding) && |
| (pTab->meDestTextEncoding == eDestTextEncoding) ) |
| { |
| if ( bReplace ) |
| return pTab->maRepConvertTab; |
| else |
| return pTab->maConvertTab; |
| } |
| pTab = pTab->mpNext; |
| } |
| |
| // get TextEncodingInfo |
| rtl_TextEncodingInfo aTextEncInfo1; |
| aTextEncInfo1.StructSize = sizeof( aTextEncInfo1 ); |
| rtl_getTextEncodingInfo( eSrcTextEncoding, &aTextEncInfo1 ); |
| rtl_TextEncodingInfo aTextEncInfo2; |
| aTextEncInfo2.StructSize = sizeof( aTextEncInfo2 ); |
| rtl_getTextEncodingInfo( eDestTextEncoding, &aTextEncInfo2 ); |
| |
| if ( (aTextEncInfo1.MaximumCharSize == 1) && |
| (aTextEncInfo2.MaximumCharSize == 1) ) |
| { |
| pTab = new Impl1ByteConvertTabData; |
| pTab->meSrcTextEncoding = eSrcTextEncoding; |
| pTab->meDestTextEncoding = eDestTextEncoding; |
| pTab->mpNext = pToolsData->mpFirstConvertTabData; |
| |
| rtl_TextToUnicodeConverter hConverter; |
| rtl_UnicodeToTextConverter hConverter2; |
| sal_uInt32 nInfo; |
| sal_Size nSrcBytes; |
| sal_Size nDestChars; |
| sal_Size nSrcChars; |
| sal_Size nDestBytes; |
| sal_Unicode aTempBuf[256]; |
| hConverter = rtl_createTextToUnicodeConverter( eSrcTextEncoding ); |
| nDestChars = rtl_convertTextToUnicode( hConverter, 0, |
| (const sal_Char*)aImplByteTab, 256, |
| aTempBuf, 256, |
| RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_DEFAULT | |
| RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT | |
| RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT, |
| &nInfo, &nSrcBytes ); |
| rtl_destroyTextToUnicodeConverter( hConverter ); |
| if ( (nSrcBytes != 256) || (nDestChars != 256) ) |
| delete pTab; |
| else |
| { |
| hConverter2 = rtl_createUnicodeToTextConverter( eDestTextEncoding ); |
| nDestBytes = rtl_convertUnicodeToText( hConverter2, 0, |
| aTempBuf, 256, |
| (sal_Char*)pTab->maConvertTab, 256, |
| RTL_UNICODETOTEXT_FLAGS_UNDEFINED_0 | |
| RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT, |
| &nInfo, &nSrcChars ); |
| if ( (nDestBytes == 256) || (nSrcChars == 256) ) |
| { |
| nDestBytes = rtl_convertUnicodeToText( hConverter2, 0, |
| aTempBuf, 256, |
| (sal_Char*)pTab->maRepConvertTab, 256, |
| RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT | |
| RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT | |
| RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE, |
| &nInfo, &nSrcChars ); |
| } |
| rtl_destroyUnicodeToTextConverter( hConverter2 ); |
| if ( (nDestBytes != 256) || (nSrcChars != 256) ) |
| delete pTab; |
| else |
| { |
| pToolsData->mpFirstConvertTabData = pTab; |
| if ( bReplace ) |
| return pTab->maRepConvertTab; |
| else |
| return pTab->maConvertTab; |
| } |
| } |
| } |
| |
| return NULL; |
| } |
| |
| // ======================================================================= |
| |
| void ImplDeleteCharTabData() |
| { |
| #ifndef BOOTSTRAP |
| TOOLSINDATA* pToolsData = ImplGetToolsInData(); |
| #else |
| TOOLSINDATA* pToolsData = 0x0; |
| #endif |
| Impl1ByteUnicodeTabData* pTempUniTab; |
| Impl1ByteUnicodeTabData* pUniTab = pToolsData->mpFirstUniTabData; |
| while ( pUniTab ) |
| { |
| pTempUniTab = pUniTab->mpNext; |
| delete pUniTab; |
| pUniTab = pTempUniTab; |
| } |
| pToolsData->mpFirstUniTabData = NULL; |
| |
| Impl1ByteConvertTabData* pTempConvertTab; |
| Impl1ByteConvertTabData* pConvertTab = pToolsData->mpFirstConvertTabData; |
| while ( pConvertTab ) |
| { |
| pTempConvertTab = pConvertTab->mpNext; |
| delete pConvertTab; |
| pConvertTab = pTempConvertTab; |
| } |
| pToolsData->mpFirstConvertTabData = NULL; |
| } |
| |
| // ======================================================================= |
| |
| void ByteString::ImplStringConvert( |
| rtl_TextEncoding eSource, rtl_TextEncoding eTarget, sal_Bool bReplace ) |
| { |
| sal_uChar* pConvertTab = ImplGet1ByteConvertTab( eSource, eTarget, bReplace ); |
| if ( pConvertTab ) |
| { |
| char* pStr = mpData->maStr; |
| while ( *pStr ) |
| { |
| sal_uChar c = (sal_uChar)*pStr; |
| sal_uChar cConv = pConvertTab[c]; |
| if ( c != cConv ) |
| { |
| pStr = ImplCopyStringData( pStr ); |
| *pStr = (char)cConv; |
| } |
| |
| pStr++; |
| } |
| } |
| else |
| { |
| rtl_UnicodeToTextConverter hSrcConverter = rtl_createTextToUnicodeConverter( eSource ); |
| sal_uInt32 nInfo; |
| sal_Size nSrcBytes; |
| sal_Size nDestChars; |
| sal_Size nTempLen; |
| sal_Unicode* pTempBuf; |
| nTempLen = mpData->mnLen; |
| pTempBuf = new sal_Unicode[nTempLen]; |
| nDestChars = rtl_convertTextToUnicode( hSrcConverter, 0, |
| mpData->maStr, mpData->mnLen, |
| pTempBuf, nTempLen, |
| RTL_TEXTTOUNICODE_FLAGS_FLUSH | |
| RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE | |
| RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT | |
| RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT, |
| &nInfo, &nSrcBytes ); |
| rtl_destroyTextToUnicodeConverter( hSrcConverter ); |
| // Hier werten wir bReplace nicht aus, da fuer MultiByte-Textencodings |
| // sowieso keine Ersatzdarstellung moeglich ist. Da sich der String |
| // sowieso in der Laenge aendern kann, nehmen wir auch sonst keine |
| // Ruecksicht darauf, das die Laenge erhalten bleibt. |
| ImplUpdateStringFromUniString( pTempBuf, nDestChars, eTarget, |
| RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT | |
| RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT | |
| RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE | |
| RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACESTR | |
| RTL_UNICODETOTEXT_FLAGS_PRIVATE_MAPTO0 | |
| RTL_UNICODETOTEXT_FLAGS_NONSPACING_IGNORE | |
| RTL_UNICODETOTEXT_FLAGS_CONTROL_IGNORE ); |
| delete [] pTempBuf; |
| } |
| } |
| |
| // ======================================================================= |
| |
| ByteString& ByteString::Convert( rtl_TextEncoding eSource, rtl_TextEncoding eTarget, sal_Bool bReplace ) |
| { |
| DBG_CHKTHIS( ByteString, DbgCheckByteString ); |
| |
| // rtl_TextEncoding Dontknow kann nicht konvertiert werden |
| if ( (eSource == RTL_TEXTENCODING_DONTKNOW) || (eTarget == RTL_TEXTENCODING_DONTKNOW) ) |
| return *this; |
| |
| // Wenn Source und Target gleich sind, muss nicht konvertiert werden |
| if ( eSource == eTarget ) |
| return *this; |
| |
| // rtl_TextEncoding Symbol nur nach Unicode oder von Unicode wandeln, ansonsten |
| // wollen wir die Zeichencodes beibehalten |
| if ( (eSource == RTL_TEXTENCODING_SYMBOL) && |
| (eTarget != RTL_TEXTENCODING_UTF7) && |
| (eTarget != RTL_TEXTENCODING_UTF8) ) |
| return *this; |
| if ( (eTarget == RTL_TEXTENCODING_SYMBOL) && |
| (eSource != RTL_TEXTENCODING_UTF7) && |
| (eSource != RTL_TEXTENCODING_UTF8) ) |
| return *this; |
| |
| // Zeichensatz umwandeln |
| ImplStringConvert( eSource, eTarget, bReplace ); |
| |
| return *this; |
| } |
| |
| // ======================================================================= |
| |
| char ByteString::Convert( char c, |
| rtl_TextEncoding eSource, rtl_TextEncoding eTarget, |
| sal_Bool bReplace ) |
| { |
| // TextEncoding Dontknow kann nicht konvertiert werden |
| if ( (eSource == RTL_TEXTENCODING_DONTKNOW) || (eTarget == RTL_TEXTENCODING_DONTKNOW) ) |
| return '\0'; |
| |
| // Wenn Source und Target gleich sind, muss nicht konvertiert werden |
| if ( eSource == eTarget ) |
| return c; |
| |
| // TextEncoding Symbol nur nach Unicode oder von Unicode wandeln, ansonsten |
| // wollen wir die Zeichencodes beibehalten |
| if ( (eSource == RTL_TEXTENCODING_SYMBOL) && |
| (eTarget != RTL_TEXTENCODING_UTF7) && |
| (eTarget != RTL_TEXTENCODING_UTF8) ) |
| return '\0'; |
| if ( (eTarget == RTL_TEXTENCODING_SYMBOL) && |
| (eSource != RTL_TEXTENCODING_UTF7) && |
| (eSource != RTL_TEXTENCODING_UTF8) ) |
| return '\0'; |
| |
| sal_uChar* pConvertTab = ImplGet1ByteConvertTab( eSource, eTarget, bReplace ); |
| if ( pConvertTab ) |
| return (char)pConvertTab[(sal_uChar)c]; |
| else |
| return '\0'; |
| } |
| |
| // ======================================================================= |
| |
| sal_Unicode ByteString::ConvertToUnicode( char c, rtl_TextEncoding eTextEncoding ) |
| { |
| sal_Size nLen = 1; |
| return ConvertToUnicode( &c, &nLen, eTextEncoding ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| char ByteString::ConvertFromUnicode( sal_Unicode c, rtl_TextEncoding eTextEncoding, sal_Bool bReplace ) |
| { |
| sal_Size nLen; |
| char aBuf[30]; |
| nLen = ConvertFromUnicode( c, aBuf, sizeof( aBuf ), eTextEncoding, bReplace ); |
| if ( nLen == 1 ) |
| return aBuf[0]; |
| else |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Unicode ByteString::ConvertToUnicode( const char* pChar, sal_Size* pLen, rtl_TextEncoding eTextEncoding ) |
| { |
| // TextEncoding Dontknow wird nicht konvertiert |
| if ( eTextEncoding == RTL_TEXTENCODING_DONTKNOW ) |
| return 0; |
| |
| rtl_TextToUnicodeConverter hConverter; |
| sal_uInt32 nInfo; |
| sal_Size nSrcBytes; |
| sal_Size nDestChars; |
| sal_Unicode nConvChar; |
| hConverter = rtl_createTextToUnicodeConverter( eTextEncoding ); |
| nDestChars = rtl_convertTextToUnicode( hConverter, 0, |
| (const sal_Char*)pChar, *pLen, |
| &nConvChar, 1, |
| RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_DEFAULT | |
| RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT | |
| RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT | |
| RTL_TEXTTOUNICODE_FLAGS_FLUSH, |
| &nInfo, &nSrcBytes ); |
| rtl_destroyTextToUnicodeConverter( hConverter ); |
| |
| if ( nDestChars == 1 ) |
| { |
| *pLen = nSrcBytes; |
| return nConvChar; |
| } |
| else |
| { |
| *pLen = 0; |
| return 0; |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Size ByteString::ConvertFromUnicode( sal_Unicode c, char* pBuf, sal_Size nBufLen, rtl_TextEncoding eTextEncoding, |
| sal_Bool bReplace ) |
| { |
| // TextEncoding Dontknow wird nicht konvertiert |
| if ( eTextEncoding == RTL_TEXTENCODING_DONTKNOW ) |
| return '\0'; |
| |
| rtl_UnicodeToTextConverter hConverter; |
| sal_uInt32 nInfo; |
| sal_Size nSrcChars; |
| sal_Size nDestBytes; |
| sal_Unicode cUni = c; |
| sal_uInt32 nFlags = RTL_UNICODETOTEXT_FLAGS_NONSPACING_IGNORE | |
| RTL_UNICODETOTEXT_FLAGS_CONTROL_IGNORE | |
| RTL_UNICODETOTEXT_FLAGS_FLUSH; |
| if ( bReplace ) |
| { |
| nFlags |= RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT | |
| RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT; |
| nFlags |= RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE; |
| if ( nBufLen > 1 ) |
| nFlags |= RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACESTR; |
| } |
| else |
| { |
| nFlags |= RTL_UNICODETOTEXT_FLAGS_UNDEFINED_0 | |
| RTL_UNICODETOTEXT_FLAGS_INVALID_0; |
| } |
| |
| hConverter = rtl_createUnicodeToTextConverter( eTextEncoding ); |
| nDestBytes = rtl_convertUnicodeToText( hConverter, 0, |
| &cUni, 1, |
| (sal_Char*)pBuf, nBufLen, |
| nFlags, |
| &nInfo, &nSrcChars ); |
| rtl_destroyUnicodeToTextConverter( hConverter ); |
| return nDestBytes; |
| } |
| |
| // ======================================================================= |
| |
| ByteString::ByteString( const rtl::OString& rStr ) |
| : mpData(NULL) |
| { |
| DBG_CTOR( ByteString, DbgCheckByteString ); |
| |
| OSL_ENSURE(rStr.pData->length < STRING_MAXLEN, |
| "Overflowing rtl::OString -> ByteString cut to zero length"); |
| |
| if (rStr.pData->length < STRING_MAXLEN) |
| { |
| mpData = reinterpret_cast< ByteStringData * >(const_cast< rtl::OString & >(rStr).pData); |
| STRING_ACQUIRE((STRING_TYPE *)mpData); |
| } |
| else |
| { |
| STRING_NEW((STRING_TYPE **)&mpData); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| ByteString& ByteString::Assign( const rtl::OString& rStr ) |
| { |
| DBG_CHKTHIS( ByteString, DbgCheckByteString ); |
| |
| OSL_ENSURE(rStr.pData->length < STRING_MAXLEN, |
| "Overflowing rtl::OString -> ByteString cut to zero length"); |
| |
| if (rStr.pData->length < STRING_MAXLEN) |
| { |
| STRING_RELEASE((STRING_TYPE *)mpData); |
| mpData = reinterpret_cast< ByteStringData * >(const_cast< rtl::OString & >(rStr).pData); |
| STRING_ACQUIRE((STRING_TYPE *)mpData); |
| } |
| else |
| { |
| STRING_NEW((STRING_TYPE **)&mpData); |
| } |
| |
| return *this; |
| } |