xref: /aoo4110/main/unotools/source/misc/atom.cxx (revision b1cdbd2c)
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_unotools.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <unotools/atom.hxx>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski using namespace utl;
30*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
31*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::util;
32*b1cdbd2cSJim Jagielski #define NMSP_UTIL ::com::sun::star::util
33*b1cdbd2cSJim Jagielski 
AtomProvider()34*b1cdbd2cSJim Jagielski AtomProvider::AtomProvider()
35*b1cdbd2cSJim Jagielski {
36*b1cdbd2cSJim Jagielski 	m_nAtoms = 1;
37*b1cdbd2cSJim Jagielski }
38*b1cdbd2cSJim Jagielski 
~AtomProvider()39*b1cdbd2cSJim Jagielski AtomProvider::~AtomProvider()
40*b1cdbd2cSJim Jagielski {
41*b1cdbd2cSJim Jagielski }
42*b1cdbd2cSJim Jagielski 
getAtom(const::rtl::OUString & rString,sal_Bool bCreate)43*b1cdbd2cSJim Jagielski int AtomProvider::getAtom( const ::rtl::OUString& rString, sal_Bool bCreate )
44*b1cdbd2cSJim Jagielski {
45*b1cdbd2cSJim Jagielski 	::std::hash_map< ::rtl::OUString, int, ::rtl::OUStringHash >::iterator it = m_aAtomMap.find( rString );
46*b1cdbd2cSJim Jagielski 	if( it != m_aAtomMap.end() )
47*b1cdbd2cSJim Jagielski 		return it->second;
48*b1cdbd2cSJim Jagielski 	if( ! bCreate )
49*b1cdbd2cSJim Jagielski 		return INVALID_ATOM;
50*b1cdbd2cSJim Jagielski 	m_aAtomMap[ rString ] = m_nAtoms;
51*b1cdbd2cSJim Jagielski 	m_aStringMap[ m_nAtoms ] = rString;
52*b1cdbd2cSJim Jagielski 	m_nAtoms++;
53*b1cdbd2cSJim Jagielski 	return m_nAtoms-1;
54*b1cdbd2cSJim Jagielski }
55*b1cdbd2cSJim Jagielski 
getAll(::std::list<::utl::AtomDescription> & atoms)56*b1cdbd2cSJim Jagielski void AtomProvider::getAll( ::std::list< ::utl::AtomDescription >& atoms )
57*b1cdbd2cSJim Jagielski {
58*b1cdbd2cSJim Jagielski 	atoms.clear();
59*b1cdbd2cSJim Jagielski 	::std::hash_map< ::rtl::OUString, int, ::rtl::OUStringHash >::const_iterator it = m_aAtomMap.begin();
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski 	::utl::AtomDescription aDesc;
62*b1cdbd2cSJim Jagielski 	while( it != m_aAtomMap.end() )
63*b1cdbd2cSJim Jagielski 	{
64*b1cdbd2cSJim Jagielski 		aDesc.atom			= it->second;
65*b1cdbd2cSJim Jagielski 		aDesc.description	= it->first;
66*b1cdbd2cSJim Jagielski 		atoms.push_back( aDesc );
67*b1cdbd2cSJim Jagielski 		++it;
68*b1cdbd2cSJim Jagielski 	}
69*b1cdbd2cSJim Jagielski }
70*b1cdbd2cSJim Jagielski 
getRecent(int atom,::std::list<::utl::AtomDescription> & atoms)71*b1cdbd2cSJim Jagielski void AtomProvider::getRecent( int atom, ::std::list< ::utl::AtomDescription >& atoms )
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski 	atoms.clear();
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski 	::std::hash_map< ::rtl::OUString, int, ::rtl::OUStringHash >::const_iterator it = m_aAtomMap.begin();
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski 	::utl::AtomDescription aDesc;
78*b1cdbd2cSJim Jagielski 	while( it != m_aAtomMap.end() )
79*b1cdbd2cSJim Jagielski 	{
80*b1cdbd2cSJim Jagielski 		if( it->second > atom )
81*b1cdbd2cSJim Jagielski 		{
82*b1cdbd2cSJim Jagielski 			aDesc.atom			= it->second;
83*b1cdbd2cSJim Jagielski 			aDesc.description	= it->first;
84*b1cdbd2cSJim Jagielski 			atoms.push_back( aDesc );
85*b1cdbd2cSJim Jagielski 		}
86*b1cdbd2cSJim Jagielski 		++it;
87*b1cdbd2cSJim Jagielski 	}
88*b1cdbd2cSJim Jagielski }
89*b1cdbd2cSJim Jagielski 
getString(int nAtom) const90*b1cdbd2cSJim Jagielski const ::rtl::OUString& AtomProvider::getString( int nAtom ) const
91*b1cdbd2cSJim Jagielski {
92*b1cdbd2cSJim Jagielski 	static ::rtl::OUString aEmpty;
93*b1cdbd2cSJim Jagielski 	::std::hash_map< int, ::rtl::OUString, ::std::hash< int > >::const_iterator it = m_aStringMap.find( nAtom );
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski 	return it == m_aStringMap.end() ? aEmpty : it->second;
96*b1cdbd2cSJim Jagielski }
97*b1cdbd2cSJim Jagielski 
overrideAtom(int atom,const::rtl::OUString & description)98*b1cdbd2cSJim Jagielski void AtomProvider::overrideAtom( int atom, const ::rtl::OUString& description )
99*b1cdbd2cSJim Jagielski {
100*b1cdbd2cSJim Jagielski 	m_aAtomMap[ description ] = atom;
101*b1cdbd2cSJim Jagielski 	m_aStringMap[ atom ] = description;
102*b1cdbd2cSJim Jagielski 	if( m_nAtoms <= atom )
103*b1cdbd2cSJim Jagielski 		m_nAtoms=atom+1;
104*b1cdbd2cSJim Jagielski }
105*b1cdbd2cSJim Jagielski 
hasAtom(int atom) const106*b1cdbd2cSJim Jagielski sal_Bool AtomProvider::hasAtom( int atom ) const
107*b1cdbd2cSJim Jagielski {
108*b1cdbd2cSJim Jagielski 	return m_aStringMap.find( atom ) != m_aStringMap.end() ? sal_True : sal_False;
109*b1cdbd2cSJim Jagielski }
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
112*b1cdbd2cSJim Jagielski 
MultiAtomProvider()113*b1cdbd2cSJim Jagielski MultiAtomProvider::MultiAtomProvider()
114*b1cdbd2cSJim Jagielski {
115*b1cdbd2cSJim Jagielski }
116*b1cdbd2cSJim Jagielski 
~MultiAtomProvider()117*b1cdbd2cSJim Jagielski MultiAtomProvider::~MultiAtomProvider()
118*b1cdbd2cSJim Jagielski {
119*b1cdbd2cSJim Jagielski 	for( ::std::hash_map< int, AtomProvider*, ::std::hash< int > >::iterator it = m_aAtomLists.begin(); it != m_aAtomLists.end(); ++it )
120*b1cdbd2cSJim Jagielski 		delete it->second;
121*b1cdbd2cSJim Jagielski }
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski 
insertAtomClass(int atomClass)124*b1cdbd2cSJim Jagielski sal_Bool MultiAtomProvider::insertAtomClass( int atomClass )
125*b1cdbd2cSJim Jagielski {
126*b1cdbd2cSJim Jagielski 	::std::hash_map< int, AtomProvider*, ::std::hash< int > >::iterator it =
127*b1cdbd2cSJim Jagielski 		  m_aAtomLists.find( atomClass );
128*b1cdbd2cSJim Jagielski 	if( it != m_aAtomLists.end() )
129*b1cdbd2cSJim Jagielski 		return sal_False;
130*b1cdbd2cSJim Jagielski 	m_aAtomLists[ atomClass ] = new AtomProvider();
131*b1cdbd2cSJim Jagielski 	return sal_True;
132*b1cdbd2cSJim Jagielski }
133*b1cdbd2cSJim Jagielski 
getAtom(int atomClass,const::rtl::OUString & rString,sal_Bool bCreate)134*b1cdbd2cSJim Jagielski int MultiAtomProvider::getAtom( int atomClass, const ::rtl::OUString& rString, sal_Bool bCreate )
135*b1cdbd2cSJim Jagielski {
136*b1cdbd2cSJim Jagielski 	::std::hash_map< int, AtomProvider*, ::std::hash< int > >::iterator it =
137*b1cdbd2cSJim Jagielski 		  m_aAtomLists.find( atomClass );
138*b1cdbd2cSJim Jagielski 	if( it != m_aAtomLists.end() )
139*b1cdbd2cSJim Jagielski 		return it->second->getAtom( rString, bCreate );
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski 	if( bCreate )
142*b1cdbd2cSJim Jagielski 	{
143*b1cdbd2cSJim Jagielski 		AtomProvider* pNewClass;
144*b1cdbd2cSJim Jagielski 		m_aAtomLists[ atomClass ] = pNewClass = new AtomProvider();
145*b1cdbd2cSJim Jagielski 		return pNewClass->getAtom( rString, bCreate );
146*b1cdbd2cSJim Jagielski 	}
147*b1cdbd2cSJim Jagielski 	return INVALID_ATOM;
148*b1cdbd2cSJim Jagielski }
149*b1cdbd2cSJim Jagielski 
getLastAtom(int atomClass) const150*b1cdbd2cSJim Jagielski int MultiAtomProvider::getLastAtom( int atomClass ) const
151*b1cdbd2cSJim Jagielski {
152*b1cdbd2cSJim Jagielski 	::std::hash_map< int, AtomProvider*, ::std::hash< int > >::const_iterator it =
153*b1cdbd2cSJim Jagielski 		  m_aAtomLists.find( atomClass );
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 	return it != m_aAtomLists.end() ? it->second->getLastAtom() : INVALID_ATOM;
156*b1cdbd2cSJim Jagielski }
157*b1cdbd2cSJim Jagielski 
getRecent(int atomClass,int atom,::std::list<::utl::AtomDescription> & atoms)158*b1cdbd2cSJim Jagielski void MultiAtomProvider::getRecent( int atomClass, int atom, ::std::list< ::utl::AtomDescription >& atoms )
159*b1cdbd2cSJim Jagielski {
160*b1cdbd2cSJim Jagielski 	::std::hash_map< int, AtomProvider*, ::std::hash< int > >::const_iterator it =
161*b1cdbd2cSJim Jagielski 		  m_aAtomLists.find( atomClass );
162*b1cdbd2cSJim Jagielski 	if( it != m_aAtomLists.end() )
163*b1cdbd2cSJim Jagielski 		it->second->getRecent( atom, atoms );
164*b1cdbd2cSJim Jagielski 	else
165*b1cdbd2cSJim Jagielski 		atoms.clear();
166*b1cdbd2cSJim Jagielski }
167*b1cdbd2cSJim Jagielski 
getString(int atomClass,int atom) const168*b1cdbd2cSJim Jagielski const ::rtl::OUString& MultiAtomProvider::getString( int atomClass, int atom ) const
169*b1cdbd2cSJim Jagielski {
170*b1cdbd2cSJim Jagielski 	::std::hash_map< int, AtomProvider*, ::std::hash< int > >::const_iterator it =
171*b1cdbd2cSJim Jagielski 		  m_aAtomLists.find( atomClass );
172*b1cdbd2cSJim Jagielski 	if( it != m_aAtomLists.end() )
173*b1cdbd2cSJim Jagielski 		return it->second->getString( atom );
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 	static ::rtl::OUString aEmpty;
176*b1cdbd2cSJim Jagielski 	return aEmpty;
177*b1cdbd2cSJim Jagielski }
178*b1cdbd2cSJim Jagielski 
hasAtom(int atomClass,int atom) const179*b1cdbd2cSJim Jagielski sal_Bool MultiAtomProvider::hasAtom( int atomClass, int atom ) const
180*b1cdbd2cSJim Jagielski {
181*b1cdbd2cSJim Jagielski 	::std::hash_map< int, AtomProvider*, ::std::hash< int > >::const_iterator it = m_aAtomLists.find( atomClass );
182*b1cdbd2cSJim Jagielski 	return it != m_aAtomLists.end() ? it->second->hasAtom( atom ) : sal_False;
183*b1cdbd2cSJim Jagielski }
184*b1cdbd2cSJim Jagielski 
getClass(int atomClass,::std::list<::utl::AtomDescription> & atoms) const185*b1cdbd2cSJim Jagielski void MultiAtomProvider::getClass( int atomClass, ::std::list< ::utl::AtomDescription >& atoms) const
186*b1cdbd2cSJim Jagielski {
187*b1cdbd2cSJim Jagielski 	::std::hash_map< int, AtomProvider*, ::std::hash< int > >::const_iterator it = m_aAtomLists.find( atomClass );
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski 	if( it != m_aAtomLists.end() )
190*b1cdbd2cSJim Jagielski 		it->second->getAll( atoms );
191*b1cdbd2cSJim Jagielski 	else
192*b1cdbd2cSJim Jagielski 		atoms.clear();
193*b1cdbd2cSJim Jagielski }
194*b1cdbd2cSJim Jagielski 
overrideAtom(int atomClass,int atom,const::rtl::OUString & description)195*b1cdbd2cSJim Jagielski void MultiAtomProvider::overrideAtom( int atomClass, int atom, const ::rtl::OUString& description )
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski 	::std::hash_map< int, AtomProvider*, ::std::hash< int > >::const_iterator it = m_aAtomLists.find( atomClass );
198*b1cdbd2cSJim Jagielski 	if( it == m_aAtomLists.end() )
199*b1cdbd2cSJim Jagielski 		m_aAtomLists[ atomClass ] = new AtomProvider();
200*b1cdbd2cSJim Jagielski 	m_aAtomLists[ atomClass ]->overrideAtom( atom, description );
201*b1cdbd2cSJim Jagielski }
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
204*b1cdbd2cSJim Jagielski 
AtomServer()205*b1cdbd2cSJim Jagielski AtomServer::AtomServer()
206*b1cdbd2cSJim Jagielski {
207*b1cdbd2cSJim Jagielski }
208*b1cdbd2cSJim Jagielski 
~AtomServer()209*b1cdbd2cSJim Jagielski AtomServer::~AtomServer()
210*b1cdbd2cSJim Jagielski {
211*b1cdbd2cSJim Jagielski }
212*b1cdbd2cSJim Jagielski 
getAtom(sal_Int32 atomClass,const::rtl::OUString & description,sal_Bool create)213*b1cdbd2cSJim Jagielski sal_Int32 AtomServer::getAtom( sal_Int32 atomClass, const ::rtl::OUString& description, sal_Bool create ) throw()
214*b1cdbd2cSJim Jagielski {
215*b1cdbd2cSJim Jagielski 	::osl::Guard< ::osl::Mutex > guard( m_aMutex );
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski 	return m_aProvider.getAtom( atomClass, description, create );
218*b1cdbd2cSJim Jagielski }
219*b1cdbd2cSJim Jagielski 
getClasses(const Sequence<sal_Int32> & atomClasses)220*b1cdbd2cSJim Jagielski Sequence< Sequence< NMSP_UTIL::AtomDescription > > AtomServer::getClasses( const Sequence< sal_Int32 >& atomClasses ) throw()
221*b1cdbd2cSJim Jagielski {
222*b1cdbd2cSJim Jagielski 	::osl::Guard< ::osl::Mutex > guard( m_aMutex );
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski 	Sequence< Sequence< NMSP_UTIL::AtomDescription > > aRet( atomClasses.getLength() );
225*b1cdbd2cSJim Jagielski 	for( int i = 0; i < atomClasses.getLength(); i++ )
226*b1cdbd2cSJim Jagielski 	{
227*b1cdbd2cSJim Jagielski 		aRet.getArray()[i] = getClass( atomClasses.getConstArray()[i] );
228*b1cdbd2cSJim Jagielski 	}
229*b1cdbd2cSJim Jagielski 	return aRet;
230*b1cdbd2cSJim Jagielski }
231*b1cdbd2cSJim Jagielski 
getClass(sal_Int32 atomClass)232*b1cdbd2cSJim Jagielski Sequence< NMSP_UTIL::AtomDescription > AtomServer::getClass( sal_Int32 atomClass ) throw()
233*b1cdbd2cSJim Jagielski {
234*b1cdbd2cSJim Jagielski 	::osl::Guard< ::osl::Mutex > guard( m_aMutex );
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski 	::std::list< ::utl::AtomDescription > atoms;
237*b1cdbd2cSJim Jagielski 	m_aProvider.getClass( atomClass, atoms );
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski 	Sequence< NMSP_UTIL::AtomDescription > aRet( atoms.size() );
240*b1cdbd2cSJim Jagielski 	for( int i = aRet.getLength()-1; i >= 0; i-- )
241*b1cdbd2cSJim Jagielski 	{
242*b1cdbd2cSJim Jagielski 		aRet.getArray()[i].atom			= atoms.back().atom;
243*b1cdbd2cSJim Jagielski 		aRet.getArray()[i].description	= atoms.back().description;
244*b1cdbd2cSJim Jagielski 		atoms.pop_back();
245*b1cdbd2cSJim Jagielski 	}
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski 	return aRet;
248*b1cdbd2cSJim Jagielski }
249*b1cdbd2cSJim Jagielski 
getRecentAtoms(sal_Int32 atomClass,sal_Int32 atom)250*b1cdbd2cSJim Jagielski Sequence< NMSP_UTIL::AtomDescription > AtomServer::getRecentAtoms( sal_Int32 atomClass, sal_Int32 atom ) throw()
251*b1cdbd2cSJim Jagielski {
252*b1cdbd2cSJim Jagielski 	::osl::Guard< ::osl::Mutex > guard( m_aMutex );
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski 	::std::list< ::utl::AtomDescription > atoms;
255*b1cdbd2cSJim Jagielski 	m_aProvider.getRecent( atomClass, atom, atoms );
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski 	Sequence< NMSP_UTIL::AtomDescription > aRet( atoms.size() );
258*b1cdbd2cSJim Jagielski 	for( int i = aRet.getLength()-1; i >= 0; i-- )
259*b1cdbd2cSJim Jagielski 	{
260*b1cdbd2cSJim Jagielski 		aRet.getArray()[i].atom			= atoms.back().atom;
261*b1cdbd2cSJim Jagielski 		aRet.getArray()[i].description	= atoms.back().description;
262*b1cdbd2cSJim Jagielski 		atoms.pop_back();
263*b1cdbd2cSJim Jagielski 	}
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski 	return aRet;
266*b1cdbd2cSJim Jagielski }
267*b1cdbd2cSJim Jagielski 
getAtomDescriptions(const Sequence<AtomClassRequest> & atoms)268*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString > AtomServer::getAtomDescriptions( const Sequence< AtomClassRequest >& atoms ) throw()
269*b1cdbd2cSJim Jagielski {
270*b1cdbd2cSJim Jagielski 	::osl::Guard< ::osl::Mutex > guard( m_aMutex );
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski 	int nStrings = 0, i;
273*b1cdbd2cSJim Jagielski 	for( i = 0; i < atoms.getLength(); i++ )
274*b1cdbd2cSJim Jagielski 		nStrings += atoms.getConstArray()[ i ].atoms.getLength();
275*b1cdbd2cSJim Jagielski 	Sequence< ::rtl::OUString > aRet( nStrings );
276*b1cdbd2cSJim Jagielski 	for( i = 0, nStrings = 0; i < atoms.getLength(); i++ )
277*b1cdbd2cSJim Jagielski 	{
278*b1cdbd2cSJim Jagielski 		const AtomClassRequest& rRequest = atoms.getConstArray()[i];
279*b1cdbd2cSJim Jagielski 		for( int n = 0; n < rRequest.atoms.getLength(); n++ )
280*b1cdbd2cSJim Jagielski 			aRet.getArray()[ nStrings++ ] = m_aProvider.getString( rRequest.atomClass, rRequest.atoms.getConstArray()[ n ] );
281*b1cdbd2cSJim Jagielski 	}
282*b1cdbd2cSJim Jagielski 	return aRet;
283*b1cdbd2cSJim Jagielski }
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
286*b1cdbd2cSJim Jagielski 
AtomClient(const Reference<XAtomServer> & xServer)287*b1cdbd2cSJim Jagielski AtomClient::AtomClient( const Reference< XAtomServer >& xServer ) :
288*b1cdbd2cSJim Jagielski 		m_xServer( xServer )
289*b1cdbd2cSJim Jagielski {
290*b1cdbd2cSJim Jagielski }
291*b1cdbd2cSJim Jagielski 
~AtomClient()292*b1cdbd2cSJim Jagielski AtomClient::~AtomClient()
293*b1cdbd2cSJim Jagielski {
294*b1cdbd2cSJim Jagielski }
295*b1cdbd2cSJim Jagielski 
getAtom(int atomClass,const::rtl::OUString & description,sal_Bool bCreate)296*b1cdbd2cSJim Jagielski int AtomClient::getAtom( int atomClass, const ::rtl::OUString& description, sal_Bool bCreate )
297*b1cdbd2cSJim Jagielski {
298*b1cdbd2cSJim Jagielski 	int nAtom = m_aProvider.getAtom( atomClass, description, sal_False );
299*b1cdbd2cSJim Jagielski 	if( nAtom == INVALID_ATOM && bCreate )
300*b1cdbd2cSJim Jagielski 	{
301*b1cdbd2cSJim Jagielski         try
302*b1cdbd2cSJim Jagielski         {
303*b1cdbd2cSJim Jagielski 		    nAtom = m_xServer->getAtom( atomClass, description, bCreate );
304*b1cdbd2cSJim Jagielski         }
305*b1cdbd2cSJim Jagielski         catch( RuntimeException& )
306*b1cdbd2cSJim Jagielski         {
307*b1cdbd2cSJim Jagielski             return INVALID_ATOM;
308*b1cdbd2cSJim Jagielski         }
309*b1cdbd2cSJim Jagielski 		if( nAtom != INVALID_ATOM )
310*b1cdbd2cSJim Jagielski 			m_aProvider.overrideAtom( atomClass, nAtom, description );
311*b1cdbd2cSJim Jagielski 	}
312*b1cdbd2cSJim Jagielski 	return nAtom;
313*b1cdbd2cSJim Jagielski }
314*b1cdbd2cSJim Jagielski 
getString(int atomClass,int atom)315*b1cdbd2cSJim Jagielski const ::rtl::OUString& AtomClient::getString( int atomClass, int atom )
316*b1cdbd2cSJim Jagielski {
317*b1cdbd2cSJim Jagielski     static ::rtl::OUString aEmpty;
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski 	if( ! m_aProvider.hasAtom( atomClass, atom ) )
320*b1cdbd2cSJim Jagielski 	{
321*b1cdbd2cSJim Jagielski 		Sequence< NMSP_UTIL::AtomDescription > aSeq;
322*b1cdbd2cSJim Jagielski         try
323*b1cdbd2cSJim Jagielski         {
324*b1cdbd2cSJim Jagielski 		    aSeq = m_xServer->getRecentAtoms( atomClass, m_aProvider.getLastAtom( atomClass ) );
325*b1cdbd2cSJim Jagielski         }
326*b1cdbd2cSJim Jagielski         catch( RuntimeException& )
327*b1cdbd2cSJim Jagielski         {
328*b1cdbd2cSJim Jagielski             return aEmpty;
329*b1cdbd2cSJim Jagielski         }
330*b1cdbd2cSJim Jagielski 		const NMSP_UTIL::AtomDescription* pDescriptions = aSeq.getConstArray();
331*b1cdbd2cSJim Jagielski 		for( int i = 0; i < aSeq.getLength(); i++ )
332*b1cdbd2cSJim Jagielski 			m_aProvider.overrideAtom( atomClass,
333*b1cdbd2cSJim Jagielski 									  pDescriptions[i].atom,
334*b1cdbd2cSJim Jagielski 									  pDescriptions[i].description
335*b1cdbd2cSJim Jagielski 									  );
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski 		if( ! m_aProvider.hasAtom( atomClass, atom ) )
338*b1cdbd2cSJim Jagielski 		{
339*b1cdbd2cSJim Jagielski 			// holes may occur by the above procedure!
340*b1cdbd2cSJim Jagielski 			Sequence< AtomClassRequest > aReq( 1 );
341*b1cdbd2cSJim Jagielski 			aReq.getArray()[0].atomClass = atomClass;
342*b1cdbd2cSJim Jagielski 			aReq.getArray()[0].atoms.realloc( 1 );
343*b1cdbd2cSJim Jagielski 			aReq.getArray()[0].atoms.getArray()[0] = atom;
344*b1cdbd2cSJim Jagielski             Sequence< ::rtl::OUString > aRet;
345*b1cdbd2cSJim Jagielski             try
346*b1cdbd2cSJim Jagielski             {
347*b1cdbd2cSJim Jagielski 			    aRet = m_xServer->getAtomDescriptions( aReq );
348*b1cdbd2cSJim Jagielski             }
349*b1cdbd2cSJim Jagielski             catch( RuntimeException& )
350*b1cdbd2cSJim Jagielski             {
351*b1cdbd2cSJim Jagielski                 return aEmpty;
352*b1cdbd2cSJim Jagielski             }
353*b1cdbd2cSJim Jagielski 			if( aRet.getLength() == 1 )
354*b1cdbd2cSJim Jagielski 				m_aProvider.overrideAtom( atomClass, atom, aRet.getConstArray()[0] );
355*b1cdbd2cSJim Jagielski 		}
356*b1cdbd2cSJim Jagielski 	}
357*b1cdbd2cSJim Jagielski 	return m_aProvider.getString( atomClass, atom );
358*b1cdbd2cSJim Jagielski }
359*b1cdbd2cSJim Jagielski 
updateAtomClasses(const Sequence<sal_Int32> & atomClasses)360*b1cdbd2cSJim Jagielski void AtomClient::updateAtomClasses( const Sequence< sal_Int32 >& atomClasses )
361*b1cdbd2cSJim Jagielski {
362*b1cdbd2cSJim Jagielski 	Sequence< Sequence< NMSP_UTIL::AtomDescription > > aUpdate;
363*b1cdbd2cSJim Jagielski     try
364*b1cdbd2cSJim Jagielski     {
365*b1cdbd2cSJim Jagielski         aUpdate = m_xServer->getClasses( atomClasses );
366*b1cdbd2cSJim Jagielski     }
367*b1cdbd2cSJim Jagielski     catch( RuntimeException& )
368*b1cdbd2cSJim Jagielski     {
369*b1cdbd2cSJim Jagielski         return;
370*b1cdbd2cSJim Jagielski     }
371*b1cdbd2cSJim Jagielski 	for( int i = 0; i < atomClasses.getLength(); i++ )
372*b1cdbd2cSJim Jagielski 	{
373*b1cdbd2cSJim Jagielski 		int nClass = atomClasses.getConstArray()[i];
374*b1cdbd2cSJim Jagielski 		const Sequence< NMSP_UTIL::AtomDescription >& rClass = aUpdate.getConstArray()[i];
375*b1cdbd2cSJim Jagielski 		const NMSP_UTIL::AtomDescription* pDesc = rClass.getConstArray();
376*b1cdbd2cSJim Jagielski 		for( int n = 0; n < rClass.getLength(); n++, pDesc++ )
377*b1cdbd2cSJim Jagielski 			m_aProvider.overrideAtom( nClass, pDesc->atom, pDesc->description );
378*b1cdbd2cSJim Jagielski 	}
379*b1cdbd2cSJim Jagielski }
380