xref: /AOO41X/main/linguistic/source/convdiclist.cxx (revision 3b8558fd12b4776aa3c54a9fb2322537ca2a5e4c)
1*3b8558fdSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*3b8558fdSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*3b8558fdSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*3b8558fdSAndrew Rist  * distributed with this work for additional information
6*3b8558fdSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*3b8558fdSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*3b8558fdSAndrew Rist  * "License"); you may not use this file except in compliance
9*3b8558fdSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*3b8558fdSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*3b8558fdSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*3b8558fdSAndrew Rist  * software distributed under the License is distributed on an
15*3b8558fdSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*3b8558fdSAndrew Rist  * KIND, either express or implied.  See the License for the
17*3b8558fdSAndrew Rist  * specific language governing permissions and limitations
18*3b8558fdSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*3b8558fdSAndrew Rist  *************************************************************/
21*3b8558fdSAndrew Rist 
22*3b8558fdSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_linguistic.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <tools/fsys.hxx>
28cdf0e10cSrcweir #include <tools/stream.hxx>
29cdf0e10cSrcweir #include <tools/urlobj.hxx>
30cdf0e10cSrcweir #include <unotools/pathoptions.hxx>
31cdf0e10cSrcweir #include <unotools/useroptions.hxx>
32cdf0e10cSrcweir #include <unotools/lingucfg.hxx>
33cdf0e10cSrcweir #include <rtl/instance.hxx>
34cdf0e10cSrcweir #include <cppuhelper/factory.hxx>	// helper for factories
35cdf0e10cSrcweir #include <unotools/localfilehelper.hxx>
36cdf0e10cSrcweir #include <com/sun/star/linguistic2/XConversionDictionaryList.hpp>
37cdf0e10cSrcweir #include <com/sun/star/linguistic2/XConversionDictionary.hpp>
38cdf0e10cSrcweir #include <com/sun/star/linguistic2/ConversionDictionaryType.hpp>
39cdf0e10cSrcweir #include <com/sun/star/util/XFlushable.hpp>
40cdf0e10cSrcweir #include <com/sun/star/lang/Locale.hpp>
41cdf0e10cSrcweir #ifndef _COM_SUN_STAR_UNO_REFERENCE_HPP_
42cdf0e10cSrcweir #include <com/sun/star/uno/Reference.h>
43cdf0e10cSrcweir #endif
44cdf0e10cSrcweir #include <com/sun/star/registry/XRegistryKey.hpp>
45cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp>
46cdf0e10cSrcweir 
47cdf0e10cSrcweir #include <ucbhelper/content.hxx>
48cdf0e10cSrcweir 
49cdf0e10cSrcweir #include "convdiclist.hxx"
50cdf0e10cSrcweir #include "convdic.hxx"
51cdf0e10cSrcweir #include "hhconvdic.hxx"
52cdf0e10cSrcweir #include "linguistic/misc.hxx"
53cdf0e10cSrcweir #include "defs.hxx"
54cdf0e10cSrcweir 
55cdf0e10cSrcweir //using namespace utl;
56cdf0e10cSrcweir using namespace osl;
57cdf0e10cSrcweir using namespace rtl;
58cdf0e10cSrcweir using namespace com::sun::star;
59cdf0e10cSrcweir using namespace com::sun::star::lang;
60cdf0e10cSrcweir using namespace com::sun::star::uno;
61cdf0e10cSrcweir using namespace com::sun::star::container;
62cdf0e10cSrcweir using namespace com::sun::star::linguistic2;
63cdf0e10cSrcweir using namespace linguistic;
64cdf0e10cSrcweir 
65cdf0e10cSrcweir #define SN_CONV_DICTIONARY_LIST  "com.sun.star.linguistic2.ConversionDictionaryList"
66cdf0e10cSrcweir 
67cdf0e10cSrcweir 
68cdf0e10cSrcweir ///////////////////////////////////////////////////////////////////////////
69cdf0e10cSrcweir 
operator ==(const Locale & r1,const Locale & r2)70cdf0e10cSrcweir bool operator == ( const Locale &r1, const Locale &r2 )
71cdf0e10cSrcweir {
72cdf0e10cSrcweir     return  r1.Language == r2.Language &&
73cdf0e10cSrcweir             r1.Country  == r2.Country  &&
74cdf0e10cSrcweir             r1.Variant  == r2.Variant;
75cdf0e10cSrcweir }
76cdf0e10cSrcweir 
77cdf0e10cSrcweir ///////////////////////////////////////////////////////////////////////////
78cdf0e10cSrcweir 
GetConvDicMainURL(const String & rDicName,const String & rDirectoryURL)79cdf0e10cSrcweir String GetConvDicMainURL( const String &rDicName, const String &rDirectoryURL )
80cdf0e10cSrcweir {
81cdf0e10cSrcweir     // build URL to use for new (persistent) dictionaries
82cdf0e10cSrcweir 
83cdf0e10cSrcweir     String aFullDicName( rDicName );
84cdf0e10cSrcweir     aFullDicName.AppendAscii( CONV_DIC_DOT_EXT );
85cdf0e10cSrcweir 
86cdf0e10cSrcweir     INetURLObject aURLObj;
87cdf0e10cSrcweir     aURLObj.SetSmartProtocol( INET_PROT_FILE );
88cdf0e10cSrcweir     aURLObj.SetSmartURL( rDirectoryURL );
89cdf0e10cSrcweir     aURLObj.Append( aFullDicName, INetURLObject::ENCODE_ALL );
90cdf0e10cSrcweir     DBG_ASSERT(!aURLObj.HasError(), "invalid URL");
91cdf0e10cSrcweir     if (aURLObj.HasError())
92cdf0e10cSrcweir         return String();
93cdf0e10cSrcweir     else
94cdf0e10cSrcweir         return aURLObj.GetMainURL( INetURLObject::DECODE_TO_IURI );
95cdf0e10cSrcweir }
96cdf0e10cSrcweir 
97cdf0e10cSrcweir ///////////////////////////////////////////////////////////////////////////
98cdf0e10cSrcweir 
99cdf0e10cSrcweir class ConvDicNameContainer :
100cdf0e10cSrcweir     public cppu::WeakImplHelper1
101cdf0e10cSrcweir     <
102cdf0e10cSrcweir         ::com::sun::star::container::XNameContainer
103cdf0e10cSrcweir     >
104cdf0e10cSrcweir {
105cdf0e10cSrcweir     uno::Sequence< uno::Reference< XConversionDictionary > >   aConvDics;
106cdf0e10cSrcweir     ConvDicList     &rConvDicList;
107cdf0e10cSrcweir 
108cdf0e10cSrcweir     // disallow copy-constructor and assignment-operator for now
109cdf0e10cSrcweir     ConvDicNameContainer(const ConvDicNameContainer &);
110cdf0e10cSrcweir     ConvDicNameContainer & operator = (const ConvDicNameContainer &);
111cdf0e10cSrcweir 
112cdf0e10cSrcweir     sal_Int32 GetIndexByName_Impl( const OUString& rName );
113cdf0e10cSrcweir 
114cdf0e10cSrcweir public:
115cdf0e10cSrcweir     ConvDicNameContainer( ConvDicList &rMyConvDicList );
116cdf0e10cSrcweir     virtual ~ConvDicNameContainer();
117cdf0e10cSrcweir 
118cdf0e10cSrcweir     // XElementAccess
119cdf0e10cSrcweir     virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw (::com::sun::star::uno::RuntimeException);
120cdf0e10cSrcweir     virtual sal_Bool SAL_CALL hasElements(  ) throw (::com::sun::star::uno::RuntimeException);
121cdf0e10cSrcweir 
122cdf0e10cSrcweir     // XNameAccess
123cdf0e10cSrcweir     virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
124cdf0e10cSrcweir     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames(  ) throw (::com::sun::star::uno::RuntimeException);
125cdf0e10cSrcweir     virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) throw (::com::sun::star::uno::RuntimeException);
126cdf0e10cSrcweir 
127cdf0e10cSrcweir     // XNameReplace
128cdf0e10cSrcweir     virtual void SAL_CALL replaceByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
129cdf0e10cSrcweir 
130cdf0e10cSrcweir     // XNameContainer
131cdf0e10cSrcweir     virtual void SAL_CALL insertByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::ElementExistException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
132cdf0e10cSrcweir     virtual void SAL_CALL removeByName( const ::rtl::OUString& Name ) throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
133cdf0e10cSrcweir 
134cdf0e10cSrcweir 
135cdf0e10cSrcweir     // looks for conversion dictionaries with the specified extension
136cdf0e10cSrcweir     // in the directory and adds them to the container
137cdf0e10cSrcweir     void AddConvDics( const String &rSearchDirPathURL, const String &rExtension );
138cdf0e10cSrcweir 
139cdf0e10cSrcweir     // calls Flush for the dictionaries that support XFlushable
140cdf0e10cSrcweir     void    FlushDics() const;
141cdf0e10cSrcweir 
GetCount() const142cdf0e10cSrcweir     sal_Int32   GetCount() const    { return aConvDics.getLength(); }
143cdf0e10cSrcweir     uno::Reference< XConversionDictionary > GetByName( const OUString& rName );
144cdf0e10cSrcweir 
GetByIndex(sal_Int32 nIdx)145cdf0e10cSrcweir     const uno::Reference< XConversionDictionary >    GetByIndex( sal_Int32 nIdx )
146cdf0e10cSrcweir     {
147cdf0e10cSrcweir         return aConvDics.getConstArray()[nIdx];
148cdf0e10cSrcweir     }
149cdf0e10cSrcweir };
150cdf0e10cSrcweir 
151cdf0e10cSrcweir 
ConvDicNameContainer(ConvDicList & rMyConvDicList)152cdf0e10cSrcweir ConvDicNameContainer::ConvDicNameContainer( ConvDicList &rMyConvDicList ) :
153cdf0e10cSrcweir     rConvDicList( rMyConvDicList )
154cdf0e10cSrcweir {
155cdf0e10cSrcweir }
156cdf0e10cSrcweir 
157cdf0e10cSrcweir 
~ConvDicNameContainer()158cdf0e10cSrcweir ConvDicNameContainer::~ConvDicNameContainer()
159cdf0e10cSrcweir {
160cdf0e10cSrcweir }
161cdf0e10cSrcweir 
162cdf0e10cSrcweir 
FlushDics() const163cdf0e10cSrcweir void ConvDicNameContainer::FlushDics() const
164cdf0e10cSrcweir {
165cdf0e10cSrcweir     sal_Int32 nLen = aConvDics.getLength();
166cdf0e10cSrcweir     const uno::Reference< XConversionDictionary > *pDic = aConvDics.getConstArray();
167cdf0e10cSrcweir     for (sal_Int32 i = 0;  i < nLen;  ++i)
168cdf0e10cSrcweir     {
169cdf0e10cSrcweir         uno::Reference< util::XFlushable > xFlush( pDic[i] , UNO_QUERY );
170cdf0e10cSrcweir         if (xFlush.is())
171cdf0e10cSrcweir         {
172cdf0e10cSrcweir             try
173cdf0e10cSrcweir             {
174cdf0e10cSrcweir                 xFlush->flush();
175cdf0e10cSrcweir             }
176cdf0e10cSrcweir             catch(Exception &)
177cdf0e10cSrcweir             {
178cdf0e10cSrcweir                 DBG_ERROR( "flushing of conversion dictionary failed" );
179cdf0e10cSrcweir             }
180cdf0e10cSrcweir         }
181cdf0e10cSrcweir     }
182cdf0e10cSrcweir }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir 
GetIndexByName_Impl(const OUString & rName)185cdf0e10cSrcweir sal_Int32 ConvDicNameContainer::GetIndexByName_Impl(
186cdf0e10cSrcweir         const OUString& rName )
187cdf0e10cSrcweir {
188cdf0e10cSrcweir     sal_Int32 nRes = -1;
189cdf0e10cSrcweir     sal_Int32 nLen = aConvDics.getLength();
190cdf0e10cSrcweir     const uno::Reference< XConversionDictionary > *pDic = aConvDics.getConstArray();
191cdf0e10cSrcweir     for (sal_Int32 i = 0;  i < nLen && nRes == -1;  ++i)
192cdf0e10cSrcweir     {
193cdf0e10cSrcweir         if (rName == pDic[i]->getName())
194cdf0e10cSrcweir             nRes = i;
195cdf0e10cSrcweir     }
196cdf0e10cSrcweir     return nRes;
197cdf0e10cSrcweir }
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 
GetByName(const OUString & rName)200cdf0e10cSrcweir uno::Reference< XConversionDictionary > ConvDicNameContainer::GetByName(
201cdf0e10cSrcweir         const OUString& rName )
202cdf0e10cSrcweir {
203cdf0e10cSrcweir     uno::Reference< XConversionDictionary > xRes;
204cdf0e10cSrcweir     sal_Int32 nIdx = GetIndexByName_Impl( rName );
205cdf0e10cSrcweir     if ( nIdx != -1)
206cdf0e10cSrcweir         xRes = aConvDics.getArray()[nIdx];
207cdf0e10cSrcweir     return xRes;
208cdf0e10cSrcweir }
209cdf0e10cSrcweir 
210cdf0e10cSrcweir 
getElementType()211cdf0e10cSrcweir uno::Type SAL_CALL ConvDicNameContainer::getElementType(  )
212cdf0e10cSrcweir     throw (RuntimeException)
213cdf0e10cSrcweir {
214cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
215cdf0e10cSrcweir     return uno::Type( ::getCppuType( (uno::Reference< XConversionDictionary > *) 0) );
216cdf0e10cSrcweir }
217cdf0e10cSrcweir 
218cdf0e10cSrcweir 
hasElements()219cdf0e10cSrcweir sal_Bool SAL_CALL ConvDicNameContainer::hasElements(  )
220cdf0e10cSrcweir     throw (RuntimeException)
221cdf0e10cSrcweir {
222cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
223cdf0e10cSrcweir     return aConvDics.getLength() > 0;
224cdf0e10cSrcweir }
225cdf0e10cSrcweir 
226cdf0e10cSrcweir 
getByName(const OUString & rName)227cdf0e10cSrcweir uno::Any SAL_CALL ConvDicNameContainer::getByName( const OUString& rName )
228cdf0e10cSrcweir     throw (NoSuchElementException, WrappedTargetException, RuntimeException)
229cdf0e10cSrcweir {
230cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
231cdf0e10cSrcweir     uno::Reference< XConversionDictionary > xRes( GetByName( rName ) );
232cdf0e10cSrcweir     if (!xRes.is())
233cdf0e10cSrcweir         throw NoSuchElementException();
234cdf0e10cSrcweir     return makeAny( xRes );
235cdf0e10cSrcweir }
236cdf0e10cSrcweir 
237cdf0e10cSrcweir 
getElementNames()238cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL ConvDicNameContainer::getElementNames(  )
239cdf0e10cSrcweir     throw (RuntimeException)
240cdf0e10cSrcweir {
241cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
242cdf0e10cSrcweir 
243cdf0e10cSrcweir     sal_Int32 nLen = aConvDics.getLength();
244cdf0e10cSrcweir     uno::Sequence< OUString > aRes( nLen );
245cdf0e10cSrcweir     OUString *pName = aRes.getArray();
246cdf0e10cSrcweir     const uno::Reference< XConversionDictionary > *pDic = aConvDics.getConstArray();
247cdf0e10cSrcweir     for (sal_Int32 i = 0;  i < nLen;  ++i)
248cdf0e10cSrcweir         pName[i] = pDic[i]->getName();
249cdf0e10cSrcweir     return aRes;
250cdf0e10cSrcweir }
251cdf0e10cSrcweir 
252cdf0e10cSrcweir 
hasByName(const OUString & rName)253cdf0e10cSrcweir sal_Bool SAL_CALL ConvDicNameContainer::hasByName( const OUString& rName )
254cdf0e10cSrcweir     throw (RuntimeException)
255cdf0e10cSrcweir {
256cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
257cdf0e10cSrcweir     return GetByName( rName ).is();
258cdf0e10cSrcweir }
259cdf0e10cSrcweir 
260cdf0e10cSrcweir 
replaceByName(const OUString & rName,const uno::Any & rElement)261cdf0e10cSrcweir void SAL_CALL ConvDicNameContainer::replaceByName(
262cdf0e10cSrcweir         const OUString& rName,
263cdf0e10cSrcweir         const uno::Any& rElement )
264cdf0e10cSrcweir     throw (IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException)
265cdf0e10cSrcweir {
266cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
267cdf0e10cSrcweir 
268cdf0e10cSrcweir     sal_Int32 nRplcIdx = GetIndexByName_Impl( rName );
269cdf0e10cSrcweir     if (nRplcIdx == -1)
270cdf0e10cSrcweir         throw NoSuchElementException();
271cdf0e10cSrcweir     uno::Reference< XConversionDictionary > xNew;
272cdf0e10cSrcweir     rElement >>= xNew;
273cdf0e10cSrcweir     if (!xNew.is() || xNew->getName() != rName)
274cdf0e10cSrcweir         throw IllegalArgumentException();
275cdf0e10cSrcweir     aConvDics.getArray()[ nRplcIdx ] = xNew;
276cdf0e10cSrcweir }
277cdf0e10cSrcweir 
278cdf0e10cSrcweir 
insertByName(const OUString & rName,const Any & rElement)279cdf0e10cSrcweir void SAL_CALL ConvDicNameContainer::insertByName(
280cdf0e10cSrcweir         const OUString& rName,
281cdf0e10cSrcweir         const Any& rElement )
282cdf0e10cSrcweir     throw (IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException)
283cdf0e10cSrcweir {
284cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
285cdf0e10cSrcweir 
286cdf0e10cSrcweir     if (GetByName( rName ).is())
287cdf0e10cSrcweir         throw ElementExistException();
288cdf0e10cSrcweir     uno::Reference< XConversionDictionary > xNew;
289cdf0e10cSrcweir     rElement >>= xNew;
290cdf0e10cSrcweir     if (!xNew.is() || xNew->getName() != rName)
291cdf0e10cSrcweir         throw IllegalArgumentException();
292cdf0e10cSrcweir 
293cdf0e10cSrcweir     sal_Int32 nLen = aConvDics.getLength();
294cdf0e10cSrcweir     aConvDics.realloc( nLen + 1 );
295cdf0e10cSrcweir     aConvDics.getArray()[ nLen ] = xNew;
296cdf0e10cSrcweir }
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 
removeByName(const OUString & rName)299cdf0e10cSrcweir void SAL_CALL ConvDicNameContainer::removeByName( const OUString& rName )
300cdf0e10cSrcweir     throw (NoSuchElementException, WrappedTargetException, RuntimeException)
301cdf0e10cSrcweir {
302cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
303cdf0e10cSrcweir 
304cdf0e10cSrcweir     sal_Int32 nRplcIdx = GetIndexByName_Impl( rName );
305cdf0e10cSrcweir     if (nRplcIdx == -1)
306cdf0e10cSrcweir         throw NoSuchElementException();
307cdf0e10cSrcweir 
308cdf0e10cSrcweir 	// physically remove dictionary
309cdf0e10cSrcweir     uno::Reference< XConversionDictionary > xDel = aConvDics.getArray()[nRplcIdx];
310cdf0e10cSrcweir 	String aName( xDel->getName() );
311cdf0e10cSrcweir     String aDicMainURL( GetConvDicMainURL( aName, GetDictionaryWriteablePath() ) );
312cdf0e10cSrcweir 	INetURLObject aObj( aDicMainURL );
313cdf0e10cSrcweir 	DBG_ASSERT( aObj.GetProtocol() == INET_PROT_FILE, "+HangulHanjaOptionsDialog::OkHdl(): non-file URLs cannot be deleted" );
314cdf0e10cSrcweir 	if( aObj.GetProtocol() == INET_PROT_FILE )
315cdf0e10cSrcweir 	{
316cdf0e10cSrcweir 		try
317cdf0e10cSrcweir 		{
318cdf0e10cSrcweir 			::ucbhelper::Content	aCnt( aObj.GetMainURL( INetURLObject::NO_DECODE ),
319cdf0e10cSrcweir 									uno::Reference< ::com::sun::star::ucb::XCommandEnvironment > () );
320cdf0e10cSrcweir 			aCnt.executeCommand( OUString::createFromAscii( "delete" ), makeAny( sal_Bool( sal_True ) ) );
321cdf0e10cSrcweir 		}
322cdf0e10cSrcweir 		catch( ::com::sun::star::ucb::CommandAbortedException& )
323cdf0e10cSrcweir 		{
324cdf0e10cSrcweir 			DBG_ERRORFILE( "HangulHanjaOptionsDialog::OkHdl(): CommandAbortedException" );
325cdf0e10cSrcweir 		}
326cdf0e10cSrcweir 		catch( ... )
327cdf0e10cSrcweir 		{
328cdf0e10cSrcweir 			DBG_ERRORFILE( "HangulHanjaOptionsDialog::OkHdl(): Any other exception" );
329cdf0e10cSrcweir 		}
330cdf0e10cSrcweir 	}
331cdf0e10cSrcweir 
332cdf0e10cSrcweir     sal_Int32 nLen = aConvDics.getLength();
333cdf0e10cSrcweir     uno::Reference< XConversionDictionary > *pDic = aConvDics.getArray();
334cdf0e10cSrcweir     for (sal_Int32 i = nRplcIdx;  i < nLen - 1;  ++i)
335cdf0e10cSrcweir         pDic[i] = pDic[i + 1];
336cdf0e10cSrcweir     aConvDics.realloc( nLen - 1 );
337cdf0e10cSrcweir }
338cdf0e10cSrcweir 
339cdf0e10cSrcweir 
AddConvDics(const String & rSearchDirPathURL,const String & rExtension)340cdf0e10cSrcweir void ConvDicNameContainer::AddConvDics(
341cdf0e10cSrcweir         const String &rSearchDirPathURL,
342cdf0e10cSrcweir         const String &rExtension )
343cdf0e10cSrcweir {
344cdf0e10cSrcweir     const Sequence< OUString > aDirCnt(
345cdf0e10cSrcweir                 utl::LocalFileHelper::GetFolderContents( rSearchDirPathURL, sal_False ) );
346cdf0e10cSrcweir     const OUString *pDirCnt = aDirCnt.getConstArray();
347cdf0e10cSrcweir     sal_Int32 nEntries = aDirCnt.getLength();
348cdf0e10cSrcweir 
349cdf0e10cSrcweir     for (sal_Int32 i = 0;  i < nEntries;  ++i)
350cdf0e10cSrcweir     {
351cdf0e10cSrcweir         String  aURL( pDirCnt[i] );
352cdf0e10cSrcweir 
353cdf0e10cSrcweir         xub_StrLen nPos  = aURL.SearchBackward('.');
354cdf0e10cSrcweir         String  aExt(aURL.Copy(nPos + 1));
355cdf0e10cSrcweir         aExt.ToLowerAscii();
356cdf0e10cSrcweir         String  aSearchExt( rExtension );
357cdf0e10cSrcweir         aSearchExt.ToLowerAscii();
358cdf0e10cSrcweir         if(aExt != aSearchExt)
359cdf0e10cSrcweir             continue;          // skip other files
360cdf0e10cSrcweir 
361cdf0e10cSrcweir         sal_Int16 nLang;
362cdf0e10cSrcweir         sal_Int16 nConvType;
363cdf0e10cSrcweir         if (IsConvDic( aURL, nLang, nConvType ))
364cdf0e10cSrcweir         {
365cdf0e10cSrcweir             // get decoded dictionary file name
366cdf0e10cSrcweir             INetURLObject aURLObj( aURL );
367cdf0e10cSrcweir             String aDicName = aURLObj.getBase( INetURLObject::LAST_SEGMENT,
368cdf0e10cSrcweir                         true, INetURLObject::DECODE_WITH_CHARSET,
369cdf0e10cSrcweir                         RTL_TEXTENCODING_UTF8 );
370cdf0e10cSrcweir 
371cdf0e10cSrcweir             uno::Reference < XConversionDictionary > xDic;
372cdf0e10cSrcweir             if (nLang == LANGUAGE_KOREAN &&
373cdf0e10cSrcweir                 nConvType == ConversionDictionaryType::HANGUL_HANJA)
374cdf0e10cSrcweir             {
375cdf0e10cSrcweir                 xDic = new HHConvDic( aDicName, aURL );
376cdf0e10cSrcweir             }
377cdf0e10cSrcweir             else if ((nLang == LANGUAGE_CHINESE_SIMPLIFIED || nLang == LANGUAGE_CHINESE_TRADITIONAL) &&
378cdf0e10cSrcweir                       nConvType == ConversionDictionaryType::SCHINESE_TCHINESE)
379cdf0e10cSrcweir             {
380cdf0e10cSrcweir                 xDic = new ConvDic( aDicName, nLang, nConvType, sal_False, aURL );
381cdf0e10cSrcweir             }
382cdf0e10cSrcweir 
383cdf0e10cSrcweir             if (xDic.is())
384cdf0e10cSrcweir             {
385cdf0e10cSrcweir                 uno::Any aAny;
386cdf0e10cSrcweir                 aAny <<= xDic;
387cdf0e10cSrcweir                 insertByName( xDic->getName(), aAny );
388cdf0e10cSrcweir             }
389cdf0e10cSrcweir         }
390cdf0e10cSrcweir     }
391cdf0e10cSrcweir }
392cdf0e10cSrcweir 
393cdf0e10cSrcweir ///////////////////////////////////////////////////////////////////////////
394cdf0e10cSrcweir 
395cdf0e10cSrcweir namespace
396cdf0e10cSrcweir {
397cdf0e10cSrcweir     struct StaticConvDicList : public rtl::StaticWithInit<
398cdf0e10cSrcweir         uno::Reference<XInterface>, StaticConvDicList> {
operator ()__anon759342ab0111::StaticConvDicList399cdf0e10cSrcweir         uno::Reference<XInterface> operator () () {
400cdf0e10cSrcweir             return (cppu::OWeakObject *) new ConvDicList;
401cdf0e10cSrcweir         }
402cdf0e10cSrcweir     };
403cdf0e10cSrcweir }
404cdf0e10cSrcweir 
405cdf0e10cSrcweir 
AtExit()406cdf0e10cSrcweir void ConvDicList::MyAppExitListener::AtExit()
407cdf0e10cSrcweir {
408cdf0e10cSrcweir     rMyDicList.FlushDics();
409cdf0e10cSrcweir     StaticConvDicList::get().clear();
410cdf0e10cSrcweir }
411cdf0e10cSrcweir 
ConvDicList()412cdf0e10cSrcweir ConvDicList::ConvDicList() :
413cdf0e10cSrcweir     aEvtListeners( GetLinguMutex() )
414cdf0e10cSrcweir {
415cdf0e10cSrcweir     pNameContainer = 0;
416cdf0e10cSrcweir     bDisposing = sal_False;
417cdf0e10cSrcweir 
418cdf0e10cSrcweir     pExitListener = new MyAppExitListener( *this );
419cdf0e10cSrcweir     xExitListener = pExitListener;
420cdf0e10cSrcweir     pExitListener->Activate();
421cdf0e10cSrcweir }
422cdf0e10cSrcweir 
423cdf0e10cSrcweir 
~ConvDicList()424cdf0e10cSrcweir ConvDicList::~ConvDicList()
425cdf0e10cSrcweir {
426cdf0e10cSrcweir     // NameContainer will deleted when the reference xNameContainer
427cdf0e10cSrcweir     // is destroyed.
428cdf0e10cSrcweir     // delete pNameContainer;
429cdf0e10cSrcweir 
430cdf0e10cSrcweir 	if (!bDisposing && pNameContainer)
431cdf0e10cSrcweir 		pNameContainer->FlushDics();
432cdf0e10cSrcweir 
433cdf0e10cSrcweir     pExitListener->Deactivate();
434cdf0e10cSrcweir }
435cdf0e10cSrcweir 
436cdf0e10cSrcweir 
FlushDics()437cdf0e10cSrcweir void ConvDicList::FlushDics()
438cdf0e10cSrcweir {
439cdf0e10cSrcweir     // check only pointer to avoid creating the container when
440cdf0e10cSrcweir     // the dictionaries were not accessed yet
441cdf0e10cSrcweir     if (pNameContainer)
442cdf0e10cSrcweir         pNameContainer->FlushDics();
443cdf0e10cSrcweir }
444cdf0e10cSrcweir 
445cdf0e10cSrcweir 
GetNameContainer()446cdf0e10cSrcweir ConvDicNameContainer & ConvDicList::GetNameContainer()
447cdf0e10cSrcweir {
448cdf0e10cSrcweir     if (!pNameContainer)
449cdf0e10cSrcweir     {
450cdf0e10cSrcweir         pNameContainer = new ConvDicNameContainer( *this );
451cdf0e10cSrcweir         pNameContainer->AddConvDics( GetDictionaryWriteablePath(),
452cdf0e10cSrcweir                                      A2OU( CONV_DIC_EXT ) );
453cdf0e10cSrcweir         xNameContainer = pNameContainer;
454cdf0e10cSrcweir 
455cdf0e10cSrcweir         // access list of text conversion dictionaries to activate
456cdf0e10cSrcweir         SvtLinguOptions aOpt;
457cdf0e10cSrcweir         SvtLinguConfig().GetOptions( aOpt );
458cdf0e10cSrcweir         sal_Int32 nLen = aOpt.aActiveConvDics.getLength();
459cdf0e10cSrcweir         const OUString *pActiveConvDics = aOpt.aActiveConvDics.getConstArray();
460cdf0e10cSrcweir         for (sal_Int32 i = 0;  i < nLen;  ++i)
461cdf0e10cSrcweir         {
462cdf0e10cSrcweir             uno::Reference< XConversionDictionary > xDic =
463cdf0e10cSrcweir                     pNameContainer->GetByName( pActiveConvDics[i] );
464cdf0e10cSrcweir             if (xDic.is())
465cdf0e10cSrcweir                 xDic->setActive( sal_True );
466cdf0e10cSrcweir         }
467cdf0e10cSrcweir 
468cdf0e10cSrcweir 		// since there is no UI to active/deactivate the dictionaries
469cdf0e10cSrcweir 		// for chinese text conversion they should be activated by default
470cdf0e10cSrcweir 		uno::Reference< XConversionDictionary > xS2TDic(
471cdf0e10cSrcweir                     pNameContainer->GetByName( A2OU("ChineseS2T") ), UNO_QUERY );
472cdf0e10cSrcweir 		uno::Reference< XConversionDictionary > xT2SDic(
473cdf0e10cSrcweir                     pNameContainer->GetByName( A2OU("ChineseT2S") ), UNO_QUERY );
474cdf0e10cSrcweir             if (xS2TDic.is())
475cdf0e10cSrcweir                 xS2TDic->setActive( sal_True );
476cdf0e10cSrcweir             if (xT2SDic.is())
477cdf0e10cSrcweir                 xT2SDic->setActive( sal_True );
478cdf0e10cSrcweir 
479cdf0e10cSrcweir     }
480cdf0e10cSrcweir     return *pNameContainer;
481cdf0e10cSrcweir }
482cdf0e10cSrcweir 
483cdf0e10cSrcweir 
getDictionaryContainer()484cdf0e10cSrcweir uno::Reference< container::XNameContainer > SAL_CALL ConvDicList::getDictionaryContainer(  ) throw (RuntimeException)
485cdf0e10cSrcweir {
486cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
487cdf0e10cSrcweir     GetNameContainer();
488cdf0e10cSrcweir     DBG_ASSERT( xNameContainer.is(), "missing name container" );
489cdf0e10cSrcweir     return xNameContainer;
490cdf0e10cSrcweir }
491cdf0e10cSrcweir 
492cdf0e10cSrcweir 
addNewDictionary(const OUString & rName,const Locale & rLocale,sal_Int16 nConvDicType)493cdf0e10cSrcweir uno::Reference< XConversionDictionary > SAL_CALL ConvDicList::addNewDictionary(
494cdf0e10cSrcweir         const OUString& rName,
495cdf0e10cSrcweir         const Locale& rLocale,
496cdf0e10cSrcweir         sal_Int16 nConvDicType )
497cdf0e10cSrcweir     throw (NoSupportException, ElementExistException, RuntimeException)
498cdf0e10cSrcweir {
499cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
500cdf0e10cSrcweir 
501cdf0e10cSrcweir     sal_Int16 nLang = LocaleToLanguage( rLocale );
502cdf0e10cSrcweir 
503cdf0e10cSrcweir     if (GetNameContainer().hasByName( rName ))
504cdf0e10cSrcweir         throw ElementExistException();
505cdf0e10cSrcweir 
506cdf0e10cSrcweir     uno::Reference< XConversionDictionary > xRes;
507cdf0e10cSrcweir     String aDicMainURL( GetConvDicMainURL( rName, GetDictionaryWriteablePath() ) );
508cdf0e10cSrcweir     if (nLang == LANGUAGE_KOREAN &&
509cdf0e10cSrcweir         nConvDicType == ConversionDictionaryType::HANGUL_HANJA)
510cdf0e10cSrcweir     {
511cdf0e10cSrcweir         xRes = new HHConvDic( rName, aDicMainURL );
512cdf0e10cSrcweir     }
513cdf0e10cSrcweir     else if ((nLang == LANGUAGE_CHINESE_SIMPLIFIED || nLang == LANGUAGE_CHINESE_TRADITIONAL) &&
514cdf0e10cSrcweir               nConvDicType == ConversionDictionaryType::SCHINESE_TCHINESE)
515cdf0e10cSrcweir     {
516cdf0e10cSrcweir         xRes = new ConvDic( rName, nLang, nConvDicType, sal_False, aDicMainURL );
517cdf0e10cSrcweir     }
518cdf0e10cSrcweir 
519cdf0e10cSrcweir     if (!xRes.is())
520cdf0e10cSrcweir         throw NoSupportException();
521cdf0e10cSrcweir     else
522cdf0e10cSrcweir     {
523cdf0e10cSrcweir         xRes->setActive( sal_True );
524cdf0e10cSrcweir         uno::Any aAny;
525cdf0e10cSrcweir         aAny <<= xRes;
526cdf0e10cSrcweir         GetNameContainer().insertByName( rName, aAny );
527cdf0e10cSrcweir     }
528cdf0e10cSrcweir     return xRes;
529cdf0e10cSrcweir }
530cdf0e10cSrcweir 
531cdf0e10cSrcweir 
queryConversions(const OUString & rText,sal_Int32 nStartPos,sal_Int32 nLength,const Locale & rLocale,sal_Int16 nConversionDictionaryType,ConversionDirection eDirection,sal_Int32 nTextConversionOptions)532cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL ConvDicList::queryConversions(
533cdf0e10cSrcweir         const OUString& rText,
534cdf0e10cSrcweir         sal_Int32 nStartPos,
535cdf0e10cSrcweir         sal_Int32 nLength,
536cdf0e10cSrcweir         const Locale& rLocale,
537cdf0e10cSrcweir         sal_Int16 nConversionDictionaryType,
538cdf0e10cSrcweir         ConversionDirection eDirection,
539cdf0e10cSrcweir         sal_Int32 nTextConversionOptions )
540cdf0e10cSrcweir     throw (IllegalArgumentException, NoSupportException, RuntimeException)
541cdf0e10cSrcweir {
542cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
543cdf0e10cSrcweir 
544cdf0e10cSrcweir     /*sal_Int16 nLang = LocaleToLanguage( rLocale );*/
545cdf0e10cSrcweir 
546cdf0e10cSrcweir     sal_Int32 nCount = 0;
547cdf0e10cSrcweir     uno::Sequence< OUString > aRes( 20 );
548cdf0e10cSrcweir     OUString *pRes = aRes.getArray();
549cdf0e10cSrcweir 
550cdf0e10cSrcweir 	sal_Bool bSupported = sal_False;
551cdf0e10cSrcweir     sal_Int32 nLen = GetNameContainer().GetCount();
552cdf0e10cSrcweir     for (sal_Int32 i = 0;  i < nLen;  ++i)
553cdf0e10cSrcweir     {
554cdf0e10cSrcweir         const uno::Reference< XConversionDictionary > xDic( GetNameContainer().GetByIndex(i) );
555cdf0e10cSrcweir 		sal_Bool bMatch =   xDic.is()  &&
556cdf0e10cSrcweir 							xDic->getLocale() == rLocale  &&
557cdf0e10cSrcweir 							xDic->getConversionType() == nConversionDictionaryType;
558cdf0e10cSrcweir 		bSupported |= bMatch;
559cdf0e10cSrcweir         if (bMatch  &&  xDic->isActive())
560cdf0e10cSrcweir         {
561cdf0e10cSrcweir             Sequence< OUString > aNewConv( xDic->getConversions(
562cdf0e10cSrcweir                                 rText, nStartPos, nLength,
563cdf0e10cSrcweir                                 eDirection, nTextConversionOptions ) );
564cdf0e10cSrcweir             sal_Int32 nNewLen = aNewConv.getLength();
565cdf0e10cSrcweir             if (nNewLen > 0)
566cdf0e10cSrcweir             {
567cdf0e10cSrcweir                 if (nCount + nNewLen > aRes.getLength())
568cdf0e10cSrcweir                 {
569cdf0e10cSrcweir                     aRes.realloc( nCount + nNewLen + 20 );
570cdf0e10cSrcweir                     pRes = aRes.getArray();
571cdf0e10cSrcweir                 }
572cdf0e10cSrcweir                 const OUString *pNewConv = aNewConv.getConstArray();
573cdf0e10cSrcweir                 for (sal_Int32 k = 0;  k < nNewLen;  ++k)
574cdf0e10cSrcweir                     pRes[nCount++] = pNewConv[k];
575cdf0e10cSrcweir             }
576cdf0e10cSrcweir         }
577cdf0e10cSrcweir     }
578cdf0e10cSrcweir 
579cdf0e10cSrcweir 	if (!bSupported)
580cdf0e10cSrcweir         throw NoSupportException();
581cdf0e10cSrcweir 
582cdf0e10cSrcweir     aRes.realloc( nCount );
583cdf0e10cSrcweir     return aRes;
584cdf0e10cSrcweir }
585cdf0e10cSrcweir 
586cdf0e10cSrcweir 
queryMaxCharCount(const Locale & rLocale,sal_Int16 nConversionDictionaryType,ConversionDirection eDirection)587cdf0e10cSrcweir sal_Int16 SAL_CALL ConvDicList::queryMaxCharCount(
588cdf0e10cSrcweir         const Locale& rLocale,
589cdf0e10cSrcweir         sal_Int16 nConversionDictionaryType,
590cdf0e10cSrcweir         ConversionDirection eDirection )
591cdf0e10cSrcweir     throw (RuntimeException)
592cdf0e10cSrcweir {
593cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
594cdf0e10cSrcweir 
595cdf0e10cSrcweir     sal_Int16 nRes = 0;
596cdf0e10cSrcweir     GetNameContainer();
597cdf0e10cSrcweir     sal_Int32 nLen = GetNameContainer().GetCount();
598cdf0e10cSrcweir     for (sal_Int32 i = 0;  i < nLen;  ++i)
599cdf0e10cSrcweir     {
600cdf0e10cSrcweir         const uno::Reference< XConversionDictionary > xDic( GetNameContainer().GetByIndex(i) );
601cdf0e10cSrcweir         if (xDic.is()  &&
602cdf0e10cSrcweir             xDic->getLocale() == rLocale  &&
603cdf0e10cSrcweir             xDic->getConversionType() == nConversionDictionaryType)
604cdf0e10cSrcweir         {
605cdf0e10cSrcweir             sal_Int16 nC = xDic->getMaxCharCount( eDirection );
606cdf0e10cSrcweir             if (nC > nRes)
607cdf0e10cSrcweir                 nRes = nC;
608cdf0e10cSrcweir         }
609cdf0e10cSrcweir     }
610cdf0e10cSrcweir     return nRes;
611cdf0e10cSrcweir }
612cdf0e10cSrcweir 
613cdf0e10cSrcweir 
dispose()614cdf0e10cSrcweir void SAL_CALL ConvDicList::dispose(  )
615cdf0e10cSrcweir     throw (RuntimeException)
616cdf0e10cSrcweir {
617cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
618cdf0e10cSrcweir     if (!bDisposing)
619cdf0e10cSrcweir     {
620cdf0e10cSrcweir         bDisposing = sal_True;
621cdf0e10cSrcweir         EventObject aEvtObj( (XConversionDictionaryList *) this );
622cdf0e10cSrcweir         aEvtListeners.disposeAndClear( aEvtObj );
623cdf0e10cSrcweir 
624cdf0e10cSrcweir         FlushDics();
625cdf0e10cSrcweir     }
626cdf0e10cSrcweir }
627cdf0e10cSrcweir 
628cdf0e10cSrcweir 
addEventListener(const uno::Reference<XEventListener> & rxListener)629cdf0e10cSrcweir void SAL_CALL ConvDicList::addEventListener(
630cdf0e10cSrcweir         const uno::Reference< XEventListener >& rxListener )
631cdf0e10cSrcweir     throw (RuntimeException)
632cdf0e10cSrcweir {
633cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
634cdf0e10cSrcweir     if (!bDisposing && rxListener.is())
635cdf0e10cSrcweir         aEvtListeners.addInterface( rxListener );
636cdf0e10cSrcweir }
637cdf0e10cSrcweir 
638cdf0e10cSrcweir 
removeEventListener(const uno::Reference<XEventListener> & rxListener)639cdf0e10cSrcweir void SAL_CALL ConvDicList::removeEventListener(
640cdf0e10cSrcweir         const uno::Reference< XEventListener >& rxListener )
641cdf0e10cSrcweir     throw (RuntimeException)
642cdf0e10cSrcweir {
643cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
644cdf0e10cSrcweir     if (!bDisposing && rxListener.is())
645cdf0e10cSrcweir         aEvtListeners.removeInterface( rxListener );
646cdf0e10cSrcweir }
647cdf0e10cSrcweir 
648cdf0e10cSrcweir 
getImplementationName()649cdf0e10cSrcweir OUString SAL_CALL ConvDicList::getImplementationName(  )
650cdf0e10cSrcweir     throw (RuntimeException)
651cdf0e10cSrcweir {
652cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
653cdf0e10cSrcweir     return getImplementationName_Static();
654cdf0e10cSrcweir }
655cdf0e10cSrcweir 
656cdf0e10cSrcweir 
supportsService(const OUString & rServiceName)657cdf0e10cSrcweir sal_Bool SAL_CALL ConvDicList::supportsService( const OUString& rServiceName )
658cdf0e10cSrcweir     throw (RuntimeException)
659cdf0e10cSrcweir {
660cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
661cdf0e10cSrcweir     return rServiceName.equalsAscii( SN_CONV_DICTIONARY_LIST );
662cdf0e10cSrcweir }
663cdf0e10cSrcweir 
664cdf0e10cSrcweir 
getSupportedServiceNames()665cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL ConvDicList::getSupportedServiceNames(  )
666cdf0e10cSrcweir     throw (RuntimeException)
667cdf0e10cSrcweir {
668cdf0e10cSrcweir     MutexGuard  aGuard( GetLinguMutex() );
669cdf0e10cSrcweir     return getSupportedServiceNames_Static();
670cdf0e10cSrcweir }
671cdf0e10cSrcweir 
672cdf0e10cSrcweir 
getSupportedServiceNames_Static()673cdf0e10cSrcweir uno::Sequence< OUString > ConvDicList::getSupportedServiceNames_Static()
674cdf0e10cSrcweir     throw()
675cdf0e10cSrcweir {
676cdf0e10cSrcweir     uno::Sequence< OUString > aSNS( 1 );
677cdf0e10cSrcweir     aSNS.getArray()[0] = A2OU( SN_CONV_DICTIONARY_LIST );
678cdf0e10cSrcweir     return aSNS;
679cdf0e10cSrcweir }
680cdf0e10cSrcweir 
681cdf0e10cSrcweir 
682cdf0e10cSrcweir ///////////////////////////////////////////////////////////////////////////
683cdf0e10cSrcweir 
ConvDicList_CreateInstance(const uno::Reference<XMultiServiceFactory> &)684cdf0e10cSrcweir uno::Reference< uno::XInterface > SAL_CALL ConvDicList_CreateInstance(
685cdf0e10cSrcweir         const uno::Reference< XMultiServiceFactory > & /*rSMgr*/ )
686cdf0e10cSrcweir     throw(Exception)
687cdf0e10cSrcweir {
688cdf0e10cSrcweir     return StaticConvDicList::get();
689cdf0e10cSrcweir }
690cdf0e10cSrcweir 
ConvDicList_getFactory(const sal_Char * pImplName,XMultiServiceFactory * pServiceManager,void *)691cdf0e10cSrcweir void * SAL_CALL ConvDicList_getFactory(
692cdf0e10cSrcweir         const sal_Char * pImplName,
693cdf0e10cSrcweir         XMultiServiceFactory * pServiceManager, void *  )
694cdf0e10cSrcweir {
695cdf0e10cSrcweir     void * pRet = 0;
696cdf0e10cSrcweir     if ( !ConvDicList::getImplementationName_Static().compareToAscii( pImplName ) )
697cdf0e10cSrcweir     {
698cdf0e10cSrcweir         uno::Reference< XSingleServiceFactory > xFactory =
699cdf0e10cSrcweir             cppu::createOneInstanceFactory(
700cdf0e10cSrcweir                 pServiceManager,
701cdf0e10cSrcweir                 ConvDicList::getImplementationName_Static(),
702cdf0e10cSrcweir                 ConvDicList_CreateInstance,
703cdf0e10cSrcweir                 ConvDicList::getSupportedServiceNames_Static());
704cdf0e10cSrcweir         // acquire, because we return an interface pointer instead of a reference
705cdf0e10cSrcweir         xFactory->acquire();
706cdf0e10cSrcweir         pRet = xFactory.get();
707cdf0e10cSrcweir     }
708cdf0e10cSrcweir     return pRet;
709cdf0e10cSrcweir }
710cdf0e10cSrcweir 
711cdf0e10cSrcweir ///////////////////////////////////////////////////////////////////////////
712cdf0e10cSrcweir 
713