xref: /trunk/main/tools/source/string/strcvt.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // no include "precompiled_tools.hxx" because this is included in other cxx files.
29 
30 // -----------------------------------------------------------------------
31 
32 void ByteString::ImplUpdateStringFromUniString(
33     const sal_Unicode* pUniStr, sal_Size nUniLen,
34     rtl_TextEncoding eTextEncoding, sal_uInt32 nCvtFlags )
35 {
36     ByteStringData* pNewStringData = NULL;
37     rtl_uString2String( (rtl_String **)(&pNewStringData),
38                         pUniStr, nUniLen,
39                         eTextEncoding, nCvtFlags );
40     STRING_RELEASE((STRING_TYPE *)mpData);
41     mpData = pNewStringData;
42 }
43 
44 // =======================================================================
45 
46 ByteString::ByteString( const UniString& rUniStr, rtl_TextEncoding eTextEncoding, sal_uInt32 nCvtFlags )
47 {
48     DBG_CTOR( ByteString, DbgCheckByteString );
49     DBG_CHKOBJ( &rUniStr, UniString, DbgCheckUniString );
50 
51     mpData = NULL;
52     rtl_uString2String( (rtl_String **)(&mpData),
53                         rUniStr.mpData->maStr, rUniStr.mpData->mnLen,
54                         eTextEncoding, nCvtFlags );
55 }
56 
57 // -----------------------------------------------------------------------
58 
59 ByteString::ByteString( const UniString& rUniStr, xub_StrLen nPos, xub_StrLen nLen,
60                         rtl_TextEncoding eTextEncoding, sal_uInt32 nCvtFlags )
61 {
62     DBG_CTOR( ByteString, DbgCheckByteString );
63     DBG_CHKOBJ( &rUniStr, UniString, DbgCheckUniString );
64 
65     // Stringlaenge ermitteln
66     if ( nPos > rUniStr.mpData->mnLen )
67         nLen = 0;
68     else
69     {
70         // Laenge korrigieren, wenn noetig
71         sal_Int32 nMaxLen = rUniStr.mpData->mnLen-nPos;
72         if ( nLen > nMaxLen )
73             nLen = static_cast< xub_StrLen >(nMaxLen);
74     }
75 
76     mpData = NULL;
77     rtl_uString2String( (rtl_String **)(&mpData),
78                         rUniStr.mpData->maStr+nPos, nLen,
79                         eTextEncoding, nCvtFlags );
80 }
81 
82 // -----------------------------------------------------------------------
83 
84 ByteString::ByteString( const sal_Unicode* pUniStr,
85                         rtl_TextEncoding eTextEncoding, sal_uInt32 nCvtFlags )
86 {
87     DBG_CTOR( ByteString, DbgCheckByteString );
88     DBG_ASSERT( pUniStr, "ByteString::ByteString() - pUniStr is NULL" );
89 
90     mpData = NULL;
91     rtl_uString2String( (rtl_String **)(&mpData),
92                         pUniStr, ImplStringLen( pUniStr ),
93                         eTextEncoding, nCvtFlags );
94 }
95 
96 // -----------------------------------------------------------------------
97 
98 ByteString::ByteString( const sal_Unicode* pUniStr, xub_StrLen nLen,
99                         rtl_TextEncoding eTextEncoding, sal_uInt32 nCvtFlags )
100 {
101     DBG_CTOR( ByteString, DbgCheckByteString );
102     DBG_ASSERT( pUniStr, "ByteString::ByteString() - pUniStr is NULL" );
103 
104     if ( nLen == STRING_LEN )
105         nLen = ImplStringLen( pUniStr );
106 
107     mpData = NULL;
108     rtl_uString2String( (rtl_String **)(&mpData),
109                         pUniStr, nLen,
110                         eTextEncoding, nCvtFlags );
111 }
112 
113 // =======================================================================
114 
115 static sal_uChar aImplByteTab[256] =
116 {
117     0,   1,   2,   3,   4,   5,   6,   7,
118     8,   9,  10,  11,  12,  13,  14,  15,
119    16,  17,  18,  19,  20,  21,  22,  23,
120    24,  25,  26,  27,  28,  29,  30,  31,
121    32,  33,  34,  35,  36,  37,  38,  39,
122    40,  41,  42,  43,  44,  45,  46,  47,
123    48,  49,  50,  51,  52,  53,  54,  55,
124    56,  57,  58,  59,  60,  61,  62,  63,
125    64,  65,  66,  67,  68,  69,  70,  71,
126    72,  73,  74,  75,  76,  77,  78,  79,
127    80,  81,  82,  83,  84,  85,  86,  87,
128    88,  89,  90,  91,  92,  93,  94,  95,
129    96,  97,  98,  99, 100, 101, 102, 103,
130   104, 105, 106, 107, 108, 109, 110, 111,
131   112, 113, 114, 115, 116, 117, 118, 119,
132   120, 121, 122, 123, 124, 125, 126, 127,
133   128, 129, 130, 131, 132, 133, 134, 135,
134   136, 137, 138, 139, 140, 141, 142, 143,
135   144, 145, 146, 147, 148, 149, 150, 151,
136   152, 153, 154, 155, 156, 157, 158, 159,
137   160, 161, 162, 163, 164, 165, 166, 167,
138   168, 169, 170, 171, 172, 173, 174, 175,
139   176, 177, 178, 179, 180, 181, 182, 183,
140   184, 185, 186, 187, 188, 189, 190, 191,
141   192, 193, 194, 195, 196, 197, 198, 199,
142   200, 201, 202, 203, 204, 205, 206, 207,
143   208, 209, 210, 211, 212, 213, 214, 215,
144   216, 217, 218, 219, 220, 221, 222, 223,
145   224, 225, 226, 227, 228, 229, 230, 231,
146   232, 233, 234, 235, 236, 237, 238, 239,
147   240, 241, 242, 243, 244, 245, 246, 247,
148   248, 249, 250, 251, 252, 253, 254, 255
149 };
150 
151 // =======================================================================
152 
153 struct Impl1ByteUnicodeTabData
154 {
155     rtl_TextEncoding            meTextEncoding;
156     sal_Unicode                 maUniTab[256];
157     Impl1ByteUnicodeTabData*    mpNext;
158 };
159 
160 // -----------------------------------------------------------------------
161 
162 struct Impl1ByteConvertTabData
163 {
164     rtl_TextEncoding            meSrcTextEncoding;
165     rtl_TextEncoding            meDestTextEncoding;
166     sal_uChar                   maConvertTab[256];
167     sal_uChar                   maRepConvertTab[256];
168     Impl1ByteConvertTabData*    mpNext;
169 };
170 
171 // =======================================================================
172 
173 sal_Unicode* ImplGet1ByteUnicodeTab( rtl_TextEncoding eTextEncoding )
174 {
175 #ifndef BOOTSTRAP
176     TOOLSINDATA*                pToolsData = ImplGetToolsInData();
177 #else
178     TOOLSINDATA*                pToolsData = 0x0;
179 #endif
180     Impl1ByteUnicodeTabData*    pTab = pToolsData->mpFirstUniTabData;
181 
182     while ( pTab )
183     {
184         if ( pTab->meTextEncoding == eTextEncoding )
185             return pTab->maUniTab;
186         pTab = pTab->mpNext;
187     }
188 
189     // get TextEncodingInfo
190     rtl_TextEncodingInfo aTextEncInfo;
191     aTextEncInfo.StructSize = sizeof( aTextEncInfo );
192     rtl_getTextEncodingInfo( eTextEncoding, &aTextEncInfo );
193 
194     if ( aTextEncInfo.MaximumCharSize == 1 )
195     {
196         pTab = new Impl1ByteUnicodeTabData;
197         pTab->meTextEncoding = eTextEncoding;
198         pTab->mpNext = pToolsData->mpFirstUniTabData;
199 
200         rtl_TextToUnicodeConverter  hConverter;
201         sal_uInt32                  nInfo;
202         sal_Size                    nSrcBytes;
203         sal_Size                    nDestChars;
204         hConverter = rtl_createTextToUnicodeConverter( eTextEncoding );
205         nDestChars = rtl_convertTextToUnicode( hConverter, 0,
206                                                (const sal_Char*)aImplByteTab, 256,
207                                                pTab->maUniTab, 256,
208                                                RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE |
209                                                RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT |
210                                                RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT,
211                                                &nInfo, &nSrcBytes );
212         rtl_destroyTextToUnicodeConverter( hConverter );
213 
214         if ( (nSrcBytes != 256) || (nDestChars != 256) )
215             delete pTab;
216         else
217         {
218             pToolsData->mpFirstUniTabData = pTab;
219             return pTab->maUniTab;
220         }
221     }
222 
223     return NULL;
224 }
225 
226 // -----------------------------------------------------------------------
227 
228 static sal_uChar* ImplGet1ByteConvertTab( rtl_TextEncoding eSrcTextEncoding,
229                                           rtl_TextEncoding eDestTextEncoding,
230                                           sal_Bool bReplace )
231 {
232 #ifndef BOOTSTRAP
233     TOOLSINDATA*                pToolsData = ImplGetToolsInData();
234 #else
235     TOOLSINDATA*                pToolsData = 0x0;
236 #endif
237     Impl1ByteConvertTabData*    pTab = pToolsData->mpFirstConvertTabData;
238 
239     while ( pTab )
240     {
241         if ( (pTab->meSrcTextEncoding == eSrcTextEncoding) &&
242              (pTab->meDestTextEncoding == eDestTextEncoding) )
243         {
244             if ( bReplace )
245                 return pTab->maRepConvertTab;
246             else
247                 return pTab->maConvertTab;
248         }
249         pTab = pTab->mpNext;
250     }
251 
252     // get TextEncodingInfo
253     rtl_TextEncodingInfo aTextEncInfo1;
254     aTextEncInfo1.StructSize = sizeof( aTextEncInfo1 );
255     rtl_getTextEncodingInfo( eSrcTextEncoding, &aTextEncInfo1 );
256     rtl_TextEncodingInfo aTextEncInfo2;
257     aTextEncInfo2.StructSize = sizeof( aTextEncInfo2 );
258     rtl_getTextEncodingInfo( eDestTextEncoding, &aTextEncInfo2 );
259 
260     if ( (aTextEncInfo1.MaximumCharSize == 1) &&
261          (aTextEncInfo2.MaximumCharSize == 1) )
262     {
263         pTab = new Impl1ByteConvertTabData;
264         pTab->meSrcTextEncoding = eSrcTextEncoding;
265         pTab->meDestTextEncoding = eDestTextEncoding;
266         pTab->mpNext = pToolsData->mpFirstConvertTabData;
267 
268         rtl_TextToUnicodeConverter  hConverter;
269         rtl_UnicodeToTextConverter  hConverter2;
270         sal_uInt32                  nInfo;
271         sal_Size                    nSrcBytes;
272         sal_Size                    nDestChars;
273         sal_Size                    nSrcChars;
274         sal_Size                    nDestBytes;
275         sal_Unicode                 aTempBuf[256];
276         hConverter = rtl_createTextToUnicodeConverter( eSrcTextEncoding );
277         nDestChars = rtl_convertTextToUnicode( hConverter, 0,
278                                                (const sal_Char*)aImplByteTab, 256,
279                                                aTempBuf, 256,
280                                                RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_DEFAULT |
281                                                RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT |
282                                                RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT,
283                                                &nInfo, &nSrcBytes );
284         rtl_destroyTextToUnicodeConverter( hConverter );
285         if ( (nSrcBytes != 256) || (nDestChars != 256) )
286             delete pTab;
287         else
288         {
289             hConverter2 = rtl_createUnicodeToTextConverter( eDestTextEncoding );
290             nDestBytes = rtl_convertUnicodeToText( hConverter2, 0,
291                                                    aTempBuf, 256,
292                                                    (sal_Char*)pTab->maConvertTab, 256,
293                                                    RTL_UNICODETOTEXT_FLAGS_UNDEFINED_0 |
294                                                    RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT,
295                                                    &nInfo, &nSrcChars );
296             if ( (nDestBytes == 256) || (nSrcChars == 256) )
297             {
298                 nDestBytes = rtl_convertUnicodeToText( hConverter2, 0,
299                                                        aTempBuf, 256,
300                                                        (sal_Char*)pTab->maRepConvertTab, 256,
301                                                        RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT |
302                                                        RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT |
303                                                        RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE,
304                                                        &nInfo, &nSrcChars );
305             }
306             rtl_destroyUnicodeToTextConverter( hConverter2 );
307             if ( (nDestBytes != 256) || (nSrcChars != 256) )
308                 delete pTab;
309             else
310             {
311                 pToolsData->mpFirstConvertTabData = pTab;
312                 if ( bReplace )
313                     return pTab->maRepConvertTab;
314                 else
315                     return pTab->maConvertTab;
316             }
317         }
318     }
319 
320     return NULL;
321 }
322 
323 // =======================================================================
324 
325 void ImplDeleteCharTabData()
326 {
327 #ifndef BOOTSTRAP
328     TOOLSINDATA*                pToolsData = ImplGetToolsInData();
329 #else
330     TOOLSINDATA*                pToolsData = 0x0;
331 #endif
332     Impl1ByteUnicodeTabData*    pTempUniTab;
333     Impl1ByteUnicodeTabData*    pUniTab = pToolsData->mpFirstUniTabData;
334     while ( pUniTab )
335     {
336         pTempUniTab = pUniTab->mpNext;
337         delete pUniTab;
338         pUniTab = pTempUniTab;
339     }
340     pToolsData->mpFirstUniTabData = NULL;
341 
342     Impl1ByteConvertTabData*    pTempConvertTab;
343     Impl1ByteConvertTabData*    pConvertTab = pToolsData->mpFirstConvertTabData;
344     while ( pConvertTab )
345     {
346         pTempConvertTab = pConvertTab->mpNext;
347         delete pConvertTab;
348         pConvertTab = pTempConvertTab;
349     }
350     pToolsData->mpFirstConvertTabData = NULL;
351 }
352 
353 // =======================================================================
354 
355 void ByteString::ImplStringConvert(
356     rtl_TextEncoding eSource, rtl_TextEncoding eTarget, sal_Bool bReplace )
357 {
358     sal_uChar* pConvertTab = ImplGet1ByteConvertTab( eSource, eTarget, bReplace );
359     if ( pConvertTab )
360     {
361         char* pStr = mpData->maStr;
362         while ( *pStr )
363         {
364             sal_uChar c = (sal_uChar)*pStr;
365             sal_uChar cConv = pConvertTab[c];
366             if ( c != cConv )
367             {
368                 pStr = ImplCopyStringData( pStr );
369                 *pStr = (char)cConv;
370             }
371 
372             pStr++;
373         }
374     }
375     else
376     {
377         rtl_UnicodeToTextConverter  hSrcConverter = rtl_createTextToUnicodeConverter( eSource );
378         sal_uInt32                  nInfo;
379         sal_Size                    nSrcBytes;
380         sal_Size                    nDestChars;
381         sal_Size                    nTempLen;
382         sal_Unicode*                pTempBuf;
383         nTempLen = mpData->mnLen;
384         pTempBuf = new sal_Unicode[nTempLen];
385         nDestChars = rtl_convertTextToUnicode( hSrcConverter, 0,
386                                                mpData->maStr, mpData->mnLen,
387                                                pTempBuf, nTempLen,
388                                                RTL_TEXTTOUNICODE_FLAGS_FLUSH |
389                                                RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE |
390                                                RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT |
391                                                RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT,
392                                                &nInfo, &nSrcBytes );
393         rtl_destroyTextToUnicodeConverter( hSrcConverter );
394         // Hier werten wir bReplace nicht aus, da fuer MultiByte-Textencodings
395         // sowieso keine Ersatzdarstellung moeglich ist. Da sich der String
396         // sowieso in der Laenge aendern kann, nehmen wir auch sonst keine
397         // Ruecksicht darauf, das die Laenge erhalten bleibt.
398         ImplUpdateStringFromUniString( pTempBuf, nDestChars, eTarget,
399                                        RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT |
400                                        RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT |
401                                        RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE |
402                                        RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACESTR |
403                                        RTL_UNICODETOTEXT_FLAGS_PRIVATE_MAPTO0 |
404                                        RTL_UNICODETOTEXT_FLAGS_NONSPACING_IGNORE |
405                                        RTL_UNICODETOTEXT_FLAGS_CONTROL_IGNORE );
406         delete [] pTempBuf;
407     }
408 }
409 
410 // =======================================================================
411 
412 ByteString& ByteString::Convert( rtl_TextEncoding eSource, rtl_TextEncoding eTarget, sal_Bool bReplace )
413 {
414     DBG_CHKTHIS( ByteString, DbgCheckByteString );
415 
416     // rtl_TextEncoding Dontknow kann nicht konvertiert werden
417     if ( (eSource == RTL_TEXTENCODING_DONTKNOW) || (eTarget == RTL_TEXTENCODING_DONTKNOW) )
418         return *this;
419 
420     // Wenn Source und Target gleich sind, muss nicht konvertiert werden
421     if ( eSource == eTarget )
422         return *this;
423 
424     // rtl_TextEncoding Symbol nur nach Unicode oder von Unicode wandeln, ansonsten
425     // wollen wir die Zeichencodes beibehalten
426     if ( (eSource == RTL_TEXTENCODING_SYMBOL) &&
427          (eTarget != RTL_TEXTENCODING_UTF7) &&
428          (eTarget != RTL_TEXTENCODING_UTF8) )
429         return *this;
430     if ( (eTarget == RTL_TEXTENCODING_SYMBOL) &&
431          (eSource != RTL_TEXTENCODING_UTF7) &&
432          (eSource != RTL_TEXTENCODING_UTF8) )
433         return *this;
434 
435     // Zeichensatz umwandeln
436     ImplStringConvert( eSource, eTarget, bReplace );
437 
438     return *this;
439 }
440 
441 // =======================================================================
442 
443 char ByteString::Convert( char c,
444                           rtl_TextEncoding eSource, rtl_TextEncoding eTarget,
445                           sal_Bool bReplace )
446 {
447     // TextEncoding Dontknow kann nicht konvertiert werden
448     if ( (eSource == RTL_TEXTENCODING_DONTKNOW) || (eTarget == RTL_TEXTENCODING_DONTKNOW) )
449         return '\0';
450 
451     // Wenn Source und Target gleich sind, muss nicht konvertiert werden
452     if ( eSource == eTarget )
453         return c;
454 
455     // TextEncoding Symbol nur nach Unicode oder von Unicode wandeln, ansonsten
456     // wollen wir die Zeichencodes beibehalten
457     if ( (eSource == RTL_TEXTENCODING_SYMBOL) &&
458          (eTarget != RTL_TEXTENCODING_UTF7) &&
459          (eTarget != RTL_TEXTENCODING_UTF8) )
460         return '\0';
461     if ( (eTarget == RTL_TEXTENCODING_SYMBOL) &&
462          (eSource != RTL_TEXTENCODING_UTF7) &&
463          (eSource != RTL_TEXTENCODING_UTF8) )
464         return '\0';
465 
466     sal_uChar* pConvertTab = ImplGet1ByteConvertTab( eSource, eTarget, bReplace );
467     if ( pConvertTab )
468         return (char)pConvertTab[(sal_uChar)c];
469     else
470         return '\0';
471 }
472 
473 // =======================================================================
474 
475 sal_Unicode ByteString::ConvertToUnicode( char c, rtl_TextEncoding eTextEncoding )
476 {
477     sal_Size nLen = 1;
478     return ConvertToUnicode( &c, &nLen, eTextEncoding );
479 }
480 
481 // -----------------------------------------------------------------------
482 
483 char ByteString::ConvertFromUnicode( sal_Unicode c, rtl_TextEncoding eTextEncoding, sal_Bool bReplace )
484 {
485     sal_Size    nLen;
486     char        aBuf[30];
487     nLen = ConvertFromUnicode( c, aBuf, sizeof( aBuf ), eTextEncoding, bReplace );
488     if ( nLen == 1 )
489         return aBuf[0];
490     else
491         return 0;
492 }
493 
494 // -----------------------------------------------------------------------
495 
496 sal_Unicode ByteString::ConvertToUnicode( const char* pChar, sal_Size* pLen, rtl_TextEncoding eTextEncoding )
497 {
498     // TextEncoding Dontknow wird nicht konvertiert
499     if ( eTextEncoding == RTL_TEXTENCODING_DONTKNOW )
500         return 0;
501 
502     rtl_TextToUnicodeConverter  hConverter;
503     sal_uInt32                  nInfo;
504     sal_Size                    nSrcBytes;
505     sal_Size                    nDestChars;
506     sal_Unicode                 nConvChar;
507     hConverter = rtl_createTextToUnicodeConverter( eTextEncoding );
508     nDestChars = rtl_convertTextToUnicode( hConverter, 0,
509                                            (const sal_Char*)pChar, *pLen,
510                                            &nConvChar, 1,
511                                            RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_DEFAULT |
512                                            RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT |
513                                            RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT |
514                                            RTL_TEXTTOUNICODE_FLAGS_FLUSH,
515                                            &nInfo, &nSrcBytes );
516     rtl_destroyTextToUnicodeConverter( hConverter );
517 
518     if ( nDestChars == 1 )
519     {
520         *pLen = nSrcBytes;
521         return nConvChar;
522     }
523     else
524     {
525         *pLen = 0;
526         return 0;
527     }
528 }
529 
530 // -----------------------------------------------------------------------
531 
532 sal_Size ByteString::ConvertFromUnicode( sal_Unicode c, char* pBuf, sal_Size nBufLen, rtl_TextEncoding eTextEncoding,
533                                          sal_Bool bReplace )
534 {
535     // TextEncoding Dontknow wird nicht konvertiert
536     if ( eTextEncoding == RTL_TEXTENCODING_DONTKNOW )
537         return '\0';
538 
539     rtl_UnicodeToTextConverter  hConverter;
540     sal_uInt32                  nInfo;
541     sal_Size                    nSrcChars;
542     sal_Size                    nDestBytes;
543     sal_Unicode                 cUni = c;
544     sal_uInt32                  nFlags = RTL_UNICODETOTEXT_FLAGS_NONSPACING_IGNORE |
545                                          RTL_UNICODETOTEXT_FLAGS_CONTROL_IGNORE |
546                                          RTL_UNICODETOTEXT_FLAGS_FLUSH;
547     if ( bReplace )
548     {
549         nFlags |= RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT |
550                   RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT;
551         nFlags |= RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE;
552         if ( nBufLen > 1 )
553             nFlags |= RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACESTR;
554     }
555     else
556     {
557         nFlags |= RTL_UNICODETOTEXT_FLAGS_UNDEFINED_0 |
558                   RTL_UNICODETOTEXT_FLAGS_INVALID_0;
559     }
560 
561     hConverter = rtl_createUnicodeToTextConverter( eTextEncoding );
562     nDestBytes = rtl_convertUnicodeToText( hConverter, 0,
563                                            &cUni, 1,
564                                            (sal_Char*)pBuf, nBufLen,
565                                            nFlags,
566                                            &nInfo, &nSrcChars );
567     rtl_destroyUnicodeToTextConverter( hConverter );
568     return nDestBytes;
569 }
570 
571 // =======================================================================
572 
573 ByteString::ByteString( const rtl::OString& rStr )
574     : mpData(NULL)
575 {
576     DBG_CTOR( ByteString, DbgCheckByteString );
577 
578     OSL_ENSURE(rStr.pData->length < STRING_MAXLEN,
579                "Overflowing rtl::OString -> ByteString cut to zero length");
580 
581     if (rStr.pData->length < STRING_MAXLEN)
582     {
583         mpData = reinterpret_cast< ByteStringData * >(const_cast< rtl::OString & >(rStr).pData);
584         STRING_ACQUIRE((STRING_TYPE *)mpData);
585     }
586     else
587     {
588         STRING_NEW((STRING_TYPE **)&mpData);
589     }
590 }
591 
592 // -----------------------------------------------------------------------
593 
594 ByteString& ByteString::Assign( const rtl::OString& rStr )
595 {
596     DBG_CHKTHIS( ByteString, DbgCheckByteString );
597 
598     OSL_ENSURE(rStr.pData->length < STRING_MAXLEN,
599                "Overflowing rtl::OString -> ByteString cut to zero length");
600 
601     if (rStr.pData->length < STRING_MAXLEN)
602     {
603         STRING_RELEASE((STRING_TYPE *)mpData);
604         mpData = reinterpret_cast< ByteStringData * >(const_cast< rtl::OString & >(rStr).pData);
605         STRING_ACQUIRE((STRING_TYPE *)mpData);
606     }
607     else
608     {
609         STRING_NEW((STRING_TYPE **)&mpData);
610     }
611 
612     return *this;
613 }
614