xref: /AOO41X/main/connectivity/source/commontools/dbcharset.cxx (revision 9b5730f6ddef7eb82608ca4d31dc0d7678e652cf)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_connectivity.hxx"
26 #include <connectivity/dbcharset.hxx>
27 #include "diagnose_ex.h"
28 #include <osl/diagnose.h>
29 #include <rtl/tencinfo.h>
30 
31 //.........................................................................
32 namespace dbtools
33 {
34 //.........................................................................
35 
36     //=========================================================================
37     //= OCharsetMap
38     //=========================================================================
39     //-------------------------------------------------------------------------
OCharsetMap()40     OCharsetMap::OCharsetMap()
41     {
42     }
43 
44     //-------------------------------------------------------------------------
lateConstruct()45     void OCharsetMap::lateConstruct()
46     {
47         const rtl_TextEncoding eFirstEncoding = RTL_TEXTENCODING_DONTKNOW;
48         const rtl_TextEncoding eLastEncoding = 100;     // TODO: a define in rtl/textenc.h would be fine here ...
49         OSL_ENSURE( 0 == eFirstEncoding, "OCharsetMap::OCharsetMap: somebody changed the numbers!" );
50 
51         rtl_TextEncodingInfo aInfo; aInfo.StructSize = sizeof( rtl_TextEncodingInfo );
52         for ( rtl_TextEncoding eEncoding = eFirstEncoding; eEncoding < eLastEncoding; ++eEncoding )
53         {
54             if  (   ( RTL_TEXTENCODING_DONTKNOW == eEncoding )  // this is always allowed - it has the special meaning "system encoding"
55                 ||  (   rtl_getTextEncodingInfo( eEncoding, &aInfo )
56                     &&  approveEncoding( eEncoding, aInfo )
57                     )
58                 )
59             {
60                 m_aEncodings.insert( eEncoding );
61             }
62         }
63 
64         OSL_ENSURE( find( RTL_TEXTENCODING_MS_1252 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding ANSI!" );
65         OSL_ENSURE( find( RTL_TEXTENCODING_APPLE_ROMAN ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding macintosh!" );
66         OSL_ENSURE( find( RTL_TEXTENCODING_IBM_437 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM437!" );
67         OSL_ENSURE( find( RTL_TEXTENCODING_IBM_850) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM850!" );
68         OSL_ENSURE( find( RTL_TEXTENCODING_IBM_860 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM860!" );
69         OSL_ENSURE( find( RTL_TEXTENCODING_IBM_861 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM861!" );
70         OSL_ENSURE( find( RTL_TEXTENCODING_IBM_863 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM863!" );
71         OSL_ENSURE( find( RTL_TEXTENCODING_IBM_865 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM865!" );
72         OSL_ENSURE( find( RTL_TEXTENCODING_IBM_866 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM866!" );
73         OSL_ENSURE( find( RTL_TEXTENCODING_DONTKNOW ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding SYSTEM!" );
74         OSL_ENSURE( find( RTL_TEXTENCODING_UTF8 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding UTF-8!" );
75         OSL_ENSURE( find( RTL_TEXTENCODING_BIG5_HKSCS ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding Big5-HKSCS!" );
76     }
77 
78     //-------------------------------------------------------------------------
approveEncoding(const rtl_TextEncoding _eEncoding,const rtl_TextEncodingInfo & _rInfo) const79     sal_Bool OCharsetMap::approveEncoding( const rtl_TextEncoding _eEncoding, const rtl_TextEncodingInfo& _rInfo ) const
80     {
81         sal_Bool bIsMimeEncoding = 0 != ( _rInfo.Flags & RTL_TEXTENCODING_INFO_MIME );
82         OSL_ENSURE( !bIsMimeEncoding || rtl_getMimeCharsetFromTextEncoding( _eEncoding ),
83                 "OCharsetMap::OCharsetMap: inconsistence in rtl!" );
84         OSL_UNUSED( _eEncoding );
85         return bIsMimeEncoding;
86     }
87 
88     //-------------------------------------------------------------------------
~OCharsetMap()89     OCharsetMap::~OCharsetMap()
90     {
91     }
92 
93     //-------------------------------------------------------------------------
begin() const94     OCharsetMap::CharsetIterator OCharsetMap::begin() const
95     {
96         ensureConstructed( );
97         return CharsetIterator(this, m_aEncodings.begin() );
98     }
99 
100     //-------------------------------------------------------------------------
find(const rtl_TextEncoding _eEncoding) const101     OCharsetMap::CharsetIterator    OCharsetMap::find(const rtl_TextEncoding _eEncoding) const
102     {
103         ensureConstructed( );
104         return CharsetIterator( this, m_aEncodings.find( _eEncoding ) );
105     }
106 
107     //-------------------------------------------------------------------------
find(const::rtl::OUString & _rIanaName,const IANA &) const108     OCharsetMap::CharsetIterator    OCharsetMap::find(const ::rtl::OUString& _rIanaName, const IANA&) const
109     {
110         ensureConstructed( );
111 
112         rtl_TextEncoding eEncoding = RTL_TEXTENCODING_DONTKNOW;
113         if ( _rIanaName.getLength() )
114         {
115             // byte string conversion
116             ::rtl::OString sMimeByteString( _rIanaName.getStr(), _rIanaName.getLength(), RTL_TEXTENCODING_ASCII_US );
117             // look up
118             eEncoding = rtl_getTextEncodingFromMimeCharset( sMimeByteString.getStr() );
119 
120             if ( RTL_TEXTENCODING_DONTKNOW == eEncoding )
121             {   // if we're here, the name is not empty, but unknown -> this is an invalid name
122                 return end();
123             }
124         }
125 
126         return find( eEncoding );
127     }
128 
129     //-------------------------------------------------------------------------
end() const130     OCharsetMap::CharsetIterator OCharsetMap::end() const
131     {
132         ensureConstructed( );
133 
134         return CharsetIterator( this, m_aEncodings.end() );
135     }
136 
137     //=========================================================================
138     //= CharsetIteratorDerefHelper
139     //=========================================================================
140     //-------------------------------------------------------------------------
CharsetIteratorDerefHelper(const CharsetIteratorDerefHelper & _rSource)141     CharsetIteratorDerefHelper::CharsetIteratorDerefHelper( const CharsetIteratorDerefHelper& _rSource )
142         :m_eEncoding( _rSource.m_eEncoding )
143         ,m_aIanaName( _rSource.m_aIanaName )
144     {
145     }
146 
147     //-------------------------------------------------------------------------
CharsetIteratorDerefHelper(const rtl_TextEncoding _eEncoding,const::rtl::OUString & _rIanaName)148     CharsetIteratorDerefHelper:: CharsetIteratorDerefHelper(const rtl_TextEncoding _eEncoding, const ::rtl::OUString& _rIanaName )
149         :m_eEncoding( _eEncoding )
150         ,m_aIanaName( _rIanaName )
151     {
152     }
153 
154     //-------------------------------------------------------------------------
CharsetIteratorDerefHelper()155     CharsetIteratorDerefHelper::CharsetIteratorDerefHelper()
156         :m_eEncoding(RTL_TEXTENCODING_DONTKNOW)
157     {
158     }
159 
160     //=========================================================================
161     //= OCharsetMap::CharsetIterator
162     //=========================================================================
163     //-------------------------------------------------------------------------
CharsetIterator(const OCharsetMap * _pContainer,OCharsetMap::TextEncBag::const_iterator _aPos)164     OCharsetMap::CharsetIterator::CharsetIterator(const OCharsetMap* _pContainer, OCharsetMap::TextEncBag::const_iterator _aPos )
165         :m_pContainer( _pContainer )
166         ,m_aPos( _aPos )
167     {
168         OSL_ENSURE( m_pContainer, "OCharsetMap::CharsetIterator::CharsetIterator : invalid container!" );
169     }
170 
171     //-------------------------------------------------------------------------
CharsetIterator(const CharsetIterator & _rSource)172     OCharsetMap::CharsetIterator::CharsetIterator(const CharsetIterator& _rSource)
173         :m_pContainer( _rSource.m_pContainer )
174         ,m_aPos( _rSource.m_aPos )
175     {
176     }
177 
178     //-------------------------------------------------------------------------
~CharsetIterator()179     OCharsetMap::CharsetIterator::~CharsetIterator()
180     {
181     }
182 
183     //-------------------------------------------------------------------------
operator *() const184     CharsetIteratorDerefHelper OCharsetMap::CharsetIterator::operator*() const
185     {
186         OSL_ENSURE( m_aPos != m_pContainer->m_aEncodings.end(), "OCharsetMap::CharsetIterator::operator*: invalid position!");
187 
188         rtl_TextEncoding eEncoding = *m_aPos;
189         ::rtl::OUString sIanaName;
190 
191         if ( RTL_TEXTENCODING_DONTKNOW != eEncoding )
192         {   // it's not the virtual "system charset"
193             const char* pIanaName = rtl_getMimeCharsetFromTextEncoding( eEncoding );
194             OSL_ENSURE( pIanaName, "OCharsetMap::CharsetIterator: invalid mime name!" );
195             if ( pIanaName )
196                 sIanaName = ::rtl::OUString::createFromAscii( pIanaName );
197         }
198         return CharsetIteratorDerefHelper( eEncoding, sIanaName );
199     }
200 
201     //-------------------------------------------------------------------------
operator ++()202     const OCharsetMap::CharsetIterator& OCharsetMap::CharsetIterator::operator++()
203     {
204         OSL_ENSURE( m_aPos != m_pContainer->m_aEncodings.end(), "OCharsetMap::CharsetIterator::operator++ : invalid position!" );
205         if ( m_aPos != m_pContainer->m_aEncodings.end())
206             ++m_aPos;
207         return *this;
208     }
209 
210     //-------------------------------------------------------------------------
operator --()211     const OCharsetMap::CharsetIterator& OCharsetMap::CharsetIterator::operator--()
212     {
213         OSL_ENSURE( m_aPos != m_pContainer->m_aEncodings.begin(), "OCharsetMap::CharsetIterator::operator-- : invalid position!" );
214         if ( m_aPos != m_pContainer->m_aEncodings.begin() )
215             --m_aPos;
216         return *this;
217     }
218 
219     //-------------------------------------------------------------------------
operator ==(const OCharsetMap::CharsetIterator & lhs,const OCharsetMap::CharsetIterator & rhs)220     bool operator==(const OCharsetMap::CharsetIterator& lhs, const OCharsetMap::CharsetIterator& rhs)
221     {
222         return ( lhs.m_pContainer == rhs.m_pContainer ) && ( lhs.m_aPos == rhs.m_aPos );
223     }
224 
225 //.........................................................................
226 }   // namespace dbtools
227 //.........................................................................
228 
229