| /************************************************************** |
| * |
| * 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. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_connectivity.hxx" |
| #include <connectivity/dbcharset.hxx> |
| #include "diagnose_ex.h" |
| #include <osl/diagnose.h> |
| #include <rtl/tencinfo.h> |
| |
| //......................................................................... |
| namespace dbtools |
| { |
| //......................................................................... |
| |
| //========================================================================= |
| //= OCharsetMap |
| //========================================================================= |
| //------------------------------------------------------------------------- |
| OCharsetMap::OCharsetMap() |
| { |
| } |
| |
| //------------------------------------------------------------------------- |
| void OCharsetMap::lateConstruct() |
| { |
| const rtl_TextEncoding eFirstEncoding = RTL_TEXTENCODING_DONTKNOW; |
| const rtl_TextEncoding eLastEncoding = 100; // TODO: a define in rtl/textenc.h would be fine here ... |
| OSL_ENSURE( 0 == eFirstEncoding, "OCharsetMap::OCharsetMap: somebody changed the numbers!" ); |
| |
| rtl_TextEncodingInfo aInfo; aInfo.StructSize = sizeof( rtl_TextEncodingInfo ); |
| for ( rtl_TextEncoding eEncoding = eFirstEncoding; eEncoding < eLastEncoding; ++eEncoding ) |
| { |
| if ( ( RTL_TEXTENCODING_DONTKNOW == eEncoding ) // this is always allowed - it has the special meaning "system encoding" |
| || ( rtl_getTextEncodingInfo( eEncoding, &aInfo ) |
| && approveEncoding( eEncoding, aInfo ) |
| ) |
| ) |
| { |
| m_aEncodings.insert( eEncoding ); |
| } |
| } |
| |
| OSL_ENSURE( find( RTL_TEXTENCODING_MS_1252 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding ANSI!" ); |
| OSL_ENSURE( find( RTL_TEXTENCODING_APPLE_ROMAN ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding macintosh!" ); |
| OSL_ENSURE( find( RTL_TEXTENCODING_IBM_437 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM437!" ); |
| OSL_ENSURE( find( RTL_TEXTENCODING_IBM_850) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM850!" ); |
| OSL_ENSURE( find( RTL_TEXTENCODING_IBM_860 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM860!" ); |
| OSL_ENSURE( find( RTL_TEXTENCODING_IBM_861 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM861!" ); |
| OSL_ENSURE( find( RTL_TEXTENCODING_IBM_863 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM863!" ); |
| OSL_ENSURE( find( RTL_TEXTENCODING_IBM_865 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM865!" ); |
| OSL_ENSURE( find( RTL_TEXTENCODING_IBM_866 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM866!" ); |
| OSL_ENSURE( find( RTL_TEXTENCODING_DONTKNOW ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding SYSTEM!" ); |
| OSL_ENSURE( find( RTL_TEXTENCODING_UTF8 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding UTF-8!" ); |
| OSL_ENSURE( find( RTL_TEXTENCODING_BIG5_HKSCS ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding Big5-HKSCS!" ); |
| } |
| |
| //------------------------------------------------------------------------- |
| sal_Bool OCharsetMap::approveEncoding( const rtl_TextEncoding _eEncoding, const rtl_TextEncodingInfo& _rInfo ) const |
| { |
| sal_Bool bIsMimeEncoding = 0 != ( _rInfo.Flags & RTL_TEXTENCODING_INFO_MIME ); |
| OSL_ENSURE( !bIsMimeEncoding || rtl_getMimeCharsetFromTextEncoding( _eEncoding ), |
| "OCharsetMap::OCharsetMap: inconsistence in rtl!" ); |
| OSL_UNUSED( _eEncoding ); |
| return bIsMimeEncoding; |
| } |
| |
| //------------------------------------------------------------------------- |
| OCharsetMap::~OCharsetMap() |
| { |
| } |
| |
| //------------------------------------------------------------------------- |
| OCharsetMap::CharsetIterator OCharsetMap::begin() const |
| { |
| ensureConstructed( ); |
| return CharsetIterator(this, m_aEncodings.begin() ); |
| } |
| |
| //------------------------------------------------------------------------- |
| OCharsetMap::CharsetIterator OCharsetMap::find(const rtl_TextEncoding _eEncoding) const |
| { |
| ensureConstructed( ); |
| return CharsetIterator( this, m_aEncodings.find( _eEncoding ) ); |
| } |
| |
| //------------------------------------------------------------------------- |
| OCharsetMap::CharsetIterator OCharsetMap::find(const ::rtl::OUString& _rIanaName, const IANA&) const |
| { |
| ensureConstructed( ); |
| |
| rtl_TextEncoding eEncoding = RTL_TEXTENCODING_DONTKNOW; |
| if ( _rIanaName.getLength() ) |
| { |
| // byte string conversion |
| ::rtl::OString sMimeByteString( _rIanaName.getStr(), _rIanaName.getLength(), RTL_TEXTENCODING_ASCII_US ); |
| // look up |
| eEncoding = rtl_getTextEncodingFromMimeCharset( sMimeByteString.getStr() ); |
| |
| if ( RTL_TEXTENCODING_DONTKNOW == eEncoding ) |
| { // if we're here, the name is not empty, but unknown -> this is an invalid name |
| return end(); |
| } |
| } |
| |
| return find( eEncoding ); |
| } |
| |
| //------------------------------------------------------------------------- |
| OCharsetMap::CharsetIterator OCharsetMap::end() const |
| { |
| ensureConstructed( ); |
| |
| return CharsetIterator( this, m_aEncodings.end() ); |
| } |
| |
| //========================================================================= |
| //= CharsetIteratorDerefHelper |
| //========================================================================= |
| //------------------------------------------------------------------------- |
| CharsetIteratorDerefHelper::CharsetIteratorDerefHelper( const CharsetIteratorDerefHelper& _rSource ) |
| :m_eEncoding( _rSource.m_eEncoding ) |
| ,m_aIanaName( _rSource.m_aIanaName ) |
| { |
| } |
| |
| //------------------------------------------------------------------------- |
| CharsetIteratorDerefHelper:: CharsetIteratorDerefHelper(const rtl_TextEncoding _eEncoding, const ::rtl::OUString& _rIanaName ) |
| :m_eEncoding( _eEncoding ) |
| ,m_aIanaName( _rIanaName ) |
| { |
| } |
| |
| //------------------------------------------------------------------------- |
| CharsetIteratorDerefHelper::CharsetIteratorDerefHelper() |
| :m_eEncoding(RTL_TEXTENCODING_DONTKNOW) |
| { |
| } |
| |
| //========================================================================= |
| //= OCharsetMap::CharsetIterator |
| //========================================================================= |
| //------------------------------------------------------------------------- |
| OCharsetMap::CharsetIterator::CharsetIterator(const OCharsetMap* _pContainer, OCharsetMap::TextEncBag::const_iterator _aPos ) |
| :m_pContainer( _pContainer ) |
| ,m_aPos( _aPos ) |
| { |
| OSL_ENSURE( m_pContainer, "OCharsetMap::CharsetIterator::CharsetIterator : invalid container!" ); |
| } |
| |
| //------------------------------------------------------------------------- |
| OCharsetMap::CharsetIterator::CharsetIterator(const CharsetIterator& _rSource) |
| :m_pContainer( _rSource.m_pContainer ) |
| ,m_aPos( _rSource.m_aPos ) |
| { |
| } |
| |
| //------------------------------------------------------------------------- |
| OCharsetMap::CharsetIterator::~CharsetIterator() |
| { |
| } |
| |
| //------------------------------------------------------------------------- |
| CharsetIteratorDerefHelper OCharsetMap::CharsetIterator::operator*() const |
| { |
| OSL_ENSURE( m_aPos != m_pContainer->m_aEncodings.end(), "OCharsetMap::CharsetIterator::operator*: invalid position!"); |
| |
| rtl_TextEncoding eEncoding = *m_aPos; |
| ::rtl::OUString sIanaName; |
| |
| if ( RTL_TEXTENCODING_DONTKNOW != eEncoding ) |
| { // it's not the virtual "system charset" |
| const char* pIanaName = rtl_getMimeCharsetFromTextEncoding( eEncoding ); |
| OSL_ENSURE( pIanaName, "OCharsetMap::CharsetIterator: invalid mime name!" ); |
| if ( pIanaName ) |
| sIanaName = ::rtl::OUString::createFromAscii( pIanaName ); |
| } |
| return CharsetIteratorDerefHelper( eEncoding, sIanaName ); |
| } |
| |
| //------------------------------------------------------------------------- |
| const OCharsetMap::CharsetIterator& OCharsetMap::CharsetIterator::operator++() |
| { |
| OSL_ENSURE( m_aPos != m_pContainer->m_aEncodings.end(), "OCharsetMap::CharsetIterator::operator++ : invalid position!" ); |
| if ( m_aPos != m_pContainer->m_aEncodings.end()) |
| ++m_aPos; |
| return *this; |
| } |
| |
| //------------------------------------------------------------------------- |
| const OCharsetMap::CharsetIterator& OCharsetMap::CharsetIterator::operator--() |
| { |
| OSL_ENSURE( m_aPos != m_pContainer->m_aEncodings.begin(), "OCharsetMap::CharsetIterator::operator-- : invalid position!" ); |
| if ( m_aPos != m_pContainer->m_aEncodings.begin() ) |
| --m_aPos; |
| return *this; |
| } |
| |
| //------------------------------------------------------------------------- |
| bool operator==(const OCharsetMap::CharsetIterator& lhs, const OCharsetMap::CharsetIterator& rhs) |
| { |
| return ( lhs.m_pContainer == rhs.m_pContainer ) && ( lhs.m_aPos == rhs.m_aPos ); |
| } |
| |
| //......................................................................... |
| } // namespace dbtools |
| //......................................................................... |
| |