1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_connectivity.hxx"
30*cdf0e10cSrcweir #include <connectivity/dbcharset.hxx>
31*cdf0e10cSrcweir #include "diagnose_ex.h"
32*cdf0e10cSrcweir #include <osl/diagnose.h>
33*cdf0e10cSrcweir #include <rtl/tencinfo.h>
34*cdf0e10cSrcweir 
35*cdf0e10cSrcweir //.........................................................................
36*cdf0e10cSrcweir namespace dbtools
37*cdf0e10cSrcweir {
38*cdf0e10cSrcweir //.........................................................................
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir 	//=========================================================================
41*cdf0e10cSrcweir 	//= OCharsetMap
42*cdf0e10cSrcweir 	//=========================================================================
43*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
44*cdf0e10cSrcweir 	OCharsetMap::OCharsetMap()
45*cdf0e10cSrcweir 	{
46*cdf0e10cSrcweir 	}
47*cdf0e10cSrcweir 
48*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
49*cdf0e10cSrcweir 	void OCharsetMap::lateConstruct()
50*cdf0e10cSrcweir 	{
51*cdf0e10cSrcweir 		const rtl_TextEncoding eFirstEncoding = RTL_TEXTENCODING_DONTKNOW;
52*cdf0e10cSrcweir 		const rtl_TextEncoding eLastEncoding = 100;		// TODO: a define in rtl/textenc.h would be fine here ...
53*cdf0e10cSrcweir 		OSL_ENSURE( 0 == eFirstEncoding, "OCharsetMap::OCharsetMap: somebody changed the numbers!" );
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir 		rtl_TextEncodingInfo aInfo; aInfo.StructSize = sizeof( rtl_TextEncodingInfo );
56*cdf0e10cSrcweir 		for ( rtl_TextEncoding eEncoding = eFirstEncoding; eEncoding < eLastEncoding; ++eEncoding )
57*cdf0e10cSrcweir 		{
58*cdf0e10cSrcweir 			if	(	( RTL_TEXTENCODING_DONTKNOW == eEncoding )	// this is always allowed - it has the special meaning "system encoding"
59*cdf0e10cSrcweir 				||	(	rtl_getTextEncodingInfo( eEncoding, &aInfo )
60*cdf0e10cSrcweir 					&&	approveEncoding( eEncoding, aInfo )
61*cdf0e10cSrcweir 					)
62*cdf0e10cSrcweir 				)
63*cdf0e10cSrcweir 			{
64*cdf0e10cSrcweir 				m_aEncodings.insert( eEncoding );
65*cdf0e10cSrcweir 			}
66*cdf0e10cSrcweir 		}
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir 		OSL_ENSURE( find( RTL_TEXTENCODING_MS_1252 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding ANSI!" );
69*cdf0e10cSrcweir 		OSL_ENSURE( find( RTL_TEXTENCODING_APPLE_ROMAN ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding macintosh!" );
70*cdf0e10cSrcweir 		OSL_ENSURE( find( RTL_TEXTENCODING_IBM_437 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM437!" );
71*cdf0e10cSrcweir 		OSL_ENSURE( find( RTL_TEXTENCODING_IBM_850) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM850!" );
72*cdf0e10cSrcweir 		OSL_ENSURE( find( RTL_TEXTENCODING_IBM_860 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM860!" );
73*cdf0e10cSrcweir 		OSL_ENSURE( find( RTL_TEXTENCODING_IBM_861 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM861!" );
74*cdf0e10cSrcweir 		OSL_ENSURE( find( RTL_TEXTENCODING_IBM_863 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM863!" );
75*cdf0e10cSrcweir 		OSL_ENSURE( find( RTL_TEXTENCODING_IBM_865 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM865!" );
76*cdf0e10cSrcweir 		OSL_ENSURE( find( RTL_TEXTENCODING_IBM_866 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding IBM866!" );
77*cdf0e10cSrcweir 		OSL_ENSURE( find( RTL_TEXTENCODING_DONTKNOW ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding SYSTEM!" );
78*cdf0e10cSrcweir 		OSL_ENSURE( find( RTL_TEXTENCODING_UTF8 ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding UTF-8!" );
79*cdf0e10cSrcweir 		OSL_ENSURE( find( RTL_TEXTENCODING_BIG5_HKSCS ) != end(), "OCharsetMap::lateConstruct: missing compatibility encoding Big5-HKSCS!" );
80*cdf0e10cSrcweir 	}
81*cdf0e10cSrcweir 
82*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
83*cdf0e10cSrcweir 	sal_Bool OCharsetMap::approveEncoding( const rtl_TextEncoding _eEncoding, const rtl_TextEncodingInfo& _rInfo ) const
84*cdf0e10cSrcweir 	{
85*cdf0e10cSrcweir 		sal_Bool bIsMimeEncoding = 0 != ( _rInfo.Flags & RTL_TEXTENCODING_INFO_MIME );
86*cdf0e10cSrcweir 		OSL_ENSURE( !bIsMimeEncoding || rtl_getMimeCharsetFromTextEncoding( _eEncoding ),
87*cdf0e10cSrcweir 				"OCharsetMap::OCharsetMap: inconsistence in rtl!" );
88*cdf0e10cSrcweir         OSL_UNUSED( _eEncoding );
89*cdf0e10cSrcweir 		return bIsMimeEncoding;
90*cdf0e10cSrcweir 	}
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
93*cdf0e10cSrcweir 	OCharsetMap::~OCharsetMap()
94*cdf0e10cSrcweir 	{
95*cdf0e10cSrcweir 	}
96*cdf0e10cSrcweir 
97*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
98*cdf0e10cSrcweir 	OCharsetMap::CharsetIterator OCharsetMap::begin() const
99*cdf0e10cSrcweir 	{
100*cdf0e10cSrcweir 		ensureConstructed( );
101*cdf0e10cSrcweir 		return CharsetIterator(this, m_aEncodings.begin() );
102*cdf0e10cSrcweir 	}
103*cdf0e10cSrcweir 
104*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
105*cdf0e10cSrcweir 	OCharsetMap::CharsetIterator	OCharsetMap::find(const rtl_TextEncoding _eEncoding) const
106*cdf0e10cSrcweir 	{
107*cdf0e10cSrcweir 		ensureConstructed( );
108*cdf0e10cSrcweir 		return CharsetIterator( this, m_aEncodings.find( _eEncoding ) );
109*cdf0e10cSrcweir 	}
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
112*cdf0e10cSrcweir 	OCharsetMap::CharsetIterator	OCharsetMap::find(const ::rtl::OUString& _rIanaName, const IANA&) const
113*cdf0e10cSrcweir 	{
114*cdf0e10cSrcweir 		ensureConstructed( );
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir 		rtl_TextEncoding eEncoding = RTL_TEXTENCODING_DONTKNOW;
117*cdf0e10cSrcweir 		if ( _rIanaName.getLength() )
118*cdf0e10cSrcweir 		{
119*cdf0e10cSrcweir 			// byte string conversion
120*cdf0e10cSrcweir 			::rtl::OString sMimeByteString( _rIanaName.getStr(), _rIanaName.getLength(), RTL_TEXTENCODING_ASCII_US );
121*cdf0e10cSrcweir 			// look up
122*cdf0e10cSrcweir 			eEncoding = rtl_getTextEncodingFromMimeCharset( sMimeByteString.getStr() );
123*cdf0e10cSrcweir 
124*cdf0e10cSrcweir 			if ( RTL_TEXTENCODING_DONTKNOW == eEncoding )
125*cdf0e10cSrcweir 			{	// if we're here, the name is not empty, but unknown -> this is an invalid name
126*cdf0e10cSrcweir 				return end();
127*cdf0e10cSrcweir 			}
128*cdf0e10cSrcweir 		}
129*cdf0e10cSrcweir 
130*cdf0e10cSrcweir 		return find( eEncoding );
131*cdf0e10cSrcweir 	}
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
134*cdf0e10cSrcweir 	OCharsetMap::CharsetIterator OCharsetMap::end() const
135*cdf0e10cSrcweir 	{
136*cdf0e10cSrcweir 		ensureConstructed( );
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir 		return CharsetIterator( this, m_aEncodings.end() );
139*cdf0e10cSrcweir 	}
140*cdf0e10cSrcweir 
141*cdf0e10cSrcweir 	//=========================================================================
142*cdf0e10cSrcweir 	//= CharsetIteratorDerefHelper
143*cdf0e10cSrcweir 	//=========================================================================
144*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
145*cdf0e10cSrcweir 	CharsetIteratorDerefHelper::CharsetIteratorDerefHelper( const CharsetIteratorDerefHelper& _rSource )
146*cdf0e10cSrcweir 		:m_eEncoding( _rSource.m_eEncoding )
147*cdf0e10cSrcweir 		,m_aIanaName( _rSource.m_aIanaName )
148*cdf0e10cSrcweir 	{
149*cdf0e10cSrcweir 	}
150*cdf0e10cSrcweir 
151*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
152*cdf0e10cSrcweir 	CharsetIteratorDerefHelper:: CharsetIteratorDerefHelper(const rtl_TextEncoding _eEncoding, const ::rtl::OUString& _rIanaName )
153*cdf0e10cSrcweir 		:m_eEncoding( _eEncoding )
154*cdf0e10cSrcweir 		,m_aIanaName( _rIanaName )
155*cdf0e10cSrcweir 	{
156*cdf0e10cSrcweir 	}
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
159*cdf0e10cSrcweir 	CharsetIteratorDerefHelper::CharsetIteratorDerefHelper()
160*cdf0e10cSrcweir 		:m_eEncoding(RTL_TEXTENCODING_DONTKNOW)
161*cdf0e10cSrcweir 	{
162*cdf0e10cSrcweir 	}
163*cdf0e10cSrcweir 
164*cdf0e10cSrcweir 	//=========================================================================
165*cdf0e10cSrcweir 	//= OCharsetMap::CharsetIterator
166*cdf0e10cSrcweir 	//=========================================================================
167*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
168*cdf0e10cSrcweir 	OCharsetMap::CharsetIterator::CharsetIterator(const OCharsetMap* _pContainer, OCharsetMap::TextEncBag::const_iterator _aPos )
169*cdf0e10cSrcweir 		:m_pContainer( _pContainer )
170*cdf0e10cSrcweir 		,m_aPos( _aPos )
171*cdf0e10cSrcweir 	{
172*cdf0e10cSrcweir 		OSL_ENSURE( m_pContainer, "OCharsetMap::CharsetIterator::CharsetIterator : invalid container!" );
173*cdf0e10cSrcweir 	}
174*cdf0e10cSrcweir 
175*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
176*cdf0e10cSrcweir 	OCharsetMap::CharsetIterator::CharsetIterator(const CharsetIterator& _rSource)
177*cdf0e10cSrcweir 		:m_pContainer( _rSource.m_pContainer )
178*cdf0e10cSrcweir 		,m_aPos( _rSource.m_aPos )
179*cdf0e10cSrcweir 	{
180*cdf0e10cSrcweir 	}
181*cdf0e10cSrcweir 
182*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
183*cdf0e10cSrcweir 	OCharsetMap::CharsetIterator::~CharsetIterator()
184*cdf0e10cSrcweir 	{
185*cdf0e10cSrcweir 	}
186*cdf0e10cSrcweir 
187*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
188*cdf0e10cSrcweir 	CharsetIteratorDerefHelper OCharsetMap::CharsetIterator::operator*() const
189*cdf0e10cSrcweir 	{
190*cdf0e10cSrcweir 		OSL_ENSURE( m_aPos != m_pContainer->m_aEncodings.end(), "OCharsetMap::CharsetIterator::operator*: invalid position!");
191*cdf0e10cSrcweir 
192*cdf0e10cSrcweir 		rtl_TextEncoding eEncoding = *m_aPos;
193*cdf0e10cSrcweir 		::rtl::OUString sIanaName;
194*cdf0e10cSrcweir 
195*cdf0e10cSrcweir 		if ( RTL_TEXTENCODING_DONTKNOW != eEncoding )
196*cdf0e10cSrcweir 		{	// it's not the virtual "system charset"
197*cdf0e10cSrcweir 			const char* pIanaName = rtl_getMimeCharsetFromTextEncoding( eEncoding );
198*cdf0e10cSrcweir 			OSL_ENSURE( pIanaName, "OCharsetMap::CharsetIterator: invalid mime name!" );
199*cdf0e10cSrcweir 			if ( pIanaName )
200*cdf0e10cSrcweir 				sIanaName = ::rtl::OUString::createFromAscii( pIanaName );
201*cdf0e10cSrcweir 		}
202*cdf0e10cSrcweir 		return CharsetIteratorDerefHelper( eEncoding, sIanaName );
203*cdf0e10cSrcweir 	}
204*cdf0e10cSrcweir 
205*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
206*cdf0e10cSrcweir 	const OCharsetMap::CharsetIterator&	OCharsetMap::CharsetIterator::operator++()
207*cdf0e10cSrcweir 	{
208*cdf0e10cSrcweir 		OSL_ENSURE( m_aPos != m_pContainer->m_aEncodings.end(), "OCharsetMap::CharsetIterator::operator++ : invalid position!" );
209*cdf0e10cSrcweir 		if ( m_aPos != m_pContainer->m_aEncodings.end())
210*cdf0e10cSrcweir 			++m_aPos;
211*cdf0e10cSrcweir 		return *this;
212*cdf0e10cSrcweir 	}
213*cdf0e10cSrcweir 
214*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
215*cdf0e10cSrcweir 	const OCharsetMap::CharsetIterator&	OCharsetMap::CharsetIterator::operator--()
216*cdf0e10cSrcweir 	{
217*cdf0e10cSrcweir 		OSL_ENSURE( m_aPos != m_pContainer->m_aEncodings.begin(), "OCharsetMap::CharsetIterator::operator-- : invalid position!" );
218*cdf0e10cSrcweir 		if ( m_aPos != m_pContainer->m_aEncodings.begin() )
219*cdf0e10cSrcweir 			--m_aPos;
220*cdf0e10cSrcweir 		return *this;
221*cdf0e10cSrcweir 	}
222*cdf0e10cSrcweir 
223*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
224*cdf0e10cSrcweir 	bool operator==(const OCharsetMap::CharsetIterator& lhs, const OCharsetMap::CharsetIterator& rhs)
225*cdf0e10cSrcweir 	{
226*cdf0e10cSrcweir 		return ( lhs.m_pContainer == rhs.m_pContainer ) && ( lhs.m_aPos == rhs.m_aPos );
227*cdf0e10cSrcweir 	}
228*cdf0e10cSrcweir 
229*cdf0e10cSrcweir //.........................................................................
230*cdf0e10cSrcweir }	// namespace dbtools
231*cdf0e10cSrcweir //.........................................................................
232*cdf0e10cSrcweir 
233