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