1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_connectivity.hxx" 26*b1cdbd2cSJim Jagielski #include <connectivity/dbcharset.hxx> 27*b1cdbd2cSJim Jagielski #include "diagnose_ex.h" 28*b1cdbd2cSJim Jagielski #include <osl/diagnose.h> 29*b1cdbd2cSJim Jagielski #include <rtl/tencinfo.h> 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski //......................................................................... 32*b1cdbd2cSJim Jagielski namespace dbtools 33*b1cdbd2cSJim Jagielski { 34*b1cdbd2cSJim Jagielski //......................................................................... 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski //========================================================================= 37*b1cdbd2cSJim Jagielski //= OCharsetMap 38*b1cdbd2cSJim Jagielski //========================================================================= 39*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- OCharsetMap()40*b1cdbd2cSJim Jagielski OCharsetMap::OCharsetMap() 41*b1cdbd2cSJim Jagielski { 42*b1cdbd2cSJim Jagielski } 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- lateConstruct()45*b1cdbd2cSJim Jagielski void OCharsetMap::lateConstruct() 46*b1cdbd2cSJim Jagielski { 47*b1cdbd2cSJim Jagielski const rtl_TextEncoding eFirstEncoding = RTL_TEXTENCODING_DONTKNOW; 48*b1cdbd2cSJim Jagielski const rtl_TextEncoding eLastEncoding = 100; // TODO: a define in rtl/textenc.h would be fine here ... 49*b1cdbd2cSJim Jagielski OSL_ENSURE( 0 == eFirstEncoding, "OCharsetMap::OCharsetMap: somebody changed the numbers!" ); 50*b1cdbd2cSJim Jagielski 51*b1cdbd2cSJim Jagielski rtl_TextEncodingInfo aInfo; aInfo.StructSize = sizeof( rtl_TextEncodingInfo ); 52*b1cdbd2cSJim Jagielski for ( rtl_TextEncoding eEncoding = eFirstEncoding; eEncoding < eLastEncoding; ++eEncoding ) 53*b1cdbd2cSJim Jagielski { 54*b1cdbd2cSJim Jagielski if ( ( RTL_TEXTENCODING_DONTKNOW == eEncoding ) // this is always allowed - it has the special meaning "system encoding" 55*b1cdbd2cSJim Jagielski || ( rtl_getTextEncodingInfo( eEncoding, &aInfo ) 56*b1cdbd2cSJim Jagielski && approveEncoding( eEncoding, aInfo ) 57*b1cdbd2cSJim Jagielski ) 58*b1cdbd2cSJim Jagielski ) 59*b1cdbd2cSJim Jagielski { 60*b1cdbd2cSJim Jagielski m_aEncodings.insert( eEncoding ); 61*b1cdbd2cSJim Jagielski } 62*b1cdbd2cSJim Jagielski } 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielski OSL_ENSURE( find( RTL_TEXTENCODING_MS_1252 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding ANSI!" ); 65*b1cdbd2cSJim Jagielski OSL_ENSURE( find( RTL_TEXTENCODING_APPLE_ROMAN ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding macintosh!" ); 66*b1cdbd2cSJim Jagielski OSL_ENSURE( find( RTL_TEXTENCODING_IBM_437 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM437!" ); 67*b1cdbd2cSJim Jagielski OSL_ENSURE( find( RTL_TEXTENCODING_IBM_850) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM850!" ); 68*b1cdbd2cSJim Jagielski OSL_ENSURE( find( RTL_TEXTENCODING_IBM_860 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM860!" ); 69*b1cdbd2cSJim Jagielski OSL_ENSURE( find( RTL_TEXTENCODING_IBM_861 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM861!" ); 70*b1cdbd2cSJim Jagielski OSL_ENSURE( find( RTL_TEXTENCODING_IBM_863 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM863!" ); 71*b1cdbd2cSJim Jagielski OSL_ENSURE( find( RTL_TEXTENCODING_IBM_865 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM865!" ); 72*b1cdbd2cSJim Jagielski OSL_ENSURE( find( RTL_TEXTENCODING_IBM_866 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM866!" ); 73*b1cdbd2cSJim Jagielski OSL_ENSURE( find( RTL_TEXTENCODING_DONTKNOW ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding SYSTEM!" ); 74*b1cdbd2cSJim Jagielski OSL_ENSURE( find( RTL_TEXTENCODING_UTF8 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding UTF-8!" ); 75*b1cdbd2cSJim Jagielski OSL_ENSURE( find( RTL_TEXTENCODING_BIG5_HKSCS ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding Big5-HKSCS!" ); 76*b1cdbd2cSJim Jagielski } 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- approveEncoding(const rtl_TextEncoding _eEncoding,const rtl_TextEncodingInfo & _rInfo) const79*b1cdbd2cSJim Jagielski sal_Bool OCharsetMap::approveEncoding( const rtl_TextEncoding _eEncoding, const rtl_TextEncodingInfo& _rInfo ) const 80*b1cdbd2cSJim Jagielski { 81*b1cdbd2cSJim Jagielski sal_Bool bIsMimeEncoding = 0 != ( _rInfo.Flags & RTL_TEXTENCODING_INFO_MIME ); 82*b1cdbd2cSJim Jagielski OSL_ENSURE( !bIsMimeEncoding || rtl_getMimeCharsetFromTextEncoding( _eEncoding ), 83*b1cdbd2cSJim Jagielski "OCharsetMap::OCharsetMap: inconsistence in rtl!" ); 84*b1cdbd2cSJim Jagielski OSL_UNUSED( _eEncoding ); 85*b1cdbd2cSJim Jagielski return bIsMimeEncoding; 86*b1cdbd2cSJim Jagielski } 87*b1cdbd2cSJim Jagielski 88*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- ~OCharsetMap()89*b1cdbd2cSJim Jagielski OCharsetMap::~OCharsetMap() 90*b1cdbd2cSJim Jagielski { 91*b1cdbd2cSJim Jagielski } 92*b1cdbd2cSJim Jagielski 93*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- begin() const94*b1cdbd2cSJim Jagielski OCharsetMap::CharsetIterator OCharsetMap::begin() const 95*b1cdbd2cSJim Jagielski { 96*b1cdbd2cSJim Jagielski ensureConstructed( ); 97*b1cdbd2cSJim Jagielski return CharsetIterator(this, m_aEncodings.begin() ); 98*b1cdbd2cSJim Jagielski } 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- find(const rtl_TextEncoding _eEncoding) const101*b1cdbd2cSJim Jagielski OCharsetMap::CharsetIterator OCharsetMap::find(const rtl_TextEncoding _eEncoding) const 102*b1cdbd2cSJim Jagielski { 103*b1cdbd2cSJim Jagielski ensureConstructed( ); 104*b1cdbd2cSJim Jagielski return CharsetIterator( this, m_aEncodings.find( _eEncoding ) ); 105*b1cdbd2cSJim Jagielski } 106*b1cdbd2cSJim Jagielski 107*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- find(const::rtl::OUString & _rIanaName,const IANA &) const108*b1cdbd2cSJim Jagielski OCharsetMap::CharsetIterator OCharsetMap::find(const ::rtl::OUString& _rIanaName, const IANA&) const 109*b1cdbd2cSJim Jagielski { 110*b1cdbd2cSJim Jagielski ensureConstructed( ); 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielski rtl_TextEncoding eEncoding = RTL_TEXTENCODING_DONTKNOW; 113*b1cdbd2cSJim Jagielski if ( _rIanaName.getLength() ) 114*b1cdbd2cSJim Jagielski { 115*b1cdbd2cSJim Jagielski // byte string conversion 116*b1cdbd2cSJim Jagielski ::rtl::OString sMimeByteString( _rIanaName.getStr(), _rIanaName.getLength(), RTL_TEXTENCODING_ASCII_US ); 117*b1cdbd2cSJim Jagielski // look up 118*b1cdbd2cSJim Jagielski eEncoding = rtl_getTextEncodingFromMimeCharset( sMimeByteString.getStr() ); 119*b1cdbd2cSJim Jagielski 120*b1cdbd2cSJim Jagielski if ( RTL_TEXTENCODING_DONTKNOW == eEncoding ) 121*b1cdbd2cSJim Jagielski { // if we're here, the name is not empty, but unknown -> this is an invalid name 122*b1cdbd2cSJim Jagielski return end(); 123*b1cdbd2cSJim Jagielski } 124*b1cdbd2cSJim Jagielski } 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski return find( eEncoding ); 127*b1cdbd2cSJim Jagielski } 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- end() const130*b1cdbd2cSJim Jagielski OCharsetMap::CharsetIterator OCharsetMap::end() const 131*b1cdbd2cSJim Jagielski { 132*b1cdbd2cSJim Jagielski ensureConstructed( ); 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski return CharsetIterator( this, m_aEncodings.end() ); 135*b1cdbd2cSJim Jagielski } 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski //========================================================================= 138*b1cdbd2cSJim Jagielski //= CharsetIteratorDerefHelper 139*b1cdbd2cSJim Jagielski //========================================================================= 140*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- CharsetIteratorDerefHelper(const CharsetIteratorDerefHelper & _rSource)141*b1cdbd2cSJim Jagielski CharsetIteratorDerefHelper::CharsetIteratorDerefHelper( const CharsetIteratorDerefHelper& _rSource ) 142*b1cdbd2cSJim Jagielski :m_eEncoding( _rSource.m_eEncoding ) 143*b1cdbd2cSJim Jagielski ,m_aIanaName( _rSource.m_aIanaName ) 144*b1cdbd2cSJim Jagielski { 145*b1cdbd2cSJim Jagielski } 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- CharsetIteratorDerefHelper(const rtl_TextEncoding _eEncoding,const::rtl::OUString & _rIanaName)148*b1cdbd2cSJim Jagielski CharsetIteratorDerefHelper:: CharsetIteratorDerefHelper(const rtl_TextEncoding _eEncoding, const ::rtl::OUString& _rIanaName ) 149*b1cdbd2cSJim Jagielski :m_eEncoding( _eEncoding ) 150*b1cdbd2cSJim Jagielski ,m_aIanaName( _rIanaName ) 151*b1cdbd2cSJim Jagielski { 152*b1cdbd2cSJim Jagielski } 153*b1cdbd2cSJim Jagielski 154*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- CharsetIteratorDerefHelper()155*b1cdbd2cSJim Jagielski CharsetIteratorDerefHelper::CharsetIteratorDerefHelper() 156*b1cdbd2cSJim Jagielski :m_eEncoding(RTL_TEXTENCODING_DONTKNOW) 157*b1cdbd2cSJim Jagielski { 158*b1cdbd2cSJim Jagielski } 159*b1cdbd2cSJim Jagielski 160*b1cdbd2cSJim Jagielski //========================================================================= 161*b1cdbd2cSJim Jagielski //= OCharsetMap::CharsetIterator 162*b1cdbd2cSJim Jagielski //========================================================================= 163*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- CharsetIterator(const OCharsetMap * _pContainer,OCharsetMap::TextEncBag::const_iterator _aPos)164*b1cdbd2cSJim Jagielski OCharsetMap::CharsetIterator::CharsetIterator(const OCharsetMap* _pContainer, OCharsetMap::TextEncBag::const_iterator _aPos ) 165*b1cdbd2cSJim Jagielski :m_pContainer( _pContainer ) 166*b1cdbd2cSJim Jagielski ,m_aPos( _aPos ) 167*b1cdbd2cSJim Jagielski { 168*b1cdbd2cSJim Jagielski OSL_ENSURE( m_pContainer, "OCharsetMap::CharsetIterator::CharsetIterator : invalid container!" ); 169*b1cdbd2cSJim Jagielski } 170*b1cdbd2cSJim Jagielski 171*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- CharsetIterator(const CharsetIterator & _rSource)172*b1cdbd2cSJim Jagielski OCharsetMap::CharsetIterator::CharsetIterator(const CharsetIterator& _rSource) 173*b1cdbd2cSJim Jagielski :m_pContainer( _rSource.m_pContainer ) 174*b1cdbd2cSJim Jagielski ,m_aPos( _rSource.m_aPos ) 175*b1cdbd2cSJim Jagielski { 176*b1cdbd2cSJim Jagielski } 177*b1cdbd2cSJim Jagielski 178*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- ~CharsetIterator()179*b1cdbd2cSJim Jagielski OCharsetMap::CharsetIterator::~CharsetIterator() 180*b1cdbd2cSJim Jagielski { 181*b1cdbd2cSJim Jagielski } 182*b1cdbd2cSJim Jagielski 183*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- operator *() const184*b1cdbd2cSJim Jagielski CharsetIteratorDerefHelper OCharsetMap::CharsetIterator::operator*() const 185*b1cdbd2cSJim Jagielski { 186*b1cdbd2cSJim Jagielski OSL_ENSURE( m_aPos != m_pContainer->m_aEncodings.end(), "OCharsetMap::CharsetIterator::operator*: invalid position!"); 187*b1cdbd2cSJim Jagielski 188*b1cdbd2cSJim Jagielski rtl_TextEncoding eEncoding = *m_aPos; 189*b1cdbd2cSJim Jagielski ::rtl::OUString sIanaName; 190*b1cdbd2cSJim Jagielski 191*b1cdbd2cSJim Jagielski if ( RTL_TEXTENCODING_DONTKNOW != eEncoding ) 192*b1cdbd2cSJim Jagielski { // it's not the virtual "system charset" 193*b1cdbd2cSJim Jagielski const char* pIanaName = rtl_getMimeCharsetFromTextEncoding( eEncoding ); 194*b1cdbd2cSJim Jagielski OSL_ENSURE( pIanaName, "OCharsetMap::CharsetIterator: invalid mime name!" ); 195*b1cdbd2cSJim Jagielski if ( pIanaName ) 196*b1cdbd2cSJim Jagielski sIanaName = ::rtl::OUString::createFromAscii( pIanaName ); 197*b1cdbd2cSJim Jagielski } 198*b1cdbd2cSJim Jagielski return CharsetIteratorDerefHelper( eEncoding, sIanaName ); 199*b1cdbd2cSJim Jagielski } 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- operator ++()202*b1cdbd2cSJim Jagielski const OCharsetMap::CharsetIterator& OCharsetMap::CharsetIterator::operator++() 203*b1cdbd2cSJim Jagielski { 204*b1cdbd2cSJim Jagielski OSL_ENSURE( m_aPos != m_pContainer->m_aEncodings.end(), "OCharsetMap::CharsetIterator::operator++ : invalid position!" ); 205*b1cdbd2cSJim Jagielski if ( m_aPos != m_pContainer->m_aEncodings.end()) 206*b1cdbd2cSJim Jagielski ++m_aPos; 207*b1cdbd2cSJim Jagielski return *this; 208*b1cdbd2cSJim Jagielski } 209*b1cdbd2cSJim Jagielski 210*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- operator --()211*b1cdbd2cSJim Jagielski const OCharsetMap::CharsetIterator& OCharsetMap::CharsetIterator::operator--() 212*b1cdbd2cSJim Jagielski { 213*b1cdbd2cSJim Jagielski OSL_ENSURE( m_aPos != m_pContainer->m_aEncodings.begin(), "OCharsetMap::CharsetIterator::operator-- : invalid position!" ); 214*b1cdbd2cSJim Jagielski if ( m_aPos != m_pContainer->m_aEncodings.begin() ) 215*b1cdbd2cSJim Jagielski --m_aPos; 216*b1cdbd2cSJim Jagielski return *this; 217*b1cdbd2cSJim Jagielski } 218*b1cdbd2cSJim Jagielski 219*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- operator ==(const OCharsetMap::CharsetIterator & lhs,const OCharsetMap::CharsetIterator & rhs)220*b1cdbd2cSJim Jagielski bool operator==(const OCharsetMap::CharsetIterator& lhs, const OCharsetMap::CharsetIterator& rhs) 221*b1cdbd2cSJim Jagielski { 222*b1cdbd2cSJim Jagielski return ( lhs.m_pContainer == rhs.m_pContainer ) && ( lhs.m_aPos == rhs.m_aPos ); 223*b1cdbd2cSJim Jagielski } 224*b1cdbd2cSJim Jagielski 225*b1cdbd2cSJim Jagielski //......................................................................... 226*b1cdbd2cSJim Jagielski } // namespace dbtools 227*b1cdbd2cSJim Jagielski //......................................................................... 228*b1cdbd2cSJim Jagielski 229